diff --git a/.gitignore b/.gitignore
index c87c691a4af7f6c50a681db4a373b100e84c7558..52512506d7ea2d862997249c9557810148623e3a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -72,3 +72,15 @@ Externals/
# coan output files that are created when cleaning out switches
coan_out_*
+/COMPLEXITY
+/res
+/tv
+/wmops
+/Workspace_msvc/renderer.args.json
+/Workspace_msvc/encoder.args.json
+/Workspace_msvc/decoder.args.json
+/scripts/mem_analysis_enc_VBR_5k9.csv
+/scripts/mem_analysis_enc_STEREO_sw.png
+/scripts/mem_analysis_enc_STEREO_sw.csv
+/scripts/mem_analysis_enc_STEREO_16k4_DTX.csv
+*.pwv
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6d00b37f0adee3da393e90d43e23046c7120dfb4..d4eea1ab7d9558af0457484d1baa8e54a2924554 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,7 @@ variables:
LTV_DIR: "/usr/local/ltv"
BUILD_OUTPUT: "build_output.txt"
EVS_BE_TEST_DIR: "/usr/local/be_2_evs_test"
+ EVS_BE_WIN_TEST_DIR: "C:/Users/gitlab-runner/testvec"
SANITIZER_TESTS: "CLANG1 CLANG2"
OUT_FORMATS_CHANNEL_BASED: "stereo mono 5_1 5_1_2 5_1_4 7_1 7_1_4"
OUT_FORMATS_SCENE_BASED: "FOA HOA2 HOA3"
@@ -12,8 +13,6 @@ variables:
default:
interruptible: true # Make all jobs by default interruptible
- artifacts:
- expire_in: 2 weeks
# This sets when pipelines are created. Jobs have more specific rules to restrict them.
workflow:
@@ -49,6 +48,13 @@ stages:
echo "Commit time was $CI_COMMIT_TIMESTAMP"
date | xargs echo "System time is"
+.print-common-info-windows: &print-common-info-windows
+ - |
+ echo "Printing common information for build job."
+ echo "Current job is run on commit $CI_COMMIT_SHA"
+ echo "Commit time was $CI_COMMIT_TIMESTAMP"
+ ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression
+
.get-previous-merge-commit-sha: &get-previous-merge-commit-sha
- previous_merge_commit=$(git --no-pager log --merges HEAD~1 -n 1 --pretty=format:%H)
@@ -156,6 +162,11 @@ stages:
tags:
- ivas-linux
+.build-job-windows:
+ stage: build
+ timeout: "4 minutes"
+ tags:
+ - ivas-windows
# template for test jobs on linux that need the TESTV_DIR
.test-job-linux-needs-testv-dir:
@@ -172,6 +183,12 @@ stages:
exit_codes:
- 123
+.build-job-windows-with-check-for-warnings:
+ extends: .build-job-windows
+ stage: build
+ allow_failure:
+ exit_codes:
+ - 123
# ---------------------------------------------------------------
@@ -249,6 +266,7 @@ build-codec-instrumented-linux:
extends:
- .build-job-linux
- .rules-basis
+ timeout: "6 minutes"
script:
- *print-common-info
- bash ci/build_codec_instrumented_linux.sh
@@ -262,6 +280,31 @@ build-codec-sanitizers-linux:
- *print-common-info
- bash ci/build_codec_sanitizers_linux.sh
+build-codec-windows-cmake:
+ extends:
+ - .build-job-windows-with-check-for-warnings
+ - .rules-basis
+ script:
+ - *print-common-info-windows
+ - $winoutdata = $null
+ - cmake -G "Visual Studio 15 2017" . -Bbuild
+ - cmake --build build -j | tee -variable winoutdata
+ - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8
+ - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression
+ - ("exit $LASTEXITCODE") | Invoke-Expression
+
+build-codec-windows-msbuild:
+ extends:
+ - .build-job-windows-with-check-for-warnings
+ - .rules-basis
+ script:
+ - *print-common-info-windows
+ - $winoutdata = $null
+ - MSBuild.exe .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug | tee -variable winoutdata
+ - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8
+ - ("& python ci/check_for_warnings.py '$BUILD_OUTPUT'") | Invoke-Expression
+ - ("exit $LASTEXITCODE") | Invoke-Expression
+
# ---------------------------------------------------------------
# Test jobs for merge requests
# ---------------------------------------------------------------
@@ -271,7 +314,7 @@ codec-smoke-test:
extends:
- .test-job-linux-needs-testv-dir
- .rules-merge-request
- timeout: "5 minutes"
+ timeout: "10 minutes"
stage: test
needs: ["build-codec-linux-cmake"]
script:
@@ -284,6 +327,7 @@ codec-smoke-test:
- if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; exit 1; fi
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 1 week
paths:
- smoke_test_output.txt
- smoke_test_output_plc.txt
@@ -308,6 +352,7 @@ codec-msan:
- if [ $run_errors != 0 ] ; then echo "Run errors in self_test.py with Clang memory-sanitizer"; exit 1; fi
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 1 week
paths:
- scripts/ref/logs/
- test_output.txt
@@ -330,6 +375,7 @@ codec-asan:
- if [ $run_errors != 0 ] ; then echo "Run errors in self_test.py with Clang address-sanitizer"; exit 1; fi
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 1 week
paths:
- scripts/ref/logs/
- test_output.txt
@@ -347,6 +393,7 @@ renderer-smoke-test:
- python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
+ expire_in: 1 week
when: always
paths:
- report-junit.xml
@@ -370,6 +417,7 @@ renderer-asan:
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
+ expire_in: 1 week
when: always
paths:
- report-junit.xml
@@ -393,6 +441,7 @@ renderer-msan:
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
+ expire_in: 1 week
when: always
paths:
- report-junit.xml
@@ -446,6 +495,7 @@ renderer-pytest-on-merge-request:
- 123
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results"
+ expire_in: 2 week
when: always
paths:
- report-junit.xml
@@ -496,6 +546,7 @@ ivas-pytest-on-merge-request:
- 123
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 2 week
when: always
paths:
- report-junit.xml
@@ -542,6 +593,7 @@ evs-pytest-on-merge-request:
- 123
artifacts:
name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 2 week
when: always
paths:
- report-junit-evs.xml
@@ -600,16 +652,67 @@ clang-format-check:
- exit $format_problems
artifacts:
+ expire_in: 2 days
paths:
- tmp-formatting-fix/
when: on_failure
name: "$ARTIFACT_BASE_NAME"
expose_as: 'formatting patch'
+# check for crashes if first received frame on decoder side is an SID
+.check-first-frame-is-sid:
+ extends:
+ - .test-job-linux-needs-testv-dir
+ - .rules-merge-request
+ tags:
+ - ivas-linux
+ stage: test
+ needs: ["build-codec-linux-cmake"]
+ script:
+ - *print-common-info
+ - *update-ltv-repo
+ - cmake .
+ - make -j
+
+ # TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX
+ - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v MASA)
+ - echo $modes
+ - scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500
+ artifacts:
+ paths:
+ - out/logs
+ when: on_failure
+ name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--sidstart"
+ expose_as: "logs-sidstart"
+
# ---------------------------------------------------------------
# Test jobs for main branch
# ---------------------------------------------------------------
+# check bitexactness to EVS windows binaries
+be-2-evs-windows:
+ extends:
+ - .rules-main-push
+ tags:
+ - ivas-windows
+ stage: test
+ needs: ["build-codec-windows-msbuild"]
+ timeout: "20 minutes" # To be revisited
+ script:
+ - *print-common-info-windows
+
+ - $winoutdata = $null
+ - MSBuild.exe .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Release | tee -variable winoutdata
+ - $winoutdata | Out-File $BUILD_OUTPUT -Encoding Utf8
+
+ # copy over to never change the testvector dir
+ - cp -r $EVS_BE_WIN_TEST_DIR ./evs_be_win_test
+ - cp IVAS_cod.exe ./evs_be_win_test/bin/IVAS_cod.exe
+ - cp IVAS_dec.exe ./evs_be_win_test/bin/IVAS_dec.exe
+
+ - cd evs_be_win_test
+ - python ../ci/run_evs_be_win_test.py
+
# check bitexactness to EVS
be-2-evs-linux:
extends:
@@ -708,6 +811,7 @@ codec-comparison-on-main-push:
- 123
artifacts:
name: "main-push--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results"
+ expire_in: 2 week
when: always
paths:
- report-junit.xml
@@ -729,6 +833,7 @@ codec-comparison-on-main-push:
- sanitizer_test_main
artifacts:
name: "$CI_JOB_NAME--main--sha-$CI_COMMIT_SHORT_SHA"
+ expire_in: 1 week
when: always
paths:
- ep_015.g192
@@ -740,13 +845,13 @@ codec-comparison-on-main-push:
.sanitizer-test-schedule-A:
extends:
- .sanitizer-test-template
- timeout: 2 hours 30 minutes
sanitizer-test-mono:
extends: .sanitizer-test-schedule-A
rules:
- if: $SANITIZER_SCHEDULE_A
+ timeout: 2 hour
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py mono mono --tests $SANITIZER_TESTS
@@ -756,7 +861,8 @@ sanitizer-test-stereo:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 2 hours 30 minutes
+ start_in: 2 hour
+ timeout: 2 hour
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py stereo $OUT_FORMATS_CHANNEL_BASED --tests $SANITIZER_TESTS
@@ -766,7 +872,8 @@ sanitizer-test-stereodmxevs:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 5 hours
+ start_in: 4 hours
+ timeout: 2 hour
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py StereoDmxEVS mono --tests $SANITIZER_TESTS
@@ -776,7 +883,8 @@ sanitizer-test-ism1:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 7 hours 30 minutes
+ start_in: 6 hours
+ timeout: 2 hours
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py ISM1 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
@@ -786,7 +894,8 @@ sanitizer-test-ism2:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 10 hours
+ start_in: 8 hours
+ timeout: 3 hours
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py ISM2 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
@@ -796,7 +905,8 @@ sanitizer-test-ism3:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 12 hours 30 minutes
+ start_in: 11 hours
+ timeout: 3 hour
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py ISM3 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
@@ -806,7 +916,8 @@ sanitizer-test-ism4:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 15 hours
+ start_in: 14 hours
+ timeout: 4 hours
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py ISM4 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
@@ -816,7 +927,8 @@ sanitizer-test-masa:
rules:
- if: $SANITIZER_SCHEDULE_A
when: delayed
- start_in: 17 hours 30 minutes
+ start_in: 18 hours
+ timeout: 3 hours
script:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py MASA $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
@@ -901,6 +1013,55 @@ sanitizer-test-planarsba:
- *update-ltv-repo
- python3 ci/run_scheduled_sanitizer_test.py PlanarSBA $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL --tests $SANITIZER_TESTS
+### --- sanitizer schedule D ---
+
+.sanitizer-test-schedule-D:
+ extends:
+ - .sanitizer-test-template
+
+sanitizer-test-ism+1:
+ extends: .sanitizer-test-schedule-D
+ rules:
+ - if: $SANITIZER_SCHEDULE_D
+ timeout: 2 hours
+ script:
+ - *update-ltv-repo
+ - python3 ci/run_scheduled_sanitizer_test.py ISM+1 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
+
+sanitizer-test-ism+2:
+ extends: .sanitizer-test-schedule-D
+ rules:
+ - if: $SANITIZER_SCHEDULE_D
+ when: delayed
+ start_in: 2 hours
+ timeout: 3 hours
+ script:
+ - *update-ltv-repo
+ - python3 ci/run_scheduled_sanitizer_test.py ISM+2 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
+
+sanitizer-test-ism+3:
+ extends: .sanitizer-test-schedule-D
+ rules:
+ - if: $SANITIZER_SCHEDULE_D
+ when: delayed
+ start_in: 5 hours
+ timeout: 3 hour
+ script:
+ - *update-ltv-repo
+ - python3 ci/run_scheduled_sanitizer_test.py ISM+3 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
+
+sanitizer-test-ism+4:
+ extends: .sanitizer-test-schedule-D
+ rules:
+ - if: $SANITIZER_SCHEDULE_D
+ when: delayed
+ start_in: 8 hours
+ timeout: 4 hours
+ script:
+ - *update-ltv-repo
+ - python3 ci/run_scheduled_sanitizer_test.py ISM+4 $OUT_FORMATS_CHANNEL_BASED $OUT_FORMATS_SCENE_BASED $OUT_FORMATS_BINAURAL EXT --tests $SANITIZER_TESTS
+
+
# GCOV/LCOV coverage analysis of self_test suite
coverage-test-on-main-scheduled:
extends:
@@ -985,6 +1146,7 @@ coverage-test-on-main-scheduled:
stage: test
artifacts:
name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA"
+ expire_in: 1 week
paths:
- $CI_JOB_NAME-public
@@ -1015,7 +1177,7 @@ complexity-ism-in-binaural-out:
- *complexity-measurements-setup
- in_format=ISM
- out_format=BINAURAL
- - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" "$out_format"
+ - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format"
- *complexity-measurements-prepare-artifacts
complexity-sba-hoa3-in-hoa3-out:
diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj
index e1c0f9ead1e80039fb23607500d3580bece6215c..80910aa5e713bfca913d57aa453a16cac1744f1d 100644
--- a/Workspace_msvc/lib_dec.vcxproj
+++ b/Workspace_msvc/lib_dec.vcxproj
@@ -282,6 +282,7 @@
+
@@ -290,6 +291,7 @@
+
diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters
index d1dedc413cef958bb637b92972c2b95ef1656319..6284884920f332ea486df52e269e1eb51e5ef8f3 100644
--- a/Workspace_msvc/lib_dec.vcxproj.filters
+++ b/Workspace_msvc/lib_dec.vcxproj.filters
@@ -518,6 +518,12 @@
dec_ivas_c
+
+ dec_ivas_c
+
+
+ dec_ivas_c
+
diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj
index 15f0d535745d95fec1fd22eb4d139f5ca5e8d06f..3378ac10f0ccb8b95616f87f6d225f38af30bb3d 100644
--- a/Workspace_msvc/lib_enc.vcxproj
+++ b/Workspace_msvc/lib_enc.vcxproj
@@ -213,6 +213,7 @@
+
diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters
index 21941038ec37e6a53cc81c9c3c915e69cbe0ac5f..b3970764c0f9218533e6f7e63c8f1d270540c0e1 100644
--- a/Workspace_msvc/lib_enc.vcxproj.filters
+++ b/Workspace_msvc/lib_enc.vcxproj.filters
@@ -587,6 +587,9 @@
enc_ivas_c
+
+ enc_ivas_c
+
diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj
index e7ce06e97575698584c32575c1841a5fdec640b1..9c68dbb36d26bb969bf1f470c4b4d85d104e7876 100644
--- a/Workspace_msvc/lib_util.vcxproj
+++ b/Workspace_msvc/lib_util.vcxproj
@@ -159,6 +159,7 @@
+
@@ -185,6 +186,7 @@
+
diff --git a/apps/decoder.c b/apps/decoder.c
index 794122b98a7322ea195df56a5f1b6107822af72f..8fb34f49e1097afe8a99006a775f017a7771f29e 100644
--- a/apps/decoder.c
+++ b/apps/decoder.c
@@ -46,11 +46,12 @@
#else
#include "head_rotation_file_reader.h"
#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
#include "vector3_pair_file_reader.h"
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#include "jbm_file_writer.h"
#include "evs_rtp_payload.h"
+#ifdef VARIABLE_SPEED_DECODING
+#include "tsm_scale_file_reader.h"
+#endif
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -76,17 +77,17 @@ static
#define MAX_NUM_OUTPUT_CHANNELS 16
#define MAX_OUTPUT_PCM_BUFFER_SIZE ( MAX_NUM_OUTPUT_CHANNELS * MAX_FRAME_SIZE )
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#define IVAS_PUBLIC_ORIENT_TRK_NONE ( 0 )
-#define IVAS_PUBLIC_ORIENT_TRK_REF ( 1 )
-#define IVAS_PUBLIC_ORIENT_TRK_AVG ( 2 )
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
+#define IVAS_PUBLIC_ORIENT_TRK_NONE ( 0 )
+#define IVAS_PUBLIC_ORIENT_TRK_REF ( 1 )
+#define IVAS_PUBLIC_ORIENT_TRK_AVG ( 2 )
#define IVAS_PUBLIC_ORIENT_TRK_REF_VEC ( 3 )
#define IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV ( 4 )
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
-#define IVAS_PUBLIC_ORIENT_TRK_REF 0
-#define IVAS_PUBLIC_ORIENT_TRK_AVG 1
+
+#ifdef VARIABLE_SPEED_DECODING
+#define VARIABLE_SPEED_FETCH_FRAMESIZE_MS 20
+#endif
+#ifdef JBM_TSM_ON_TCS
+#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20
#endif
typedef struct
@@ -101,14 +102,10 @@ typedef struct
bool voipMode;
bool enableHeadRotation;
char *headrotTrajFileName;
-#ifdef FIX_I109_ORIENTATION_TRACKING
bool enableReferenceRotation;
char *refrotTrajFileName;
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
bool enableReferenceVectorTracking;
char *referenceVectorTrajFileName;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
bool enableExternalOrientation;
char *externalOrientationTrajFileName;
@@ -127,16 +124,31 @@ typedef struct
bool customLsOutputEnabled;
char *customLsSetupFilename;
int16_t orientation_tracking;
- float no_diegetic_pan;
+ int16_t Opt_non_diegetic_pan;
+ float non_diegetic_pan_gain;
bool renderConfigEnabled;
char *renderConfigFilename;
+ IVAS_DEC_COMPLEXITY_LEVEL complexityLevel;
#ifdef DEBUGGING
IVAS_DEC_FORCED_REND_MODE forcedRendMode;
#ifdef DEBUG_FOA_AGC
FILE *agcBitstream; /* temporary */
#endif
-
+#ifdef DEBUG_JBM_CMD_OPTION
+ bool noBadFrameDelay;
+#endif
+#ifdef VARIABLE_SPEED_DECODING
+ bool variableSpeedMode;
+ bool tsmScaleFileEnabled;
+ char *tsmScaleFileName;
+ uint16_t tsmScale;
+#endif
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ uint16_t frontendFetchSizeMs;
+#endif
+#endif
#endif
} DecArguments;
@@ -148,29 +160,16 @@ typedef struct
static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg );
static void usage_dec( void );
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
#ifdef EXTERNAL_ORIENTATIONS
static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#else
static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#endif
-#else /* OTR_REFERENCE_VECTOR_TRACKING */
-#ifdef EXTERNAL_ORIENTATIONS
-static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
-#else
-static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
-#endif
-#endif
-#else /* FIX_I109_ORIENTATION_TRACKING */
-#ifdef EXTERNAL_ORIENTATIONS
-static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
-#else
-static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
-#endif
-#endif
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec );
#ifdef DEBUGGING
+#ifdef VARIABLE_SPEED_DECODING
+static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec );
+#endif
static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec );
static int16_t app_own_random( int16_t *seed );
static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar );
@@ -196,18 +195,12 @@ int main(
#ifdef EXTERNAL_ORIENTATIONS
RotFileReader *headRotReader = NULL;
RotFileReader *externalOrientationFileReader = NULL;
-#ifdef FIX_I109_ORIENTATION_TRACKING
RotFileReader *refRotReader = NULL;
-#endif
#else
HeadRotFileReader *headRotReader = NULL;
-#ifdef FIX_I109_ORIENTATION_TRACKING
HeadRotFileReader *refRotReader = NULL;
#endif
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
Vector3PairFileReader *referenceVectorReader = NULL;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
ivas_error error = IVAS_ERR_UNKNOWN;
int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE];
RenderConfigReader *renderConfigReader = NULL;
@@ -243,7 +236,11 @@ int main(
* Open decoder handle
*------------------------------------------------------------------------------------------*/
- if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking, arg.no_diegetic_pan ) ) != IVAS_ERR_OK )
+#ifdef FIX_439_OTR_PARAMS
+ if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking ) ) != IVAS_ERR_OK )
+#endif
{
fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
goto cleanup;
@@ -321,12 +318,26 @@ int main(
}
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*------------------------------------------------------------------------------------------*
* Open reference rotation file
*------------------------------------------------------------------------------------------*/
+
if ( arg.enableReferenceRotation )
{
+ /* sanity check */
+ if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM )
+ {
+ fprintf( stderr, "\nError: Reference rotation file cannot be used in this output configuration.\n\n" );
+ goto cleanup;
+ }
+
+ /* sanity check */
+ if ( arg.orientation_tracking != IVAS_PUBLIC_ORIENT_TRK_REF )
+ {
+ fprintf( stderr, "\nError: Reference rotation file can be used in '-otr ref' mode only.\n\n" );
+ goto cleanup;
+ }
+
#ifdef EXTERNAL_ORIENTATIONS
if ( ( error = RotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK )
#else
@@ -337,20 +348,33 @@ int main(
goto cleanup;
}
}
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
+
/*------------------------------------------------------------------------------------------*
* Open reference vector trajectory file
*------------------------------------------------------------------------------------------*/
+
if ( arg.enableReferenceVectorTracking )
{
+ /* sanity check */
+ if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM )
+ {
+ fprintf( stderr, "\nError: Reference vector trajectory file cannot be used in this output configuration.\n\n" );
+ goto cleanup;
+ }
+
+ /* sanity check */
+ if ( arg.orientation_tracking != IVAS_PUBLIC_ORIENT_TRK_REF_VEC && arg.orientation_tracking != IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV )
+ {
+ fprintf( stderr, "\nError: Reference trajectory file can be used in '-otr ref_vec' or '-otr ref_vec_lev' mode only.\n\n" );
+ goto cleanup;
+ }
+
if ( ( error = Vector3PairFileReader_open( arg.referenceVectorTrajFileName, &referenceVectorReader ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "\nError: Can't open reference vector trajectory file %s \n\n", arg.referenceVectorTrajFileName );
goto cleanup;
}
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
/*------------------------------------------------------------------------------------------*
@@ -403,17 +427,68 @@ int main(
/*------------------------------------------------------------------------------------------*
* Configure the decoder
*------------------------------------------------------------------------------------------*/
-
+#ifdef FIX_356_ISM_METADATA_SYNC
+#ifdef FIX_439_OTR_PARAMS
+#ifdef EXTERNAL_ORIENTATIONS
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
+#endif
+#else
+#ifdef EXTERNAL_ORIENTATIONS
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
+#endif
+#endif
+#else
+#ifdef FIX_439_OTR_PARAMS
+#ifdef EXTERNAL_ORIENTATIONS
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK )
+#endif
+#else
#ifdef EXTERNAL_ORIENTATIONS
- if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK )
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK )
#else
- if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK )
+ if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK )
+#endif
#endif
+#endif
+
{
fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
goto cleanup;
}
+#ifdef JBM_TSM_ON_TCS
+ /*------------------------------------------------------------------------------------------*
+ * Configure VoIP mode
+ *------------------------------------------------------------------------------------------*/
+
+ if ( arg.voipMode )
+ {
+ if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+#ifdef VARIABLE_SPEED_DECODING
+#ifdef DEBUGGING
+ else if ( arg.variableSpeedMode )
+ {
+ if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nCould not enable Variable Play Speed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+#endif
+#endif
+#endif
+
#ifdef DEBUGGING
/*-----------------------------------------------------------------*
* Preview bitstream and print config information
@@ -444,6 +519,22 @@ int main(
BS_Reader_Rewind( hBsReader );
IVAS_DEC_PrintConfigWithBitstream( hIvasDec, arg.quietModeEnabled, bit_stream, num_bits );
+
+#ifdef VARIABLE_SPEED_DECODING
+#ifdef DEBUGGING
+ if ( arg.variableSpeedMode )
+ {
+ if ( arg.tsmScaleFileEnabled )
+ {
+ fprintf( stdout, "Variable speed file: %s\n", arg.tsmScaleFileName );
+ }
+ else
+ {
+ fprintf( stdout, "Variable speed factor: %i\n", arg.tsmScale );
+ }
+ }
+#endif
+#endif
}
/*------------------------------------------------------------------------------------------*
@@ -514,17 +605,9 @@ int main(
IVAS_RENDER_CONFIG_DATA renderConfig;
/* sanity check */
-#ifdef TD5
if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL )
-#else
- if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM )
-#endif
{
-#ifdef TD5
fprintf( stderr, "\nExternal Renderer Config is supported only for BINAURAL and BINAURAL_ROOM. Exiting. \n\n" );
-#else
- fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL_ROOM is used as output. Exiting. \n\n" );
-#endif
goto cleanup;
}
@@ -575,7 +658,11 @@ int main(
if ( arg.hrtfReaderEnabled )
{
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL;
+#else
IVAS_DEC_HRTF_HANDLE hHrtfTD;
+#endif
IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD );
@@ -586,7 +673,11 @@ int main(
}
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL;
+#else
IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF;
+#endif
IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF );
if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK )
@@ -594,14 +685,22 @@ int main(
fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfCRendFileName );
goto cleanup;
}
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL;
+#else
IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv;
+#endif
IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv );
if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfCRendFileName );
}
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL;
+#else
IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin;
+#endif
IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin );
if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK )
@@ -616,37 +715,33 @@ int main(
if ( arg.voipMode )
{
-
+#ifndef JBM_TSM_ON_TCS
+#ifdef VARIABLE_SPEED_DECODING
+ if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK )
+#else
if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK )
+#endif
{
fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
goto cleanup;
}
-
+#endif
error = decodeVoIP( arg, hBsReader, hIvasDec );
}
+#ifdef VARIABLE_SPEED_DECODING
+#ifdef DEBUGGING
+ else if ( arg.variableSpeedMode )
+ {
+ error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec );
+ }
+#endif
+#endif
else
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
#ifdef EXTERNAL_ORIENTATIONS
error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf );
#else
error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf );
-#endif
-#else
-#ifdef EXTERNAL_ORIENTATIONS
- error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, hIvasDec, pcmBuf );
-#else
- error = decodeG192( arg, hBsReader, headRotReader, refRotReader, hIvasDec, pcmBuf );
-#endif
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
-#ifdef EXTERNAL_ORIENTATIONS
- error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, hIvasDec, pcmBuf );
-#else
- error = decodeG192( arg, hBsReader, headRotReader, hIvasDec, pcmBuf );
-#endif
#endif
}
@@ -692,10 +787,18 @@ cleanup:
if ( arg.hrtfReaderEnabled )
{
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL;
+#else
IVAS_DEC_HRTF_HANDLE hHrtfTD;
+#endif
IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD );
dealloc_HRTF_binary( hHrtfTD );
+#ifdef UPDATE_SBA_FILTER
+ IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL;
+#else
IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF;
+#endif
IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF );
destroy_SetOfHRTF( hSetOfHRTF );
}
@@ -705,18 +808,12 @@ cleanup:
#ifdef EXTERNAL_ORIENTATIONS
RotationFileReader_close( &headRotReader );
RotationFileReader_close( &externalOrientationFileReader );
-#ifdef FIX_I109_ORIENTATION_TRACKING
RotationFileReader_close( &refRotReader );
-#endif
#else
HeadRotationFileReader_close( &headRotReader );
-#ifdef FIX_I109_ORIENTATION_TRACKING
HeadRotationFileReader_close( &refRotReader );
#endif
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
Vector3PairFileReader_close( &referenceVectorReader );
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
RenderConfigReader_close( &renderConfigReader );
if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK )
@@ -850,20 +947,15 @@ static bool parseCmdlIVAS_dec(
arg->quietModeEnabled = false;
arg->delayCompensationEnabled = true;
arg->voipMode = false;
+ arg->complexityLevel = IVAS_DEC_COMPLEXITY_LEVEL_THREE;
arg->enableHeadRotation = false;
arg->headrotTrajFileName = NULL;
-#ifdef FIX_I109_ORIENTATION_TRACKING
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_NONE;
arg->enableReferenceRotation = false;
arg->headrotTrajFileName = NULL;
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
arg->enableReferenceVectorTracking = false;
arg->referenceVectorTrajFileName = NULL;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
- arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF;
-#endif
#ifdef EXTERNAL_ORIENTATIONS
arg->enableExternalOrientation = false;
arg->externalOrientationTrajFileName = NULL;
@@ -890,7 +982,25 @@ static bool parseCmdlIVAS_dec(
arg->renderConfigFilename = NULL;
arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192;
- arg->no_diegetic_pan = 0.f;
+ arg->Opt_non_diegetic_pan = 0;
+ arg->non_diegetic_pan_gain = 0.f;
+
+#ifdef DEBUGGING
+#ifdef VARIABLE_SPEED_DECODING
+ arg->variableSpeedMode = false;
+ arg->tsmScale = 100;
+ arg->tsmScaleFileEnabled = false;
+ arg->tsmScaleFileName = NULL;
+#endif
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ arg->frontendFetchSizeMs = JBM_FRONTEND_FETCH_FRAMESIZE_MS;
+#endif
+#endif
+#ifdef DEBUG_JBM_CMD_OPTION
+ arg->noBadFrameDelay = false;
+#endif
+#endif
/*-----------------------------------------------------------------*
* Initialization
@@ -1007,9 +1117,7 @@ static bool parseCmdlIVAS_dec(
}
#ifdef DEBUG_MODE_INFO
#ifdef DEBUG_MODE_INFO_TWEAK
- /*-----------------------------------------------------------------*
- * Define additional subfolder for debug info output in ./res
- *-----------------------------------------------------------------*/
+ /* Define additional subfolder for debug info output in ./res */
else if ( strcmp( argv_to_upper, "-INFO" ) == 0 )
{
extern char infoFolder[FILENAME_MAX];
@@ -1018,6 +1126,67 @@ static bool parseCmdlIVAS_dec(
}
#endif /* #ifdef DEBUG_MODE_INFO_TWEAK */
#endif /* #ifdef DEBUG_MODE_INFO */
+#ifdef DEBUG_JBM_CMD_OPTION
+ else if ( strcmp( argv_to_upper, "-VOIP_NO_BAD_FRAME" ) == 0 )
+ {
+ arg->noBadFrameDelay = true;
+ i++;
+ }
+#endif
+#ifdef VARIABLE_SPEED_DECODING
+ else if ( strcmp( argv_to_upper, "-VS" ) == 0 )
+ {
+ i++;
+ int32_t tmp = 100;
+ arg->variableSpeedMode = true;
+ if ( i < argc - 3 )
+ {
+ if ( !is_digits_only( argv[i] ) )
+ {
+ arg->tsmScaleFileEnabled = true;
+ arg->tsmScaleFileName = argv[i];
+ i++;
+ }
+ else
+ {
+ if ( ( sscanf( argv[i], "%d", &tmp ) > 0 ) )
+ {
+ i++;
+ }
+ }
+ arg->tsmScale = (uint16_t) tmp;
+
+ if ( arg->tsmScale < 50 || arg->tsmScale > 150 )
+ {
+ fprintf( stderr, "Error: Scaling factor value must be 50 <= fac <= 150!\n\n" );
+ usage_dec();
+ return false;
+ }
+ }
+ }
+#endif
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ else if ( strcmp( argv_to_upper, "-VOIP_FRAMESIZE" ) == 0 )
+ {
+ i++;
+ int32_t tmp;
+ if ( i < argc - 3 )
+ {
+ if ( !is_digits_only( argv[i] ) )
+ {
+ return false;
+ }
+
+ if ( sscanf( argv[i], "%d", &tmp ) > 0 )
+ {
+ i++;
+ }
+ arg->frontendFetchSizeMs = (uint16_t) tmp;
+ }
+ }
+#endif
+#endif
#endif /* #ifdef DEBUGGING */
else if ( strcmp( argv_to_upper, "-MIME" ) == 0 )
@@ -1042,27 +1211,16 @@ static bool parseCmdlIVAS_dec(
}
else if ( strcmp( argv_to_upper, "-OTR" ) == 0 )
{
-#ifndef FIX_I109_ORIENTATION_TRACKING
- if ( strlen( argv[i + 1] ) > 3 )
- {
- fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", argv[i + 1] );
- usage_dec();
- return false;
- }
-#endif
strncpy( argv_to_upper, argv[i + 1], sizeof( argv_to_upper ) - 1 );
argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0';
to_upper( argv_to_upper );
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( strcmp( argv_to_upper, "NONE" ) == 0 )
{
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_NONE;
}
- else
-#endif
- if ( strcmp( argv_to_upper, "REF" ) == 0 )
+ else if ( strcmp( argv_to_upper, "REF" ) == 0 )
{
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF;
}
@@ -1070,7 +1228,6 @@ static bool parseCmdlIVAS_dec(
{
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_AVG;
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
else if ( strcmp( argv_to_upper, "REF_VEC" ) == 0 )
{
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF_VEC;
@@ -1079,7 +1236,6 @@ static bool parseCmdlIVAS_dec(
{
arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV;
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
else
{
fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", argv[i + 1] );
@@ -1088,7 +1244,6 @@ static bool parseCmdlIVAS_dec(
}
i += 2;
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
else if ( strcmp( argv_to_upper, "-RF" ) == 0 )
{
arg->enableReferenceRotation = true;
@@ -1104,8 +1259,6 @@ static bool parseCmdlIVAS_dec(
arg->refrotTrajFileName = argv[i];
i++;
}
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
else if ( strcmp( argv_to_upper, "-RVF" ) == 0 )
{
arg->enableReferenceVectorTracking = true;
@@ -1121,7 +1274,6 @@ static bool parseCmdlIVAS_dec(
arg->referenceVectorTrajFileName = argv[i];
i++;
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
else if ( strcmp( argv_to_upper, "-EXOF" ) == 0 )
{
@@ -1152,44 +1304,55 @@ static bool parseCmdlIVAS_dec(
}
i += 2;
}
- else if ( strcmp( argv_to_upper, "-NO_DIEGETIC_PAN" ) == 0 )
+ else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 )
{
i++;
-
- if ( argc - i <= 4 || argv[i][0] == '-' )
- {
- fprintf( stderr, "Error: Argument for panning option not specified!\n\n" );
- usage_dec();
- return false;
- }
-
+ arg->Opt_non_diegetic_pan = 1;
strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 );
argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0';
+ to_upper( argv_to_upper );
if ( ( strcmp( argv_to_upper, "CENTER" ) == 0 ) || ( strchr( argv_to_upper, 'C' ) != NULL ) )
{
- arg->no_diegetic_pan = 0.f;
+ arg->non_diegetic_pan_gain = 0.f;
}
else if ( ( strcmp( argv_to_upper, "LEFT" ) == 0 ) || ( strchr( argv_to_upper, 'L' ) != NULL ) )
{
- arg->no_diegetic_pan = -1.f;
+ arg->non_diegetic_pan_gain = 1.f;
}
else if ( ( strcmp( argv_to_upper, "RIGHT" ) == 0 ) || ( strchr( argv_to_upper, 'R' ) != NULL ) )
{
- arg->no_diegetic_pan = 1.f;
+ arg->non_diegetic_pan_gain = -1.f;
}
else
{
- arg->no_diegetic_pan = (float) atof( argv_to_upper );
+ arg->non_diegetic_pan_gain = (float) atof( argv_to_upper ) / 90.f;
- if ( arg->no_diegetic_pan > 1.0f || arg->no_diegetic_pan < -1.0f )
+ if ( arg->non_diegetic_pan_gain > 1.0f || arg->non_diegetic_pan_gain < -1.0f )
{
- fprintf( stderr, "Error: Incorrect value for panning option argument specified: %s\n\n", argv[i] );
+ fprintf( stderr, "Error: Incorrect value for panning gain value specified: %s\n\n", argv[i] );
usage_dec();
return false;
}
}
i++;
}
+ else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 )
+ {
+ int16_t level;
+
+ ++i;
+ level = (int16_t) atoi( argv[i++] );
+ if ( level < IVAS_DEC_COMPLEXITY_LEVEL_ONE || level > IVAS_DEC_COMPLEXITY_LEVEL_THREE )
+ {
+ fprintf( stdout, "Invalid complexity level specified.\n" );
+ usage_dec();
+ return false;
+ }
+ else if ( level == IVAS_DEC_COMPLEXITY_LEVEL_ONE || level == IVAS_DEC_COMPLEXITY_LEVEL_TWO )
+ {
+ fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" );
+ }
+ }
/*-----------------------------------------------------------------*
* Option not recognized
@@ -1218,11 +1381,21 @@ static bool parseCmdlIVAS_dec(
arg->customLsSetupFilename = argv[i];
}
i++;
+ if ( ( arg->Opt_non_diegetic_pan ) && ( arg->outputFormat != IVAS_DEC_OUTPUT_STEREO ) )
+ {
+ fprintf( stderr, "Error: non-diegetic panning is supported in stereo only\n\n" );
+ usage_dec();
+ return false;
+ }
}
else
{
arg->outputFormat = IVAS_DEC_OUTPUT_MONO;
arg->decMode = IVAS_DEC_MODE_EVS;
+ if ( ( arg->Opt_non_diegetic_pan ) )
+ {
+ arg->outputFormat = IVAS_DEC_OUTPUT_STEREO;
+ }
}
/*-----------------------------------------------------------------*
@@ -1305,11 +1478,25 @@ static void usage_dec( void )
fprintf( stdout, "-VOIP : VoIP mode: RTP in G192\n" );
fprintf( stdout, "-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump\n" );
fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump\n" );
+#ifdef DEBUG_JBM_CMD_OPTION
+ fprintf( stdout, "-VOIP_no_bad_frame : VoIP mode: do not put out bad frames in the beginning as silence \n" );
+#endif
fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\n" );
fprintf( stdout, " EVS RTP Payload Format. The SDP parameter hf_only is required.\n" );
fprintf( stdout, " Reading RFC4867 AMR/AMR-WB RTP payload format is not supported.\n" );
#ifdef SUPPORT_JBM_TRACEFILE
fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" );
+#endif
+#ifdef DEBUGGING
+#ifdef VARIABLE_SPEED_DECODING
+ fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent.\n" );
+ fprintf( stdout, " 50 <= fac <= 150; fac<100 faster, fac>100 slower\n" );
+#endif
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ fprintf( stdout, "-VOIP_framesize : VoIP mode: acoustic frontend fetch frame size (must be multiples of 5!)\n" );
+#endif
+#endif
#endif
fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" );
fprintf( stdout, " as described in Section 6.3.1 of TS26.448. The output is \n" );
@@ -1321,8 +1508,19 @@ static void usage_dec( void )
fprintf( stdout, " Format files, the magic word in the mime file is used to determine\n" );
fprintf( stdout, " which of the two supported formats is in use.\n" );
fprintf( stdout, " default bitstream file format is G.192\n" );
- fprintf( stdout, "-T File : Head rotation specified by external trajectory File\n" );
fprintf( stdout, "-hrtf File : HRTF filter File used in BINAURAL output configuration\n" );
+ fprintf( stdout, "-T File : Head rotation specified by external trajectory File\n" );
+ fprintf( stdout, "-otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg', 'ref_vec' \n" );
+ fprintf( stdout, " or 'ref_vec_lev' (only for binaural rendering)\n" );
+ fprintf( stdout, "-rf File : Reference rotation specified by external trajectory file\n" );
+ fprintf( stdout, " works only in combination with '-otr ref' mode \n" );
+ fprintf( stdout, "-rvf File : Reference vector specified by external trajectory file\n" );
+ fprintf( stdout, " works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes\n" );
+ fprintf( stdout, "-render_config File : Renderer configuration File\n" );
+ fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with paning P, -90<= P <=90,\n" );
+ fprintf( stdout, " left or l or 90->left, right or r or -90->right, center or c or 0->middle\n" );
+ fprintf( stdout, "-q : Quiet mode, no frame counter\n" );
+ fprintf( stdout, " default is deactivated\n" );
#ifdef DEBUGGING
fprintf( stdout, "-FEC X : Insert frame erasures, X = 0-10 is the percentage\n" );
fprintf( stdout, " of erased frames, or X may be the name of binary file or \n" );
@@ -1330,23 +1528,9 @@ static void usage_dec( void )
fprintf( stdout, " containing FEC pattern (short values of 0 (good) or 1 (bad))\n" );
fprintf( stdout, " default is OFF, if this option is not used\n" );
fprintf( stdout, "-force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND),\n" );
+ fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" );
+ fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" );
#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
- fprintf( stdout, "-otr tracking_type : head orientation tracking type: 'none', 'ref' or 'avg' (only for binaural rendering)\n" );
- fprintf( stdout, "-rf File : Reference rotation specified by external trajectory file\n" );
- fprintf( stdout, " works only in combination with -otr ref mode\n" );
-#else
- fprintf( stdout, "-otr tracking_type : head orientation tracking type: 'ref' or 'avg' (only for binaural rendering)\n" );
-#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
- fprintf( stdout, "-rvf File : Reference vector specified by external trajectory file\n" );
- fprintf( stdout, " works only in combination with -otr ref_vec and ref_vec_lev modes\n" );
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
- fprintf( stdout, "-render_config file : Renderer configuration file\n" );
- fprintf( stdout, "-no_diegetic_pan : panning mono no dietic sound to stereo -1<= pan <=1,\n" );
- fprintf( stdout, " left or l or 1->left, right or r or -1->right, center or c or 0->middle\n" );
- fprintf( stdout, "-q : Quiet mode, no frame counter\n" );
- fprintf( stdout, " default is deactivated\n" );
#ifdef EXTERNAL_ORIENTATIONS
fprintf( stdout, "-exof File : External orientation file for external orientation trajectory\n" );
#endif
@@ -1394,7 +1578,6 @@ static ivas_error initOnFirstGoodFrame(
ivas_error error = IVAS_ERR_UNKNOWN;
/* Now delay, number of output channels and frame size are known */
-#ifdef FIX_371_DELAY_REPORT
if ( ( error = IVAS_DEC_GetDelay( hIvasDec, pFullDelayNumSamples, delayTimeScale ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) );
@@ -1403,35 +1586,9 @@ static ivas_error initOnFirstGoodFrame(
if ( !arg.delayCompensationEnabled )
{
-#ifdef BINAURALIZATION_DELAY_REPORT
- pFullDelayNumSamples[0] = 0;
-#else
- *pFullDelayNumSamples = 0;
-#endif
- }
-#else
- if ( arg.delayCompensationEnabled )
- {
- if ( ( error = IVAS_DEC_GetDelay( hIvasDec, pFullDelayNumSamples, delayTimeScale ) ) != IVAS_ERR_OK )
- {
- fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) );
- return error;
- }
- }
- else
- {
-#ifdef BINAURALIZATION_DELAY_REPORT
pFullDelayNumSamples[0] = 0;
-#else
- *pFullDelayNumSamples = 0;
-#endif
}
-#endif
-#ifdef BINAURALIZATION_DELAY_REPORT
*pRemainingDelayNumSamples = pFullDelayNumSamples[0];
-#else
- *pRemainingDelayNumSamples = *pFullDelayNumSamples;
-#endif
if ( ( error = IVAS_DEC_GetNumOutputChannels( hIvasDec, pNumOutChannels ) ) != IVAS_ERR_OK )
{
@@ -1527,24 +1684,15 @@ static ivas_error initOnFirstGoodFrame(
/* If outputting MASA, open output file and write metadata for initial bad frames */
else if ( *pBsFormat == IVAS_DEC_BS_MASA )
{
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ( error = MasaFileWriter_open( arg.outputWavFilename, arg.delayCompensationEnabled, ppMasaWriter ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = MasaFileWriter_open( arg.outputWavFilename, ppMasaWriter ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError: Error opening MASA decoded metadata file %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) );
return error;
}
/* Duplicate good first frame metadata to fill the beginning of stream. */
-#ifdef FIX_350_MASA_DELAY_COMP
MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta = NULL;
if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK )
-#else
- IVAS_MASA_QMETADATA_HANDLE qMetadata = NULL;
- if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &qMetadata ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
return error;
@@ -1552,11 +1700,7 @@ static ivas_error initOnFirstGoodFrame(
for ( int16_t j = 0; j < numInitialBadFrames; ++j )
{
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, qMetadata ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) );
return error;
@@ -1577,24 +1721,15 @@ static ivas_error initOnFirstGoodFrame(
static ivas_error decodeG192(
DecArguments arg,
BS_READER_HANDLE hBsReader,
-
#ifdef EXTERNAL_ORIENTATIONS
RotFileReader *headRotReader,
RotFileReader *externalOrientationFileReader,
+ RotFileReader *refRotReader,
#else
HeadRotFileReader *headRotReader,
-#endif
-
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef EXTERNAL_ORIENTATIONS
- RotFileReader *refRotReader,
-#else
HeadRotFileReader *refRotReader,
#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
Vector3PairFileReader *referenceVectorReader,
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
IVAS_DEC_HANDLE hIvasDec,
int16_t *pcmBuf )
@@ -1612,19 +1747,13 @@ static ivas_error decodeG192(
int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */
int16_t nOutChannels = 0;
int16_t delayNumSamples = -1;
-#ifdef BINAURALIZATION_DELAY_REPORT
int16_t delayNumSamples_orig[3]; /* stores: overall delay, dec+rend delay, and binauralization delay */
-#else
- int16_t delayNumSamples_orig = 0;
-#endif
int16_t nOutSamples = 0;
int32_t delayTimeScale = 0;
ivas_error error = IVAS_ERR_UNKNOWN;
uint16_t numObj = 0;
IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN;
-#ifdef TD5
- IVAS_POSITION Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
-#endif
+ IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS];
for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i )
@@ -1642,9 +1771,7 @@ static ivas_error decodeG192(
fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" );
}
-#ifdef BINAURALIZATION_DELAY_REPORT
delayNumSamples_orig[0] = -1;
-#endif
#ifdef WMOPS
reset_stack();
@@ -1694,8 +1821,6 @@ static ivas_error decodeG192(
goto cleanup;
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/* reference vector */
if ( arg.enableReferenceVectorTracking )
{
@@ -1712,16 +1837,11 @@ static ivas_error decodeG192(
goto cleanup;
}
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
/* Reference rotation */
if ( arg.enableReferenceRotation )
{
IVAS_QUATERNION quaternion;
-#ifdef TD5
if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = HeadRotationFileReading( refRotReader, &quaternion ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ),
#ifdef EXTERNAL_ORIENTATIONS
@@ -1738,20 +1858,14 @@ static ivas_error decodeG192(
goto cleanup;
}
}
-#endif
/* Head-tracking input simulation */
if ( arg.enableHeadRotation )
{
IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
-#ifdef FIX_I109_ORIENTATION_TRACKING
for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
{
-#ifdef TD5
if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i] ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ),
#ifdef EXTERNAL_ORIENTATIONS
@@ -1762,28 +1876,8 @@ static ivas_error decodeG192(
goto cleanup;
}
}
-#else
-#ifdef TD5
- if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, Pos ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, frame ) ) != IVAS_ERR_OK )
-#endif
- {
- fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ),
-#ifdef EXTERNAL_ORIENTATIONS
- RotationFileReader_getFilePath( headRotReader ) );
-#else
- HeadRotationFileReader_getFilePath( headRotReader ) );
-#endif
- goto cleanup;
- }
-#endif
-#ifdef TD5
if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
goto cleanup;
@@ -1842,11 +1936,7 @@ static ivas_error decodeG192(
arg,
numInitialBadFrames,
nOutSamples,
-#ifdef BINAURALIZATION_DELAY_REPORT
delayNumSamples_orig,
-#else
- &delayNumSamples_orig,
-#endif
&delayNumSamples,
&delayTimeScale,
&bsFormat,
@@ -1866,7 +1956,6 @@ static ivas_error decodeG192(
}
}
-
/* Write current frame */
if ( decodedGoodFrame )
{
@@ -1915,23 +2004,14 @@ static ivas_error decodeG192(
}
else if ( bsFormat == IVAS_DEC_BS_MASA )
{
-#ifdef FIX_350_MASA_DELAY_COMP
MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta;
if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK )
-#else
- IVAS_MASA_QMETADATA_HANDLE qMetadata;
- if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &qMetadata ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
goto cleanup;
}
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = MasaFileWriter_writeFrame( masaWriter, qMetadata ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
goto cleanup;
@@ -1960,13 +2040,9 @@ static ivas_error decodeG192(
* Add zeros at the end to have equal length of synthesized signals
*------------------------------------------------------------------------------------------*/
-#ifdef BINAURALIZATION_DELAY_REPORT
memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) );
+
if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK )
-#else
- memset( pcmBuf, 0, delayNumSamples_orig * nOutChannels * sizeof( int16_t ) );
- if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig * nOutChannels ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) );
goto cleanup;
@@ -1978,21 +2054,13 @@ static ivas_error decodeG192(
if ( !arg.quietModeEnabled )
{
-#ifdef BINAURALIZATION_DELAY_REPORT
printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale );
if ( delayNumSamples_orig[2] > 0 )
{
printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale );
-#ifdef FIX_371_DELAY_REPORT
printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale );
-#else
- printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[0] / (float) delayTimeScale, delayNumSamples_orig[0], delayTimeScale );
-#endif
}
-#else
- fprintf( stdout, "\nDecoder delay: %-5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale );
-#endif
}
/* Print output metadata file name(s) */
@@ -2161,8 +2229,13 @@ static ivas_error decodeVoIP(
uint32_t nextPacketRcvTime_ms = 0;
uint32_t systemTime_ms = 0;
+#ifdef JBM_TSM_ON_TCS
+ uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS;
+ int32_t nFramesWritten = 0;
+#endif
int32_t nFramesFed = 0;
+
uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3];
int16_t auSize;
uint16_t rtpSequenceNumber;
@@ -2181,11 +2254,7 @@ static ivas_error decodeVoIP(
#endif
JbmOffsetFileWriter *jbmOffsetWriter = NULL;
-#ifdef BINAURALIZATION_DELAY_REPORT
int16_t delayNumSamples_orig[3]; /* stores: overall delay, dec+rend delay, and binauralization delay */
-#else
- int16_t delayNumSamples_orig = -1;
-#endif
int16_t delayNumSamples = -1;
int32_t delayTimeScale = -1;
@@ -2205,9 +2274,7 @@ static ivas_error decodeVoIP(
ismWriters[i] = NULL;
}
-#ifdef BINAURALIZATION_DELAY_REPORT
delayNumSamples_orig[0] = -1;
-#endif
rtpdumpDepacker.rtpdump = NULL;
switch ( arg.inputFormat )
@@ -2301,10 +2368,27 @@ static ivas_error decodeVoIP(
* Main receiving/decoding loop
*------------------------------------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ systemTimeInc_ms = arg.frontendFetchSizeMs;
+#endif
+#endif
+
while ( 1 )
{
int16_t nOutSamples = 0;
-
+#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING )
+ uint16_t nSamplesAvailableNext = 0;
+#endif
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUG_JBM_CMD_OPTION
+ nOutSamples = (int16_t) ( arg.output_Fs / 1000 * arg.frontendFetchSizeMs );
+#else
+ nOutSamples = (int16_t) ( arg.output_Fs / 1000 * JBM_FRONTEND_FETCH_FRAMESIZE_MS );
+#endif
+#else
+ nOutSamples = (int16_t) ( arg.output_Fs / 50 );
+#endif
/* read all packets with a receive time smaller than the system time */
while ( nextPacketRcvTime_ms <= systemTime_ms )
{
@@ -2348,15 +2432,23 @@ static ivas_error decodeVoIP(
/* we are finished when all packets have been received and jitter buffer is empty */
/* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */
+#ifdef JBM_TSM_ON_TCS
+ /* last clause should make sure that for BE tests we end up with the same number of samples...*/
+ if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) )
+#else
if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec ) || nFramesFed < 2 ) )
+#endif
{
break;
}
- nOutSamples = (int16_t) ( arg.output_Fs / 50 );
/* decode and get samples */
if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms
+#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING )
+ ,
+ &nSamplesAvailableNext
+#endif
#ifdef SUPPORT_JBM_TRACEFILE
,
writeJbmTraceFileFrameWrapper,
@@ -2404,11 +2496,7 @@ static ivas_error decodeVoIP(
arg,
numInitialBadFrames,
nOutSamples,
-#ifdef BINAURALIZATION_DELAY_REPORT
delayNumSamples_orig,
-#else
- &delayNumSamples_orig,
-#endif
&delayNumSamples,
&delayTimeScale,
&bsFormat,
@@ -2422,7 +2510,11 @@ static ivas_error decodeVoIP(
goto cleanup;
}
}
+#ifdef DEBUG_JBM_CMD_OPTION
+ else if ( arg.noBadFrameDelay == false )
+#else
else
+#endif
{
++numInitialBadFrames;
}
@@ -2445,6 +2537,55 @@ static ivas_error decodeVoIP(
{
delayNumSamples -= nOutSamples;
}
+
+#ifdef JBM_TSM_ON_TCS
+ /* Write ISM metadata to external file(s) */
+ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT )
+ {
+ int16_t i;
+
+ if ( bsFormat == IVAS_DEC_BS_OBJ )
+ {
+ if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ for ( i = 0; i < numObj; ++i )
+ {
+ IVAS_ISM_METADATA IsmMetadata;
+
+ if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) );
+ goto cleanup;
+ }
+ }
+ }
+ else if ( bsFormat == IVAS_DEC_BS_MASA )
+ {
+ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta;
+ if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
+ goto cleanup;
+ }
+ }
+ }
+#endif
}
if ( !arg.quietModeEnabled )
@@ -2453,7 +2594,12 @@ static ivas_error decodeVoIP(
}
frame++;
+#ifdef JBM_TSM_ON_TCS
+ systemTime_ms += systemTimeInc_ms;
+ nFramesWritten++;
+#else
systemTime_ms += 20;
+#endif
#ifdef WMOPS
update_mem();
@@ -2465,13 +2611,8 @@ static ivas_error decodeVoIP(
* Add zeros at the end to have equal length of synthesized signals
*------------------------------------------------------------------------------------------*/
-#ifdef BINAURALIZATION_DELAY_REPORT
memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) );
if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK )
-#else
- memset( pcmBuf, 0, delayNumSamples_orig * nOutChannels * sizeof( int16_t ) );
- if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig * nOutChannels ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) );
goto cleanup;
@@ -2483,21 +2624,13 @@ static ivas_error decodeVoIP(
if ( !arg.quietModeEnabled )
{
-#ifdef BINAURALIZATION_DELAY_REPORT
printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale );
if ( delayNumSamples_orig[2] > 0 )
{
printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale );
-#ifdef FIX_371_DELAY_REPORT
printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale );
-#else
- printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[0] / (float) delayTimeScale, delayNumSamples_orig[0], delayTimeScale );
-#endif
}
-#else
- printf( "\nDecoder delay: %5u [samples] - Timescale: %5u\n", delayNumSamples_orig, delayTimeScale );
-#endif
}
/*------------------------------------------------------------------------------------------*
@@ -2525,6 +2658,543 @@ cleanup:
#ifdef DEBUGGING
+#ifdef VARIABLE_SPEED_DECODING
+/*---------------------------------------------------------------------*
+ * decodeVariableSpeed()
+ *
+ * Read G.192 or decode with variable Speed
+ *---------------------------------------------------------------------*/
+
+static ivas_error decodeVariableSpeed(
+ DecArguments arg,
+ BS_READER_HANDLE hBsReader,
+ HeadRotFileReader *headRotReader,
+ HeadRotFileReader *refRotReader,
+ Vector3PairFileReader *referenceVectorReader,
+ IVAS_DEC_HANDLE hIvasDec )
+
+{
+ bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */
+ uint16_t bit_stream[IVAS_MAX_BITS_PER_FRAME + 4 * 8];
+ int16_t i, num_bits;
+ int16_t bfi = 0;
+#ifdef DEBUGGING
+ int16_t fec_seed = 12558; /* FEC_SEED */
+#endif
+ AudioFileWriter *afWriter = NULL;
+ MasaFileWriter *masaWriter = NULL;
+ bool decodedGoodFrame = false;
+ int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */
+ int16_t nOutChannels = 0;
+ int16_t delayNumSamples = -1;
+ int16_t delayNumSamples_orig[3];
+ int16_t nOutSamples = 0;
+ int32_t delayTimeScale = 0;
+ ivas_error error = IVAS_ERR_UNKNOWN;
+ uint16_t numObj = 0;
+ IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN;
+ uint16_t nSamplesAvailableNext;
+ int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE];
+#ifdef SUPPORT_JBM_TRACEFILE
+ JbmTraceFileWriter *jbmTraceWriter = NULL;
+#endif
+ TsmScaleFileReader *tsmScaleFileReader = NULL;
+ IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS];
+ IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
+ int16_t scale;
+ for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i )
+ {
+ ismWriters[i] = NULL;
+ }
+
+ /*------------------------------------------------------------------------------------------*
+ * Open TSM scale file
+ *------------------------------------------------------------------------------------------*/
+
+ if ( arg.tsmScaleFileEnabled )
+ {
+ if ( ( tsmScaleFileReader = TsmScaleFileReader_open( arg.tsmScaleFileName ) ) == NULL )
+ {
+ fprintf( stderr, "\nError: Can't open TSM scale file %s \n\n", arg.tsmScaleFileName );
+ goto cleanup;
+ }
+ }
+
+ if ( !arg.quietModeEnabled )
+ {
+ fprintf( stdout, "\n------ Running the decoder ------\n\n" );
+ fprintf( stdout, "Frames processed: " );
+ }
+ else
+ {
+ fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" );
+ }
+
+ delayNumSamples_orig[0] = -1;
+
+#ifdef WMOPS
+ reset_stack();
+ reset_wmops();
+#endif
+ nSamplesAvailableNext = 0;
+ nOutSamples = (int16_t) ( arg.output_Fs / 1000 * VARIABLE_SPEED_FETCH_FRAMESIZE_MS );
+
+ /*------------------------------------------------------------------------------------------*
+ * Loop for every packet (frame) of bitstream data
+ * - Read the bitstream packet
+ * - Run the decoder
+ * - Write the synthesized signal into output file
+ *------------------------------------------------------------------------------------------*/
+
+ while ( 1 )
+ {
+ /* Read next frame if not enough samples availble */
+
+ /* reference vector */
+ if ( arg.enableReferenceVectorTracking )
+ {
+ IVAS_VECTOR3 listenerPosition, referencePosition;
+ if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) );
+ goto cleanup;
+ }
+
+ if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+
+ /* Reference rotation */
+ if ( arg.enableReferenceRotation )
+ {
+ IVAS_QUATERNION quaternion;
+ if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) );
+ goto cleanup;
+ }
+
+ if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+
+ /* Head-tracking input simulation */
+ if ( arg.enableHeadRotation )
+ {
+ IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
+
+ for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) );
+ goto cleanup;
+ }
+ }
+
+ if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+
+ /* decode and get samples */
+ do
+ {
+ error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, 0, &nSamplesAvailableNext
+#ifdef SUPPORT_JBM_TRACEFILE
+ ,
+ writeJbmTraceFileFrameWrapper, jbmTraceWriter
+#endif
+ );
+
+ if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( error == IVAS_ERR_VS_FRAME_NEEDED )
+ {
+ if ( arg.tsmScaleFileEnabled )
+ {
+ if ( ( error = TsmScaleFileReader_readScale( tsmScaleFileReader, &scale ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename );
+ goto cleanup;
+ }
+ IVAS_DEC_VoIP_SetScale( hIvasDec, scale );
+ }
+
+ if ( ( error = BS_Reader_ReadFrame_short( hBsReader, bit_stream, &num_bits, &bfi ) ) != IVAS_ERR_OK )
+ {
+ if ( error == IVAS_ERR_END_OF_FILE )
+ {
+ break;
+ }
+ fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename );
+ goto cleanup;
+ }
+
+#ifdef DEBUGGING
+ /* Random FEC simulation */
+ if ( arg.FER > 0.0f )
+ {
+ float ftmp = (float) app_own_random( &fec_seed ) + 32768.0f;
+ if ( ftmp <= arg.FER / 100.0f * 65535.0f )
+ {
+ bfi = 1;
+ }
+ else
+ {
+ bfi = 0;
+ }
+ }
+#endif
+
+ /* Feed into decoder */
+ if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, bit_stream, num_bits, bfi ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ error = IVAS_ERR_VS_FRAME_NEEDED;
+ }
+ } while ( error != IVAS_ERR_OK );
+
+ if ( error == IVAS_ERR_END_OF_FILE )
+ {
+ break;
+ }
+
+ /* Continue checking for first good frame until it is found */
+ if ( !decodedGoodFrame )
+ {
+ if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error );
+ goto cleanup;
+ }
+
+ /* Once good frame decoded, catch up */
+ if ( decodedGoodFrame )
+ {
+ error = initOnFirstGoodFrame(
+ hIvasDec,
+ arg,
+ numInitialBadFrames,
+ nOutSamples,
+ delayNumSamples_orig,
+ &delayNumSamples,
+ &delayTimeScale,
+ &bsFormat,
+ &afWriter,
+ &masaWriter,
+ ismWriters,
+ &nOutChannels,
+ &numObj );
+ if ( error != IVAS_ERR_OK )
+ {
+ goto cleanup;
+ }
+ }
+ else
+ {
+ ++numInitialBadFrames;
+ }
+ }
+
+ /* Write current frame */
+ if ( decodedGoodFrame )
+ {
+ if ( delayNumSamples < nOutSamples )
+ {
+ if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nOutput audio file writer error\n" );
+ goto cleanup;
+ }
+ delayNumSamples = 0;
+ }
+ else
+ {
+ delayNumSamples -= nOutSamples;
+ }
+ }
+
+ /* Write ISm metadata to external file(s) */
+ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT )
+ {
+ if ( bsFormat == IVAS_DEC_BS_OBJ )
+ {
+ if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ for ( i = 0; i < numObj; ++i )
+ {
+ IVAS_ISM_METADATA IsmMetadata;
+
+ if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) );
+ goto cleanup;
+ }
+ }
+ }
+ else if ( bsFormat == IVAS_DEC_BS_MASA )
+ {
+ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta;
+ if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
+ goto cleanup;
+ }
+ }
+ }
+
+ frame++;
+ if ( !arg.quietModeEnabled )
+ {
+ fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame );
+#ifdef DEBUGGING
+ if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) )
+ {
+ fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 );
+ }
+#endif
+ }
+#ifdef WMOPS
+ update_wmops();
+#ifdef MEM_COUNT_DETAILS
+ export_mem( "mem_analysis.csv" );
+#endif
+#endif
+ }
+
+
+ /*------------------------------------------------------------------------------------------*
+ * Flush what is still left in the VoIP Buffers....
+ *------------------------------------------------------------------------------------------*/
+
+ while ( nSamplesAvailableNext > 0 )
+ {
+ int16_t nSamplesFlushed;
+
+ /* Feed into decoder */
+
+ /* reference vector */
+ if ( arg.enableReferenceVectorTracking )
+ {
+ IVAS_VECTOR3 listenerPosition, referencePosition;
+ if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) );
+ goto cleanup;
+ }
+
+ if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+ /* Reference rotation */
+ if ( arg.enableReferenceRotation )
+ {
+ IVAS_QUATERNION quaternion;
+ if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) );
+ goto cleanup;
+ }
+
+ if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+ /* Head-tracking input simulation */
+ if ( arg.enableHeadRotation )
+ {
+ IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES];
+
+ for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) );
+ goto cleanup;
+ }
+ }
+
+ if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+ }
+
+ /* decode and get samples */
+ if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesAvailableNext, &nSamplesFlushed ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ /* Write current frame */
+ if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nOutput audio file writer error\n" );
+ goto cleanup;
+ }
+
+ /* Write ISm metadata to external file(s) */
+ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT )
+ {
+ if ( bsFormat == IVAS_DEC_BS_OBJ )
+ {
+ if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ for ( i = 0; i < numObj; ++i )
+ {
+ IVAS_ISM_METADATA IsmMetadata;
+
+ if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) );
+ goto cleanup;
+ }
+ }
+ }
+ else if ( bsFormat == IVAS_DEC_BS_MASA )
+ {
+ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta;
+ if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) );
+ goto cleanup;
+ }
+
+ if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
+ goto cleanup;
+ }
+ }
+ }
+
+ frame++;
+ if ( !arg.quietModeEnabled )
+ {
+ fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame );
+#ifdef DEBUGGING
+ if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) )
+ {
+ fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 );
+ }
+#endif
+ }
+ }
+
+ /*------------------------------------------------------------------------------------------*
+ * Printouts after decoding has finished
+ *------------------------------------------------------------------------------------------*/
+
+ if ( !arg.quietModeEnabled )
+ {
+ printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale );
+
+ if ( delayNumSamples_orig[2] > 0 )
+ {
+ printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale );
+ printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale );
+ }
+ }
+
+ /* Print output metadata file name(s) */
+ if ( arg.outputFormat == IVAS_DEC_OUTPUT_EXT )
+ {
+ if ( bsFormat == IVAS_DEC_BS_OBJ )
+ {
+ for ( i = 0; i < numObj; i++ )
+ {
+ fprintf( stdout, "\nOutput metadata file: %s", IsmFileWriter_getFilePath( ismWriters[i] ) );
+ }
+ fprintf( stdout, "\n" );
+ }
+ else if ( bsFormat == IVAS_DEC_BS_MASA )
+ {
+ fprintf( stdout, "\nOutput metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) );
+ }
+ }
+
+ /* add zeros at the end to have equal length of synthesized signals */
+ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) );
+ if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) );
+ goto cleanup;
+ }
+
+ /*------------------------------------------------------------------------------------------*
+ * Close files and deallocate resources
+ *------------------------------------------------------------------------------------------*/
+
+ decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */
+
+cleanup:
+
+ AudioFileWriter_close( &afWriter );
+ MasaFileWriter_close( &masaWriter );
+ TsmScaleFileReader_close( &tsmScaleFileReader );
+ for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ )
+ {
+ IsmFileWriter_close( &ismWriters[i] );
+ }
+
+ if ( decodingFailed && error == IVAS_ERR_OK )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+
+ return error;
+}
+#endif
+
+
/*---------------------------------------------------------------------*
* parseForcedRendModeDec()
*
diff --git a/apps/encoder.c b/apps/encoder.c
index ff6f461838a5b73410129dde9f274f42f1e28bfe..1dc0aead517c33f79a1a282ca6d40b4745143074 100644
--- a/apps/encoder.c
+++ b/apps/encoder.c
@@ -98,6 +98,9 @@ typedef struct
char *outputBitstreamFilename;
int32_t inputFs;
IVAS_ENC_INPUT_FORMAT inputFormat;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ bool is_binaural;
+#endif
EncInputFormatConfig inputFormatConfig;
bool max_bwidth_user;
IVAS_ENC_BANDWIDTH maxBandwidth;
@@ -111,6 +114,7 @@ typedef struct
IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig;
const char *ca_config_file;
bool mimeOutput;
+ IVAS_ENC_COMPLEXITY_LEVEL complexityLevel;
#ifdef DEBUGGING
IVAS_ENC_FORCED_MODE forcedMode;
@@ -126,9 +130,7 @@ typedef struct
#endif
#endif
bool pca;
-#ifdef TD5
bool ism_extended_metadata;
-#endif
} EncArguments;
@@ -363,17 +365,29 @@ int main(
switch ( arg.inputFormat )
{
case IVAS_ENC_INPUT_MONO:
+#ifdef BINAURAL_AUDIO_CMDLINE
+ if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix, arg.is_binaural ) ) != IVAS_ERR_OK )
+#else
if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix ) ) != IVAS_ERR_OK )
+#endif
{
fprintf( stderr, "\nIVAS_ENC_ConfigureForMono failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) );
goto cleanup;
}
break;
case IVAS_ENC_INPUT_STEREO:
+#ifdef BINAURAL_AUDIO_CMDLINE
+#ifdef DEBUGGING
+ if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural ) ) != IVAS_ERR_OK )
+#endif
+#else
#ifdef DEBUGGING
if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK )
#else
if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig ) ) != IVAS_ERR_OK )
+#endif
#endif
{
fprintf( stderr, "\nIVAS_ENC_ConfigureForStereo failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) );
@@ -381,11 +395,7 @@ int main(
}
break;
case IVAS_ENC_INPUT_ISM:
-#ifdef TD5
if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects, arg.ism_extended_metadata ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = IVAS_ENC_ConfigureForObjects( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.ism.numObjects ) ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "\nIVAS_ENC_ConfigureForObjects failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) );
goto cleanup;
@@ -870,6 +880,9 @@ static void initArgStruct( EncArguments *arg )
arg->outputBitstreamFilename = NULL;
arg->inputFs = 0;
arg->inputFormat = IVAS_ENC_INPUT_MONO;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ arg->is_binaural = false;
+#endif
arg->inputFormatConfig.stereoToMonoDownmix = false;
arg->max_bwidth_user = false;
arg->maxBandwidth = IVAS_ENC_BANDWIDTH_UNDEFINED;
@@ -883,9 +896,8 @@ static void initArgStruct( EncArguments *arg )
arg->caConfig = IVAS_ENC_GetDefaultChannelAwareConfig();
arg->ca_config_file = NULL;
arg->mimeOutput = false;
-#ifdef TD5
arg->ism_extended_metadata = false;
-#endif
+ arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE;
#ifdef DEBUGGING
arg->forcedMode = IVAS_ENC_FORCE_UNFORCED;
@@ -1138,18 +1150,18 @@ static bool parseCmdlIVAS_enc(
{
strncpy( stmp, argv[i], sizeof( stmp ) );
stmp[sizeof( stmp ) - 1] = '\0';
- to_upper( argv[i] );
- if ( strcmp( argv[i], "LO" ) == 0 )
+ to_upper( stmp );
+ if ( strcmp( stmp, "LO" ) == 0 )
{
arg->caConfig.fec_indicator = IVAS_ENC_FEC_LO;
}
- else if ( strcmp( argv[i], "HI" ) == 0 )
+ else if ( strcmp( stmp, "HI" ) == 0 )
{
arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI;
}
else
{
- arg->ca_config_file = stmp;
+ arg->ca_config_file = argv[i];
}
i++;
@@ -1185,10 +1197,44 @@ static bool parseCmdlIVAS_enc(
++i;
}
+
+ /*-----------------------------------------------------------------*
+ * Complexity Level
+ *-----------------------------------------------------------------*/
+
+ /* actual parsing of level will be implemented after characterization */
+ else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 )
+ {
+ int16_t level;
+
+ ++i;
+ level = (int16_t) atoi( argv[i++] );
+ if ( level < IVAS_ENC_COMPLEXITY_LEVEL_ONE || level > IVAS_ENC_COMPLEXITY_LEVEL_THREE )
+ {
+ fprintf( stdout, "Invalid complexity level specified.\n" );
+ usage_enc();
+ return false;
+ }
+ else if ( level == IVAS_ENC_COMPLEXITY_LEVEL_ONE || level == IVAS_ENC_COMPLEXITY_LEVEL_TWO )
+ {
+ fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" );
+ }
+ }
+
/*-----------------------------------------------------------------*
* IVAS Formats
*-----------------------------------------------------------------*/
+#ifdef BINAURAL_AUDIO_CMDLINE
+ else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 )
+ {
+ i++;
+ if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 )
+ {
+ arg->is_binaural = true;
+ }
+ }
+#endif
else if ( strcmp( argv_to_upper, "-STEREO" ) == 0 )
{
i++;
@@ -1273,13 +1319,11 @@ static bool parseCmdlIVAS_enc(
if ( i < argc - 4 )
{
-#ifdef TD5
if ( argv[i][0] == '+' )
{
argv[i]++;
arg->ism_extended_metadata = true;
}
-#endif
if ( !is_digits_only( argv[i] ) )
{
fprintf( stderr, "Error: Number of ISM channels must be an integer number!\n\n" );
@@ -1471,9 +1515,10 @@ static bool parseCmdlIVAS_enc(
{
arg->inputFormat = IVAS_ENC_INPUT_MONO;
arg->inputFormatConfig.stereoToMonoDownmix = true;
+
i++;
}
- else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // VE: should be renamed to "-pca"
+ else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // TODO: should be renamed to "-pca"
{
i++;
if ( i < argc - 4 )
@@ -1658,23 +1703,20 @@ static void usage_enc( void )
fprintf( stdout, "Options:\n" );
fprintf( stdout, "--------\n" );
fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc\n" );
- fprintf( stdout, "-stereo [Mode] : Stereo format, default is unified stereo \n" );
- fprintf( stdout, " optional for Mode: 1: DFT Stereo, 2: TD Stereo, 3: MDCT Stereo\n" );
-#ifdef TD5
+#ifdef BINAURAL_AUDIO_CMDLINE
+ fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" );
+#endif
+ fprintf( stdout, "-stereo : Stereo format \n" );
fprintf( stdout, "-ism (+)Ch Files : ISM format \n" );
fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" );
- fprintf( stdout, " where positive (+) means extended metadata format is used (including orientation and radius) \n" );
-#else
- fprintf( stdout, "-ism Channels Files : ISM format \n" );
- fprintf( stdout, " where Channels specifies the number of ISMs (1-4)\n" );
-#endif
+ fprintf( stdout, " where positive (+) indicates extended metadata (only 64 kbps and up) \n" );
fprintf( stdout, " and Files specify input files containing metadata, one file per object\n" );
fprintf( stdout, " (use NULL for no input metadata)\n" );
fprintf( stdout, "-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),\n" );
fprintf( stdout, " where Order specifies the Ambisionics order (1-3),\n" );
fprintf( stdout, " where positive (+) means full 3D and negative (-) only 2D/planar components to be coded\n" );
- fprintf( stdout, "-masa Channels File : MASA format \n" );
- fprintf( stdout, " where Channels specifies the number of input/transport channels (1 or 2): \n" );
+ fprintf( stdout, "-masa Ch File : MASA format \n" );
+ fprintf( stdout, " where Ch specifies the number of input/transport channels (1 or 2): \n" );
fprintf( stdout, " and File specifies input file containing parametric MASA metadata \n" );
fprintf( stdout, "-mc InputConf : Multi-channel format\n" );
fprintf( stdout, " where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4\n" );
@@ -1700,6 +1742,8 @@ static void usage_enc( void )
fprintf( stdout, " default output bitstream file format is G.192\n" );
fprintf( stdout, "-bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1\n" );
+ fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" );
+ fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" );
#ifdef DEBUGGING
fprintf( stdout, "-force T : Force specific mode, T = (speech, music, ACELP, GSC, TCX, HQ),\n" );
fprintf( stdout, " alternatively, T can be a text file where each line contains \"nb_frames T\"\n" );
diff --git a/apps/renderer.c b/apps/renderer.c
index b3a52262ac9b897a3f79540c16775439a410a100..1ef09b59a2e1619104c57df53dd542de4755421b 100644
--- a/apps/renderer.c
+++ b/apps/renderer.c
@@ -46,9 +46,7 @@
#else
#include "head_rotation_file_reader.h"
#endif
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
#include "vector3_pair_file_reader.h"
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#include "hrtf_file_reader.h"
#include "ism_file_reader.h"
#include "ls_custom_file_reader.h"
@@ -137,19 +135,20 @@ typedef struct
char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH];
int16_t numInMetadataFiles;
char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
-#endif
#ifdef EXTERNAL_ORIENTATIONS
char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
#endif
char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH];
+#ifdef FIX_439_OTR_PARAMS
+ int8_t orientation_tracking;
+#else
int8_t orientationTracking;
- float noDiegeticPan;
+#endif
+ int16_t nonDiegeticPan;
+ float nonDiegeticPanGain;
bool delayCompensationEnabled;
bool quietModeEnabled;
bool sceneDescriptionInput;
@@ -173,7 +172,7 @@ typedef enum
CmdLnOptionId_refRotFile,
CmdLnOptionId_customHrtfFile,
CmdLnOptionId_renderConfigFile,
- CmdLnOptionId_noDiegeticPan,
+ CmdLnOptionId_nonDiegeticPan,
CmdLnOptionId_orientationTracking,
CmdlnOptionId_lfePosition,
CmdlnOptionId_lfeMatrix,
@@ -182,9 +181,7 @@ typedef enum
CmdLnOptionId_inputMetadata,
CmdLnOptionId_listFormats,
CmdLnOptionId_inputGain,
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
CmdLnOptionId_referenceVectorFile,
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
CmdLnOptionId_exteriorOrientationFile,
#endif
@@ -252,24 +249,20 @@ static const CmdLnParser_Option cliOptions[] = {
.description = "Binaural renderer configuration file (only for BINAURAL and BINAURAL_ROOM outputs)",
},
{
- .id = CmdLnOptionId_noDiegeticPan,
- .match = "no_diegetic_pan",
+ .id = CmdLnOptionId_nonDiegeticPan,
+ .match = "non_diegetic_pan",
.matchShort = "ndp",
- .description = "Panning mono no diegetic sound to stereo -1<= pan <= 1\nleft or l or 1->left, right or r or -1->right, center or c or 0 ->middle\n(todo: implementation)",
+#ifdef FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER
+ .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n",
+#else
+ .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n(todo: implementation)",
+#endif
},
{
.id = CmdLnOptionId_orientationTracking,
.match = "tracking_type",
.matchShort = "otr",
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
.description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for BINAURAL and BINAURAL_ROOM)",
-#else
- .description = "Head orientation tracking type: 'none', 'ref' or 'avg' (only for BINAURAL and BINAURAL_ROOM)",
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
- .description = "Head orientation tracking type: 'ref' or 'avg' (only for BINAURAL and BINAURAL_ROOM)",
-#endif
},
{
.id = CmdlnOptionId_lfePosition,
@@ -305,14 +298,12 @@ static const CmdLnParser_Option cliOptions[] = {
.matchShort = "l",
.description = "List supported audio formats",
},
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
{
.id = CmdLnOptionId_referenceVectorFile,
.match = "reference_vector_file",
.matchShort = "rvf",
.description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)",
},
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
{
.id = CmdLnOptionId_exteriorOrientationFile,
@@ -549,19 +540,12 @@ int main(
#ifdef EXTERNAL_ORIENTATIONS
RotFileReader *headRotReader = NULL;
RotFileReader *externalOrientationFileReader = NULL;
-#else
- HeadRotFileReader *headRotReader = NULL;
-#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
- Vector3PairFileReader *referenceVectorReader = NULL;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#ifdef EXTERNAL_ORIENTATIONS
RotFileReader *referenceRotReader = NULL;
#else
+ HeadRotFileReader *headRotReader = NULL;
HeadRotFileReader *referenceRotReader = NULL;
#endif
-#endif
+ Vector3PairFileReader *referenceVectorReader = NULL;
hrtfFileReader *hrtfFileReader = NULL;
IsmPositionProvider *positionProvider;
RenderConfigReader *renderConfigReader = NULL;
@@ -585,9 +569,7 @@ int main(
int32_t delayTimeScale = 0;
int16_t i, numChannels;
ivas_error error = IVAS_ERR_OK;
-#ifdef TD5
- IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME];
-#endif
+ IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME];
#ifdef WMOPS
reset_wmops();
@@ -602,28 +584,30 @@ int main(
CmdlnArgs args = parseCmdlnArgs( argc, argv );
+ if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_REND_AUDIO_CONFIG_MONO ) ||
+ ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_REND_AUDIO_CONFIG_OBJECT && args.inConfig.numAudioObjects == 1 ) ) )
+ {
+ fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" );
+ exit( -1 );
+ }
+
+ if ( args.nonDiegeticPan && args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_STEREO )
+ {
+ fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" );
+ exit( -1 );
+ }
+
positionProvider = IsmPositionProvider_open();
convert_backslash( args.inputFilePath );
convert_backslash( args.outputFilePath );
-#ifndef FIX_I109_ORIENTATION_TRACKING
- /* disable 'refrotequal' test cases */
- if ( strstr( args.headRotationFilePath, "azi_plus_2-ele_plus_2-every-100-frames.csv" ) != NULL )
- {
- memset( args.headRotationFilePath, '\0', sizeof( args.headRotationFilePath ) );
- }
-#endif
convert_backslash( args.headRotationFilePath );
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
convert_backslash( args.referenceVectorFilePath );
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
convert_backslash( args.referenceRotationFilePath );
-#endif
+ convert_backslash( args.inLfePanningMatrixFile );
#ifdef EXTERNAL_ORIENTATIONS
convert_backslash( args.externalOrientationFilePath );
#endif
- convert_backslash( args.inLfePanningMatrixFile );
if ( !isEmptyString( args.headRotationFilePath ) )
{
@@ -638,7 +622,6 @@ int main(
}
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( !isEmptyString( args.referenceRotationFilePath ) )
{
#ifdef EXTERNAL_ORIENTATIONS
@@ -651,7 +634,6 @@ int main(
exit( -1 );
}
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
if ( !isEmptyString( args.referenceVectorFilePath ) )
{
if ( Vector3PairFileReader_open( args.referenceVectorFilePath, &referenceVectorReader ) != IVAS_ERR_OK )
@@ -660,8 +642,6 @@ int main(
exit( -1 );
}
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
#ifdef EXTERNAL_ORIENTATIONS
if ( !isEmptyString( args.externalOrientationFilePath ) )
@@ -733,7 +713,6 @@ int main(
fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" );
exit( -1 );
}
- args.sampleRate = inFileSampleRate;
break;
default:
fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) );
@@ -754,18 +733,14 @@ int main(
IVAS_REND_InputId sbaIds[RENDERER_MAX_SBA_INPUTS] = { 0 };
IVAS_REND_InputId masaIds[RENDERER_MAX_MASA_INPUTS] = { 0 };
- if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig ) ) != IVAS_ERR_OK )
+ if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) );
exit( -1 );
}
/* === Configure === */
-#ifdef TD5
- if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = IVAS_REND_InitConfig( hIvasRend, strlen( args.renderConfigFilePath ) != 0 ) ) != IVAS_ERR_OK )
-#endif
+ if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK )
{
fprintf( stderr, "Error in Renderer Config Init\n" );
exit( -1 );
@@ -776,17 +751,9 @@ int main(
IVAS_RENDER_CONFIG_DATA renderConfig;
/* sanity check */
-#ifdef TD5
if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) )
-#else
- if ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM )
-#endif
{
-#ifdef TD5
fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL or BINAURAL_ROOM is used as output. Exiting. \n" );
-#else
- fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL_ROOM is used as output. Exiting. \n" );
-#endif
exit( -1 );
}
@@ -809,12 +776,14 @@ int main(
}
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
+#ifdef FIX_439_OTR_PARAMS
+ if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK )
+#else
if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientationTracking ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
-#endif
/* Set up output custom layout configuration */
if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM )
@@ -1015,8 +984,6 @@ int main(
ObjectPositionBuffer mtdBuffer;
IsmPositionProvider_getNextFrame( positionProvider, &mtdBuffer );
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
if ( referenceVectorReader != NULL )
{
IVAS_VECTOR3 listenerPos, refPos;
@@ -1031,16 +998,11 @@ int main(
exit( -1 );
}
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
/* Read from reference rotation trajectory file if specified */
if ( referenceRotReader != NULL )
{
IVAS_QUATERNION quaternion;
-#ifdef TD5
if ( ( error = HeadRotationFileReading( referenceRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK )
-#else
- if ( HeadRotationFileReading( referenceRotReader, &quaternion ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) );
exit( -1 );
@@ -1052,38 +1014,21 @@ int main(
exit( -1 );
}
}
-#endif
/* Read from head rotation trajectory file if specified */
if ( headRotReader != NULL )
{
IVAS_QUATERNION quatBuffer[RENDERER_HEAD_POSITIONS_PER_FRAME];
-#ifdef FIX_I109_ORIENTATION_TRACKING
for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; i++ )
{
-#ifdef TD5
if ( ( error = HeadRotationFileReading( headRotReader, &quatBuffer[i], &Pos[i] ) ) != IVAS_ERR_OK )
-#else
- if ( HeadRotationFileReading( headRotReader, &quatBuffer[i] ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) );
exit( -1 );
}
}
-#else
-#ifdef TD5
- HeadRotationFileReading( headRotReader, quatBuffer, Pos );
-#else
- HeadRotationFileReading( headRotReader, quatBuffer, frame );
-#endif
-#endif
-#ifdef TD5
if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer, Pos ) ) != IVAS_ERR_OK )
-#else
- if ( IVAS_REND_SetHeadRotation( hIvasRend, quatBuffer ) != IVAS_ERR_OK )
-#endif
{
fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) );
exit( -1 );
@@ -1091,11 +1036,8 @@ int main(
}
else
{
-#ifdef TD5
- if ( ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) ) != IVAS_ERR_OK ) && ( IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC
-#else
- if ( ( IVAS_REND_SetHeadRotation( hIvasRend, NULL ) != IVAS_ERR_OK ) && ( IVAS_REND_SetHeadRotation( hIvasRend, NULL ) != IVAS_ERR_INVALID_OUTPUT_FORMAT ) )
-#endif
+ error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL );
+ if ( error != IVAS_ERR_OK && error != IVAS_ERR_INVALID_OUTPUT_FORMAT )
{
fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) );
exit( -1 );
@@ -1312,19 +1254,12 @@ int main(
#ifdef EXTERNAL_ORIENTATIONS
RotationFileReader_close( &headRotReader );
RotationFileReader_close( &externalOrientationFileReader );
-#else
- HeadRotationFileReader_close( &headRotReader );
-#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
- Vector3PairFileReader_close( &referenceVectorReader );
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#ifdef EXTERNAL_ORIENTATIONS
RotationFileReader_close( &referenceRotReader );
#else
+ HeadRotationFileReader_close( &headRotReader );
HeadRotationFileReader_close( &referenceRotReader );
#endif
-#endif
+ Vector3PairFileReader_close( &referenceVectorReader );
hrtfFileReader_close( &hrtfFileReader );
IVAS_REND_Close( &hIvasRend );
IsmPositionProvider_close( positionProvider );
@@ -1514,70 +1449,86 @@ static bool parseOutConfig(
static bool parseDiegeticPan(
char *value,
- float *noDiegeticPan )
+ float *nonDiegeticPan )
{
to_upper( value );
if ( ( strcmp( value, "CENTER" ) == 0 ) || ( strchr( value, 'C' ) != NULL ) )
{
- *noDiegeticPan = 0.f;
+ *nonDiegeticPan = 0.f;
}
else if ( ( strcmp( value, "LEFT" ) == 0 ) || ( strchr( value, 'L' ) != NULL ) )
{
- *noDiegeticPan = -1.f;
+ *nonDiegeticPan = 1.f;
}
else if ( ( strcmp( value, "RIGHT" ) == 0 ) || ( strchr( value, 'R' ) != NULL ) )
{
- *noDiegeticPan = 1.f;
+ *nonDiegeticPan = -1.f;
}
else
{
- *noDiegeticPan = (float) atof( value );
+ *nonDiegeticPan = (float) atof( value ) / 90.f;
- if ( *noDiegeticPan > 1.0f || *noDiegeticPan < -1.0f )
+ if ( *nonDiegeticPan > 1.0f || *nonDiegeticPan < -1.0f )
{
fprintf( stderr, "Error: Incorrect value for panning option argument specified!\n\n" );
return false;
}
}
- return false;
+ return true;
}
static bool parseOrientationTracking(
char *value,
- int8_t *tracking_type )
+#ifdef FIX_439_OTR_PARAMS
+ int8_t *orientation_tracking
+#else
+ int8_t *tracking_type
+#endif
+)
{
-
to_upper( value );
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( strcmp( value, "NONE" ) == 0 )
{
+#ifdef FIX_439_OTR_PARAMS
+ *orientation_tracking = HEAD_ORIENT_TRK_NONE;
+#else
*tracking_type = IVAS_ORIENT_TRK_NONE;
+#endif
}
else if ( strcmp( value, "REF" ) == 0 )
-#else
- if ( strcmp( value, "REF" ) == 0 )
-#endif
{
+#ifdef FIX_439_OTR_PARAMS
+ *orientation_tracking = HEAD_ORIENT_TRK_REF;
+#else
*tracking_type = IVAS_ORIENT_TRK_REF;
+#endif
}
else if ( strcmp( value, "AVG" ) == 0 )
{
+#ifdef FIX_439_OTR_PARAMS
+ *orientation_tracking = HEAD_ORIENT_TRK_AVG;
+#else
*tracking_type = IVAS_ORIENT_TRK_AVG;
+#endif
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
else if ( strcmp( value, "REF_VEC" ) == 0 )
{
+#ifdef FIX_439_OTR_PARAMS
+ *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC;
+#else
*tracking_type = IVAS_ORIENT_TRK_REF_VEC;
+#endif
}
else if ( strcmp( value, "REF_VEC_LEV" ) == 0 )
{
+#ifdef FIX_439_OTR_PARAMS
+ *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC_LEV;
+#else
*tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV;
- }
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#endif
+ }
else
{
fprintf( stderr, "Error: Invalid orientation tracking type %s \n\n", value );
@@ -1795,24 +1746,21 @@ static CmdlnArgs defaultArgs(
args.numInMetadataFiles = 0;
clearString( args.headRotationFilePath );
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
clearString( args.referenceVectorFilePath );
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
clearString( args.referenceRotationFilePath );
-#endif
+ clearString( args.customHrtfFilePath );
+ clearString( args.renderConfigFilePath );
#ifdef EXTERNAL_ORIENTATIONS
clearString( args.externalOrientationFilePath );
#endif
- clearString( args.customHrtfFilePath );
- clearString( args.renderConfigFilePath );
-#ifdef FIX_I109_ORIENTATION_TRACKING
- args.orientationTracking = IVAS_ORIENT_TRK_NONE;
+#ifdef FIX_439_OTR_PARAMS
+ args.orientation_tracking = HEAD_ORIENT_TRK_NONE;
#else
- args.orientationTracking = IVAS_ORIENT_TRK_REF;
+ args.orientationTracking = IVAS_ORIENT_TRK_NONE;
#endif
- args.noDiegeticPan = 0.0f;
+ args.nonDiegeticPan = 0;
+ args.nonDiegeticPanGain = 0.f;
args.delayCompensationEnabled = true;
args.quietModeEnabled = false;
@@ -1886,13 +1834,10 @@ static void parseOption(
assert( numOptionValues == 1 );
strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
break;
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
case CmdLnOptionId_referenceVectorFile:
assert( numOptionValues == 1 );
strncpy( args->referenceVectorFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
break;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
case CmdLnOptionId_refRotFile:
assert( numOptionValues == 1 );
strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
@@ -1903,7 +1848,6 @@ static void parseOption(
assert( numOptionValues == 1 );
strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
break;
-#endif
case CmdLnOptionId_customHrtfFile:
assert( numOptionValues == 1 );
strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
@@ -1912,17 +1856,22 @@ static void parseOption(
assert( numOptionValues == 1 );
strncpy( args->renderConfigFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 );
break;
- case CmdLnOptionId_noDiegeticPan:
+ case CmdLnOptionId_nonDiegeticPan:
assert( numOptionValues == 1 );
- if ( !parseDiegeticPan( optionValues[0], &args->noDiegeticPan ) )
+ if ( !parseDiegeticPan( optionValues[0], &args->nonDiegeticPanGain ) )
{
fprintf( stderr, "Unknown option for diegetic panning: %s\n", optionValues[0] );
exit( -1 );
}
+ args->nonDiegeticPan = 1;
break;
case CmdLnOptionId_orientationTracking:
assert( numOptionValues == 1 );
+#ifdef FIX_439_OTR_PARAMS
+ if ( !parseOrientationTracking( optionValues[0], &args->orientation_tracking ) )
+#else
if ( !parseOrientationTracking( optionValues[0], &args->orientationTracking ) )
+#endif
{
fprintf( stderr, "Unknown option for orientation tracking: %s\n", optionValues[0] );
exit( -1 );
@@ -1994,7 +1943,7 @@ IsmPositionProvider *IsmPositionProvider_open(
IsmPositionProvider *ipp;
uint16_t i;
- ipp = (IsmPositionProvider *) malloc_( sizeof( IsmPositionProvider ) );
+ ipp = (IsmPositionProvider *) malloc( sizeof( IsmPositionProvider ) );
ipp->frameCounter = 0;
ipp->numObjects = 0;
@@ -2026,11 +1975,10 @@ void getMetadataFromFileReader(
objectMetadataBuffer->positions[objIdx].azimuth = ismMetadata.azimuth;
objectMetadataBuffer->positions[objIdx].elevation = ismMetadata.elevation;
-#ifdef TD5
objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius;
objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw;
objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch;
-#endif
+ objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag;
return;
}
@@ -2085,11 +2033,10 @@ static void IsmPositionProvider_getNextFrame(
{
objectMetadataBuffer->positions[objIdx].azimuth = 0.0f;
objectMetadataBuffer->positions[objIdx].elevation = 0.0f;
-#ifdef TD5
objectMetadataBuffer->positions[objIdx].radius = 1.0f;
objectMetadataBuffer->positions[objIdx].yaw = 0.0f;
objectMetadataBuffer->positions[objIdx].pitch = 0.0f;
-#endif
+ objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0;
}
/* Wrap azimuth to lie within (-180, 180] range */
@@ -2104,7 +2051,6 @@ static void IsmPositionProvider_getNextFrame(
/* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */
objectMetadataBuffer->positions[objIdx].elevation = min( max( objectMetadataBuffer->positions[objIdx].elevation, -90 ), 90 );
-#ifdef TD5
/* Wrap yaw to lie within (-180, 180] range */
while ( objectMetadataBuffer->positions[objIdx].yaw < 0.0f )
{
@@ -2117,7 +2063,6 @@ static void IsmPositionProvider_getNextFrame(
/* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */
objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 );
-#endif
}
++positionProvider->frameCounter;
@@ -2352,15 +2297,15 @@ static void parseObjectPosition(
uint16_t *positionDuration )
{
char *endptr;
-#ifdef TD5
int16_t read_values;
- float meta_prm[7] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f };
+ float meta_prm[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f };
+
readNextMetadataChunk( line, "," );
*positionDuration = (uint16_t) strtol( line, &endptr, 10 );
readNextMetadataChunk( line, "\n" );
- read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6] );
+ read_values = (int16_t) sscanf( line, "%f,%f,%f,%f,%f,%f,%f,%f", &meta_prm[0], &meta_prm[1], &meta_prm[2], &meta_prm[3], &meta_prm[4], &meta_prm[5], &meta_prm[6], &meta_prm[7] );
if ( read_values < 2 )
{
@@ -2373,34 +2318,7 @@ static void parseObjectPosition(
position->radius = meta_prm[2];
position->yaw = meta_prm[5];
position->pitch = meta_prm[6];
-#else
-
- readNextMetadataChunk( line, "," );
- *positionDuration = (uint16_t) strtol( line, &endptr, 10 );
-
- if ( *endptr != '\0' )
- {
- fprintf( stderr, "Error reading metadata\n" );
- exit( -1 );
- }
-
- readNextMetadataChunk( line, "," );
- position->azimuth = strtof( line, &endptr );
-
- if ( *endptr != '\0' )
- {
- fprintf( stderr, "Error reading metadata\n" );
- exit( -1 );
- }
-
- readNextMetadataChunk( line, "\n" );
- position->elevation = strtof( line, &endptr );
- if ( *endptr != '\0' )
- {
- fprintf( stderr, "Error reading metadata\n" );
- exit( -1 );
- }
-#endif
+ position->non_diegetic_flag = (int16_t) meta_prm[7];
return;
}
@@ -2424,8 +2342,8 @@ static void parseIsm(
if ( parseUint32( line, &numberOfObjectPositionsToRead ) == 0 )
{
positionProvider->numPositions[idx] = numberOfObjectPositionsToRead;
- positionProvider->positions[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) );
- positionProvider->positionDurations[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( uint16_t ) );
+ positionProvider->positions[idx] = malloc( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) );
+ positionProvider->positionDurations[idx] = malloc( numberOfObjectPositionsToRead * sizeof( uint16_t ) );
for ( i = 0; i < numberOfObjectPositionsToRead; ++i )
{
diff --git a/ci/run_evs_be_win_test.py b/ci/run_evs_be_win_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1bcd7f3a4e7e69634878431d56a29be111642b3
--- /dev/null
+++ b/ci/run_evs_be_win_test.py
@@ -0,0 +1,149 @@
+"""
+ (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository. All Rights Reserved.
+
+ This software is protected by copyright law and by international treaties.
+ The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository retain full ownership rights in their respective contributions in
+ the software. This notice grants no license of any kind, including but not limited to patent
+ license, nor is any license granted by implication, estoppel or otherwise.
+
+ Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
+ contributions.
+
+ This software is provided "AS IS", without any express or implied warranties. The software is in the
+ development stage. It is intended exclusively for experts who have experience with such software and
+ solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
+ and fitness for a particular purpose are hereby disclaimed and excluded.
+
+ Any dispute, controversy or claim arising under or in relation to providing this software shall be
+ submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
+ accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
+ the United Nations Convention on Contracts on the International Sales of Goods.
+"""
+
+from multiprocessing import Pool
+import argparse
+import subprocess
+import os
+import shutil
+import sys
+
+
+def run_condition(eval_cmd, diff_cmd, id_count):
+ """ Run ENC or DEC command string and compare output with EVS test vectors. """
+
+ cmd = subprocess.run(eval_cmd.split(), capture_output=True, text=True, check=True)
+
+ # diff
+ diff_success = 1
+ if ';' in diff_cmd:
+ diff_cmd1, diff_cmd2 = diff_cmd.split(';')
+ cmd1 = subprocess.run(diff_cmd1.split(), capture_output=True, text=True, check=True)
+ cmd2 = subprocess.run(diff_cmd2.split(), capture_output=True, text=True, check=True)
+ diff_success = cmd1.returncode + cmd2.returncode
+ else:
+ cmd = subprocess.run(diff_cmd.split(), capture_output=True, text=True, check=True)
+ diff_success = cmd.returncode
+ if diff_success == 0:
+ return None
+ else:
+ return f'[{str(id_count).rjust(3)}] FAIL: {" ".join(eval_cmd)}\n {diff_cmd}\n'
+
+
+def environment_is_correct(paths):
+ """
+ Check that the folder with the test resources is set up correctly:
+ - all Readme files there
+ - EVS binaries available in bin/
+ - testv and switchPaths folder exist - Content is not checked, though
+ """
+ ret = True
+
+ for pth in paths:
+ if not os.path.exists(pth):
+ print(f"Environment setup is incorrect - {pth} not found.")
+ ret = False
+
+ return ret
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(
+ description='Run 26.444 test with parallel processes ')
+ parser.add_argument('-p', type=int, default=os.cpu_count(),
+ help='Number of processes (default cpu_count)')
+ parser.add_argument('-test_dir', type=str, default='./',
+ help='testvec directory from 26.444)')
+ parser.add_argument('-enc_bin', type=str, default='./bin/IVAS_cod.exe',
+ help='Encoder binary (default ./bin/IVAS_cod.exe)')
+ parser.add_argument('-dec_bin', type=str, default='./bin/IVAS_dec.exe',
+ help='Decoder binary (default ./bin/IVAS_dec.exe)')
+
+ args = parser.parse_args()
+ test_vec_dir = args.test_dir
+ processes = args.p
+ enc_bin = args.enc_bin
+ dec_bin = args.dec_bin
+
+ README_FILES = ['Readme_AMRWB_IO_dec.txt', 'Readme_AMRWB_IO_enc.txt', 'Readme_EVS_dec.txt',
+ 'Readme_EVS_enc.txt', 'Readme_JBM_dec.txt']
+
+ scripts = [os.path.join(test_vec_dir, script) for script in README_FILES]
+
+ if not environment_is_correct([f'{test_vec_dir}/testv'] + scripts + [enc_bin, dec_bin]):
+ sys.exit(1)
+
+ pool = Pool(processes)
+ results = []
+ id_count = 0
+
+ for script in scripts:
+ with open(script) as file:
+ tmp_dir = None
+ eval_cmd = None
+ diff_cmd = ''
+ for line in file:
+ if line.startswith('TMP='):
+ assert tmp_dir is None
+ tmp_dir = line.split('"')[1]
+ if os.path.exists(tmp_dir):
+ shutil.rmtree(tmp_dir)
+ os.makedirs(tmp_dir)
+ line = line if tmp_dir is None else line.replace(
+ '$TMP/', f'{tmp_dir}/')
+ if '$CUT_DEC_BIN' in line:
+ eval_cmd = dec_bin + ' -q ' + ' '.join(line.split()[1:])
+ if '$CUT_ENC_BIN' in line:
+ eval_cmd = enc_bin + ' -q ' + ' '.join(line.split()[1:])
+ if '$DIFF_BIN' in line:
+ if 'Readme_JBM_dec.txt' in script:
+ if '-w' not in line.split()[1]:
+ diff_cmd = 'FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n')
+ continue
+ diff_cmd += '; FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n').replace('-w', '/W')
+ else:
+ diff_cmd = 'FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n')
+ results.append(pool.apply_async(
+ run_condition, args=(eval_cmd, diff_cmd, id_count)))
+ id_count = id_count + 1
+ print('Total number of conditions for', '"' +
+ os.path.basename(script) + '": ' + str(id_count - 1))
+
+ results = [r.get() for r in results if r.get()]
+ if results:
+ print(f'\n{len(results)} test conditions failed:')
+ print('\n'.join(results))
+ with open('failed.txt', 'w') as f:
+ print(f'\n{len(results)} test conditions failed:', file=f)
+ print('\n'.join(results), file=f)
+ sys.exit(1)
+ else:
+ print('\n *** All tests passed! ***')
+ sys.exit(0)
diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py
index aa6f2636a44848c9505034aac8f2511961bfc66a..9886de42916bddbd7fea609c28b87978016742cd 100755
--- a/ci/run_scheduled_sanitizer_test.py
+++ b/ci/run_scheduled_sanitizer_test.py
@@ -63,8 +63,7 @@ def main(args):
assert all([t in SUPPORTED_TESTS for t in tests])
- modes = get_modes(in_format)
- returncode = run_check(modes, out_formats, tests, run_fec=run_fec)
+ returncode = run_check(in_format, out_formats, tests, run_fec=run_fec)
collect_for_sanitizer_test(CONSOLE_OUT_FILE)
@@ -92,7 +91,22 @@ def get_modes(in_format: str) -> list:
return mode_list
-def run_check(modes: list, out_formats: list, tests: list, run_fec: bool = True):
+def get_md_file_command(in_format: str) -> list:
+
+ cmd = list()
+ if in_format.startswith("ISM"):
+ cmd.append("--metadata_files")
+ md_filename = "/usr/local/ltv/ltvISM{}.csv"
+ n = int(in_format[-1])
+ cmd.extend([md_filename.format(i) for i in range(1, n + 1)])
+
+ return cmd
+
+
+def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = True):
+
+ modes = get_modes(in_format)
+ md_file_command = get_md_file_command(in_format)
### always run encoder and decoder with no frameloss
cmd_no_fec = [
@@ -107,6 +121,7 @@ def run_check(modes: list, out_formats: list, tests: list, run_fec: bool = True)
*modes,
"--oc",
*out_formats,
+ *md_file_command,
]
print(
diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh
index 2062ff5080ff142aefd158454b14ab349387f3c0..1e758b6263807a7e435581c54c2486e3d9b0008b 100755
--- a/ci/smoke_test.sh
+++ b/ci/smoke_test.sh
@@ -55,6 +55,7 @@ fi
cfg=./scripts/config/ci_linux.json
dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat
+ism_md_cmd="--metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv"
if [ $BUILD -eq 1 ];then
# Enable memory macros to find unbalanced memory allocations/deallocations
@@ -62,7 +63,7 @@ if [ $BUILD -eq 1 ];then
make clean
# Replace free -> free_, malloc -> malloc_, calloc -> calloc_
- ./scripts/prepare_mem_dryrun.py
+ python3 ./scripts/prepare_mem_dryrun.py
# Enable WMOPS and disable DEBUGGING
sed -i.bak -e "s/\/\*\s*\(#define\s*WMOPS\)\s*\*\//\1/g" lib_com/options.h
@@ -74,27 +75,40 @@ if [ $BUILD -eq 1 ];then
fi
# run all modes vanilla-fashion
-./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt
+# treat ISM modes separately because passing the metadata files to MASA modes causes crashes
+ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM)
+non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM)
+echo "\n======================= 1. non-ism modes no FEC =======================\n\n"
+./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt
+echo "\n======================= 2. ism modes no FEC =======================\n\n"
+./scripts/runIvasCodec.py -m $ism_modes -p $cfg -U 1 $WORKERS $ism_md_cmd | tee smoke_test_output.txt
# run the decoding again, but with 15% frame loss
+echo "\n======================= 3. all modes with FEC =======================\n\n"
./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt
# run JBM modes - EXT is excluded as not supported yet
modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v MASA | grep -v ISM)
+modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v ISM+)
+echo "\n======================= 4. JBM, modes with no EXT =======================\n\n"
./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt
-./scripts/runIvasCodec.py -C MASA ISM1 ISM2 ISM3 ISM4 -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt
+echo "\n======================= 5. JBM, modes with EXT =======================\n\n"
+./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt
# run all modes with binaural output using external files
modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4"
bin_out_modes="BINAURAL BINAURAL_ROOM"
+echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n"
wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_)
hrtf_wb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin"
./scripts/runIvasCodec.py -p $cfg -m $wb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt
+echo "\n======================= 7. binaural out with HRTF files - SWB =======================\n\n"
swb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _swb_)
hrtf_swb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin"
./scripts/runIvasCodec.py -p $cfg -m $swb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt
+echo "\n======================= 8. binaural out with HRTF files - FB =======================\n\n"
fb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _fb_)
hrtf_fb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin"
./scripts/runIvasCodec.py -p $cfg -m $fb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt
diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c
index 41acc25b48329646c859750c26c8ff86a9f049a4..56e523b39225dcfd923c9ef48b9fad9514ee7b8e 100644
--- a/lib_com/bits_alloc.c
+++ b/lib_com/bits_alloc.c
@@ -536,6 +536,7 @@ ivas_error config_acelp1(
const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */
const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */
const int16_t idchan, /* i : stereo channel ID */
+ const int16_t active_cnt, /* i : Active frame counter */
const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/
const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */
const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */
@@ -736,7 +737,7 @@ ivas_error config_acelp1(
}
else /* L_frame == L_FRAME16k */
{
- acelp_cfg->lsf_bits = 41; /* TBV: currently LSFQ @16kHz is not flexible (only 31/41 bits supported */
+ acelp_cfg->lsf_bits = 41;
}
}
@@ -753,12 +754,11 @@ ivas_error config_acelp1(
bits -= acelp_cfg->mid_lsf_bits;
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
- else if ( tdm_lp_reuse_flag == 1 && idchan == 1 )
+ else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 )
{
bits -= TDM_IC_LSF_PRED_BITS;
}
-#endif
+
/* gain Q bit-budget - part 1 */
if ( ( coder_type != UNVOICED && coder_type != AUDIO && coder_type != INACTIVE && !( core_brate <= ACELP_8k00 && coder_type != TRANSITION ) ) || ( coder_type == INACTIVE && total_brate > MAX_GSC_INACTIVE_BRATE ) )
{
@@ -1314,7 +1314,6 @@ ivas_error config_acelp1(
{
if ( idchan > 0 && element_mode == IVAS_CPE_TD )
{
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( !tdm_lp_reuse_flag )
{
acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */
@@ -1323,6 +1322,7 @@ ivas_error config_acelp1(
else
{
int16_t nb_prm = 4;
+
if ( tdm_low_rate_mode == 1 )
{
nb_prm = 2;
@@ -1343,33 +1343,6 @@ ivas_error config_acelp1(
bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits );
}
}
-#else
- int16_t nb_prm = 4;
-
- if ( tdm_low_rate_mode == 1 )
- {
- nb_prm = 2;
- }
-
- /* First add remaining bits on gains */
- if ( !( *uc_two_stage_flag ) )
- {
- bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode );
- }
-
- /* Then, Increase pitch bit budget */
- if ( tdm_Pitch_reuse_flag == 0 && bits > 0 )
- {
- bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits );
- }
-
- /* Increase mid-lsf bit budget */
- if ( tdm_lp_reuse_flag == 0 && bits > 0 )
- {
- bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits );
- bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits );
- }
-#endif
#ifdef DEBUGGING
if ( idchan > 0 && bits > 0 && ( coder_type > UNVOICED || tdm_low_rate_mode == 0 ) )
{
@@ -1387,7 +1360,7 @@ ivas_error config_acelp1(
acelp_cfg->ubits = acelp_cfg->lsf_bits - 46;
acelp_cfg->lsf_bits = 46;
}
- else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) /* TBV: verify maximum supported LSF Q bitbudget (for some reason 43 bits LSFQ decreases segSNR by 0.7 dB) */
+ else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME )
{
acelp_cfg->ubits = acelp_cfg->lsf_bits - 42;
acelp_cfg->lsf_bits = 42;
diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c
old mode 100644
new mode 100755
index e5f72590a60dc700b31ed3d3f6b089f9d6a333b9..c9571d41c16a95edb92e88f5e6b4b06825b8abf4
--- a/lib_com/bitstream.c
+++ b/lib_com/bitstream.c
@@ -62,6 +62,11 @@
FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */
#endif
+#ifdef IND_LIST_DYN
+#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */
+#endif
+
+#ifndef IND_LIST_DYN
/*-------------------------------------------------------------------*
* pack_bit()
*
@@ -113,106 +118,903 @@ static Word16 unpack_bit(
( *pt )++;
}
- return bit;
+ return bit;
+}
+#endif
+
+/*-------------------------------------------------------------------*
+ * rate2AMRWB_IOmode()
+ *
+ * lookup AMRWB IO mode
+ *-------------------------------------------------------------------*/
+
+static Word16 rate2AMRWB_IOmode(
+ Word32 brate /* i : bitrate */
+)
+{
+ switch ( brate )
+ {
+ /* EVS AMR-WB IO modes */
+ case SID_1k75:
+ return AMRWB_IO_SID;
+ case ACELP_6k60:
+ return AMRWB_IO_6600;
+ case ACELP_8k85:
+ return AMRWB_IO_8850;
+ case ACELP_12k65:
+ return AMRWB_IO_1265;
+ case ACELP_14k25:
+ return AMRWB_IO_1425;
+ case ACELP_15k85:
+ return AMRWB_IO_1585;
+ case ACELP_18k25:
+ return AMRWB_IO_1825;
+ case ACELP_19k85:
+ return AMRWB_IO_1985;
+ case ACELP_23k05:
+ return AMRWB_IO_2305;
+ case ACELP_23k85:
+ return AMRWB_IO_2385;
+ default:
+ break;
+ }
+
+ return -1;
+}
+
+/*-------------------------------------------------------------------*
+ * rate2EVSmode()
+ *
+ * lookup EVS mode
+ *-------------------------------------------------------------------*/
+Word16 rate2EVSmode(
+ const Word32 brate, /* i : bitrate */
+ int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */
+)
+{
+ if ( is_amr_wb != NULL )
+ {
+ *is_amr_wb = 0;
+ }
+
+ switch ( brate )
+ {
+ /* EVS Primary modes */
+ case FRAME_NO_DATA:
+ return NO_DATA_RECEIVED;
+ case SID_2k40:
+ return PRIMARY_SID;
+ case PPP_NELP_2k80:
+ return PRIMARY_2800;
+ case ACELP_7k20:
+ return PRIMARY_7200;
+ case ACELP_8k00:
+ return PRIMARY_8000;
+ case ACELP_9k60:
+ return PRIMARY_9600;
+ case ACELP_13k20:
+ return PRIMARY_13200;
+ case ACELP_16k40:
+ return PRIMARY_16400;
+ case ACELP_24k40:
+ return PRIMARY_24400;
+ case ACELP_32k:
+ return PRIMARY_32000;
+ case ACELP_48k:
+ return PRIMARY_48000;
+ case ACELP_64k:
+ return PRIMARY_64000;
+ case HQ_96k:
+ return PRIMARY_96000;
+ case HQ_128k:
+ return PRIMARY_128000;
+ default:
+ break;
+ }
+
+ if ( is_amr_wb != NULL )
+ {
+ *is_amr_wb = 1;
+ }
+
+ return rate2AMRWB_IOmode( brate );
+}
+
+#ifdef IND_LIST_DYN
+/*-------------------------------------------------------------------*
+ * ind_list_realloc()
+ *
+ * Re-allocate the list of indices
+ *-------------------------------------------------------------------*/
+
+ivas_error ind_list_realloc(
+ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
+ int16_t max_num_indices /* i : new maximum number of allowed indices in the list */
+)
+{
+ int16_t i, ind_list_pos;
+ INDICE_HANDLE new_ind_list;
+
+ /* allocate new buffer of indices */
+ if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) );
+ }
+
+ /* move indices from the old list to the new list */
+ for ( i = 0; i < min( max_num_indices, *( hBstr->ivas_max_num_indices ) ); i++ )
+ {
+ if ( ( *hBstr->ivas_ind_list_zero )[i].nb_bits > -1 )
+ {
+ new_ind_list[i].id = ( *hBstr->ivas_ind_list_zero )[i].id;
+ new_ind_list[i].value = ( *hBstr->ivas_ind_list_zero )[i].value;
+ }
+ new_ind_list[i].nb_bits = ( *hBstr->ivas_ind_list_zero )[i].nb_bits;
+ }
+
+ /* reset nb_bits of all other indices to -1 */
+ for ( ; i < max_num_indices; i++ )
+ {
+ new_ind_list[i].nb_bits = -1;
+ }
+
+ /* get the current position inside the old list */
+ ind_list_pos = (int16_t) ( hBstr->ind_list - ( *hBstr->ivas_ind_list_zero ) );
+
+ /* free the old list */
+ free( ( *hBstr->ivas_ind_list_zero ) );
+
+ /* set pointers in the new list */
+ hBstr->ind_list = &new_ind_list[ind_list_pos];
+ *( hBstr->ivas_ind_list_zero ) = new_ind_list;
+
+ /* set the new maximum number of indices */
+ *( hBstr->ivas_max_num_indices ) = max_num_indices;
+
+ return IVAS_ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------*
+ * get_ivas_max_num_indices()
+ *
+ * Get the maximum allowed number of indices in the encoder
+ *-----------------------------------------------------------------------*/
+
+int16_t get_ivas_max_num_indices( /* o : maximum number of indices */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
+)
+{
+ if ( ivas_format == STEREO_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 300;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 400;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 450;
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+ return 650;
+ }
+ else if ( ivas_total_brate <= IVAS_80k )
+ {
+ return 750;
+ }
+ else if ( ivas_total_brate <= IVAS_128k )
+ {
+ return 850;
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+ return 950;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+ return 1350;
+ }
+ else
+ {
+ return 1650;
+ }
+ }
+ else if ( ivas_format == ISM_FORMAT || ivas_format == MONO_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 250;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 350;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 450;
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+ return 550;
+ }
+ else if ( ivas_total_brate <= IVAS_64k )
+ {
+ return 620;
+ }
+ else if ( ivas_total_brate <= IVAS_80k )
+ {
+ return 670;
+ }
+ else if ( ivas_total_brate <= IVAS_96k )
+ {
+ return 780;
+ }
+ else if ( ivas_total_brate <= IVAS_128k )
+ {
+ return 880;
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+ return 950;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+ return 1100;
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+ return 1300;
+ }
+ else
+ {
+ return 1650;
+ }
+ }
+ else if ( ivas_format == SBA_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 250;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 350;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 400;
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+ return 650;
+ }
+ else if ( ivas_total_brate <= IVAS_80k )
+ {
+ return 750;
+ }
+ else if ( ivas_total_brate <= IVAS_128k )
+ {
+ return 1020;
+ }
+ else if ( ivas_total_brate <= IVAS_160k )
+ {
+ return 1160;
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+ return 1220;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+ return 1300;
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+ return 1720;
+ }
+ else
+ {
+ return 2000;
+ }
+ }
+ else if ( ivas_format == MASA_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 300;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 400;
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+ return 650;
+ }
+ else if ( ivas_total_brate <= IVAS_80k )
+ {
+ return 750;
+ }
+ else if ( ivas_total_brate <= IVAS_160k )
+ {
+ return 850;
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+ return 950;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+ return 1150;
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+ return 1450;
+ }
+ else
+ {
+ return 1650;
+ }
+ }
+ else if ( ivas_format == MC_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 250;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 350;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 400;
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+ return 650;
+ }
+ else if ( ivas_total_brate <= IVAS_64k )
+ {
+ return 750;
+ }
+ else if ( ivas_total_brate <= IVAS_80k )
+ {
+ return 850;
+ }
+ else if ( ivas_total_brate <= IVAS_128k )
+ {
+ return 1150;
+ }
+ else if ( ivas_total_brate <= IVAS_160k )
+ {
+ return 1420;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+ return 2120;
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+ return 2250;
+ }
+ else
+ {
+ return 2450;
+ }
+ }
+
+ return 2450;
+}
+
+/*-----------------------------------------------------------------------*
+ * get_core_max_num_indices()
+ *
+ * Get the maximum allowed number of indices in the core coder
+ *-----------------------------------------------------------------------*/
+
+int16_t get_core_max_num_indices( /* o : maximum number of indices */
+ const int16_t core, /* i : core */
+ const int32_t total_brate /* i : total bitrate */
+)
+{
+ /* set the maximum number of indices in the core coder */
+ if ( core == ACELP_CORE || core == AMR_WB_CORE )
+ {
+ if ( total_brate <= 9600 )
+ {
+ return 60;
+ }
+ else if ( total_brate <= IVAS_13k2 )
+ {
+ return 70;
+ }
+ else if ( total_brate <= IVAS_16k4 )
+ {
+ return 80;
+ }
+ else if ( total_brate <= IVAS_24k4 )
+ {
+ return 100;
+ }
+ else if ( total_brate <= IVAS_32k )
+ {
+ return 180;
+ }
+ else if ( total_brate <= IVAS_48k )
+ {
+ return 340;
+ }
+ else if ( total_brate <= IVAS_80k )
+ {
+ return 450;
+ }
+ else if ( total_brate <= IVAS_96k )
+ {
+ return 500;
+ }
+ else if ( total_brate <= IVAS_128k )
+ {
+ return 550;
+ }
+ else if ( total_brate <= IVAS_160k )
+ {
+ return 600;
+ }
+ else if ( total_brate <= IVAS_192k )
+ {
+ return 650;
+ }
+ else if ( total_brate <= IVAS_256k )
+ {
+ return 700;
+ }
+ else
+ {
+ return 800;
+ }
+ }
+ else if ( core == TCX_20_CORE || core == TCX_10_CORE )
+ {
+ if ( total_brate <= 9600 )
+ {
+ return 100;
+ }
+ else if ( total_brate <= IVAS_13k2 )
+ {
+ return 150;
+ }
+ else if ( total_brate <= IVAS_16k4 )
+ {
+ return 200;
+ }
+ else if ( total_brate <= IVAS_24k4 )
+ {
+ return 310;
+ }
+ else if ( total_brate <= IVAS_32k )
+ {
+ return 330;
+ }
+ else if ( total_brate <= IVAS_48k )
+ {
+ return 340;
+ }
+ else if ( total_brate <= IVAS_80k )
+ {
+ return 380;
+ }
+ else if ( total_brate <= IVAS_96k )
+ {
+ return 400;
+ }
+ else if ( total_brate <= IVAS_128k )
+ {
+ return 460;
+ }
+ else if ( total_brate <= IVAS_160k )
+ {
+ return 470;
+ }
+ else if ( total_brate <= IVAS_192k )
+ {
+ return 570;
+ }
+ else if ( total_brate <= IVAS_256k )
+ {
+ return 680;
+ }
+ else
+ {
+ return 800;
+ }
+ }
+ else if ( core == HQ_CORE )
+ {
+ if ( total_brate <= 9600 )
+ {
+ return 100;
+ }
+ else if ( total_brate <= IVAS_16k4 )
+ {
+ return 200;
+ }
+ else if ( total_brate <= IVAS_24k4 )
+ {
+ return 240;
+ }
+ else if ( total_brate <= IVAS_32k )
+ {
+ return 300;
+ }
+ else if ( total_brate <= IVAS_48k )
+ {
+ return 380;
+ }
+ else if ( total_brate <= IVAS_96k )
+ {
+ return 400;
+ }
+ else if ( total_brate <= IVAS_128k )
+ {
+ return 450;
+ }
+ else if ( total_brate <= IVAS_160k )
+ {
+ return 550;
+ }
+ else if ( total_brate <= IVAS_192k )
+ {
+ return 600;
+ }
+ else if ( total_brate <= IVAS_256k )
+ {
+ return 700;
+ }
+ else
+ {
+ return 800;
+ }
+ }
+ else
+ {
+ return 50;
+ }
+}
+
+/*-----------------------------------------------------------------------*
+ * get_BWE_max_num_indices()
+ *
+ * Get the maximum number of indices in the BWE
+ *-----------------------------------------------------------------------*/
+
+int16_t get_BWE_max_num_indices( /* o : maximum number of indices */
+ const int32_t extl_brate /* i : extensiona layer bitrate */
+)
+{
+ /* set the maximum number of indices in the BWE */
+ if ( extl_brate < SWB_BWE_16k )
+ {
+ return 30;
+ }
+ else
+ {
+ return 150;
+ }
+}
+
+
+/*-----------------------------------------------------------------------*
+ * get_ivas_max_num_indices_metadata()
+ *
+ * Set the maximum allowed number of metadata indices in the list
+ *-----------------------------------------------------------------------*/
+
+int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
+)
+{
+ /* set the maximum required number of metadata indices */
+ if ( ivas_format == MONO_FORMAT )
+ {
+ return 0;
+ }
+ else if ( ivas_format == STEREO_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 60;
+ }
+ else
+ {
+ return 80;
+ }
+ }
+ else if ( ivas_format == ISM_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 20;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 65;
+ }
+ else
+ {
+ return 80;
+ }
+ }
+ else if ( ivas_format == SBA_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 100;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 200;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+ return 300;
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+ return 500;
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+#ifdef FIX_483b
+ return 1050;
+#else
+ return 1000;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+#ifdef FIX_509
+ return 2000;
+#else
+ return 1500;
+#endif
+ }
+ else
+ {
+#ifdef FIX_509
+ return 2500;
+#else
+ return 2000;
+#endif
+ }
+ }
+ else if ( ivas_format == MASA_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_16k4 )
+ {
+ return 80;
+ }
+ else if ( ivas_total_brate <= IVAS_32k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 125;
+#else
+ return 110;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_48k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 205;
+#else
+ return 180;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_96k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 240;
+#else
+ return 200;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_128k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 305;
+#else
+ return 250;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_160k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 425;
+#else
+ return 320;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_192k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 630;
+#else
+ return 430;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_256k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 850;
+#else
+ return 600;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_384k )
+ {
+ return 1000;
+ }
+ else
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 1750;
+#else
+ return 1500;
+#endif
+ }
+ }
+ else if ( ivas_format == MC_FORMAT )
+ {
+ if ( ivas_total_brate <= IVAS_13k2 )
+ {
+ return 80;
+ }
+ else if ( ivas_total_brate <= IVAS_24k4 )
+ {
+ return 100;
+ }
+ else if ( ivas_total_brate <= IVAS_64k )
+ {
+#ifdef FIX_502_IND_LIST_SIZE
+ return 210;
+#else
+ return 200;
+#endif
+ }
+ else if ( ivas_total_brate <= IVAS_96k )
+ {
+ return 220;
+ }
+ else
+ {
+ return 300;
+ }
+ }
+
+ return 50;
}
/*-------------------------------------------------------------------*
- * rate2AMRWB_IOmode()
+ * move_indices()
*
- * lookup AMRWB IO mode
+ * Move indices inside the buffer or among two buffers
*-------------------------------------------------------------------*/
-static Word16 rate2AMRWB_IOmode(
- Word32 brate /* i : bitrate */
+ivas_error move_indices(
+ INDICE_HANDLE old_ind_list, /* i/o: old location of indices */
+ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */
+ const int16_t nb_indices /* i : number of moved indices */
)
{
- switch ( brate )
+ int16_t i;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ if ( new_ind_list < old_ind_list )
{
- /* EVS AMR-WB IO modes */
- case SID_1k75:
- return AMRWB_IO_SID;
- case ACELP_6k60:
- return AMRWB_IO_6600;
- case ACELP_8k85:
- return AMRWB_IO_8850;
- case ACELP_12k65:
- return AMRWB_IO_1265;
- case ACELP_14k25:
- return AMRWB_IO_1425;
- case ACELP_15k85:
- return AMRWB_IO_1585;
- case ACELP_18k25:
- return AMRWB_IO_1825;
- case ACELP_19k85:
- return AMRWB_IO_1985;
- case ACELP_23k05:
- return AMRWB_IO_2305;
- case ACELP_23k85:
- return AMRWB_IO_2385;
- default:
- break;
+ for ( i = 0; i < nb_indices; i++ )
+ {
+ new_ind_list[i].id = old_ind_list[i].id;
+ new_ind_list[i].value = old_ind_list[i].value;
+ new_ind_list[i].nb_bits = old_ind_list[i].nb_bits;
+
+ old_ind_list[i].nb_bits = -1;
+ }
}
+ else if ( new_ind_list > old_ind_list )
+ {
+ for ( i = nb_indices - 1; i >= 0; i-- )
+ {
+ new_ind_list[i].id = old_ind_list[i].id;
+ new_ind_list[i].value = old_ind_list[i].value;
+ new_ind_list[i].nb_bits = old_ind_list[i].nb_bits;
- return -1;
+ old_ind_list[i].nb_bits = -1;
+ }
+ }
+
+ return error;
}
+#endif
+
+#ifdef IND_LIST_DYN
/*-------------------------------------------------------------------*
- * rate2EVSmode()
+ * check_ind_list_limits()
*
- * lookup EVS mode
+ * Check, if the maximum number of indices has been reached -> reallocate
+ * Check, if we will not overwrite an existing indice -> adjust the location
*-------------------------------------------------------------------*/
-Word16 rate2EVSmode(
- const Word32 brate, /* i : bitrate */
- int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */
+
+ivas_error check_ind_list_limits(
+ BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */
)
{
- if ( is_amr_wb != NULL )
- {
- *is_amr_wb = 0;
- }
+ Indice *ivas_ind_list_zero, *ivas_ind_list_last;
+ ivas_error error;
- switch ( brate )
+ error = IVAS_ERR_OK;
+ ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero );
+
+ /* check, if the maximum number of indices has been reached and re-allocate the buffer */
+ /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */
+ if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) )
{
- /* EVS Primary modes */
- case FRAME_NO_DATA:
- return NO_DATA_RECEIVED;
- case SID_2k40:
- return PRIMARY_SID;
- case PPP_NELP_2k80:
- return PRIMARY_2800;
- case ACELP_7k20:
- return PRIMARY_7200;
- case ACELP_8k00:
- return PRIMARY_8000;
- case ACELP_9k60:
- return PRIMARY_9600;
- case ACELP_13k20:
- return PRIMARY_13200;
- case ACELP_16k40:
- return PRIMARY_16400;
- case ACELP_24k40:
- return PRIMARY_24400;
- case ACELP_32k:
- return PRIMARY_32000;
- case ACELP_48k:
- return PRIMARY_48000;
- case ACELP_64k:
- return PRIMARY_64000;
- case HQ_96k:
- return PRIMARY_96000;
- case HQ_128k:
- return PRIMARY_128000;
- default:
- break;
+#ifdef DEBUGGING
+ /* TODO: replace with the warning message below before the finalization of the IVAS codec */
+ /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */
+ assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." );
+#endif
+
+ /* reallocate the buffer of indices with increased limit */
+ ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES );
}
- if ( is_amr_wb != NULL )
+ /* check, if we will not overwrite an existing indice */
+ if ( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 )
{
- *is_amr_wb = 1;
+ if ( hBstr->nb_ind_tot == 0 )
+ {
+#ifdef DEBUGGING
+ fprintf( stderr, "Warning: Trying to overwrite an existing indice ID = %d in frame %d!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, frame );
+#endif
+ /* move the pointer to the next available empty slot */
+ ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )];
+ while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last )
+ {
+ hBstr->ind_list++;
+ }
+
+ if ( hBstr->ind_list >= ivas_ind_list_last )
+ {
+#ifdef DEBUGGING
+ /* TODO: replace with the warning message below before the finalization of the IVAS codec */
+ /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */
+ assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." );
+#endif
+
+ /* no available empty slot -> need to re-allocate the buffer */
+ ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES );
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits );
+ }
}
- return rate2AMRWB_IOmode( brate );
+ return error;
}
+#endif
+
/*-------------------------------------------------------------------*
* push_indice()
@@ -237,6 +1039,9 @@ ivas_error push_indice(
)
{
int16_t i;
+#ifdef IND_LIST_DYN
+ int16_t j;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -250,6 +1055,7 @@ ivas_error push_indice(
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d exceeds the range of %d bits (frame %d) !\n", id, value, nb_bits, frame );
}
+#ifndef IND_LIST_DYN
#if 0
/* mul, 2020-11-19: to be de-activated until proper solution found */
if ( nb_bits < 1 )
@@ -257,18 +1063,45 @@ ivas_error push_indice(
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, " Trying to push indice ID = %d with value %d that has %d bits (frame %d) !\n", id, value, nb_bits, frame );
}
else
+#endif
#endif
if ( nb_bits > 16 )
{
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to allocate %d bits which exceeds 16 bits (frame %d) !\n", id, value, nb_bits, frame );
}
+#ifndef IND_LIST_DYN
if ( id >= MAX_NUM_INDICES )
{
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame );
}
#endif
+#endif
+
+#ifdef IND_LIST_DYN
+ /* check the limits of the list of indices */
+ error = check_ind_list_limits( hBstr );
+#endif
+#ifdef IND_LIST_DYN
+ /* find the location in the list of indices based on ID */
+ i = hBstr->nb_ind_tot;
+ while ( i > 0 && id < hBstr->ind_list[i - 1].id )
+ {
+ i--;
+ }
+
+ /* shift indices, if the new ID is to be written somewhere inside the list */
+ if ( i < hBstr->nb_ind_tot )
+ {
+ for ( j = hBstr->nb_ind_tot; j > i; j-- )
+ {
+ hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id;
+ hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits;
+ hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value;
+ }
+ }
+#else
if ( hBstr->last_ind == id )
{
/* indice with the same name as the previous one */
@@ -283,21 +1116,31 @@ ivas_error push_indice(
i++;
}
}
+#endif
+#ifndef IND_LIST_DYN
#ifdef DEBUGGING
if ( hBstr->ind_list[i].nb_bits > 0 )
{
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to re-write an existing indice (frame %d) !\n", id, value, frame );
}
+#endif
#endif
/* store the new indice in the list */
+#ifdef IND_LIST_DYN
+ hBstr->ind_list[i].id = id;
+#endif
hBstr->ind_list[i].value = value;
hBstr->ind_list[i].nb_bits = nb_bits;
/* updates */
+#ifdef IND_LIST_DYN
+ hBstr->nb_ind_tot++;
+#else
hBstr->next_ind = i + 1;
hBstr->last_ind = id;
+#endif
hBstr->nb_bits_tot += nb_bits;
return error;
@@ -324,6 +1167,9 @@ ivas_error push_next_indice(
#endif
)
{
+#ifdef IND_LIST_DYN
+ int16_t prev_id;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -342,6 +1188,7 @@ ivas_error push_next_indice(
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to allocate %d bits which exceeds 16 bits !\n", value, nb_bits );
}
+#ifndef IND_LIST_DYN
if ( hBstr->next_ind >= MAX_NUM_INDICES )
{
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES );
@@ -352,16 +1199,43 @@ ivas_error push_next_indice(
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame );
}
#endif
+#endif
+
+#ifdef IND_LIST_DYN
+ /* check the limits of the list of indices */
+ error = check_ind_list_limits( hBstr );
+#endif
+
+#ifdef IND_LIST_DYN
+ /* get the id of the previous indice -> it will be re-used */
+ if ( hBstr->nb_ind_tot > 0 )
+ {
+ prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id;
+ }
+ else
+ {
+ prev_id = 0;
+ }
+#endif
/* store the values in the list */
+#ifdef IND_LIST_DYN
+ hBstr->ind_list[hBstr->nb_ind_tot].id = prev_id;
+ hBstr->ind_list[hBstr->nb_ind_tot].value = value;
+ hBstr->ind_list[hBstr->nb_ind_tot].nb_bits = nb_bits;
+#else
hBstr->ind_list[hBstr->next_ind].value = value;
hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits;
- hBstr->next_ind++;
+#endif
- /* update the total number of bits already written */
+ /* updates */
+#ifdef IND_LIST_DYN
+ hBstr->nb_ind_tot++;
+#else
+ hBstr->next_ind++;
+#endif
hBstr->nb_bits_tot += nb_bits;
-
return error;
}
@@ -389,39 +1263,161 @@ void push_next_bits(
uint16_t code;
int16_t i, nb_bits_m15;
Indice *ptr;
+#ifdef IND_LIST_DYN
+ int16_t prev_id;
+#endif
#ifdef DEBUG_BS_READ_WRITE
printf( "%s: %d: %d\n", func, line, nb_bits );
#endif
+
+#ifdef IND_LIST_DYN
+ ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
+
+ /* get the id of the previous indice -> will be re-used */
+ if ( hBstr->nb_ind_tot > 0 )
+ {
+ prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id;
+ }
+ else
+ {
+ prev_id = 0;
+ }
+#else
ptr = &hBstr->ind_list[hBstr->next_ind];
+#endif
nb_bits_m15 = nb_bits - 15;
for ( i = 0; i < nb_bits_m15; i += 16 )
{
code = (uint16_t) ( ( bits[i] << 15 ) | ( ( bits[i + 1] << 14 ) | ( ( bits[i + 2] << 13 ) | ( ( bits[i + 3] << 12 ) | ( ( bits[i + 4] << 11 ) | ( ( bits[i + 5] << 10 ) | ( ( bits[i + 6] << 9 ) | ( ( bits[i + 7] << 8 ) | ( ( bits[i + 8] << 7 ) | ( ( bits[i + 9] << 6 ) | ( ( bits[i + 10] << 5 ) | ( ( bits[i + 11] << 4 ) | ( ( bits[i + 12] << 3 ) | ( ( bits[i + 13] << 2 ) | ( ( bits[i + 14] << 1 ) | bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) );
+#ifdef IND_LIST_DYN
+ /* check the limits of the list of indices */
+ check_ind_list_limits( hBstr );
+ ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
+#endif
+
ptr->value = code;
#ifdef DEBUG_BS_READ_WRITE
printf( "code: %d\n", code );
#endif
ptr->nb_bits = 16;
+#ifdef IND_LIST_DYN
+ ptr->id = prev_id;
+ hBstr->nb_ind_tot++;
+#endif
++ptr;
}
+
for ( ; i < nb_bits; ++i )
{
+#ifdef IND_LIST_DYN
+ /* check the limits of the list of indices */
+ check_ind_list_limits( hBstr );
+ ptr = &hBstr->ind_list[hBstr->nb_ind_tot];
+#endif
+
ptr->value = bits[i];
#ifdef DEBUG_BS_READ_WRITE
printf( "value: %d\n", ptr->value );
#endif
ptr->nb_bits = 1;
+#ifdef IND_LIST_DYN
+ ptr->id = prev_id;
+ hBstr->nb_ind_tot++;
+#endif
++ptr;
}
+
+#ifndef IND_LIST_DYN
hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list );
+#endif
hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits;
return;
}
+#ifdef IND_LIST_DYN
+/*-------------------------------------------------------------------*
+ * find_indice()
+ *
+ * Find indice based on its id
+ *-------------------------------------------------------------------*/
+
+/*! r: result: index of the indice in the list, -1 if not found */
+int16_t find_indice(
+ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */
+ int16_t id, /* i : ID of the indice */
+ uint16_t *value, /* o : value of the quantized indice */
+ int16_t *nb_bits /* o : number of bits used to quantize the indice */
+)
+{
+ int16_t i;
+
+ for ( i = 0; i < hBstr->nb_ind_tot; i++ )
+ {
+ if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 )
+ {
+ *value = hBstr->ind_list[i].value;
+ *nb_bits = hBstr->ind_list[i].nb_bits;
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+/*-------------------------------------------------------------------*
+ * delete_indice()
+ *
+ * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated)
+ *-------------------------------------------------------------------*/
+
+/*! r: number of deleted indices */
+uint16_t delete_indice(
+ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */
+ int16_t id /* i : ID of the indice */
+)
+{
+ int16_t i, j;
+
+ j = 0;
+ for ( i = 0; i < hBstr->nb_ind_tot; i++ )
+ {
+ if ( hBstr->ind_list[i].id == id )
+ {
+ hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits;
+ continue;
+ }
+
+ if ( j < i )
+ {
+ /* shift the indice left */
+ hBstr->ind_list[j].id = hBstr->ind_list[i].id;
+ hBstr->ind_list[j].value = hBstr->ind_list[i].value;
+ hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits;
+ }
+
+ j++;
+ }
+
+ hBstr->nb_ind_tot = j;
+#ifndef IND_LIST_DYN
+ hBstr->next_ind = j;
+#endif
+
+ for ( ; j < i; j++ )
+ {
+ /* reset the shifted indices at the end of the list */
+ hBstr->ind_list[j].nb_bits = -1;
+ }
+
+ return i - j;
+}
+#endif
+
+
/*-------------------------------------------------------------------*
* get_next_indice()
*
@@ -638,8 +1634,12 @@ void reset_indices_enc(
int16_t i;
hBstr->nb_bits_tot = 0;
+#ifdef IND_LIST_DYN
+ hBstr->nb_ind_tot = 0;
+#else
hBstr->next_ind = 0;
hBstr->last_ind = -1;
+#endif
for ( i = 0; i < max_num_indices; i++ )
{
@@ -670,7 +1670,11 @@ void reset_indices_dec(
*-------------------------------------------------------------------*/
static int16_t write_indices_to_stream(
+#ifdef IND_LIST_DYN
+ Indice *ind_list,
+#else
Indice *ind_list_metadata,
+#endif
uint16_t **pt_stream,
const int16_t inc,
const int16_t num_indices )
@@ -684,8 +1688,13 @@ static int16_t write_indices_to_stream(
for ( i = 0; i < num_indices; i++ )
{
+#ifdef IND_LIST_DYN
+ value = ind_list[i].value;
+ nb_bits = ind_list[i].nb_bits;
+#else
value = ind_list_metadata[i].value;
nb_bits = ind_list_metadata[i].nb_bits;
+#endif
if ( nb_bits > 0 )
{
@@ -717,6 +1726,10 @@ static int16_t write_indices_to_stream(
{
/* fprintf( stderr, "Warning: %s: nb_bits == 0!\n", __func__ ); */
}
+ else
+ {
+ /* fprintf( stderr, "Warning: %s: nb_bits == %d!\n", __func__, nb_bits ); */
+ }
#endif
}
#ifdef ENABLE_BITRATE_VERIFICATION
@@ -745,6 +1758,10 @@ static ivas_error write_indices_element(
uint16_t *pt_stream_backup;
uint16_t *pt_stream_end;
int16_t nb_bits_tot_metadata;
+#ifdef IND_LIST_DYN
+ int16_t nb_ind_tot_metadata;
+#endif
+
Indice *ind_list_metadata;
int16_t n, n_channels;
#ifdef ENABLE_BITRATE_VERIFICATION
@@ -755,6 +1772,9 @@ static ivas_error write_indices_element(
error = IVAS_ERR_OK;
ind_list_metadata = NULL;
+#ifdef IND_LIST_DYN
+ nb_ind_tot_metadata = 0;
+#endif
if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT )
{
@@ -772,6 +1792,9 @@ static ivas_error write_indices_element(
{
nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot;
ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list;
+#ifdef IND_LIST_DYN
+ nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot;
+#endif
}
}
else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL )
@@ -782,6 +1805,9 @@ static ivas_error write_indices_element(
{
nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot;
ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list;
+#ifdef IND_LIST_DYN
+ nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot;
+#endif
}
}
#ifdef DEBUGGING
@@ -822,7 +1848,13 @@ static ivas_error write_indices_element(
#ifdef ENABLE_BITRATE_VERIFICATION
total_nb_bits =
#endif
- write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, MAX_BITS_METADATA );
+ write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1,
+#ifdef IND_LIST_DYN
+ nb_ind_tot_metadata
+#else
+ MAX_BITS_METADATA
+#endif
+ );
#ifdef ENABLE_BITRATE_VERIFICATION
if ( total_nb_bits != nb_bits_tot_metadata )
@@ -833,16 +1865,16 @@ static ivas_error write_indices_element(
/* restore previous pointer position */
pt_stream_loc = pt_stream_backup;
}
-
- /* TODO implemented only for MCT for now */
- if ( ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && ( element_id * CPE_CHANNELS + n == LFE_CHANNEL ) )
- {
- continue;
- }
#ifdef ENABLE_BITRATE_VERIFICATION
total_nb_bits =
#endif
- write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, MAX_NUM_INDICES );
+ write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1,
+#ifdef IND_LIST_DYN
+ sts[n]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
#ifdef ENABLE_BITRATE_VERIFICATION
if ( total_nb_bits != sts[n]->hBstr->nb_bits_tot )
@@ -865,21 +1897,41 @@ static ivas_error write_indices_element(
{
if ( st_ivas->hSCE[element_id]->hMetaData != NULL )
{
+#ifdef IND_LIST_DYN
+ reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot );
+#else
reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
- reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( sts[0]->hBstr,
+#ifdef IND_LIST_DYN
+ sts[0]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
else
{
if ( st_ivas->hCPE[element_id]->hMetaData != NULL )
{
+#ifdef IND_LIST_DYN
+ reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot );
+#else
reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
for ( n = 0; n < n_channels; n++ )
{
- reset_indices_enc( sts[n]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( sts[n]->hBstr,
+#ifdef IND_LIST_DYN
+ sts[n]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
}
@@ -926,6 +1978,7 @@ ivas_error write_indices_ivas(
{
sts = st_ivas->hSCE[n]->hCoreCoder;
i += sts[0]->hBstr->nb_bits_tot;
+
if ( st_ivas->hSCE[n]->hMetaData != NULL )
{
i += st_ivas->hSCE[n]->hMetaData->nb_bits_tot;
@@ -939,6 +1992,7 @@ ivas_error write_indices_ivas(
{
i += sts[ch]->hBstr->nb_bits_tot;
}
+
if ( st_ivas->hCPE[n]->hMetaData != NULL )
{
i += st_ivas->hCPE[n]->hMetaData->nb_bits_tot;
@@ -956,6 +2010,7 @@ ivas_error write_indices_ivas(
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Bitstream write size mismatch! Actual bitrate: %ld vs. Reference bitrate: %d\n", i * 50L, ivas_total_brate );
}
#endif
+
/*-----------------------------------------------------------------*
* Encode Payload
*-----------------------------------------------------------------*/
@@ -975,7 +2030,7 @@ ivas_error write_indices_ivas(
return error;
}
-
+#ifndef IND_LIST_DYN
/*-------------------------------------------------------------------*
* indices_to_serial_generic()
*
@@ -1025,6 +2080,7 @@ void indices_to_serial_generic(
return;
}
+#endif
/*---------------------------------------------------------------------*
* convertSerialToBytestream( )
@@ -1807,7 +2863,9 @@ ivas_error preview_indices(
if ( bit_stream[2] == 0 )
{
st_ivas->ivas_format = SBA_FORMAT;
- st_ivas->sba_mode = ivas_sba_mode_select( total_brate );
+#ifndef SBA_MODE_CLEAN_UP
+ st_ivas->sba_mode = ivas_sba_mode_select();
+#endif
}
else
{
@@ -1845,9 +2903,6 @@ ivas_error preview_indices(
break;
case SID_ISM:
st_ivas->ivas_format = ISM_FORMAT;
- /* temporary hack to make mode signaling work with the current 1-object ISM DTX: read padding bits */
- /* Todo: how to apply this here? maybe pt_stream += ... would work? */
- /* st->bit_stream += ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; */
break;
case SID_MULTICHANNEL:
st_ivas->ivas_format = MC_FORMAT;
@@ -1920,7 +2975,7 @@ ivas_error preview_indices(
k = IVAS_FORMAT_SIGNALING_NBITS;
if ( st_ivas->ivas_format == MASA_FORMAT )
{
- k = IVAS_FORMAT_SIGNALING_NBITS_SBA;
+ k = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED;
}
if ( total_brate < MIN_BRATE_MDCT_STEREO )
@@ -1960,9 +3015,9 @@ ivas_error preview_indices(
else if ( st_ivas->ivas_format == SBA_FORMAT )
{
/* Read SBA planar flag and SBA order */
- st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA] == 1 );
- st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 2] == 1 );
- st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 1] == 1 );
+ st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED] == 1 );
+ st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 2] == 1 );
+ st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 1] == 1 );
st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( total_brate, st_ivas->sba_order );
@@ -2012,7 +3067,7 @@ ivas_error read_indices(
file_read_FECpattern( &st_ivas->bfi );
st_ivas->bfi |= bfi;
- if ( bfi == FRAMEMODE_MISSING ) /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */
+ if ( bfi == FRAMEMODE_MISSING )
{
for ( k = 0; k < num_bits; k++ )
{
@@ -2112,12 +3167,12 @@ ivas_error read_indices(
}
/* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft,
- it declares every bad synch marked frame initially as a lost_speech frame,
- and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH.
- While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD.
+ it declares every bad synch marked frame initially as a lost_speech frame,
+ and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH.
+ While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD.
- Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR .
- */
+ Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR .
+ */
if ( sid_upd_bad )
{
sid_upd_bad = 0;
@@ -2129,10 +3184,10 @@ ivas_error read_indices(
{
g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */
/* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where:
- the very first SID_FIRST detection is based on a past EVS active frame
- and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO,
- due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding
- */
+ the very first SID_FIRST detection is based on a past EVS active frame
+ and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO,
+ due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding
+ */
}
speech_bad = 0;
@@ -2148,7 +3203,7 @@ ivas_error read_indices(
}
/* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame
- as this frame was never transmitted, one can not know it is good and has a a length of zero ) */
+ as this frame was never transmitted, one can not know it is good and has a a length of zero ) */
if ( *CNG != 0 )
{
/* We were in CNG synthesis */
@@ -2178,7 +3233,7 @@ ivas_error read_indices(
/* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */
if ( (
- bfi != FRAMEMODE_FUTURE && /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */
+ bfi != FRAMEMODE_FUTURE &&
( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */
( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */
{
@@ -2222,8 +3277,7 @@ ivas_error read_indices(
}
/* GOOD frame */
- if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */
- )
+ if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE )
{
/* GOOD frame - convert ITU-T G.192 words to short values */
st_ivas->hDecoderConfig->ivas_total_brate = total_brate;
@@ -2346,7 +3400,7 @@ static Word32 read_indices_mime_handle_dtx(
/* Now modify bfi flag for the decoder's SPEECH/CNG synthesis logic */
/* in SPEECH synthesis, make sure to activate speech PLC for a received NO_DATA frame,
- no_data frames may be injected by the network or by the dejitter buffer */
+ no_data frames may be injected by the network or by the dejitter buffer */
/* modify bfi_flag to stay/move into the correct decoder PLC section */
if ( ( *CNG == 0 ) && ( no_data != 0 ) )
{
@@ -2366,10 +3420,10 @@ static Word32 read_indices_mime_handle_dtx(
/* now bfi, total_brate are set by RX-DTX handler::
- bfi==0, total_brate!=0 CNG or speech pending bitrate
- bfi==0, total_brate==0 CNG will continue or start(sid_first, sid_bad)
- bfi==1, total_brate!=0 speech PLC
- bfi==1, total_brate==0 , speech PLC */
+ bfi==0, total_brate!=0 CNG or speech pending bitrate
+ bfi==0, total_brate==0 CNG will continue or start(sid_first, sid_bad)
+ bfi==1, total_brate!=0 speech PLC
+ bfi==1, total_brate==0 , speech PLC */
/* handle available AMRWB/AMRWBIO MIME header ToC rate-info at startup */
if ( ( st->bfi == 1 && st->ini_frame == 0 ) && ( ( amrwb_rfc4867_flag != 0 ) || ( amrwb_rfc4867_flag == 0 && isAMRWB_IOmode != 0 ) ) ) /*AMRWB ToC */
diff --git a/lib_com/cnst.h b/lib_com/cnst.h
index db1dc3d8982a768eff807f35d083dbabeae15f58..a35f5280c228de623d417afd7d4b602f10a01077 100644
--- a/lib_com/cnst.h
+++ b/lib_com/cnst.h
@@ -294,9 +294,7 @@ enum
IND_ISF_1_2,
IND_ISF_1_3,
IND_ISF_1_4,
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
IND_IC_LSF_PRED,
-#endif
IND_GSC_ATTACK,
IND_GSC_SWB_SPEECH,
IND_NOISE_LEVEL,
@@ -449,7 +447,9 @@ enum
IND_STEREO_2ND_CODER_T,
IND_UNUSED,
+#ifndef IND_LIST_DYN
MAX_NUM_INDICES = IND_UNUSED + 772 /* Total 2640 in line with MAX_BITS_METADATA */
+#endif
};
/*----------------------------------------------------------------------------------*
@@ -1391,6 +1391,23 @@ enum
#define NPARTCLDFB 10
#define NPART_SHAPING 62
+#define FDCNG_VQ_MAX_LEN FD_CNG_maxN_37bits
+#define FDCNG_VQ_DCT_NSEGM 4
+#define FDCNG_VQ_DCT_MINTRUNC 8
+#define FDCNG_VQ_DCT_MAXTRUNC 18
+#define FDCNG_VQ_MAX_LEN_WB 21
+
+#define FDCNG_VQ_DCT_NPOST 8
+
+typedef enum _DCTTYPE
+{
+ DCT_T2_24_XX = 0, /* truncated DCT_T2_24 */
+ IDCT_T2_XX_24 = 1,
+ DCT_T2_21_XX = 2, /* truncated DCT_T2_21 */
+ IDCT_T2_XX_21 = 3
+} DCTTYPE;
+
+
#define MSSUBFRLEN 12
#define MSNUMSUBFR 6
#define MSBUFLEN 5
@@ -1415,7 +1432,8 @@ enum
#define CHEAP_NORM_SIZE 161
#define CNA_MAX_BRATE ACELP_13k20
-#define MAX_CNA_NBANDS 12
+
+#define CNA_INIT_NBANDS 6
#define GAIN_Q_OFFSET_EVS 60.f
#define GAIN_Q_OFFSET_IVAS 45.f
@@ -1513,7 +1531,8 @@ enum
#define TOD_NSPEC 80 /* number of spectral bins of the tonal detector */
#define TOD_THR_MASS 0.86f /* initial value for the adaptive threshold of the tonal detector */
#define P2A_FACT 0.9f /* long-term averaging factor for peak-to-average ratio */
-#define THR_P2A 80.0f /* threshold to detect strongly peaky signals */
+#define THR_P2A_HIGH 95.0f /* higher threshold to detect strongly peaky signals at low bitrates*/
+#define THR_P2A 80.0f /* lower threshold to detect strongly peaky signals at higher bitrates */
/*----------------------------------------------------------------------------------*
* LD music post-filter constants
@@ -2119,7 +2138,7 @@ enum
#define IGF_GRID_LB_SHORT 2
/* constants for IGFSCFDecoder and IGFSCFEncoder */
-#define IGF_CTX_OFFSET 3 /* offset added to make the context values nonnegative, for array indexing */
+#define IGF_CTX_OFFSET 3 /* offset added to make the context values non negative, for array indexing */
#define IGF_CTX_COUNT ( 2 * IGF_CTX_OFFSET + 1 ) /* number of contexts for the AC statistical model */
#define IGF_MIN_ENC_SEPARATE -12 /* minimum residual value coded separately, without escape coding */
#define IGF_MAX_ENC_SEPARATE +12 /* maximum residual value coded separately, without escape coding */
@@ -2221,5 +2240,13 @@ enum
VOIP_RTPDUMP
};
+#ifdef FIX_489_COV_SMOOTHING
+typedef enum _COV_SMOOTHING_TYPE
+{
+ COV_SMOOTH_SPAR,
+ COV_SMOOTH_MC
+} COV_SMOOTHING_TYPE;
+#endif
+
/* clang-format on */
#endif /* CNST_H */
diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h
index 0ca4d6b461ac97f9a0f0c7cf2009d9628270b934..33ddc9e881d865970af564c2b21c974af44c6844 100644
--- a/lib_com/common_api_types.h
+++ b/lib_com/common_api_types.h
@@ -78,10 +78,9 @@ typedef struct _IVAS_ISM_METADATA
float radius;
float spread;
float gainFactor;
-#ifdef TD5
float yaw;
float pitch;
-#endif
+ int16_t non_diegetic_flag;
} IVAS_ISM_METADATA;
typedef struct
@@ -90,27 +89,24 @@ typedef struct
} IVAS_QUATERNION;
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
typedef struct
{
float x, y, z;
} IVAS_VECTOR3;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#ifdef TD5
-typedef struct
+#ifdef FIX_439_OTR_PARAMS
+typedef enum
{
- float x, y, z;
-
-} IVAS_POSITION;
+ HEAD_ORIENT_TRK_NONE,
+ HEAD_ORIENT_TRK_REF,
+ HEAD_ORIENT_TRK_AVG,
+ HEAD_ORIENT_TRK_REF_VEC,
+ HEAD_ORIENT_TRK_REF_VEC_LEV
+} HEAD_ORIENT_TRK_T;
#endif
typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE;
-#ifdef FIX_350_MASA_DELAY_COMP
typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE;
-#else
-typedef struct ivas_masa_qmetadata_frame_struct *IVAS_MASA_QMETADATA_HANDLE;
-#endif
typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE;
typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE;
@@ -130,11 +126,10 @@ typedef struct
{
float azimuth;
float elevation;
-#ifdef TD5
float radius;
float yaw;
float pitch;
-#endif
+ int16_t non_diegetic_flag;
} IVAS_REND_AudioObjectPosition;
typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG
@@ -156,9 +151,7 @@ typedef struct _IVAS_RENDER_CONFIG
IVAS_RENDER_TYPE_OVERRIDE renderer_type_override;
#endif
IVAS_ROOM_ACOUSTICS_CONFIG_DATA room_acoustics;
-#ifdef TD5
float directivity[3];
-#endif
} IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE;
typedef struct _IVAS_LS_CUSTOM_LAYOUT
diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c
index 120d0876d1f32569cf4bd8afe3b5089af9924789..7f9b385c3f3d38c569307a13f15032c0dcb62582 100644
--- a/lib_com/core_com_config.c
+++ b/lib_com/core_com_config.c
@@ -247,28 +247,24 @@ int16_t getResq(
*-------------------------------------------------------------------*/
int16_t getTnsAllowed(
- const int32_t total_brate, /* i : total bitrate */
- const int16_t igf, /* i : flag indicating IGF activity*/
- const int16_t element_mode, /* i : IVAS element mode */
- const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */
+ const int32_t total_brate, /* i : total bitrate */
+ const int16_t igf, /* i : flag indicating IGF activity*/
+ const int16_t element_mode /* i : IVAS element mode */
)
{
int16_t tnsAllowed = 0;
- if ( mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( igf )
{
- if ( igf )
- {
- if ( total_brate > HQ_16k40 || ( ( total_brate > HQ_13k20 ) && element_mode == IVAS_CPE_DFT ) )
- {
- tnsAllowed = 1;
- }
- }
- else if ( total_brate > HQ_32k )
+ if ( total_brate > HQ_16k40 || ( ( total_brate > HQ_13k20 ) && element_mode == IVAS_CPE_DFT ) )
{
tnsAllowed = 1;
}
}
+ else if ( total_brate > HQ_32k )
+ {
+ tnsAllowed = 1;
+ }
return tnsAllowed;
}
@@ -411,16 +407,11 @@ int16_t getIgfPresent(
const int16_t element_mode, /* i : IVAS element mode */
const int32_t total_brate, /* i : total bitrate */
const int16_t bwidth, /* i : audio bandwidth */
- const int16_t rf_mode, /* i : flag to signal the RF mode */
- const int16_t mct_chan_mode /* i : MCT channel mode */
+ const int16_t rf_mode /* i : flag to signal the RF mode */
)
{
int16_t igfPresent = 0;
- if ( mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- return igfPresent;
- }
if ( bwidth == SWB )
{
@@ -808,9 +799,7 @@ void init_tcx_cfg(
const int16_t infoIGFStopFreq,
const int16_t element_mode,
const int16_t ini_frame,
- const int16_t MCT_flag,
- const MCT_CHAN_MODE mct_chan_mode /* i : MDCT channel mode */
-)
+ const int16_t MCT_flag )
{
int16_t i;
int16_t mdctWindowLength;
@@ -840,13 +829,9 @@ void init_tcx_cfg(
/* set number of coded lines */
hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth );
- if ( mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE;
- }
/* TNS in TCX */
hTcxCfg->pCurrentTnsConfig = NULL;
- hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode, mct_chan_mode );
+ hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode );
if ( hTcxCfg->fIsTNSAllowed )
{
diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c
index 9f8c1c7b9b1530716d207462b021b5b2a5e4bdfe..003d9422451fb3fd2b6fda1c1ff11047a0a3d816 100644
--- a/lib_com/delay_comp.c
+++ b/lib_com/delay_comp.c
@@ -55,10 +55,6 @@ int32_t get_delay(
const int32_t io_fs, /* i : input/output sampling frequency */
const IVAS_FORMAT ivas_format, /* i : IVAS format */
HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */
-#ifndef BINAURALIZATION_DELAY_REPORT
- ,
- const int32_t binaural_latency_ns /* i : binaural renderer HRTF delay in ns */
-#endif
)
{
int32_t delay = 0;
@@ -73,12 +69,10 @@ int32_t get_delay(
{
delay = IVAS_ENC_DELAY_NS;
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ivas_format == MASA_FORMAT )
{
delay = 0; /* All delay is compensated in the decoder with MASA */
}
-#endif
}
if ( ivas_format == SBA_FORMAT )
@@ -110,17 +104,10 @@ int32_t get_delay(
delay += IVAS_FB_DEC_DELAY_NS;
}
-#ifndef BINAURALIZATION_DELAY_REPORT
- /* compensate for binauralization delay */
- delay += binaural_latency_ns;
-#endif
-
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ivas_format == MASA_FORMAT )
{
delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */
}
-#endif
}
}
diff --git a/lib_com/disclaimer.c b/lib_com/disclaimer.c
index ed55a45b063d596dea4b6d4968633533c8c3e177..10a31d94c079da17168d2a3c79591fadc728f47b 100644
--- a/lib_com/disclaimer.c
+++ b/lib_com/disclaimer.c
@@ -55,3 +55,5 @@ int16_t print_disclaimer( FILE *fPtr )
return 0;
}
+
+#undef WMC_TOOL_SKIP
diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c
index f2dbf746b6f18d5e6b9fc07aaa570384733702be..f0408ea3ddca06d1eac0552ecba721c7e60d6b42 100644
--- a/lib_com/fd_cng_com.c
+++ b/lib_com/fd_cng_com.c
@@ -941,6 +941,75 @@ void SynthesisSTFT(
}
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------
+ * SynthesisSTFT_dirac()
+ *
+ * STFT synthesis filterbank
+ *-------------------------------------------------------------------*/
+
+void SynthesisSTFT_dirac(
+ float *fftBuffer, /* i : FFT bins */
+ float *timeDomainOutput,
+ float *olapBuffer,
+ const float *olapWin,
+ const int16_t samples_out,
+ HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */
+)
+{
+ int16_t i;
+ float buf[M + 1 + 320], tmp;
+
+ /* Perform IFFT */
+ RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 );
+
+ /* Handle overlap in P/S domain for stereo */
+ mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize );
+ set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/
+
+ for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ )
+ {
+ olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4];
+ }
+ for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ )
+ {
+ olapBuffer[i] = fftBuffer[i];
+ }
+
+ for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ )
+ {
+ olapBuffer[i] = fftBuffer[i];
+ }
+
+ for ( ; i < hFdCngCom->fftlen; i++ )
+ {
+ olapBuffer[i] = 0;
+ }
+
+ /* Get time-domain signal */
+ v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out );
+
+ /* Get excitation */
+ v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize );
+ tmp = buf[0];
+ preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp );
+ residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize );
+
+ /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/
+ if ( samples_out < hFdCngCom->frameSize )
+ {
+ mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 );
+ }
+ for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ )
+ {
+ olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4];
+ }
+
+ return;
+}
+#endif
+
+
/*-------------------------------------------------------------------
* mhvals()
*
diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c
index 7f7809428f9fb765f68dd2aceba11f608a4a8c85..d099c2200c04e574b5c48971238635190c2135e0 100644
--- a/lib_com/gs_bitallocation.c
+++ b/lib_com/gs_bitallocation.c
@@ -616,7 +616,7 @@ void bands_and_bit_alloc(
* Complete the bit allocation per frequency band for 16kHz high brate mode
*--------------------------------------------------------------------------*/
- if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) /* TBV if applicable */
+ if ( L_frame == L_FRAME16k && core_brate > ACELP_32k )
{
for ( j = st_band; j < nb_bands; j++ )
{
diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c
index 1d89d0314597493852e85af60f0e57247410d33c..0008cb957ce7b5a85d8c0b50478b02995f5f7eeb 100644
--- a/lib_com/hq_tools.c
+++ b/lib_com/hq_tools.c
@@ -1290,7 +1290,6 @@ int16_t calc_nor_delta_hf(
ynrm[i] += delta;
add_bits_denv += bitsforDelta;
-
temp_num++;
}
}
diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h
old mode 100644
new mode 100755
index f6c1fd9c0415226c267a8b19f17a90b80a0831e1..9557f7aef1ae94191c97dd552d9abc7a3d060164
--- a/lib_com/ivas_cnst.h
+++ b/lib_com/ivas_cnst.h
@@ -78,7 +78,7 @@ typedef enum
*----------------------------------------------------------------------------------*/
#define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */
-#define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 )
+#define IVAS_FORMAT_SIGNALING_NBITS_EXTENDED ( IVAS_FORMAT_SIGNALING_NBITS + 1 )
/*----------------------------------------------------------------------------------*
@@ -106,8 +106,8 @@ typedef enum
AUDIO_CONFIG_ISM2, /* ISM2 */
AUDIO_CONFIG_ISM3, /* ISM3 */
AUDIO_CONFIG_ISM4, /* ISM4 */
- AUDIO_CONFIG_MASA1, /* MASA1 */ // TBV: seems not to be used
- AUDIO_CONFIG_MASA2, /* MASA2 */ // TBV: seems not to be used
+ AUDIO_CONFIG_MASA1, /* MASA1 */ // TODO: seems not to be used
+ AUDIO_CONFIG_MASA2, /* MASA2 */ // TODO: seems not to be used
AUDIO_CONFIG_EXTERNAL /* external renderer */
} AUDIO_CONFIG;
@@ -152,7 +152,8 @@ typedef enum
RENDERER_MCMASA_MONO_STEREO,
RENDERER_PARAM_ISM,
RENDERER_BINAURAL_MIXER_CONV,
- RENDERER_BINAURAL_MIXER_CONV_ROOM
+ RENDERER_BINAURAL_MIXER_CONV_ROOM,
+ RENDERER_NON_DIEGETIC_DOWNMIX
} RENDERER_TYPE;
@@ -166,18 +167,28 @@ typedef enum
#define HEAD_ROTATION_HOA_ORDER 3 /* HOA 3rd order */
#define MAX_CICP_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts)*/
#define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order) */
+#define MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN 2 /* Maximum number of output channels with non diegetic panning */
#define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */
#define CPE_CHANNELS 2 /* number of CPE (stereo) channels */
#define FOA_CHANNELS 4 /* number of FOA channels */
+#define HOA2_CHANNELS 9
+
#define MAX_NUM_OBJECTS 4 /* max. number of audio objects */
#define MAX_SCE MAX_NUM_OBJECTS /* max. number of SCEs */
#define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */
#define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */
+#ifndef IND_LIST_DYN
#define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */
-
+#endif
+#ifdef IND_LIST_DYN
+#define MIN_NUM_IND 10 /* minimum number of indices in the core coder */
+#define MAX_NUM_IND_LFE 100 /* maximum number of indices in the LFE encoder */
+#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */
+#define MAX_IND_TDM_TMP 10 /* maximum number of indices in the temporary list of TD stereo spatial parameters */
+#endif
#define IVAS_ENC_DELAY_NS ACELP_LOOK_NS
#define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */
@@ -192,6 +203,26 @@ typedef enum
#define IVAS_NUM_SUPPORTED_FS 3 /* number of supported sampling-rates in IVAS */
+#ifdef JBM_TSM_ON_TCS
+#define CLDFB_SLOT_NS 1250000L /* 1.25ms: CLDFB slot length */
+#define MAX_JBM_SUBFRAMES_5MS 8
+#define DEFAULT_JBM_SUBFRAMES_5MS 4
+#define JBM_CLDFB_SLOTS_IN_SUBFRAME 4
+#define MAX_JBM_CLDFB_TIMESLOTS 32
+#define DEFAULT_JBM_CLDFB_TIMESLOTS 16
+#define MAX_JBM_L_FRAME48k 1920
+#define MAX_JBM_L_FRAME_NS 40000000L
+#define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH
+#define MAX_CLDFB_DIGEST_CHANNELS 4
+
+typedef enum
+{
+ TC_BUFFER_MODE_NONE = 0,
+ TC_BUFFER_MODE_RENDERER,
+ TC_BUFFER_MODE_BUFFER
+} TC_BUFFER_MODE;
+#endif
+
/*----------------------------------------------------------------------------------*
* IVAS Bitrates
*----------------------------------------------------------------------------------*/
@@ -320,13 +351,13 @@ typedef enum
#define ISM_Q_STEP 2.5f
#define ISM_Q_STEP_BORDER 5.0f
-#ifdef TD5
-#define ISM_RADIUS_NBITS 6
-#define ISM_RADIUS_MIN 0.0f
-#define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */
-#define ISM_EXTENDED_METADATA_BRATE IVAS_64k
-#define ISM_EXTENDED_METADATA_BITS 1
-#endif
+#define ISM_RADIUS_NBITS 6
+#define ISM_RADIUS_MIN 0.0f
+#define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */
+#define ISM_EXTENDED_METADATA_BRATE IVAS_64k
+#define ISM_METADATA_IS_NDP_BITS 1
+#define ISM_EXTENDED_METADATA_BITS 1
+#define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */
/* Parametric ISM */
#define MAX_PARAM_ISM_NBANDS 11
@@ -341,9 +372,17 @@ typedef enum
#define PARAM_ISM_MAX_CHAN 16
#define PARAM_ISM_HYS_BUF_SIZE 10
-#define PARAM_ISM_DTX_COH_SCA_BITS 4
-#define PARAM_ISM_DTX_AZI_BITS 5
-#define PARAM_ISM_DTX_ELE_BITS 4
+/* ISM DTX */
+#define ISM_DTX_COH_SCA_BITS 4
+#define ISM_DTX_AZI_BITS_HIGH 8
+#define ISM_DTX_ELE_BITS_HIGH 7
+#define ISM_Q_STEP_HIGH (ISM_Q_STEP / 2)
+#define ISM_Q_STEP_BORDER_HIGH (ISM_Q_STEP_BORDER / 2)
+#define ISM_DTX_AZI_BITS_LOW 6
+#define ISM_DTX_ELE_BITS_LOW 5
+#define ISM_Q_STEP_LOW (ISM_Q_STEP * 2)
+#define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2)
+
typedef enum
{
@@ -357,27 +396,23 @@ typedef enum
enum
{
IND_ISM_NUM_OBJECTS,
-#ifdef TD5
IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,
- IND_ISM_METADATA_FLAG = IND_ISM_EXTENDED_FLAG + MAX_NUM_OBJECTS, /* EN2VE: Is this not supposed to be in the loop part below, since it is one per ISM? */
-#else
- IND_ISM_METADATA_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,
-#endif
+ IND_ISM_EXTENDED_NDP_FLAG,
+ IND_ISM_METADATA_FLAG,
IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS,
- IND_ISM_SCE_ID_DTX = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS,
- IND_ISM_NOISY_SPEECH_FLAG,
+ IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS,
+ IND_ISM_SCE_ID_DTX,
IND_ISM_DTX_COH_SCA,
/* ------------- loop for objects -------------- */
TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS,
+ IND_ISM_NDP_FLAG = TAG_ISM_LOOP_START,
IND_ISM_AZIMUTH_DIFF_FLAG = TAG_ISM_LOOP_START,
IND_ISM_AZIMUTH = TAG_ISM_LOOP_START,
IND_ISM_ELEVATION_DIFF_FLAG = TAG_ISM_LOOP_START,
IND_ISM_ELEVATION = TAG_ISM_LOOP_START,
-#ifdef TD5
IND_ISM_RADIUS_DIFF_FLAG = TAG_ISM_LOOP_START,
IND_ISM_RADIUS = TAG_ISM_LOOP_START,
-#endif
TAG_ISM_LOOP_END = TAG_ISM_LOOP_START + 100, /* IVAS_fmToDo: to be reviewed once the final metadata are defined */
/* --------- end of loop for objects ----------- */
@@ -790,11 +825,7 @@ enum fea_names
#define TDM_LP_REUSE_BITS 1 /* number of bits to code LP reuse flag for secondary channel */
#define TDM_LR_CONTENT_BITS 1 /* number of bits to code flag when the content is LR or not */
#define TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS + STEREO_BITS_TCA )
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
-#define TDM_IC_LSF_PRED_BITS 1 /* Number of bits to code the inter channel lsf prediction mode */
-#endif
-#endif
+#define TDM_IC_LSF_PRED_BITS 1 /* number of bits to code the inter channel LSF prediction mode */
/*----------------------------------------------------------------------------------*
@@ -828,10 +859,21 @@ enum fea_names
#define SNS_LOW_BR_MODE -1
#define SNS_NPTS 16 /* Number of downsampled SNS parameters */
+#define SNS_STEREO_MODE_LR 0
+#define SNS_STEREO_MODE_MS 1
+#define SNS_STEREO_MODE_OFFSET_INDICES 4
+#define SNS_MSVQ_NSTAGES_TCX20 4
+#define SNS_MSVQ_NSTAGES_TCX10 3
+#define SNS_MSVQ_NSTAGES_SIDE 2
+#define SNS_CDBKS_BITS_4_FRAC 12
+#define SNS_MEANS_BITS_4_FRAC 14
#define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f
#define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC
#define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20
+#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY
+#define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3
+#endif
typedef enum {
EQUAL_CORES,
@@ -856,9 +898,10 @@ typedef enum {
/*----------------------------------------------------------------------------------*
* General Parametric Coding Constants
*----------------------------------------------------------------------------------*/
-// VE: this should be renamed to e.g. N_SPATIAL_SUBFRAMES
+
#define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */
#define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES)
+#define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */
/*----------------------------------------------------------------------------------*
@@ -876,20 +919,21 @@ typedef enum {
#define SBA_NHARM_HOA3 16
#define SBA_T_DESIGN_11_SIZE 70
#define SBA_DTX_BITRATE_THRESHOLD IVAS_80k
-
+#ifndef SBA_MODE_CLEAN_UP
typedef enum
{
SBA_MODE_NONE,
SBA_MODE_DIRAC,
- SBA_MODE_SPAR, // VE: this is actually SBA_MODE_SPAR_DIRAC
+ SBA_MODE_SPAR,
} SBA_MODE;
+#endif
/*----------------------------------------------------------------------------------*
* DirAC Constants
*----------------------------------------------------------------------------------*/
-#define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */
+#define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */
#define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */
#define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */
@@ -903,6 +947,9 @@ typedef enum
#define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240
#define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */
+#define DIRAC_HO_NUMSECTORS 2
+#define NUM_ANA_SECTORS 2
+
/* DirAC renderer setup */
typedef enum
@@ -940,12 +987,8 @@ typedef enum
#define DELAY_DIRAC_SPAR_ENC_CMP_NS 500000L /* here we may set the 24 samples (at 48 kHz) additional delay to something else, leave as is for now*/
#define DELAY_DIRAC_PARAM_DEC_SFR 2 /* Delay to be compensation for DirAC parameters in the decoder (subframes) */
-#ifdef FIX_350_MASA_DELAY_COMP
#define DELAY_MASA_PARAM_DEC_SFR 2 /* Delay to be compensation for MASA parameters in the decoder (subframes) */
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
-#endif
-#endif
#define DIRAC_SLOT_NS 1250000L /* time duration of a time slot, 1.25ms (==DELAY_RENERER_NS/MAX_PARAM_SPATIAL_SUBFRAMES) */
#define DIRAC_SLOT_ENC_NS 5000000L
@@ -965,7 +1008,10 @@ typedef enum
#define SPAR_CONFIG_BW FB
-#define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */
+#define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/
+#define IVAS_HBR_MAX_DECOR_CHS (2)
+
+#define IVAS_SPAR_MAX_FB_IN_CHAN 11
#define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1
#define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1)
@@ -977,10 +1023,15 @@ typedef enum
/* AGC constants */
#define AGC_BITS_PER_CH 3
#define AGC_EMAX 0
+#ifdef ARITH_HUFF_CODER_CHANGES
+#define AGC_SIGNALLING_BITS 1
+#define IVAS_SPAR_ARITH_OVERSHOOT_BITS (16)
+#endif
/* Common SPAR metadata constants */
#define IVAS_ACTIVEW_DM_F_SCALE 0.5f
#define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f
+#define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f
#define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000
#define MAX_QUANT_STRATS 3
@@ -1013,9 +1064,9 @@ typedef enum
DECX_COEFF
} ivas_coeffs_type_t;
-#define IVAS_SPAR_BR_TABLE_LEN 18
+#define IVAS_SPAR_BR_TABLE_LEN 20
-/* TD decorr */ // VE: not all 16CH are currently supported -> t be revisited later
+/* TD decorr */ // ToDo: not all 16CH are currently supported -> to be revisited later
enum
{
IVAS_TD_DECORR_OUT_1CH = 1,
@@ -1117,9 +1168,6 @@ enum
#define MASA_MAXIMUM_DIRECTIONS 2
#define MASA_MAX_TRANSPORT_CHANNELS 2
-#ifndef FIX_350_MASA_DELAY_COMP
-#define MASA_ENC_DELAY_SLOTS 7
-#endif
#define MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS 5
@@ -1138,6 +1186,9 @@ enum
#define MASA_DIRECTION_MAX_BITS 11
#define MASA_NO_INDEX 32767
#define MASA_BITS_ER 3
+#ifdef HR_METADATA
+#define MASA_BITS_ER_HR 4
+#endif
#define MASA_MIN_BITS_TF 4
#define MASA_LIMIT_2D 2
#define MASA_NO_CV_COH 8
@@ -1156,6 +1207,15 @@ enum
#define MASA_COH_LIMIT_2IDX 144 /* limit for sum of values across components for having two joint indexes */
#define QMETADATA_MAX_NO_DIRECTIONS 2
#define MASA_MAX_BITS 1300 /* max. bit-budget for MASA metadata */
+
+#ifdef HR_METADATA
+#define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/
+#define HR_MASA_ER_LEVELS 16
+#endif
+#ifdef FIX_HBR_MASAMETA
+#define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */
+#endif
+
#define LIMIT_ER_ELEVATION_ENC 4
#define LIMIT_ER_SIMPLE_ENC 6
#define LIMIT_USE_COMMON 3
@@ -1167,7 +1227,9 @@ enum
#define MASA_ANGLE_TOLERANCE 0.5f
#define MASA_LIMIT_NO_BANDS_SUR_COH 8
#define MINIMUM_BIT_BUDGET_NORMAL_META 100
+#define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4
#define DIFF_DFRATIO_2BIT_LIMIT_IDX 3
+
#define DIFF_DFRATIO_1BIT_LIMIT_IDX 6
#define DIFF_EC_HUFF_BAND_LIMIT 8
#define DIFF_EC_HUFF_GR0_LIMIT 8
@@ -1184,7 +1246,12 @@ enum
#define MASA_STEREO_MIN_BITRATE IVAS_24k4
#define MASA_BIT_REDUCT_PARAM 10
-#define MASA_MAXIMUM_TWO_DIR_BANDS 18
+#ifdef HR_METADATA
+#define MASA_MAXIMUM_TWO_DIR_BANDS 24
+#define NBITS_HR_COH 4
+#else
+#define MASA_MAXIMUM_TWO_DIR_BANDS 18
+#endif
typedef enum
{
MASA_STEREO_NOT_DEFINED,
@@ -1192,6 +1259,11 @@ typedef enum
MASA_STEREO_DOWNMIX
} MASA_TRANSPORT_SIGNAL_TYPE;
+typedef enum
+{
+ MASA_FRAME_1SF,
+ MASA_FRAME_4SF
+} MASA_FRAME_MODE;
/*----------------------------------------------------------------------------------*
* Multichannel format
@@ -1205,7 +1277,8 @@ typedef enum
MC_MODE_NONE,
MC_MODE_MCT,
MC_MODE_PARAMMC,
- MC_MODE_MCMASA
+ MC_MODE_MCMASA,
+ MC_MODE_PARAMUPMIX
} MC_MODE;
typedef enum
@@ -1257,18 +1330,62 @@ typedef enum
#define NBBITS_MCT_RATIO 4
#define BITRATE_MCT_RATIO_RANGE ( 1 << NBBITS_MCT_RATIO ) /* Range of the coded bitrate distribution ratio */
-#define LFE_BITS 180
-
-#define MCT_LFE_MAX_LINE 24
#define MCT_NUM_BLOCK_DATA_BITS 4
typedef enum
{
MCT_CHAN_MODE_REGULAR,
- MCT_CHAN_MODE_LFE,
MCT_CHAN_MODE_IGNORE
} MCT_CHAN_MODE;
+/*----------------------------------------------------------------------------------*
+ * MC Param-Upmix Mode Constants
+ *----------------------------------------------------------------------------------*/
+#define MC_PARAMUPMIX_MAX_TRANSPORT_CHANS 8
+#define MC_PARAMUPMIX_MAX_INPUT_CHANS 12
+#define MC_PARAMUPMIX_MAX_BITS 1024 /* Maximum number of bits for the MC Param-Upmix metadata */
+#define MC_PARAMUPMIX_COMBINATIONS 4 /* number of sets of 2 channels combined */
+#define MC_PARAMUPMIX_NCH 2 /* number of channels to combine into 1 */
+#define MC_PARAMUPMIX_MIN_CLDFB 8
+
+typedef struct {
+ const int32_t *value;
+ const uint16_t *length;
+} HUFF_TAB;
+
+typedef struct {
+ int32_t value[81];
+ unsigned short length[81];
+} HUFF_ELEMENTS;
+
+typedef struct {
+ HUFF_ELEMENTS df0;
+ HUFF_ELEMENTS df;
+ HUFF_ELEMENTS dt;
+} HUFF_TABLE;
+
+typedef enum {
+ ALPHA,
+ BETA
+} PAR_TYPE;
+
+typedef enum {
+ FINE,
+ COARSE
+} QUANT_TYPE;
+
+typedef struct {
+ int16_t nquant;
+ int16_t offset;
+ float data[35];
+} ACPL_QUANT_TABLE;
+
+typedef struct
+{
+ const int16_t (*alpha[2])[2];
+ const int16_t (*beta[2])[2];
+} HUFF_NODE_TABLE;
+
/*----------------------------------------------------------------------------------*
* Parametric MC Constants
@@ -1286,7 +1403,11 @@ typedef enum
#define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */
#define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */
#define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */
+#ifdef JBM_TSM_ON_TCS
+#define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */
+#else
#define PARAM_MC_MAX_NSLOTS 16 /* Maximum number of CLDFB slots in a frame */
+#endif
#define PARAM_MC_MAX_NSLOTS_IN_SUBFRAME 4 /* Maximum number of CLDFB slots in a subframe */
#define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */
#define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */
@@ -1317,6 +1438,7 @@ typedef enum
#define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */
#define PARAM_MC_SLOT_ENC_NS 2500000L
#define PARAM_MC_MDFT_NO_SLOTS 8
+#define PARAM_MC_CLDFB_TO_MDFT_FAC 2
/*----------------------------------------------------------------------------------*
* LFE Coding Constants
@@ -1392,7 +1514,11 @@ typedef enum
#define BINAURAL_MAXBANDS 60 /* Max number of bands */
#define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */
+#ifdef UPDATE_SBA_FILTER
+#define BINAURAL_NTAPS 5
+#else
#define BINAURAL_NTAPS 7
+#endif
#define BINAURAL_NTAPS_MAX 96
#define HRTF_SH_ORDER 3
@@ -1410,7 +1536,13 @@ typedef enum
{
BINAURAL_INPUT_AUDIO_CONFIG_INVALID,
BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */
+#ifdef UPDATE_SBA_FILTER
+ BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */
+ BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */
+ BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */
+#else
BINAURAL_INPUT_AUDIO_CONFIG_HOA, /* FOA, HOA2, HOA3 */
+#endif
BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */
} BINAURAL_INPUT_AUDIO_CONFIG;
@@ -1437,7 +1569,7 @@ typedef enum
#define SFX_SPAT_BIN_NUM_SUBSAMPLES 64
#define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M)
#define L_SUBFRAME5MS_48k (L_FRAME48k/4)
-#define MAX_ANGULAR_STEP (1.0f)
+#define MAX_ANGULAR_STEP (0.01f)
#define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP )
#define MAX_INTERPOLATION_STEPS 12
@@ -1458,7 +1590,8 @@ typedef enum
typedef enum
{
TDREND_PLAYSTATUS_INITIAL,
- TDREND_PLAYSTATUS_PLAYING
+ TDREND_PLAYSTATUS_PLAYING,
+ TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC
} TDREND_PlayStatus_t;
typedef enum
@@ -1481,42 +1614,28 @@ typedef enum
} SFX_OpMode_t;
+#ifndef FIX_439_OTR_PARAMS
/*----------------------------------------------------------------------------------*
* Orientation tracking constants
*----------------------------------------------------------------------------------*/
/* Orientation tracking types */
-#ifdef FIX_I109_ORIENTATION_TRACKING
#define IVAS_ORIENT_TRK_NONE 0
#define IVAS_ORIENT_TRK_REF 1
#define IVAS_ORIENT_TRK_AVG 2
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
#define IVAS_ORIENT_TRK_REF_VEC 3
#define IVAS_ORIENT_TRK_REF_VEC_LEV 4
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
-#define IVAS_ORIENT_TRK_REF 0
-#define IVAS_ORIENT_TRK_AVG 1
-#endif
typedef enum
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
OTR_TRACKING_NONE = IVAS_ORIENT_TRK_NONE,
-#else
- OTR_TRACKING_NONE = IVAS_ORIENT_TRK_REF-1,
-#endif
OTR_TRACKING_REF_ORIENT = IVAS_ORIENT_TRK_REF, /* track orientation relative to external reference orientation (default: no rotation) */
OTR_TRACKING_AVG_ORIENT = IVAS_ORIENT_TRK_AVG /* track orientation relative to average orientation */
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
,
OTR_TRACKING_REF_VEC = IVAS_ORIENT_TRK_REF_VEC, /* track orientation relative to external reference vector */
OTR_TRACKING_REF_VEC_LEV = IVAS_ORIENT_TRK_REF_VEC_LEV /* track orientation relative to level component of external reference vector */
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
} OTR_TRACKING_T;
-
+#endif
/*----------------------------------------------------------------------------------*
* Reverberator constants
@@ -1542,6 +1661,7 @@ typedef enum
#define IVAS_320_PT_LEN 320
#define IVAS_240_PT_LEN 240
#define IVAS_160_PT_LEN 160
+#define IVAS_120_PT_LEN 120
#define IVAS_80_PT_LEN 80
#define IVAS_40_PT_LEN 40
@@ -1645,11 +1765,17 @@ typedef enum
#define IVAS_16K_12BANDS_ACTIVE_BANDS 10
#define SPAR_DIRAC_SPLIT_START_BAND 8
+#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1)
#define SPAR_DTX_BANDS 2
#define DIRAC_DTX_BANDS 2
#define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS )
#define CLDFB_PAR_WEIGHT_START_BAND 7
+#ifdef ARITH_HUFF_CODER_CHANGES
+#define QUANT_STRAT_0 0
+#define QUANT_STRAT_2 2
+#endif
+
/*----------------------------------------------------------------------------------*
* Limiter constants
@@ -1658,6 +1784,41 @@ typedef enum
#define IVAS_LIMITER_THRESHOLD 32729 /* -0.01 dBFS */
#define IVAS_LIMITER_ATTACK_SECONDS 0.005f
+#ifdef ENHANCED_STEREO_DMX
+/*----------------------------------------------------------------------------------*
+ * Stereo downmix EVS constants
+ *----------------------------------------------------------------------------------*/
+
+#define STEREO_DMX_EVS_PHA_LEN_16 48
+#define STEREO_DMX_EVS_FAD_LEN_16 160
+#define STEREO_DMX_EVS_PHA_LEN_32 96
+#define STEREO_DMX_EVS_FAD_LEN_32 320
+#define STEREO_DMX_EVS_PHA_LEN_48 96
+#define STEREO_DMX_EVS_FAD_LEN_48 480
+
+#define STEREO_DMX_EVS_SUBBAND_SIZE 2
+#define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE))
+
+#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */
+#define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */
+
+#define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k)
+
+typedef enum
+{
+ STEREO_DMX_EVS_PHA_IPD,
+ STEREO_DMX_EVS_PHA_IPD2,
+ STEREO_DMX_EVS_NO_PHA
+
+} STEREO_DMX_EVS_PHA;
+
+typedef enum
+{
+ STEREO_DMX_EVS_PRC_POC,
+ STEREO_DMX_EVS_PRC_PHA,
+
+} STEREO_DMX_EVS_PRC;
+#endif
#endif
/* clang-format on */
diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c
index 35ce6b85465eca6da931f068f4dbeb384f25fe1f..e407bccc6c67c6b7193b70b88faa8b45890f57e5 100644
--- a/lib_com/ivas_cov_smooth.c
+++ b/lib_com/ivas_cov_smooth.c
@@ -35,6 +35,9 @@
#ifdef DEBUGGING
#include "debug.h"
#endif
+#ifdef FIX_489_COV_SMOOTHING
+#include "cnst.h"
+#endif
#include "ivas_prot.h"
#include "wmc_auto.h"
#include "prot.h"
@@ -50,13 +53,51 @@ static void ivas_set_up_cov_smoothing(
ivas_cov_smooth_state_t *hCovState,
ivas_filterbank_t *pFb,
const float max_update_rate,
- const int16_t min_pool_size,
- const int16_t nchan_inp /* i : number of input channels */
-)
+ const int16_t min_pool_size
+#ifdef FIX_489_COV_SMOOTHING
+ ,
+ const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */
+#endif
+ ,
+ const int32_t ivas_total_brate )
{
int16_t j, k;
+ if ( ivas_total_brate < IVAS_24k4 )
+ {
+ for ( j = 0; j < pFb->filterbank_num_bands; j++ )
+ {
+ float update_factor;
+ float *p_bin_to_band;
+ update_factor = 0.0f;
+ p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j];
+ int16_t active_bins;
+ active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j];
+
+ for ( k = 0; k < active_bins; k++ )
+ {
+ update_factor += p_bin_to_band[k];
+ }
- if ( nchan_inp <= FOA_CHANNELS )
+ hCovState->pSmoothing_factor[j] = update_factor / min_pool_size;
+ float smooth_fact;
+ if ( ivas_total_brate < IVAS_24k4 )
+ {
+ smooth_fact = 0.5f;
+ }
+ else
+ {
+ smooth_fact = 0.75;
+ }
+ hCovState->pSmoothing_factor[j] *= ( j + 1 ) * smooth_fact;
+
+ if ( hCovState->pSmoothing_factor[j] > max_update_rate )
+ {
+ hCovState->pSmoothing_factor[j] = max_update_rate;
+ }
+ }
+ }
+#ifdef FIX_489_COV_SMOOTHING
+ else if ( smooth_mode == COV_SMOOTH_MC )
{
for ( j = 0; j < pFb->filterbank_num_bands; j++ )
{
@@ -76,6 +117,7 @@ static void ivas_set_up_cov_smoothing(
}
}
}
+#endif
else
{
for ( j = 0; j < pFb->filterbank_num_bands; j++ )
@@ -98,6 +140,7 @@ static void ivas_set_up_cov_smoothing(
}
}
}
+
hCovState->prior_bank_idx = -1;
return;
@@ -115,6 +158,11 @@ ivas_error ivas_spar_covar_smooth_enc_open(
const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */
ivas_filterbank_t *pFb, /* i/o: FB handle */
const int16_t nchan_inp /* i : number of input channels */
+ ,
+#ifdef FIX_489_COV_SMOOTHING
+ COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */
+#endif
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
)
{
ivas_cov_smooth_state_t *hCovState;
@@ -142,8 +190,12 @@ ivas_error ivas_spar_covar_smooth_enc_open(
}
}
- ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size,
- nchan_inp );
+
+#ifdef FIX_489_COV_SMOOTHING
+ ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate );
+#else
+ ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate );
+#endif
*hCovState_out = hCovState;
diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c
index 01f133a3b7f2fc2d6bd0c5e24ef94419c0dca733..091215ac632ff1560211c90ebb952e3e2b4e28a5 100644
--- a/lib_com/ivas_dirac_com.c
+++ b/lib_com/ivas_dirac_com.c
@@ -48,6 +48,30 @@
static uint16_t deindex_sph_idx_general( const int16_t idx_sph, const int16_t no_bits, float *theta_dec, float *phi_dec, uint16_t *p_id_phi, const MC_LS_SETUP mc_format );
+
+/*-------------------------------------------------------------------------
+ * ivas_get_hodirac_flag()
+ *
+ * Return flag for HO-DirAC method at high bitrates
+ *------------------------------------------------------------------------*/
+
+/*! r: HO-DirAC flag */
+int16_t ivas_get_hodirac_flag(
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ const int16_t sba_order /* i : Ambisonic (SBA) order */
+)
+{
+ if ( sba_order > 1 && ivas_total_brate > IVAS_256k )
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+
/*-------------------------------------------------------------------------
* ivas_dirac_sba_config()
*
@@ -61,7 +85,11 @@ ivas_error ivas_dirac_config(
{
IVAS_FORMAT ivas_format;
int16_t sba_order;
+#ifndef SBA_MODE_CLEAN_UP
int16_t *nSCE, *nCPE, *element_mode, *nchan_transport;
+#else
+ int16_t *element_mode;
+#endif
int32_t ivas_total_brate;
DIRAC_CONFIG_DATA_HANDLE hConfig;
IVAS_QMETADATA_HANDLE hQMetaData;
@@ -70,25 +98,35 @@ ivas_error ivas_dirac_config(
ivas_error error;
int16_t spar_dirac_split_band;
IVAS_FB_MIXER_HANDLE hFbMdft;
+#ifndef SBA_MODE_CLEAN_UP
SBA_MODE sba_mode;
+#endif
+
int16_t *dirac_to_spar_md_bands;
+
error = IVAS_ERR_OK;
if ( enc_dec == ENC )
{
ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format;
+#ifndef SBA_MODE_CLEAN_UP
nSCE = &( ( (Encoder_Struct *) st_ivas )->nSCE );
nCPE = &( (Encoder_Struct *) st_ivas )->nCPE;
+#endif
element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init;
+#ifndef SBA_MODE_CLEAN_UP
nchan_transport = &( (Encoder_Struct *) st_ivas )->nchan_transport;
+#endif
sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order;
ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate;
Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs;
band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping;
hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig;
hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData;
+#ifndef SBA_MODE_CLEAN_UP
sba_mode = ( (Encoder_Struct *) st_ivas )->sba_mode;
+#endif
if ( ( (Encoder_Struct *) st_ivas )->hSpar != NULL )
{
hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer;
@@ -97,22 +135,32 @@ ivas_error ivas_dirac_config(
{
hFbMdft = NULL;
}
+#ifndef SBA_MODE_CLEAN_UP
dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands;
+#else
+ dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands;
+#endif
}
else
{
ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format;
+#ifndef SBA_MODE_CLEAN_UP
nSCE = &( (Decoder_Struct *) st_ivas )->nSCE;
nCPE = &( (Decoder_Struct *) st_ivas )->nCPE;
+#endif
element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init;
+#ifndef SBA_MODE_CLEAN_UP
nchan_transport = &( (Decoder_Struct *) st_ivas )->nchan_transport;
+#endif
sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order;
ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate;
Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs;
band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping;
hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig;
hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData;
+#ifndef SBA_MODE_CLEAN_UP
sba_mode = ( (Decoder_Struct *) st_ivas )->sba_mode;
+#endif
if ( ( (Decoder_Struct *) st_ivas )->hSpar != NULL )
{
hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer;
@@ -122,13 +170,27 @@ ivas_error ivas_dirac_config(
hFbMdft = NULL;
}
( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft;
+#ifndef SBA_MODE_CLEAN_UP
dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands;
+#else
+ dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands;
+#endif
}
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
hConfig->nbands = IVAS_MAX_NUM_BANDS;
+
spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
+
+ if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) )
+ {
+ spar_dirac_split_band = 0;
+ }
}
else
{
@@ -137,17 +199,27 @@ ivas_error ivas_dirac_config(
}
hConfig->enc_param_start_band = 0;
hConfig->dec_param_estim = FALSE;
-
+#ifndef FIX_393_459_460_SBA_MD
+ hConfig->dec_param_estim_old = hConfig->dec_param_estim;
+#endif
if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */
{
+#ifndef SBA_MODE_CLEAN_UP
if ( ( error = ivas_dirac_sba_config( hQMetaData, nchan_transport, nSCE, nCPE, element_mode, ivas_total_brate, sba_order, sba_mode, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
if ( hQMetaData != NULL )
{
+#ifndef SBA_MODE_CLEAN_UP
if ( enc_dec == ENC || sba_mode != SBA_MODE_SPAR )
+#else
+ if ( enc_dec == ENC || ivas_format != SBA_FORMAT )
+#endif
{
hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands;
}
@@ -155,13 +227,25 @@ ivas_error ivas_dirac_config(
}
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
hConfig->dec_param_estim = TRUE;
if ( hConfig->dec_param_estim == TRUE )
{
hConfig->enc_param_start_band = spar_dirac_split_band;
}
+
+ if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) )
+ {
+ hConfig->dec_param_estim = FALSE;
+ hConfig->enc_param_start_band = 0;
+
+ set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands );
+ hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands;
+ }
+#ifndef SBA_MODE_CLEAN_UP
}
else
{
@@ -170,17 +254,20 @@ ivas_error ivas_dirac_config(
hConfig->dec_param_estim = TRUE;
}
}
+#endif
}
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
- ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
- dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft );
+ ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft );
}
else
{
- ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
- NULL, 0, 0, hFbMdft );
+ ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft );
}
return error;
@@ -259,9 +346,10 @@ void ivas_dirac_config_bands(
{
band_grouping[reduced_band] = max_band;
}
- for ( band = enc_param_start_band + 1; band < DIRAC_MAX_NBANDS; band++ )
+ for ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1; band >= enc_param_start_band; band--, reduced_band -= step )
{
- dirac_to_spar_md_bands[band] = dirac_to_spar_md_bands[band - 1];
+ dirac_to_spar_md_bands[reduced_band] = dirac_to_spar_md_bands[band];
+ dirac_to_spar_md_bands[reduced_band - 1] = dirac_to_spar_md_bands[band];
}
}
else
@@ -289,6 +377,70 @@ void ivas_dirac_config_bands(
return;
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+void ivas_get_dirac_sba_max_md_bits(
+ const int32_t sba_total_brate,
+ int16_t *bits_frame_nominal,
+ int16_t *metadata_max_bits,
+ int16_t *qmetadata_max_bit_req,
+ int16_t nbands )
+{
+ if ( sba_total_brate <= IVAS_13k2 )
+ {
+ *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
+ *metadata_max_bits = 70;
+ }
+ else if ( sba_total_brate <= IVAS_16k4 )
+ {
+ *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
+ *metadata_max_bits = 80;
+ }
+ else if ( sba_total_brate <= IVAS_24k4 )
+ {
+ *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
+ *metadata_max_bits = 103;
+ }
+ else if ( sba_total_brate <= IVAS_32k )
+ {
+ *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
+ *metadata_max_bits = 214;
+ }
+ else if ( sba_total_brate <= IVAS_48k )
+ {
+ *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
+ *metadata_max_bits = 240;
+ }
+ else if ( sba_total_brate <= IVAS_64k )
+ {
+ *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
+ *metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_80k )
+ {
+ *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
+ *metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_96k )
+ {
+ *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
+ *metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_128k )
+ {
+ *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
+ *metadata_max_bits = 250;
+ }
+ else
+ {
+ *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC );
+ *metadata_max_bits = MAX16B; /* no limit */
+ }
+ *metadata_max_bits = (int16_t) ceilf( (float) *metadata_max_bits * nbands / 5 );
+ *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;
+
+ return;
+}
+#endif
/*-------------------------------------------------------------------------
* ivas_dirac_sba_config()
@@ -298,26 +450,36 @@ void ivas_dirac_config_bands(
ivas_error ivas_dirac_sba_config(
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
- int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */
- int16_t *nSCE, /* o : number of SCEs */
- int16_t *nCPE, /* o : number of CPEs */
- int16_t *element_mode, /* i/o: element mode of the core coder */
- int32_t sba_total_brate, /* i : SBA total bitrate */
- const int16_t sba_order, /* i : Ambisonic (SBA) order */
- const SBA_MODE sba_mode, /* i : SBA mode */
- const int16_t nbands /* i : number of frequency bands */
+#ifndef SBA_MODE_CLEAN_UP
+ int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */
+ int16_t *nSCE, /* o : number of SCEs */
+ int16_t *nCPE, /* o : number of CPEs */
+#endif
+ int16_t *element_mode, /* i/o: element mode of the core coder */
+ int32_t sba_total_brate, /* i : SBA total bitrate */
+ const int16_t sba_order, /* i : Ambisonic (SBA) order */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
+ const int16_t nbands /* i : number of frequency bands */
)
{
+#ifndef SBA_MODE_CLEAN_UP
int16_t i;
int16_t nbands_wb;
+#endif
int16_t nbands_coded;
+ int16_t hodirac_flag;
ivas_error error;
error = IVAS_ERR_OK;
hQMetaData->is_masa_ivas_format = 0;
+ hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order );
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
/* map the bitrate for SID frame */
if ( sba_total_brate == IVAS_SID_5k2 )
{
@@ -351,69 +513,105 @@ ivas_error ivas_dirac_sba_config(
else
{
hQMetaData->useLowerBandRes = 0;
- nbands_coded = nbands - 1; /* always combine the last two bands */
+ if ( hodirac_flag == 0 )
+ {
+ nbands_coded = nbands - 1; /* always combine the last two bands */
+ }
}
- if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK )
{
- return error;
- }
+ int16_t no_dirs = 1;
+ if ( hodirac_flag )
+ {
+ no_dirs = 2;
+ }
- if ( sba_total_brate <= IVAS_13k2 )
- {
- hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 70;
- }
- else if ( sba_total_brate <= IVAS_16k4 )
- {
- hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 80;
- }
- else if ( sba_total_brate <= IVAS_24k4 )
- {
- hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 103;
- }
- else if ( sba_total_brate <= IVAS_32k )
- {
- hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 214;
- }
- else if ( sba_total_brate <= IVAS_48k )
- {
- hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 240;
- }
- else if ( sba_total_brate <= IVAS_64k )
- {
- hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 200;
- }
- else if ( sba_total_brate <= IVAS_80k )
- {
- hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 200;
- }
- else if ( sba_total_brate <= IVAS_96k )
- {
- hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 200;
- }
- else if ( sba_total_brate <= IVAS_128k )
- {
- hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
- hQMetaData->metadata_max_bits = 250;
- }
- else
- {
- hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC );
- hQMetaData->metadata_max_bits = MAX16B; /* no limit */
+ if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#if !defined( FIX_DTX_428 )
+ {
+ int16_t dir, j;
+ for ( dir = 0; dir < hQMetaData->no_directions; dir++ )
+ {
+ for ( j = 0; j < nbands_coded; j++ )
+ {
+ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0;
+ hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0;
+ }
+ }
+ }
+ }
+#endif
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ivas_get_dirac_sba_max_md_bits(
+ sba_total_brate,
+ &hQMetaData->bits_frame_nominal,
+ &hQMetaData->metadata_max_bits,
+ &hQMetaData->qmetadata_max_bit_req,
+ hQMetaData->q_direction[0].cfg.nbands );
+#else
+ if ( sba_total_brate <= IVAS_13k2 )
+ {
+ hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 70;
+ }
+ else if ( sba_total_brate <= IVAS_16k4 )
+ {
+ hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 80;
+ }
+ else if ( sba_total_brate <= IVAS_24k4 )
+ {
+ hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 103;
+ }
+ else if ( sba_total_brate <= IVAS_32k )
+ {
+ hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 214;
+ }
+ else if ( sba_total_brate <= IVAS_48k )
+ {
+ hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 240;
+ }
+ else if ( sba_total_brate <= IVAS_64k )
+ {
+ hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_80k )
+ {
+ hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_96k )
+ {
+ hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 200;
+ }
+ else if ( sba_total_brate <= IVAS_128k )
+ {
+ hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
+ hQMetaData->metadata_max_bits = 250;
+ }
+ else
+ {
+ hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC );
+ hQMetaData->metadata_max_bits = MAX16B; /* no limit */
+ }
- hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 );
- hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;
+ hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 );
+ hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;
+#endif
return error;
+#ifndef SBA_MODE_CLEAN_UP
}
if ( sba_total_brate > IVAS_SID_5k2 )
@@ -449,11 +647,17 @@ ivas_error ivas_dirac_sba_config(
}
if ( sba_total_brate >= IVAS_96k )
{
- if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK )
{
- return error;
+ int16_t no_dirs = 1;
+ if ( hodirac_flag )
+ {
+ no_dirs = 2;
+ }
+ if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
-
nbands_wb = 4;
}
else
@@ -481,7 +685,15 @@ ivas_error ivas_dirac_sba_config(
for ( i = 0; i < hQMetaData->no_directions; i++ )
{
hQMetaData->q_direction[i].cfg.search_effort = 1;
- hQMetaData->q_direction[i].cfg.start_band = nbands_wb;
+
+ if ( hodirac_flag )
+ {
+ hQMetaData->q_direction[i].cfg.start_band = 0;
+ }
+ else
+ {
+ hQMetaData->q_direction[i].cfg.start_band = nbands_wb;
+ }
}
*element_mode = IVAS_CPE_MDCT;
@@ -555,8 +767,8 @@ ivas_error ivas_dirac_sba_config(
assert( !"SBA number of transport channels must be 8 or lower" );
}
}
-
return error;
+#endif
}
@@ -785,6 +997,241 @@ void deindex_spherical_component(
}
+/*----------------------------------------------------------------
+ * calculate_hodirac_sector_parameters()
+ *
+ *
+ *-----------------------------------------------------------------*/
+
+void calculate_hodirac_sector_parameters(
+#ifdef FIX_485_STATIC_BUFFERS
+ DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */
+#endif
+ float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */
+ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */
+ const float beta, /* i : forgetting factor for average filtering */
+ const int16_t *band_grouping, /* i : indices of band groups */
+ const int16_t N_bands, /* i : number of bands (groups) */
+ const int16_t enc_param_start_band, /* i : first band to process */
+ float *azi, /* o : array of sector azimuth angles, flat */
+ float *ele, /* o : array of sector elevation angles, flat */
+ float *diff, /* o : array of sector diffuseness values, flat */
+ float *ene /* o : array of sector energy values, flat */
+)
+{
+ int16_t i_sec, i_bin, i_band;
+ float p_real, p_imag, normI, energy, tmp_diff;
+ float sec_I_vec_x[NUM_ANA_SECTORS];
+ float sec_I_vec_y[NUM_ANA_SECTORS];
+ float sec_I_vec_z[NUM_ANA_SECTORS];
+
+#ifndef FIX_485_STATIC_BUFFERS
+ static int16_t firstrun_sector_params = 1;
+
+ static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+
+ static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
+ static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
+#endif
+
+ for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ )
+ {
+
+ float *p_sec_I_vec_x = &sec_I_vec_x[i_sec];
+ float *p_sec_I_vec_y = &sec_I_vec_y[i_sec];
+ float *p_sec_I_vec_z = &sec_I_vec_z[i_sec];
+
+ const float *p_c_weights = c_weights;
+
+ float *p_ImagBuffer_0 = ImagBuffer[0];
+ float *p_ImagBuffer_1 = ImagBuffer[1];
+ float *p_ImagBuffer_2 = ImagBuffer[2];
+ float *p_ImagBuffer_3 = ImagBuffer[3];
+ float *p_ImagBuffer_4 = ImagBuffer[4];
+ float *p_ImagBuffer_5 = ImagBuffer[5];
+ float *p_ImagBuffer_6 = ImagBuffer[6];
+ float *p_ImagBuffer_8 = ImagBuffer[8];
+
+ float *p_RealBuffer_0 = RealBuffer[0];
+ float *p_RealBuffer_1 = RealBuffer[1];
+ float *p_RealBuffer_2 = RealBuffer[2];
+ float *p_RealBuffer_3 = RealBuffer[3];
+ float *p_RealBuffer_4 = RealBuffer[4];
+ float *p_RealBuffer_5 = RealBuffer[5];
+ float *p_RealBuffer_6 = RealBuffer[6];
+ float *p_RealBuffer_8 = RealBuffer[8];
+
+ for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ )
+ {
+ float *p_azi = &azi[i_sec * N_bands + i_band];
+ float *p_ele = &ele[i_sec * N_bands + i_band];
+ float *p_ene = &ene[i_sec * N_bands + i_band];
+
+ float *p_diff = &diff[i_sec * N_bands + i_band];
+#ifdef FIX_485_STATIC_BUFFERS
+ float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band];
+ float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band];
+
+ float *p_energy_smth = &hDirAC->energy_smth[i_sec][i_band];
+ float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band];
+ float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band];
+ float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band];
+#else
+ float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band];
+ float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band];
+
+ float *p_energy_smth = &energy_smth[i_sec][i_band];
+ float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band];
+ float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band];
+ float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band];
+#endif
+ *p_sec_I_vec_x = 0.f;
+ *p_sec_I_vec_y = 0.f;
+ *p_sec_I_vec_z = 0.f;
+ energy = 0.f;
+
+ if ( i_sec == 0 )
+ {
+ for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
+ {
+ float w = *( p_c_weights++ );
+ float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag;
+ float sec_w_real, sec_x_real, sec_y_real, sec_z_real;
+
+ sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 );
+ sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ );
+ sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ );
+ sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ );
+
+ sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 );
+ sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ );
+ sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ );
+ sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ );
+
+ p_real = sec_w_real * w;
+ p_imag = sec_w_imag * w;
+
+ *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag;
+ *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag;
+ *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag;
+
+ energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag +
+ sec_y_real * sec_y_real + sec_y_imag * sec_y_imag +
+ sec_z_real * sec_z_real + sec_z_imag * sec_z_imag );
+ }
+ }
+ else
+ {
+ for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
+ {
+ float w = *( p_c_weights++ );
+ float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag;
+ float sec_w_real, sec_x_real, sec_y_real, sec_z_real;
+
+ sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 );
+ sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ );
+ sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ );
+ sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ );
+
+ sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 );
+ sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ );
+ sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ );
+ sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ );
+
+ p_real = sec_w_real * w;
+ p_imag = sec_w_imag * w;
+
+ *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag;
+ *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag;
+ *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag;
+
+ energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag +
+ sec_y_real * sec_y_real + sec_y_imag * sec_y_imag +
+ sec_z_real * sec_z_real + sec_z_imag * sec_z_imag );
+ }
+ }
+#ifdef FIX_485_STATIC_BUFFERS
+ if ( hDirAC->firstrun_sector_params )
+#else
+ if ( firstrun_sector_params )
+#endif
+ {
+ *p_sec_I_vec_smth_x = *p_sec_I_vec_x;
+ *p_sec_I_vec_smth_y = *p_sec_I_vec_y;
+ *p_sec_I_vec_smth_z = *p_sec_I_vec_z;
+ *p_energy_smth = energy;
+ }
+ else
+ {
+ float w = ( 1.0f - beta );
+ *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x;
+ *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y;
+ *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z;
+ *p_energy_smth = w * energy + beta * *p_energy_smth;
+ }
+
+ if ( energy < EPSILON )
+ {
+ *p_azi = 0.f;
+ *p_ele = 0.f;
+ *p_ene = 0.f;
+ *p_diff = 1.f;
+ }
+ else
+ {
+ normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x +
+ *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y +
+ *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z );
+ *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI;
+ *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI;
+ *p_ene = *p_energy_smth;
+ *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON );
+ }
+
+ tmp_diff = *p_diff;
+
+ if ( tmp_diff < 0.0f )
+ {
+ *p_diff = 0.f;
+ }
+ if ( tmp_diff > 0.5f )
+ {
+#ifdef FIX_485_STATIC_BUFFERS
+ if ( hDirAC->firstrun_sector_params )
+#else
+ if ( firstrun_sector_params )
+#endif
+ {
+ *p_azi = 0.f;
+ *p_ele = 0.f;
+ }
+ else
+ {
+ *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev;
+ *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev;
+ }
+ }
+ else
+ {
+ *p_azi_prev = *p_azi;
+ *p_ele_prev = *p_ele;
+ }
+ }
+ }
+
+#ifdef FIX_485_STATIC_BUFFERS
+ hDirAC->firstrun_sector_params = 0;
+#else
+ firstrun_sector_params = 0;
+#endif
+
+ return;
+}
+
+
/*-----------------------------------------------------------------------*
* Local functions
*-----------------------------------------------------------------------*/
@@ -796,7 +1243,7 @@ void deindex_spherical_component(
* deindex the spherical index for more than 2 bits for the spherical grid
*----------------------------------------------------------------------*/
-/* !r: decoded elevation index */
+/*! r: decoded elevation index */
static uint16_t deindex_sph_idx_general(
const int16_t idx_sph, /* i : spherical index */
const int16_t no_bits, /* i : number of bits in the spherical grid*/
diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h
index afdc4ffcbc3c6ecac30ec69ea5129bb546004df6..901877d3084e1b0ebe5976b66eacff50f7fccedb 100644
--- a/lib_com/ivas_error.h
+++ b/lib_com/ivas_error.h
@@ -56,7 +56,7 @@ typedef enum
IVAS_ERR_INVALID_SAMPLING_RATE,
IVAS_ERR_NOT_CONFIGURED,
IVAS_ERR_INVALID_STEREO_MODE,
- IVAS_ERR_INVALID_CICP_INDEX,
+ IVAS_ERR_INVALID_CICP_INDEX, /* ToDo: rename, CICP not used in IVAS anymore */
IVAS_ERR_INVALID_BITRATE,
IVAS_ERR_INVALID_MASA_CONFIG,
IVAS_ERR_TOO_MANY_INPUTS,
@@ -72,7 +72,6 @@ typedef enum
IVAS_ERR_INVALID_SPAR_CONFIG,
IVAS_ERR_WRONG_PARAMS,
IVAS_ERR_INIT_ERROR,
- IVAS_ERR_DECODER_ERROR,
IVAS_ERR_WRONG_MODE,
IVAS_ERR_INVALID_OUTPUT_FORMAT,
IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED,
@@ -81,11 +80,10 @@ typedef enum
#endif
IVAS_ERR_INVALID_HRTF,
IVAS_ERR_INVALID_INPUT_FORMAT,
- IVAS_ERR_INVALID_INDEX,
+ IVAS_ERR_INVALID_INDEX, /* ToDo: should be merged with IVAS_ERR_INDEX_OUT_OF_BOUNDS */
IVAS_ERR_NOT_SUPPORTED_OPTION,
IVAS_ERR_NOT_IMPLEMENTED,
IVAS_ERR_WAITING_FOR_BITSTREAM,
- IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH,
IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT,
IVAS_ERR_ISM_INVALID_METADATA_VALUE,
IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE,
@@ -95,6 +93,9 @@ typedef enum
#ifdef DEBUG_AGC_ENCODER_CMD_OPTION
IVAS_ERR_INVALID_AGC,
#endif
+#ifdef VARIABLE_SPEED_DECODING
+ IVAS_ERR_VS_FRAME_NEEDED,
+#endif
#endif
/*----------------------------------------*
@@ -131,7 +132,7 @@ typedef enum
* renderer (lib_rend only) *
*----------------------------------------*/
- IVAS_ERR_NUM_CHANNELS_UNKNOWN,
+ IVAS_ERR_NUM_CHANNELS_UNKNOWN = 0x6000,
IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT,
IVAS_ERR_INVALID_INPUT_ID,
IVAS_ERR_WRONG_NUM_CHANNELS,
@@ -182,6 +183,68 @@ static inline const char *ivas_error_to_string( ivas_error error_code )
return "Parse error";
case IVAS_ERR_END_OF_FILE:
return "End of file";
+ case IVAS_ERR_WRONG_PARAMS:
+ return "Wrong function parameters";
+ case IVAS_ERR_INVALID_BANDWIDTH:
+ return "Invalid bandwidth";
+ case IVAS_ERR_INVALID_DTX_UPDATE_RATE:
+ return "Invalid DTX update rate";
+ case IVAS_ERR_NOT_CONFIGURED:
+ return "Handle has not been configured";
+ case IVAS_ERR_INVALID_STEREO_MODE:
+ return "Invalid stereo mode";
+ case IVAS_ERR_INVALID_CICP_INDEX:
+ return "Invalid speaker layout";
+ case IVAS_ERR_INVALID_BITRATE:
+ return "Invalid bitrate";
+ case IVAS_ERR_INVALID_MASA_CONFIG:
+ return "Invalid MASA config";
+ case IVAS_ERR_TOO_MANY_INPUTS:
+ return "Too many object inputs provided";
+ case IVAS_ERR_INDEX_OUT_OF_BOUNDS:
+ return "Index out of bounds";
+ case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED:
+ return "Reconfigure not supported";
+ case IVAS_ERR_INVALID_FEC_OFFSET:
+ return "Invalid FEC offset";
+ case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE:
+ return "Invalid input buffer size";
+ case IVAS_ERR_DTX_NOT_SUPPORTED:
+ return "DTX is not supported in this IVAS format and element mode";
+ case IVAS_ERR_UNEXPECTED_NULL_POINTER:
+ return "Unexpected NULL pointer";
+ case IVAS_ERR_METADATA_NOT_EXPECTED:
+ return "Metadata input not expected for current configuration";
+#ifdef DEBUGGING
+ case IVAS_ERR_INVALID_FORCE_MODE:
+ return "Invalid force mode";
+#endif
+ case IVAS_ERR_NOT_IMPLEMENTED:
+ return "Not implemented";
+ case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT:
+ return "Invalid metadata file format";
+ case IVAS_ERR_ISM_INVALID_METADATA_VALUE:
+ return "Invalid metadata value provided";
+ case IVAS_ERR_NOT_SUPPORTED_OPTION:
+ return "Option not supported in this set-up";
+ case IVAS_ERR_INIT_ERROR:
+ return "Initialization error";
+ case IVAS_ERR_INVALID_BITSTREAM:
+ return "Invalid bitstream";
+ case IVAS_ERR_WRONG_MODE:
+ return "Wrong mode";
+ case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED:
+ return "Head rotation not supported";
+ case IVAS_ERR_INVALID_HRTF:
+ return "Unsupported HRTF filter set";
+ case IVAS_ERR_INVALID_INPUT_FORMAT:
+#ifdef FIX_510
+ return "Invalid input format";
+#else
+ return "Invalid format of input bitstream";
+#endif
+ case IVAS_ERR_INVALID_INDEX:
+ return "Invalid index";
default:
break;
}
diff --git a/lib_com/ivas_error_utils.h b/lib_com/ivas_error_utils.h
index 034369656bc8e54c703e986e3479a514eafa1c2b..b9a6b3f872443e35368c4d802054d6f47eaafc42 100644
--- a/lib_com/ivas_error_utils.h
+++ b/lib_com/ivas_error_utils.h
@@ -84,6 +84,7 @@ static inline ivas_error ivas_error_wrapper( const ivas_error error_code, const
fprintf( stderr, "\n\nIn function: %s(), %s:%d\n\n", function, file, line );
// assert( 0 );
+
return error_code;
}
#else
diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c
index 3e0d68049a882a32013c749048d986c11953b09f..dbbce9afe42e525db5d25e9cbe2e5f9126b24ce9 100644
--- a/lib_com/ivas_fb_mixer.c
+++ b/lib_com/ivas_fb_mixer.c
@@ -99,13 +99,17 @@ static int16_t ivas_get_num_bands(
*---------------------------------------------------------------------*/
ivas_error ivas_fb_set_cfg(
- IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */
- const int16_t ivas_format, /* i : IVAS format */
- const SBA_MODE sba_mode, /* i : SBA mode */
- const int16_t num_in_chans, /* i : number of FB input channels */
- const int16_t num_out_chans, /* i : number of FB output channels*/
- const int16_t active_w_mixing, /* i : active_w_mixing flag */
- const int32_t sampling_rate /* i : sampling rate */
+ IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */
+ const int16_t ivas_format, /* i : IVAS format */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
+ const int16_t num_in_chans, /* i : number of FB input channels */
+ const int16_t num_out_chans, /* i : number of FB output channels */
+ const int16_t active_w_mixing, /* i : active_w_mixing flag */
+ const int32_t sampling_rate /* i : sampling rate */
+ ,
+ const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/
)
{
IVAS_FB_CFG *pFb_cfg;
@@ -117,6 +121,7 @@ ivas_error ivas_fb_set_cfg(
pFb_cfg->num_in_chans = num_in_chans;
pFb_cfg->num_out_chans = num_out_chans;
+ pFb_cfg->nchan_fb_in = nchan_fb_in;
pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */
pFb_cfg->active_w_mixing = active_w_mixing;
@@ -132,11 +137,14 @@ ivas_error ivas_fb_set_cfg(
{
pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS );
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS );
pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS );
pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS );
+#ifndef SBA_MODE_CLEAN_UP
}
else /* SBA_MODE_DIRAC */
{
@@ -145,6 +153,7 @@ ivas_error ivas_fb_set_cfg(
/* extra SPAR/DirAC synchro delay */
pFb_cfg->prior_input_length += NS2SA( sampling_rate, DELAY_FB_1_NS );
}
+#endif
}
else if ( ivas_format == MASA_FORMAT )
{
@@ -156,7 +165,7 @@ ivas_error ivas_fb_set_cfg(
{
pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS );
pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS );
- pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + 3 * NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS );
+ pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS );
}
*pFb_cfg_out = pFb_cfg;
@@ -215,11 +224,11 @@ ivas_error ivas_FB_mixer_open(
}
else if ( fb_cfg->active_w_mixing )
{
- num_chs_alloc = fb_cfg->num_in_chans;
+ num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
}
else
{
- num_chs_alloc = fb_cfg->num_out_chans;
+ num_chs_alloc = 1; /* only W channel processed for predicting YZX */
}
for ( i = 0; i < num_chs_alloc; i++ )
@@ -251,7 +260,7 @@ ivas_error ivas_FB_mixer_open(
}
else
{
- num_chs_alloc = fb_cfg->num_in_chans;
+ num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
}
for ( i = 0; i < num_chs_alloc; i++ )
@@ -266,8 +275,7 @@ ivas_error ivas_FB_mixer_open(
if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) )
{
float *pTemp_mem;
-
- if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL )
+ if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" );
}
@@ -378,11 +386,11 @@ void ivas_FB_mixer_close(
}
else if ( fb_cfg->active_w_mixing )
{
- num_chs_alloc = fb_cfg->num_in_chans;
+ num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
}
else
{
- num_chs_alloc = fb_cfg->num_out_chans;
+ num_chs_alloc = 1; /* only W channel processed for predicting YZX */
}
if ( hFbMixer != NULL )
@@ -407,8 +415,10 @@ void ivas_FB_mixer_close(
}
else
{
- num_chs_alloc = fb_cfg->num_in_chans;
+ num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in );
}
+
+
for ( i = 0; i < num_chs_alloc; i++ )
{
free( hFbMixer->ppFilterbank_prior_input[i] );
@@ -486,7 +496,8 @@ void ivas_fb_mixer_pcm_ingest(
float pcm_in[][L_FRAME48k], /* i : input audio channels */
float **ppOut_pcm, /* o : output audio channels */
const int16_t frame_len /* i : frame length */
-)
+ ,
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] )
{
int16_t i;
int16_t num_chs_ingest;
@@ -498,13 +509,13 @@ void ivas_fb_mixer_pcm_ingest(
}
else
{
- num_chs_ingest = fb_cfg->num_out_chans;
+ num_chs_ingest = 1; /* forward Filterbank MDFT only on W */
}
for ( i = 0; i < fb_cfg->num_in_chans; i++ )
{
mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len );
- mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len );
+ mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len );
}
for ( i = 0; i < num_chs_ingest; i++ )
@@ -523,14 +534,18 @@ void ivas_fb_mixer_pcm_ingest(
*-----------------------------------------------------------------------------------------*/
void ivas_fb_mixer_update_prior_input(
- IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */
- float *pcm_in[], /* i : input audio channels */
- const int16_t length /* i : length of time slot */
+ IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */
+ float *pcm_in[], /* i : input audio channels */
+ const int16_t length /* i : length of time slot */
+ ,
+ const int16_t nchan_fb_in /* i : number of analysis channels */
)
{
int16_t i;
- for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ )
+ for ( i = 0; i <
+ nchan_fb_in;
+ i++ )
{
mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length );
mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length );
@@ -553,6 +568,8 @@ void ivas_fb_mixer_get_windowed_fr(
float *frame_f_imag[], /* o : imag freq domain values */
const int16_t length, /* i : number of new samples in time slot */
const int16_t mdft_len /* i : MDFT frame length */
+ ,
+ const int16_t nchan_fb_in /* i : number of analysis channels */
)
{
int16_t ch_idx, j, offset, rev_offset;
@@ -567,7 +584,9 @@ void ivas_fb_mixer_get_windowed_fr(
rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset );
set_zero( fr_in_block, offset );
- for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ )
+ for ( ch_idx = 0; ch_idx <
+ nchan_fb_in;
+ ch_idx++ )
{
mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset );
mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples );
@@ -692,6 +711,7 @@ void ivas_fb_mixer_process(
{
int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i];
int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i];
+
float mixer_const = hFbMixer->prior_mixer[ch][j][i];
pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i];
@@ -764,7 +784,6 @@ void ivas_fb_mixer_get_in_out_mapping(
for ( i = 1; i < fb_cfg->num_out_chans; i++ )
{
in_out_mixer_map[i][0] = 1;
- in_out_mixer_map[i][order[i]] = 1;
}
}
}
diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c
index f8eaa8d05f0dc27fde7ed486add14a3f3b7e2805..a28fb77d20ed6fa9c379ac903dca440a83a46a23 100644
--- a/lib_com/ivas_ism_com.c
+++ b/lib_com/ivas_ism_com.c
@@ -88,15 +88,16 @@ static void bitbudget_to_brate(
*-------------------------------------------------------------------*/
ivas_error ivas_ism_config(
- const int32_t ism_total_brate, /* i : ISM total bitrate */
- const int16_t nchan_transport, /* i : number of transport channels */
- const int16_t num_obj, /* i : number of objects */
- ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
- const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */
- const int16_t ism_imp[], /* i : ISM importance flags */
- int32_t element_brate[], /* o : element bitrate per object */
- int32_t total_brate[], /* o : total bitrate per object */
- int16_t nb_bits_metadata[] /* i/o: number of metadata bits */
+ const int32_t ism_total_brate, /* i : ISM total bitrate */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t nchan_ism, /* i : number of objects */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */
+ const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */
+ const int16_t ism_imp[], /* i : ISM importance flags */
+ int32_t element_brate[], /* o : element bitrate per object */
+ int32_t total_brate[], /* o : total bitrate per object */
+ int16_t nb_bits_metadata[] /* i/o: number of metadata bits */
)
{
int16_t ch;
@@ -132,13 +133,16 @@ ivas_error ivas_ism_config(
/* count ISM common signaling bits */
if ( hIsmMeta != NULL )
{
-#ifdef TD5
if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
{
nb_bits_metadata[0] += ISM_EXTENDED_METADATA_BITS;
+
+ if ( ism_extended_metadata_flag )
+ {
+ nb_bits_metadata[0] += ISM_METADATA_IS_NDP_BITS;
+ }
}
-#endif
- nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + num_obj;
+ nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + nchan_ism;
for ( ch = 0; ch < n_ISms; ch++ )
{
@@ -336,11 +340,11 @@ void ivas_ism_reset_metadata(
{
hIsmMeta->azimuth = 0.0f;
hIsmMeta->elevation = 0.0f;
-#ifdef TD5
hIsmMeta->yaw = 0.0f;
hIsmMeta->pitch = 0.0f;
hIsmMeta->radius = 1.0f;
-#endif
+ hIsmMeta->ism_metadata_flag = 0;
+ hIsmMeta->non_diegetic_flag = 0;
return;
}
@@ -356,7 +360,6 @@ void ivas_ism_reset_metadata_API(
ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */
)
{
- hIsmMeta->ism_metadata_flag = 0;
ivas_ism_reset_metadata( hIsmMeta );
return;
@@ -371,10 +374,12 @@ void ivas_ism_reset_metadata_API(
/*! r: index of the winning codeword */
int16_t ism_quant_meta(
- const float val, /* i : scalar value to quantize */
- float *valQ, /* o : quantized value */
- const float borders[], /* i : level borders */
- const int16_t cbsize /* i : codebook size */
+ const float val, /* i : scalar value to quantize */
+ float *valQ, /* o : quantized value */
+ const float borders[], /* i : level borders */
+ const float q_step, /* i : quantization step */
+ const float q_step_border, /* i : quantization step at the border */
+ const int16_t cbsize /* i : codebook size */
)
{
int16_t idx, idx_start;
@@ -384,19 +389,19 @@ int16_t ism_quant_meta(
{
qlow = borders[0];
idx_start = 0;
- step = ISM_Q_STEP_BORDER;
+ step = q_step_border;
}
else if ( val <= borders[2] )
{
qlow = borders[1];
- idx_start = (int16_t) ( ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER );
- step = ISM_Q_STEP;
+ idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border );
+ step = q_step;
}
else
{
qlow = borders[2];
- idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER );
- step = ISM_Q_STEP_BORDER;
+ idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border );
+ step = q_step_border;
}
idx = idx_start + (int16_t) max( 0.f, min( cbsize - 1, ( ( val - qlow ) / step + 0.5f ) ) );
@@ -414,31 +419,33 @@ int16_t ism_quant_meta(
/*! r: dequantized value */
float ism_dequant_meta(
- const int16_t idx, /* i : quantizer index */
- const float borders[], /* i : level borders */
- const int16_t cbsize /* i : codebook size */
+ const int16_t idx, /* i : quantizer index */
+ const float borders[], /* i : level borders */
+ const float q_step, /* i : quantization step */
+ const float q_step_border, /* i : quantization step at the border */
+ const int16_t cbsize /* i : codebook size */
)
{
int16_t idx_start;
float qlow, step, valQ;
- if ( idx <= ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER )
+ if ( idx <= ( borders[1] - borders[0] ) / q_step_border )
{
qlow = borders[0];
idx_start = 0;
- step = ISM_Q_STEP_BORDER;
+ step = q_step_border;
}
- else if ( idx <= cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER )
+ else if ( idx <= cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border )
{
qlow = borders[1];
- idx_start = (int16_t) ( ( borders[1] - borders[0] ) / ISM_Q_STEP_BORDER );
- step = ISM_Q_STEP;
+ idx_start = (int16_t) ( ( borders[1] - borders[0] ) / q_step_border );
+ step = q_step;
}
else
{
qlow = borders[2];
- idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / ISM_Q_STEP_BORDER );
- step = ISM_Q_STEP_BORDER;
+ idx_start = (int16_t) ( cbsize - 1 - ( borders[3] - borders[2] ) / q_step_border );
+ step = q_step_border;
}
valQ = ( idx - idx_start ) * step + qlow;
@@ -454,13 +461,13 @@ float ism_dequant_meta(
* ---------------------------------------------------------------*/
void ivas_param_ism_config(
- PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */
+ PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */
+ const int16_t nchan_obj /* i : number of ISM channels */
)
{
- int16_t i, num_obj;
+ int16_t i;
hParamIsm->nbands = MAX_PARAM_ISM_NBANDS;
- num_obj = hParamIsm->num_obj;
for ( i = 0; i < hParamIsm->nbands; i++ )
{
@@ -468,7 +475,7 @@ void ivas_param_ism_config(
}
/* for elevation zero compute the max azi quantization indices */
- for ( i = 0; i < num_obj; i++ )
+ for ( i = 0; i < nchan_obj; i++ )
{
hParamIsm->last_az_diff[i] = 0;
hParamIsm->last_az_sgn[i] = 1;
@@ -535,3 +542,66 @@ void ivas_ism_metadata_close(
return;
}
+
+
+/*-------------------------------------------------------------------*
+ * update_last_metadata()
+ *
+ * Store last metadata values
+ *-------------------------------------------------------------------*/
+
+void update_last_metadata(
+ const int16_t nchan_ism, /* i : number of objects */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t updt_flag[] /* i : last metadata update flag */
+)
+{
+ int16_t ch;
+
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ if ( updt_flag[ch] == 1 )
+ {
+ hIsmMeta[ch]->last_azimuth = hIsmMeta[ch]->azimuth;
+ hIsmMeta[ch]->last_elevation = hIsmMeta[ch]->elevation;
+ }
+ }
+
+ return;
+}
+
+
+/*----------------------------------------------------------------*
+ * ivas_get_ism_sid_quan_bitbudget()
+ *
+ * Set quantization bits based on the number of coded objects
+ *----------------------------------------------------------------*/
+
+void ivas_get_ism_sid_quan_bitbudget(
+ const int16_t nchan_ism, /* i : number of objects */
+ int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */
+ int16_t *nBits_elevation, /* o : number of Q bits for elevation */
+ float *q_step, /* o : quantization step */
+ float *q_step_border, /* o : quantization step at the border */
+ int16_t *nBits_coh, /* o : number of Q bits for coherence */
+ int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */
+)
+{
+ *nBits_azimuth = ISM_DTX_AZI_BITS_HIGH;
+ *nBits_elevation = ISM_DTX_ELE_BITS_HIGH;
+ *q_step = ISM_Q_STEP_HIGH;
+ *q_step_border = ISM_Q_STEP_BORDER_HIGH;
+ *nBits_coh = ISM_DTX_COH_SCA_BITS;
+ *nBits_sce_id = 1;
+
+ if ( nchan_ism >= 3 )
+ {
+ *nBits_azimuth = ISM_DTX_AZI_BITS_LOW;
+ *nBits_elevation = ISM_DTX_ELE_BITS_LOW;
+ *q_step = ISM_Q_STEP_LOW;
+ *q_step_border = ISM_Q_STEP_BORDER_LOW;
+ *nBits_sce_id = 2;
+ }
+
+ return;
+}
diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c
index bd0336ad432f868ea1b25942446abd122217eb76..22caa5d2cf177e64ef47ef671831b4e9b32bb657 100644
--- a/lib_com/ivas_masa_com.c
+++ b/lib_com/ivas_masa_com.c
@@ -49,7 +49,20 @@
*---------------------------------------------------------------*/
#define MASA_EXTRA_BAND_META_BITS 40
-#define MASA_SMALL_INC_META_BITS 10
+
+#define MASA_SMALL_INC_META_BITS 10
+
+
+#ifdef HR_METADATA
+/*---------------------------------------------------------------
+ * Local prototypes
+ *---------------------------------------------------------------*/
+
+static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat );
+
+static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n );
+
+#endif
/*---------------------------------------------------------------
@@ -313,22 +326,31 @@ void masa_sample_rate_band_correction(
MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */
int16_t *band_mapping, /* i/o: Band mapping used and modified */
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */
- const int32_t sampling_rate /* i : Sampling rate */
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
- ,
- MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */
+#ifdef FIX_HBR_MASAMETA
+ const uint8_t maxBand, /* i : max band */
+ uint8_t is_encoder, /* i: signals if called at encoder */
+#else
+ const int32_t sampling_rate, /* i : Sampling rate */
#endif
+ MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */
)
{
uint8_t band, sf;
+#ifdef FIX_HBR_MASAMETA
+ int16_t highBand;
+#else
int16_t maxBin, highBand, maxBand;
+#endif
uint8_t numBands48k;
+#ifndef FIX_HBR_MASAMETA
if ( sampling_rate == 48000 )
{
return;
}
+#endif
+#ifndef FIX_HBR_MASAMETA
/* Find maximum band usable at this sample rate */
maxBin = (int16_t) ( CLDFB_NO_CHANNELS_MAX * sampling_rate / 48000 );
maxBand = 0;
@@ -337,7 +359,7 @@ void masa_sample_rate_band_correction(
maxBand++;
}
maxBand--;
-
+#endif
numBands48k = config->numCodingBands;
for ( band = 1; band < config->numCodingBands + 1; band++ )
@@ -348,6 +370,19 @@ void masa_sample_rate_band_correction(
{
config->numCodingBands = band;
hQMetaData->numCodingBands = band;
+#ifdef FIX_HBR_MASAMETA
+ if ( is_encoder )
+ {
+ if ( hQMetaData->q_direction->cfg.nbands > band )
+ {
+ hQMetaData->q_direction->cfg.nbands = band;
+ }
+ if ( hQMetaData->no_directions == 2 && hQMetaData->q_direction[1].cfg.nbands > band )
+ {
+ hQMetaData->q_direction[1].cfg.nbands = band;
+ }
+ }
+#endif
band_mapping[band] = maxBand;
break;
}
@@ -390,13 +425,16 @@ void masa_sample_rate_band_correction(
hQMetaData->twoDirBands[band] = 0;
}
}
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
if ( hExtOutMeta != NULL )
{
/* in decoder, zero the EXT out MASA meta buffer */
for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
{
+#ifdef FIX_HBR_MASAMETA
+ for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ )
+#else
for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ )
+#endif
{
hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT;
hExtOutMeta->directToTotalRatio[0][sf][band] = 0u;
@@ -411,7 +449,358 @@ void masa_sample_rate_band_correction(
}
}
}
-#endif
return;
}
+
+
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------------
+ * index_theta_phi_16()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+/*! r: output index for direction */
+uint16_t index_theta_phi_16(
+ float *p_theta, /* i/o: input elevation to be indexed */
+ float *p_phi, /* i/o: input azimuth to be indexed */
+ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */
+)
+{
+ float abs_theta;
+ int16_t sign_th, id_phi, id_th;
+ uint16_t idx_sph;
+ uint16_t cum_n;
+ float theta_hat, phi_hat;
+ float theta, phi;
+
+ theta = *p_theta;
+ phi = *p_phi;
+ phi_hat = 0;
+ theta_hat = 0;
+ phi = phi + 180;
+
+ if ( theta < 0 )
+ {
+ abs_theta = -theta;
+ sign_th = -1;
+ }
+ else
+ {
+ abs_theta = theta;
+ sign_th = 1;
+ }
+
+ id_th = quantize_theta_masa( abs_theta, gridData->no_theta, &theta_hat );
+ if ( gridData->no_theta > 1 )
+ {
+ if ( gridData->no_phi[id_th] > 1 )
+ {
+ id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] );
+ }
+ else
+ {
+ id_phi = 0;
+ phi_hat = 180;
+ }
+ }
+ else
+ {
+ id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] );
+ }
+ *p_theta = sign_th * theta_hat;
+ *p_phi = phi_hat - 180;
+
+ /* Starting from Equator, alternating positive and negative */
+ if ( id_th == 0 )
+ {
+ idx_sph = id_phi;
+ }
+ else
+ {
+ if ( id_th == gridData->no_theta - 1 )
+ {
+ idx_sph = 65534 + ( sign_th < 0 );
+ }
+ else
+ {
+ theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f );
+ if ( id_th == 1 )
+ {
+ cum_n = 2 * (uint16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) );
+ }
+ else
+ {
+ cum_n = 2 * (uint16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) );
+ }
+
+ cum_n += gridData->no_phi[0];
+
+ if ( sign_th > 0 )
+ {
+ cum_n -= 2 * gridData->no_phi[id_th];
+ }
+ else
+ {
+ cum_n -= gridData->no_phi[id_th];
+ }
+ idx_sph = cum_n + id_phi;
+ }
+ }
+
+ return idx_sph;
+}
+
+
+/*-------------------------------------------------------------------------
+ * quantize_phi_masa()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+/*! r: output index */
+static int16_t quantize_theta_masa(
+ float x, /* i : theta value to be quantized */
+ const int16_t no_cb, /* i : number of codewords */
+ float *xhat /* o : quantized value */
+)
+{
+ int16_t imin;
+ float diff1, diff2;
+
+ imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f );
+
+ if ( imin >= no_cb - 1 )
+ {
+ imin = no_cb - 1;
+ diff1 = x - 90;
+ diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 );
+ if ( fabsf( diff1 ) > fabsf( diff2 ) )
+ {
+ imin--;
+ *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG;
+ }
+ else
+ {
+ *xhat = 90;
+ }
+ }
+ else
+ {
+ *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG;
+ }
+
+ return imin;
+}
+
+
+/*-------------------------------------------------------------------------
+ * quantize_phi_masa()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+/*! r: index azimuth */
+static int16_t quantize_phi_masa(
+ float phi, /* i : azimuth value */
+ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */
+ float *phi_hat, /* o : quantized azimuth */
+ const int16_t n /* i : azimuth codebook size */
+)
+{
+ int16_t id_phi;
+ float dd;
+ float delta_phi;
+
+ delta_phi = 360.0f / (float) n;
+
+ if ( n == 1 )
+ {
+ *phi_hat = 0;
+
+ return 0;
+ }
+
+ if ( flag_delta == 1 )
+ {
+ dd = delta_phi / 2.0f;
+ }
+ else
+ {
+ dd = 0;
+ }
+
+ id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi );
+
+ if ( id_phi == n )
+ {
+ id_phi = 0;
+ }
+
+ if ( id_phi == -1 )
+ {
+ id_phi = n - 1;
+ }
+
+ *phi_hat = id_phi * delta_phi + dd;
+
+ return id_phi;
+}
+
+
+/*-------------------------------------------------------------------------
+ * deindex_sph_idx()
+ *
+ * deindex the MASA metadata from the input metadata file
+ *------------------------------------------------------------------------*/
+
+void deindex_sph_idx(
+ const uint16_t sphIndex, /* i : Spherical index */
+ const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */
+ float *theta, /* o : Elevation */
+ float *phi /* o : Azimuth */
+)
+{
+ float ba_crt, del_crt, div_crt, a4_crt;
+ float estim;
+ int32_t base_low, base_up;
+ int16_t n_crt;
+ int16_t id_th;
+ int16_t sign_theta;
+ int16_t id_phi;
+ int16_t no_th = gridData->no_theta;
+ const int16_t *n = gridData->no_phi;
+ const float ba[3] = {
+ 2.137991118026424e+02f,
+ 1.244854404591542e+02f,
+ 1.228408647140870e+02f,
+ };
+ const float del[3] = { 7.998262115303199e+05f, 1.300883976959332e+06f, 1.424072242426373e+06f };
+ const float div[3] = { -0.237662341081474f, -0.100938185496887f, -0.092050209205032f };
+ const float a4[3] = { -8.415300425381099f, -19.814106922515204f, -21.727272727270197f };
+ const uint16_t limit_index1 = 64964, limit_index2 = 47870;
+
+ if ( sphIndex >= limit_index1 )
+ {
+ ba_crt = ba[2];
+ div_crt = div[2];
+ a4_crt = a4[2];
+ del_crt = del[2];
+ }
+ else if ( sphIndex >= limit_index2 )
+ {
+ ba_crt = ba[1];
+ div_crt = div[1];
+ a4_crt = a4[1];
+ del_crt = del[1];
+ }
+ else
+ {
+ ba_crt = ba[0];
+ div_crt = div[0];
+ a4_crt = a4[0];
+ del_crt = del[0];
+ }
+ estim = ba_crt + div_crt * sqrtf( del_crt + a4_crt * sphIndex );
+
+ if ( estim > MASA_NO_CIRCLES )
+ {
+ estim = MASA_NO_CIRCLES;
+ }
+
+ assert( estim > 0 );
+ id_th = (int16_t) roundf( estim ) - 1;
+ if ( id_th < 0 )
+ {
+ id_th = 0;
+ }
+
+ if ( id_th == 0 )
+ {
+ base_low = 0;
+ base_up = n[0];
+ }
+ else
+ {
+ estim = MASA_ANGLE_AT_EQUATOR * (float) ( id_th - 0.5f );
+ base_low = n[0];
+ if ( id_th >= 2 )
+ {
+ if ( id_th == 2 )
+ {
+ base_low += 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) );
+ }
+ else
+ {
+ base_low += 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) );
+ }
+ }
+ base_up = base_low + 2 * n[id_th];
+ }
+
+ sign_theta = 1;
+
+ n_crt = n[id_th];
+ if ( sphIndex < base_low )
+ {
+ id_th--;
+ n_crt = n[id_th];
+ if ( id_th == 0 )
+ {
+ base_low = 0;
+ base_up = n_crt;
+ }
+ else
+ {
+ base_up = base_low;
+ base_low -= 2 * n[id_th];
+ }
+ assert( sphIndex >= base_low );
+ }
+ else if ( sphIndex >= base_up )
+ {
+ id_th++;
+ n_crt = n[id_th];
+ base_low = base_up;
+ base_up += 2 * n_crt;
+ assert( sphIndex < base_up );
+ }
+
+ id_phi = (int16_t) ( sphIndex - base_low );
+ if ( sphIndex - base_low >= n_crt )
+ {
+ id_phi -= n_crt;
+ sign_theta = -1;
+ }
+
+ if ( id_th == 0 )
+ {
+ *theta = 0.f;
+ *phi = (float) sphIndex * 360 / (float) n_crt - 180;
+ }
+ else
+ {
+ if ( id_th == no_th - 1 )
+ {
+ id_phi = 0;
+ *phi = -180;
+ *theta = 90 * (float) sign_theta;
+ }
+ else
+ {
+ *theta = id_th * MASA_ANGLE_AT_EQUATOR_DEG * (float) sign_theta;
+ if ( id_th % 2 == 0 )
+ {
+ *phi = (float) id_phi * 360 / (float) n_crt - 180;
+ }
+ else
+ {
+ *phi = ( (float) id_phi + 0.5f ) * 360 / (float) n_crt - 180;
+ }
+ }
+ }
+
+ return;
+}
+#endif
diff --git a/lib_com/ivas_mc_com.c b/lib_com/ivas_mc_com.c
index 027b68768668a713263e85509179d2a48df6ff0a..0001f39704e1eaebe67b02524461d5a2284b832f 100644
--- a/lib_com/ivas_mc_com.c
+++ b/lib_com/ivas_mc_com.c
@@ -103,10 +103,14 @@ MC_MODE ivas_mc_mode_select(
{
mc_mode = MC_MODE_MCMASA;
}
- else if ( total_brate < IVAS_192k )
+ else if ( total_brate < IVAS_160k )
{
mc_mode = MC_MODE_PARAMMC;
}
+ else if ( total_brate < IVAS_192k )
+ {
+ mc_mode = MC_MODE_PARAMUPMIX;
+ }
break;
default:
assert( 0 && "LS Setup not supported or defined for MC mode!\n" );
diff --git a/lib_com/ivas_mct_com.c b/lib_com/ivas_mct_com.c
index 5ef4d294781b5027c1db1eeeeca326c40078784f..97c5f5dd8c982fda7ff0b57fc6507869fb957d94 100644
--- a/lib_com/ivas_mct_com.c
+++ b/lib_com/ivas_mct_com.c
@@ -66,11 +66,6 @@ void splitAvailableBitsMCT(
int16_t min_chan_bits[MCT_MAX_CHANNELS], min_bits_tot, remaining_bits;
int16_t core[MCT_MAX_CHANNELS];
MCT_CHAN_MODE mct_chan_mode[MCT_MAX_CHANNELS];
- int16_t num_lfe;
- int16_t lfe_channel;
-
- num_lfe = 0;
- lfe_channel = -1;
min_bits_tot = 0;
for ( i = 0; i < nchan; i++ )
@@ -85,18 +80,12 @@ void splitAvailableBitsMCT(
mct_chan_mode[i] = ( (Decoder_State *) sts[i] )->mct_chan_mode;
core[i] = ( (Decoder_State *) sts[i] )->core;
}
-
- if ( mct_chan_mode[i] == MCT_CHAN_MODE_LFE )
- {
- num_lfe++;
- lfe_channel = i;
- assert( lfe_channel == LFE_CHANNEL );
- }
}
for ( i = 0; i < nchan; i++ )
{
- if ( mct_chan_mode[i] != MCT_CHAN_MODE_LFE && mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
+ if (
+ mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
{
min_chan_bits[i] = 0;
@@ -128,7 +117,8 @@ void splitAvailableBitsMCT(
bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel;
}
- if ( mct_chan_mode[i] != MCT_CHAN_MODE_LFE && mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
+ if (
+ mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
{
assert( split_ratio[i] >= 1 && split_ratio[i] < BITRATE_MCT_RATIO_RANGE );
*bits_frame_channel = split_ratio[i] * remaining_bits / BITRATE_MCT_RATIO_RANGE + min_chan_bits[i];
@@ -162,7 +152,8 @@ void splitAvailableBitsMCT(
bits_frame_channel = &( (Decoder_State *) sts[i] )->bits_frame_channel;
}
- if ( mct_chan_mode[i] != MCT_CHAN_MODE_LFE && mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
+ if (
+ mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE )
{
*bits_frame_channel -= diff * split_ratio[i] / BITRATE_MCT_RATIO_RANGE;
*bits_frame_channel = max( min_chan_bits[i], *bits_frame_channel );
diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c
index e6f276575e1bc9672abd30b6be0c414e2bd9498d..ad9d19a9107824ed92f8da3e6d5f965b34464bda 100644
--- a/lib_com/ivas_mdft_imdft.c
+++ b/lib_com/ivas_mdft_imdft.c
@@ -82,6 +82,9 @@ static void ivas_get_mdft_twid_factors(
case IVAS_160_PT_LEN:
*ppTwid = &ivas_mdft_coeff_cos_twid_160[0];
break;
+ case IVAS_120_PT_LEN:
+ *ppTwid = &ivas_mdft_coeff_cos_twid_120[0];
+ break;
case IVAS_80_PT_LEN:
*ppTwid = &ivas_mdft_coeff_cos_twid_80[0];
break;
diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c
index 63285dabb10afe8a6a03c277d0ae8343a223caf8..a1f8efd6298aeb66beab96d8f1a289a7cb060cda 100644
--- a/lib_com/ivas_pca_tools.c
+++ b/lib_com/ivas_pca_tools.c
@@ -645,7 +645,7 @@ static void norm_quat(
norm_q = dotp( q, q, IVAS_PCA_INTERP );
- norm_q = inv_sqrt( norm_q ); // VE: TBV: possible division by 0
+ norm_q = inv_sqrt( norm_q ); // TODO: possible division by 0
for ( i = 0; i < IVAS_PCA_INTERP; i++ )
{
diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h
index 10174f92daa51b9ca21e81f4d8c6ef9541897080..aba1311799f00c7f747efff6acee136fe3991207 100644
--- a/lib_com/ivas_prot.h
+++ b/lib_com/ivas_prot.h
@@ -61,7 +61,12 @@ void stereo_dmx_evs_enc(
STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */
const int32_t input_Fs, /* i : input sampling rate */
int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const int16_t n_samples, /* i : number of input samples */
+ const bool is_binaural /* i : indication that input is binaural audio */
+#else
const int16_t n_samples /* i : number of input samples */
+#endif
);
/*! r: number of channels to be analysed */
@@ -114,6 +119,10 @@ ivas_error ivas_spar_md_enc_init
ivas_error ivas_sba_enc_reconfigure(
Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
);
+#ifdef ARITH_HUFF_CODER_CHANGES
+int16_t ivas_sba_get_max_md_bits(
+ Encoder_Struct *st_ivas );
+#endif
void destroy_sce_enc(
SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */
@@ -251,20 +260,35 @@ ivas_error ivas_compute_core_buffers(
/*! r: number of clipped samples */
uint32_t ivas_syn_output(
- float synth[][L_FRAME48k], /* i/o: float synthesis signal */
+#ifdef JBM_TSM_ON_TCS
+ float *synth[], /* i/o: float synthesis signal */
+#else
+ float synth[][L_FRAME48k], /* i/o: float synthesis signal */
+#endif
const int16_t output_frame, /* i : output frame length (one channel) */
const int16_t n_channels, /* i : number of output channels */
int16_t *synth_out /* o : integer 16 bits synthesis signal */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_syn_output_f(
+ float *synth[], /* i/o: float synthesis signal */
+ const int16_t output_frame, /* i : output frame length (one channel) */
+ const int16_t n_channels, /* i : number of output channels */
+ float *synth_out /* o : integer 16 bits synthesis signal */
+);
+#endif
+
void ivas_initialize_handles_enc(
Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
);
ivas_error ivas_init_encoder(
- Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
- Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */
- Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */
+ Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
+#ifndef IND_LIST_DYN
+ ,Indice ind_list[][MAX_NUM_INDICES] /* i : indices list */
+ ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */
+#endif
);
void destroy_core_enc(
@@ -299,6 +323,11 @@ ivas_error ivas_dec(
ivas_error ivas_dec_setup(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */
+ int16_t *data /* o : flushed PCM samples */
+#endif
);
ivas_error create_sce_dec(
@@ -500,8 +529,7 @@ void stereo_tcx_core_dec(
const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */
STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */
const int16_t nchan_out, /* i : number of output channels */
- const IVAS_FORMAT ivas_format, /* i : IVAS format */
- const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM) */
+ const IVAS_FORMAT ivas_format /* i : IVAS format */
);
void stereo_tcx_init_dec(
@@ -638,6 +666,11 @@ ivas_error ivas_mc_enc_config(
ivas_error ivas_mc_dec_config(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
const int16_t idx /* i : LS config. index */
+ #ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */
+ int16_t *data /* o : flushed samples (JBM) */
+#endif
);
/*! r: MC format mode (MCT, McMASA, ParamMC) */
@@ -738,15 +771,120 @@ void dtx_read_padding_bits(
);
+#ifdef JBM_TSM_ON_TCS
+/*----------------------------------------------------------------------------------*
+ * JBM prototypes
+ *----------------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *data /* o : output synthesis signals */
+);
+
+ivas_error ivas_jbm_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const uint16_t nSamplesAsked, /* i : number of samples wanted */
+ uint16_t *nSamplesRendered, /* o : number of samples rendered */
+ uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */
+ int16_t *data /* o : output synthesis signal */
+);
+
+ivas_error ivas_jbm_dec_flush_renderer(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t tc_granularity_new, /* i : new renderer granularity */
+ const RENDERER_TYPE renderer_type_old, /* i : old renderer type */
+ const AUDIO_CONFIG intern_config_old, /* i : old internal config */
+ const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */
+ const MC_MODE mc_mode_old, /* i : old MC mode */
+ const ISM_MODE ism_mode_old, /* i : old ISM mode */
+ uint16_t *nSamplesRendered, /* o : number of samples flushed */
+ int16_t *data /* o : rendered samples */
+);
+
+ivas_error ivas_jbm_dec_feed_tc_to_renderer(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */
+ int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/
+ float *data /* i/o: transport channels/output synthesis signal */
+);
+
+ivas_error ivas_jbm_dec_set_discard_samples(
+ Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */
+);
+
+void ivas_jbm_dec_get_adapted_linear_interpolator(
+ const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */
+ const int16_t interp_length, /* i : length of the interpolator to be created */
+ float *interpolator /* o : the interpolator */
+);
+
+void ivas_jbm_dec_get_adapted_subframes(
+ const int16_t nCldfbTs, /* i : number of time slots in the current frame */
+ int16_t *subframe_nbslots, /* i/o: subframe grid */
+ int16_t *nb_subframes /* i/o: number of subframes in the frame */
+);
+
+void ivas_jbm_dec_get_md_map(
+ const int16_t default_len, /* i : default frame length in metadata slots */
+ const int16_t len, /* i : length of the modfied frames in metadata slots */
+ const int16_t subframe_len, /* i : default length of a subframe */
+ const int16_t offset, /* i : current read offset into the md buffer */
+ const int16_t buf_len, /* i : length of the metadata buffer */
+ int16_t *map /* o : metadata index map */
+);
+
+int16_t ivas_jbm_dec_get_num_tc_channels(
+ Decoder_Struct *st_ivas /* i : IVAS decoder handle */
+);
+
+TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode(
+ Decoder_Struct *st_ivas /* i : IVAS decoder handle */
+);
+
+/*! r: render granularity */
+int16_t ivas_jbm_dec_get_render_granularity(
+ const RENDERER_TYPE rendererType, /* i : renderer type */
+ const int32_t output_Fs /* i : sampling rate */
+);
+
+ivas_error ivas_jbm_dec_tc_buffer_open(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */
+ const int16_t nchan_transport_jbm, /* i : number of real transport channels */
+ const int16_t nchan_transport_internal, /* i : number of totally buffered channels */
+ const int16_t nchan_full, /* i : number of channels to fully store */
+ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */
+);
+
+ivas_error ivas_jbm_dec_tc_buffer_reconfigure(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */
+ const int16_t nchan_transport_jbm, /* i : new number of real transport channels */
+ const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */
+ const int16_t nchan_full, /* i : new number of channels to fully store */
+ const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */
+);
+
+void ivas_jbm_dec_tc_buffer_close(
+ DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */
+);
+
+void ivas_jbm_dec_td_renderers_adapt_subframes(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+);
+#endif
+
+
/*----------------------------------------------------------------------------------*
* ISM prototypes
*----------------------------------------------------------------------------------*/
ivas_error ivas_ism_config(
const int32_t ism_total_brate, /* i : ISM total bitrate */
- const int16_t num_trans_ch, /* i : number of trans channels */
- const int16_t num_obj, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t nchan_ism, /* i : number of objects */
ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */
const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */
const int16_t ism_imp[], /* i : ISM importance flags */
int32_t element_brate[], /* o : element bitrate per object */
@@ -767,6 +905,8 @@ int16_t ism_quant_meta(
const float val, /* i : scalar value to quantize */
float *valQ, /* o : quantized value */
const float borders[], /* i : level borders */
+ const float q_step, /* i : quantization step */
+ const float q_step_border, /* i : quantization step at the border */
const int16_t cbsize /* i : codebook size */
);
@@ -774,20 +914,19 @@ int16_t ism_quant_meta(
float ism_dequant_meta(
const int16_t idx, /* i : quantizer index */
const float borders[], /* i : level borders */
+ const float q_step, /* i : quantization step */
+ const float q_step_border, /* i : quantization step at the border */
const int16_t cbsize /* i : codebook size */
);
ivas_error ivas_set_ism_metadata(
ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */
const float azimuth, /* i : azimuth value */
-#ifdef TD5
const float elevation, /* i : elevation value */
const float radius_meta, /* i : radius */
const float yaw, /* i : yaw */
- const float pitch /* i : pitch */
-#else
- const float elevation /* i : elevation value */
-#endif
+ const float pitch, /* i : pitch */
+ const int16_t non_diegetic_flag /* i : non-diegetic object flag */
);
ivas_error ivas_ism_metadata_enc_create(
@@ -811,6 +950,7 @@ ivas_error ivas_ism_enc(
ivas_error ivas_ism_metadata_enc(
const int32_t ism_total_brate, /* i : ISM total bitrate */
+ const int16_t nchan_ism, /* i : number of ISM channels */
const int16_t nchan_transport, /* i : number of transport channels */
ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */
@@ -818,23 +958,23 @@ ivas_error ivas_ism_metadata_enc(
int16_t nb_bits_metadata[], /* o : number of metadata bits */
const int16_t localVAD[], /* i : VAD flag */
const int16_t ism_mode, /* i : ISM mode */
-#ifdef TD5
const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */
const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */
-#else
- const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */
-#endif
);
ivas_error ivas_ism_metadata_dec(
const int32_t ism_total_brate, /* i : ISM total bitrate */
+ const int16_t nchan_ism, /* i : number of ISM channels */
int16_t *nchan_transport, /* o : number of transport channels */
ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */
const int16_t bfi, /* i : bfi flag */
- int16_t nb_bits_metadata[], /* o : number of metadata bits */
+ int16_t nb_bits_metadata[], /* o : number of metadata bits */
ISM_MODE ism_mode, /* i : ISM mode */
- const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */
+ ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */
+ const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */
+ int16_t *ism_extended_metadata_flag, /* i/o: Extended metadata active in renderer */
+ int16_t *ism_extmeta_cnt /* i/o: Number of change frames observed */
);
@@ -875,6 +1015,8 @@ void ivas_param_ism_stereo_dmx(
void ivas_param_ism_config(
PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */
+ ,
+ const int16_t nchan_ism /* i : number of ISM channels */
);
ivas_error ivas_ism_enc_config(
@@ -882,8 +1024,14 @@ ivas_error ivas_ism_enc_config(
);
ivas_error ivas_ism_dec_config(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- const int16_t num_obj /* i : number of objects in the bitstream */
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+ ,
+ const ISM_MODE last_ism_mode /* i/o: last ISM mode */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/
+ int16_t *data /* o : flushed PCM samples */
+#endif
);
ivas_error ivas_param_ism_dec_open(
@@ -900,6 +1048,26 @@ void ivas_param_ism_dec(
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_ism_dec_digest_tc(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+);
+
+void ivas_param_ism_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */
+ float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */
+);
+
+void ivas_param_ism_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+);
+#endif
+
void ivas_param_ism_params_to_masa_param_mapping(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
);
@@ -910,49 +1078,88 @@ void ivas_param_ism_params_to_masa_param_mapping(
*----------------------------------------------------------------------------------*/
ivas_error ivas_ism_dtx_open(
- Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
+ Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
+);
+
+/*! r: indication of DTX frame */
+int16_t ivas_ism_dtx_enc(
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ int16_t md_diff_flag[], /* o : metadata differential flag */
+ int16_t *sid_flag /* o : indication of SID frame */
);
ivas_error ivas_ism_dtx_dec(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- int16_t *nb_bits_metadata /* o : number of metadata bits */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ int16_t *nb_bits_metadata /* o : number of metadata bits */
);
-void ivas_param_ism_metadata_dtx_enc(
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */
- ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
- PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */
+void ivas_ism_metadata_sid_enc(
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ const int16_t flag_noisy_speech, /* i : noisy speech flag */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const ISM_MODE ism_mode, /* i : ISM mode */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t sid_flag, /* i : indication of SID frame */
+ const int16_t md_diff_flag[], /* i : metadata differental flag */
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ int16_t nb_bits_metadata[] /* o : number of metadata bits */
);
-void ivas_param_ism_metadata_dtx_dec(
- Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+void ivas_ism_metadata_sid_dec(
+ SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int32_t ism_total_brate, /* i : ISms total bitrate */
+ const int16_t bfi, /* i : bfi flag */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const ISM_MODE ism_mode, /* i : ISM mode */
+ int16_t *flag_noisy_speech, /* o : noisy speech flag */
+ int16_t *sce_id_dtx, /* o : SCE DTX ID */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ int16_t nb_bits_metadata[] /* o : number of metadata bits */
);
void ivas_ism_get_sce_id_dtx(
- ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
- SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
- const int16_t nchan_transport, /* i : number of transport channels */
- const int16_t input_frame /* i : input frame length per channel */
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t input_frame /* i : input frame length per channel */
);
void ivas_param_ism_compute_noisy_speech_flag(
Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
);
-/*! r: indication of DTX frame */
-int16_t ivas_ism_dtx_enc(
- Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
- int16_t *sid_flag /* o : indication of SID frame */
+void ivas_ism_coh_estim_dtx_enc(
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t input_frame /* i : input frame length */
);
-void ivas_ism_coh_estim_dtx_enc(
- ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
- SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
- const int16_t nchan_transport, /* i : number of transport channels */
- const int16_t input_frame /* i : input frame length */
+void update_last_metadata(
+ const int16_t nchan_ism, /* i : number of objects */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t updt_flag[] /* i : last metadata update flag */
+);
+
+void ivas_get_ism_sid_quan_bitbudget(
+ const int16_t nchan_ism, /* i : number of objects */
+ int16_t *nBits_azimuth, /* o : number of Q bits for azimuth */
+ int16_t *nBits_elevation, /* o : number of Q bits for elevation */
+ float *q_step, /* o : quantization step */
+ float *q_step_border, /* o : quantization step at the border */
+ int16_t *nBits_coh, /* o : number of Q bits for coherence */
+ int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */
);
+
/*----------------------------------------------------------------------------------*
* DFT Stereo prototypes
*----------------------------------------------------------------------------------*/
@@ -1121,10 +1328,15 @@ void stereo_dft_dec(
float *input_mem, /* i/o: mem of buffer DFT analysis */
STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */
const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
+ const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */
const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */
const int32_t output_Fs, /* i : Fs for delay calculation */
const int16_t nchan_transport /* i : number of transpor channels */
+#ifdef FIX_STEREO_474
+ ,
+ const int16_t num_md_sub_frames /* i: number of MD subframes */
+#endif
);
void stereo_dft_res_ecu(
@@ -1294,9 +1506,9 @@ int16_t adapt_GR_rpg1_ief(
/*! r: number of bits written */
int16_t write_GR1(
BSTR_ENC_HANDLE hBstr, /* i/o: Encoder bitstream handle */
- const int16_t ind, /* i : bitstream index */
- const int16_t *in, /* i : input vector */
- const int16_t len /* i : vector length */
+ const int16_t ind, /* i : bitstream index */
+ const int16_t *in, /* i : input vector */
+ const int16_t len /* i : vector length */
);
/*! r: number of bits written */
@@ -1358,6 +1570,10 @@ int16_t read_BS_adapt_GR_sg(
void stereo_dft_hybrid_ITD_flag(
STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */
const int32_t input_Fs /* i : CPE element sampling rate */
+#ifdef HYBRID_ITD_MAX
+ ,
+ const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */
+#endif
);
void stereo_dft_enc_compute_itd(
@@ -1872,25 +2088,21 @@ void tdm_low_rate_dec(
const float *lsf_new /* i : ISFs at the end of the frame */
);
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
void tdm_SCh_LSF_intra_pred(
const int32_t element_brate, /* i : element bitrate */
const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
- float *pred_lsf_secondary /* o : predicted secondary channel LSFs */
+ float *pred_lsf_SCh /* o : predicted secondary channel LSFs */
);
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
void tdm_SCh_lsf_reuse(
- const int16_t enc_dec, /* i : encoder/decoder flag */
- const int32_t element_brate, /* i : element bitrate */
+ const int16_t enc_dec, /* i : encoder/decoder flag */
+ const int32_t element_brate, /* i : element bitrate */
float lsf_new[M], /* i/o: LSFs at the end of the frame */
float lsp_new[M], /* i/o: LSPs at the end of the frame */
const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */
const float lsf_wgts[M], /* i : LSF weights */
- int16_t beta_index[] /* i/o: quantization index */
+ int16_t *beta_index /* i/o: quantization index */
);
-#endif
-#endif
void first_VQstages(
const float *const *cb,
@@ -2140,7 +2352,6 @@ void decoder_tcx_imdct(
float synthFB[],
const int16_t bfi, /* i : Bad frame indicator */
const int16_t frame_cnt, /* i : frame counter in the super frame */
- const int16_t isLFE, /* i : is LFE */
const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */
);
@@ -2349,6 +2560,21 @@ void sns_shape_spectrum(
const int16_t L_frame /* i : frame length */
);
+int16_t quantize_sns(
+ float sns_in[CPE_CHANNELS][NB_DIV][M],
+ float snsQ_out[CPE_CHANNELS][NB_DIV][M],
+ Encoder_State **sts,
+ int16_t *indices,
+ int16_t *zero_side_flag,
+ int16_t *sns_stereo_mode
+);
+
+void dequantize_sns(
+ int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW],
+ float snsQ_out[CPE_CHANNELS][NB_DIV][M],
+ Decoder_State **sts
+);
+
void sns_avq_cod(
const float *sns, /* i : Input sns vectors */
const float *snsmid, /* i : Input mid-sns vectors */
@@ -2356,12 +2582,14 @@ void sns_avq_cod(
float *snsmid_q, /* o : Quantized mid-LFS vectors */
int16_t *index, /* o : Quantization indices */
const int16_t core, /* i : core */
+ const int16_t L_frame,
const int16_t low_brate_mode /* i : flag low bit operating mode */
);
void sns_avq_cod_stereo(
const float *snsl, /* i : Input sns vector (left channel) */
const float *snsr, /* i : Input sns vector (right channel) */
+ const int16_t L_frame,
float *snsl_q, /* o : Quantized sns vector (left channel) */
float *snsr_q, /* o : Quantized sns vector (right channel) */
int16_t *indexl, /* o : Quantization indices (left channel) */
@@ -2370,13 +2598,15 @@ void sns_avq_cod_stereo(
void sns_avq_dec(
int16_t *index, /* i : Quantization indices */
- float *SNS_Q, /* o : Quantized SNS vectors */
+ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */
+ const int16_t L_frame,
const int16_t numlpc /* i : Number of sets of lpc */
);
void sns_avq_dec_stereo(
int16_t *indexl, /* i : Quantization indices (left channel) */
int16_t *indexr, /* i : Quantization indices (right channe) */
+ const int16_t L_frame,
float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */
float *SNS_Qr /* o : Quantized SNS vectors (right channe) */
);
@@ -2580,7 +2810,11 @@ float sumAbs(
void mvc2c(
const uint8_t x[], /* i : input vector */
uint8_t y[], /* o : output vector */
+#ifdef FIX_XXX_JBM_FIFO_BUFFER
+ const int32_t n
+#else
const int16_t n /* i : vector size */
+#endif
);
/*! r: the dot product x'*A*A'*x */
@@ -2705,7 +2939,6 @@ void ivas_mdct_core_whitening_enc(
int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */
BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
- int16_t *LFE_off, /* o : flag if LFE has content */
const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */
const int16_t nChannels /* i : total number of coded channels */
);
@@ -2723,7 +2956,6 @@ void ivas_mct_core_enc(
void ivas_mdct_quant_coder(
CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */
- const int16_t LFE_off, /* i : flag if LFE has content */
int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */
int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */
@@ -2774,7 +3006,6 @@ void ivas_mdct_dec_side_bits_frame_channel(
int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */
Decoder_State *st0, /* i : pointer to bitstream handle */
- int16_t *LFE_off, /* o : flag if LFE has content */
int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */
int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */
const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */
@@ -2794,7 +3025,6 @@ void ivas_mct_side_bits(
void ivas_mdct_core_invQ(
CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */
- const int16_t LFE_off, /* i : flag if LFE content */
int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */
int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */
@@ -2812,14 +3042,12 @@ void ivas_mdct_core_reconstruct(
CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
float *x[][NB_DIV], /* i/o: pointers to synthesis @internal_FS */
float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */
- const int16_t LFE_off, /* i : flag if LFE content */
int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */
const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */
);
void ivas_mdct_core_tns_ns(
CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
- const int16_t LFE_off, /* i : flag if LFE has content */
int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */
STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */
float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */
@@ -2843,7 +3071,7 @@ void ivas_mct_dec_mct(
void apply_MCT_dec(
MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */
Decoder_State **sts, /* i/o: decoder state structure */
- float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */
+ float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */
);
void mctStereoIGF_dec(
@@ -2877,16 +3105,44 @@ void mdct_read_IGF_bits(
ivas_error ivas_qmetadata_enc_encode(
BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
+#ifdef HR_METADATA
+ivas_error ivas_qmetadata_enc_encode_hr_384_512(
+ BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
+ IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */
+ const int16_t bits_sph_idx,
+ const int16_t bits_sp_coh
+);
+
+void deindex_sph_idx(
+ const uint16_t sphIndex, /* i : Spherical index */
+ const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */
+ float *theta, /* o : Elevation */
+ float *phi /* o : Azimuth */
+);
+
+/*! r: output index for direction */
+uint16_t index_theta_phi_16(
+ float * p_theta, /* i/o: input elevation to be indexed */
+ float * p_phi, /* i/o: input azimuth to be indexed */
+ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */
+);
+#endif
+
void reset_metadata_spatial(
const IVAS_FORMAT ivas_format, /* i : IVAS format */
BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */
const int32_t element_brate, /* i : element bitrate */
int32_t *total_brate, /* o : total bitrate */
const int32_t core_brate, /* i : core bitrate */
- const int16_t nb_bits_metadata, /* i : number of meatdata bits */
+ const int16_t nb_bits_metadata /* i : number of meatdata bits */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
const SBA_MODE sba_mode /* i : SBA mode */
+#endif
);
/*! r: number of bits written */
@@ -2894,8 +3150,11 @@ void ivas_qmetadata_enc_sid_encode(
BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */
const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure*/
- const int16_t ivas_format, /* i : ivas format */
+ const int16_t ivas_format /* i : ivas format */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
const SBA_MODE sba_mode /* i : SBA mode */
+#endif
);
/*! r: number of bits read */
@@ -2903,7 +3162,25 @@ int16_t ivas_qmetadata_dec_decode(
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
uint16_t *bitstream, /* i : bitstream */
int16_t *index /* i/o: bitstream position */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
+);
+
+#ifdef HR_METADATA
+/*! r: number of bits read */
+int16_t ivas_qmetadata_dec_decode_hr_384_512(
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index, /* i/o: bitstream position */
+ const SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */
+ const int16_t bits_sph_idx,
+ const int16_t bits_sp_coh
+#ifdef FIX_HBR_MASAMETA
+ ,
+ uint8_t ncoding_bands_config
+#endif
);
+#endif
/*! r: number of bits read */
int16_t ivas_qmetadata_dec_sid_decode(
@@ -2912,8 +3189,11 @@ int16_t ivas_qmetadata_dec_sid_decode(
int16_t *index, /* i/o: bitstream position */
const int16_t nchan_transport, /* i : number of transport channels */
int16_t *element_mode, /* o : element mode */
- const int16_t ivas_format, /* i : IVAS format */
+ const int16_t ivas_format /* i : IVAS format */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
const SBA_MODE sba_mode /* i : SBA mode */
+#endif
);
void ivas_qmetadata_to_dirac(
@@ -2921,7 +3201,12 @@ void ivas_qmetadata_to_dirac(
DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */
MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+#ifndef SBA_MODE_CLEAN_UP
const SBA_MODE sba_mode, /* i : SBA mode */
+#else
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+#endif
+ const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */
int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
);
@@ -2943,11 +3228,13 @@ void ivas_qmetadata_close(
void restore_metadata_buffer(
BSTR_ENC_HANDLE hMetaData,
const int16_t next_ind_start,
+#ifndef IND_LIST_DYN
const int16_t last_ind_start,
- const int16_t bit_pos_start
+#endif
+ const int16_t bit_pos_start
);
-/* !r: codeword index */
+/*! r: codeword index */
int16_t masa_sq(
const float in, /* i : input value */
const float *threshold, /* i : partition */
@@ -2979,9 +3266,13 @@ void quantize_direction_frame(
IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */
float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES],
float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
);
-/* !r: quantized spherical index */
+/*! r: quantized spherical index */
uint16_t quantize_direction(
const float theta, /* i : input elevation value */
float phi, /* i : input azimuth value */
@@ -3001,7 +3292,7 @@ int16_t quantize_direction2D(
const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
);
-/* !r :companded azimuth value */
+/*! r :companded azimuth value */
float companding_azimuth(
const float azi, /* i : input azimuth value */
const MC_LS_SETUP mc_format, /* i : input channel format */
@@ -3009,14 +3300,14 @@ float companding_azimuth(
const int16_t direction /* i : direction of companding (direct or inverse)*/
);
-/* !r: index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi_chan_lbr(
const float phi, /* i : azimuth value */
float *phi_hat, /* o : quantized azimuth */
const int16_t n /* i : azimuth codebook size */
);
-/* !r: index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi_chan_compand(
float phi, /* i : azimuth value */
float *phi_hat, /* o : quantized azimuth */
@@ -3040,7 +3331,7 @@ void small_requantize_direction_frame(
int16_t *diff /* i/o: number of bits to be reduced */
);
-/*!r : index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi(
float phi, /* i : azimuth value */
const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */
@@ -3117,19 +3408,27 @@ void ivas_dirac_param_est_enc(
float **pp_fr_real,
float **pp_fr_imag,
const int16_t input_frame,
- const SBA_MODE sba_mode
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode
+#else
+ const IVAS_FORMAT ivas_format
+#endif
+ ,
+ const int16_t hodirac_flag,
+ const int16_t nchan_fb_in
);
+#ifndef SBA_MODE_CLEAN_UP
/*----------------------------------------------------------------------------------*
* SBA format prototypes
*----------------------------------------------------------------------------------*/
/*! r: SBA format mode */
SBA_MODE ivas_sba_mode_select(
- const int32_t ivas_total_brate /* i : IVAS total bitrate */
+ void
);
-
+#endif
void ivas_sba_config(
const int32_t sba_total_brate, /* i : SBA total bitrate */
int16_t sba_order, /* i : Ambisonic (SBA) order */
@@ -3141,10 +3440,24 @@ void ivas_sba_config(
int16_t *element_mode /* o : element mode of the core coder */
);
+void ivas_sba_set_cna_cng_flag(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+);
+
ivas_error ivas_sba_dec_reconfigure(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
);
+#ifdef JBM_TSM_ON_TCS
+ivas_error ivas_sba_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t nCldfbSlots, /* i : number of CLDFB slots */
+ const int16_t nSamplesForRendering, /* i : number of samples provided */
+ float *data[] /* i : transport channel samples */
+);
+#endif
+
void ivas_init_dec_get_num_cldfb_instances(
Decoder_Struct *st_ivas, /* i : IVAS decoder structure */
int16_t *numCldfbAnalyses, /* o : number of CLDFB analysis instances */
@@ -3179,12 +3492,22 @@ int16_t ivas_sba_get_nchan(
/*! r: number of ambisonics metadata channels */
int16_t ivas_sba_get_nchan_metadata(
const int16_t sba_order /* i : Ambisonic (SBA) order */
+ ,
+ const int32_t ivas_total_brate
+);
+
+void ivas_sba_get_spar_hoa_ch_ind(
+ const int16_t num_md_chs, /* i : number of MD channels */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]
);
/*! r: flag indicating to code SPAR HOA MD for all bands */
-int16_t ivas_sba_get_spar_hoa_md_flag(
+void ivas_sba_get_spar_hoa_md_flag(
const int16_t sba_order, /* i : Ambisonic (SBA) order */
- const int32_t ivas_total_brate /* i : IVAS total bitrate */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ int16_t *spar_hoa_md_flag,
+ int16_t *spar_hoa_dirac2spar_md_flag
);
void ivas_sba_zero_vert_comp(
@@ -3217,11 +3540,25 @@ void ivas_sba_dirac_stereo_config(
STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */
);
+/*! r: HO-DirAC flag */
+int16_t ivas_get_hodirac_flag(
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ const int16_t sba_order /* i : Ambisonic (SBA) order */
+);
+
+int16_t ivas_get_sba_dirac_stereo_flag(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+);
+
void ivas_sba_dirac_stereo_smooth_parameters(
STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */
const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */
const int32_t output_Fs /* i : Fs for delay calculation */
+#ifdef FIX_STEREO_474
+ ,
+ const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */
+#endif
);
void ivas_sba2mc_cldfb(
@@ -3230,6 +3567,9 @@ void ivas_sba2mc_cldfb(
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */
const int16_t nb_channels_out, /* i : nb of output channels */
const int16_t nb_bands, /* i : nb of CLDFB bands to process */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nb_timeslots, /* i : number of time slots to process */
+#endif
const float *hoa_dec_mtx /* i : HOA decoding mtx */
);
@@ -3251,6 +3591,7 @@ void ivas_dirac_enc_close(
const int32_t input_Fs /* i : input sampling_rate */
);
+#ifndef SBA_MODE_CLEAN_UP
void ivas_dirac_enc(
DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
@@ -3261,7 +3602,20 @@ void ivas_dirac_enc(
const int16_t input_frame, /* i : input frame length */
const int16_t sba_planar /* i : SBA planar flag */
);
-
+#else
+void ivas_dirac_enc(
+ DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
+ BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */
+ float data_f[][L_FRAME48k], /* i/o: SBA channels */
+ float **ppIn_FR_real, /* o : real freq domain values */
+ float **ppIn_FR_imag, /* o : imag freq domain values */
+ const int16_t input_frame, /* i : input frame length */
+ const int16_t dtx_vad, /* i : DTX vad flag */
+ const IVAS_FORMAT ivas_format, /* i : ivas format */
+ int16_t hodirac_flag /* i : hodirac flag */
+);
+#endif
ivas_error ivas_dirac_config(
void *st_ivas, /* i/o: IVAS encoder/decoder state structure */
const int16_t enc_dec /* i : encoder or decoder flag */
@@ -3277,15 +3631,28 @@ void ivas_dirac_config_bands(
IVAS_FB_MIXER_HANDLE hFbMdft
);
+#ifdef ARITH_HUFF_CODER_CHANGES
+void ivas_get_dirac_sba_max_md_bits(
+ const int32_t sba_total_brate,
+ int16_t *bits_frame_nominal,
+ int16_t *metadata_max_bits,
+ int16_t *qmetadata_max_bit_req,
+ int16_t nbands );
+#endif
+
ivas_error ivas_dirac_sba_config(
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
+#ifndef SBA_MODE_CLEAN_UP
int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */
int16_t *nSCE, /* o : number of SCEs */
int16_t *nCPE, /* o : number of CPEs */
+#endif
int16_t *element_mode, /* o : element mode of the core coder */
int32_t sba_total_brate, /* i : SBA total bitrate */
const int16_t sba_order, /* i : Ambisonic (SBA) order */
+#ifndef SBA_MODE_CLEAN_UP
const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
const int16_t nbands /* i : number of frequency bands */
);
@@ -3293,6 +3660,11 @@ ivas_error ivas_dirac_dec_open(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
);
+ivas_error ivas_dirac_allocate_parameters(
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ const int16_t params_flag /* i : set of parameters flag */
+);
+
ivas_error ivas_dirac_dec_config(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */
@@ -3302,28 +3674,88 @@ void ivas_dirac_dec_close(
DIRAC_DEC_HANDLE *hDirAC /* i/o: decoder DirAC handle */
);
+void ivas_dirac_deallocate_parameters(
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ const int16_t params_flag /* i : set of parameters flag */
+);
+
void ivas_dirac_dec_read_BS(
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
Decoder_State *st, /* i/o: decoder Core state structure */
DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */
int16_t *nb_bits, /* o : number of bits read */
+#ifndef SBA_MODE_CLEAN_UP
const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
+ const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */
int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
);
+#ifdef JBM_TSM_ON_TCS
+void generate_masking_noise_lb_dirac(
+ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
+ float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */
+ const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */
+ const int16_t cna_flag /* i : CNA flag for LB and HB */
+);
+
+void ivas_dirac_dec_set_md_map(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nCldfbTs /* i : number of CLDFB time slots */
+);
+
+void ivas_dirac_dec(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+ const int16_t nchan_transport /* i : number of transport channels */
+);
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+void ivas_dirac_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+);
+#endif
+
+#ifndef JBM_TSM_ON_TCS
void ivas_dirac_dec(
+#else
+void ivas_dirac_dec_render_sf(
+#endif
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
const int16_t nchan_transport, /* i : number of transport channels */
float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
- float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
+ float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX]
+#ifndef JBM_TSM_ON_TCS
+ ,
const int16_t i_sf
+#endif
);
-ivas_error ivas_dirac_dec_init_binaural_data(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */
+ivas_error ivas_td_decorr_reconfig_dec(
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate, /* i : total IVAS bitrate */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int32_t output_Fs, /* i : output sampling rate */
+ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */
+ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */
+);
+
+/*! r: Configured reqularization factor value */
+float configure_reqularization_factor(
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : total IVAS bitrate */
);
void computeDiffuseness_mdft(
@@ -3400,17 +3832,20 @@ void ivas_dirac_dec_decorr_close(
HANDLE_DIRAC_DECORR_STATE *ph_dirac_decorr_state
);
-
ivas_error ivas_dirac_dec_output_synthesis_open(
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const RENDERER_TYPE renderer_type, /* i : renderer type */
const int16_t nchan_transport, /* i : number of transport channels */
const int32_t output_Fs /* i : output sampling rate */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
void ivas_dirac_dec_output_synthesis_init(
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
void ivas_dirac_dec_output_synthesis_close(
@@ -3420,12 +3855,25 @@ void ivas_dirac_dec_output_synthesis_close(
void ivas_dirac_dec_output_synthesis_process_slot(
const float *reference_power, /* i : Estimated power */
const float *onset, /* i : onset filter */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t *azimuth,
+ const int16_t *elevation,
+ const float *diffuseness,
+#endif
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t sh_rot_max_order,
+#endif
const float *p_Rmat, /* i : rotation matrix */
const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */
const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */
- const int16_t nchan_transport, /* i : number of transport channels */
- const int16_t index_slot
+ const int16_t nchan_transport /* i : number of transport channels */
+#if defined( JBM_TSM_ON_TCS )
+ ,
+ const int16_t index_slot
+#endif
+ ,
+ const int16_t hodirac_flag
);
void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
@@ -3433,13 +3881,33 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const int16_t nchan_transport, /* i : number of transport channels */
- const float *onset_filter
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nbslots, /* i : number of slots to process */
+#endif
+ const float *onset_filter
+ ,
+#ifdef FIX_393_459_460_SBA_MD
+ float *diffuseness,
+#else
+#ifdef JBM_TSM_ON_TCS
+ const int16_t md_idx,
+#endif
+#endif
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nbslots, /* i : number of slots to process */
+#ifdef FIX_393_459_460_SBA_MD
+ float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/
+#else
+ const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */
+#endif
+#endif
float *reference_power_smooth,
float qualityBasedSmFactor
);
@@ -3478,11 +3946,15 @@ void ivas_dirac_dec_compute_directional_responses(
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */
const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */
- const int16_t direction_idx, /* i : index for direction (azi and ele) */
- const int16_t subframe_idx, /* i : subframe index */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t *azimuth,
+ const int16_t *elevation,
+ const int16_t md_idx,
+#endif
const float *surCohRatio,
const int16_t shd_rot_max_order, /* i : split-order rotation method */
- const float *p_Rmat /* i : rotation matrix */
+ const float *p_Rmat, /* i : rotation matrix */
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
void ivas_dirac_dec_get_frequency_axis(
@@ -3490,6 +3962,63 @@ void ivas_dirac_dec_get_frequency_axis(
const int32_t output_Fs, /* i : sampling frequency */
const int16_t num_freq_bands ); /* i : number of frequency bands */
+void calculate_hodirac_sector_parameters(
+#ifdef FIX_485_STATIC_BUFFERS
+ DIRAC_ENC_HANDLE hDirAC,
+#endif
+ float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */
+ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */
+ const float beta, /* i : forgetting factor for average filtering */
+ const int16_t *band_grouping, /* i : indices of band groups */
+ const int16_t N_bands, /* i : number of bands (groups) */
+ const int16_t enc_param_start_band, /* i : first band to process */
+ float *azi, /* o : array of sector azimuth angles, flat */
+ float *ele, /* o : array of sector elevation angles, flat */
+ float *diff, /* o : array of sector diffuseness values, flat */
+ float *ene /* o : array of sector energy values, flat */
+);
+
+void ivas_mc_paramupmix_enc(
+ Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */
+ BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */
+ float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */
+ const int16_t input_frame /* i : input frame length */
+);
+
+ivas_error ivas_mc_paramupmix_enc_open(
+ Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */
+);
+
+void ivas_mc_paramupmix_enc_close(
+ MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */
+ const int32_t sampling_rate
+);
+
+void ivas_mc_paramupmix_dec(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+);
+
+int16_t ivas_mc_paramupmix_getNumTransportChannels(
+ void
+);
+
+ivas_error ivas_mc_paramupmix_dec_open(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+);
+
+void ivas_mc_paramupmix_dec_close(
+ MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */
+);
+
+void ivas_mc_paramupmix_dec_read_BS(
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ Decoder_State *st, /* i/o: decoder state structure */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */
+ int16_t *nb_bits /* o : number of bits written */
+);
+
void ivas_param_mc_metadata_open(
const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */
const int16_t lfe_index, /* i : channel index of LFE */
@@ -3557,9 +4086,29 @@ void ivas_param_mc_dec_read_BS(
int16_t *nb_bits /* o : number of bits written */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_param_mc_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */
+ float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */
+);
+
+void ivas_param_mc_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+);
+#endif
+
void ivas_param_mc_dec(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
);
void ivas_param_mc_default_icc_map(
@@ -3668,7 +4217,7 @@ int16_t computeMixingMatricesResidual(
float *mixing_matrix /* o : resulting residual mixing matrix */
);
-/* !r: error or success */
+/*! r: error or success */
int16_t svd(
float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */
float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */
@@ -3690,6 +4239,13 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open(
const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_dirac_dec_output_synthesis_get_interpolator(
+ DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */
+ const uint16_t interp_length /* i : interpolator length */
+);
+#endif
+
void ivas_dirac_dec_output_synthesis_cov_init(
DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */
const int16_t nchan_in, /* i : number of input (tranport) channels */
@@ -3704,27 +4260,45 @@ void ivas_dirac_dec_output_synthesis_cov_close(
);
void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot(
- float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
- float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */
- float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */
- float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */
- PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */
- const int16_t nchan_in, /* i : number of input channels */
- const int16_t idx_slot /* i : index of the slot to be added to the input covariance */
-);
-
+#ifdef JBM_TSM_ON_TCS
+ float *RealBuffer, /* i : input channel filter bank samples (real part) */
+ float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */
+#else
+ float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
+ float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */
+#endif
+ float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */
+ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */
+ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */
+ const int16_t nchan_in /* i : number of input channels */
+#ifndef JBM_TSM_ON_TCS
+ ,
+ const int16_t idx_slot /* i : index of the slot to be added to the input covariance */
+#endif
+);
+
void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot(
- float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
- float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */
- float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */
- float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */
- float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */
- float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */
- const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */
- const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */
- const int16_t nX, /* i : number of input channels */
- const int16_t nY, /* i : number of output channels */
- PARAM_MC_DEC_HANDLE hMetadataPMC /* i : handle to the Parametric MC decoder state */
+#ifdef JBM_TSM_ON_TCS
+ float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */
+ float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */
+#else
+ float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */
+ float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */
+#endif
+ float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */
+ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */
+ float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */
+#else
+ float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */
+ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */
+#endif
+ const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */
+ const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */
+ const int16_t nX, /* i : number of input channels */
+ const int16_t nY, /* i : number of output channels */
+ PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */
);
int16_t computeMixingMatricesISM(
@@ -3808,7 +4382,11 @@ void ivas_sba_upmixer_renderer(
);
ivas_error ivas_sba_linear_renderer(
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
const int16_t output_frame, /* i : output frame length per channel */
const int16_t nchan_in, /* i : number of input ambisonics channels */
const AUDIO_CONFIG output_config, /* i : output audio configuration */
@@ -3902,7 +4480,7 @@ int16_t ivas_get_bw_idx_from_sample_rate(
const int32_t sampling_rate /* i : sampling rate */
);
-/* !r: config. table index */
+/*! r: config. table index */
int16_t ivas_get_spar_table_idx(
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
const int16_t sba_order, /* i : IVAS SBA order */
@@ -3921,6 +4499,13 @@ void ivas_spar_set_bitrate_config(
ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */
const int16_t table_idx, /* i : config. table index */
const int16_t num_bands /* i : number of bands */
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ const int16_t dirac2spar_md_flag,
+ const int16_t enc_flag,
+ const int16_t pca_flag,
+ const int16_t agc_flag
+#endif
);
void ivas_spar_bitrate_dist(
@@ -3974,12 +4559,57 @@ void ivas_spar_get_cldfb_gains(
const DECODER_CONFIG_HANDLE hDecoderConfig
);
-/* !r: 1 if prediction residual channel */
+/*! r: 1 if prediction residual channel */
int16_t ivas_is_res_channel(
const int16_t ch, /* i : ch index in WYZX ordering */
const int16_t nchan_transport /* i : number of transport channels (1-4) */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_spar_dec_agc_pca(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float output[][L_FRAME48k], /* i/o: input/output audio channels */
+ const int16_t output_frame /* i : output frame length */
+);
+
+void ivas_spar_dec_set_render_map(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nCldfbTs /* i : number of CLDFB time slots */
+);
+
+void ivas_spar_dec_set_render_params(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */
+);
+
+void ivas_spar_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t nCldfbSlots, /* i : number of CLDFB slots */
+ const int16_t nSamplesForRendering /* i : number of samples provided */
+);
+
+ivas_error ivas_sba_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nCldfbSlots, /* i : number of CLDFB slots */
+ const int16_t nSamplesForRendering /* i : number of samples provided */
+);
+
+void ivas_sba_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+);
+
+void ivas_spar_dec_upmixer_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float *output[], /* o : output audio channels */
+ const int16_t nchan_internal /* i : number of internal channels */
+);
+#endif
+
void ivas_spar_dec_upmixer(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
float output[][L_FRAME48k], /* i/o: input/output audio channels */
@@ -4007,6 +4637,8 @@ ivas_error ivas_spar_md_enc_process(
const int16_t dtx_vad,
const int16_t nchan_inp,
const int16_t sba_order /* i : Ambisonic (SBA) order */
+ ,
+ float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */
);
void ivas_compute_spar_params(
@@ -4020,6 +4652,7 @@ void ivas_compute_spar_params(
const int16_t num_ch,
const int16_t bands_bw,
const int16_t active_w,
+ const int16_t active_w_vlbr,
ivas_spar_md_com_cfg *hSparCfg,
ivas_spar_md_t *hSparMd,
float *pWscale,
@@ -4063,8 +4696,15 @@ void ivas_get_spar_md_from_dirac(
const int16_t order,
const int16_t dtx_vad,
float Wscale_d[IVAS_MAX_NUM_BANDS]
+ ,
+ const uint8_t useLowerRes,
+ const int16_t active_w_vlbr
);
+int16_t ivas_get_spar_dec_md_num_subframes(
+ const int16_t sba_order, /* i : Ambisonic (SBA) order */
+ const int32_t ivas_total_brate );
+
ivas_error ivas_spar_md_dec_open(
ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */
const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */
@@ -4106,6 +4746,8 @@ void ivas_spar_to_dirac(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t dtx_vad, /* i : DTX frame flag */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t bw /* i : band joining factor */
);
void ivas_spar_update_md_hist(
@@ -4115,11 +4757,15 @@ void ivas_spar_update_md_hist(
void ivas_spar_smooth_md_dtx(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t num_md_sub_frames /* i : number of metadata subframes */
);
void ivas_spar_setup_md_smoothing(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t num_md_sub_frames /* i : number of metadata subframes */
);
void ivas_spar_dec_gen_umx_mat(
@@ -4127,6 +4773,8 @@ void ivas_spar_dec_gen_umx_mat(
const int16_t nchan_transport, /* i : number of transport channels */
const int16_t num_bands_out, /* i : number of output bands */
const int16_t bfi /* i : bad frame indicator */
+ ,
+ const int16_t num_md_sub_frames
);
/* Covariance module */
@@ -4135,6 +4783,11 @@ ivas_error ivas_spar_covar_enc_open(
ivas_filterbank_t *pFb, /* i/o: FB handle */
const int32_t input_Fs, /* i : input sampling rate */
const int16_t nchan_inp /* i : number of input channels */
+ ,
+#ifdef FIX_489_COV_SMOOTHING
+ COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/
+#endif
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
);
void ivas_spar_covar_enc_close(
@@ -4154,6 +4807,8 @@ void ivas_enc_cov_handler_process(
const int16_t nchan_inp,
const int16_t dtx_vad,
const int16_t transient_det[2]
+ ,
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]
);
ivas_error ivas_spar_covar_smooth_enc_open(
@@ -4161,6 +4816,11 @@ ivas_error ivas_spar_covar_smooth_enc_open(
const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */
ivas_filterbank_t *pFb, /* i/o: FB handle */
const int16_t nchan_inp /* i : number of input channels */
+ ,
+#ifdef FIX_489_COV_SMOOTHING
+ COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/
+#endif
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
);
void ivas_spar_covar_smooth_enc_close(
@@ -4191,7 +4851,7 @@ void ivas_transient_det_close(
void ivas_transient_det_process(
ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */
float *pIn_pcm, /* i : input audio channels */
- const int16_t frame_len, /* i : frame length in samples */
+ const int16_t frame_len, /* i : frame length in samples */
int16_t transient_det[2] /* o : transient det outputs */
);
@@ -4217,11 +4877,21 @@ void ivas_td_decorr_dec_close(
void ivas_td_decorr_process(
ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[], /* i : input audio channels */
+#else
float pcm_in[][L_FRAME48k], /* i : input audio channels */
+#endif
float **ppOut_pcm, /* o : output audio channels */
const int16_t output_frame /* i : output frame length */
);
+void ivas_td_decorr_APD_iir_filter(
+ ivas_td_decorr_APD_filt_state_t *filter_state,
+ float *pIn_out,
+ const int16_t num_APD_sections,
+ const int16_t length
+);
#define IVAS_CMULT_FLOAT( in1_re, in1_im, in2_re, in2_im, out1_re, out1_im ) \
out1_re = ( in1_re * in2_re ) - ( in1_im * in2_im ); MAC(1); MULT(1); \
@@ -4357,7 +5027,16 @@ int16_t ivas_get_bits_to_encode(
void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen );
void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec );
void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec );
-void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff);
+#ifdef ARITH_HUFF_CODER_CHANGES
+int16_t ivas_arith_encode_cmplx_cell_array(
+#else
+void ivas_arith_encode_cmplx_cell_array(
+#endif
+ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff
+#ifdef ARITH_HUFF_CODER_CHANGES
+ , int32_t wc_strat_arith
+#endif
+);
ivas_error ivas_huffman_decode( ivas_huffman_cfg_t *huff_cfg, Decoder_State *st0, int16_t *dec_out );
void ivas_arith_decode_cmplx_cell_array( ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, Decoder_State *st0, ivas_cell_dim_t *pCell_dims, int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_re_old );
@@ -4449,11 +5128,6 @@ ivas_error ivas_masa_enc_open(
void ivas_masa_enc_close(
MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */
- #ifndef FIX_350_MASA_DELAY_COMP
- ,
- const int16_t nchan_transport, /* i : Number of transport channels */
- const IVAS_FORMAT ivas_format /* i : IVAS format */
- #endif
);
void ivas_masa_enc_reconfigure(
@@ -4518,6 +5192,8 @@ void masa_compensate_two_dir_energy_ratio_index(
const int16_t ratio_index_2, /* i : Input ratio for direction 2 */
int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */
int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
);
void ivas_set_qmetadata_maxbit_req(
@@ -4525,19 +5201,27 @@ void ivas_set_qmetadata_maxbit_req(
const IVAS_FORMAT ivas_format /* i : IVAS format */
);
+/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */
+int16_t ivas_get_df_ratio_bits_hodirac(
+ const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */
+);
+
/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */
int16_t ivas_get_df_ratio_bits(
- int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */
+ const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */
);
void masa_sample_rate_band_correction(
MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */
int16_t *band_mapping, /* i/o: Band mapping used and modified */
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */
- const int32_t sampling_rate /* i : sampling rate */
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
- , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */
+#ifdef FIX_HBR_MASAMETA
+ const uint8_t maxBand, /* i : max band */
+ uint8_t is_encoder, /* i: signals if called at encoder */
+#else
+ const int32_t sampling_rate, /* i : sampling rate */
#endif
+ MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */
);
void invdct4_transform(
@@ -4559,12 +5243,14 @@ void ivas_masa_prerender(
const int16_t output_frame /* i : output frame length per channel */
);
+#ifdef JBM_TSM_ON_TCS
+#endif
+
void ivas_spar_param_to_masa_param_mapping(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
- const int16_t firstSubframe, /* i : First subframe to map */
- const int16_t nSubframes /* i : Number of subframes to map */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
+ const int16_t subframe /* i : Subframe to map */
);
@@ -4583,15 +5269,32 @@ void ivas_binRenderer_close(
#ifdef DEBUGGING
void ivas_binaural_cldfb(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
+);
+
+#ifdef JBM_TSM_ON_TCS
+void ivas_binaural_cldfb_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+
);
+#endif
+
#endif
void ivas_binRenderer(
BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */
HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */
#ifdef EXTERNAL_ORIENTATIONS
COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */
- int16_t subframe_idx, /* i : subframe index */
+ int16_t subframe_idx, /* i : subframe index */
+#endif
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i: : number of time slots to process */
#endif
float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */
float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */
@@ -4602,7 +5305,12 @@ void ivas_binRenderer(
void ivas_binaural_add_LFE(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
int16_t output_frame, /* i : length of input frame */
+#ifdef JBM_TSM_ON_TCS
+ float *input_f[], /* i : transport channels */
+ float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
);
@@ -4616,10 +5324,22 @@ ivas_error ivas_ism_renderer_open(
void ivas_ism_render(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: core-coder transport channels/object output */
+#else
float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */
+#endif
const int16_t output_frame /* i : output frame length per channel */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_ism_render_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *output_f[], /* i/o: core-coder transport channels/object output */
+ const int16_t n_samples_to_render /* i : output frame length per channel */
+);
+#endif
+
void ivas_ism_get_stereo_gains(
const float azimuth, /* i : object azimuth */
const float elevation, /* i : object elevation */
@@ -4629,21 +5349,42 @@ void ivas_ism_get_stereo_gains(
void ivas_mc2sba(
IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */
+#ifdef JBM_TSM_ON_TCS
+ float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */
+ float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */
+#else
float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */
+#endif
const int16_t output_frame, /* i : output frame length per channel */
const int16_t sba_order, /* i : SBA order */
const float gain_lfe /* i : gain for LFE, 0=ignore LFE */
);
void ivas_ism2sba(
+#ifdef JBM_TSM_ON_TCS
+ float *buffer_td[], /* i/o: TD signal buffers */
+#else
float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */
+#endif
ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */
const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */
- const int16_t num_objects, /* i : number of objects */
+ const int16_t nchan_ism, /* i : number of objects */
const int16_t output_frame, /* i : output frame length per channel */
const int16_t sba_order /* i : SBA order */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_ism2sba_sf(
+ float *buffer_in[], /* i : TC buffer */
+ float *buffer_out[], /* o : TD signal buffers */
+ ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */
+ const int16_t num_objects, /* i : number of objects */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ const int16_t offset, /* i : offset for the interpolatr */
+ const int16_t sba_order /* i : Ambisonic (SBA) order */
+);
+#endif
+
/*----------------------------------------------------------------------------------*
* Amplitude Panning VBAP prototypes
@@ -4692,10 +5433,17 @@ void ivas_ls_setup_conversion_close(
LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */
);
+
void ivas_ls_setup_conversion(
Decoder_Struct *st_ivas, /* i : IVAS decoder structure */
+ const int16_t input_chans, /* i : number of input channels to the renderer */
const int16_t output_frame, /* i : frame length */
+#ifdef JBM_TSM_ON_TCS
+ float *input[], /* i : LS input/output synthesis signal */
+ float *output[] /* i/o: LS input/output synthesis signal */
+#else
float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */
+#endif
);
void ivas_ls_setup_conversion_process_mdct(
@@ -4709,7 +5457,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc(
);
void ivas_lssetupconversion_process_param_mc(
- Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */
+ Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t num_timeslots, /* i : number of time slots to process */
+#endif
float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */
float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */
int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */
@@ -4828,7 +5579,14 @@ void computeReferencePower_enc(
float *reference_power, /* o : Estimated power */
const int16_t enc_param_start_band, /* i : first band to process */
const int16_t num_freq_bands, /* i : Number of frequency bands */
+#ifndef SBA_MODE_CLEAN_UP
const SBA_MODE sba_mode /* i : SBA mode */
+#else
+ const IVAS_FORMAT ivas_format, /* i : ivas_format */
+ int16_t ref_power_w /* i : use 0 if hodirac is enabled */
+#endif
+ ,
+ const int16_t nchan_ana /* i : number of analysis channels */
);
ivas_error ivas_mono_dmx_renderer_open(
@@ -4936,10 +5694,21 @@ ivas_error ivas_td_binaural_open(
ivas_error ivas_td_binaural_renderer(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+#else
float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
+#endif
const int16_t output_frame /* i : output frame length */
);
+#ifdef JBM_TSM_ON_TCS
+ivas_error ivas_td_binaural_renderer_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */
+);
+#endif
/*----------------------------------------------------------------------------------*
* Filter-bank (FB) Mixer
@@ -4948,11 +5717,15 @@ ivas_error ivas_td_binaural_renderer(
ivas_error ivas_fb_set_cfg(
IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */
const int16_t ivas_format, /* i : IVAS format */
+#ifndef SBA_MODE_CLEAN_UP
const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
const int16_t num_in_chans, /* i : number of FB input channels */
const int16_t num_out_chans, /* i : number of FB output channels */
const int16_t active_w_mixing, /* i : active_w_mixing flag */
const int32_t sampling_Fs /* i : sampling rate */
+ ,
+ const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */
);
ivas_error ivas_FB_mixer_open(
@@ -4973,18 +5746,23 @@ void ivas_fb_mixer_pcm_ingest(
float pcm_in[][L_FRAME48k], /* i : input audio channels */
float **ppOut_pcm, /* o : output audio channels */
const int16_t frame_length /* i : frame length */
+ ,
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]
);
+#ifndef SBA_MODE_CLEAN_UP
void ivas_dirac_enc_spar_delay_synchro(
Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
const int16_t input_frame, /* i : input frame length */
float data_f[][L_FRAME48k] /* i/o: SBA channels (ACN / SN3D) */
);
-
+#endif
void ivas_fb_mixer_update_prior_input(
IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */
float *pcm_in[], /* i : input audio channels */
const int16_t length /* i : length of time slot */
+ ,
+ const int16_t nchan_fb_in /* i : number of analysis channels */
);
void ivas_fb_mixer_get_windowed_fr(
@@ -4994,6 +5772,8 @@ void ivas_fb_mixer_get_windowed_fr(
float *frame_f_imag[], /* o : imag freq domain values */
const int16_t length, /* i : number of new samples in time slot */
const int16_t mdft_len /* i : MDFT frame length */
+ ,
+ const int16_t nchan_fb_in /* i : number of analysis channels */
);
void ivas_fb_mixer_process(
@@ -5012,7 +5792,7 @@ void ivas_fb_mixer_get_in_out_mapping(
int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */
);
-/* !r: number of spectral bands */
+/*! r: number of spectral bands */
int16_t ivas_get_num_bands_from_bw_idx(
const int16_t bwidth /* i : audio bandwidth */
);
diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c
index 0f2491bad3545e1dcfe9a785d208aa1f702f3eb1..26dbb10df141b59d6a2eb4bcb186a72d1488bcb1 100644
--- a/lib_com/ivas_qmetadata_com.c
+++ b/lib_com/ivas_qmetadata_com.c
@@ -263,7 +263,7 @@ void ivas_qmetadata_close(
* scalar quantization using partition
*------------------------------------------------------------------------*/
-/* r: codeword index */
+/*! r: codeword index */
int16_t masa_sq(
const float in, /* i : input value */
const float *threshold, /* i : partition */
@@ -508,24 +508,31 @@ void masa_compensate_two_dir_energy_ratio_index(
const int16_t ratio_index_2, /* i : Input ratio for direction 2 */
int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */
int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
)
{
- float ratio1, ratio2, ratioSum;
+ float ratio1, ratio2;
+ float ratioSum;
ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1];
ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2];
- ratioSum = ratio1 + ratio2;
- if ( ratio1 >= ratio2 )
+ if ( !hodirac_flag )
{
- ratio2 = ratio2 / ratio1 * ratioSum;
- ratio1 = ratioSum;
- }
- else
- {
- ratio1 = ratio1 / ratio2 * ratioSum;
- ratio2 = ratioSum;
+ ratioSum = ratio1 + ratio2;
+ if ( ratio1 >= ratio2 )
+ {
+ ratio2 = ratio2 / ratio1 * ratioSum;
+ ratio1 = ratioSum;
+ }
+ else
+ {
+ ratio1 = ratio1 / ratio2 * ratioSum;
+ ratio2 = ratioSum;
+ }
}
+
*ratio_index_mod1 = masa_sq( 1.0f - ratio1, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
*ratio_index_mod2 = masa_sq( 1.0f - ratio2, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
@@ -610,6 +617,35 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation(
}
+/*-------------------------------------------------------------------------
+ * ivas_get_df_ratio_bits_hodirac()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+/*! r: bits to be used for quantizing ratio of ratios */
+int16_t ivas_get_df_ratio_bits_hodirac(
+ const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */
+)
+{
+ int16_t dfRatio_bits;
+
+ if ( index_diff >= DIFF_DFRATIO_1BIT_LIMIT_IDX )
+ {
+ dfRatio_bits = 1;
+ }
+ else if ( index_diff >= DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC )
+ {
+ dfRatio_bits = 2;
+ }
+ else
+ {
+ dfRatio_bits = 3;
+ }
+
+ return dfRatio_bits;
+}
+
/*---------------------------------------------------------------
* ivas_get_df_ratio_bits()
*
@@ -620,7 +656,7 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation(
/*! r: bits to be used for quantizing ratio of ratios */
int16_t ivas_get_df_ratio_bits(
- int16_t index_diff /* i : index of quantized diffuse-to-total ratio */
+ const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */
)
{
int16_t dfRatio_bits;
diff --git a/lib_com/ivas_qspherical_com.c b/lib_com/ivas_qspherical_com.c
index 039dea53eb97d18f2537058c841560ae1a90719a..874f66d05910606c7197034c36e8aef9491c628b 100644
--- a/lib_com/ivas_qspherical_com.c
+++ b/lib_com/ivas_qspherical_com.c
@@ -71,7 +71,7 @@ uint16_t ivas_qmetadata_reorder_generic(
* Returns the original value of the array "folded" by ReorderGeneric
*------------------------------------------------------------------------*/
-/* !r: "Unfolded" value, positive or negative depending on the value of the input */
+/*! r: "Unfolded" value, positive or negative depending on the value of the input */
int16_t ivas_qmetadata_dereorder_generic(
const uint16_t uns_value /* i : unsigned value result of ReorderGeneric */
)
@@ -234,7 +234,7 @@ void small_reduction_direction(
* Input phi expected to be an angle in degree between 0 and 360.
*-----------------------------------------------------------------------*/
-/* !r: index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi(
float phi, /* i : azimuth value */
const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */
@@ -401,7 +401,7 @@ float companding_azimuth(
* Input phi expected to be an angle in degree between 0 and 360.
*-----------------------------------------------------------------------*/
-/* !r: index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi_chan_lbr(
const float phi, /* i : azimuth value */
float *phi_hat, /* o : quantized azimuth */
@@ -445,7 +445,7 @@ int16_t quantize_phi_chan_lbr(
* Input phi expected to be an angle in degree between 0 and 360.
*-----------------------------------------------------------------------*/
-/* !r: index azimuth */
+/*! r: index azimuth */
int16_t quantize_phi_chan_compand(
float phi, /* i : azimuth value */
float *phi_hat, /* o : quantized azimuth */
diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c
index f04538c4790ca72f0a52ecd09c9cf9ecf9c4269e..9f67c602f6aaf3d2994aee41aeefdc48a3941d04 100644
--- a/lib_com/ivas_rom_com.c
+++ b/lib_com/ivas_rom_com.c
@@ -628,7 +628,6 @@ const float tdm_den_ratio_tabl[TDM_NQ+1] = /* 1.0f/(2*LR_ratio*LR_ratio-2*LR_ra
1.2088f, 1.1429f, 1.0902f, 1.0501f, 1.0221f, 1.0000f, 1.0000f, 1.0000f
};
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
const int16_t tdm_bit_allc_tbl[5][6] =
{
/* IC -- UC -- GC -- TM --AC */
@@ -638,21 +637,8 @@ const int16_t tdm_bit_allc_tbl[5][6] =
{ 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */
{ 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */
};
-#else
-const int16_t tdm_bit_allc_tbl[5][6] =
-{
- /* IC -- UC -- GC -- TM --AC */
- { 1600, 3450, 0, 4400, 0, 5000 }, /* IVAS_13k2 */
- { 1600, 3450, 0, 5000, 0, 5000 }, /* IVAS_16k4 */
- { 1600, 3450, 0, 6000, 0, 5000 }, /* IVAS_24k4 */
- { 1600, 6000, 0, 10000, 0, 10000 }, /* IVAS_32k */
- { 1600, 6000, 0, 13000, 0, 14000 } /* IVAS_48k */
-};
-#endif
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/* LSFs Intra-frame prediction tables */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
const float tdm_LSF_MEAN_RE_USE_OUT[M] =
{
301.292f, 521.300f, 870.818f, 1340.278f, 1712.099f, 2091.456f, 2488.523f, 2841.096f, 3196.565f, 3593.040f, 3958.366f, 4293.334f, 4710.319f, 5118.806f, 5546.761f, 5918.579f,
@@ -669,10 +655,10 @@ const float tdm_LSF_MEAN_RE_USE[M] =
3299.107307F, 3686.249102F, 4034.473656F, 4393.818819F, 4781.683038F, 5155.954294F, 5542.569582F, 5927.377309F
};
-const float tdm_Beta_Q1bit_re_use_132[2] = { 0.97F, 0.75F };
-const float tdm_Beta_Q1bit_re_use_164[2] = { 0.95F, 0.71F };
-const float tdm_Beta_Q1bit_re_use_244_320[2] = { 0.93F, 0.73F };
-const float tdm_Beta_Q1bit_re_use_480[2] = { 0.97F, 0.77F };
+const float tdm_Beta_Q1bit_re_use_13k2[2] = { 0.97F, 0.75F };
+const float tdm_Beta_Q1bit_re_use_16k4[2] = { 0.95F, 0.71F };
+const float tdm_Beta_Q1bit_re_use_24k4_32k[2] = { 0.93F, 0.73F };
+const float tdm_Beta_Q1bit_re_use_48k[2] = { 0.97F, 0.77F };
const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15] =
{
@@ -693,7 +679,6 @@ const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15] =
0.2043f, 0.6317f, 0.0543f,
0.1767f, 0.5396f,
};
-#endif
const float tdm_LSF_MEAN_PRED_QNT[M] =
{
@@ -729,7 +714,6 @@ const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15] =
0.1709f, 0.6372f, 0.1060f,
0.1193f, 0.6574f,
};
-#endif
const int16_t fast_FCB_bits_2sfr[] = {8, 14, 18, 20, 24, 128/*stop value*/};
@@ -893,7 +877,7 @@ const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] =
0, 1, 2, 3, 4
};
-
+const float c_weights[DIRAC_NO_FB_BANDS_MAX] = { 9.962447e-02f, 9.627997e-01f, 9.926667e-01f, 9.981028e-01f, 9.996648e-01f, 1.000000e+00f, 9.997692e-01f, 9.992002e-01f, 9.983890e-01f, 9.973818e-01f, 9.962037e-01f, 9.948692e-01f, 9.933876e-01f, 9.917654e-01f, 9.900073e-01f, 9.881169e-01f, 9.860975e-01f, 9.839516e-01f, 9.816818e-01f, 9.792906e-01f, 9.767801e-01f, 9.741527e-01f, 9.714106e-01f, 9.685560e-01f, 9.655913e-01f, 9.625187e-01f, 9.593406e-01f, 9.560594e-01f, 9.526774e-01f, 9.491970e-01f, 9.456208e-01f, 9.419512e-01f, 9.381908e-01f, 9.343420e-01f, 9.304075e-01f, 9.263898e-01f, 9.222915e-01f, 9.181152e-01f, 9.138636e-01f, 9.095392e-01f, 9.051447e-01f, 9.006827e-01f, 8.961559e-01f, 8.915668e-01f, 8.869181e-01f, 8.822123e-01f, 8.774521e-01f, 8.726400e-01f, 8.677785e-01f, 8.628702e-01f, 8.579176e-01f, 8.529231e-01f, 8.478893e-01f, 8.428184e-01f, 8.377130e-01f, 8.325753e-01f, 8.274077e-01f, 8.222124e-01f, 8.169917e-01f, 8.117478e-01f, 8.064829e-01f, 8.011990e-01f, 7.958982e-01f, 7.905827e-01f, 7.852543e-01f, 7.799150e-01f, 7.745667e-01f, 7.692112e-01f, 7.638505e-01f, 7.584861e-01f, 7.531199e-01f, 7.477535e-01f, 7.423885e-01f, 7.370265e-01f, 7.316691e-01f, 7.263176e-01f, 7.209736e-01f, 7.156384e-01f, 7.103134e-01f, 7.049999e-01f, 6.996990e-01f, 6.944121e-01f, 6.891403e-01f, 6.838847e-01f, 6.786464e-01f, 6.734265e-01f, 6.682258e-01f, 6.630455e-01f, 6.578863e-01f, 6.527492e-01f, 6.476350e-01f, 6.425445e-01f, 6.374784e-01f, 6.324376e-01f, 6.274226e-01f, 6.224341e-01f, 6.174729e-01f, 6.125393e-01f, 6.076341e-01f, 6.027577e-01f, 5.979106e-01f, 5.930932e-01f, 5.883061e-01f, 5.835497e-01f, 5.788242e-01f, 5.741301e-01f, 5.694676e-01f, 5.648372e-01f, 5.602390e-01f, 5.556734e-01f, 5.511404e-01f, 5.466405e-01f, 5.421737e-01f, 5.377402e-01f, 5.333402e-01f, 5.289738e-01f, 5.246411e-01f, 5.203422e-01f, 5.160771e-01f, 5.118460e-01f, 5.076489e-01f, 5.034858e-01f, 4.993567e-01f, 4.952616e-01f, 4.912005e-01f, 4.871734e-01f, 4.831802e-01f, 4.792209e-01f, 4.752955e-01f, 4.714037e-01f, 4.675457e-01f, 4.637212e-01f, 4.599302e-01f, 4.561725e-01f, 4.524481e-01f, 4.487567e-01f, 4.450983e-01f, 4.414728e-01f, 4.378799e-01f, 4.343195e-01f, 4.307915e-01f, 4.272956e-01f, 4.238318e-01f, 4.203997e-01f, 4.169993e-01f, 4.136303e-01f, 4.102926e-01f, 4.069859e-01f, 4.037101e-01f, 4.004649e-01f, 3.972501e-01f, 3.940655e-01f, 3.909109e-01f, 3.877861e-01f, 3.846909e-01f, 3.816250e-01f, 3.785882e-01f, 3.755803e-01f, 3.726010e-01f, 3.696501e-01f, 3.667275e-01f, 3.638328e-01f, 3.609658e-01f, 3.581263e-01f, 3.553141e-01f, 3.525289e-01f, 3.497705e-01f, 3.470387e-01f, 3.443331e-01f, 3.416537e-01f, 3.390001e-01f, 3.363720e-01f, 3.337694e-01f, 3.311919e-01f, 3.286393e-01f, 3.261114e-01f, 3.236079e-01f, 3.211286e-01f, 3.186733e-01f, 3.162418e-01f, 3.138337e-01f, 3.114490e-01f, 3.090872e-01f, 3.067484e-01f, 3.044321e-01f, 3.021382e-01f, 2.998664e-01f, 2.976166e-01f, 2.953885e-01f, 2.931819e-01f, 2.909966e-01f, 2.888323e-01f, 2.866889e-01f, 2.845661e-01f, 2.824637e-01f, 2.803816e-01f, 2.783194e-01f, 2.762770e-01f, 2.742543e-01f, 2.722509e-01f, 2.702667e-01f, 2.683014e-01f, 2.663550e-01f, 2.644271e-01f, 2.625177e-01f, 2.606264e-01f, 2.587531e-01f, 2.568977e-01f, 2.550599e-01f, 2.532395e-01f, 2.514364e-01f, 2.496503e-01f, 2.478811e-01f, 2.461287e-01f, 2.443928e-01f, 2.426732e-01f, 2.409698e-01f, 2.392824e-01f, 2.376109e-01f, 2.359550e-01f, 2.343146e-01f, 2.326895e-01f, 2.310797e-01f, 2.294848e-01f, 2.279047e-01f, 2.263394e-01f, 2.247886e-01f, 2.232521e-01f, 2.217299e-01f, 2.202217e-01f, 2.187274e-01f, 2.172469e-01f, 2.157800e-01f, 2.143266e-01f, 2.128865e-01f, 2.114596e-01f, 2.100457e-01f, 2.086447e-01f, 2.072564e-01f, 2.058808e-01f };
/*----------------------------------------------------------------------*
* SPAR ROM tables
@@ -903,6 +887,21 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] =
{
/* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel
so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */
+ { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,
+#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX
+ { { 10000, 8150, 13150 } },
+#else
+ { { 10000, 8300, 13150 } },
+#endif
+ { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 },
+
+ { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,
+#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX
+ { { 13200, 11350, 16350 } },
+#else
+ { { 13200, 11500, 16350 } },
+#endif
+ { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 },
{ 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 14850, 24350 } },
{ { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 },
@@ -936,7 +935,13 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] =
{ { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 },
{ 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } },
- { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 31, 1, 1, 1 } }, 1, 2, 0 },
+ { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },
+#ifdef ARITH_HUFF_CODER_CHANGES
+ { 1, 1, 1, 1 }
+#else
+ { 31, 1, 1, 1 }
+#endif
+ }, 1, 2, 0 },
{ 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, // not yet optimized
{ { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 },
@@ -950,10 +955,10 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] =
{ 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized
{ { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 },
- { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 97700, 93300, 128000 } }, // not yet optimized
+ { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized
{ { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 },
- { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 127200, 122550, 128000 },{ 76300, 73550, 128000 } }, // not yet optimized
+ { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, // not yet optimized
{ { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 },
};
@@ -1471,11 +1476,13 @@ const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } };
const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } };
const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } };
-const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */
- { 0, 1, 3, 2, 4, 5, 6, 7}
+const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */
+ { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 }
};
-const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 };
-const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15};
+const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 };
+const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15};
+const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10};
+const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
/*----------------------------------------------------------------------*
@@ -2531,7 +2538,48 @@ const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_
/*----------------------------------------------------------------------------------*
* MASA ROM tables
*----------------------------------------------------------------------------------*/
-
+#ifdef HR_METADATA
+
+const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS] =
+{
+ 0.00f,
+ 0.0142822265625f,
+ 0.030029296875f,
+ 0.052001953125f,
+ 0.07708740234375f,
+ 0.10528564453125f,
+ 0.14483642578125f,
+ 0.19573974609375f,
+ 0.26568603515625f,
+ 0.35467529296875f,
+ 0.436279296875f,
+ 0.510498046875f,
+ 0.5943603515625f,
+ 0.6878662109375f,
+ 0.80096435546875f,
+ 0.93365478515625f
+};
+const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1] =
+{
+ 0.0f,
+ 0.009521484375f,
+ 0.01904296875f,
+ 0.0410156250f,
+ 0.06298828125f,
+ 0.0911865234375f,
+ 0.119384765625f,
+ 0.1702880859375f,
+ 0.22119140625f,
+ 0.3101806640625f,
+ 0.399169921875f,
+ 0.473388671875f,
+ 0.547607421875f,
+ 0.641113281250f,
+ 0.734619140625f,
+ 0.8673095703125f,
+ 2.0f /* out-of-range large value to make searching easier */
+};
+#endif
const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] =
{
11,
@@ -2544,6 +2592,7 @@ const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] =
3
};
+
const float coherence_cb0_masa[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] =
{
/* this is the same */
@@ -2726,7 +2775,11 @@ const uint8_t masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] =
const uint8_t masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] =
{
+#ifdef HR_METADATA
+ 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24
+#else
0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 12
+#endif
};
const uint8_t masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] =
@@ -3980,6 +4033,28 @@ const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1] =
0.0760120586092433f, 0.0564205163668375f, 0.0368072229413588f, 0.0171797396307788f
};
+const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] =
+{
+ 1.0000000000f, 0.9999143276f, 0.9996573250f, 0.9992290362f, 0.9986295348f, 0.9978589232f, 0.9969173337f,
+ 0.9958049276f, 0.9945218954f, 0.9930684570f, 0.9914448614f, 0.9896513868f, 0.9876883406f, 0.9855560591f,
+ 0.9832549076f, 0.9807852804f, 0.9781476007f, 0.9753423205f, 0.9723699204f, 0.9692309097f, 0.9659258263f,
+ 0.9624552365f, 0.9588197349f, 0.9550199445f, 0.9510565163f, 0.9469301295f, 0.9426414911f, 0.9381913359f,
+ 0.9335804265f, 0.9288095529f, 0.9238795325f, 0.9187912101f, 0.9135454576f, 0.9081431738f, 0.9025852843f,
+ 0.8968727415f, 0.8910065242f, 0.8849876375f, 0.8788171127f, 0.8724960071f, 0.8660254038f, 0.8594064115f,
+ 0.8526401644f, 0.8457278217f, 0.8386705679f, 0.8314696123f, 0.8241261886f, 0.8166415552f, 0.8090169944f,
+ 0.8012538127f, 0.7933533403f, 0.7853169309f, 0.7771459615f, 0.7688418321f, 0.7604059656f, 0.7518398075f,
+ 0.7431448255f, 0.7343225094f, 0.7253743710f, 0.7163019434f, 0.7071067812f, 0.6977904598f, 0.6883545757f,
+ 0.6788007455f, 0.6691306064f, 0.6593458151f, 0.6494480483f, 0.6394390020f, 0.6293203910f, 0.6190939493f,
+ 0.6087614290f, 0.5983246006f, 0.5877852523f, 0.5771451900f, 0.5664062369f, 0.5555702330f, 0.5446390350f,
+ 0.5336145159f, 0.5224985647f, 0.5112930861f, 0.5000000000f, 0.4886212415f, 0.4771587603f, 0.4656145203f,
+ 0.4539904997f, 0.4422886902f, 0.4305110968f, 0.4186597375f, 0.4067366431f, 0.3947438564f, 0.3826834324f,
+ 0.3705574375f, 0.3583679495f, 0.3461170571f, 0.3338068592f, 0.3214394653f, 0.3090169944f, 0.2965415750f,
+ 0.2840153447f, 0.2714404499f, 0.2588190451f, 0.2461532930f, 0.2334453639f, 0.2206974350f, 0.2079116908f,
+ 0.1950903220f, 0.1822355255f, 0.1693495038f, 0.1564344650f, 0.1434926220f, 0.1305261922f, 0.1175373975f,
+ 0.1045284633f, 0.0915016187f, 0.0784590957f, 0.0654031292f, 0.0523359562f, 0.0392598158f, 0.0261769483f,
+ 0.0130895956f, 0.0000000000f
+};
+
const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1] =
{
-0.00490871880799799f, -0.0441642771270674f, -0.0833517373318975f, -0.122410675199216f,
@@ -5530,5 +5605,843 @@ const int16_t ivas_num_active_bands[FB - WB + 1] =
IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12
};
+const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 };
+const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 };
+
+/* pre-rounded codebook vectors for singed Q4.12 represantation */
+const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = {
+ -1.8305664f, -2.0878906f, -0.9638672f, 2.8059082f, 2.668213f, 1.1638184f, 1.390625f, 1.217041f, 1.3850098f, 0.44555664f, -0.47045898f, -0.5307617f, -0.810791f, -1.1647949f, -1.4560547f, -1.7612305f,
+ -2.5979004f, -3.3308105f, -1.8554688f, -0.3605957f, 1.6828613f, 2.5871582f, 0.98168945f, 0.22436523f, -0.13110352f, 0.16699219f, 1.5004883f, 0.3293457f, 0.33569336f, 1.1591797f, 0.1796875f, -0.8718262f,
+ 1.982666f, 2.2011719f, 1.1525879f, 0.8093262f, 0.86499023f, 1.1618652f, 1.2888184f, 1.3618164f, 1.0827637f, 0.83251953f, 0.12011719f, -0.7182617f, -2.1948242f, -3.0500488f, -3.3571777f, -3.53833f,
+ 0.15771484f, 1.1040039f, 0.39282227f, -0.6479492f, -1.0939941f, -1.0437012f, -1.2055664f, -1.1469727f, -0.998291f, -0.37768555f, 0.3486328f, 1.081543f, 1.2700195f, 1.2143555f, 0.8371582f, 0.107666016f,
+ 0.24438477f, -0.70751953f, -1.1660156f, -1.1777344f, -0.24536133f, 0.39624023f, 1.112793f, 1.232666f, 1.3540039f, 1.088623f, 0.9001465f, 0.9003906f, -0.030761719f, -0.83740234f, -1.2800293f, -1.7849121f,
+ -0.91918945f, -0.18603516f, -0.7397461f, -1.5285645f, -1.7453613f, -1.2680664f, -0.9445801f, 0.2434082f, 1.3000488f, 1.6604004f, 1.2814941f, 1.0026855f, 0.71484375f, 0.56347656f, 0.47509766f, 0.09008789f,
+ 2.4824219f, 1.4541016f, 0.91064453f, 0.6765137f, 0.5678711f, 0.6965332f, 0.7609863f, 0.70410156f, 0.36108398f, -0.032470703f, -0.69140625f, -1.1281738f, -1.4833984f, -1.5556641f, -1.7043457f, -2.0187988f,
+ 2.41333f, 1.4936523f, 0.9902344f, 0.9104004f, 0.7211914f, 0.5522461f, 0.09326172f, -0.21655273f, -0.49560547f, -0.4873047f, -0.7363281f, -0.9211426f, -1.0041504f, -0.9875488f, -1.0681152f, -1.2578125f,
+ -0.814209f, 1.2546387f, 1.6965332f, 1.420166f, 0.99560547f, 1.1420898f, 1.0039062f, 0.9289551f, 0.6604004f, 0.22485352f, -0.6530762f, -1.2009277f, -1.2949219f, -1.3759766f, -1.7175293f, -2.2705078f,
+ -1.3979492f, 0.18896484f, 0.34814453f, -0.052001953f, -0.38623047f, -0.25878906f, -0.3371582f, -0.109375f, -0.08227539f, 0.07495117f, -0.019042969f, 0.1184082f, 0.30566406f, 0.5102539f, 0.6755371f, 0.4206543f,
+ 1.0683594f, 1.9543457f, 2.1296387f, 2.071045f, 1.5754395f, 1.1333008f, 0.4248047f, -0.19799805f, -0.84350586f, -1.079834f, -1.3415527f, -1.3908691f, -1.3967285f, -1.3078613f, -1.3322754f, -1.4663086f,
+ 2.3891602f, 2.5097656f, 1.144043f, 0.36572266f, -0.16894531f, -0.23388672f, 0.26879883f, 0.7692871f, 0.54589844f, 0.5180664f, -0.26879883f, -0.92211914f, -1.2089844f, -1.4658203f, -1.9033203f, -2.338623f,
+ -1.3549805f, 1.3427734f, 1.5871582f, 1.9365234f, 0.58935547f, 0.4892578f, -0.17675781f, -0.19458008f, 0.11352539f, 0.01928711f, 0.30419922f, -0.23291016f, -2.1499023f, -1.2368164f, -0.20922852f, -0.8269043f,
+ 0.8769531f, -1.5319824f, -1.6025391f, -1.3833008f, -0.57299805f, -0.8847656f, -0.90600586f, -0.986084f, -1.1860352f, -1.3520508f, -1.2216797f, -0.49902344f, 1.5070801f, 4.0805664f, 2.208496f, 3.4538574f,
+ 4.114258f, 3.3249512f, 2.2033691f, 1.0500488f, 0.14770508f, -0.36547852f, -0.748291f, -0.8503418f, -1.0917969f, -1.0305176f, -1.1955566f, -1.2768555f, -1.1767578f, -1.0061035f, -0.9506836f, -1.1477051f,
+ 0.7878418f, 2.513916f, 1.0112305f, -0.767334f, -1.3525391f, -0.86865234f, 0.42456055f, 1.4470215f, 1.2680664f, 1.1574707f, -0.41333008f, -0.92993164f, -0.9226074f, -0.92285156f, -0.80859375f, -1.6242676f,
+ -2.2216797f, -1.2346191f, -0.4008789f, 0.59765625f, -0.49389648f, 1.1911621f, 0.032470703f, 1.3654785f, 0.43139648f, 1.2021484f, 1.6652832f, 0.58862305f, -0.29541016f, -0.99560547f, -1.0366211f, -0.39526367f,
+ -1.8601074f, -2.9248047f, 0.14648438f, 0.61157227f, 0.6274414f, -1.3579102f, 0.48095703f, -0.4399414f, 0.57006836f, 1.1831055f, -1.1950684f, 0.828125f, 1.2575684f, 1.5888672f, 0.5510254f, -0.06762695f,
+ 2.1816406f, 2.8918457f, 2.9243164f, 2.5839844f, 2.2548828f, 1.7543945f, 0.92626953f, 0.45751953f, -0.17285156f, -0.9650879f, -1.7875977f, -2.3608398f, -2.6245117f, -2.6313477f, -2.6652832f, -2.767334f,
+ 2.0964355f, 0.20458984f, -1.2553711f, -2.0012207f, -1.9951172f, -1.407959f, -1.0788574f, -0.47460938f, -0.01928711f, 0.45239258f, 0.73779297f, 0.9333496f, 1.0112305f, 1.1274414f, 0.90893555f, 0.7597656f,
+ -1.2897949f, 0.13867188f, 0.4831543f, 0.6274414f, 0.5175781f, 0.54541016f, 0.46826172f, 0.548584f, 0.39135742f, 0.4975586f, 0.38671875f, -0.022705078f, -0.36083984f, -0.8190918f, -1.0593262f, -1.0527344f,
+ 0.80029297f, 0.57250977f, 0.068359375f, -0.70996094f, -1.0571289f, -0.92041016f, -0.74121094f, -0.3017578f, 0.1850586f, 0.7922363f, 0.76171875f, 0.55859375f, 0.39135742f, 0.22363281f, -0.09790039f, -0.5253906f,
+ 4.5966797f, 2.5993652f, 0.8737793f, -0.9536133f, -0.07006836f, 2.6501465f, 1.3757324f, -0.8967285f, -1.6777344f, -1.2912598f, -0.5917969f, -1.3334961f, -1.4775391f, -0.6760254f, -1.0019531f, -2.1257324f,
+ -1.0061035f, 0.67407227f, 0.9157715f, 0.9851074f, 0.78564453f, -0.009277344f, -0.40039062f, -0.12524414f, -0.18310547f, -0.0029296875f, -0.38989258f, -0.40820312f, -0.37158203f, -0.15551758f, 0.010253906f, -0.3178711f,
+ -1.3325195f, 0.7138672f, 1.6359863f, 2.2177734f, 1.659668f, 1.9414062f, 1.0874023f, 1.3305664f, 1.4523926f, 1.2883301f, -0.56225586f, -2.0280762f, -2.8566895f, -2.5690918f, -2.1638184f, -1.8144531f,
+ 0.0925293f, 1.5366211f, 2.095459f, 1.9145508f, 1.4782715f, 0.8676758f, -0.34643555f, -0.21826172f, -1.1254883f, -1.1550293f, -0.92211914f, -0.5473633f, -0.89868164f, -0.77441406f, -0.8112793f, -1.1855469f,
+ 2.2070312f, 3.5219727f, 1.9643555f, 0.5649414f, -0.021728516f, 0.14941406f, 0.15991211f, 0.21850586f, -1.1708984f, -1.1306152f, -0.32299805f, -0.064453125f, -1.4772949f, -1.6064453f, -1.3984375f, -1.5932617f,
+ 2.5195312f, 2.3515625f, 1.3063965f, 0.20825195f, -0.609375f, -1.088623f, -1.3623047f, -1.2600098f, -1.3369141f, -1.0693359f, -0.8010254f, -0.42773438f, -0.15234375f, 0.44799805f, 0.5998535f, 0.6743164f,
+ 1.5209961f, 1.0463867f, 0.74560547f, 0.51342773f, 0.34448242f, 0.21533203f, -0.028320312f, -0.084228516f, 0.08618164f, 0.12475586f, -0.3557129f, -0.5698242f, -0.63012695f, -0.6933594f, -0.9638672f, -1.2717285f,
+ -0.5739746f, -0.20629883f, -0.9890137f, -1.8708496f, -1.9855957f, -1.6159668f, -1.6103516f, -1.3623047f, -0.9399414f, -0.067871094f, 0.9128418f, 1.7995605f, 2.1074219f, 2.2941895f, 2.331787f, 1.7766113f,
+ 3.6323242f, 1.9743652f, 0.3935547f, -0.6862793f, -1.1130371f, -1.0187988f, -0.8935547f, -0.5998535f, -0.4345703f, -0.2290039f, -0.26416016f, -0.21484375f, -0.13208008f, 0.009765625f, -0.16601562f, -0.2578125f,
+ -0.0871582f, 1.651123f, 1.8327637f, 0.54125977f, 0.23999023f, 1.421875f, 0.79663086f, 1.309082f, 0.98217773f, 1.2548828f, -1.8842773f, -1.8806152f, -1.5390625f, -1.3496094f, -1.2785645f, -2.0100098f,
+ -2.2109375f, -0.70288086f, 1.1103516f, 2.2207031f, 2.3356934f, 2.010498f, 1.638916f, 1.4345703f, 1.0351562f, 0.5690918f, -0.11035156f, -0.88256836f, -1.5859375f, -2.0117188f, -2.31958f, -2.5310059f,
+ -1.6091309f, -2.519287f, -2.4504395f, 0.26660156f, 2.321289f, 2.5898438f, 3.5390625f, -1.0505371f, -1.2543945f, -0.27734375f, 0.94873047f, 1.3859863f, 0.7109375f, -1.0185547f, -1.2666016f, -0.31689453f,
+ 0.94433594f, 2.465332f, 2.668457f, 1.9997559f, 1.2949219f, 1.0178223f, 0.888916f, 0.7038574f, 0.29248047f, -0.050048828f, -0.77001953f, -1.4472656f, -2.0839844f, -2.5202637f, -2.6381836f, -2.7663574f,
+ -0.14160156f, -0.3083496f, -0.5864258f, -1.2387695f, -1.4682617f, -1.1057129f, -0.7817383f, -0.5292969f, -0.06323242f, 0.54003906f, 0.8947754f, 1.3034668f, 1.3681641f, 1.1462402f, 0.7866211f, 0.18408203f,
+ 0.40478516f, -0.94018555f, -1.2241211f, -1.1057129f, -0.43066406f, -0.07324219f, 2.0061035f, 4.0029297f, 0.48828125f, 0.20117188f, 0.16235352f, -0.4182129f, -0.7751465f, -0.74072266f, -0.7463379f, -0.81152344f,
+ -2.7770996f, -2.1079102f, -1.5097656f, -1.515625f, -1.0080566f, -0.036621094f, 0.3708496f, 1.060791f, 1.3742676f, 1.2963867f, 0.9782715f, 1.0876465f, 0.9584961f, 0.8691406f, 0.7578125f, 0.20092773f,
+ 1.8244629f, 2.9589844f, 2.7573242f, 1.1542969f, 0.87109375f, 1.3430176f, 0.9003906f, 0.8564453f, 0.41308594f, -0.40551758f, -2.0913086f, -2.3833008f, -2.1589355f, -1.9533691f, -1.9741211f, -2.1125488f,
+ 2.1027832f, 1.2624512f, 1.0627441f, 0.8051758f, 0.22583008f, -0.12939453f, -0.3996582f, -0.54052734f, -0.74975586f, -0.7180176f, -0.7895508f, -0.7229004f, -0.6113281f, -0.2956543f, -0.21484375f, -0.28710938f,
+ 0.15161133f, 2.585205f, 1.7568359f, 0.9177246f, 0.37329102f, -0.16088867f, -0.4633789f, -0.21801758f, -0.09277344f, -0.021484375f, -0.22631836f, -0.42382812f, -0.66625977f, -0.8803711f, -1.0666504f, -1.5649414f,
+ -2.6091309f, -1.9162598f, -1.4050293f, -1.5510254f, -1.4436035f, -0.76904297f, -0.6994629f, -0.28881836f, -0.09326172f, 0.4140625f, 0.6401367f, 1.267334f, 1.7597656f, 2.1586914f, 2.4848633f, 2.0510254f,
+ -0.08935547f, 1.982666f, 2.4018555f, 1.3012695f, 0.122802734f, 0.8886719f, 1.3410645f, 1.0705566f, 0.115234375f, -0.2043457f, -0.97094727f, -2.4370117f, -2.147705f, -1.3283691f, -0.74731445f, -1.298584f,
+ 2.5476074f, 0.140625f, -0.8376465f, -1.244873f, -1.2324219f, -0.7644043f, -0.34521484f, 0.3581543f, 0.60839844f, 0.5698242f, 0.3034668f, 0.06274414f, 0.27563477f, 0.35498047f, -0.28588867f, -0.5109863f,
+ -0.5878906f, 1.0141602f, 1.5241699f, 1.2287598f, 0.76123047f, 0.6047363f, 0.2199707f, 0.21044922f, 0.15185547f, 0.15307617f, -0.115478516f, -0.46313477f, -0.689209f, -0.9284668f, -1.3129883f, -1.770752f,
+ 1.4040527f, -0.9628906f, -1.3322754f, -0.79785156f, 0.06591797f, -0.045166016f, -0.33520508f, -0.6257324f, -0.91748047f, -0.9824219f, -0.9892578f, -0.84472656f, -0.66137695f, -0.057861328f, 2.248291f, 4.8339844f,
+ 2.727539f, 3.736084f, 3.4023438f, 2.6699219f, 1.3686523f, 0.091308594f, -0.7897949f, -1.1069336f, -1.4260254f, -1.4335938f, -1.5388184f, -1.5930176f, -1.5603027f, -1.5078125f, -1.473877f, -1.565918f,
+ 1.2629395f, 2.5461426f, 1.8774414f, -0.051513672f, -1.0480957f, -0.94873047f, -0.40551758f, 0.21875f, 0.01977539f, -0.1484375f, -0.44140625f, -0.5810547f, -0.5349121f, -0.4650879f, -0.51831055f, -0.7819824f,
+ -2.1455078f, -0.25683594f, 1.3151855f, 1.635498f, 1.4401855f, 0.89624023f, 0.8405762f, 0.9350586f, 0.9802246f, 0.67041016f, -0.13085938f, -0.59521484f, -0.9729004f, -1.145752f, -1.4951172f, -1.9714355f,
+ -2.1291504f, -2.1418457f, -0.46704102f, 0.73291016f, 1.2219238f, -0.27856445f, -0.30517578f, 1.1865234f, 0.87231445f, -0.060791016f, 0.060058594f, 0.43701172f, 0.79174805f, 0.9128418f, -0.046142578f, -0.7866211f,
+ 3.130127f, 2.7661133f, 1.8110352f, 1.4995117f, 1.095459f, 0.8935547f, 0.8383789f, 0.5913086f, 0.21923828f, -0.1965332f, -0.982666f, -1.7121582f, -2.2011719f, -2.409912f, -2.5390625f, -2.803711f,
+ 1.5769043f, 0.34960938f, -0.17211914f, -0.4428711f, -0.62597656f, -0.57055664f, -0.6516113f, -0.43676758f, -0.38208008f, -0.18725586f, -0.16992188f, -0.0034179688f, 0.15356445f, 0.39404297f, 0.56396484f, 0.60424805f,
+ 0.12768555f, 0.2109375f, 0.16137695f, 0.063964844f, 0.13012695f, 0.39526367f, 0.5834961f, 0.62353516f, 0.50683594f, 0.37402344f, 0.060546875f, -0.13232422f, -0.37719727f, -0.6010742f, -0.8376465f, -1.2895508f,
+ 0.6723633f, 1.9140625f, 0.3737793f, -1.2988281f, -1.7912598f, -1.2351074f, -0.44628906f, 0.5895996f, 0.6838379f, 0.58935547f, 0.22460938f, -0.013183594f, -0.16479492f, 0.072021484f, 0.14501953f, -0.3149414f,
+ 4.0183105f, 2.2834473f, 1.317627f, 1.2583008f, 1.5627441f, 0.9851074f, 0.12817383f, -0.2944336f, -0.65527344f, -0.9675293f, -1.3979492f, -1.5356445f, -1.5737305f, -1.5908203f, -1.6887207f, -1.8493652f,
+ 0.8132324f, 0.6748047f, 0.44433594f, 0.35375977f, 0.09863281f, 0.048095703f, -0.15063477f, -0.12646484f, -0.18432617f, -0.15258789f, -0.30517578f, -0.29101562f, -0.31201172f, -0.23876953f, -0.26635742f, -0.40551758f,
+ 0.29345703f, 2.6530762f, 3.4177246f, 2.5812988f, 2.1159668f, 1.3947754f, 0.9523926f, 0.41479492f, -0.15844727f, -0.9025879f, -1.5444336f, -1.9780273f, -2.2106934f, -2.2788086f, -2.3234863f, -2.4267578f,
+ 0.75805664f, 2.5563965f, 2.8410645f, 2.2597656f, 0.3876953f, -1.067627f, -1.425293f, -0.795166f, -0.6105957f, -0.66381836f, -0.9675293f, -1.0371094f, -0.88916016f, -0.5444336f, -0.19042969f, -0.6118164f,
+ 1.7177734f, 3.0668945f, 3.2519531f, 2.4799805f, 0.7363281f, -0.8156738f, -0.8125f, 0.1430664f, 0.34375f, -0.27563477f, -1.4462891f, -1.4350586f, -1.4143066f, -1.6706543f, -1.8481445f, -2.0212402f,
+ 2.756836f, 1.090332f, 0.61572266f, 0.1928711f, -0.34521484f, -0.47509766f, -0.36767578f, -0.0637207f, 0.14233398f, 0.19580078f, -0.16015625f, -0.43286133f, -0.6472168f, -0.5493164f, -0.80737305f, -1.1452637f,
+ 1.0544434f, 1.0671387f, 1.1149902f, 1.1230469f, 0.78637695f, 0.64282227f, 0.4868164f, 0.3413086f, 0.13769531f, -0.13085938f, -0.64990234f, -0.89453125f, -1.074707f, -1.114502f, -1.3056641f, -1.5842285f,
+ -1.8156738f, -1.3222656f, -1.4528809f, -1.8908691f, -1.8740234f, -1.1118164f, -1.1750488f, -0.5734863f, 0.16308594f, 1.5822754f, 2.0114746f, 1.8625488f, 1.6049805f, 1.5942383f, 1.5368652f, 0.8605957f,
+ 3.2451172f, 2.7807617f, 1.2692871f, 0.5222168f, 0.119384766f, -0.06616211f, -0.15722656f, -0.10424805f, -0.27197266f, -0.45263672f, -0.83618164f, -1.1611328f, -1.333252f, -1.2722168f, -1.2016602f, -1.0800781f,
+ 0.17333984f, 2.4299316f, 2.3254395f, 1.3701172f, 0.47509766f, 0.72216797f, 0.072753906f, -0.037597656f, -0.41845703f, -0.8137207f, -1.5649414f, -2.4125977f, -1.3486328f, -0.53027344f, -0.10546875f, -0.33740234f,
+ -2.5983887f, -1.9645996f, -0.5678711f, 0.48999023f, 0.86743164f, 0.62158203f, 1.189209f, 1.3269043f, 1.182373f, 1.0024414f, 0.54785156f, 0.25634766f, -0.12133789f, -0.44140625f, -0.7026367f, -1.0881348f,
+ 0.071777344f, -2.279541f, -2.057373f, -0.25512695f, 2.2199707f, 2.541748f, 0.8342285f, 0.7907715f, 0.5048828f, -0.1303711f, 0.2631836f, -0.37036133f, -0.5187988f, -0.42285156f, -0.66845703f, -0.52368164f,
+ 1.3261719f, 3.1193848f, 2.583496f, 0.6767578f, -0.022460938f, 0.5214844f, 0.6105957f, 1.0021973f, 0.66845703f, 0.8640137f, -0.37353516f, -2.0703125f, -2.3225098f, -2.136963f, -2.057129f, -2.3894043f,
+ 1.4580078f, 2.0153809f, 1.0583496f, -0.12792969f, -0.6064453f, -0.7011719f, -0.96118164f, -0.8588867f, -0.7414551f, -0.18896484f, 0.1550293f, 0.46166992f, 0.3881836f, 0.16113281f, -0.37109375f, -1.140625f,
+ 1.6044922f, 0.8898926f, -0.053222656f, -0.26611328f, 0.084228516f, 0.5666504f, 0.9013672f, 1.1362305f, 1.1520996f, 0.74243164f, 0.5168457f, 0.11206055f, -0.8305664f, -1.7199707f, -2.109375f, -2.7270508f,
+ -1.3208008f, -0.083984375f, -0.24169922f, -0.95043945f, -1.2331543f, -0.564209f, -0.018798828f, 0.95654297f, 1.142334f, 1.1772461f, 0.8063965f, 0.43359375f, 0.08227539f, 0.07446289f, 0.099853516f, -0.359375f,
+ 2.0480957f, 2.739746f, 2.1257324f, 1.1525879f, 0.7644043f, 0.5031738f, 0.2758789f, 0.19311523f, -0.08642578f, -0.15893555f, -0.89990234f, -1.2700195f, -1.5583496f, -1.791748f, -1.9023438f, -2.135254f,
+ 2.2700195f, 2.2856445f, 1.5393066f, 0.77563477f, 0.23632812f, -0.017578125f, -0.23071289f, -0.19995117f, -0.26342773f, -0.17700195f, -0.5046387f, -0.6687012f, -0.8383789f, -1.057373f, -1.3330078f, -1.8166504f,
+ 0.66015625f, 1.6772461f, 1.604248f, 1.5366211f, 1.1013184f, 0.8173828f, 0.5605469f, 0.7155762f, 0.5270996f, 0.23291016f, -0.37719727f, -0.8352051f, -1.3342285f, -1.7580566f, -2.2695312f, -2.8588867f,
+ 0.21484375f, -0.44580078f, -0.85253906f, -1.0334473f, -0.95043945f, -0.592041f, -0.47558594f, -0.20092773f, -0.06323242f, 0.16040039f, 0.24414062f, 0.5144043f, 0.70947266f, 0.8796387f, 0.9663086f, 0.92529297f,
+ -0.047851562f, 1.6748047f, 2.0949707f, 2.3344727f, 1.7766113f, 1.7685547f, 0.35913086f, 0.47509766f, -0.055664062f, -0.08251953f, -0.76049805f, -1.8425293f, -2.8457031f, -2.4018555f, -1.144043f, -1.3034668f,
+ 2.0942383f, 1.1809082f, 0.54345703f, 0.18408203f, -0.44360352f, -0.5373535f, 0.12182617f, 0.7114258f, 0.8088379f, 0.7709961f, -0.12866211f, -1.1555176f, -1.4138184f, -1.0009766f, -0.83081055f, -0.90478516f,
+ -1.0332031f, 1.6005859f, 0.46875f, 1.6149902f, -0.23095703f, 1.0908203f, 0.068359375f, 0.5266113f, 0.18701172f, -0.12792969f, -0.22509766f, -0.4819336f, -0.5058594f, -0.390625f, -1.2128906f, -1.3486328f,
+ 1.7792969f, 0.7167969f, -0.40039062f, -1.1201172f, -1.5458984f, -1.5344238f, -1.5107422f, -1.3601074f, -1.2751465f, -0.93847656f, -0.40795898f, 0.49145508f, 1.2475586f, 2.0236816f, 2.0373535f, 1.7973633f,
+ 2.8059082f, 2.769043f, 1.6977539f, 0.44458008f, -0.41308594f, -0.6376953f, -0.80566406f, -0.81030273f, -0.93115234f, -0.66845703f, -0.7155762f, -0.6870117f, -0.6052246f, -0.46142578f, -0.41967773f, -0.56225586f,
+ 1.9963379f, 2.9060059f, 1.5930176f, -0.34716797f, -0.7993164f, 0.061279297f, 1.0302734f, 1.1359863f, 0.7434082f, -0.07397461f, -1.3549805f, -1.2399902f, -1.2802734f, -1.2973633f, -1.4362793f, -1.6364746f,
+ -2.3041992f, -0.73999023f, 0.11791992f, 0.3215332f, 0.45092773f, 0.45751953f, 0.7368164f, 0.7216797f, 0.19238281f, 0.75439453f, 0.17822266f, -0.46679688f, -0.41210938f, 0.029785156f, 0.20996094f, -0.24829102f,
+ -0.9016113f, -1.2150879f, -0.13208008f, 0.7023926f, 0.81225586f, -0.57055664f, -1.0405273f, -0.5344238f, 0.1706543f, 0.579834f, 0.80810547f, 0.4790039f, 0.3671875f, 0.24829102f, 0.32202148f, -0.095214844f,
+ 1.4807129f, 1.8234863f, 1.7661133f, 2.5449219f, 2.6020508f, 1.9316406f, 1.3154297f, 1.1328125f, 0.5263672f, -0.17895508f, -1.1706543f, -2.199707f, -2.7531738f, -2.8725586f, -2.9294434f, -3.0187988f,
+ 2.6689453f, 0.5949707f, -0.45043945f, -0.7963867f, -0.91625977f, -0.90722656f, -0.98413086f, -0.8354492f, -0.6953125f, -0.3955078f, -0.2849121f, 0.04296875f, 0.43066406f, 0.7241211f, 0.81591797f, 0.9880371f,
+ -0.15112305f, -0.33618164f, -0.3256836f, -0.111083984f, -0.048339844f, 0.08129883f, 0.068115234f, 0.17138672f, 0.20385742f, 0.2590332f, 0.123291016f, 0.11621094f, 0.03100586f, 0.06201172f, 0.06591797f, -0.2097168f,
+ 1.2731934f, 0.29223633f, -0.14038086f, -0.29956055f, -0.6376953f, -0.56762695f, -0.15844727f, 0.46020508f, 0.6569824f, 0.68188477f, 0.28393555f, -0.18676758f, -0.43164062f, -0.3347168f, -0.38256836f, -0.5083008f,
+ 4.678711f, 2.80542f, 1.126709f, -0.48461914f, -0.8273926f, 0.7895508f, 2.3266602f, 0.4375f, -1.6252441f, -1.8422852f, -1.4978027f, -0.8730469f, -1.3171387f, -1.671875f, -1.0270996f, -0.998291f,
+ -1.3620605f, 0.63916016f, 1.1337891f, 0.3178711f, 0.06591797f, 1.0673828f, 0.91503906f, 0.4387207f, -0.18359375f, -0.22875977f, -0.6660156f, -0.69799805f, -0.17236328f, -0.21118164f, -0.24951172f, -0.8066406f,
+ -0.44873047f, 1.4709473f, 2.5039062f, 2.7050781f, 1.9462891f, 0.3642578f, -0.30078125f, 0.6467285f, 0.9680176f, 0.9716797f, -1.498291f, -1.8183594f, -1.8544922f, -1.847168f, -1.605957f, -2.2028809f,
+ 0.47460938f, 1.574707f, 1.7148438f, 2.1083984f, 1.7241211f, 0.44189453f, -0.40551758f, -0.18847656f, 0.13232422f, -0.0031738281f, -0.79467773f, -1.1843262f, -1.2902832f, -1.2416992f, -1.3430176f, -1.7194824f,
+ 1.9831543f, 3.927246f, 2.9868164f, 1.2749023f, 0.265625f, 0.02734375f, 0.079833984f, 0.47070312f, -0.7956543f, -1.2663574f, -1.638916f, -1.8222656f, -1.3908691f, -1.4194336f, -1.3027344f, -1.3791504f,
+ 0.2097168f, 1.8005371f, 1.479248f, 0.62109375f, 0.091552734f, -0.38549805f, -0.93530273f, -0.923584f, -0.91259766f, -0.6557617f, -0.5842285f, -0.27563477f, 0.007080078f, 0.25585938f, 0.25219727f, -0.044677734f,
+ 0.51293945f, 1.0280762f, 0.84033203f, 0.62841797f, 0.5317383f, 0.5251465f, 0.26953125f, 0.09423828f, 0.032958984f, -0.052734375f, -0.48999023f, -0.6513672f, -0.6411133f, -0.6369629f, -0.84375f, -1.1477051f,
+ -1.2319336f, -0.08203125f, -0.23632812f, -0.8339844f, -1.0866699f, -0.88793945f, -1.0917969f, -0.83251953f, -0.79467773f, -0.45751953f, -0.25830078f, 0.43041992f, 1.1853027f, 1.7946777f, 2.3452148f, 2.0378418f,
+ 4.881592f, 2.1987305f, 0.6430664f, -0.15478516f, -0.36206055f, -0.4753418f, -0.5410156f, -0.1965332f, -0.072753906f, -0.10888672f, -0.5263672f, -0.8588867f, -0.94506836f, -0.99487305f, -1.1523438f, -1.3347168f,
+ -0.5546875f, 2.1118164f, 2.2026367f, 0.70703125f, -0.21142578f, 0.8679199f, 1.1367188f, 1.012207f, 0.9904785f, 1.2463379f, 0.21801758f, -1.9433594f, -2.9155273f, -2.2661133f, -0.97631836f, -1.6257324f,
+ -0.80908203f, 1.0163574f, 1.546875f, 2.0847168f, 1.9309082f, 1.6364746f, 1.057373f, 1.1618652f, 0.76049805f, 0.29858398f, -0.46484375f, -1.0957031f, -1.6264648f, -2.0043945f, -2.5080566f, -2.9853516f,
+ -0.29760742f, -1.7080078f, -1.5229492f, 1.3574219f, 4.701172f, 1.6962891f, 4.1030273f, -0.4194336f, -1.0739746f, -1.0820312f, 0.4255371f, -1.0825195f, -1.3613281f, -1.1777344f, -1.3232422f, -1.2341309f,
+ 1.7912598f, 1.7314453f, 1.8457031f, 2.1989746f, 1.9145508f, 1.0024414f, 0.51538086f, 0.44506836f, -0.075683594f, -0.5439453f, -1.1616211f, -1.5820312f, -1.8642578f, -1.9123535f, -2.0385742f, -2.2666016f,
+ -0.03100586f, -1.7485352f, -1.767334f, -1.9833984f, -1.4570312f, -0.84716797f, -0.50390625f, 0.040771484f, 0.43554688f, 0.62402344f, 0.9133301f, 1.4772949f, 1.7192383f, 1.2922363f, 0.80029297f, 1.0356445f,
+ -1.1809082f, -2.032959f, -2.0617676f, -1.9443359f, -1.6447754f, -0.8874512f, 3.0722656f, 2.6242676f, 2.3166504f, 3.4455566f, 1.090332f, -0.19970703f, -0.23510742f, -0.6906738f, -0.40576172f, -1.2653809f,
+ -2.2512207f, -1.9179688f, -2.1035156f, -2.3461914f, -2.14917f, -1.1347656f, -0.56689453f, 0.8166504f, 1.857666f, 2.114502f, 1.755127f, 1.9160156f, 1.6611328f, 1.1904297f, 0.8239746f, 0.33398438f,
+ 0.8227539f, 2.0544434f, 2.3171387f, 0.90234375f, 0.515625f, 1.0241699f, 0.6188965f, 0.296875f, -0.171875f, -0.6345215f, -1.2004395f, -1.1652832f, -1.1635742f, -1.2021484f, -1.3903809f, -1.6240234f,
+ 1.2287598f, 1.5820312f, 1.2756348f, 0.6843262f, 0.33911133f, 0.09472656f, -0.26733398f, -0.4711914f, -0.3137207f, -0.19116211f, -0.56884766f, -0.67944336f, -0.5612793f, -0.55444336f, -0.69506836f, -0.90234375f,
+ 1.5776367f, 2.6791992f, 2.3059082f, 1.375f, 0.7619629f, 0.08251953f, -0.6166992f, -0.8574219f, -1.0148926f, -1.0390625f, -1.0976562f, -0.8730469f, -0.7844238f, -0.7331543f, -0.7426758f, -1.0231934f,
+ -2.173584f, -1.3400879f, -0.8208008f, -0.95996094f, -0.6999512f, -0.010253906f, -0.19384766f, 0.25561523f, 0.3786621f, 0.72998047f, 0.4699707f, 0.4416504f, 0.49975586f, 0.9416504f, 1.4606934f, 1.0205078f,
+ -0.2631836f, 1.3510742f, 1.3837891f, 2.0864258f, 1.8503418f, 1.8864746f, 0.8581543f, 0.5866699f, 0.103759766f, -0.9616699f, -1.8740234f, -2.5600586f, -1.1362305f, -0.9301758f, -1.4404297f, -0.94091797f,
+ 2.7443848f, 0.5695801f, -0.21679688f, -0.6513672f, -0.14672852f, 0.5019531f, 0.23754883f, -0.19091797f, -0.27685547f, -0.15332031f, -0.31201172f, -0.35742188f, -0.2529297f, -0.25024414f, -0.62646484f, -0.61816406f,
+ 0.045898438f, 0.24243164f, 0.36865234f, 0.9145508f, 0.96777344f, 1.0041504f, 0.9550781f, 0.9213867f, 0.7089844f, 0.4296875f, -0.1328125f, -0.5522461f, -0.9333496f, -1.2285156f, -1.607666f, -2.1037598f,
+ 4.209961f, 1.2607422f, -0.85791016f, -1.416748f, -1.4013672f, -0.8574219f, -1.0410156f, -1.4523926f, -1.7346191f, -1.7731934f, -1.5373535f, -1.026123f, 0.8515625f, 0.21533203f, 2.2263184f, 4.3342285f,
+ 4.5341797f, 4.130371f, 2.7658691f, 2.1801758f, 0.90478516f, 0.5617676f, -0.1303711f, -1.1745605f, -1.5371094f, -1.5292969f, -1.6901855f, -1.7126465f, -1.7119141f, -1.7536621f, -1.8623047f, -1.9750977f,
+ 0.6777344f, 2.2624512f, 1.1889648f, -0.5876465f, -0.81347656f, 0.38916016f, 0.11694336f, 0.15283203f, -0.5698242f, -0.5168457f, -0.41845703f, -0.3544922f, -0.46191406f, -0.24804688f, -0.14038086f, -0.6772461f,
+ -1.3227539f, -0.38085938f, 0.23852539f, 0.76123047f, 1.0078125f, 1.1433105f, 0.9753418f, 0.7734375f, 0.32373047f, 0.08959961f, -0.19482422f, -0.43603516f, -0.5715332f, -0.6135254f, -0.7351074f, -1.0581055f,
+ -1.3225098f, -1.4675293f, -1.3000488f, -0.59375f, 0.022705078f, 0.57299805f, 0.5710449f, 0.36547852f, 0.5119629f, 0.77685547f, 0.623291f, 0.43408203f, 0.41210938f, 0.5258789f, 0.2434082f, -0.37597656f,
+ 2.3742676f, 3.3117676f, 3.0449219f, 2.4208984f, 1.2329102f, 0.63793945f, 0.32666016f, 0.15161133f, -0.25610352f, -1.0283203f, -1.7250977f, -1.9707031f, -2.0761719f, -2.1174316f, -2.1105957f, -2.2165527f,
+ 0.87109375f, 0.5085449f, 0.19018555f, -0.10913086f, -0.36328125f, -0.3725586f, -0.4946289f, -0.38671875f, -0.38183594f, -0.21801758f, -0.2331543f, -0.088378906f, 0.0234375f, 0.24194336f, 0.40649414f, 0.40600586f,
+ 1.0517578f, 0.5126953f, 0.23608398f, 0.31835938f, 0.3605957f, 0.39941406f, 0.38012695f, 0.50390625f, 0.54541016f, 0.37329102f, -0.24731445f, -0.5891113f, -0.6791992f, -0.7324219f, -1.0258789f, -1.407959f,
+ -0.66625977f, 1.7709961f, 1.2971191f, 0.15283203f, -1.0664062f, -0.7583008f, 0.16821289f, 0.5007324f, 0.35058594f, 0.14086914f, 0.5217285f, -0.13452148f, -1.2158203f, -0.34375f, 0.033447266f, -0.751709f,
+ 3.684082f, 3.3139648f, 2.0878906f, 1.1911621f, 0.607666f, 0.1472168f, 0.15258789f, 0.10083008f, -0.2355957f, -0.45239258f, -1.2746582f, -1.7348633f, -1.8305664f, -1.8266602f, -1.8925781f, -2.03833f,
+ 0.5786133f, 0.7692871f, 0.4777832f, 0.05493164f, -0.12597656f, -0.08227539f, -0.095703125f, 0.05444336f, 0.19848633f, 0.3190918f, 0.030273438f, -0.06738281f, -0.17138672f, -0.2854004f, -0.59375f, -1.0615234f,
+ -0.98413086f, 1.059082f, 2.3671875f, 2.3381348f, 2.529541f, 2.1052246f, 1.887207f, 1.2434082f, 0.54956055f, -0.12646484f, -0.9199219f, -1.6921387f, -2.3168945f, -2.5715332f, -2.6733398f, -2.7949219f,
+ 2.5153809f, 3.854248f, 2.8759766f, 1.9558105f, -0.30126953f, -1.3845215f, -1.4958496f, -1.2636719f, -1.1201172f, -0.84887695f, -1.1677246f, -0.63061523f, -0.4970703f, -0.76904297f, -0.72998047f, -0.9926758f,
+ 0.4025879f, 2.572998f, 3.1643066f, 2.5009766f, 1.3688965f, -0.08691406f, -0.63500977f, -0.119140625f, 0.0073242188f, -0.5070801f, -0.7023926f, -2.0339355f, -2.0788574f, -1.8864746f, -0.9301758f, -1.0368652f,
+ 2.1965332f, 1.2878418f, 0.50878906f, -0.119140625f, -0.49267578f, -0.6008301f, -0.75219727f, -0.56518555f, -0.5427246f, -0.4038086f, -0.43408203f, -0.28198242f, -0.13745117f, 0.06958008f, 0.14331055f, 0.1237793f,
+ 0.5012207f, 2.1748047f, 1.7189941f, 0.1274414f, -0.2644043f, 0.46875f, 0.37963867f, 0.7302246f, 0.23413086f, 0.41845703f, -0.7944336f, -0.8984375f, -0.6816406f, -1.0744629f, -1.190918f, -1.8496094f,
+ -2.3083496f, -2.19458f, -2.2111816f, -2.4804688f, -2.3293457f, -1.651123f, -1.3820801f, -0.78125f, -0.14477539f, 0.8547363f, 1.6848145f, 2.4699707f, 2.5429688f, 2.793457f, 2.9118652f, 2.2253418f,
+ 1.7553711f, 2.8996582f, 1.9260254f, 0.40551758f, -0.0234375f, 0.44506836f, 0.31152344f, 0.1809082f, -0.47607422f, -0.4807129f, -1.204834f, -1.3293457f, -1.2412109f, -1.0134277f, -0.89501953f, -1.2602539f,
+ 0.2253418f, 2.2539062f, 2.265625f, 0.57128906f, -0.7661133f, -0.6245117f, 0.21313477f, 1.2248535f, 0.8737793f, -0.12524414f, -0.9609375f, -2.416504f, -1.1223145f, -0.70532227f, -0.31469727f, -0.592041f,
+};
+const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = {
+ -1.1569824f, -0.4765625f, 0.008056641f, 0.47802734f, 0.38330078f, -0.075683594f, -0.3737793f, -0.29516602f, -0.1352539f, 0.012939453f, 0.22241211f, 0.375f, 0.31689453f, 0.20874023f, 0.2541504f, 0.25439453f,
+ -0.40600586f, -0.22070312f, -0.04272461f, 0.15893555f, -0.25195312f, -0.6623535f, -0.27172852f, 0.28735352f, 0.35742188f, 0.20166016f, 0.052246094f, -0.3647461f, -0.4506836f, 0.1862793f, 0.66796875f, 0.7585449f,
+ 0.02734375f, -0.2097168f, -0.39819336f, -0.54296875f, -0.46850586f, -0.25146484f, -0.26953125f, -0.07495117f, 0.375f, 0.9343262f, 0.91625977f, 0.4267578f, 0.026123047f, -0.15576172f, -0.11425781f, -0.22021484f,
+ 0.011230469f, 0.37573242f, 0.8432617f, 0.7006836f, 0.5830078f, -0.49658203f, -0.84155273f, -0.46069336f, -0.16894531f, -0.006591797f, -0.075683594f, -0.2253418f, -0.2097168f, -0.12719727f, 0.006591797f, 0.092041016f,
+ 0.42382812f, 0.19360352f, 0.076171875f, 0.44091797f, 0.11401367f, -0.39819336f, -0.12207031f, 0.34960938f, 0.51660156f, -0.024902344f, -0.5324707f, -0.068359375f, 0.5083008f, -0.06591797f, -0.68359375f, -0.7277832f,
+ -0.12182617f, 0.15332031f, 0.3022461f, 0.23754883f, 0.2722168f, 0.8046875f, 0.76831055f, 0.28808594f, -0.05493164f, -0.29711914f, -0.45629883f, -0.42944336f, -0.42871094f, -0.4416504f, -0.35107422f, -0.24536133f,
+ -0.19873047f, -0.010253906f, -0.030517578f, -0.041748047f, 0.052490234f, 0.07446289f, 0.026123047f, -0.026611328f, 0.18579102f, 0.22485352f, 0.1965332f, 0.1538086f, 0.044677734f, -0.111328125f, -0.24853516f, -0.29052734f,
+ 0.7648926f, 0.47973633f, 0.31347656f, 0.1496582f, 0.23242188f, 0.16918945f, 0.05859375f, -0.12548828f, -0.18017578f, -0.19555664f, -0.17138672f, -0.19165039f, -0.23510742f, -0.3330078f, -0.37939453f, -0.3564453f,
+ -0.6201172f, -0.2915039f, -0.15234375f, 0.15966797f, 0.41430664f, 0.61206055f, 0.4453125f, 0.19360352f, -0.107666016f, -0.40429688f, -0.10424805f, 0.40649414f, 0.37817383f, -0.012939453f, -0.3857422f, -0.53100586f,
+ -0.6376953f, -0.01953125f, 0.32958984f, -0.27905273f, -0.21191406f, 0.8327637f, 0.28515625f, -0.31225586f, -0.4375f, -0.34204102f, -0.010498047f, 0.0546875f, 0.099365234f, 0.114746094f, 0.22973633f, 0.30444336f,
+ -0.76538086f, -0.5390625f, -0.38330078f, -0.39501953f, -0.21923828f, 0.19311523f, 0.1899414f, -0.08642578f, -0.044921875f, 0.13500977f, 0.4543457f, 0.6777344f, 0.5891113f, 0.30078125f, 0.04321289f, -0.14990234f,
+ 0.34838867f, -0.21826172f, 0.018066406f, 0.06689453f, 0.40063477f, 0.34570312f, -0.548584f, -0.86035156f, -0.24023438f, 0.60668945f, 0.22363281f, -0.05053711f, 0.13916016f, 0.02709961f, -0.07470703f, -0.18383789f,
+ 0.13842773f, 0.05444336f, 0.20629883f, -0.11450195f, -0.77563477f, -0.57543945f, 0.7011719f, 0.20117188f, -0.33984375f, 0.18481445f, 0.38232422f, -0.2097168f, -0.040771484f, 0.13476562f, 0.0769043f, -0.024658203f,
+ -0.24829102f, -0.47998047f, -0.7248535f, -0.64575195f, -0.2529297f, 0.43725586f, 0.6335449f, 0.6464844f, 0.53930664f, 0.33398438f, 0.13891602f, 0.30639648f, 0.3293457f, -0.07446289f, -0.3918457f, -0.54711914f,
+ -0.043945312f, -0.5168457f, -0.3779297f, 0.67089844f, 0.2548828f, -0.4663086f, -0.5402832f, -0.22338867f, 0.092285156f, 0.016845703f, 0.24780273f, 0.46850586f, 0.49902344f, 0.2734375f, -0.0925293f, -0.26245117f,
+ 0.014892578f, 0.3540039f, 0.35229492f, -0.13085938f, -0.49829102f, -0.52563477f, -0.05883789f, 0.024658203f, -0.29492188f, -0.4638672f, -0.17333984f, 0.3791504f, 0.47314453f, 0.29516602f, 0.19165039f, 0.060791016f,
+ -0.21264648f, -0.875f, -0.82958984f, -0.5048828f, -0.31835938f, -0.1430664f, 0.19580078f, 0.29174805f, 0.28637695f, 0.15356445f, 0.16894531f, 0.2241211f, 0.27734375f, 0.31835938f, 0.4091797f, 0.55810547f,
+ -1.2670898f, 0.016845703f, 0.36254883f, 0.65893555f, 0.59814453f, 0.49389648f, 0.18041992f, 0.1821289f, 0.15942383f, -0.016357422f, -0.18847656f, -0.36547852f, -0.3413086f, -0.2553711f, -0.14868164f, -0.06958008f,
+ 0.10644531f, 0.7878418f, 0.09643555f, -0.5786133f, -0.40966797f, 0.07055664f, 0.39819336f, 0.31030273f, 0.10986328f, 0.14013672f, 0.2680664f, 0.32861328f, 0.04296875f, -0.39648438f, -0.6052246f, -0.66967773f,
+ -0.49658203f, 0.26416016f, 0.657959f, 0.41137695f, 0.28881836f, 0.22338867f, 0.15527344f, -0.08325195f, -0.118652344f, 0.08544922f, 0.2841797f, 0.15258789f, -0.18554688f, -0.48388672f, -0.5810547f, -0.5734863f,
+ 0.22314453f, 0.37402344f, 0.2163086f, -0.5078125f, -0.95703125f, -1.1442871f, -0.35302734f, 0.68359375f, 0.67089844f, 0.31811523f, 0.12792969f, -0.15478516f, -0.0026855469f, 0.18237305f, 0.16870117f, 0.15429688f,
+ 0.26464844f, -0.11401367f, -0.106933594f, 0.26538086f, 0.51660156f, 0.5373535f, 0.35888672f, 0.16870117f, 0.20825195f, 0.2409668f, 0.14013672f, -0.0546875f, -0.3334961f, -0.58691406f, -0.74243164f, -0.7624512f,
+ 0.73779297f, -0.14477539f, -0.37646484f, -0.1003418f, 0.1027832f, 0.14160156f, 0.06738281f, -0.05444336f, -0.016357422f, -0.0234375f, -0.022216797f, -0.049316406f, -0.061035156f, -0.10864258f, -0.09057617f, -0.0017089844f,
+ 1.0466309f, 0.6826172f, 0.1315918f, -0.21020508f, -0.104003906f, -0.21191406f, -0.3256836f, -0.4729004f, -0.59765625f, -0.50805664f, -0.2043457f, 0.033935547f, 0.115722656f, 0.09423828f, 0.18017578f, 0.34960938f,
+ -0.9074707f, -0.25634766f, 0.14331055f, 0.03515625f, -0.076171875f, -0.1340332f, -0.0073242188f, 0.20922852f, 0.40063477f, 0.5883789f, 0.64868164f, 0.50024414f, 0.19238281f, -0.22338867f, -0.47998047f, -0.6333008f,
+ 0.40429688f, 0.021972656f, 0.059814453f, 0.5866699f, 1.2155762f, 0.35351562f, -0.17480469f, -0.0703125f, -0.09448242f, -0.24975586f, -0.39672852f, -0.3347168f, -0.3479004f, -0.38671875f, -0.36743164f, -0.21948242f,
+ 0.71850586f, -0.052246094f, -0.3918457f, -0.13745117f, 0.13793945f, 0.20458984f, 0.13623047f, -0.15039062f, -0.22436523f, -0.2446289f, 0.12158203f, 0.58496094f, 0.5527344f, -0.028320312f, -0.60180664f, -0.6254883f,
+ 0.007080078f, 0.32910156f, 0.41210938f, 0.033203125f, -0.2097168f, -0.06665039f, -0.15307617f, 0.020507812f, 0.33203125f, 0.8874512f, 0.7089844f, -0.4128418f, -0.71484375f, -0.4958496f, -0.29223633f, -0.38476562f,
+ -0.84765625f, 0.3466797f, 0.107910156f, -0.3659668f, -0.48583984f, -0.41552734f, -0.38232422f, -0.26953125f, 0.019042969f, 0.25219727f, 0.40039062f, 0.3984375f, 0.38427734f, 0.29785156f, 0.29589844f, 0.26391602f,
+ 0.47680664f, -0.0056152344f, -0.15307617f, -0.33764648f, -0.30737305f, 0.24511719f, 0.8847656f, 0.61035156f, -0.32861328f, -0.6430664f, -0.43823242f, -0.1899414f, -0.12475586f, -0.084228516f, 0.111328125f, 0.28393555f,
+ 1.0576172f, -0.23535156f, -0.9638672f, -0.84716797f, 0.3137207f, 1.1804199f, 0.7871094f, 0.14257812f, -0.018798828f, -0.21801758f, -0.20703125f, -0.11816406f, -0.10449219f, -0.16210938f, -0.3491211f, -0.25708008f,
+ -0.028564453f, -0.43652344f, -0.20336914f, 0.13623047f, 0.17822266f, 0.2175293f, -0.026367188f, -0.4050293f, -0.6472168f, -0.670166f, -0.26391602f, 0.3864746f, 0.685791f, 0.53808594f, 0.29077148f, 0.24853516f,
+ -0.32836914f, -0.09106445f, -0.11254883f, -0.34277344f, -0.5786133f, -0.5319824f, -0.45410156f, -0.34716797f, -0.2163086f, -0.1862793f, -0.09448242f, 0.14550781f, 0.32739258f, 0.6513672f, 1.0861816f, 1.0732422f,
+ 0.17163086f, 0.26391602f, 0.19165039f, 0.028320312f, -0.05517578f, 0.14355469f, 0.09057617f, 0.03125f, -0.20532227f, -0.36889648f, -0.58569336f, -0.7468262f, -0.75634766f, -0.04272461f, 0.84814453f, 0.9921875f,
+ 0.61376953f, -0.18969727f, -0.4868164f, -0.45410156f, -0.42089844f, -0.39868164f, -0.34399414f, -0.25610352f, -0.104003906f, 0.11791992f, 0.3408203f, 0.4416504f, 0.40942383f, 0.31689453f, 0.22802734f, 0.18603516f,
+ -0.5876465f, 0.19213867f, 0.30737305f, 0.46264648f, 0.37817383f, 0.08276367f, -0.36279297f, -0.51904297f, -0.53125f, -0.42382812f, -0.27075195f, -0.15063477f, -0.026611328f, 0.21655273f, 0.5439453f, 0.6879883f,
+ -0.5786133f, -0.046875f, 0.0390625f, -0.026123047f, 0.034423828f, -0.28442383f, -0.5217285f, 0.07299805f, 0.7167969f, 0.84106445f, -0.34570312f, -0.3466797f, 0.25512695f, 0.31958008f, 0.12207031f, -0.2512207f,
+ -0.19604492f, 0.11645508f, 0.17895508f, 0.2697754f, 0.4050293f, 0.2927246f, 0.09667969f, -0.12817383f, -0.14550781f, -0.1706543f, -0.16308594f, -0.13354492f, -0.11376953f, -0.14282227f, -0.12866211f, -0.037353516f,
+ -0.2084961f, -0.2878418f, -0.23657227f, -0.11816406f, 0.016357422f, 0.059326172f, 0.067871094f, -0.033447266f, -0.013427734f, 0.0029296875f, 0.068603516f, 0.12548828f, 0.14624023f, 0.11279297f, 0.11254883f, 0.18530273f,
+ -0.13549805f, 1.1516113f, 0.5197754f, -0.064453125f, -0.2409668f, -0.1274414f, -0.021484375f, -0.07104492f, -0.095458984f, -0.11987305f, -0.12573242f, -0.18701172f, -0.20874023f, -0.21459961f, -0.08081055f, 0.021484375f,
+ -0.33520508f, -0.6520996f, -0.2927246f, 0.8496094f, 0.6022949f, 0.35229492f, 0.1484375f, 0.06347656f, -0.13232422f, -0.390625f, -0.41137695f, -0.27294922f, -0.1694336f, -0.027832031f, 0.18310547f, 0.48510742f,
+ 0.22802734f, 0.8112793f, 0.25610352f, -0.5793457f, 0.18774414f, 0.74902344f, 0.122802734f, -0.38842773f, -0.57714844f, -0.842041f, -0.97314453f, -0.74975586f, 0.20605469f, 1.4348145f, 0.22973633f, -0.115722656f,
+ -0.103759766f, 0.055664062f, -0.29663086f, -0.3864746f, -0.36743164f, -0.38549805f, -0.22802734f, -0.19311523f, -0.11816406f, -0.11645508f, 0.2578125f, 1.0197754f, 1.0957031f, 0.7624512f, -0.19189453f, -0.8034668f,
+ 0.31860352f, -0.32495117f, -0.25756836f, 0.4501953f, 0.74731445f, 0.26293945f, -0.5578613f, -0.6347656f, 0.056152344f, 1.1223145f, 0.27783203f, -0.8347168f, -0.96850586f, -0.2019043f, 0.5266113f, 0.018798828f,
+ 0.2434082f, 0.05126953f, -0.16088867f, -0.2434082f, -0.15234375f, 0.037353516f, 0.06982422f, -0.015136719f, -0.607666f, 0.14428711f, 0.94433594f, 0.37109375f, -0.3083496f, -0.34765625f, -0.12060547f, 0.09448242f,
+ 0.13427734f, 0.47021484f, -0.4387207f, -0.8562012f, -0.6101074f, -0.10913086f, 0.1430664f, 0.18334961f, 0.103759766f, -0.034423828f, -0.06738281f, 0.036376953f, 0.12670898f, 0.18603516f, 0.33496094f, 0.39697266f,
+ 1.0314941f, -0.5073242f, 0.050048828f, 0.31860352f, -0.055908203f, -0.6105957f, -0.31860352f, -0.056396484f, 0.072753906f, 0.056884766f, -0.053466797f, -0.06933594f, -0.08666992f, -0.038330078f, 0.047851562f, 0.21875f,
+ 0.47192383f, 0.58447266f, 0.6154785f, -0.078125f, -0.6315918f, -0.92626953f, -0.89501953f, -0.46069336f, -0.14819336f, -0.03125f, 0.046142578f, 0.14086914f, 0.12646484f, 0.25390625f, 0.47753906f, 0.4543457f,
+ -1.1186523f, -0.5427246f, -0.36108398f, -0.13378906f, -0.0048828125f, 0.2939453f, 0.45581055f, 0.3972168f, 0.2421875f, -0.18725586f, -0.576416f, -0.25805664f, 0.115722656f, 0.517334f, 0.6699219f, 0.4909668f,
+ -0.8635254f, -0.1977539f, -0.067871094f, -0.060058594f, 0.08251953f, 0.5378418f, 0.0007324219f, -0.067871094f, -0.0053710938f, 0.513916f, 0.42993164f, -0.3544922f, -0.6711426f, -0.15454102f, 0.5522461f, 0.3256836f,
+ 0.62231445f, 0.44702148f, 0.3725586f, 0.15454102f, -0.13916016f, -0.40576172f, -0.49829102f, -0.3881836f, -0.13867188f, 0.2355957f, 0.5095215f, 0.3972168f, 0.0793457f, -0.22802734f, -0.44213867f, -0.5776367f,
+ -0.64086914f, 0.17944336f, 1.0073242f, 0.46972656f, -0.33007812f, -0.33569336f, -0.016357422f, -0.064208984f, -0.08105469f, -0.14916992f, -0.05444336f, 0.016845703f, -0.010009766f, -0.08911133f, -0.012207031f, 0.10961914f,
+ 0.47485352f, -0.13232422f, 0.21044922f, 0.36645508f, -0.11303711f, -0.8552246f, -0.7819824f, 0.8149414f, 1.0595703f, -0.46044922f, -0.359375f, -0.04296875f, -0.21948242f, -0.24584961f, 0.037353516f, 0.24707031f,
+ 0.28710938f, -0.68530273f, 0.22631836f, 0.119384766f, -0.17114258f, -0.29833984f, 0.33618164f, 0.49438477f, 0.4248047f, 0.171875f, 0.20385742f, 0.08935547f, -0.20922852f, -0.38671875f, -0.3569336f, -0.24584961f,
+ 0.33544922f, 0.27172852f, 0.040283203f, -0.072509766f, -0.008544922f, -0.095458984f, -0.19897461f, -0.2980957f, -0.17480469f, -0.12133789f, -0.060791016f, 0.012451172f, 0.087890625f, 0.059814453f, 0.068115234f, 0.1550293f,
+ 1.1574707f, 0.5593262f, -0.16137695f, -0.44140625f, -0.38305664f, -0.24731445f, -0.0056152344f, 0.10961914f, 0.21948242f, 0.22314453f, -0.0036621094f, -0.20166016f, -0.27416992f, -0.28295898f, -0.21240234f, -0.055419922f,
+ -0.75561523f, -0.84399414f, -0.079589844f, 0.29614258f, 0.24389648f, 0.3671875f, 0.5605469f, 0.3630371f, 0.26220703f, 0.17895508f, 0.06274414f, -0.052734375f, -0.14526367f, -0.21069336f, -0.1550293f, -0.091796875f,
+ 0.32055664f, 0.47436523f, 0.56640625f, 0.517334f, 0.42260742f, 0.2890625f, 0.12719727f, -0.23291016f, -0.5283203f, -0.7036133f, -0.6333008f, -0.40454102f, -0.23364258f, -0.1628418f, -0.011962891f, 0.19335938f,
+ -0.05493164f, 0.5136719f, 0.30395508f, 0.49072266f, 0.3581543f, -0.09301758f, -0.38183594f, -0.4338379f, -0.57299805f, -0.4794922f, -0.17651367f, 0.42651367f, 0.56103516f, 0.28149414f, -0.22875977f, -0.51416016f,
+ 0.2709961f, -0.26635742f, -0.44995117f, -0.079589844f, 0.21728516f, 0.43017578f, 0.4206543f, 0.47827148f, 0.58691406f, 0.27612305f, -0.26391602f, -0.65771484f, -0.67944336f, -0.3935547f, -0.11791992f, 0.2277832f,
+ -0.80078125f, 0.18066406f, 0.12036133f, -0.39575195f, -0.60009766f, -0.13134766f, 0.77685547f, 0.5834961f, 0.4248047f, 0.15820312f, 0.08520508f, -0.060058594f, -0.1652832f, -0.17700195f, -0.0234375f, 0.023925781f,
+ 0.28100586f, 0.4013672f, 0.5695801f, 0.1394043f, -0.20532227f, -0.18286133f, 0.40698242f, 0.703125f, 0.54907227f, 0.09301758f, -0.47631836f, -0.62597656f, -0.4975586f, -0.39160156f, -0.41259766f, -0.3515625f,
+ 0.3227539f, -1.0678711f, -1.1435547f, 0.068603516f, 0.7546387f, 0.38745117f, 0.09008789f, -0.0007324219f, -0.12792969f, 0.076416016f, 0.24853516f, 0.28735352f, 0.076660156f, -0.041748047f, -0.01977539f, 0.08911133f,
+ 0.6101074f, -0.22070312f, -0.5324707f, -0.119384766f, 0.10473633f, 0.16333008f, -0.15112305f, -0.34472656f, -0.39746094f, -0.43652344f, -0.23876953f, 0.0017089844f, 0.056152344f, 0.22973633f, 0.50024414f, 0.7751465f,
+};
+const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = {
+ -0.12109375f, -0.32348633f, -0.25976562f, 0.21435547f, 0.4814453f, 0.14819336f, -0.22363281f, -0.31030273f, -0.13256836f, 0.10107422f, 0.33276367f, 0.32495117f, 0.16577148f, -0.079833984f, -0.16210938f, -0.15527344f,
+ 0.088378906f, -0.0146484375f, -0.13378906f, -0.29003906f, 0.873291f, -0.3125f, -0.19384766f, 0.19311523f, -0.09863281f, 0.052734375f, -0.13110352f, -0.021972656f, -0.07861328f, -0.01977539f, -0.07373047f, 0.1616211f,
+ -0.115722656f, 0.28100586f, 0.2697754f, -0.10522461f, -0.107910156f, -0.2866211f, -0.36694336f, -0.33862305f, -0.15844727f, 0.01928711f, 0.17382812f, 0.21118164f, 0.2697754f, 0.17260742f, 0.07299805f, 0.009033203f,
+ 0.08154297f, 0.037841797f, -0.25878906f, -0.30444336f, -0.064208984f, 0.1303711f, 0.36669922f, 0.39916992f, 0.3400879f, 0.14331055f, -0.01171875f, -0.12060547f, -0.17041016f, -0.23071289f, -0.20825195f, -0.13012695f,
+ -0.024902344f, -0.6298828f, 0.7861328f, -0.010986328f, -0.12695312f, -0.08618164f, 0.022705078f, 0.049316406f, 0.004638672f, -0.13647461f, -0.09863281f, 0.0f, 0.06518555f, 0.014404297f, 0.060546875f, 0.111083984f,
+ -0.39404297f, 0.16821289f, 0.28564453f, -0.08666992f, -0.16088867f, 0.052246094f, 0.26000977f, 0.057128906f, -0.050048828f, -0.07836914f, 0.016601562f, 0.05883789f, 0.07373047f, -0.03955078f, -0.08520508f, -0.07763672f,
+ 0.011962891f, -0.114990234f, -0.10229492f, -0.07080078f, 0.009765625f, -0.03125f, -0.15600586f, -0.014892578f, 0.10546875f, -0.040283203f, -0.48095703f, -0.2783203f, 0.5905762f, 0.66137695f, 0.13842773f, -0.22802734f,
+ 0.48706055f, 0.18286133f, -0.20678711f, -0.17651367f, -0.19750977f, -0.3178711f, -0.2524414f, 0.0087890625f, 0.2866211f, 0.25708008f, 0.18969727f, 0.11694336f, 0.049316406f, -0.05517578f, -0.17700195f, -0.19482422f,
+ 0.122802734f, -0.09667969f, 0.05444336f, 0.17358398f, 0.22924805f, 0.35229492f, 0.40307617f, 0.031982422f, -0.16064453f, -0.14819336f, -0.103027344f, -0.088134766f, -0.13623047f, -0.23510742f, -0.2434082f, -0.15600586f,
+ -0.5810547f, -0.0146484375f, -0.43432617f, -0.07397461f, 0.30444336f, 0.36035156f, 0.19213867f, 0.12890625f, 0.13061523f, 0.031982422f, -0.024902344f, -0.059326172f, -0.048583984f, -0.030517578f, 0.03149414f, 0.087646484f,
+ -0.1171875f, 0.016357422f, 0.15234375f, 0.38916016f, 0.2783203f, -0.007080078f, -0.07373047f, -0.2055664f, -0.30004883f, -0.35839844f, -0.23388672f, -0.033935547f, 0.08520508f, 0.10913086f, 0.125f, 0.17480469f,
+ -0.107666016f, 0.06274414f, -0.0048828125f, 0.12792969f, -0.023925781f, -0.2199707f, -0.084228516f, 0.34399414f, 0.22753906f, -0.39697266f, -0.32421875f, 0.48779297f, 0.43554688f, -0.15429688f, -0.22436523f, -0.14550781f,
+ 0.0031738281f, -0.03955078f, 0.06738281f, -0.017822266f, -0.2644043f, 0.30493164f, 0.30200195f, -0.32495117f, -0.5007324f, 0.15478516f, 0.60961914f, 0.15527344f, -0.1899414f, -0.14526367f, 0.017822266f, -0.1315918f,
+ 0.036621094f, -0.11669922f, -0.33691406f, -0.5373535f, -0.13598633f, 0.3046875f, 0.3215332f, -0.10620117f, -0.1640625f, -0.08569336f, 0.012451172f, 0.10839844f, 0.20117188f, 0.17553711f, 0.15258789f, 0.16967773f,
+ -0.4362793f, -0.47265625f, -0.16870117f, -0.111083984f, -0.1772461f, -0.1430664f, 0.015136719f, 0.12719727f, 0.13647461f, 0.12988281f, 0.19238281f, 0.22827148f, 0.23266602f, 0.17504883f, 0.14453125f, 0.12768555f,
+ -0.07495117f, 0.19604492f, 0.13110352f, -0.10131836f, -0.0078125f, -0.18847656f, -0.048828125f, 0.33862305f, 0.2578125f, -0.17089844f, -0.40698242f, -0.28857422f, -0.048339844f, 0.048828125f, 0.14916992f, 0.21459961f,
+ -0.27734375f, -0.072509766f, 0.26049805f, 0.39038086f, 0.2277832f, 0.020751953f, -0.12109375f, -0.080322266f, 0.171875f, 0.36743164f, 0.107421875f, -0.19311523f, -0.22607422f, -0.20654297f, -0.19799805f, -0.17041016f,
+ 0.1352539f, 0.40039062f, -0.15649414f, -0.25341797f, 0.31054688f, 0.5410156f, -0.32958984f, -0.42871094f, 0.14794922f, 0.17333984f, -0.17871094f, -0.23730469f, -0.026611328f, -0.013427734f, -0.046142578f, -0.037841797f,
+ -0.30395508f, 0.12841797f, 0.20825195f, -0.119628906f, -0.3317871f, -0.3190918f, -0.11206055f, 0.10205078f, 0.32470703f, 0.36254883f, 0.2626953f, 0.016113281f, -0.12890625f, -0.16479492f, -0.005126953f, 0.080566406f,
+ 0.34375f, 0.35888672f, 0.4765625f, 0.13623047f, -0.115722656f, -0.053222656f, 0.080566406f, -0.012207031f, -0.022216797f, -0.09863281f, -0.080566406f, -0.13574219f, -0.18383789f, -0.26123047f, -0.2578125f, -0.17504883f,
+ 0.01171875f, -0.015625f, 0.2680664f, -0.23461914f, -0.35717773f, 0.6381836f, -0.30664062f, 0.08129883f, -0.05493164f, 0.10058594f, -0.026855469f, -0.10180664f, -0.013671875f, -0.06347656f, 0.00048828125f, 0.07446289f,
+ -0.1015625f, 0.05053711f, 0.092285156f, 0.038330078f, -0.03491211f, 0.16479492f, 0.0859375f, 0.0036621094f, -0.15454102f, -0.09106445f, 0.026367188f, -0.23950195f, -0.43676758f, -0.27783203f, 0.21850586f, 0.6555176f,
+ -0.16064453f, 0.032958984f, 0.08325195f, 0.052978516f, -0.041748047f, 0.08959961f, 0.16552734f, 0.057373047f, -0.08154297f, 0.21362305f, 0.048583984f, -0.7026367f, -0.27685547f, 0.51000977f, 0.27197266f, -0.26245117f,
+ 0.62109375f, 0.00390625f, 0.08081055f, 0.16748047f, 0.08276367f, -0.11254883f, -0.20825195f, -0.3076172f, -0.24926758f, -0.15332031f, 0.0007324219f, 0.087646484f, 0.11303711f, 0.022705078f, -0.068847656f, -0.080322266f,
+ 0.40844727f, -0.390625f, -0.35473633f, 0.21777344f, 0.21972656f, -0.0107421875f, 0.111328125f, 0.21459961f, 0.1430664f, -0.08935547f, -0.19165039f, -0.2368164f, -0.1340332f, -0.034179688f, 0.030761719f, 0.09667969f,
+ -0.2199707f, 0.8208008f, -0.32104492f, 0.118896484f, -0.006591797f, -0.1328125f, 0.0078125f, -0.013183594f, -0.05493164f, -0.024414062f, 0.06542969f, -0.0014648438f, -0.055664062f, -0.06762695f, -0.07055664f, -0.044677734f,
+ -0.14770508f, -0.16967773f, -0.1105957f, 0.6333008f, -0.4025879f, -0.3515625f, 0.29736328f, 0.0859375f, 0.024414062f, -0.07128906f, 0.010253906f, 0.0007324219f, -0.021728516f, 0.01977539f, 0.083496094f, 0.12060547f,
+ -0.06738281f, 0.030517578f, 0.019042969f, 0.16308594f, 0.16796875f, 0.037109375f, 0.059326172f, 0.07397461f, 0.03540039f, 0.05517578f, 0.06982422f, 0.061523438f, 0.1940918f, 0.20605469f, -0.3178711f, -0.7878418f,
+ 0.1274414f, -0.040771484f, -0.21704102f, -0.025634766f, 0.012451172f, -0.033203125f, -0.15771484f, 0.052001953f, -0.19165039f, -0.26342773f, 0.032226562f, 0.7976074f, -0.4807129f, -0.21582031f, 0.36499023f, 0.2397461f,
+ 0.46044922f, 0.21435547f, 0.0847168f, -0.24414062f, -0.49902344f, -0.16577148f, 0.30151367f, 0.049560547f, -0.07470703f, -0.21459961f, -0.13256836f, -0.009277344f, 0.06665039f, 0.029052734f, 0.0390625f, 0.095214844f,
+ 0.17895508f, -0.31396484f, -0.033203125f, -0.02734375f, -0.0637207f, -0.11791992f, -0.03466797f, 0.0061035156f, 0.07324219f, 0.072753906f, 0.14916992f, 0.13671875f, 0.12524414f, 0.017333984f, -0.08178711f, -0.08618164f,
+ 0.13330078f, -0.15893555f, -0.22045898f, -0.032226562f, -0.07739258f, -0.25463867f, -0.32299805f, -0.2614746f, 0.039794922f, 0.18554688f, 0.1262207f, -0.04321289f, -0.010498047f, 0.13330078f, 0.31860352f, 0.44506836f,
+};
+const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = {
+ -0.0056152344f, -0.03955078f, 0.071777344f, 0.26879883f, 0.44140625f, -0.08203125f, -0.20092773f, -0.009277344f, 0.05810547f, -0.06347656f, -0.07910156f, -0.05126953f, -0.07006836f, -0.068847656f, -0.07885742f, -0.09082031f,
+ -0.011962891f, -0.060302734f, 0.011962891f, 0.049804688f, -0.044677734f, 0.037841797f, 0.099121094f, 0.06274414f, 0.022216797f, -0.09057617f, 0.00390625f, 0.38452148f, 0.1027832f, -0.5292969f, -0.3269043f, 0.28881836f,
+ -0.3557129f, 0.3815918f, 0.10839844f, 0.08203125f, 0.03149414f, -0.0024414062f, -0.0036621094f, -0.02758789f, -0.03125f, -0.096191406f, -0.09326172f, -0.103515625f, -0.07006836f, 0.008056641f, 0.06616211f, 0.10644531f,
+ 0.038330078f, 0.022460938f, -0.22070312f, 0.529541f, -0.3540039f, 0.29907227f, -0.16235352f, -0.03955078f, 0.053222656f, -0.07348633f, -0.051513672f, 0.021484375f, 0.04638672f, 0.029541016f, -0.052001953f, -0.08618164f,
+ 0.075927734f, -0.19604492f, 0.046875f, -0.00048828125f, -0.052978516f, -0.03491211f, 0.19067383f, 0.08520508f, -0.16113281f, -0.29785156f, -0.22558594f, -0.07006836f, 0.053955078f, 0.1550293f, 0.19042969f, 0.2409668f,
+ 0.08227539f, 0.26464844f, -0.15332031f, -0.140625f, -0.0068359375f, 0.060302734f, -0.05126953f, -0.23339844f, -0.28442383f, -0.14160156f, 0.0793457f, 0.23828125f, 0.20678711f, 0.09716797f, 0.014892578f, -0.032470703f,
+ 0.20581055f, -0.19702148f, 0.053466797f, 0.026855469f, -0.011962891f, -0.04663086f, -0.11254883f, 0.060058594f, 0.33984375f, 0.33447266f, -0.14257812f, -0.37719727f, -0.21850586f, 0.016845703f, 0.08325195f, -0.013916016f,
+ 0.34375f, -0.38623047f, -0.06542969f, -0.07348633f, -0.107421875f, 0.037353516f, 0.14477539f, 0.01586914f, 0.0026855469f, 0.08959961f, 0.19433594f, 0.1027832f, -0.03149414f, -0.060058594f, -0.1003418f, -0.10668945f,
+ 0.12841797f, 0.01953125f, 0.16333008f, 0.22827148f, -0.16015625f, -0.42016602f, -0.19067383f, 0.08642578f, 0.08520508f, -0.022705078f, 0.011230469f, 0.013671875f, -0.0034179688f, 0.019042969f, -0.005859375f, 0.047851562f,
+ 0.02734375f, 0.008056641f, -0.07470703f, 0.114990234f, 0.0021972656f, -0.41796875f, 0.5605469f, -0.28735352f, 0.022949219f, -0.07739258f, -0.028808594f, 0.1928711f, 0.056152344f, 0.0053710938f, -0.048583984f, -0.055419922f,
+ -0.037109375f, 0.12939453f, -0.38671875f, -0.095214844f, 0.0021972656f, -0.012451172f, 0.19677734f, 0.2578125f, 0.12670898f, -0.10180664f, -0.087890625f, 0.009521484f, 0.1418457f, 0.14526367f, -0.076660156f, -0.21166992f,
+ 0.29711914f, 0.06616211f, -0.375f, -0.080566406f, 0.1484375f, -0.0007324219f, -0.020996094f, 0.013427734f, -0.014160156f, -0.11279297f, -0.08081055f, -0.056152344f, -0.13769531f, -0.060546875f, 0.10595703f, 0.30810547f,
+ -0.025146484f, 0.023925781f, -0.02758789f, -0.0009765625f, 0.08178711f, -0.13452148f, -0.022949219f, 0.6875f, -0.39794922f, -0.123046875f, 0.06738281f, 0.04345703f, -0.053955078f, -0.0146484375f, -0.045410156f, -0.05810547f,
+ 0.0146484375f, 0.041748047f, -0.024902344f, 0.005126953f, -0.079589844f, -0.04638672f, -0.028320312f, 0.021972656f, -0.11450195f, -0.118896484f, -0.041748047f, -0.001953125f, -0.2783203f, 0.33154297f, 0.64575195f, -0.32543945f,
+ -0.13989258f, -0.020019531f, 0.3137207f, -0.53271484f, 0.3154297f, 0.037353516f, -0.04272461f, -0.059326172f, -0.05444336f, -0.009765625f, -0.0073242188f, 0.015380859f, 0.0769043f, 0.08251953f, 0.01171875f, 0.013427734f,
+ -0.049804688f, 0.022949219f, -0.08227539f, -0.08544922f, 0.012451172f, 0.015380859f, -0.2241211f, 0.15625f, -0.19750977f, 0.5703125f, -0.3684082f, 0.072753906f, 0.4711914f, -0.35888672f, 0.14697266f, -0.10205078f,
+ -0.17138672f, -0.19067383f, -0.21411133f, -0.030517578f, 0.09667969f, -0.087402344f, -0.09643555f, 0.017089844f, 0.08666992f, 0.041503906f, 0.05908203f, 0.034179688f, 0.08129883f, 0.12841797f, 0.12011719f, 0.12548828f,
+ -0.044921875f, 0.0061035156f, 0.037841797f, 0.017089844f, 0.064453125f, 0.008300781f, -0.20532227f, -0.025146484f, 0.07397461f, 0.06225586f, -0.15991211f, -0.27612305f, 0.44873047f, 0.14111328f, -0.40893555f, 0.26049805f,
+ -0.14941406f, 0.17773438f, 0.022949219f, -0.125f, 0.00048828125f, 0.19018555f, 0.03857422f, -0.039794922f, 0.09448242f, 0.20214844f, 0.22436523f, 0.111572266f, -0.08081055f, -0.16992188f, -0.25146484f, -0.24633789f,
+ -0.09350586f, 0.028076172f, -0.04272461f, 0.05419922f, 0.01586914f, -0.16870117f, -0.30395508f, -0.17285156f, 0.0690918f, 0.30541992f, 0.23266602f, -0.09082031f, 0.1340332f, 0.3449707f, 0.036621094f, -0.3486328f,
+ -0.20019531f, -0.10449219f, 0.041992188f, 0.09350586f, 0.010253906f, 0.04711914f, 0.26342773f, 0.23852539f, 0.13598633f, -0.04296875f, -0.063964844f, -0.13769531f, -0.18164062f, -0.10083008f, -0.033691406f, 0.03491211f,
+ 0.14648438f, 0.02758789f, 0.33984375f, -0.005126953f, -0.09887695f, 0.04272461f, -0.18652344f, -0.33129883f, -0.14208984f, 0.040039062f, 0.036376953f, -0.072509766f, -0.119628906f, -0.0017089844f, 0.09448242f, 0.23046875f,
+ 0.23852539f, 0.26513672f, 0.034179688f, 0.04272461f, 0.05053711f, 0.03466797f, 0.12182617f, 0.03930664f, -0.018066406f, -0.095947266f, -0.107666016f, -0.16040039f, -0.17211914f, -0.12524414f, -0.09716797f, -0.05078125f,
+ -0.08178711f, -0.05126953f, -0.20507812f, 0.115478516f, 0.14453125f, -0.010986328f, -0.16357422f, -0.05102539f, 0.037597656f, 0.24365234f, 0.38452148f, 0.05444336f, -0.40283203f, -0.21972656f, 0.0793457f, 0.12695312f,
+ -0.2548828f, -0.28222656f, 0.19628906f, 0.2890625f, 0.047851562f, -0.034179688f, 0.012451172f, -0.1159668f, -0.20947266f, -0.08154297f, 0.13427734f, 0.16333008f, 0.07885742f, 0.05078125f, 0.013427734f, -0.0078125f,
+ -0.067871094f, 0.02368164f, -0.010986328f, -0.037109375f, -0.19140625f, 0.118896484f, -0.020019531f, -0.3955078f, 0.5673828f, -0.02758789f, -0.23950195f, 0.103759766f, -0.04736328f, 0.029785156f, 0.07495117f, 0.118896484f,
+ 0.095214844f, -0.0078125f, 0.36035156f, -0.075927734f, -0.20385742f, 0.0625f, 0.15332031f, 0.044921875f, 0.0041503906f, -0.13793945f, -0.1472168f, 0.015136719f, 0.17504883f, 0.1105957f, -0.14648438f, -0.30151367f,
+ 0.063964844f, -0.0234375f, 0.07739258f, -0.24169922f, 0.041015625f, 0.18823242f, -0.43701172f, 0.25976562f, 0.25097656f, -0.37182617f, 0.040771484f, 0.2590332f, 0.0036621094f, -0.044677734f, -0.03173828f, -0.03466797f,
+ 0.025390625f, 0.09301758f, 0.11328125f, -0.027832031f, -0.0087890625f, -0.0703125f, 0.028320312f, -0.052734375f, -0.1953125f, -0.32617188f, 0.67871094f, -0.07397461f, -0.15039062f, -0.0703125f, -0.02758789f, 0.064697266f,
+ -0.049560547f, 0.15551758f, -0.016113281f, -0.27661133f, -0.30371094f, -0.13427734f, 0.08203125f, 0.09814453f, 0.07495117f, 0.038330078f, 0.055664062f, -0.00390625f, -0.018554688f, 0.0390625f, 0.10620117f, 0.15283203f,
+ -0.04321289f, -0.18408203f, -0.045654297f, -0.05029297f, 0.21191406f, 0.5300293f, 0.09716797f, -0.12866211f, -0.09423828f, -0.08666992f, -0.087890625f, -0.09643555f, -0.045166016f, 0.021972656f, -0.013183594f, 0.014160156f,
+ -0.0017089844f, -0.014160156f, -0.048339844f, -0.037109375f, -0.0949707f, -0.005859375f, 0.48388672f, -0.17480469f, -0.19140625f, 0.5727539f, -0.18920898f, -0.26391602f, 0.0048828125f, 0.067871094f, -0.045654297f, -0.06201172f,
+};
+
+const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 };
+
+const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 };
+const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 };
+
+const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = {
+ 1.0144043f, 1.1826172f, 0.3269043f, -0.6411133f, -1.2163086f, -1.1411133f, -1.1525879f, -0.8898926f, -0.19604492f, 0.7402344f, 1.1782227f, 1.0830078f, 0.78222656f, 0.26953125f, -0.33203125f, -1.0080566f,
+ -0.38916016f, -0.31347656f, -1.1826172f, -2.036621f, -2.086914f, -1.8569336f, -1.637207f, -1.3156738f, -0.4182129f, 0.50634766f, 1.2770996f, 1.3771973f, 1.8566895f, 2.3503418f, 2.3015137f, 1.5678711f,
+ 0.43652344f, 1.8859863f, 2.8059082f, 2.2385254f, 1.5480957f, 0.14331055f, 0.07299805f, -1.1218262f, -1.1103516f, -0.7336426f, -0.4194336f, -0.89624023f, -1.0429688f, -0.79785156f, -1.204834f, -1.8046875f,
+ 1.5612793f, 0.9321289f, 0.58740234f, 0.46313477f, 0.21899414f, 0.0625f, -0.16918945f, -0.34423828f, -0.44726562f, -0.61035156f, -0.6398926f, -0.57177734f, -0.38500977f, -0.25927734f, -0.20898438f, -0.18945312f,
+ 1.0131836f, 1.9333496f, 0.8395996f, -0.4963379f, -0.66015625f, -0.38012695f, 0.056396484f, 0.31201172f, 0.810791f, 0.66674805f, -0.022705078f, -0.7980957f, -0.9230957f, -0.63134766f, -0.68530273f, -1.034668f,
+ -0.842041f, -0.08642578f, 0.49243164f, 0.5827637f, 1.1630859f, 1.3693848f, 0.7233887f, 0.2705078f, 0.34692383f, 0.0068359375f, -0.2319336f, -0.33032227f, -0.5895996f, -0.67626953f, -0.9953613f, -1.2033691f,
+ 2.0810547f, 1.8205566f, 1.1000977f, 0.47216797f, 0.08251953f, -0.48510742f, -0.67285156f, -0.55322266f, -0.4777832f, -0.546875f, -0.579834f, -0.5891113f, -0.5119629f, -0.4255371f, -0.32910156f, -0.38500977f,
+ 1.730957f, 1.3063965f, 0.53466797f, 0.23144531f, 0.04248047f, 0.0036621094f, 0.0949707f, 0.15942383f, 0.1977539f, 0.19946289f, 0.21899414f, 0.064697266f, -0.43408203f, -0.94750977f, -1.5297852f, -1.8735352f,
+ 1.6611328f, 2.8601074f, 1.7668457f, -0.12988281f, -0.27978516f, 1.199707f, 1.4865723f, 1.220459f, 0.61865234f, -1.2509766f, -1.5700684f, -1.3425293f, -1.3532715f, -1.3083496f, -1.5671387f, -2.0112305f,
+ 1.8820801f, 0.6086426f, -0.52319336f, -1.5842285f, -1.2685547f, -0.9067383f, -0.6323242f, -0.203125f, -0.25878906f, 0.091796875f, 0.18286133f, 1.2060547f, 1.0129395f, -0.049560547f, -0.1274414f, 0.5698242f,
+ 0.60498047f, 1.1367188f, 1.5297852f, 1.9936523f, 1.9726562f, 1.9311523f, 1.7668457f, 1.3752441f, 0.939209f, 0.020019531f, -0.72558594f, -1.3706055f, -2.269043f, -2.7990723f, -3.010254f, -3.0957031f,
+ -0.9187012f, 0.107177734f, 0.32495117f, -0.051513672f, -0.2746582f, 0.2043457f, 0.8605957f, 0.30737305f, 0.064208984f, -0.1743164f, -0.5998535f, -0.7624512f, -0.10864258f, 0.49975586f, 0.40283203f, 0.118896484f,
+ 1.0822754f, 0.7507324f, 0.47460938f, 0.00390625f, -0.28881836f, -0.5131836f, -0.62158203f, -0.6550293f, -0.59228516f, -0.42895508f, -0.17675781f, 0.061035156f, 0.119140625f, 0.037109375f, 0.24267578f, 0.5046387f,
+ -2.3117676f, -1.2453613f, -0.7062988f, -0.83813477f, -0.5036621f, 0.040039062f, 0.6281738f, 0.93115234f, 0.826416f, 0.3791504f, 0.19970703f, -0.023925781f, 0.35913086f, 0.953125f, 0.87280273f, 0.43969727f,
+ 3.8930664f, 4.2009277f, 3.1296387f, 2.685791f, 2.1108398f, 2.032959f, 0.046142578f, -1.3862305f, -1.6176758f, -1.9997559f, -2.130371f, -2.1767578f, -2.213623f, -2.2236328f, -2.1501465f, -2.201416f,
+ -1.3452148f, -0.43041992f, 0.38720703f, 1.0549316f, 1.4541016f, 1.6882324f, 1.3688965f, 0.44335938f, -0.037109375f, -0.23144531f, -0.5349121f, -0.7902832f, -0.81152344f, -0.73876953f, -0.6965332f, -0.78027344f,
+ 2.1210938f, 2.654541f, 2.0202637f, 1.1313477f, 0.42333984f, -0.13598633f, -0.31591797f, -0.38500977f, -0.37548828f, -0.7619629f, -0.9873047f, -1.046875f, -0.9699707f, -0.99975586f, -1.0686035f, -1.3034668f,
+ 2.0297852f, 0.09301758f, -1.026123f, -1.6860352f, -0.5925293f, 0.7067871f, 1.1433105f, -0.31152344f, -0.8725586f, -0.37524414f, 0.09326172f, -0.4165039f, -0.375f, -0.32592773f, 0.65185547f, 1.2634277f,
+ 0.49169922f, 1.6848145f, 1.8188477f, 2.048584f, 1.3818359f, 1.3059082f, 0.8100586f, 0.15429688f, -0.40161133f, -1.7539062f, -2.8208008f, -1.5043945f, -0.54663086f, -0.9963379f, -0.7890625f, -0.8833008f,
+ 0.60131836f, 1.9431152f, 1.1845703f, -0.50927734f, -0.51708984f, 0.7182617f, 0.6542969f, 0.06665039f, -0.48120117f, -0.9313965f, -1.0275879f, -0.9108887f, -0.48168945f, 0.055664062f, 0.17333984f, -0.5378418f,
+ 0.5378418f, 0.47216797f, 0.17480469f, -0.3022461f, -0.19726562f, -0.030517578f, -0.008544922f, 0.009277344f, -0.033935547f, -0.022705078f, 0.20629883f, 0.45239258f, 0.18237305f, -0.14233398f, -0.50561523f, -0.7922363f,
+ -2.0576172f, -2.215088f, -1.0456543f, -0.07910156f, 1.4833984f, 1.3276367f, -0.119140625f, -0.638916f, -0.06713867f, 0.8666992f, -0.25634766f, -0.041503906f, 1.1413574f, 1.0339355f, 0.5041504f, 0.16333008f,
+ 2.7668457f, 2.9187012f, 1.6850586f, 0.47216797f, -0.3696289f, -0.70288086f, -0.7890625f, -1.034668f, -0.8354492f, -0.69262695f, -0.6418457f, -0.70751953f, -0.6467285f, -0.49682617f, -0.49023438f, -0.43530273f,
+ 0.104003906f, 0.9812012f, 1.1506348f, 0.9128418f, 0.81933594f, 0.8522949f, 0.7446289f, 0.46069336f, 0.31347656f, -0.06542969f, -0.49536133f, -0.85302734f, -1.0515137f, -1.0839844f, -1.2729492f, -1.5166016f,
+ 0.5107422f, 1.4162598f, 2.0109863f, 2.331787f, 1.6552734f, 0.8979492f, 0.6035156f, 0.2487793f, 0.26049805f, -0.26416016f, -0.7624512f, -1.2497559f, -1.8212891f, -1.807373f, -1.8876953f, -2.1430664f,
+ 0.23461914f, 0.3942871f, -0.2163086f, -1.0683594f, -1.3544922f, -1.2963867f, -1.2163086f, -1.192627f, -0.8947754f, -0.36083984f, 0.29248047f, 0.6989746f, 1.1608887f, 1.6723633f, 1.8217773f, 1.324707f,
+ 3.0012207f, 3.3725586f, 2.8825684f, 2.7036133f, 2.4111328f, 2.5178223f, 1.418457f, 0.048583984f, -0.7297363f, -1.8293457f, -2.4519043f, -2.5717773f, -2.6826172f, -2.7434082f, -2.6733398f, -2.673584f,
+ 0.061035156f, 0.7324219f, 1.2775879f, 0.8625488f, 0.2524414f, 0.092285156f, -0.13500977f, -0.41674805f, -0.52075195f, -0.7026367f, -0.69262695f, -0.5744629f, -0.4494629f, -0.08886719f, 0.17211914f, 0.1303711f,
+ 2.1413574f, 1.7810059f, 0.7092285f, -0.37304688f, -0.6828613f, -0.54296875f, -0.5942383f, -0.9050293f, -0.97558594f, -0.8232422f, -0.6015625f, -0.57128906f, 0.021484375f, 0.59887695f, 0.5192871f, 0.29882812f,
+ -1.3076172f, -0.99609375f, -0.7758789f, -0.83374023f, -0.8322754f, -0.72924805f, -0.5461426f, -0.1652832f, 0.4482422f, 1.0227051f, 1.440918f, 1.338623f, 0.89331055f, 0.6164551f, 0.42700195f, -0.0009765625f,
+ 2.084961f, 3.2036133f, 2.5375977f, 0.7463379f, 0.24682617f, 0.7133789f, 0.46118164f, -0.16430664f, -0.31347656f, -1.1755371f, -1.5986328f, -1.6252441f, -1.3684082f, -1.1738281f, -1.1335449f, -1.440918f,
+ -0.22070312f, 0.74121094f, 0.9091797f, 0.25f, 0.15161133f, 0.5371094f, 0.74902344f, 1.0612793f, 1.1540527f, 0.22924805f, -0.74438477f, -1.1445312f, -1.0881348f, -0.7956543f, -0.7746582f, -1.0144043f,
+ 1.8095703f, 2.084961f, 0.859375f, -0.22167969f, -0.49951172f, -0.58496094f, -0.548584f, -0.35595703f, -0.23828125f, 0.018066406f, -0.119384766f, 0.16845703f, 0.03491211f, -0.8540039f, -1.0222168f, -0.53027344f,
+ -2.2055664f, -2.6103516f, -2.4230957f, -2.2021484f, -0.9482422f, 1.682373f, 2.345459f, 2.1347656f, 1.9140625f, 1.019043f, 0.6623535f, 0.62719727f, 0.85546875f, 0.8095703f, -0.23144531f, -1.4296875f,
+ 3.0585938f, 3.8530273f, 2.633789f, 0.8532715f, -0.09008789f, -0.52685547f, -0.60375977f, -0.7915039f, -0.861084f, -1.2512207f, -1.3881836f, -1.3081055f, -1.1264648f, -0.88378906f, -0.6906738f, -0.8774414f,
+ 0.91845703f, 1.7211914f, 0.89575195f, -0.07543945f, -0.3798828f, -0.49023438f, -0.5810547f, -0.57666016f, -0.4921875f, -0.36206055f, -0.23706055f, -0.22924805f, -0.15600586f, 0.03100586f, 0.0703125f, -0.057128906f,
+ 1.3344727f, 1.2441406f, 0.20483398f, -1.0561523f, -1.0715332f, -0.12084961f, 0.96728516f, 1.5930176f, 1.1330566f, 0.115722656f, -0.45532227f, -0.44140625f, -0.5053711f, -0.8222656f, -0.96972656f, -1.1499023f,
+ -1.8754883f, -2.5437012f, -2.1186523f, 0.6845703f, 1.7653809f, 3.8078613f, 1.5759277f, -0.59228516f, -0.22167969f, 0.5510254f, 1.770752f, 1.2670898f, -0.85180664f, -1.3605957f, -1.5881348f, -0.27026367f,
+ 2.5178223f, 2.0725098f, 1.2094727f, 0.30126953f, -0.29370117f, -0.095947266f, 0.45141602f, 0.4663086f, 0.22338867f, -0.5546875f, -1.3134766f, -1.3378906f, -0.842041f, -0.87231445f, -1.0029297f, -0.92944336f,
+ 2.199707f, 1.7602539f, 1.2255859f, 0.74243164f, 0.45288086f, 0.3161621f, 0.076660156f, -0.23266602f, -0.5065918f, -0.6386719f, -0.6906738f, -0.6977539f, -0.798584f, -0.9692383f, -1.0688477f, -1.1706543f,
+ 0.3564453f, 1.670166f, 2.1064453f, 0.765625f, 0.767334f, 1.4802246f, 1.4580078f, 0.8364258f, 0.5427246f, -1.2788086f, -1.7922363f, -1.552002f, -1.4414062f, -0.9494629f, -1.151123f, -1.8183594f,
+ 0.35375977f, -0.44604492f, -1.1108398f, -1.5837402f, -1.3947754f, -0.6669922f, -0.16113281f, 0.10571289f, 0.3190918f, 0.5788574f, 0.6821289f, 0.7907715f, 0.7709961f, 0.59375f, 0.5800781f, 0.58813477f,
+ 1.2800293f, 2.3510742f, 2.9519043f, 2.9152832f, 2.5854492f, 1.7675781f, 1.0688477f, 0.4387207f, -0.19555664f, -1.513916f, -2.340332f, -2.5202637f, -2.3115234f, -2.1765137f, -2.1308594f, -2.1696777f,
+ -1.6928711f, -0.26049805f, 0.19189453f, -0.04711914f, 0.061279297f, 0.15258789f, 0.17089844f, 0.10205078f, 0.08691406f, 0.076660156f, 0.039794922f, 0.025878906f, 0.0014648438f, 0.265625f, 0.46240234f, 0.3630371f,
+ 1.4794922f, 0.9511719f, 0.1184082f, -0.7175293f, -1.15625f, -0.8388672f, 0.068847656f, 0.49609375f, 0.45629883f, -0.12768555f, -0.79907227f, -0.7434082f, -0.20336914f, -0.00390625f, 0.27514648f, 0.74438477f,
+ -1.628418f, -0.46142578f, 0.087402344f, -0.056152344f, 0.10913086f, 0.58813477f, 0.9543457f, 1.532959f, 1.3303223f, 0.35180664f, -0.21435547f, -0.49267578f, -0.5546875f, -0.34765625f, -0.4658203f, -0.7324219f,
+ 2.887207f, 4.0615234f, 3.1860352f, 1.532959f, 0.4165039f, 0.19067383f, 0.57055664f, -0.7878418f, -1.2619629f, -1.8005371f, -1.6381836f, -1.4213867f, -1.5876465f, -1.5568848f, -1.2424316f, -1.548584f,
+ 0.1184082f, 0.16186523f, 0.17089844f, 0.52856445f, 0.48364258f, 0.23583984f, 0.091796875f, 0.4477539f, 0.56103516f, 0.3972168f, 0.27197266f, 0.17138672f, -0.1850586f, -0.74194336f, -1.204834f, -1.5085449f,
+ 3.7294922f, 2.5002441f, 1.5256348f, 0.701416f, 0.19116211f, 0.07861328f, 0.24267578f, 0.4243164f, 0.23217773f, -0.4404297f, -1.0891113f, -1.3295898f, -1.3798828f, -1.6437988f, -1.8586426f, -1.8840332f,
+ -1.0793457f, -0.54956055f, -0.53271484f, -0.8959961f, -0.7878418f, -0.50390625f, -0.45898438f, -0.45410156f, -0.14868164f, 0.07495117f, 0.30126953f, 0.5197754f, 0.8623047f, 1.3652344f, 1.3466797f, 0.9406738f,
+ 0.8203125f, 1.934082f, 2.6530762f, 2.293457f, 1.5932617f, 0.25708008f, 0.46289062f, 0.7038574f, 0.39990234f, -1.3444824f, -1.871582f, -1.7602539f, -1.8720703f, -1.1584473f, -1.3552246f, -1.7556152f,
+ 0.6022949f, 1.5651855f, 2.024414f, 1.043457f, 0.5551758f, 0.29516602f, -0.059326172f, -0.29589844f, -0.28930664f, -0.6899414f, -0.87158203f, -0.8222656f, -0.8574219f, -0.74438477f, -0.65722656f, -0.7980957f,
+ 0.7392578f, 1.7915039f, 1.7841797f, 1.0437012f, 0.2434082f, -0.5f, -0.76123047f, -0.9995117f, -0.77856445f, -0.61450195f, -0.4025879f, -0.36132812f, -0.16894531f, 0.123046875f, -0.3190918f, -0.8190918f,
+ -3.3479004f, -2.8823242f, -1.7409668f, -0.01928711f, 1.5759277f, 1.565918f, -0.14379883f, -1.1428223f, -0.46923828f, 1.5456543f, 0.080566406f, 0.15551758f, 1.5246582f, 1.2470703f, 1.1359863f, 0.9152832f,
+ 3.6564941f, 2.3999023f, 1.4855957f, 0.71728516f, 0.45483398f, 0.25854492f, -0.13500977f, -0.5534668f, -0.7763672f, -1.0727539f, -1.2416992f, -1.2087402f, -1.0163574f, -1.0344238f, -0.97924805f, -0.9543457f,
+ -0.26391602f, 0.7937012f, 1.5644531f, 1.7453613f, 1.2094727f, 1.2302246f, 1.0932617f, 1.0627441f, 1.1040039f, 0.16601562f, -1.6494141f, -2.2905273f, -1.9121094f, -1.423584f, -0.94140625f, -1.487793f,
+ 1.7485352f, 1.9509277f, 1.1413574f, 0.23828125f, 0.20532227f, 0.71972656f, 1.0627441f, 0.84375f, 0.6599121f, 0.11010742f, -0.41723633f, -1.0415039f, -1.4494629f, -1.7270508f, -1.9189453f, -2.126709f,
+ 1.7670898f, -0.14770508f, -0.9782715f, 0.0007324219f, 2.0344238f, 0.28637695f, -0.53125f, -1.2973633f, -1.4816895f, -1.2402344f, -1.1208496f, -1.1516113f, -0.68237305f, -0.05883789f, 1.3154297f, 3.286377f,
+ 2.586914f, 3.0708008f, 3.369629f, 2.663086f, 1.8154297f, 0.54467773f, 0.5966797f, 0.45703125f, -0.5554199f, -1.7521973f, -2.234375f, -2.2390137f, -2.147461f, -2.0239258f, -2.0800781f, -2.0722656f,
+ -0.17993164f, 0.5961914f, 0.1184082f, -0.6855469f, -0.8725586f, -0.7883301f, -0.72094727f, -0.5744629f, -0.20922852f, 0.171875f, 0.41430664f, 0.54711914f, 0.49438477f, 0.564209f, 0.64819336f, 0.4765625f,
+ 2.9692383f, 1.6333008f, 0.5463867f, -0.6401367f, -1.1271973f, -1.4199219f, -1.4353027f, -1.2783203f, -1.0517578f, -0.7229004f, -0.4267578f, -0.39233398f, 0.44873047f, 0.67211914f, 0.89453125f, 1.3300781f,
+ -0.7512207f, 0.11035156f, 0.47998047f, -0.0949707f, -0.30981445f, 0.028808594f, 0.04272461f, 0.25756836f, 0.88378906f, 1.1179199f, 0.33569336f, -0.30126953f, -0.36132812f, -0.29223633f, -0.4194336f, -0.7260742f,
+ 3.871582f, 3.6723633f, 2.5690918f, 1.3596191f, 1.0322266f, 1.0532227f, 0.7524414f, 0.15966797f, -0.42114258f, -1.3811035f, -1.967041f, -2.2060547f, -2.1699219f, -2.125f, -2.0786133f, -2.121582f,
+ 0.41601562f, 0.4086914f, 0.12915039f, 0.44995117f, 1.0292969f, 1.5f, 1.4731445f, 1.0021973f, 0.53149414f, -0.10473633f, -0.49121094f, -0.6335449f, -1.0283203f, -1.3818359f, -1.5666504f, -1.7338867f,
+ 1.0354004f, 0.7351074f, -0.04321289f, -0.86328125f, -1.1411133f, -0.89990234f, -0.3876953f, 0.2421875f, 0.7763672f, 0.7036133f, 0.4814453f, 0.25952148f, 0.16503906f, -0.0925293f, -0.35668945f, -0.6142578f,
+ -2.5014648f, -2.2893066f, -2.4162598f, -2.5559082f, -2.2287598f, -1.3945312f, -0.8725586f, -0.30419922f, 0.30200195f, 1.078125f, 1.8603516f, 1.8320312f, 2.2028809f, 2.7680664f, 2.5114746f, 2.0083008f,
+ 1.4338379f, 2.6071777f, 2.8693848f, 1.9367676f, 1.357666f, 0.54052734f, 0.0073242188f, -0.39257812f, -0.7956543f, -1.501709f, -1.6374512f, -1.4631348f, -1.3227539f, -1.2058105f, -1.0966797f, -1.3371582f,
+ 0.41577148f, 0.41992188f, 0.01171875f, -0.041748047f, 0.022460938f, 0.24536133f, 0.36010742f, 0.3203125f, 0.16088867f, -0.055664062f, -0.23950195f, -0.4645996f, -0.37817383f, -0.17480469f, -0.19140625f, -0.4104004f,
+ 0.1303711f, 1.1894531f, 0.9506836f, -0.5930176f, -1.2092285f, -0.53027344f, 0.7734375f, 0.6401367f, 0.54956055f, 0.3388672f, -0.5241699f, -0.9995117f, -0.2709961f, 0.33789062f, -0.091552734f, -0.69140625f,
+ -2.5305176f, -1.4348145f, -0.14941406f, 0.8322754f, 1.2192383f, 1.2817383f, 0.94140625f, 0.5319824f, 0.37402344f, 0.31469727f, 0.23120117f, 0.010498047f, -0.21533203f, -0.3239746f, -0.45751953f, -0.6254883f,
+ 1.7978516f, 2.154541f, 1.6486816f, 0.77490234f, 0.38378906f, 0.24902344f, -0.34985352f, -0.9355469f, -1.130127f, -1.3525391f, -1.317627f, -1.0749512f, -0.7229004f, -0.31201172f, 0.06225586f, 0.12475586f,
+ 0.8828125f, 0.72802734f, 0.59594727f, 0.3737793f, 0.5258789f, 0.72753906f, 0.43017578f, 0.18725586f, 0.06640625f, -0.23266602f, -0.42578125f, -0.50512695f, -0.5432129f, -0.6281738f, -0.92529297f, -1.2570801f,
+ 1.46875f, 2.616455f, 2.7822266f, 1.1652832f, 0.45581055f, 1.2355957f, 1.2653809f, 0.935791f, 0.5776367f, -0.87597656f, -2.5498047f, -2.6628418f, -2.2028809f, -1.3466797f, -0.9621582f, -1.9025879f,
+ 1.5563965f, 0.4855957f, -0.31933594f, -0.8959961f, -1.0634766f, -1.0183105f, -0.9716797f, -0.8378906f, -0.4987793f, -0.14331055f, 0.14428711f, 0.31445312f, 0.6821289f, 0.88623047f, 0.87890625f, 0.8005371f,
+ 1.9968262f, 2.7993164f, 2.0898438f, 0.9248047f, 0.85009766f, 1.4089355f, 1.6706543f, 1.3681641f, 1.1982422f, 0.33544922f, -0.95288086f, -2.145996f, -2.8188477f, -2.941162f, -2.8947754f, -2.8886719f,
+ -0.75439453f, 0.16137695f, 0.33740234f, -0.19702148f, 0.5197754f, 1.2861328f, 0.42236328f, -0.20092773f, -0.11743164f, -0.69018555f, -1.1972656f, -0.7453613f, -0.053466797f, 0.39208984f, 0.7512207f, 0.08544922f,
+ 2.1848145f, 1.0153809f, 0.14331055f, -0.6489258f, -0.71435547f, -0.55566406f, -0.40966797f, -0.25634766f, -0.08081055f, -0.01586914f, -0.0053710938f, -0.09667969f, -0.12231445f, -0.03466797f, -0.11303711f, -0.2902832f,
+ -1.2324219f, -0.42993164f, -0.30273438f, -0.8486328f, -0.9147949f, -0.7001953f, 0.03955078f, 0.7734375f, 0.99438477f, 0.46484375f, 0.13891602f, 0.11425781f, 0.41381836f, 0.7363281f, 0.6113281f, 0.14208984f,
+ 3.2854004f, 4.0998535f, 3.8623047f, 2.496582f, 1.4880371f, -0.044189453f, -0.55981445f, -1.1950684f, -1.519043f, -1.6992188f, -1.7475586f, -1.7741699f, -1.7507324f, -1.697998f, -1.6628418f, -1.5812988f,
+ -0.28393555f, 0.36254883f, 0.7150879f, 1.1523438f, 1.5422363f, 1.6831055f, 0.8269043f, -0.0107421875f, -0.48364258f, -0.6828613f, -0.78930664f, -0.6608887f, -0.6298828f, -0.8183594f, -0.8984375f, -1.0241699f,
+ 2.4472656f, 3.3598633f, 2.1152344f, 0.58740234f, 0.088134766f, 0.080566406f, 0.12768555f, -0.83447266f, -0.66308594f, 0.3178711f, -0.046875f, -1.7287598f, -1.8405762f, -1.4956055f, -1.1696777f, -1.3449707f,
+ 0.053955078f, -0.54907227f, -0.64941406f, -0.40527344f, -0.1496582f, -0.067871094f, -0.1328125f, -0.15991211f, 0.044677734f, 0.25585938f, 0.31835938f, 0.16113281f, 0.25756836f, 0.36523438f, 0.30444336f, 0.3527832f,
+ 0.20654297f, 1.2531738f, 1.6928711f, 2.6262207f, 2.7858887f, 2.2766113f, 1.0957031f, 0.32495117f, -0.79711914f, -1.7229004f, -2.0270996f, -1.2214355f, -1.1369629f, -2.0170898f, -1.7719727f, -1.5671387f,
+ 2.3149414f, 2.991455f, 1.5952148f, -0.14819336f, -0.6477051f, -0.16430664f, 0.07470703f, -0.28759766f, -0.4309082f, -0.782959f, -0.9194336f, -0.9182129f, -0.76708984f, -0.43164062f, -0.51586914f, -0.96240234f,
+ -0.13427734f, 0.3479004f, 0.4909668f, 0.038330078f, -0.26342773f, -0.3449707f, -0.41430664f, -0.3930664f, -0.16748047f, 0.009521484f, 0.1977539f, 0.0703125f, 0.20703125f, 0.43969727f, 0.24658203f, -0.33032227f,
+ -2.4680176f, -2.8671875f, -1.8813477f, 0.0925293f, 2.0136719f, 1.6013184f, 0.009277344f, -0.20214844f, 0.53344727f, 1.6809082f, 0.20605469f, 0.18408203f, 1.1643066f, 0.7697754f, -0.21728516f, -0.6196289f,
+ 3.2966309f, 3.043457f, 1.8188477f, 0.35595703f, -0.5317383f, -1.1340332f, -1.4089355f, -1.5368652f, -1.5805664f, -1.4577637f, -1.1005859f, -0.7077637f, 0.3149414f, 0.13671875f, 0.09887695f, 0.39257812f,
+ 1.1394043f, 2.0166016f, 1.6103516f, 0.43041992f, 0.8642578f, 1.6750488f, 0.87231445f, -0.23657227f, -1.2756348f, -1.3154297f, -1.0163574f, -0.611084f, -0.8654785f, -0.96191406f, -0.888916f, -1.4370117f,
+ 1.2382812f, 2.4553223f, 2.6896973f, 1.0947266f, 0.8881836f, 0.6599121f, 0.5114746f, 0.54296875f, 0.5046387f, -0.7314453f, -1.0595703f, -1.0734863f, -1.7263184f, -1.8920898f, -1.9853516f, -2.1169434f,
+ 1.7275391f, 1.0910645f, 0.24316406f, -1.076416f, -1.8234863f, -2.0952148f, -1.9289551f, -1.7150879f, -1.1884766f, -0.40429688f, 0.6279297f, 1.0185547f, 1.0893555f, 1.3093262f, 1.5356445f, 1.5893555f,
+ 2.8112793f, 3.1445312f, 2.5549316f, 0.8642578f, 0.45751953f, 1.5227051f, 1.6352539f, 0.92749023f, -0.56347656f, -1.8974609f, -2.1052246f, -2.085205f, -1.9211426f, -1.7441406f, -1.8710938f, -1.7302246f,
+ 0.46118164f, 0.93188477f, 0.859375f, 0.25732422f, -0.083496094f, -0.11010742f, -0.5197754f, -0.7607422f, -0.90966797f, -1.2976074f, -1.0537109f, -0.685791f, 0.013183594f, 0.83984375f, 1.1577148f, 0.9003906f,
+ 3.130371f, 1.8466797f, 0.7558594f, -0.33569336f, -0.7277832f, -0.85498047f, -0.7219238f, -0.6804199f, -0.5666504f, -0.50097656f, -0.49169922f, -0.2824707f, -0.16015625f, -0.3659668f, -0.2529297f, 0.20898438f,
+ -1.7817383f, -0.7636719f, -0.35620117f, -0.9194336f, -0.89990234f, -0.30371094f, 0.16333008f, 0.53393555f, 1.2219238f, 1.6164551f, 1.0964355f, 0.36914062f, 0.19091797f, 0.19116211f, -0.06689453f, -0.2919922f,
+ 2.9470215f, 2.9702148f, 2.4978027f, 1.8425293f, 1.1940918f, 0.48754883f, 0.040771484f, -0.4560547f, -0.71777344f, -1.255127f, -1.7084961f, -1.8168945f, -1.6584473f, -1.5026855f, -1.380127f, -1.4846191f,
+ -0.42797852f, 0.39672852f, 1.0322266f, 0.8232422f, 0.57055664f, 0.99194336f, 1.0778809f, 0.47460938f, 0.11987305f, -0.65625f, -1.3706055f, -1.3859863f, -0.93652344f, -0.296875f, -0.060302734f, -0.35253906f,
+ 3.0546875f, 1.5651855f, 0.72753906f, 0.024658203f, -0.087646484f, -0.13623047f, -0.22338867f, -0.051513672f, -0.01977539f, -0.13867188f, -0.29052734f, -0.4897461f, -0.6779785f, -0.89501953f, -1.0483398f, -1.3132324f,
+ -2.329834f, -1.6538086f, -1.5170898f, -1.8430176f, -1.7233887f, -0.94091797f, -0.39746094f, 0.51293945f, 1.3725586f, 1.703125f, 1.6044922f, 1.3227539f, 1.2766113f, 1.1901855f, 0.91308594f, 0.5095215f,
+ 2.1574707f, 3.0603027f, 2.765625f, 1.7712402f, 0.6225586f, -0.6166992f, -1.060791f, -1.5693359f, -1.4384766f, -1.7651367f, -1.7729492f, -1.0949707f, -0.46020508f, -0.0690918f, -0.05444336f, -0.47509766f,
+ 2.2287598f, 2.074707f, 1.065918f, 0.068603516f, -0.88061523f, -1.3867188f, -1.3818359f, -1.2768555f, -0.8725586f, -0.45751953f, -0.083984375f, -0.022460938f, 0.36108398f, 0.47192383f, 0.12597656f, -0.03466797f,
+ 1.2832031f, 2.3029785f, 1.6501465f, -0.19360352f, -0.94384766f, -0.11206055f, 1.2709961f, 1.0712891f, 0.9008789f, -0.6833496f, -1.9458008f, -1.3894043f, -0.7553711f, -0.17016602f, -0.6489258f, -1.637207f,
+ -0.5410156f, -1.4377441f, -0.87109375f, 0.72143555f, 2.3781738f, 1.8154297f, 0.05834961f, -0.24487305f, 0.27124023f, 1.1665039f, -0.2692871f, -0.24609375f, 0.4802246f, -0.34033203f, -1.2138672f, -1.7270508f,
+ 2.6340332f, 1.8164062f, 0.6784668f, -0.16235352f, -0.64208984f, -0.7529297f, -0.32080078f, 0.12548828f, 0.14257812f, -0.51123047f, -1.1225586f, -1.2424316f, -0.41625977f, -0.21459961f, -0.12768555f, 0.115722656f,
+ 1.6694336f, 1.4055176f, 1.2404785f, 1.4047852f, 1.1928711f, 0.6352539f, 0.19091797f, 0.040527344f, -0.056884766f, -0.5456543f, -0.94018555f, -1.1928711f, -1.1975098f, -1.208252f, -1.2277832f, -1.4104004f,
+ 0.92211914f, 2.1171875f, 1.9343262f, 0.67529297f, 0.21362305f, 0.7409668f, 0.51538086f, 0.0625f, -0.16113281f, -0.91918945f, -1.6809082f, -1.9360352f, -1.3974609f, -0.3359375f, 0.015625f, -0.7668457f,
+ 0.25463867f, 0.27246094f, -0.6647949f, -1.6083984f, -1.6931152f, -1.6413574f, -1.2963867f, 0.03149414f, 1.244873f, 0.9958496f, 0.88183594f, 0.7229004f, 0.6281738f, 1.152832f, 0.7297363f, -0.010498047f,
+ 0.27026367f, 1.5710449f, 2.415039f, 2.5617676f, 2.4665527f, 2.0825195f, 1.2067871f, 1.4360352f, 1.3601074f, -0.64990234f, -2.3432617f, -2.7763672f, -2.7404785f, -2.4682617f, -2.0534668f, -2.338623f,
+ -1.222168f, -0.23828125f, 0.42578125f, 0.41064453f, 0.033203125f, -0.22485352f, -0.31201172f, -0.5358887f, -0.5847168f, -0.4008789f, 0.018066406f, 0.2524414f, 0.36035156f, 0.55249023f, 0.7241211f, 0.74121094f,
+ 1.2573242f, 1.1115723f, 0.8808594f, 0.30810547f, -0.3330078f, -0.22290039f, 0.3894043f, 0.5810547f, 0.515625f, -0.11450195f, -0.8071289f, -0.9470215f, -0.68603516f, -0.69140625f, -0.68188477f, -0.5600586f,
+ -0.8679199f, -0.78100586f, -0.484375f, -0.22045898f, 0.21899414f, 0.6074219f, 0.4650879f, 0.6303711f, 0.52783203f, 0.1328125f, 0.10913086f, 0.28027344f, 0.15795898f, -0.02734375f, -0.22827148f, -0.52075195f,
+ 4.7766113f, 4.218994f, 2.694336f, 1.4052734f, 0.46484375f, 0.12695312f, -0.52441406f, -1.1826172f, -1.3425293f, -1.4343262f, -1.5407715f, -1.5932617f, -1.5834961f, -1.5500488f, -1.4814453f, -1.4541016f,
+ -1.1142578f, 0.16772461f, 1.0881348f, 0.9880371f, 0.6081543f, 0.39868164f, 0.22387695f, 0.01953125f, 0.011230469f, 0.06982422f, -0.13208008f, -0.43896484f, -0.5744629f, -0.34423828f, -0.4321289f, -0.5390625f,
+ 2.583496f, 2.133545f, 1.5522461f, 1.1113281f, 1.237793f, 1.3144531f, 0.93115234f, 0.35742188f, -0.20263672f, -0.76342773f, -1.1687012f, -1.4487305f, -1.6181641f, -1.8156738f, -2.0007324f, -2.203125f,
+ -2.0124512f, -1.4799805f, -1.4538574f, -1.4958496f, -1.1079102f, -0.4272461f, -0.17285156f, 0.080322266f, 0.3112793f, 0.5344238f, 0.6477051f, 0.64208984f, 1.0615234f, 1.8166504f, 1.7543945f, 1.3015137f,
+ 0.86035156f, 1.9960938f, 2.592041f, 2.7302246f, 2.2209473f, 1.1103516f, 0.720459f, -0.033691406f, -0.48901367f, -1.1772461f, -2.2160645f, -2.621338f, -2.5187988f, -1.5297852f, -0.41210938f, -1.2324219f,
+ -0.0390625f, 0.7182617f, 1.293457f, 1.6416016f, 1.7243652f, 0.44335938f, -0.36767578f, -0.62646484f, -0.14038086f, -0.39379883f, -1.5004883f, -1.2729492f, -0.65112305f, -0.21801758f, -0.15991211f, -0.45117188f,
+ 0.4506836f, 1.1796875f, 1.0358887f, 0.4663086f, 0.12597656f, -0.20898438f, -0.2524414f, -0.18115234f, -0.17993164f, -0.23266602f, -0.12768555f, -0.010009766f, -0.23925781f, -0.46972656f, -0.58251953f, -0.7739258f,
+ -3.7177734f, -3.4355469f, -1.828125f, 0.23046875f, 1.5246582f, 1.4841309f, 0.20214844f, -0.1538086f, 0.41015625f, 1.4714355f, 0.095214844f, 0.12524414f, 1.3300781f, 1.3466797f, 0.51538086f, 0.40014648f,
+ 4.776123f, 2.9377441f, 1.6135254f, 0.27954102f, -0.32666016f, -0.5793457f, -0.78466797f, -0.77001953f, -0.76538086f, -0.8562012f, -0.86694336f, -0.8532715f, -0.77905273f, -0.9621582f, -1.0119629f, -1.0510254f,
+ -0.8840332f, -0.5324707f, 0.2368164f, 2.0664062f, 2.5444336f, 1.9240723f, 1.4997559f, 1.230957f, 0.736084f, 0.2121582f, -0.61987305f, -0.9506836f, -1.2260742f, -1.7910156f, -2.0410156f, -2.4060059f,
+ 1.1203613f, 2.241455f, 1.5061035f, 0.26416016f, 0.083496094f, 0.087646484f, 0.00390625f, 0.03100586f, 0.08154297f, -0.39648438f, -0.56689453f, -0.62158203f, -0.7219238f, -0.796875f, -0.9807129f, -1.3356934f,
+ 0.8803711f, -0.5605469f, -0.89404297f, -1.1616211f, -0.9255371f, -1.3374023f, -1.1962891f, -1.2824707f, -1.3156738f, -1.2546387f, -1.0393066f, -0.041015625f, 1.5158691f, 1.6071777f, 2.4050293f, 4.5998535f,
+ 2.1367188f, 3.0183105f, 2.89917f, 2.105713f, 1.6914062f, 1.2595215f, 1.072998f, 0.5095215f, 0.26293945f, -0.62719727f, -1.6728516f, -2.331543f, -2.5375977f, -2.6152344f, -2.5966797f, -2.5751953f,
+ 0.45410156f, 0.56274414f, -0.091552734f, -0.82177734f, -0.8930664f, -0.40722656f, 0.024902344f, 0.008056641f, -0.09692383f, -0.19360352f, -0.25634766f, -0.25048828f, 0.14941406f, 0.73461914f, 0.7668457f, 0.31030273f,
+ 0.8791504f, 1.3742676f, 0.6760254f, -0.22192383f, -0.8535156f, -1.0957031f, -1.0690918f, -1.1728516f, -0.9848633f, -0.6647949f, -0.11669922f, 0.06738281f, 0.6196289f, 1.0905762f, 0.9074707f, 0.5654297f,
+ -0.26635742f, -0.29956055f, -0.8881836f, -1.2294922f, -0.69311523f, 0.011230469f, 0.5498047f, 0.9824219f, 1.184082f, 1.0895996f, 0.5878906f, 0.06738281f, -0.08911133f, -0.05029297f, -0.27319336f, -0.68359375f,
+ 3.256836f, 3.5593262f, 2.2746582f, 1.1318359f, 0.3149414f, -0.02368164f, 0.27172852f, -0.19335938f, -0.48779297f, -0.9663086f, -0.9187012f, -1.0222168f, -1.512207f, -1.6816406f, -1.8964844f, -2.1069336f,
+ -0.057617188f, -0.45092773f, -0.9638672f, -0.72143555f, 0.20703125f, 1.4692383f, 1.921875f, 1.6833496f, 1.3933105f, 0.6699219f, 0.17333984f, -0.43798828f, -0.9772949f, -1.1477051f, -1.3552246f, -1.4057617f,
+};
+const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = {
+ 0.30615234f, 0.48828125f, -0.02709961f, -0.47680664f, -0.5300293f, -0.25463867f, -0.13305664f, -0.14941406f, -0.14819336f, 0.08666992f, 0.28833008f, 0.27514648f, 0.099365234f, -0.017578125f, 0.033203125f, 0.15893555f,
+ 0.40942383f, -0.044189453f, -0.088378906f, 0.38720703f, 0.5151367f, 0.42236328f, 0.34960938f, 0.2680664f, 0.037597656f, -0.19970703f, -0.31054688f, -0.32617188f, -0.38452148f, -0.38085938f, -0.38598633f, -0.2692871f,
+ -0.16040039f, -0.37548828f, -0.41479492f, -0.1237793f, 0.25708008f, 0.29589844f, 0.045410156f, -0.04345703f, -0.11450195f, -0.2019043f, 0.032470703f, 0.5847168f, 1.074707f, 0.3178711f, -0.43847656f, -0.73535156f,
+ -0.72021484f, 0.0859375f, 0.36450195f, 0.07739258f, -0.03857422f, -0.020263672f, 0.2277832f, 0.23657227f, -0.061523438f, -0.6010742f, -0.5341797f, -0.014160156f, 0.3154297f, 0.35327148f, 0.27368164f, 0.05517578f,
+ 0.17041016f, -0.1340332f, -0.17480469f, -0.16430664f, -0.15039062f, -0.16210938f, 0.20776367f, 0.78881836f, 0.8288574f, 0.2783203f, -0.099609375f, -0.26513672f, -0.29541016f, -0.31860352f, -0.3034668f, -0.20629883f,
+ 0.66967773f, 0.6286621f, 0.5107422f, 0.36791992f, 0.0949707f, -0.26904297f, -0.43603516f, -0.5292969f, -0.50219727f, -0.28881836f, -0.08081055f, 0.07861328f, -0.040771484f, -0.15014648f, -0.076416016f, 0.022705078f,
+ -0.14648438f, -0.46923828f, -0.43554688f, -0.11254883f, 0.021728516f, -0.06274414f, -0.10620117f, -0.23876953f, -0.34277344f, -0.21069336f, 0.010009766f, 0.26293945f, 0.36938477f, 0.4560547f, 0.5004883f, 0.5041504f,
+ -0.6381836f, -0.37841797f, -0.12036133f, 0.46875f, 0.6027832f, 0.40478516f, 0.3227539f, 0.2175293f, 0.029296875f, 0.009521484f, 0.091552734f, 0.014160156f, -0.19921875f, -0.27270508f, -0.3071289f, -0.24560547f,
+ 1.0043945f, 0.034423828f, -0.36523438f, -0.1628418f, -0.17504883f, -0.16357422f, 0.01977539f, 0.041992188f, -0.092041016f, -0.12548828f, -0.1381836f, -0.15527344f, -0.13720703f, -0.041992188f, 0.11791992f, 0.33789062f,
+ -0.29882812f, -0.056640625f, 0.22631836f, 0.35375977f, 0.40576172f, 0.053466797f, -0.33154297f, -0.58374023f, -0.59887695f, -0.13867188f, 0.35302734f, 0.4267578f, 0.12548828f, -0.052490234f, 0.022949219f, 0.09301758f,
+ -0.62060547f, -0.6557617f, -0.3918457f, -0.23461914f, -0.10498047f, -0.024169922f, 0.10473633f, 0.2746582f, 0.33642578f, 0.2866211f, 0.2980957f, 0.35498047f, 0.22167969f, 0.06298828f, 0.0036621094f, 0.087890625f,
+ -0.24169922f, 0.39331055f, 0.45410156f, -0.013671875f, -0.028076172f, 0.032226562f, -0.03491211f, 0.13916016f, 0.57006836f, 0.30078125f, -0.028564453f, -0.08300781f, -0.23266602f, -0.25585938f, -0.40356445f, -0.56762695f,
+ -0.25463867f, 0.20141602f, 0.13623047f, 0.021972656f, 0.018798828f, 0.35424805f, 0.30541992f, -0.043945312f, -0.032226562f, 0.4873047f, 0.2692871f, -0.57910156f, -0.86279297f, -0.46435547f, 0.21459961f, 0.2277832f,
+ 0.10083008f, -0.0048828125f, 0.15429688f, 0.58935547f, 0.58325195f, 0.15014648f, -0.1394043f, -0.30566406f, -0.39794922f, -0.42016602f, -0.4350586f, -0.49121094f, -0.24169922f, 0.07788086f, 0.3359375f, 0.4440918f,
+ -0.8688965f, -0.12646484f, 0.37768555f, 0.3232422f, -0.09790039f, -0.3017578f, -0.11328125f, 0.06982422f, 0.10864258f, 0.10180664f, 0.019042969f, -0.020751953f, -0.025878906f, 0.01977539f, 0.15820312f, 0.37646484f,
+ 0.04272461f, 0.020996094f, 0.31860352f, 0.23291016f, -0.33081055f, -0.80322266f, -0.73657227f, -0.34106445f, 0.011962891f, 0.27807617f, 0.45922852f, 0.49145508f, 0.3022461f, 0.14160156f, -0.017333984f, -0.07055664f,
+ -0.33544922f, 0.075683594f, -0.29907227f, -0.7363281f, -0.6525879f, -0.17797852f, 0.36279297f, 0.41870117f, 0.25170898f, 0.10473633f, 0.030273438f, -0.11254883f, 0.026855469f, 0.3503418f, 0.42382812f, 0.26904297f,
+ 0.3544922f, 0.67529297f, 0.38671875f, 0.009521484f, -0.040771484f, 0.08984375f, 0.2446289f, 0.16455078f, -0.17333984f, -0.4404297f, -0.46533203f, -0.40039062f, -0.28222656f, -0.1875f, -0.036865234f, 0.10205078f,
+ 0.4255371f, 0.16113281f, -0.11669922f, -0.16040039f, -0.14379883f, -0.2055664f, -0.0769043f, -0.055419922f, -0.19677734f, -0.44921875f, -0.3100586f, 0.10839844f, 0.5698242f, 0.5554199f, 0.11328125f, -0.21850586f,
+ -0.2980957f, -0.51660156f, -0.51000977f, -0.23046875f, 0.24658203f, 0.49682617f, 0.44580078f, 0.4501953f, 0.15917969f, -0.25317383f, -0.34301758f, -0.25146484f, -0.045898438f, 0.07885742f, 0.19018555f, 0.38085938f,
+ 0.32836914f, 0.41186523f, 0.40966797f, 0.23071289f, -0.27294922f, -0.7373047f, -0.33129883f, 0.2084961f, 0.29248047f, 0.023925781f, -0.22290039f, -0.2241211f, -0.10595703f, -0.109375f, -0.049072266f, 0.14770508f,
+ -0.17578125f, 0.35791016f, 0.71240234f, 0.55444336f, 0.37963867f, 0.25317383f, 0.0007324219f, -0.17456055f, -0.19921875f, -0.18261719f, -0.1381836f, -0.13476562f, -0.2697754f, -0.36523438f, -0.3803711f, -0.23730469f,
+ 0.18774414f, -0.33813477f, -0.40356445f, -0.16430664f, -0.35253906f, -0.5744629f, -0.40454102f, 0.03930664f, 0.28295898f, 0.24194336f, 0.11450195f, -0.011962891f, 0.15576172f, 0.29174805f, 0.39453125f, 0.5402832f,
+ 0.22485352f, -0.44970703f, -0.048583984f, 0.5905762f, 0.5395508f, -0.08300781f, -0.50219727f, -0.24121094f, 0.2331543f, 0.15942383f, -0.044433594f, 0.043701172f, -0.01928711f, -0.19824219f, -0.17260742f, -0.03173828f,
+ 0.86157227f, 0.21875f, 0.039794922f, 0.023925781f, -0.0925293f, -0.16845703f, -0.11669922f, 0.080322266f, 0.061279297f, 0.123535156f, 0.23388672f, 0.23022461f, 0.0056152344f, -0.33666992f, -0.5786133f, -0.5854492f,
+ 0.5175781f, 0.14453125f, -0.21850586f, -0.46777344f, 0.28515625f, 0.9855957f, 0.04296875f, -0.60424805f, -0.40625f, 0.07104492f, -0.0793457f, -0.111083984f, 0.017333984f, 0.021728516f, -0.1381836f, -0.060791016f,
+ 0.48950195f, -0.4885254f, -0.7644043f, -0.43164062f, -0.08203125f, 0.11401367f, 0.2331543f, 0.1472168f, 0.03540039f, 0.18945312f, 0.30737305f, 0.25976562f, 0.095458984f, -0.0234375f, -0.07739258f, -0.00390625f,
+ -0.111816406f, 0.22485352f, 0.00048828125f, -0.32177734f, -0.1508789f, 0.43017578f, 0.7011719f, 0.35229492f, -0.12060547f, -0.23291016f, 0.15258789f, 0.19702148f, -0.064208984f, -0.21606445f, -0.3857422f, -0.4543457f,
+ -0.22290039f, -0.33740234f, 0.068359375f, 0.09277344f, 0.04638672f, 0.21899414f, -0.03564453f, 0.036621094f, 0.6125488f, 0.5058594f, -0.4128418f, -0.69140625f, -0.5534668f, 0.16235352f, 0.54418945f, -0.034179688f,
+ -0.013916016f, 0.41259766f, 0.28393555f, -0.13085938f, -0.35058594f, -0.3713379f, -0.2619629f, -0.2854004f, -0.36401367f, -0.41210938f, -0.30444336f, -0.16552734f, 0.076416016f, 0.40722656f, 0.72143555f, 0.75878906f,
+ -0.78149414f, 0.05517578f, 0.09863281f, -0.35083008f, -0.29174805f, 0.1352539f, 0.10620117f, -0.3515625f, -0.27514648f, 0.15917969f, 0.34326172f, 0.2626953f, 0.39916992f, 0.42089844f, 0.20947266f, -0.1394043f,
+ -0.20361328f, -0.21557617f, -0.16308594f, -0.041748047f, -0.111083984f, -0.057617188f, 0.0390625f, 0.013183594f, 0.17358398f, 0.74902344f, 0.9448242f, 0.4477539f, -0.09423828f, -0.32739258f, -0.50634766f, -0.6467285f,
+};
+const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = {
+ 0.15209961f, -0.12768555f, 0.09375f, -0.083496094f, -0.25390625f, 0.12524414f, 0.2993164f, -0.09863281f, -0.34814453f, -0.2434082f, -0.11254883f, -0.060058594f, 0.032470703f, 0.15527344f, 0.23413086f, 0.2355957f,
+ -0.16235352f, -0.111083984f, -0.3173828f, -0.25634766f, 0.13842773f, 0.29858398f, 0.10498047f, 0.11743164f, 0.26611328f, 0.05444336f, -0.1459961f, -0.19238281f, 0.041748047f, 0.2097168f, 0.07421875f, -0.12011719f,
+ -0.05078125f, 0.14770508f, -0.1003418f, -0.32104492f, -0.17504883f, -0.18652344f, -0.27148438f, -0.07788086f, 0.0036621094f, -0.04296875f, 0.10131836f, 0.34985352f, 0.3083496f, 0.10107422f, 0.0769043f, 0.13696289f,
+ -0.19140625f, -0.030273438f, 0.22509766f, 0.079589844f, -0.27148438f, -0.19604492f, 0.27929688f, 0.3503418f, 0.10424805f, 0.0061035156f, 0.06542969f, 0.11669922f, 0.036865234f, -0.1303711f, -0.22705078f, -0.21655273f,
+ 0.26538086f, -0.20825195f, -0.25073242f, 0.119628906f, 0.27270508f, 0.17797852f, -0.0024414062f, -0.12768555f, -0.22802734f, 0.0075683594f, 0.2133789f, 0.19482422f, 0.045898438f, -0.1184082f, -0.17797852f, -0.18383789f,
+ 0.2565918f, 0.24658203f, 0.1015625f, -0.029296875f, -0.14355469f, -0.13989258f, -0.20751953f, -0.19677734f, 0.17504883f, 0.41601562f, 0.13085938f, -0.20532227f, -0.16235352f, 0.040771484f, -0.037353516f, -0.24511719f,
+ -0.0871582f, 0.022949219f, 0.00048828125f, 0.07397461f, 0.14379883f, 0.067871094f, 0.0036621094f, 0.1171875f, 0.087402344f, 0.0012207031f, -0.075927734f, -0.11352539f, -0.31420898f, -0.38916016f, -0.022949219f, 0.484375f,
+ -0.1821289f, 0.060058594f, 0.24780273f, 0.41674805f, 0.2890625f, -0.1472168f, -0.20581055f, -0.083984375f, -0.060302734f, -0.19921875f, -0.17651367f, -0.08984375f, 0.011230469f, 0.13110352f, 0.080078125f, -0.09106445f,
+};
+
+const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3};
+
+const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 };
+const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 };
+const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 };
+const int16_t ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 };
+
+const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = {
+ -0.11376953f, -0.06591797f, 0.041992188f, 0.044677734f, 0.17871094f, -0.02758789f, -0.32592773f, -0.21069336f, -0.049072266f, 0.0126953125f, 0.012939453f, 0.015136719f, 0.08203125f, 0.12670898f, 0.12695312f, 0.15112305f,
+ -0.017089844f, 0.09326172f, 0.2355957f, 0.2241211f, 0.107421875f, 0.05029297f, 0.039794922f, -0.0073242188f, -0.048339844f, -0.0871582f, -0.08520508f, -0.12060547f, -0.111572266f, -0.10620117f, -0.08911133f, -0.078125f,
+ -0.26635742f, 0.27368164f, 0.4543457f, 0.1821289f, 0.6513672f, 0.18066406f, 0.14575195f, -0.008056641f, 0.2631836f, -0.045898438f, -0.52001953f, -0.1628418f, 0.038330078f, -0.31811523f, -0.4321289f, -0.43603516f,
+ -0.044189453f, -0.10449219f, -0.091796875f, -0.10620117f, -0.09423828f, 0.09326172f, 0.2697754f, 0.16577148f, 0.06201172f, 0.010986328f, 0.021728516f, -0.023925781f, -0.036621094f, -0.03930664f, -0.04345703f, -0.03930664f,
+ 0.4099121f, 0.06323242f, -0.021972656f, -0.014404297f, -0.013916016f, -0.018554688f, -0.052246094f, -0.051757812f, -0.03173828f, -0.03491211f, -0.02758789f, -0.05859375f, -0.045410156f, -0.042236328f, -0.038085938f, -0.021484375f,
+ 0.0024414062f, 0.030761719f, 0.020263672f, 0.013671875f, -0.009033203f, 0.012939453f, 0.009521484f, -0.030273438f, -0.048339844f, -0.022216797f, 0.011962891f, -0.017333984f, -0.011474609f, -0.0007324219f, 0.011962891f, 0.025634766f,
+ 0.17358398f, 0.22387695f, 0.19702148f, -0.019042969f, -0.27514648f, -0.5378418f, -0.30688477f, -0.03540039f, 0.0007324219f, -0.049560547f, 0.07519531f, 0.052246094f, 0.12670898f, 0.16308594f, 0.12133789f, 0.09033203f,
+ -0.32006836f, -0.29125977f, -0.24731445f, -0.17797852f, -0.140625f, -0.10595703f, -0.12670898f, -0.10864258f, -0.08618164f, -0.07421875f, 0.030517578f, 0.15917969f, 0.24975586f, 0.31518555f, 0.40893555f, 0.5151367f,
+ -0.49658203f, -0.033691406f, 0.083740234f, 0.04272461f, 0.03466797f, 0.053955078f, 0.03466797f, 0.02368164f, 0.037597656f, 0.03173828f, 0.028320312f, 0.00024414062f, 0.028564453f, 0.030761719f, 0.044189453f, 0.055419922f,
+ -0.040527344f, 0.022460938f, 0.009765625f, 0.036865234f, 0.055664062f, 0.046875f, 0.032470703f, 0.08105469f, 0.095703125f, 0.04296875f, -0.0087890625f, -0.064697266f, -0.057373047f, -0.04711914f, -0.09765625f, -0.107666016f,
+ 0.27148438f, 0.3696289f, 0.39672852f, 0.38427734f, 0.30151367f, 0.21655273f, 0.15551758f, 0.12133789f, -0.008056641f, -0.12792969f, -0.22973633f, -0.39111328f, -0.4465332f, -0.46826172f, -0.35986328f, -0.18530273f,
+ -0.3166504f, -0.2758789f, -0.22290039f, -0.1850586f, -0.15771484f, -0.1184082f, -0.04638672f, 0.032470703f, 0.10961914f, 0.16821289f, 0.20336914f, 0.1665039f, 0.20019531f, 0.19970703f, 0.14233398f, 0.1003418f,
+ -0.028076172f, -0.02734375f, -0.06665039f, -0.099365234f, -0.10522461f, -0.10546875f, -0.056884766f, 0.017333984f, 0.061523438f, 0.07836914f, 0.087890625f, 0.051513672f, 0.05419922f, 0.051757812f, 0.04272461f, 0.043945312f,
+ -0.14404297f, -0.3088379f, -0.07885742f, 0.053222656f, 0.064208984f, 0.032226562f, 0.057617188f, 0.05810547f, 0.05126953f, 0.041748047f, 0.053955078f, 0.015136719f, 0.028808594f, 0.033691406f, 0.0234375f, 0.018554688f,
+ 0.49609375f, 0.45263672f, 0.2915039f, 0.15649414f, 0.052246094f, 0.017578125f, -0.050048828f, -0.06640625f, -0.10839844f, -0.15063477f, -0.17138672f, -0.20532227f, -0.18432617f, -0.17553711f, -0.19213867f, -0.16235352f,
+ -0.0056152344f, -0.030761719f, -0.092285156f, -0.1262207f, -0.15917969f, -0.12011719f, -0.1105957f, -0.13354492f, -0.12915039f, -0.09863281f, 0.017578125f, 0.12866211f, 0.21850586f, 0.24853516f, 0.1875f, 0.20532227f,
+ -0.011230469f, -0.061035156f, -0.032226562f, 0.18139648f, 0.068359375f, -0.13916016f, -0.1015625f, 0.0017089844f, -0.004638672f, 0.009765625f, 0.03149414f, -0.0068359375f, 0.0043945312f, 0.023925781f, 0.017333984f, 0.018066406f,
+ -0.045166016f, -0.05493164f, -0.04296875f, 0.053710938f, 0.2121582f, 0.25195312f, 0.08911133f, -0.034179688f, -0.049560547f, -0.06225586f, -0.061523438f, -0.07836914f, -0.052490234f, -0.044189453f, -0.046142578f, -0.03540039f,
+ 0.08129883f, 0.20532227f, 0.04296875f, 0.11010742f, 0.3720703f, 0.4272461f, 0.31884766f, 0.19335938f, 0.015625f, -0.17895508f, -0.20214844f, -0.38330078f, -0.2487793f, -0.20581055f, -0.24560547f, -0.30297852f,
+ -0.40112305f, -0.2043457f, -0.048828125f, 0.018798828f, -0.080322266f, 0.016113281f, 0.13427734f, 0.2734375f, 0.3503418f, 0.35766602f, 0.19165039f, -0.056884766f, -0.11645508f, -0.1574707f, -0.14990234f, -0.12719727f,
+ 0.2763672f, 0.27905273f, 0.2241211f, 0.035888672f, -0.10253906f, -0.061523438f, -0.08544922f, -0.19848633f, -0.25634766f, -0.22729492f, -0.20019531f, -0.12548828f, -0.0026855469f, 0.08178711f, 0.14819336f, 0.21411133f,
+ -0.11425781f, -0.068603516f, 0.2446289f, -0.0031738281f, -0.04321289f, -0.033203125f, 0.024414062f, -0.0036621094f, -0.022460938f, 0.0017089844f, 0.018554688f, -0.014892578f, -0.010253906f, 0.0021972656f, 0.0068359375f, 0.015380859f,
+ 0.080322266f, 0.23852539f, 0.16894531f, 0.029052734f, -0.043701172f, -0.10571289f, -0.07788086f, -0.037109375f, -0.0063476562f, -0.025878906f, -0.036865234f, -0.06347656f, -0.04321289f, -0.03173828f, -0.032470703f, -0.012451172f,
+ -0.072265625f, -0.17602539f, -0.29736328f, -0.35253906f, -0.34814453f, -0.25732422f, -0.2097168f, -0.1850586f, -0.11230469f, -0.052978516f, 0.09643555f, 0.3071289f, 0.3930664f, 0.56689453f, 0.40625f, 0.2939453f,
+ -0.24194336f, -0.11010742f, -0.05102539f, 0.03930664f, -0.061523438f, -0.018554688f, 0.010986328f, 0.04296875f, -0.21557617f, -0.01928711f, 0.009277344f, 0.048095703f, 0.26342773f, 0.36791992f, 0.13232422f, -0.19604492f,
+ 0.16210938f, 0.16381836f, 0.14404297f, 0.1081543f, 0.08959961f, 0.11450195f, 0.11743164f, 0.11645508f, 0.13110352f, 0.11303711f, 0.021240234f, -0.15844727f, -0.21166992f, -0.27368164f, -0.33813477f, -0.29956055f,
+ -0.14624023f, 0.068603516f, 0.24731445f, 0.38916016f, 0.31860352f, 0.27416992f, 0.19165039f, 0.13793945f, 0.06958008f, -0.018798828f, -0.1159668f, -0.2849121f, -0.3581543f, -0.3803711f, -0.25952148f, -0.1328125f,
+ -0.64819336f, -0.5800781f, -0.15527344f, -0.07104492f, -0.08300781f, 0.009765625f, 0.10620117f, 0.10571289f, 0.13989258f, 0.12988281f, 0.1743164f, 0.18408203f, 0.09375f, 0.12524414f, 0.20678711f, 0.26220703f,
+ 0.07836914f, 0.16430664f, -0.014404297f, -0.20898438f, -0.08984375f, 0.04296875f, 0.06713867f, 0.0075683594f, -0.037109375f, -0.029296875f, -0.020019531f, -0.03173828f, 0.0036621094f, 0.016113281f, 0.015380859f, 0.035888672f,
+ -0.02368164f, -0.14282227f, -0.36645508f, -0.11279297f, 0.042236328f, 0.14086914f, 0.041503906f, 0.009277344f, 0.039794922f, 0.055419922f, 0.061523438f, 0.040771484f, 0.056152344f, 0.064208984f, 0.052490234f, 0.041503906f,
+ 0.23120117f, 0.21533203f, 0.16748047f, 0.15649414f, 0.1262207f, 0.10498047f, 0.08691406f, 0.020019531f, -0.03466797f, -0.12841797f, -0.18579102f, -0.29492188f, -0.2705078f, -0.17236328f, -0.06933594f, 0.04736328f,
+ -0.19580078f, -0.14624023f, -0.11303711f, -0.055908203f, -0.052001953f, -0.009033203f, 0.022949219f, -0.0068359375f, -0.032470703f, 0.0017089844f, 0.045410156f, 0.025146484f, 0.039794922f, 0.07543945f, 0.1574707f, 0.24267578f,
+};
+
+const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = {
+ -0.013916016f, 0.0007324219f, 0.017089844f, 0.005859375f, 0.056152344f, -0.08178711f, -0.2927246f, 0.00390625f, 0.140625f, 0.03881836f, 0.010498047f, 0.038330078f, 0.042236328f, 0.020751953f, 0.005859375f, 0.0075683594f,
+ -0.07104492f, -0.10253906f, 0.038085938f, 0.091552734f, 0.118896484f, 0.13476562f, 0.05078125f, -0.111328125f, -0.13842773f, -0.20727539f, -0.25732422f, -0.15063477f, 0.032470703f, 0.08129883f, 0.17578125f, 0.31469727f,
+ 0.0715332f, 0.029052734f, 0.01953125f, 0.008056641f, 0.0234375f, 0.020751953f, 0.032226562f, 0.021972656f, 0.03466797f, 0.017822266f, -0.037841797f, -0.14038086f, -0.21679688f, -0.11035156f, 0.057617188f, 0.16845703f,
+ -0.1081543f, -0.02734375f, -0.08251953f, -0.08227539f, -0.07910156f, 0.049804688f, 0.10253906f, 0.23876953f, 0.25683594f, 0.03173828f, -0.15820312f, -0.14648438f, -0.008056641f, -0.00048828125f, -0.014404297f, 0.02734375f,
+ -0.022705078f, 0.028076172f, 0.14111328f, -0.06762695f, -0.07348633f, 0.16259766f, -0.0073242188f, -0.06567383f, -0.028564453f, -0.0107421875f, -0.023925781f, 0.0126953125f, -0.005859375f, -0.006591797f, -0.014160156f, -0.018066406f,
+ -0.09741211f, -0.092041016f, -0.061523438f, -0.011962891f, 0.006591797f, 0.041748047f, 0.008300781f, -0.017578125f, -0.08520508f, -0.12573242f, -0.06298828f, 0.13696289f, 0.25195312f, 0.15332031f, 0.001953125f, -0.04663086f,
+ -0.20239258f, 0.2705078f, 0.059326172f, 0.0041503906f, 0.022216797f, -0.009765625f, -0.026611328f, -0.02734375f, -0.032714844f, -0.016845703f, -0.025878906f, -0.0014648438f, -0.0075683594f, -0.009521484f, 0.004638672f, -0.0009765625f,
+ 0.064453125f, -0.26708984f, 0.122802734f, 0.025634766f, -0.0063476562f, 0.0043945312f, 0.008544922f, -0.0017089844f, 0.0061035156f, -0.007080078f, -0.018798828f, 0.011962891f, 0.008544922f, 0.010009766f, 0.020263672f, 0.018310547f,
+ -0.0007324219f, -0.037597656f, -0.036376953f, -0.015625f, 0.0056152344f, -0.0056152344f, -0.0029296875f, 0.032714844f, 0.047607422f, 0.019042969f, -0.010498047f, 0.017578125f, 0.0126953125f, 0.0043945312f, -0.013427734f, -0.016845703f,
+ 0.06933594f, 0.052978516f, 0.061035156f, 0.13378906f, 0.13427734f, 0.0053710938f, -0.099365234f, -0.18334961f, -0.21850586f, -0.083496094f, 0.020263672f, 0.05883789f, 0.013427734f, 0.011474609f, 0.01953125f, 0.0041503906f,
+ 0.0036621094f, -0.05053711f, -0.005126953f, 0.19091797f, -0.18798828f, -0.0546875f, 0.00048828125f, -0.021728516f, -0.001953125f, 0.0017089844f, 0.0041503906f, 0.024902344f, 0.022216797f, 0.02758789f, 0.02709961f, 0.01928711f,
+ 0.024658203f, -0.0041503906f, -0.026611328f, -0.0859375f, -0.06323242f, -0.068603516f, -0.07495117f, -0.050048828f, -0.061035156f, -0.0061035156f, 0.056396484f, 0.088378906f, 0.05883789f, 0.06738281f, 0.07763672f, 0.06738281f,
+ 0.13696289f, 0.08496094f, 0.07104492f, 0.046875f, 0.024658203f, 0.0048828125f, -0.0107421875f, -0.006591797f, 0.014160156f, -0.0073242188f, -0.041503906f, -0.02709961f, -0.041503906f, -0.060791016f, -0.09277344f, -0.095214844f,
+ -0.16772461f, 0.06665039f, 0.1821289f, 0.07397461f, -0.020019531f, 0.055419922f, 0.0390625f, -0.12011719f, -0.107910156f, 0.123291016f, 0.37939453f, 0.032714844f, -0.16137695f, -0.15234375f, -0.10546875f, -0.11743164f,
+ -0.013183594f, -0.011230469f, -0.037353516f, 0.0026855469f, -0.04638672f, -0.24438477f, 0.099853516f, 0.1105957f, 0.008544922f, 0.010253906f, 0.013183594f, 0.03857422f, 0.016601562f, 0.014892578f, 0.01928711f, 0.018066406f,
+ 0.044189453f, 0.07763672f, -0.03491211f, -0.18359375f, 0.15722656f, 0.061279297f, -0.029541016f, -0.018798828f, -0.023925781f, 0.0007324219f, -0.010498047f, 0.0087890625f, -0.0056152344f, -0.009277344f, -0.014892578f, -0.018798828f,
+ 0.13696289f, 0.011230469f, -0.033447266f, -0.017333984f, -0.07763672f, -0.122558594f, -0.076416016f, -0.017333984f, 0.14257812f, 0.21313477f, 0.14575195f, 0.032226562f, -0.083740234f, -0.12036133f, -0.076171875f, -0.057373047f,
+ 0.029541016f, -0.12231445f, -0.2475586f, 0.0949707f, 0.18896484f, 0.026123047f, 0.012939453f, 0.030029297f, 0.009033203f, -0.009277344f, -0.025634766f, 0.0087890625f, -0.0024414062f, -0.0017089844f, 0.0087890625f, -0.00024414062f,
+ -0.03857422f, -0.03881836f, -0.08886719f, -0.068847656f, 0.022216797f, 0.10229492f, 0.12841797f, 0.083984375f, 0.06567383f, 0.08178711f, 0.075927734f, 0.040039062f, -0.047851562f, -0.09448242f, -0.103515625f, -0.119140625f,
+ 0.009277344f, 0.046875f, 0.08178711f, 0.037597656f, 0.0063476562f, -0.038330078f, -0.01171875f, 0.28222656f, 0.027832031f, -0.25195312f, -0.12817383f, 0.01586914f, 0.011474609f, -0.014404297f, -0.044189453f, -0.030761719f,
+ 0.0637207f, 0.12426758f, 0.095458984f, -0.13378906f, -0.26293945f, -0.06323242f, 0.033203125f, 0.06591797f, 0.048583984f, 0.026367188f, 0.005859375f, 0.01977539f, -0.0029296875f, -0.005859375f, -0.0007324219f, -0.013183594f,
+ -0.016845703f, -0.052246094f, -0.057373047f, 0.008056641f, -0.01171875f, -0.068847656f, -0.0859375f, -0.016357422f, -0.012207031f, 0.046875f, 0.18164062f, 0.2692871f, 0.13476562f, -0.024414062f, -0.1274414f, -0.16723633f,
+ -0.021972656f, -0.053955078f, -0.022705078f, -0.00048828125f, 0.072021484f, 0.083496094f, 0.056640625f, -0.014892578f, 0.028320312f, 0.09399414f, 0.061279297f, -0.48779297f, -0.018554688f, 0.1550293f, 0.05859375f, 0.0107421875f,
+ 0.38476562f, -0.049316406f, -0.0793457f, -0.025146484f, -0.02319336f, -0.020751953f, 0.026855469f, -0.00048828125f, -0.052490234f, -0.033935547f, -0.04638672f, -0.0107421875f, -0.018066406f, -0.022216797f, -0.016113281f, -0.013427734f,
+ -0.23852539f, -0.064941406f, -0.018066406f, -0.0034179688f, 0.040283203f, 0.01928711f, 0.018310547f, 0.030761719f, 0.030029297f, 0.028564453f, 0.010253906f, 0.037109375f, 0.021484375f, 0.03491211f, 0.03515625f, 0.018798828f,
+ 0.03857422f, 0.028808594f, 0.025878906f, 0.04321289f, 0.03491211f, -0.021972656f, -0.03466797f, -0.01953125f, -0.02368164f, -0.095214844f, -0.13891602f, -0.032714844f, 0.013671875f, 0.05883789f, 0.064697266f, 0.057861328f,
+ -0.014892578f, 0.014892578f, 0.0126953125f, 0.045410156f, 0.0073242188f, 0.08300781f, 0.17797852f, 0.030761719f, -0.11743164f, -0.071777344f, -0.048095703f, -0.007080078f, -0.016113281f, -0.024414062f, -0.033203125f, -0.03881836f,
+ 0.0690918f, -0.049072266f, -0.23413086f, -0.3227539f, -0.15258789f, -0.028320312f, 0.05883789f, 0.055908203f, 0.08618164f, 0.08203125f, 0.052246094f, 0.0546875f, 0.022216797f, 0.07885742f, 0.13061523f, 0.095947266f,
+ -0.13452148f, -0.026855469f, 0.107177734f, 0.16040039f, 0.13305664f, 0.043701172f, 0.0087890625f, 0.020019531f, 0.040039062f, 0.017578125f, -0.030029297f, -0.024902344f, -0.067871094f, -0.08666992f, -0.076416016f, -0.083740234f,
+ -0.01953125f, -0.059814453f, -0.061279297f, 0.008056641f, 0.031982422f, 0.08203125f, -0.045166016f, -0.25561523f, -0.02758789f, 0.10522461f, 0.06274414f, 0.046875f, 0.029052734f, 0.03173828f, 0.04248047f, 0.028564453f,
+ -0.050048828f, 0.084472656f, 0.27172852f, 0.053222656f, -0.063964844f, -0.12988281f, -0.07299805f, -0.051757812f, -0.036621094f, -0.0014648438f, -0.0009765625f, 0.021728516f, 0.009033203f, -0.0007324219f, -0.013183594f, -0.018554688f,
+ 0.0847168f, 0.18920898f, -0.1796875f, -0.01586914f, -0.017822266f, -0.021728516f, 0.006591797f, -0.0075683594f, -0.019042969f, -0.0107421875f, -0.0146484375f, 0.014160156f, 0.0034179688f, -0.0056152344f, -0.0036621094f, -0.0017089844f,
+};
+
+const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 };
+
+const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = {
+ -0.23950195f, -0.203125f, -0.17822266f, -0.1315918f, -0.123291016f, -0.095947266f, -0.106933594f, -0.16552734f, -0.14941406f, -0.075683594f, 0.026367188f, 0.1015625f, 0.17041016f, 0.2770996f, 0.37890625f, 0.5148926f,
+ 0.12890625f, 0.20825195f, 0.22924805f, 0.2998047f, 0.24267578f, 0.14477539f, 0.07861328f, 0.024658203f, -0.076171875f, -0.18432617f, -0.26660156f, -0.33251953f, -0.2758789f, -0.13964844f, -0.030517578f, -0.05126953f,
+ -0.14160156f, -0.13305664f, -0.111816406f, -0.037353516f, -0.038085938f, 0.051513672f, 0.07348633f, 0.0073242188f, 0.044921875f, -0.0234375f, -0.123291016f, -0.01171875f, 0.28100586f, 0.24194336f, 0.0703125f, -0.1496582f,
+ 0.053466797f, 0.122802734f, 0.1394043f, 0.099853516f, 0.078125f, 0.018554688f, 0.034423828f, 0.103759766f, 0.06542969f, -0.030273438f, -0.09887695f, -0.099609375f, -0.060058594f, -0.119628906f, -0.18237305f, -0.12451172f,
+ -0.04345703f, -0.033447266f, -0.06665039f, -0.06518555f, -0.048828125f, -0.11645508f, -0.2055664f, -0.20263672f, -0.15576172f, -0.0009765625f, 0.103759766f, 0.21191406f, 0.24414062f, 0.14526367f, 0.09863281f, 0.13476562f,
+ 0.05810547f, 0.22558594f, 0.10180664f, -0.08618164f, -0.07470703f, 0.052246094f, 0.052490234f, -0.042236328f, -0.07055664f, -0.037109375f, -0.024169922f, -0.03149414f, -0.031982422f, -0.040527344f, -0.038085938f, -0.013183594f,
+ 0.020019531f, -0.033447266f, -0.14550781f, -0.42089844f, -0.19604492f, 0.038085938f, 0.026611328f, 0.016357422f, 0.038330078f, 0.057861328f, 0.06762695f, 0.08081055f, 0.091308594f, 0.10180664f, 0.11987305f, 0.13720703f,
+ 0.13671875f, 0.30566406f, 0.4716797f, 0.54785156f, 0.39819336f, 0.27075195f, 0.17602539f, 0.092041016f, -0.013183594f, -0.17163086f, -0.3166504f, -0.42138672f, -0.53271484f, -0.45898438f, -0.27416992f, -0.21044922f,
+ -0.38989258f, -0.37597656f, -0.3696289f, -0.2915039f, -0.26098633f, -0.19921875f, -0.15136719f, -0.09057617f, -0.040771484f, 0.13354492f, 0.30126953f, 0.3857422f, 0.40649414f, 0.31103516f, 0.30004883f, 0.3317871f,
+ 0.35107422f, 0.5229492f, 0.41870117f, 0.14355469f, -0.037597656f, -0.13134766f, -0.18383789f, -0.18066406f, -0.15771484f, -0.17480469f, -0.17041016f, -0.15209961f, -0.08251953f, -0.06616211f, -0.064453125f, -0.03466797f,
+ -0.66845703f, -0.31030273f, -0.21435547f, -0.11987305f, -0.103271484f, 0.080322266f, 0.21801758f, 0.20874023f, 0.1015625f, 0.032958984f, -0.043945312f, 0.078125f, 0.07324219f, 0.07763672f, 0.20727539f, 0.38208008f,
+ -0.17163086f, -0.1171875f, -0.03491211f, 0.060302734f, 0.1809082f, 0.33666992f, 0.3955078f, 0.27172852f, 0.12841797f, -0.036865234f, -0.17163086f, -0.21289062f, -0.20800781f, -0.17333984f, -0.125f, -0.12231445f,
+ -0.1875f, -0.3996582f, -0.017822266f, 0.10058594f, 0.057617188f, 0.028320312f, 0.05493164f, 0.04272461f, 0.041503906f, 0.046875f, 0.041748047f, 0.0546875f, 0.06201172f, 0.03149414f, 0.013427734f, 0.028564453f,
+ 0.34814453f, 0.234375f, -0.05493164f, -0.1821289f, -0.2878418f, -0.31176758f, -0.28100586f, -0.19824219f, -0.15673828f, -0.08251953f, 0.030273438f, 0.13647461f, 0.2211914f, 0.20776367f, 0.16455078f, 0.21240234f,
+ -0.057861328f, -0.10571289f, 0.08984375f, 0.30444336f, 0.18945312f, 0.14770508f, 0.09082031f, -0.020996094f, -0.053466797f, -0.044433594f, -0.07128906f, -0.08886719f, -0.079833984f, -0.0859375f, -0.09790039f, -0.1159668f,
+ 0.17626953f, 0.26049805f, 0.2175293f, 0.21020508f, 0.20141602f, 0.27734375f, 0.21606445f, -0.0012207031f, -0.010986328f, -0.11694336f, -0.2331543f, -0.15844727f, -0.08081055f, -0.08886719f, -0.35717773f, -0.5114746f,
+ -0.38134766f, -0.4855957f, -0.35986328f, -0.16137695f, -0.026123047f, 0.009033203f, -0.0126953125f, 0.040283203f, 0.095458984f, 0.15454102f, 0.16333008f, 0.19140625f, 0.21142578f, 0.203125f, 0.17993164f, 0.1784668f,
+ 0.05834961f, 0.06298828f, 0.041015625f, 0.031982422f, 0.07910156f, 0.06713867f, -0.028808594f, -0.05053711f, -0.024902344f, -0.17822266f, -0.3227539f, -0.1665039f, -0.0053710938f, 0.05517578f, 0.119384766f, 0.26123047f,
+ 0.047851562f, -0.042236328f, -0.24145508f, -0.038330078f, 0.052734375f, 0.068603516f, 0.05810547f, 0.011962891f, -0.013916016f, -0.010986328f, 0.020019531f, 0.02758789f, 0.03100586f, 0.02319336f, 0.014160156f, -0.008056641f,
+ -0.0036621094f, 0.0014648438f, 0.013671875f, 0.0f, 0.021240234f, 0.033447266f, 0.014892578f, 0.004638672f, 0.056884766f, 0.13427734f, 0.08691406f, -0.005126953f, -0.072753906f, -0.095214844f, -0.10961914f, -0.08105469f,
+ -0.15966797f, -0.110839844f, -0.13012695f, -0.071777344f, -0.064941406f, -0.056396484f, -0.046142578f, -0.012207031f, 0.048583984f, 0.036865234f, -0.00048828125f, -0.024414062f, -0.012939453f, 0.092041016f, 0.21435547f, 0.29858398f,
+ 0.55981445f, 0.15820312f, -0.012451172f, -0.04321289f, -0.05810547f, -0.014892578f, -0.021484375f, -0.038330078f, -0.033691406f, -0.037597656f, -0.0690918f, -0.076416016f, -0.0637207f, -0.064697266f, -0.0847168f, -0.099853516f,
+ -0.039794922f, -0.032714844f, -0.030273438f, -0.051513672f, -0.03564453f, -0.041015625f, -0.0390625f, 0.017822266f, 0.051513672f, 0.013916016f, -0.044677734f, -0.061035156f, -0.012207031f, 0.07299805f, 0.123291016f, 0.10888672f,
+ 0.45117188f, 0.46704102f, 0.38916016f, 0.23242188f, 0.16430664f, 0.1809082f, 0.20922852f, 0.033935547f, -0.13720703f, -0.2758789f, -0.39941406f, -0.3840332f, -0.31054688f, -0.28466797f, -0.28955078f, -0.04663086f,
+ -0.088134766f, -0.22973633f, -0.4194336f, -0.49487305f, -0.4038086f, -0.27734375f, -0.2253418f, -0.1315918f, -0.044677734f, 0.12036133f, 0.24951172f, 0.31103516f, 0.52124023f, 0.484375f, 0.32739258f, 0.30126953f,
+ 0.33203125f, 0.29614258f, 0.1796875f, 0.06689453f, 0.100097656f, 0.13867188f, 0.03491211f, -0.032714844f, -0.12060547f, -0.2097168f, -0.29638672f, -0.20898438f, -0.08227539f, -0.16821289f, -0.16015625f, 0.13134766f,
+ -0.44189453f, 0.017578125f, 0.07397461f, 0.033447266f, 0.044189453f, 0.04711914f, 0.030273438f, 0.040771484f, 0.041015625f, 0.022949219f, 0.004638672f, 0.018798828f, 0.028564453f, 0.018798828f, -0.00048828125f, 0.020751953f,
+ -0.36621094f, -0.23388672f, -0.08178711f, -0.015136719f, -0.049072266f, 0.07910156f, 0.23120117f, 0.28320312f, 0.38378906f, 0.29223633f, 0.099365234f, -0.0087890625f, -0.09814453f, -0.16455078f, -0.18945312f, -0.16186523f,
+ -0.17041016f, -0.18359375f, -0.19018555f, -0.15820312f, -0.20239258f, -0.21875f, -0.13110352f, 0.010009766f, 0.12011719f, 0.25097656f, 0.25024414f, 0.2055664f, 0.14526367f, 0.13964844f, 0.103759766f, 0.029052734f,
+ 0.06982422f, 0.072265625f, 0.18261719f, 0.025390625f, -0.2475586f, -0.2861328f, -0.111572266f, -0.037109375f, 0.0036621094f, 0.031982422f, 0.043945312f, 0.057373047f, 0.078125f, 0.072021484f, 0.028564453f, 0.016357422f,
+ 0.07836914f, 0.13549805f, 0.1743164f, 0.15478516f, 0.12573242f, -0.009521484f, -0.1508789f, -0.1965332f, -0.19604492f, -0.103027344f, -0.045898438f, -0.026123047f, 0.020263672f, 0.023925781f, 0.013183594f, 0.0014648438f,
+ 0.25341797f, 0.22558594f, 0.2241211f, 0.17114258f, 0.18164062f, 0.16894531f, 0.16503906f, 0.20239258f, 0.17041016f, 0.025878906f, -0.16625977f, -0.24121094f, -0.31982422f, -0.4008789f, -0.38256836f, -0.27783203f,
+};
+
+const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = {
+ -0.13989258f, -0.024658203f, 0.12670898f, 0.027832031f, 0.06689453f, 0.12817383f, 0.07495117f, -0.01977539f, -0.05834961f, -0.07543945f, -0.06542969f, -0.0546875f, -0.04345703f, -0.0063476562f, 0.034179688f, 0.029541016f,
+ -0.06713867f, -0.11450195f, -0.09790039f, -0.091308594f, -0.12182617f, -0.010009766f, 0.10986328f, 0.115478516f, 0.060058594f, 0.038085938f, 0.020507812f, 0.017333984f, 0.024169922f, 0.028320312f, 0.038330078f, 0.05053711f,
+ 0.05517578f, 0.030517578f, 0.0390625f, 0.05810547f, 0.021484375f, 0.032470703f, 0.040039062f, -0.0087890625f, -0.055908203f, -0.023925781f, 0.037109375f, 0.06347656f, 0.02709961f, -0.07373047f, -0.1274414f, -0.115234375f,
+ 0.11206055f, 0.2006836f, 0.045410156f, -0.10839844f, -0.1418457f, -0.08520508f, -0.032470703f, 0.033935547f, 0.044189453f, 0.006591797f, -0.012451172f, -0.018554688f, -0.013427734f, -0.010498047f, -0.0078125f, -0.012207031f,
+ -0.041748047f, -0.07373047f, -0.14819336f, 0.021240234f, 0.16015625f, 0.119140625f, 0.055908203f, 0.08081055f, 0.12548828f, 0.05419922f, -0.030761719f, -0.040771484f, -0.060302734f, -0.07128906f, -0.07763672f, -0.072509766f,
+ -0.07446289f, -0.041259766f, -0.040527344f, -0.068603516f, -0.042236328f, -0.03857422f, -0.05126953f, -0.08886719f, -0.055419922f, 0.036865234f, 0.09033203f, 0.06689453f, 0.08911133f, 0.13110352f, 0.08129883f, 0.0053710938f,
+ -0.052978516f, 0.033691406f, 0.16015625f, 0.171875f, 0.024658203f, -0.1328125f, -0.1394043f, -0.041992188f, 0.0068359375f, 0.020263672f, 0.008544922f, 0.0014648438f, -0.011474609f, -0.030273438f, -0.022460938f, 0.00390625f,
+ 0.20898438f, -0.011230469f, -0.08496094f, -0.010986328f, 0.032958984f, -0.013183594f, -0.057861328f, -0.07104492f, -0.06689453f, -0.056396484f, -0.047851562f, -0.03491211f, -0.011962891f, 0.032714844f, 0.08178711f, 0.11035156f,
+};
+
+const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 };
+
+const int16_t sns_1st_cdbk[2][2][8 * 32] = {
+ { /* split 1 */
+ { /* TCX 20 */
+ -10900, -11064, -10637, -10471, -9051, -6381, -4688, -2438,
+ -2119, -5087, -6702, -8118, -7586, -6343, -4828, -3406,
+ 2004, -3443, -4289, -3757, -3234, -2952, -2313, -1781,
+ 1749, 5598, 3916, 732, -1472, -2964, -3275, -2332,
+ -11978, -14369, -5600, -545, 981, -929, -57, 1903,
+ 1745, 391, 202, 115, 256, -291, -862, -1637,
+ -4052, 2059, 4709, 6768, 5595, 1975, -1723, -1218,
+ 2093, 7263, 8679, 7576, 3701, -2438, -4389, -2686,
+ -7120, -6279, -5715, -5520, -4752, -3125, -1856, -438,
+ 8131, -2543, -6285, -6723, -5588, -4321, -3264, -2164,
+ -653, -1301, -660, 608, 1598, 1805, 1698, 760,
+ 4882, 9309, 6333, 1734, 284, 364, 560, 1015,
+ -7686, -5737, -3443, -1642, 245, 1531, 1827, 1769,
+ -1468, 3782, 144, -5130, -6883, -5165, -1497, 2072,
+ -12937, -8429, -2619, 2894, 5004, 4710, 4627, 3740,
+ 3198, 3928, 4358, 4554, 3887, 2844, 1299, 129,
+ -13828, -12296, -9364, -7918, -5571, -1909, 307, 2047,
+ -4314, -1211, -559, -1061, -1928, -2228, -2359, -1902,
+ -309, -3224, -3404, -1895, -743, -59, 757, 908,
+ 10914, 5865, 1599, -386, -1392, -2285, -2236, -2042,
+ -11825, -16241, -11402, -3627, 6556, 8953, 6421, 1546,
+ 6102, 777, -301, 536, 902, 541, 210, -429,
+ -3052, 3997, 5389, 1842, -344, 1556, 2667, 2428,
+ 11788, 10894, 7448, 5423, 2372, -677, -2385, -3839,
+ -45, -7602, -8923, -7179, -3273, 65, 4500, 6726,
+ 5895, 626, -1610, -2598, -3240, -3540, -2930, -2156,
+ -971, 461, 1494, 4907, 5859, 5199, 3678, 2502,
+ 10766, 5297, 1844, 1236, 2498, 3503, 2846, 838,
+ -7816, -1212, 891, 2387, 1317, 2225, 1859, 1602,
+ 2376, 5357, 2088, -2719, -3419, -420, 2431, 2943,
+ -8383, -795, 4351, 7026, 7460, 7191, 5262, 3796,
+ 1522, 6283, 8714, 8222, 7434, 5768, 3586, 1499,
+ },
+ { /* TCX 10 */
+ -15596, -16321, -10264, -1002, 5955, 5543, -29, -1688,
+ 17, -3794, -6207, -7356, -6998, -6081, -4453, -2448,
+ -12543, -11530, -10186, -8817, -7083, -4440, -1946, 892,
+ 5198, 2751, -274, -2574, -4561, -6087, -5944, -4600,
+ -683, -2640, -2753, -1195, -239, -217, -286, 90,
+ -1400, -1146, -1853, -2845, -3456, -3788, -3171, -1969,
+ -1835, 392, 1725, 1209, -392, -1640, -2001, -1608,
+ 5770, 7707, 5210, 2112, -382, -2088, -2634, -3007,
+ -10766, -8101, -5137, -3754, -1881, 331, 2339, 3679,
+ -2637, -4640, -5811, -5651, -3790, -1359, 913, 1893,
+ -7793, -4768, -1762, -545, -717, -837, -441, -75,
+ 4030, 1770, 467, 379, 10, -1330, -2398, -2290,
+ -9395, -6952, -2494, 2022, 4753, 5614, 4443, 2642,
+ -1486, 1748, 859, -2586, -3368, -638, 2761, 3269,
+ -2408, 306, 3633, 6567, 5950, 2474, -621, -1421,
+ 5478, 7986, 9498, 8165, 5477, 1244, -523, -1586,
+ -13564, -14673, -10597, -5504, 1575, 8248, 7662, 4025,
+ 4978, -682, -3586, -4305, -3703, -3001, -2227, -1278,
+ -8002, -6831, -5558, -4868, -4243, -3393, -2486, -1110,
+ 11485, 5472, 1645, -533, -1792, -2814, -3169, -2706,
+ 1617, 421, 232, 1382, 2162, 2017, 1318, 744,
+ 3677, 5212, 1990, -1514, -2894, -2441, -451, 592,
+ 731, 4295, 5860, 3756, 1991, 1437, 869, 127,
+ 12736, 11722, 7768, 4682, 1574, -744, -1989, -3131,
+ -3490, -4269, -3681, -1531, 1111, 3327, 4138, 3815,
+ 7344, 1400, -1302, -1502, -1015, 57, 1212, 1498,
+ -4836, -1881, 1071, 2055, 2114, 2465, 2093, 1458,
+ 8569, 5879, 3654, 2879, 2530, 1703, 781, -233,
+ -3709, -990, 2338, 6227, 7083, 7102, 5657, 3401,
+ 3389, 6392, 5267, 1011, 275, 3519, 5236, 4339,
+ 599, 3752, 6943, 9211, 8152, 5568, 3337, 1838,
+ 9885, 9591, 7905, 8068, 7929, 7421, 4234, 757,
+ }
+ },
+ { /* split 2 */
+ { /* TCX 20 */
+ -178, -3476, -5982, -7081, -7548, -7440, -6859, -5798,
+ -3596, -3670, -1501, 770, 812, -286, -2001, -3377,
+ -3998, -5191, -4988, -4421, -3889, -3571, -2738, -1969,
+ -2981, -2687, -1501, -83, 1136, 2377, 3248, 4105,
+ 1842, -41, -1972, -4282, -6779, -8405, -8674, -7835,
+ -259, 571, 2124, 3344, 2959, 1407, -750, -2523,
+ -524, -1956, -2855, -3202, -3939, -4666, -4907, -4782,
+ -5110, -4768, -3017, -663, 4188, 9210, 16602, 21081,
+ 4373, 4846, -603, -6495, -7289, -5540, -4749, -5527,
+ -1448, -1043, -619, -105, 356, 362, 542, 857,
+ 1373, -752, -5334, -6244, -3001, -932, -1040, -3125,
+ -2403, -1397, 612, 2449, 3920, 5231, 6819, 8581,
+ 2183, 1211, -111, -1084, -2836, -4977, -6701, -7284,
+ -751, 1255, 3408, 6474, 7503, 7026, 5413, 4464,
+ 935, 850, 589, 353, 160, -434, -939, -931,
+ 268, 2284, 3884, 5423, 6680, 7996, 9244, 9472,
+ 1075, 113, -1289, -4457, -7512, -5930, -1799, -571,
+ -3689, -4254, -3755, -2995, -1581, -135, 1049, 1589,
+ -1166, -1752, -1790, -1897, -1927, -1831, -1359, -805,
+ -1494, -735, 635, 1993, 2909, 3546, 4226, 4956,
+ 4435, 4299, 4269, 1328, -3731, -7621, -9319, -9170,
+ 1358, 2227, 3873, 4469, 4692, 4057, 2601, 1608,
+ 813, 398, -499, -666, -1286, -2271, -3316, -4025,
+ -3300, -1255, 2181, 6431, 10002, 12760, 13549, 12584,
+ 3714, 4180, 484, -2905, -2864, -1359, -1256, -2477,
+ 308, 868, 1373, 1629, 1793, 1834, 1814, 1746,
+ 1472, 798, -282, -1935, -1818, 320, 2221, 2914,
+ 2281, 3240, 2988, 1400, 2383, 4072, 5667, 6675,
+ 2672, 2678, 2874, 2096, -226, -2301, -3861, -4534,
+ 4988, 7231, 7641, 7731, 7061, 6447, 5411, 3513,
+ 3978, 4156, 4126, 2896, 1469, 759, 368, -68,
+ -264, 4210, 8534, 11008, 11606, 11888, 11072, 8949,
+ },
+ { /* TCX 10 */
+ -2852, -6158, -7231, -7830, -8012, -7922, -7556, -6706,
+ -3911, -5340, -5053, -4741, -4805, -4484, -3727, -3037,
+ -966, -1461, -1694, -2427, -3081, -3037, -2547, -2230,
+ -3455, -3315, -2451, -836, 1383, 3196, 3720, 3379,
+ 3052, 281, -3351, -6866, -9051, -9586, -8983, -8236,
+ -748, -4465, -4314, -2251, 29, -40, -3963, -6195,
+ 200, 1293, 2535, 2803, 1603, -186, -1397, -1697,
+ -1707, -265, 2196, 5295, 5894, 4216, 3440, 3826,
+ -237, -2133, -2279, -3149, -4377, -5638, -6520, -6764,
+ -2407, -2049, -1246, -664, -521, -430, -349, -211,
+ 3874, 1335, -1501, -2055, -1268, -990, -1852, -2871,
+ -1883, -1845, -1681, -484, 384, 2035, 5839, 9597,
+ 275, 380, 1048, 424, -1146, -3012, -4431, -5104,
+ -1699, -484, 756, 1261, 1279, 1377, 1975, 2590,
+ 2139, 4502, 3645, 4975, 6491, 5972, 5012, 4346,
+ -3821, -2581, -433, 2667, 6436, 10038, 11311, 8783,
+ 2359, -2689, -6604, -7039, -5992, -4268, -3711, -4840,
+ -2776, -4251, -4539, -3672, -2494, -1055, 280, 695,
+ 491, 866, 822, -44, -1009, -1165, -831, -538,
+ -1024, 91, 786, 1295, 2433, 3910, 4975, 5403,
+ 3117, 2590, 2337, -667, -4580, -8147, -9400, -9523,
+ -103, -630, -831, 669, 3062, 3398, 549, -1690,
+ 2113, 3467, 4279, 5047, 5344, 3361, 127, -2313,
+ -1199, 1153, 2914, 3688, 4260, 5421, 7471, 8831,
+ 2815, 2184, 316, -3058, -5596, -5564, -4343, -3793,
+ 922, 126, -1414, -1731, -1007, 359, 2029, 3088,
+ 4889, 4619, 2537, 1114, 950, 946, 799, 419,
+ -4271, -3750, -3359, -484, 1448, 4106, 10487, 20479,
+ 3818, 4687, 4064, 2212, -172, -2287, -3535, -4041,
+ 884, 2456, 3394, 2925, 2182, 2323, 2583, 2507,
+ 4767, 8057, 8263, 6461, 5003, 4055, 2923, 1845,
+ 19, 3813, 6926, 8432, 10141, 10850, 9692, 8383,
+ }
+ }
+};
+const int16_t sns_1st_means_16k[2][16] = {
+ { /* TCX 20 */
+ 14210, 19017, 14362, 9309, 5385, 2674, 1055, -211, -1407, -3059, -4393, -8597, -11180, -11756, -12131, -13281,
+ },
+ { /* TCX 10*/
+ 12018, 15915, 11089, 6015, 847, -705, -539, -1548, -893, -2163, -1806, -4189, -7017, -8670, -8874, -9480,
+ }
+};
+const int16_t sns_1st_means_25k6[2][16] = {
+ { /* TCX 20 */
+ 14973, 20323, 16461, 9554, 4017, 3103, 1602, 1694, -221, -1401, -6817, -10071, -11503, -11805, -13158, -16749,
+ },
+ { /* TCX 10 */
+ 15560, 19489, 14623, 5595, 2084, 1699, 775, -1312, -2195, -6101, -9078, -9465, -7825, -6603, -7281, -9960,
+ }
+};
+const int16_t sns_1st_means_32k[2][16] = {
+ { /* TCX 20 */
+ 15041, 20603, 16969, 10289, 4973, 4283, 3003, 3316, 1684, -259, -6614, -9535, -10363, -11834, -16625, -24930,
+ },
+ { /* TCX 10 */
+ 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277,
+ }
+};
+
+ACPL_QUANT_TABLE alpha_quant_table[] =
+{
+ { /* Alfa Fine */
+ 33, /* nquant */
+ 16, /* offset */
+ { -2.000000e+000f, -1.809375e+000f, -1.637500e+000f, -1.484375e+000f, -1.350000e+000f, -1.234375e+000f, -1.137500e+000f, -1.059375e+000f, -1.000000e+000f, -9.406250e-001f,
+ -8.625000e-001f, -7.656250e-001f, -6.500000e-001f, -5.156250e-001f, -3.625000e-001f, -1.906250e-001f, +0.000000e+000f, +1.906250e-001f, +3.625000e-001f, +5.156250e-001f,
+ +6.500000e-001f, +7.656250e-001f, +8.625000e-001f, +9.406250e-001f, +1.000000e+000f, +1.059375e+000f, +1.137500e+000f, +1.234375e+000f, +1.350000e+000f, +1.484375e+000f,
+ +1.637500e+000f, +1.809375e+000f, +2.000000e+000f } /* data */
+ }, /* End Alfa Fine */
+ { /* Alfa Coarse */
+ 17, /* nquant */
+ 8, /* offset */
+ { -2.000000e+000f, -1.637500e+000f, -1.350000e+000f, -1.137500e+000f, -1.000000e+000f, -8.625000e-001f, -6.500000e-001f, -3.625000e-001f, +0.000000e+000f, +3.625000e-001f,
+ +6.500000e-001f, +8.625000e-001f, +1.000000e+000f, +1.137500e+000f, +1.350000e+000f, +1.637500e+000f, +2.000000e+000f } /* data */
+ } /* End Alfa Coarse */
+};
+
+ACPL_QUANT_TABLE beta_quant_table[2][9] =
+{
+ {
+ { /* Beta Fine #1 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +2.375000e-001f, +5.500000e-001f, +9.375000e-001f, +1.400000e+000f, +1.937500e+000f, +2.550000e+000f, +3.237500e+000f, +4.000000e+000f } /* data */
+ }, /* End Beta Fine #1 */
+ { /* Beta Fine #2 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +2.035449e-001f, +4.713672e-001f, +8.034668e-001f, +1.199844e+000f, +1.660498e+000f, +2.185430e+000f, +2.774639e+000f, +3.428125e+000f } /* data */
+ }, /* End Beta Fine #2 */
+ { /* Beta Fine #3 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.729297e-001f, +4.004688e-001f, +6.826172e-001f, +1.019375e+000f, +1.410742e+000f, +1.856719e+000f, +2.357305e+000f, +2.912500e+000f } /* data */
+ }, /* End Beta Fine #3 */
+ { /* Beta Fine #4 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.456543e-001f, +3.373047e-001f, +5.749512e-001f, +8.585938e-001f, +1.188232e+000f, +1.563867e+000f, +1.985498e+000f, +2.453125e+000f } /* data */
+ }, /* End Beta Fine #4 */
+ { /* Beta Fine #5 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.217188e-001f, +2.818750e-001f, +4.804688e-001f, +7.175000e-001f, +9.929688e-001f, +1.306875e+000f, +1.659219e+000f, +2.050000e+000f } /* data */
+ }, /* End Beta Fine #5 */
+ { /* Beta Fine #6 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.011230e-001f, +2.341797e-001f, +3.991699e-001f, +5.960938e-001f, +8.249512e-001f, +1.085742e+000f, +1.378467e+000f, +1.703125e+000f } /* data */
+ }, /* End Beta Fine #6 */
+ { /* Beta Fine #7 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +8.386719e-002f, +1.942188e-001f, +3.310547e-001f, +4.943750e-001f, +6.841797e-001f, +9.004688e-001f, +1.143242e+000f, +1.412500e+000f } /* data */
+ }, /* End Beta Fine #7 */
+ { /* Beta Fine #8 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +6.995117e-002f, +1.619922e-001f, +2.761230e-001f, +4.123438e-001f, +5.706543e-001f, +7.510547e-001f, +9.535449e-001f, +1.178125e+000f } /* data */
+ }, /* End Beta Fine #8 */
+ { /* Beta Fine #9 */
+ 9, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */
+ } /* End Beta Fine #9 */
+ },
+ {
+ { /* Beta Coarse #1 */
+ 5, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +5.500000e-001f, +1.400000e+000f, +2.550000e+000f, +4.000000e+000f } /* data */
+ }, /* End Beta Coarse #1 */
+ { /* Beta Coarse #2 */
+ 5, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +4.004688e-001f, +1.019375e+000f, +1.856719e+000f, +2.912500e+000f } /* data */
+ }, /* End Beta Coarse #2 */
+ { /* Beta Coarse #3 */
+ 5, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +2.818750e-001f, +7.175000e-001f, +1.306875e+000f, +2.050000e+000f } /* data */
+ }, /* End Beta Coarse #3 */
+ { /* Beta Coarse #4 */
+ 5, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.942188e-001f, +4.943750e-001f, +9.004688e-001f, +1.412500e+000f } /* data */
+ }, /* End Beta Coarse #4 */
+ { /* Beta Coarse #5 */
+ 5, /* nquant */
+ 0, /* offset */
+ { +0.000000e+000f, +1.375000e-001f, +3.500000e-001f, +6.375000e-001f, +1.000000e+000f } /* data */
+ } /* End Beta Coarse #5 */
+ }
+};
/* clang-format on */
diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h
index a095c9e4b48846d125154bbd3d6cba22e7a49549..a6437565c995239d1d71d7fcb6b76dcbfe0e1398 100644
--- a/lib_com/ivas_rom_com.h
+++ b/lib_com/ivas_rom_com.h
@@ -108,26 +108,22 @@ extern const float tdm_ratio_tabl[];
extern const float tdm_den_ratio_tabl[];
extern const int16_t tdm_bit_allc_tbl[5][6];
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/* LSFs Intra-frame prediction tables */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
extern const float tdm_LSF_MEAN_RE_USE_OUT[M];
extern const float tdm_LSF_MEAN_RE_USE_IN[M];
extern const float tdm_LSF_MEAN_RE_USE[M];
-extern const float tdm_Beta_Q1bit_re_use_132[2];
-extern const float tdm_Beta_Q1bit_re_use_164[2];
-extern const float tdm_Beta_Q1bit_re_use_244_320[2];
-extern const float tdm_Beta_Q1bit_re_use_480[2];
+extern const float tdm_Beta_Q1bit_re_use_13k2[2];
+extern const float tdm_Beta_Q1bit_re_use_16k4[2];
+extern const float tdm_Beta_Q1bit_re_use_24k4_32k[2];
+extern const float tdm_Beta_Q1bit_re_use_48k[2];
extern const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15];
-#endif
extern const float tdm_LSF_MEAN_PRED_QNT_OUT[M];
extern const float tdm_LSF_MEAN_PRED_QNT_IN[M];
extern const float tdm_LSF_MEAN_PRED_QNT[M];
extern const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15];
-#endif
extern const int16_t fast_FCB_bits_2sfr[];
extern const int16_t fast_FCB_rates_2sfr[];
@@ -165,6 +161,13 @@ extern const int16_t DirAC_band_grouping_5[5 + 1];
extern const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1];
extern const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1];
+extern const float c_weights[DIRAC_NO_FB_BANDS_MAX];
+
+extern const float w_nm[NUM_ANA_SECTORS][9];
+extern const float x_nm[NUM_ANA_SECTORS][9];
+extern const float y_nm[NUM_ANA_SECTORS][9];
+extern const float z_nm[NUM_ANA_SECTORS][9];
+
/*------------------------------------------------------------------------------------------*
* SPAR ROM tables
*------------------------------------------------------------------------------------------*/
@@ -176,9 +179,11 @@ extern const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_
extern const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS];
extern const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS];
extern const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN];
-extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH];
+extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS];
extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS];
-extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH];
+extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN];
+extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH];
+extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH];
extern const float dtx_pd_real_min_max[2];
extern const int16_t dtx_pd_real_q_levels[3][3];
@@ -293,6 +298,11 @@ extern const uint8_t masa_joined_nbands[];
extern const uint8_t masa_twodir_bands[];
extern const uint8_t masa_twodir_bands_joined[];
+#ifdef HR_METADATA
+extern const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS];
+extern const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1];
+#endif
+
/* Multi-channel input and output setups */
extern const float ls_azimuth_CICP2[2];
extern const float ls_elevation_CICP2[2];
@@ -318,7 +328,6 @@ extern const float McMASA_LFEGain_vectors[64];
extern const float ism_azimuth_borders[4];
extern const float ism_elevation_borders[4];
-
/*----------------------------------------------------------------------------------*
* Param ISM ROM tables
*----------------------------------------------------------------------------------*/
@@ -364,6 +373,7 @@ extern const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1];
extern const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1];
extern const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1];
+extern const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1];
extern const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1];
extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1];
extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1];
@@ -400,5 +410,33 @@ extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1];
extern const int16_t ivas_num_active_bands[FB - WB + 1];
+/*------------------------------------------------------------------------------------------*
+ * SNS MSVQ codebooks and means
+ *------------------------------------------------------------------------------------------*/
+extern const int16_t ivas_sns_cdbks_tcx20_levels[];
+extern const int16_t ivas_sns_cdbks_tcx20_bits[];
+
+extern const int16_t ivas_sns_cdbks_tcx10_levels[];
+extern const int16_t ivas_sns_cdbks_tcx10_bits[];
+
+extern const float *const ivas_sns_cdbks_tcx20[];
+extern const float *const ivas_sns_cdbks_tcx10[];
+
+extern const int16_t ivas_sns_cdbks_side_tcx20_levels[];
+extern const int16_t ivas_sns_cdbks_side_tcx20_bits[];
+extern const int16_t ivas_sns_cdbks_side_tcx10_levels[];
+extern const int16_t ivas_sns_cdbks_side_tcx10_bits[];
+
+extern const float *const ivas_sns_cdbks_side_tcx20[];
+extern const float *const ivas_sns_cdbks_side_tcx10[];
+
+extern ACPL_QUANT_TABLE alpha_quant_table[];
+extern ACPL_QUANT_TABLE beta_quant_table[2][9];
+
+/* means and codebooks for the split VQ in the 2-stage SNS VQ */
+extern const int16_t sns_1st_cdbk[2][2][8 * 32];
+extern const int16_t sns_1st_means_16k[2][16];
+extern const int16_t sns_1st_means_25k6[2][16];
+extern const int16_t sns_1st_means_32k[2][16];
/* IVAS_ROM_COM_H */
#endif
diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c
index 44131d5bd237793d65aa0c9124e3c777ac6c9625..450ebef7910ffd1a04e5a0b3760a19950d899e6f 100644
--- a/lib_com/ivas_sba_config.c
+++ b/lib_com/ivas_sba_config.c
@@ -47,6 +47,7 @@
#include "wmc_auto.h"
+#ifndef SBA_MODE_CLEAN_UP
/*-------------------------------------------------------------------*
* ivas_sba_mode_select()
*
@@ -54,23 +55,11 @@
*-------------------------------------------------------------------*/
/*! r: SBA format mode */
-SBA_MODE ivas_sba_mode_select(
- const int32_t ivas_total_brate /* i : IVAS total bitrate */
-)
+SBA_MODE ivas_sba_mode_select()
{
- SBA_MODE sba_mode;
-
- if ( ivas_total_brate == IVAS_13k2 || ivas_total_brate == IVAS_16k4 )
- {
- sba_mode = SBA_MODE_DIRAC;
- }
- else
- {
- sba_mode = SBA_MODE_SPAR;
- }
-
- return sba_mode;
+ return SBA_MODE_SPAR;
}
+#endif
/*-------------------------------------------------------------------*
* ivas_sba_config()
*
@@ -235,7 +224,8 @@ int16_t ivas_sba_get_nchan(
/*! r: number of ambisonics metadata channels */
int16_t ivas_sba_get_nchan_metadata(
const int16_t sba_order /* i : Ambisonic (SBA) order */
-)
+ ,
+ const int32_t ivas_total_brate )
{
int16_t nb_channels;
@@ -245,8 +235,17 @@ int16_t ivas_sba_get_nchan_metadata(
}
else
{
- /* FOA + planar HOA */
- nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 );
+ if ( ivas_total_brate >= IVAS_512k )
+ {
+ nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 );
+ nb_channels += 2;
+ nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) );
+ }
+ else
+ {
+ /* FOA + planar HOA */
+ nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 );
+ }
}
return ( nb_channels );
@@ -259,25 +258,58 @@ int16_t ivas_sba_get_nchan_metadata(
*-------------------------------------------------------------------*/
/*! r: flag indicating to code SPAR HOA MD for all bands */
-int16_t ivas_sba_get_spar_hoa_md_flag(
- const int16_t sba_order, /* i : Ambisonic (SBA) order */
- const int32_t ivas_total_brate /* i : IVAS total bitrate */
-)
+void ivas_sba_get_spar_hoa_ch_ind(
+ const int16_t num_md_chs, /* i : number of MD channels */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] )
{
- int16_t spar_hoa_md_flag = 0;
+ int16_t ch;
+ const int16_t *hoa_ind;
+
+ if ( ivas_total_brate >= IVAS_512k )
+ {
+ hoa_ind = HOA_keep_ind_spar512;
+ }
+ else
+ {
+ hoa_ind = HOA_keep_ind_spar;
+ }
+ for ( ch = 0; ch < num_md_chs; ch++ )
+ {
+ HOA_md_ind[ch] = hoa_ind[ch];
+ }
+
+ return;
+}
+void ivas_sba_get_spar_hoa_md_flag(
+ const int16_t sba_order, /* i : Ambisonic (SBA) order */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ int16_t *spar_hoa_md_flag,
+ int16_t *spar_hoa_dirac2spar_md_flag )
+{
if ( sba_order > 1 && ivas_total_brate >= IVAS_256k )
{
- spar_hoa_md_flag = 1;
+ *spar_hoa_md_flag = 1;
}
else
{
- spar_hoa_md_flag = 0;
+ *spar_hoa_md_flag = 0;
}
- return spar_hoa_md_flag;
+ if ( sba_order > 1 && ivas_total_brate >= IVAS_512k )
+ {
+ *spar_hoa_dirac2spar_md_flag = 0;
+ }
+ else
+ {
+ *spar_hoa_dirac2spar_md_flag = 1;
+ }
+
+ return;
}
+
/*-------------------------------------------------------------------*
* ivas_sba_zero_vert_comp()
*
diff --git a/lib_com/ivas_sns_com.c b/lib_com/ivas_sns_com.c
index e4515a98547ce096ec8f1ebcbb46b2a1ce0a0f7d..da7b37e8c55f2ecfecc5f0439968cf315b39772e 100644
--- a/lib_com/ivas_sns_com.c
+++ b/lib_com/ivas_sns_com.c
@@ -36,6 +36,7 @@
#include "prot.h"
#include "ivas_prot.h"
#include "rom_com.h"
+#include "ivas_rom_com.h"
#include
#include
#ifdef DEBUGGING
@@ -118,30 +119,20 @@ void sns_compute_scf(
xs[FDNS_NPTS - 1] = 0.75f * x[FDNS_NPTS - 1] + 0.25f * x[FDNS_NPTS - 2];
/* Pre-emphasis */
- if ( L_frame == L_FRAME16k )
+ switch ( L_frame )
{
- tilt = 18.f;
- }
- else if ( L_frame == L_SPEC16k_EXT )
- {
- tilt = 20.f;
- }
- else if ( L_frame == L_FRAME25_6k )
- {
- tilt = 22.f;
- }
- else if ( L_frame == L_FRAME32k )
- {
- tilt = 26.f;
- }
- else if ( L_frame == L_SPEC32k_EXT )
- {
- tilt = 30.f;
- }
- else
- {
- tilt = 0.f;
- assert( 0 && "illegal frame length in sns_compute_scf" );
+ case L_FRAME16k:
+ tilt = 19.f;
+ break;
+ case L_FRAME25_6k:
+ tilt = 22.f;
+ break;
+ case L_FRAME32k:
+ tilt = 23.5f;
+ break;
+ default:
+ tilt = 0.f;
+ assert( !"illegal frame length in sns_compute_scf" );
}
for ( i = 0; i < FDNS_NPTS; i++ )
diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c
index cb6ff23fc011ccfe3ca4364a1b38bb2a4143f6e0..8e7da38580ae116e99a3ea224d1251533d0b6e49 100644
--- a/lib_com/ivas_spar_com.c
+++ b/lib_com/ivas_spar_com.c
@@ -61,6 +61,7 @@
#define IVAS_ACTIVEW_DM_F ( 1.0f )
#define IVAS_ACTIVEW_DM_F_DTX ( 0.25f )
+#define IVAS_ACTIVEW_DM_F_VLBR ( 0.25f )
#define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH ( 3.0f )
#define IVAS_P_NORM_SCALING ( 1.0f )
@@ -76,11 +77,11 @@
*------------------------------------------------------------------------------------------*/
-static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t dtx_vad, const int16_t from_dirac );
+static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t active_w_vlbr, const int16_t dtx_vad, const int16_t from_dirac );
static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band );
-static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, float *pWscale );
+static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, const int16_t active_w_vlbr, float *pWscale );
static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t num_dmx, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] );
@@ -338,8 +339,7 @@ void ivas_spar_config(
{
ivas_total_brate = IVAS_32k;
}
-
- assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 );
+ assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 );
if ( ivas_total_brate == IVAS_32k )
{
*core_nominal_brate = ACELP_24k40;
@@ -348,6 +348,14 @@ void ivas_spar_config(
{
*core_nominal_brate = ACELP_16k40;
}
+ else if ( ivas_total_brate == IVAS_16k4 )
+ {
+ *core_nominal_brate = ACELP_13k20;
+ }
+ else if ( ivas_total_brate == IVAS_13k2 )
+ {
+ *core_nominal_brate = ACELP_9k60;
+ }
}
return;
@@ -360,7 +368,7 @@ void ivas_spar_config(
* Get SPAR table index
*-----------------------------------------------------------------------------------------*/
-/* !r: config. table index */
+/*! r: config. table index */
int16_t ivas_get_spar_table_idx(
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
const int16_t sba_order, /* i : Ambisonic (SBA) order */
@@ -427,10 +435,12 @@ int16_t ivas_get_sba_num_TCs(
{
nchan_transport = 1;
}
- else if ( ivas_sba_mode_select( ivas_total_brate ) == SBA_MODE_DIRAC )
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( ivas_sba_mode_select() == SBA_MODE_DIRAC )
{
nchan_transport = 1;
}
+#endif
else
{
table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
@@ -456,6 +466,7 @@ static void ivas_get_pred_coeffs(
const int16_t start_band,
const int16_t end_band,
const int16_t active_w,
+ const int16_t active_w_vlbr,
const int16_t dtx_vad,
const int16_t from_dirac )
{
@@ -546,7 +557,7 @@ static void ivas_get_pred_coeffs(
}
else
{
- dm_f_local = IVAS_ACTIVEW_DM_F;
+ dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR : IVAS_ACTIVEW_DM_F;
}
for ( b = start_band; b < end_band; b++ )
@@ -645,6 +656,7 @@ static void ivas_get_Wscaling_factor(
const int16_t *pNum_dmx,
const int16_t bands_bw,
const int16_t active_w,
+ const int16_t active_w_vlbr,
float *pWscale )
{
int16_t b, ch;
@@ -657,7 +669,7 @@ static void ivas_get_Wscaling_factor(
}
else
{
- dm_f_local = IVAS_ACTIVEW_DM_F_SCALE;
+ dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE;
}
for ( b = start_band; b < end_band; b++ )
@@ -1538,6 +1550,7 @@ void ivas_compute_spar_params(
const int16_t num_ch,
const int16_t bands_bw,
const int16_t active_w,
+ const int16_t active_w_vlbr,
ivas_spar_md_com_cfg *hSparCfg,
ivas_spar_md_t *hSparMd,
float *pWscale,
@@ -1546,7 +1559,9 @@ void ivas_compute_spar_params(
float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
int16_t b, i, ndm;
- ivas_get_pred_coeffs( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, dtx_vad, from_dirac );
+ ivas_get_pred_coeffs( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w,
+ active_w_vlbr,
+ dtx_vad, from_dirac );
#ifdef SPAR_HOA_DBG
/*fprintf(stderr, "\n\n Prediction Coefficients:\n");
@@ -1578,7 +1593,9 @@ void ivas_compute_spar_params(
#endif
ivas_get_Wscaling_factor( cov_real, pred_coeffs_re, mixer_mat, start_band, end_band, dtx_vad, num_ch,
- hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, pWscale );
+ hSparCfg->num_dmx_chans_per_band, bands_bw, active_w,
+ active_w_vlbr,
+ pWscale );
for ( b = start_band; b < end_band; b++ )
{
@@ -1648,7 +1665,9 @@ void ivas_get_spar_md_from_dirac(
const int16_t end_band,
const int16_t order,
const int16_t dtx_vad,
- float Wscale_d[IVAS_MAX_NUM_BANDS] )
+ float Wscale_d[IVAS_MAX_NUM_BANDS],
+ const uint8_t useLowerRes,
+ const int16_t active_w_vlbr )
{
int16_t num_ch, band, i, j;
int16_t block, ch;
@@ -1662,14 +1681,21 @@ void ivas_get_spar_md_from_dirac(
float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH];
float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH];
float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3;
+
int16_t ndm, foa_ch, hoa2_ch;
float P_dir_fact[IVAS_SPAR_MAX_CH - 1];
const int16_t *remix_order;
remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order];
- num_ch = ivas_sba_get_nchan_metadata( order );
- hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER );
+ num_ch = ivas_sba_get_nchan_metadata( order,
+ IVAS_256k /*dummy value as order is always 1 in this function*/
+ );
+
+ hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER,
+ IVAS_256k /*dummy value as order is always 1 in this function*/
+ );
+
foa_ch = FOA_CHANNELS;
diff_norm_order1 = 3.0f;
diff_norm_order2 = 5.0f;
@@ -1684,7 +1710,7 @@ void ivas_get_spar_md_from_dirac(
ppMixer_mat[i] = pMixer_mat[i];
}
- if ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) )
+ if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) )
{
float P_norm[3];
int16_t idx;
@@ -1739,10 +1765,15 @@ void ivas_get_spar_md_from_dirac(
/*SPAR from DirAC*/
set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS );
+
if ( n_ts > 1 )
{
ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order );
}
+ else if ( useLowerRes )
+ {
+ ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order );
+ }
else
{
for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
@@ -1809,64 +1840,69 @@ void ivas_get_spar_md_from_dirac(
{
response_avg[i] = response_avg[HOA_keep_ind[i]];
}
+
en_ratio_fac = ( 1.0f - diffuseness[band] );
- for ( i = 0; i < num_ch; i++ )
{
- for ( j = 0; j < num_ch; j++ )
+ for ( i = 0; i < num_ch; i++ )
{
- if ( i == j )
+ for ( j = 0; j < num_ch; j++ )
{
- if ( i == 0 )
+ if ( i == j )
{
- cov_real_dirac[i][i][band] = 1.0f;
- }
- else
- {
- cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j];
- if ( hSpar_md_cfg->nchan_transport <= 2 )
+ if ( i == 0 )
{
- cov_real_dirac[i][j][band] *= en_ratio_fac;
- if ( ( i >= ndm ) && ( dtx_vad == 1 ) )
+ cov_real_dirac[i][i][band] = 1.0f;
+ }
+ else
+ {
+ cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j];
+
+ if ( hSpar_md_cfg->nchan_transport <= 2 )
{
- cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm];
+
+ cov_real_dirac[i][j][band] *= en_ratio_fac;
+ if ( ( i >= ndm ) && ( dtx_vad == 1 ) )
+ {
+ cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm];
+ }
+ else
+ {
+ if ( i < foa_ch )
+ {
+ cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1;
+ }
+ else if ( i < hoa2_ch )
+ {
+ cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2;
+ }
+ else
+ {
+ cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3;
+ }
+ }
}
else
{
if ( i < foa_ch )
{
- cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1;
+ cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1;
}
else if ( i < hoa2_ch )
{
- cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2;
+ cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2;
}
else
{
- cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3;
+ cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3;
}
}
}
- else
- {
- if ( i < foa_ch )
- {
- cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1;
- }
- else if ( i < hoa2_ch )
- {
- cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2;
- }
- else
- {
- cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3;
- }
- }
}
- }
- else
- {
- cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j];
+ else
+ {
+ cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j];
+ }
}
}
}
@@ -1880,7 +1916,7 @@ void ivas_get_spar_md_from_dirac(
}
}
-#ifdef DEBUG_SPAR_WRITE_OUT_COV
+#ifdef DEBUG_SBA_MD_DUMP
{
static FILE *fid = 0;
int16_t k = 0;
@@ -1905,7 +1941,9 @@ void ivas_get_spar_md_from_dirac(
#endif
ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad,
- num_ch, 1, hSpar_md_cfg->active_w, hSpar_md_cfg, hSpar_md, Wscale, 1 );
+ num_ch, 1, hSpar_md_cfg->active_w,
+ active_w_vlbr,
+ hSpar_md_cfg, hSpar_md, Wscale, 1 );
if ( mixer_mat != NULL )
{
@@ -2094,12 +2132,27 @@ void ivas_spar_set_bitrate_config(
ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */
const int16_t table_idx, /* i : config. table index */
const int16_t num_bands /* i : number of bands */
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ const int16_t dirac2spar_md_flag,
+ const int16_t enc_flag,
+ const int16_t pca_flag,
+ const int16_t agc_flag
+#endif
)
{
int32_t ivas_total_brate;
int16_t i, total_bits, max_bits, code, length;
int16_t sba_order;
int16_t md_coding_bits_header;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands;
+ int16_t bits_PR, bits_C, bits_P;
+ int16_t wc_coarse_strat;
+ int16_t n_input, n_dmx, n_dec;
+ int16_t quant_strat;
+ int16_t bands_bw;
+#endif
pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ )
@@ -2131,13 +2184,23 @@ void ivas_spar_set_bitrate_config(
max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC );
}
- pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits;
- pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits;
+ pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits;
+ pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits;
md_coding_bits_header = SPAR_NUM_CODING_STRAT_BITS + pSpar_md_cfg->quant_strat_bits;
pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header;
pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ivas_total_brate < IVAS_24k4 )
+ {
+ bands_bw = 2;
+ }
+ else
+ {
+ bands_bw = 1;
+ }
+#endif
pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS );
pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS );
@@ -2145,6 +2208,74 @@ void ivas_spar_set_bitrate_config(
pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header;
pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( enc_flag )
+ {
+ /*calculate the actual worst case bits*/
+ if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT )
+ {
+ quant_strat = QUANT_STRAT_0;
+ }
+ else
+ {
+ quant_strat = QUANT_STRAT_2;
+ }
+
+ num_PR_bits_dirac_bands = ( dirac2spar_md_flag == 1 ) ? num_bands - SPAR_DIRAC_SPLIT_START_BAND : 0;
+ num_PR_bits_dirac_bands /= bands_bw;
+ num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands );
+ num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS;
+
+ n_input = ivas_sba_get_nchan_metadata( sba_order, ivas_total_brate );
+ n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport;
+ n_dec = n_input - n_dmx;
+ bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) );
+ num_PR_bits_dirac_bands *= bits_PR;
+ bits_PR = bits_PR * ( n_input - 1 );
+ bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec );
+ bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec );
+ wc_coarse_strat = bits_PR + bits_C + bits_P;
+ wc_coarse_strat *= num_bands;
+ wc_coarse_strat /= bands_bw;
+ wc_coarse_strat -= num_PR_bits_dirac_bands;
+ wc_coarse_strat += md_coding_bits_header;
+
+ if ( pSpar_md_cfg->max_bits_per_blk < wc_coarse_strat )
+ {
+ assert( 0 );
+ }
+
+ if ( agc_flag )
+ {
+ if ( pSpar_md_cfg->nchan_transport == 1 )
+ {
+ agc_bits = AGC_BITS_PER_CH;
+ }
+ else
+ {
+ agc_bits = AGC_BITS_PER_CH * pSpar_md_cfg->nchan_transport + AGC_SIGNALLING_BITS;
+ }
+ }
+ else
+ {
+ agc_bits = AGC_SIGNALLING_BITS;
+ }
+
+ if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER )
+ {
+ pca_bits = 1;
+ if ( pca_flag )
+ {
+ pca_bits += IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1;
+ }
+ }
+ else
+ {
+ pca_bits = 0;
+ }
+ pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits;
+ }
+#endif
return;
}
diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h
index 7e3326af238c9c21788c130009fa0270a2c6acd6..cc0fbf89b308e4917456c4a9331fccb17eaec61d 100644
--- a/lib_com/ivas_stat_com.h
+++ b/lib_com/ivas_stat_com.h
@@ -44,16 +44,14 @@
* Declaration of ISM common (encoder & decoder) structure
*----------------------------------------------------------------------------------*/
-#ifdef TD5
typedef struct
{
- int16_t last_azimuth_idx; /* last frame index of coded azimuth */
- int16_t azimuth_diff_cnt; /* FEC counter of consecutive differentially azimuth coded frames */
- int16_t last_elevation_idx; /* last frame index of coded elevation */
- int16_t elevation_diff_cnt; /* FEC counter of consecutive differentially elevation coded frames */
+ int16_t last_angle1_idx; /* last frame index of coded azimuth/yaw */
+ int16_t angle1_diff_cnt; /* FEC counter of consecutive differentially azimuth/yaw coded frames */
+ int16_t last_angle2_idx; /* last frame index of coded elevation/pitch */
+ int16_t angle2_diff_cnt; /* FEC counter of consecutive differentially elevation/pitch coded frames */
} ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE;
-#endif
/* ISM metadata handle (storage for one frame of read ISM metadata) */
typedef struct
@@ -62,20 +60,26 @@ typedef struct
int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */
float azimuth; /* azimuth value read from the input metadata file */
- float elevation; /* azimuth value read from the input metadata file */
-#ifdef TD5
- float radius;
- float yaw; /* azimuth orientation value read from the input metadata file */
- float pitch; /* elevation orientation value read from the input metadata file */
- ISM_METADATA_ANGLE angle[2]; /* Angle structs for [0] azimuth/elevation and [1] yaw/pitch */
- int16_t last_radius_idx; /* last frame index of coded radius */
- int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */
-#else
- int16_t last_azimuth_idx; /* last frame index of coded azimuth */
- int16_t azimuth_diff_cnt; /* FEC counter of consecutive differentially azimuth coded frames */
- int16_t last_elevation_idx; /* last frame index of coded elevation */
- int16_t elevation_diff_cnt; /* FEC counter of consecutive differentially elevation coded frames */
-#endif
+ float elevation; /* elevation value read from the input metadata file */
+ float radius; /* radius value read from the input metadata file */
+ float yaw; /* yaw value read from the input metadata file */
+ float pitch; /* pitch value read from the input metadata file */
+
+ int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */
+
+ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */
+ ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */
+ int16_t last_radius_idx; /* last frame index of coded radius */
+ int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */
+
+ float last_azimuth; /* MD smoothing in DTX- last Q azimuth value */
+ float last_elevation; /* MD smoothing in DTX - last Q elevation value */
+ float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */
+ float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */
+
+ int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */
+ int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */
+ float last_true_radius; /* last true Q radius value */
} ISM_METADATA_FRAME, *ISM_METADATA_HANDLE;
@@ -149,7 +153,6 @@ typedef struct ivas_param_ism_data_structure
int16_t nbands;
int16_t nblocks[MAX_PARAM_ISM_NBANDS];
int16_t band_grouping[MAX_PARAM_ISM_NBANDS + 1];
- int16_t num_obj;
int16_t azi_index[MAX_NUM_OBJECTS];
int16_t ele_index[MAX_NUM_OBJECTS];
@@ -164,6 +167,7 @@ typedef struct ivas_param_ism_data_structure
int16_t flag_noisy_speech;
int16_t noisy_speech_buffer[PARAM_ISM_HYS_BUF_SIZE];
+ int16_t flag_equal_energy;
} PARAM_ISM_CONFIG_DATA, *PARAM_ISM_CONFIG_HANDLE;
@@ -176,6 +180,9 @@ typedef struct ivas_dirac_config_data_struct
{
int16_t enc_param_start_band;
int16_t dec_param_estim;
+#ifndef FIX_393_459_460_SBA_MD
+ int16_t dec_param_estim_old;
+#endif
int16_t nbands;
} DIRAC_CONFIG_DATA, *DIRAC_CONFIG_DATA_HANDLE;
@@ -258,6 +265,9 @@ typedef struct ivas_spar_md_com_cfg
int16_t agc_bits_ch_idx;
int16_t planarCP;
int16_t num_umx_chs;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t max_md_bits_spar;
+#endif
} ivas_spar_md_com_cfg;
@@ -342,7 +352,7 @@ typedef struct ivas_agc_chan_data_t
typedef struct ivas_agc_com_state_t
{
float *winFunc;
- int16_t in_delay;
+ int16_t in_delay; /* TODO: JBM check if this needs to be adjusted in the dec */
uint16_t absEmin;
uint16_t betaE;
uint16_t maxAttExp;
@@ -422,6 +432,9 @@ typedef struct ivas_masa_directional_spatial_meta_struct
float elevation[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
float spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
+#ifdef HR_METADATA
+ uint16_t spherical_index[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
+#endif
} MASA_DIRECTIONAL_SPATIAL_META;
@@ -466,6 +479,9 @@ typedef struct
int16_t nbands;
int16_t nblocks;
int16_t start_band;
+#ifdef FIX_HBR_MASAMETA
+ uint8_t inactiveBands;
+#endif
int16_t search_effort;
MC_LS_SETUP mc_ls_setup;
@@ -497,7 +513,6 @@ typedef struct ivas_qdirection_band_coherence_data_struct
uint8_t spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES];
uint16_t spread_coherence_dct0_index;
uint16_t spread_coherence_dct1_index;
-
} IVAS_QDIRECTION_BAND_COHERENCE_DATA;
typedef struct ivas_surround_coherence_band_data_struct
@@ -697,6 +712,10 @@ typedef struct ivas_td_decorr_state_t
int16_t num_apd_sections;
int16_t ducking_flag;
+#ifdef JBM_TSM_ON_TCS
+ int16_t offset;
+#endif
+
} ivas_td_decorr_state_t;
@@ -709,6 +728,7 @@ typedef struct ivas_fb_mixer_cfg_t
int16_t fb_latency;
int16_t num_in_chans;
int16_t num_out_chans;
+ int16_t nchan_fb_in;
int16_t pcm_offset;
int16_t fade_len; /* this sets the stride length; no delay is introduced */
int16_t prior_input_length;
diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c
index 8b93558b219ea63fce4c737e2436d6221ff40ad0..dee56c5dff17f6b34fb245fcf8beb729603e6b09 100644
--- a/lib_com/ivas_stereo_td_bit_alloc.c
+++ b/lib_com/ivas_stereo_td_bit_alloc.c
@@ -478,7 +478,6 @@ void td_stereo_param_updt(
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/*-------------------------------------------------------------------*
* tdm_SCh_LSF_intra_pred_zero_bits()
*
@@ -487,7 +486,7 @@ void td_stereo_param_updt(
static void tdm_SCh_LSF_intra_pred_zero_bits(
const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
- float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */
+ float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */
const float *lsf_mean, /* i : secondary channel mean LSFs */
const float beta /* i : pull to average beta factor */
)
@@ -497,7 +496,7 @@ static void tdm_SCh_LSF_intra_pred_zero_bits(
/* pulling the LSFs closer to the average */
for ( i = 0; i < M; i++ )
{
- pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i];
+ pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i];
}
return;
@@ -511,7 +510,7 @@ static void tdm_SCh_LSF_intra_pred_zero_bits(
*-------------------------------------------------------------------*/
static void tdm_SCh_LSF_intra_pred_tri_diag_mat(
- float *lsf_secondary, /* i/o: secondary channel LSFs */
+ float *lsf_SCh, /* i/o: secondary channel LSFs */
const float *lsf_mean_in, /* i : secondary channel mean LSFs (in) */
const float *lsf_mean_out, /* i : secondary channel mean LSFs (out) */
const float *prd_diag_3 /* i : secondary channel mean LSFs */
@@ -522,37 +521,38 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat(
const float *prd_ptr;
float *lsf_tmp_ptr1;
float *lsf_tmp_ptr2;
- float *lsf_second_ptr;
+ float *lsf_SCh_ptr;
prd_ptr = prd_diag_3;
- v_sub( lsf_secondary, lsf_mean_in, lsf_tmp, M );
+ v_sub( lsf_SCh, lsf_mean_in, lsf_tmp, M );
lsf_tmp_ptr1 = lsf_tmp;
- lsf_second_ptr = lsf_secondary;
+ lsf_SCh_ptr = lsf_SCh;
lsf_tmp_ptr2 = lsf_tmp_ptr1;
- *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
- ( *lsf_second_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ );
+ *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
+ ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ );
for ( i = 1; i < M - 1; i++ )
{
lsf_tmp_ptr1 = lsf_tmp_ptr2;
- *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
+ *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
lsf_tmp_ptr2 = lsf_tmp_ptr1;
- *lsf_second_ptr += ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
- ( *lsf_second_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ );
+ *lsf_SCh_ptr += ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
+ ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ );
}
lsf_tmp_ptr1 = lsf_tmp_ptr2;
- *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
- *lsf_second_ptr += ( *lsf_tmp_ptr1 ) * ( *prd_ptr );
+ *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ );
+ *lsf_SCh_ptr += ( *lsf_tmp_ptr1 ) * ( *prd_ptr );
- v_add( lsf_secondary, lsf_mean_out, lsf_secondary, M );
+ v_add( lsf_SCh, lsf_mean_out, lsf_SCh, M );
return;
}
+
/*-------------------------------------------------------------------*
* tdm_SCh_LSF_intra_pred()
*
@@ -562,7 +562,7 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat(
void tdm_SCh_LSF_intra_pred(
const int32_t element_brate, /* i : element bitrate */
const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
- float *pred_lsf_secondary /* o : predicted secondary channel LSFs */
+ float *pred_lsf_SCh /* o : predicted secondary channel LSFs */
)
{
float fixed_beta;
@@ -588,15 +588,43 @@ void tdm_SCh_LSF_intra_pred(
fixed_beta = 0.91F;
}
- tdm_SCh_LSF_intra_pred_zero_bits( tdm_lsfQ_PCh, pred_lsf_secondary, tdm_LSF_MEAN_PRED_QNT, fixed_beta );
+ tdm_SCh_LSF_intra_pred_zero_bits( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT, fixed_beta );
+
+ tdm_SCh_LSF_intra_pred_tri_diag_mat( pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT_IN, tdm_LSF_MEAN_PRED_QNT_OUT, tdm_PRED_QNT_fixed_beta_prd_diag_3 );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * tdm_SCh_LSF_intra_pred_one_bit_dec()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+static void tdm_SCh_LSF_intra_pred_one_bit_dec(
+ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
+ float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */
+ const float *lsf_mean, /* i : secondary channel mean LSFs */
+ const float *Beta_Q_x, /* i : beta quantization values */
+ const int16_t beta_index /* i : the quantization bits for beta (-1 if beta fixed)*/
+)
+{
+ int16_t i;
+ float beta;
+
+ beta = Beta_Q_x[beta_index];
- tdm_SCh_LSF_intra_pred_tri_diag_mat( pred_lsf_secondary, tdm_LSF_MEAN_PRED_QNT_IN, tdm_LSF_MEAN_PRED_QNT_OUT, tdm_PRED_QNT_fixed_beta_prd_diag_3 );
+ /* pulling the LSFs closer to the avergae */
+ for ( i = 0; i < M; i++ )
+ {
+ pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i];
+ }
return;
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
/*-------------------------------------------------------------------*
* tdm_SCh_LSF_intra_pred_one_bit_enc()
*
@@ -604,29 +632,28 @@ void tdm_SCh_LSF_intra_pred(
*-------------------------------------------------------------------*/
static void tdm_SCh_LSF_intra_pred_one_bit_enc(
- const float *lsf_secondary, /* i : secondary channel LSFs */
- const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
- float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */
- const float *lsf_mean, /* i : secondary channel mean LSFs */
- const float *lsf_wgts_new, /* i : Improved wgts for LSFs */
- const float *Beta_Q_x, /* i : beta quantization values */
- int16_t *beta_index /* o : the quantization bits for beta (-1 if beta fixed) */
+ const float *lsf_SCh, /* i : secondary channel LSFs */
+ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
+ float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */
+ const float *lsf_mean, /* i : secondary channel mean LSFs */
+ const float *lsf_wgts_new, /* i : Improved wgts for LSFs */
+ const float *Beta_Q_x, /* i : beta quantization values */
+ int16_t *beta_index /* o : the quantization bits for beta (-1 if beta fixed) */
)
{
int16_t i;
float A_temp[M];
float B_temp[M];
float WD[2];
- float beta;
for ( i = 0; i < M; i++ )
{
- A_temp[i] = lsf_secondary[i] - lsf_mean[i];
+ A_temp[i] = lsf_SCh[i] - lsf_mean[i];
B_temp[i] = lsf_mean[i] - tdm_lsfQ_PCh[i];
}
- WD[0] = 0.;
- WD[1] = 0.;
+ WD[0] = 0.f;
+ WD[1] = 0.f;
for ( i = 0; i < M; i++ )
{
WD[0] += lsf_wgts_new[i] * SQR( A_temp[i] ) + 2.0f * Beta_Q_x[0] * lsf_wgts_new[i] * A_temp[i] * B_temp[i] + lsf_wgts_new[i] * SQR( Beta_Q_x[0] ) * SQR( B_temp[i] );
@@ -635,49 +662,14 @@ static void tdm_SCh_LSF_intra_pred_one_bit_enc(
if ( WD[0] < WD[1] )
{
- beta = Beta_Q_x[0];
*beta_index = 0;
}
else
{
- beta = Beta_Q_x[1];
*beta_index = 1;
}
- /* pulling the LSFs closer to the avergae */
- for ( i = 0; i < M; i++ )
- {
- pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i];
- }
-
- return;
-}
-
-
-/*-------------------------------------------------------------------*
- * tdm_SCh_LSF_intra_pred_one_bit_dec()
- *
- *
- *-------------------------------------------------------------------*/
-
-static void tdm_SCh_LSF_intra_pred_one_bit_dec(
- const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */
- float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */
- const float *lsf_mean, /* i : secondary channel mean LSFs */
- const float *Beta_Q_x, /* i : beta quantization values */
- const int16_t beta_index /* i : the quantization bits for beta (-1 if beta fixed)*/
-)
-{
- int16_t i;
- float beta;
-
- beta = Beta_Q_x[beta_index];
-
- /* pulling the LSFs closer to the avergae */
- for ( i = 0; i < M; i++ )
- {
- pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i];
- }
+ tdm_SCh_LSF_intra_pred_one_bit_dec( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_RE_USE, Beta_Q_x, *beta_index );
return;
}
@@ -696,26 +688,26 @@ void tdm_SCh_lsf_reuse(
float lsp_new[M], /* i/o: LSPs at the end of the frame */
const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */
const float lsf_wgts[M], /* i : LSF weights */
- int16_t beta_index[] /* i/o: quantization index */
+ int16_t *beta_index /* i/o: quantization index */
)
{
const float *Beta_Q1bit_re_use;
if ( element_brate <= IVAS_13k2 )
{
- Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_132[0];
+ Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_13k2;
}
else if ( element_brate <= IVAS_16k4 )
{
- Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_164[0];
+ Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_16k4;
}
else if ( element_brate <= IVAS_32k )
{
- Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_244_320[0];
+ Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_24k4_32k;
}
else
{
- Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_480[0];
+ Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_48k;
}
if ( enc_dec == ENC )
@@ -729,10 +721,7 @@ void tdm_SCh_lsf_reuse(
tdm_SCh_LSF_intra_pred_tri_diag_mat( lsf_new, tdm_LSF_MEAN_RE_USE_IN, tdm_LSF_MEAN_RE_USE_OUT, tdm_RE_USE_adaptive_beta_prd_diag_3 );
- lsf2lsp( lsf_new, lsp_new, M, 12800 );
+ lsf2lsp( lsf_new, lsp_new, M, INT_FS_12k8 );
return;
}
-#endif
-
-#endif
diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c
index 23620b3b2db5dc6db7e83828c615efef98faba5e..f2dd0871dc1ea18a9cbc3dbad1a8c494f5605820 100644
--- a/lib_com/ivas_td_decorr.c
+++ b/lib_com/ivas_td_decorr.c
@@ -87,12 +87,107 @@ static const float ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = {
};
+#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f )
+#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f )
+
/*------------------------------------------------------------------------------------------*
* Local functions declaration
*------------------------------------------------------------------------------------------*/
static int16_t ivas_get_APD_filt_orders( const int16_t num_out_chans, const int32_t output_Fs, int16_t *APD_filt_orders );
-static ivas_error ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag );
+
+static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag );
+
+
+/*-------------------------------------------------------------------------
+ * ivas_td_decorr_reconfig_dec()
+ *
+ * Allocate and initialize time domain decorrelator handle
+ *------------------------------------------------------------------------*/
+
+ivas_error ivas_td_decorr_reconfig_dec(
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate, /* i : total IVAS bitrate */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int32_t output_Fs, /* i : output sampling rate */
+ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */
+ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */
+)
+{
+ uint16_t useTdDecorr_new;
+ ivas_error error;
+
+ useTdDecorr_new = 0;
+ if ( ivas_format == SBA_FORMAT )
+ {
+ if ( nchan_transport == 1 )
+ {
+ useTdDecorr_new = 1;
+ }
+ }
+ else if ( ivas_format == MASA_FORMAT )
+ {
+ if ( ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) || ivas_total_brate < MASA_STEREO_MIN_BITRATE )
+ {
+ useTdDecorr_new = 1;
+ }
+ }
+ else if ( ivas_format == MC_FORMAT )
+ {
+ if ( ivas_total_brate < IVAS_48k && nchan_transport == 1 )
+ {
+ useTdDecorr_new = 1;
+ }
+ }
+
+ if ( *useTdDecorr != useTdDecorr_new )
+ {
+ *useTdDecorr = useTdDecorr_new;
+
+ if ( *useTdDecorr )
+ {
+ if ( ivas_total_brate >= IVAS_13k2 && ivas_format == SBA_FORMAT )
+ {
+ if ( *hTdDecorr == NULL )
+ {
+ if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ if ( ivas_total_brate < IVAS_24k4 )
+ {
+ ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR;
+ }
+ else
+ {
+ ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN;
+ }
+ }
+ else
+ {
+ if ( *hTdDecorr == NULL )
+ {
+ if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else
+ {
+ ivas_td_decorr_init( *hTdDecorr, 3, 0 );
+ }
+ }
+ }
+ else
+ {
+ ivas_td_decorr_dec_close( hTdDecorr );
+ }
+ }
+
+ return IVAS_ERR_OK;
+}
/*-------------------------------------------------------------------------
@@ -127,7 +222,9 @@ ivas_error ivas_td_decorr_dec_open(
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" );
}
set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) );
-
+#ifdef JBM_TSM_ON_TCS
+ hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU );
+#endif
hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order );
for ( j = 0; j < num_out_chans; j++ )
@@ -275,7 +372,7 @@ static int16_t ivas_get_APD_filt_orders(
* TD decorr Initialisation function
*-----------------------------------------------------------------------------------------*/
-static ivas_error ivas_td_decorr_init(
+static void ivas_td_decorr_init(
ivas_td_decorr_state_t *hTdDecorr,
const int16_t num_out_chans,
const int16_t ducking_flag )
@@ -295,7 +392,7 @@ static ivas_error ivas_td_decorr_init(
}
}
- return IVAS_ERR_OK;
+ return;
}
@@ -304,8 +401,7 @@ static ivas_error ivas_td_decorr_init(
*
* APD IIR filter
*-----------------------------------------------------------------------------------------*/
-
-static void ivas_td_decorr_APD_iir_filter(
+void ivas_td_decorr_APD_iir_filter(
ivas_td_decorr_APD_filt_state_t *filter_state,
float *pIn_out,
const int16_t num_APD_sections,
@@ -375,20 +471,32 @@ static void ivas_td_decorr_APD_sections(
void ivas_td_decorr_process(
ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */
- float pcm_in[][L_FRAME48k], /* i : input audio channels */
- float **ppOut_pcm, /* o : output audio channels */
- const int16_t output_frame /* i : output frame length */
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[], /* i : input audio channels */
+#else
+ float pcm_in[][L_FRAME48k], /* i : input audio channels */
+#endif
+ float **ppOut_pcm, /* o : output audio channels */
+ const int16_t output_frame /* i : output frame length */
)
{
int16_t i, j;
+#ifndef JBM_TSM_ON_TCS
int16_t offset;
+#endif
float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k];
+#ifndef JBM_TSM_ON_TCS
offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU );
+#endif
/* Look-ahead delay */
mvr2r( pcm_in[0], ppOut_pcm[0], output_frame );
+#ifdef JBM_TSM_ON_TCS
+ delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset );
+#else
delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, offset );
+#endif
/* In ducking gains */
if ( hTdDecorr->ducking_flag )
diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c
index b75c08379121fbeab38909b5b787ca0fec8a31e2..cf59a751a6a50efc3fc01c31753b515e8a44c59f 100644
--- a/lib_com/ivas_tools.c
+++ b/lib_com/ivas_tools.c
@@ -75,10 +75,18 @@ float sumAbs(
void mvc2c(
const uint8_t x[], /* i : input vector */
uint8_t y[], /* o : output vector */
- const int16_t n /* i : vector size */
+#ifdef FIX_XXX_JBM_FIFO_BUFFER
+ const int32_t n
+#else
+ const int16_t n /* i : vector size */
+#endif
)
{
+#ifdef FIX_XXX_JBM_FIFO_BUFFER
+ int32_t i;
+#else
int16_t i;
+#endif
if ( n <= 0 )
{
@@ -114,14 +122,22 @@ void mvc2c(
/*! r: number of clipped samples */
uint32_t ivas_syn_output(
- float synth[][L_FRAME48k], /* i/o: float synthesis signal */
+#ifdef JBM_TSM_ON_TCS
+ float *synth[], /* i/o: float synthesis signal */
+#else
+ float synth[][L_FRAME48k], /* i/o: float synthesis signal */
+#endif
const int16_t output_frame, /* i : output frame length (one channel) */
const int16_t n_channels, /* i : number of output channels */
int16_t *synth_out /* o : integer 16 bits synthesis signal */
)
{
int16_t i, n;
+#ifdef JBM_TSM_ON_TCS
+ int16_t synth_loc[MAX_JBM_L_FRAME48k];
+#else
int16_t synth_loc[L_FRAME48k];
+#endif
uint32_t noClipping = 0;
/*-----------------------------------------------------------------*
@@ -147,6 +163,42 @@ uint32_t ivas_syn_output(
return noClipping;
}
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------*
+ * ivas_syn_output_f()
+ *
+ * Output ivas synthesis signal with compensation for saturation
+ * returns number of clipped samples
+ *-------------------------------------------------------------------*/
+
+/*! r: number of clipped samples */
+void ivas_syn_output_f(
+ float *synth[], /* i/o: float synthesis signal */
+ const int16_t output_frame, /* i : output frame length (one channel) */
+ const int16_t n_channels, /* i : number of output channels */
+ float *synth_out /* o : integer 16 bits synthesis signal */
+)
+{
+ int16_t i, n;
+
+ /*-----------------------------------------------------------------*
+ * float to integer conversion with saturation control
+ *-----------------------------------------------------------------*/
+
+ for ( n = 0; n < n_channels; n++ )
+ {
+ for ( i = 0; i < output_frame; i++ )
+ {
+ synth_out[i * n_channels + n] = synth[n][i];
+ }
+ }
+
+ return;
+}
+#endif
+
+
/*-------------------------------------------------------------------*
* mvr2r_inc()
*
diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c
index 19321e21d9bcea526d92d3f0fc6cebc6be6c87f2..02a735e80c0baf8914c90526bd7fde29581f5dd8 100644
--- a/lib_com/lsf_tools.c
+++ b/lib_com/lsf_tools.c
@@ -2027,6 +2027,62 @@ int16_t tcxlpc_get_cdk(
return cdk;
}
+void dec_FDCNG_MSVQ_stage1(
+ int16_t j_full, /* i: index full range */
+ int16_t n, /* i: dimension to generate */
+ const float *invTrfMatrix, /* i: IDCT matrix for synthesis */
+ const DCTTYPE idcttype, /* i: specify which IDCT */
+ float *uq, /* o: synthesized stage1 vector */
+ Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */
+)
+{
+ int16_t col, segm_ind, j;
+ float dct_vec[FDCNG_VQ_MAX_LEN];
+ float idct_vec[FDCNG_VQ_MAX_LEN];
+ const Word8 *cbpW8;
+ const Word16 *dct_col_shift_tab;
+
+ assert( n <= FDCNG_VQ_MAX_LEN );
+ assert( n >= FDCNG_VQ_DCT_MINTRUNC );
+
+ segm_ind = 0;
+ for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ )
+ {
+ if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] )
+ {
+ segm_ind++;
+ }
+ }
+
+ j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */
+
+ assert( j < cdk1_ivas_entries_per_segment[segm_ind] );
+
+ /* Word8 column variable Qx storage*/
+ cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm_ind]; /* Word8 storage fixed ptr_init */
+ cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */
+ dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind];
+
+ for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ )
+ {
+ dct_vec[col] = (float) ( ( (Word16) cbpW8[col] ) << dct_col_shift_tab[col] );
+ /* LOGIC( 1 ); SHIFT( 1 ); ADD( 1 );
+ in BASOP: s_and(for W8->W16), shl(), sub()
+ */
+ }
+ dctT2_N_apply_matrix( (const float *) dct_vec, idct_vec, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype );
+
+ /*scale down to original fdcngvq domain and move to Q0 */
+ v_multc( idct_vec, fdcng_dct_scaleF[1], idct_vec, n );
+ /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 ,
+ not really relevant for BASOP loop */
+
+ /*add common mid fdcng vector, in fdcng bands domain */
+ v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n );
+ assert( uq_ind == NULL );
+}
+
+
/*--------------------------------------------------------------------------*
* msvq_dec()
*
@@ -2035,15 +2091,17 @@ int16_t tcxlpc_get_cdk(
void msvq_dec(
- const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
- const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
- const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
- const int16_t stages, /* i : Number of stages */
- const int16_t N, /* i : Vector dimension */
- const int16_t maxN, /* i : Codebook dimension */
- const int16_t Idx[], /* i : Indices */
- float *uq, /* o : quantized vector */
- Word16 *uq_ind /* o : quantized vector (fixed point) */
+ const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
+ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
+ const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
+ const int16_t stages, /* i : Number of stages */
+ const int16_t N, /* i : Vector dimension */
+ const int16_t maxN, /* i : Codebook dimension */
+ const int16_t Idx[], /* i : Indices */
+ const int16_t applyIDCT_flag, /* i : applyIDCT flag */
+ const float *invTrfMatrix, /* i: matrix for IDCT synthesis */
+ float *uq, /* o : quantized vector */
+ Word16 *uq_ind /* o : quantized vector (fixed point) */
)
{
int16_t i, n, maxn, start;
@@ -2079,9 +2137,17 @@ void msvq_dec(
start = 0;
}
-#define WMC_TOOL_SKIP
- v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n );
+ if ( i == 0 && applyIDCT_flag != 0 )
+ {
+ assert( start == 0 );
+ dec_FDCNG_MSVQ_stage1( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */
+ }
+ else
+ {
+ v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n );
+ }
+#define WMC_TOOL_SKIP
IF( uq_ind != NULL )
{
FOR( j = 0; j < n; ++j )
@@ -2358,3 +2424,193 @@ void a2isf(
return;
}
+
+/*-------------------------------------------------------------------*
+ * dctT2_N_apply_matrix()
+ *
+ * dct/idct truncated matrix appl. for DCT basis vector lengths of N
+ *-------------------------------------------------------------------*/
+void dctT2_N_apply_matrix(
+ const float *input,
+ float *output,
+ const int16_t dct_dim,
+ int16_t fdcngvq_dim,
+ const float *matrix,
+ const int16_t matrix_row_dim,
+ DCTTYPE dcttype )
+{
+ int16_t i, j, dim_in, dim_out;
+ int16_t mat_step_col, mat_step_row, mat_step_col_flag;
+ const float *pt_x, *pt_A;
+ float tmp_y[FDCNG_VQ_MAX_LEN];
+ float *pt_y;
+
+ /* non-square DCT_N and IDCT_N matrix application,
+ using a stored format of an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */
+ /* efficiently parallelized in SIMD */
+
+ assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC );
+ assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN );
+
+ if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */
+ {
+ /* DCT_typeII 24,21 -> XX in worst case */
+ dim_in = fdcngvq_dim;
+ dim_out = dct_dim;
+ mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */
+ mat_step_row = 0;
+ mat_step_col_flag = 1;
+ assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX );
+ }
+ else
+ {
+ assert( ( dcttype & 1 ) != 0 ); /* idct */
+ dim_in = dct_dim;
+ dim_out = fdcngvq_dim;
+ mat_step_col = 1;
+ mat_step_row = matrix_row_dim;
+ mat_step_col_flag = 0;
+ assert( dcttype == IDCT_T2_XX_24 );
+ }
+
+ pt_y = tmp_y;
+ for ( i = 0; i < dim_out; i++ )
+ {
+ pt_x = input;
+ *pt_y = 0;
+
+ /* +i(DCT) or +i*maxTrunc(IDCT) */
+#define WMC_TOOL_SKIP
+ pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */
+ PTR_INIT( 1 );
+#undef WMC_TOOL_SKIP
+ for ( j = 0; j < dim_in; j++ )
+ {
+#define WMC_TOOL_SKIP
+ *pt_y += ( *pt_x++ ) * ( *pt_A );
+ pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/
+ MAC( 1 );
+#undef WMC_TOOL_SKIP
+ }
+ pt_y++;
+ }
+ mvr2r( tmp_y, output, dim_out );
+}
+
+/*-------------------------------------------------------------------*
+ * extend_dctN_input()
+ *
+ * (inputN, dctN) -> idct(N_ext) idct_N matrix application loop for
+ * extending, extrapolating a DCT basis vector length of N to N_ext
+ *-------------------------------------------------------------------*/
+
+void extend_dctN_input(
+ const float *input, /* i: input in fdcng domain */
+ const float *dct_input, /* i: input in dctN(fdcng) domain */
+ const int16_t in_dim, /* i: in_dim == N */
+ float *ext_sig, /* o: extended output in fdcng domain */
+ const int16_t out_dim, /* i: output total dim */
+ float *matrix, /* i: idct synthesis matrix N rows, n_cols columns */
+ const int16_t n_cols, /* i: number of columns == DCT truncation length */
+ DCTTYPE dcttype ) /* i: matrix operation type */
+{
+ int16_t i, j, i_rev;
+ const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix;
+
+ /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */
+ assert( in_dim < FDCNG_VQ_MAX_LEN );
+ assert( out_dim <= FDCNG_VQ_MAX_LEN );
+ assert( out_dim > in_dim );
+ assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/
+ assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */
+
+ mvr2r( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */
+ set_f( &( ext_sig[in_dim] ), 0.0, out_dim - in_dim );
+
+ i_rev = in_dim; /*ptr init*/
+ for ( i = in_dim; i < out_dim; i++ )
+ { /* for each extension sample */
+ /* i = 21 22 23;
+ i_rev = 20 19 18; for odd dctII reflect basis vector
+ */
+ i_rev--;
+
+ for ( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */
+ {
+ /* DCTcoeff * reflected basis vector */
+#define WMC_TOOL_SKIP
+ /* pure ptr MAC operations */
+ ext_sig[i] += dct_input[j] * ptr[i_rev][j]; /* sum up scaled and extended basis vector */
+ MAC( 1 );
+#undef WMC_TOOL_SKIP
+ }
+ }
+}
+
+
+/* inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in RAM from a quantized compressed ROM format */
+void create_IDCT_N_Matrix( float *inv_matrixFloatQ, const int16_t N, const int16_t n_cols, const int16_t alloc_size )
+{
+ int16_t c, c1, r, r_flip, W16_val;
+ int16_t len;
+ int16_t mat_cpy_size;
+ const Word16 *absval_ptr;
+ const Word8 *idx_ptr;
+ Word16 idx;
+ float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) inv_matrixFloatQ; /* fixed number of columns pointers, to simplifies adressing in ANSIC */
+
+ absval_ptr = unique_idctT2_24coeffsQ16;
+ idx_ptr = idctT2_24_compressed_idx;
+ len = FDCNG_VQ_MAX_LEN;
+
+ if ( N == FDCNG_VQ_MAX_LEN_WB )
+ {
+ absval_ptr = unique_idctT2_21coeffsQ16;
+ idx_ptr = idctT2_21_compressed_idx;
+ len = N;
+ }
+
+ assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */
+ assert( N <= len );
+
+ mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */
+
+ if ( ( len & 1 ) != 0 )
+ { /* odd sized DCT with a non-reflected center row */
+ mat_cpy_size += n_cols;
+ }
+
+ for ( c = 0; c < mat_cpy_size; c++ )
+ {
+ idx = (Word16) ( idx_ptr[c] );
+ W16_val = absval_ptr[abs( idx )];
+
+ if ( idx < 0 )
+ {
+ W16_val = -( W16_val );
+ }
+ inv_matrixFloatQ[c] = ( +1.52587890625e-05f ) * ( (float) W16_val ); /* 1.0/2.^16 scaling to a float-"Q0" , a scaling that is not done in BASOP */
+ }
+
+ /* for even number of coeffs DCT24,
+ flip symmetry for odd, even is used to save 50% IDCT Table ROM */
+ /* for an odd DCT center is not flipped e.g for DCT21 */
+
+ assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC );
+ assert( ( n_cols & 1 ) == 0 );
+
+ for ( c = 0; c < ( n_cols ); c += 2 )
+ {
+ c1 = c + 1;
+ r_flip = len - 1;
+ for ( r = 0; r < ( len / 2 ); r++, r_flip-- )
+ {
+#define WMC_TOOL_SKIP
+ ptr[r_flip][c] = ptr[r][c]; /* flipped */
+ ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */
+ MOVE( 2 );
+ MULT( 1 ); /* for negate */
+#undef WMC_TOOL_SKIP
+ }
+ }
+}
diff --git a/lib_com/options.h b/lib_com/options.h
index bd5e9f07db414d9ad91915aa0018953eb6fef0ec..42f7248f4c662e75507741e6782b3d8c2949bd93 100755
--- a/lib_com/options.h
+++ b/lib_com/options.h
@@ -83,7 +83,7 @@
/*#define ALLOW_BYTE_EP*/ /* allow byte fer pattern files and check fer pattern file validity */
#define WRAP_AS_EIDXOR /* wraps FER file (as in STL_eid-xor.c/softbit.c) */
-#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stere 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */
+#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */
/*#define DEBUG_STEREO_DFT_NOCORE*/ /* DFT stereo: by-pass core coder at decoder side*/
/*#define DEBUG_STEREO_DFT_NOSTEREO*/ /* DFT stereo: by-pass stereo processing at encoder and decoder side*/
/*#define DEBUG_STEREO_DFT_NOQRES*/
@@ -114,6 +114,7 @@
/*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */
#ifdef DEBUG_SBA
+/*#define DEBUG_LBR_SBA*/ /* debug low bitrate SBA (SPAR+DirAC) */
/*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */
/*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */
/*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */
@@ -124,7 +125,8 @@
#endif
/*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */
/*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */
-#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */
+//#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */
+#define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */
#endif
/* #################### End DEBUGGING switches ############################ */
@@ -132,36 +134,113 @@
/* ################# Start DEVELOPMENT switches ######################## */
#define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */
-#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */
+#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */
-#define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
-/*#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE */ /* switch to isolate the reuse mode case */
+#ifndef IND_LIST_DYN
+#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */
#endif
+
#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */
-/*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */
/*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */
-#define FIX_I109_ORIENTATION_TRACKING /* Issue 109: Harmonize head and orientation tracking */
-/*#define SBA_HPF_TUNING_DEC*/
-
-#define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */
-#define TUNE_360_OBJECT_WITH_NOISE /* VA: issue 360: consider objects being speech+noise for active speech coding */
-#define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */
-#define FIX_372_LIB_REND_VALIDATE_IO /* FhG: Issue 372: IVAS_rend segfaults with unsupported I/O configs - add validation checks of I/O config */
-#define FIX_376_SBA_ROTATE /*DLB: Fix for issue 376*/
-#define TD5 /* Eri: Contribution 17: Extended metadata for 6 DoF rendering in TD renderer */
-#define TD5_FIX_INVALID_MEMORY_ACCESS /* FhG: Resolves segfault in case IVAS_REND_InitConfig gets initialized with rendererConfigEnabled:=false && ISM are being rendered */
-#define FIX_371_DELAY_REPORT /* Issue 371: div. by zero with -no_delay_cmp */
-#define FIX_373_MASA_DELAY_COMP_MSAN /* Nokia: Issue 373: MASA audio/meta delay compensation. MSAN bugfix */
-
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#define OTR_REFERENCE_VECTOR_TRACKING /* FhG: enables the reference position orientation tracking mode */
+
+#define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */
+#define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */
+
+/*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/
+#define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */
+
+#define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */
+
+#define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */
+#define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */
+#define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */
+#define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */
+#define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */
+
+#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */
+
+#define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */
+
+#define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */
+
+#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */
+
+#define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */
+
+#define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */
+
+#define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */
+#define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */
+#define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */
+
+#define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */
+#define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */
+#define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */
+
+#define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */
+#define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */
+
+
+#define COMPLEXITY_LEVEL_INDICATION
+
+#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */
+
+#define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */
+
+#define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */
+#define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/
+#define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */
+#define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */
+#define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */
+#define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */
+#define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */
+#define FIX_MDCT_ST_PLC_FADEOUT_DELAY
+#define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */
+#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */
+#define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */
+#define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */
+#define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */
+#define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */
+
+#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : TD decorr state optimization in SBA for certain output formats */
+
+#define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */
+#define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */
+#define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */
+#define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */
+#define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */
+#define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */
+
+#define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */
+#define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */
+#define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */
+
+#define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */
+#define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */
+
+#ifdef HR_METADATA
+#define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */
#endif
-#define FIX_380_BFI_PARAMISM /* VA: issue 380 - fix metadata recovery in ParamISM BFI */
+#define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */
+
+#define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */
+#define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */
+#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */
+#define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */
+#define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */
+#define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/
+
+#define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/
+#define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/
+
+#define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */
+
+#define BINAURAL_AUDIO_CMDLINE
#define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */
/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */
+
#endif
diff --git a/lib_com/prot.h b/lib_com/prot.h
index de6c521048fb8447092692f47dadcff654004420..e6f371c468148a17d0d23a7be80ee575ed20a52a 100644
--- a/lib_com/prot.h
+++ b/lib_com/prot.h
@@ -177,7 +177,11 @@ float sum2_f(
void set_c(
int8_t y[], /* i/o: Vector to set */
const int8_t a, /* i : Value to set the vector to */
- const int16_t N /* i : Lenght of the vector */
+#ifdef JBM_TSM_ON_TCS
+ const int32_t N /* i : Length of the vector */
+#else
+ const int16_t N /* i : Length of the vector */
+#endif
);
void set_s(
@@ -515,6 +519,54 @@ void push_next_bits(
#endif
);
+#ifdef IND_LIST_DYN
+int16_t get_ivas_max_num_indices( /* o : maximum number of indices */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
+);
+
+int16_t get_core_max_num_indices( /* o : maximum number of indices */
+ const int16_t core, /* i : core */
+ const int32_t total_brate /* i : total bitrate */
+);
+
+int16_t get_BWE_max_num_indices( /* o : maximum number of indices */
+ const int32_t extl_brate /* i : extensiona layer bitrate */
+);
+
+int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
+);
+
+ivas_error ind_list_realloc(
+ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
+ int16_t max_num_indices /* i : new maximum number of allowed indices in the list */
+);
+
+ivas_error check_ind_list_limits(
+ BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */
+);
+
+ivas_error move_indices(
+ INDICE_HANDLE old_ind_list, /* i/o: old location of indices */
+ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */
+ const int16_t nb_indices /* i : number of moved indices */
+);
+
+int16_t find_indice( /* o : index of the indice in the list, -1 if not found */
+ BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */
+ int16_t id, /* i : ID of the indice */
+ uint16_t *value, /* o : value of the quantized indice */
+ int16_t *nb_bits /* o : number of bits used to quantize the indice */
+);
+
+uint16_t delete_indice( /* o : number of deleted indices */
+ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
+ int16_t id /* i : ID of the indice */
+);
+#endif
+
/*! r: value of the indice */
#ifdef DEBUG_BS_READ_WRITE
#define get_next_indice( ... ) get_next_indice_( __VA_ARGS__, __LINE__, __func__ )
@@ -613,12 +665,14 @@ Decoder_State **reset_elements(
);
+#ifndef IND_LIST_DYN
void indices_to_serial_generic(
const Indice *ind_list, /* i : indices list */
const Word16 num_indices, /* i : number of indices to write */
UWord8 *pFrame, /* o : byte array with bit packet and byte aligned coded speech data */
Word16 *pFrame_size /* o : size of the binary encoded access unit [bits] */
);
+#endif
void convertSerialToBytestream(
const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */
@@ -681,10 +735,6 @@ int32_t get_delay(
const int32_t io_fs, /* i : input/output sampling frequency */
const IVAS_FORMAT ivas_format, /* i : IVAS format */
HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */
-#ifndef BINAURALIZATION_DELAY_REPORT
- ,
- const int32_t binaural_latency_ns /* i : binauralization delay in ns */
-#endif
);
void decision_matrix_enc(
@@ -2223,8 +2273,12 @@ void read_next_force(
int32_t *force_profile_cnt /* i/o: counter of frames for force switching profile file */
);
#endif
+
ivas_error init_encoder(
- Encoder_State *st, /* i/o: state structure */
+ Encoder_State *st, /* i/o: state structure */
+#ifdef IND_LIST_DYN
+ Encoder_Struct *st_ivas, /* i/o: encoder state structure */
+#endif
const int16_t idchan, /* i : channel ID */
const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */
const int16_t interval_SID, /* i : interval for SID update */
@@ -2327,7 +2381,6 @@ ivas_error acelp_core_enc(
float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */
int16_t *unbits, /* o : number of unused bits */
STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */
- const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
);
@@ -3026,10 +3079,8 @@ void lsf_enc(
float *Aq, /* o : quantized A(z) for 4 subframes */
const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */
const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
);
void isf_enc_amr_wb(
@@ -3827,8 +3878,11 @@ void bw_detect(
const float signal_in[], /* i : input signal */
float *spectrum, /* i : MDCT spectrum */
const float *enerBuffer /* i : energy buffer */
+ ,
+ const int16_t mct_on /* i : flag MCT mode */
);
+
void set_bw(
const int16_t element_mode, /* i : element mode */
const int32_t element_brate, /* i : element bitrate */
@@ -4501,6 +4555,8 @@ ivas_error acelp_core_dec(
const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */
const int16_t nchan_out, /* i : number of output channels */
STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */
+ ,
+ const int16_t read_sid_info /* i : read SID info flag */
);
void bass_psfilter_init(
@@ -4581,10 +4637,8 @@ void lsf_dec(
float *lsp_new, /* o : de-quantized LSP vector */
float *lsp_mid, /* o : de-quantized mid-frame LSP vector */
const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
);
void isf_dec_amr_wb(
@@ -5859,6 +5913,7 @@ ivas_error core_switching_post_dec(
float *synth, /* i/o: output synthesis */
float *output, /* i/o: LB synth/upsampled LB synth */
float output_mem[], /* i : OLA memory from last TCX/HQ frame */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */
const int16_t output_frame, /* i : frame length */
const int16_t core_switching_flag, /* i : ACELP->HQ switching frame flag */
@@ -7149,8 +7204,7 @@ void WindowSignal(
int16_t *L_frame, /* i/o: frame length */
float out[], /* o : output windowed signal */
const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */
- const int16_t fullband, /* i : fullband flag */
- const int16_t isLfe /* i : LFE flag */
+ const int16_t fullband /* i : fullband flag */
);
void HBAutocorrelation(
@@ -7303,8 +7357,7 @@ void tcx_get_windows(
const float **left_win, /* o : left overlap window */
int16_t *right_overlap, /* o : right overlap length */
const float **right_win, /* o : right overlap window */
- const int16_t fullband, /* i : fullband flag */
- const int16_t isLfe /* i : LFE flag */
+ const int16_t fullband /* i : fullband flag */
);
void tcx_windowing_analysis(
@@ -8056,23 +8109,98 @@ void msvq_enc(
const int16_t *levels, /* i : Number of levels in each stage */
const int16_t maxC, /* i : Tree search size (number of candidates kept from */
/* one stage to the next == M-best) */
- const int16_t stages, /* i : Number of stages */
- const float w[], /* i : Weights */
- const int16_t N, /* i : Vector dimension */
- const int16_t maxN, /* i : Codebook dimension */
- int16_t Idx[] /* o : Indices */
+ const int16_t stages, /* i : Number of stages */
+ const float w[], /* i : Weights */
+ const int16_t N, /* i : Vector dimension */
+ const int16_t maxN, /* i : Codebook dimension */
+ const int16_t applyDCT_flag, /* i : applyDCT flag */
+ float *invTrfMatrix, /* i:/o expanded synthesis matrix */
+ int16_t Idx[] /* o : Indices */
);
void msvq_dec(
- const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
- const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
- const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
- const int16_t stages, /* i : Number of stages */
- const int16_t N, /* i : Vector dimension */
- const int16_t maxN, /* i : Codebook dimension */
- const int16_t Idx[], /* i : Indices */
- float *uq, /* o : quantized vector */
- Word16 *uq_ind /* o : quantized vector (fixed point) */
+ const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
+ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
+ const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
+ const int16_t stages, /* i : Number of stages */
+ const int16_t N, /* i : Vector dimension */
+ const int16_t maxN, /* i : Codebook dimension */
+ const int16_t Idx[], /* i : Indices */
+ const int16_t applyIDCT_flag, /* i : applyIDCT flag */
+ const float *invTrfMatrix, /* i: synthesis matrix */
+ float *uq, /* o : quantized vector */
+ Word16 *uq_ind /* o : quantized vector (fixed point) */
+);
+
+
+void dec_FDCNG_MSVQ_stage1(
+ int16_t j_full, /* i: index full range */
+ int16_t n, /* i: dimension to generate */
+ const float *invTrfMatrix, /* i: synthesis matrix */
+ DCTTYPE idcttype, /* i: idct type */
+ float *uq, /* o: synthesized stage1 vector */
+ Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */
+);
+
+void create_IDCT_N_Matrix(
+ float *inv_matrixFloatQ, /* i/o: RAM buffer */
+ const int16_t N, /* i: DCT length , number of time samples */
+ const int16_t n_cols, /* i: number of dct coeffs (as DCT may be truncated) */
+ const int16_t alloc_size /* i: RAM buffer size in elements*/
+);
+
+
+void dctT2_N_apply_matrix(
+ const float *input, /* i: input in fdcng or DCT(fdcng) domain */
+ float *output, /* o: output in DCT(fdcng) or fdcng ordomain */
+ const int16_t dct_dim, /* i: dct processing dim possibly truncated */
+ int16_t fdcngvq_dim, /* i: fdcng domain length */
+ const float *idctT2_N_16matrixQ16, /* i: IDCT matrix */
+ const int16_t matrix_1st_dim, /* i: */
+ DCTTYPE dcttype ); /* i: matrix operation type */
+
+void extend_dctN_input(
+ const float *input, /* i: input in fdcng domain */
+ const float *dct_input, /* i: input in dctN(fdcng) domain */
+ const int16_t in_dim, /* i: in_dim==N */
+ float *ext_sig, /* o: extended output in fdcng domain */
+ const int16_t out_dim, /* i: output total dim */
+ float *matrix, /* i: idct matrix of size N rows , n_cols columns*/
+ const int16_t n_cols, /* i: number of columns == truncation length */
+ DCTTYPE dcttype ); /* i: matrix type */
+
+int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */
+ const float *u, /* i : target */
+ const int16_t N, /* i : target length and IDCT synthesis length */
+ const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */
+ const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */
+ const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */
+ float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */
+ const float *midQ_truncQ, /* i: midQ vector */
+ const float *dct_invScaleF, /* i: global inv scale factors*/
+ const float *dct_scaleF, /* i: global scale factors*/
+ const Word16 n_segm, /* i: number of segments */
+ const Word16 *cols_per_segment, /* i: remaining length per segment */
+ const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */
+ const Word16 *entries_per_segment, /* i: number of rows per segment */
+ const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */
+ const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */
+ const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */
+ const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */
+ const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */
+ const Word16 npost_check, /*i: number of neigbours to check , should be even */
+ float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */
+ int16_t *indices_st1_local, /*o: selected cand indices */
+ float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */
+ float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */
+);
+
+int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb(
+ /* o : (updated p_max) */
+ const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */
+ const float *u, /* i : target signal */
+ const int16_t maxC_st1, /* i : number of candidates in stage1 */
+ float *dist_ptr /* i/o: updated MSE vector for stage1 */
);
void PulseResynchronization(
@@ -8204,26 +8332,21 @@ void lsf_end_enc(
int16_t *lpc_param,
int16_t *no_stages,
int16_t *bits_param_lpc,
- const int16_t coder_type_raw
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
+ const int16_t coder_type_raw,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
);
void lsf_end_dec(
- Decoder_State *st,
- const int16_t coder_type_org,
- const int16_t bwidth,
- const int16_t nBits,
- float *qlsf,
- int16_t *lpc_param,
- int16_t *LSF_Q_prediction, /* o : LSF prediction mode */
- int16_t *nb_indices
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
+ Decoder_State *st, /* i/o: decoder state structure */
+ const int16_t coder_type_org, /* i : coding type */
+ const int16_t bwidth, /* i : input signal bandwidth */
+ const int16_t nBits, /* i : number of bits used for ISF quantization*/
+ float *qlsf, /* o : quantized LSFs in the cosine domain */
+ int16_t *lpc_param, /* i : LPC parameters */
+ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */
+ int16_t *nb_indices /* o : number of indices */
,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
);
ivas_error find_pred_mode(
@@ -8521,7 +8644,7 @@ void generate_comfort_noise_dec_hf(
float **bufferReal, /* o : Real part of input bands */
float **bufferImag, /* o : Imaginary part of input bands */
HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
- const int16_t cng_flag /*i : CNG Flag */
+ const int16_t cng_flag /* i : CNG Flag */
);
void generate_masking_noise(
@@ -8545,6 +8668,17 @@ void generate_masking_noise_mdct(
HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */
);
+#ifdef JBM_TSM_ON_TCS
+void SynthesisSTFT_dirac(
+ float *fftBuffer, /* i : FFT bins */
+ float *timeDomainOutput,
+ float *olapBuffer,
+ const float *olapWin,
+ const int16_t samples_out,
+ HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */
+);
+#endif
+
void generate_masking_noise_dirac(
HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */
@@ -8984,6 +9118,7 @@ ivas_error config_acelp1(
const int16_t tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel*/
const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/
const int16_t idchan, /* i : channel id */
+ const int16_t active_cnt, /* i : Active frame counter */
const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */
const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */
const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */
@@ -9491,11 +9626,11 @@ void TonalMDCTConceal_SaveTimeSignal(
const int16_t numSamples );
void TonalMDCTConceal_Detect(
- const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
- const float pitchLag, /*IN */
- int16_t *umIndices, /*OUT*/
- const PsychoacousticParameters *psychParamsCurrent, /*IN*/
- const int16_t isLfe );
+ const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
+ const float pitchLag, /*IN */
+ int16_t *umIndices, /*OUT*/
+ const PsychoacousticParameters *psychParamsCurrent /*IN*/
+);
void TonalMDCTConceal_Apply(
TonalMDCTConcealPtr hTonalMDCTConc, /*IN */
@@ -9627,10 +9762,9 @@ int16_t getTcxonly(
);
int16_t getTnsAllowed(
- const int32_t total_brate, /* i : total bitrate */
- const int16_t igf, /* i : flag indicating IGF activity*/
- const int16_t element_mode, /* i : IVAS element mode */
- const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */
+ const int32_t total_brate, /* i : total bitrate */
+ const int16_t igf, /* i : flag indicating IGF activity*/
+ const int16_t element_mode /* i : IVAS element mode */
);
int16_t getCtxHm(
@@ -9672,8 +9806,7 @@ int16_t getIgfPresent(
const int16_t element_mode, /* i : IVAS element mode */
const int32_t total_brate, /* i : total bitrate */
const int16_t bwidth, /* i : audio bandwidth */
- const int16_t rf_mode, /* i : flag to signal the RF mode */
- const int16_t mct_chan_mode /* i : MCT channel mode */
+ const int16_t rf_mode /* i : flag to signal the RF mode */
);
int16_t getCnaPresent(
@@ -9970,6 +10103,5 @@ void init_tcx_cfg(
const int16_t infoIGFStopFreq,
const int16_t element_mode,
const int16_t ini_frame,
- const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */
- const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */
+ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */
);
diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c
old mode 100644
new mode 100755
index b0c0c61978cd93adcbd9db91a0c0bf6768d711cb..800362b576aa87dab26af8f1704ed4830b28e43b
--- a/lib_com/rom_com.c
+++ b/lib_com/rom_com.c
@@ -6036,138 +6036,297 @@ const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/size
const int16_t levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 };
const int16_t bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 };
-const float cdk_37bits_1_ivas[3072] =
-{
- 33.94763184f , 23.04196358f , 19.02036476f , 15.61426640f , 9.84622097f , 6.74968624f , 8.78495407f , 6.55844116f , 6.41478300f , 3.65438509f , 2.53205872f , 0.20947371f , -3.68736625f , -6.96642828f , -8.93218231f , -10.77195358f , -14.39207268f , -19.83006287f , -25.90260124f , -30.72169685f , -32.16821671f , -35.03061295f , -35.84580231f , -35.98442459f ,
- 23.05311012f , 15.34062386f , 11.67077923f , 9.03463936f , 7.33119154f , 6.01164532f , 4.86430264f , 3.36793089f , 2.00524712f , 1.02420747f , -0.28395364f , -1.14369977f , -2.29296756f , -3.49234462f , -4.55691099f , -5.82124615f , -7.01340151f , -8.19280529f , -9.51517677f , -11.88930511f , -12.41490746f , -13.91690540f , -15.41597271f , -17.46363640f ,
- 6.34591007f , 5.83291101f , 1.82374179f , 1.64918160f , 2.46284771f , 3.21434593f , 4.79773092f , 6.78620768f , 7.17590570f , 7.29561472f , 6.46074152f , 4.26570177f , 0.29191878f , -5.68994617f , -8.93541527f , -12.17100811f , -15.95464516f , -19.82475090f , -28.43348694f , -31.13560677f , -30.82723999f , -33.92724228f , -37.10982895f , -39.15046310f ,
- -1.97859216f , -1.29728901f , -0.68513793f , -0.59703761f , -0.19596121f , -0.48437589f , 0.41912374f , 0.32082281f , 0.42840490f , 0.33297276f , 0.00419650f , 0.25515109f , 0.07341246f , -0.05156118f , -0.17369615f , -0.39090252f , -0.53758574f , -0.97013980f , -1.37499487f , -2.59367585f , -2.67291665f , -3.56308174f , -5.09242105f , -7.33598137f ,
- 44.73780441f , 32.42730713f , 26.58676720f , 20.32800293f , 15.91747665f , 11.15012264f , 7.68650007f , 10.27048969f , 9.52919579f , 5.18821383f , 1.79746056f , -0.50318158f , -4.92894411f , -9.36254311f , -14.76678371f , -15.57420921f , -16.40379715f , -19.38558006f , -24.47130203f , -28.18117905f , -26.27810097f , -28.22804451f , -30.44338608f , -33.63451004f ,
- 27.92958260f , 17.48978424f , 9.02943993f , 2.00556946f , 0.77582097f , 1.75702107f , 2.96648121f , 4.17692900f , 5.20950508f , 4.89404440f , 3.14809656f , 2.02777839f , 0.06399647f , -2.44093847f , -5.23348236f , -7.73788691f , -9.60736561f , -11.49096489f , -12.88784599f , -14.62041187f , -14.05591011f , -13.97139835f , -13.55158806f , -12.38661575f ,
- 4.40041780f , 6.02715492f , 8.63421249f , 11.23643303f , 10.21946526f , 7.12535143f , 3.97593451f , 1.47885716f , -0.34547061f , -2.21350408f , -3.58581519f , -3.49226046f , 1.64697266f , -0.80884248f , -6.61078739f , -0.83386075f , -6.55604124f , -8.50729084f , -13.99620533f , -22.11815453f , -23.36925316f , -25.26130867f , -27.82377815f , -31.91535187f ,
- -0.31119800f , -0.22902243f , -0.18182723f , -0.17193857f , -0.22133952f , -0.25048682f , -0.19776741f , -0.20502391f , -0.15689729f , -0.08497809f , -0.04383328f , 0.10558389f , 0.22994623f , 0.27078405f , 0.26461646f , 0.21337126f , 0.07602444f , -0.07640435f , -0.08624625f , -0.01901877f , -0.37278932f , -0.55278486f , -0.50081939f , -0.57718313f ,
- 11.09673309f , 12.25163174f , 11.92947292f , 11.36766434f , 10.26155853f , 10.59420109f , 11.28228855f , 9.29032898f , 7.86474180f , 5.81516743f , 3.32581139f , 0.59270757f , -2.99105382f , -7.64252663f , -12.32353687f , -16.56275558f , -19.50693130f , -21.39342690f , -23.04017448f , -26.55841255f , -27.89498329f , -29.63920593f , -31.31513977f , -34.91411972f ,
- 14.63949299f , 9.97996807f , 7.52127123f , 6.06751871f , 4.64821386f , 3.74143553f , 3.04003358f , 2.11276221f , 1.27838099f , 0.61896890f , -0.12750353f , -0.75742245f , -1.50008225f , -2.24619722f , -2.86748576f , -3.65039921f , -4.29070568f , -5.12242794f , -6.06238365f , -7.87343836f , -7.91463709f , -9.02013016f , -10.03069305f , -11.15602875f ,
- 6.92497873f , 3.86428881f , 3.33403730f , 3.50285769f , 5.03133297f , 5.47784615f , 5.12933731f , 4.11465311f , 3.29701447f , 2.28059053f , 0.75228900f , -0.37691337f , -1.86169589f , -3.51180482f , -5.11985493f , -6.74894667f , -8.46384716f , -10.43132973f , -12.40718174f , -14.97575378f , -15.92234325f , -14.67680931f , -16.35786247f , -21.92259026f ,
- 9.03859520f , 6.23588181f , 4.69891214f , 3.76419306f , 2.91222286f , 2.25166726f , 2.02948308f , 1.35998511f , 0.74028724f , 0.50349784f , -0.12927644f , -0.45801210f , -0.88480383f , -1.52290273f , -1.84748936f , -2.22180009f , -2.73286033f , -3.21036029f , -3.73283100f , -5.33005810f , -4.96555710f , -5.72577906f , -6.40969419f , -7.14143419f ,
- 38.57890320f , 31.23274040f , 23.27908325f , 16.41319847f , 12.96908092f , 11.89987564f , 11.08193970f , 10.02814865f , 9.20901966f , 5.84658241f , 1.48919916f , -2.57032323f , -7.26163483f , -11.23550892f , -13.34285927f , -13.96859360f , -14.14492226f , -14.77427292f , -15.53306389f , -16.79932404f , -15.12855816f , -14.29256630f , -13.92473507f , -13.23437977f ,
- 23.30056572f , 13.31616783f , 10.53007698f , 7.97990513f , 7.58186388f , 6.05487776f , 6.38700247f , 4.46871328f , 3.73780274f , 1.15311646f , -0.16795112f , -1.00963080f , -2.99656630f , -4.04802418f , -5.87744474f , -7.26942492f , -8.01433468f , -8.85430908f , -8.93447399f , -10.80081940f , -10.03588772f , -9.56312180f , -9.49805927f , -9.08203316f ,
- 27.72716713f , 15.70166302f , 12.12497234f , 9.82916641f , 8.54480648f , 7.48498583f , 6.46852112f , 4.42398930f , 2.79946446f , 1.41388083f , -0.10821334f , -0.99111170f , -2.64519501f , -4.05361032f , -6.13559484f , -7.88495255f , -9.31697083f , -11.29918480f , -13.29217148f , -15.89776802f , -16.73270416f , -15.78193951f , -16.71963501f , -20.72499275f ,
- 0.09654448f , 0.05992651f , 0.07271793f , 0.06090590f , -0.01909172f , -0.02661837f , 0.00184859f , 0.00821958f , 0.01826876f , 0.00751956f , -0.02172063f , 0.03389538f , -0.00261579f , 0.00331171f , -0.00514964f , 0.00147764f , 0.00065488f , 0.01022588f , 0.00899184f , 0.02156001f , 0.01748813f , 0.01100880f , 0.01848303f , -0.00200717f ,
- 35.99007034f , 24.20862198f , 19.41031075f , 16.17420769f , 10.83719921f , 7.76013374f , 9.00250912f , 6.69725418f , 5.31352282f , 3.62490821f , 2.61681867f , 0.34085435f , -3.79527760f , -7.07614565f , -9.08049870f , -11.36665630f , -14.87462139f , -21.07974815f , -27.34793472f , -31.39986610f , -32.07981873f , -27.78803635f , -28.28388596f , -28.39242935f ,
- 13.10489750f , 20.89344025f , 21.64855194f , 15.43504715f , 10.25371075f , 3.34968066f , 1.78396285f , 0.43690255f , 0.33645880f , 2.18413949f , 0.30379224f , 2.14339352f , 2.11168623f , -3.22490501f , -5.35176468f , -6.71944952f , -7.60760832f , -7.25716639f , -9.25983143f , -10.88946342f , -12.36510563f , -14.32815361f , -16.37483597f , -19.41078377f ,
- 6.47920799f , 6.26157904f , 4.08267021f , 3.55930829f , 4.81190968f , 5.21526289f , 6.64490366f , 6.17979145f , 5.88209581f , 5.32573366f , 4.89284468f , 2.50707030f , -1.80236220f , -4.32998514f , -7.66879225f , -12.10674191f , -15.55172729f , -17.02550125f , -22.69219017f , -24.15981102f , -21.53298187f , -24.35451317f , -30.13893318f , -32.50536728f ,
- -1.27988362f , -1.28642356f , -0.84176970f , -0.75768483f , -0.62176520f , -0.62706548f , -0.67682666f , -0.86569685f , -0.75184637f , -0.68499511f , -0.73107177f , -0.44849658f , 0.61550426f , 3.18549967f , 2.15541792f , 0.41898161f , -0.96763957f , -2.28376174f , -2.21816230f , -1.44123793f , -1.10070240f , -1.48757422f , -1.94006848f , -2.04375577f ,
- 44.99568176f , 33.17905807f , 28.70528412f , 24.13981819f , 16.39375496f , 12.74631882f , 12.26308346f , 7.28386831f , 3.65083528f , 1.09594464f , -0.70640332f , -0.90420610f , -5.15652418f , -8.39927197f , -9.75838566f , -12.33563995f , -16.17337418f , -20.72145081f , -21.89005280f , -22.08177948f , -22.01576805f , -28.49225616f , -28.58443069f , -28.66851044f ,
- 27.27372360f , 16.82239342f , 9.52775478f , 4.54592752f , 2.38096476f , 1.92719686f , 2.83496809f , 3.88023591f , 4.84239244f , 4.33260632f , 2.40358329f , 1.26160026f , -0.59154904f , -2.84664989f , -5.20095921f , -7.12129021f , -8.10309982f , -9.32675076f , -10.37824821f , -12.16980839f , -11.58549690f , -11.62355518f , -11.35874844f , -10.43139648f ,
- 16.01709366f , 12.10370731f , 10.30418873f , 9.84315491f , 9.04705238f , 8.59515572f , 8.13945866f , 5.33055639f , 3.59784794f , 2.10469317f , 0.74735385f , -0.35173890f , -3.04881167f , -5.32683229f , -7.84610510f , -9.60193539f , -11.38669300f , -12.69159031f , -15.22157860f , -17.92496300f , -18.30335999f , -19.30245590f , -20.96332741f , -29.99128151f ,
- -1.49891376f , -0.94159925f , -1.59718812f , -2.73734355f , -4.95862293f , -5.62506247f , -3.84028316f , -1.86409163f , -1.10922730f , -0.37675977f , 0.54625863f , 1.08458769f , 2.59583378f , 4.74187803f , 4.85828352f , 2.72942448f , 1.21778154f , 0.61253220f , -0.12000842f , -0.42560402f , -0.47587356f , -0.59399730f , -0.54576296f , -0.64007539f ,
- 27.21817589f , 25.04722404f , 19.98665237f , 18.40707970f , 15.35737038f , 12.12910748f , 10.67379093f , 8.65770626f , 6.83053064f , 4.53696156f , 1.99311268f , -2.65666389f , -5.61365652f , -8.72017097f , -11.54872608f , -14.03052521f , -17.60883713f , -18.92860985f , -19.26733208f , -21.02047348f , -20.41023064f , -24.96704483f , -27.28151131f , -32.13149261f ,
- 16.58616257f , 6.07702732f , 3.20051527f , 2.19352865f , 1.25951850f , 0.52847487f , 0.36339840f , 1.22322381f , 1.40252435f , 0.78051162f , -0.14960484f , -0.19245568f , 0.80768329f , -0.03997936f , -0.45896211f , -1.94675004f , -3.57758331f , -4.74786758f , -6.30557394f , -7.96810246f , -7.85797882f , -8.40102768f , -8.70696068f , -14.50718975f ,
- 5.83877993f , 8.64909840f , 10.36191940f , 10.75121212f , 10.87299442f , 9.20523739f , 6.57943916f , 2.45789552f , 0.32793057f , -0.19492692f , -0.50667870f , -0.82865268f , -3.29967546f , -5.41881037f , -5.00245380f , -7.02534580f , -7.16695213f , -10.07062340f , -13.29201317f , -15.16228962f , -14.82801533f , -13.98322010f , -16.56229019f , -25.20559120f ,
- 6.31290579f , 4.29846334f , 3.09123778f , 2.35388660f , 2.08894801f , 1.51627553f , 1.61039710f , 1.01586986f , 0.50589812f , 0.34378609f , -0.11773424f , -0.29939151f , -0.59060657f , -1.10041618f , -1.30399191f , -1.66196144f , -2.00707245f , -2.30241942f , -2.72166705f , -4.15126562f , -3.61430144f , -4.17390060f , -4.64368582f , -5.19181061f ,
- 45.07491302f , 31.96612358f , 24.59359169f , 15.32010937f , 11.66156387f , 10.47190285f , 8.21482182f , 6.91866159f , 6.46052694f , 2.31078482f , -0.97819418f , -3.39280653f , -5.75906181f , -7.82967377f , -8.74781990f , -9.47419548f , -9.85650921f , -10.05874729f , -10.25747013f , -11.21096134f , -9.55652142f , -8.75567627f , -8.43642902f , -7.74934912f ,
- 29.56493187f , 22.29573250f , 13.46729183f , 9.18490410f , 7.02603865f , 5.38271475f , 3.58497858f , 2.35314894f , 2.17064548f , 0.43121719f , -0.60757560f , -1.00088501f , -1.82668996f , -2.00680733f , -4.21636438f , -5.02670193f , -6.26371956f , -6.65761995f , -7.37742567f , -9.00110912f , -9.04595757f , -10.59253120f , -12.24499798f , -13.79708004f ,
- 18.81605339f , 15.10544109f , 13.69033337f , 12.55228615f , 12.10694313f , 9.87893867f , 7.45830679f , 3.83573604f , 1.58222044f , 0.19975230f , -0.48743680f , -1.03465378f , -3.26008105f , -6.03337908f , -6.72951269f , -8.16258240f , -9.35424900f , -11.36496258f , -14.10615826f , -16.52154922f , -15.71789932f , -14.28701687f , -15.86503506f , -21.98985291f ,
- 0.58833683f , 1.93554544f , 1.01621759f , 0.17751050f , 1.44273913f , 1.63168383f , 0.87785423f , 0.63285774f , 0.44776136f , 0.05703505f , -0.13712768f , 0.28278413f , -0.80131322f , -0.86604142f , -1.59806752f , -0.93005019f , -1.04011548f , -0.89366192f , -0.64847207f , -0.61214101f , -0.55340266f , -0.16991313f , -0.15702423f , -0.17067310f ,
- 39.23077011f , 28.73466682f , 25.17003059f , 18.13150215f , 12.30397224f , 10.44106960f , 8.78819275f , 7.09760094f , 4.76503944f , 3.22303295f , 1.15491402f , -0.03009734f , -3.15244532f , -7.48607492f , -9.52877903f , -12.40654850f , -15.16987514f , -18.84217262f , -22.60379219f , -26.15986252f , -28.55947685f , -31.27477455f , -36.50263596f , -45.15930557f ,
- 17.17733002f , 11.81043625f , 8.99961948f , 7.02285528f , 5.70868826f , 4.43369055f , 3.63820124f , 2.49104285f , 1.49823487f , 0.74478340f , -0.16968371f , -0.91984361f , -1.82045591f , -2.59034872f , -3.43512726f , -4.35373259f , -5.22545052f , -6.16511250f , -7.18896103f , -9.18914032f , -9.45307922f , -10.67428303f , -11.84619045f , -13.22418404f ,
- -0.55165589f , 0.54447228f , -1.45378113f , 0.62164629f , 1.57039273f , 1.95998776f , 2.55171132f , 3.54153609f , 4.37655210f , 5.13829708f , 4.63276052f , 3.44003415f , 1.41755366f , -1.65012610f , -4.90518045f , -8.74811363f , -13.32540989f , -16.67502213f , -25.04341888f , -28.74816895f , -26.61729050f , -30.89074135f , -36.89068222f , -40.54713821f ,
- 0.52585047f , 0.25778684f , -0.68478346f , -0.63753521f , -0.85982674f , -0.45736870f , -0.39972550f , 0.19919159f , 0.21982291f , -0.21426015f , -0.17481731f , -0.30233619f , 0.35445356f , 0.53019482f , 0.62357306f , 0.10003661f , 0.38106197f , 0.59916449f , 0.29353949f , 0.19449981f , -2.91975641f , -2.99291539f , -3.24024558f , -3.85247374f ,
- 47.57529449f , 35.40103149f , 28.51466560f , 21.36822510f , 16.31501770f , 12.05416298f , 8.92814922f , 10.24798870f , 9.38683319f , 5.06438446f , 1.55697119f , -0.90166509f , -5.27530479f , -10.13637447f , -14.91060257f , -15.56597614f , -16.76358414f , -19.75214577f , -22.57003212f , -24.67880249f , -22.22905731f , -23.92941093f , -26.02715302f , -29.14421463f ,
- 32.45030594f , 18.47647858f , 10.55478764f , 2.66163707f , 0.48469192f , 0.89728785f , 2.66320086f , 4.46394491f , 5.75276375f , 5.15140963f , 3.30917573f , 2.07156634f , 0.32162985f , -2.37937927f , -5.25204325f , -7.75560665f , -9.72864151f , -11.49621296f , -12.90788174f , -14.53592110f , -14.00264931f , -13.90744686f , -13.50663280f , -12.31781673f ,
- 15.12892532f , 10.85012150f , 9.24257946f , 7.17304945f , 5.39838934f , 4.54048777f , 4.45172882f , 4.02888584f , 4.08525467f , 3.34242988f , 1.18552935f , 0.14054979f , -1.31041145f , -4.10797310f , -6.60405207f , -7.35080433f , -7.80001211f , -10.14729309f , -14.88454437f , -18.54398346f , -20.49944305f , -23.77704430f , -28.38242531f , -32.21464920f ,
- -0.70120311f , -0.36598748f , -0.27498749f , -0.18644568f , -0.13108316f , -0.05633634f , -0.12568842f , -0.05810567f , 0.00805399f , 0.04813070f , 0.01124786f , 0.06457995f , 0.05968979f , 0.04663355f , 0.04679099f , 0.04774757f , 0.03833918f , -0.06331048f , -0.10397947f , 0.00857244f , 0.29188818f , 0.54560822f , 0.49374610f , -0.00754885f ,
- 24.01022911f , 20.44940186f , 18.33339310f , 13.47519684f , 11.34601212f , 10.42150116f , 9.00321579f , 7.93997908f , 7.78757143f , 4.54246807f , 3.10096765f , -1.79380953f , -4.57441616f , -8.99514294f , -11.16653728f , -12.33127975f , -15.28052711f , -18.40486145f , -21.08405685f , -23.96353531f , -24.15535736f , -27.96574211f , -31.00701714f , -35.18267441f ,
- 10.95846939f , 7.75293112f , 5.94634438f , 4.67962313f , 3.86481786f , 3.06800008f , 2.68010044f , 1.77875984f , 1.08723342f , 0.60881591f , -0.11699903f , -0.66425866f , -1.27388847f , -1.93990111f , -2.43955994f , -3.04650831f , -3.60661364f , -4.21451235f , -4.87673521f , -6.57435703f , -6.46493149f , -7.41116762f , -8.24285698f , -8.84710217f ,
- 16.32924080f , 6.70306444f , 4.40889025f , 4.39005423f , 5.66961336f , 5.49213505f , 5.14747572f , 4.57054806f , 3.82850742f , 2.47304583f , 0.96936250f , -0.07546291f , -1.78923011f , -3.94788241f , -5.62404537f , -7.41395044f , -9.30011559f , -11.32884693f , -13.38846397f , -15.90376568f , -16.61722183f , -15.37379074f , -16.91991615f , -22.64369392f ,
- 20.29391861f , 10.14759159f , 7.41714382f , 5.43669033f , 4.22476673f , 3.05457902f , 2.12789893f , 1.46166980f , 0.68013304f , 0.10416872f , -0.62377477f , -0.69513589f , -1.11597610f , -1.73416364f , -2.00164723f , -2.48846936f , -2.99404836f , -3.36779451f , -4.50076723f , -6.23718977f , -6.32519245f , -7.00517225f , -7.63285732f , -8.34685898f ,
- 44.62683868f , 33.65060043f , 28.74439240f , 23.09117126f , 16.70447159f , 13.63468075f , 10.38835239f , 5.27151346f , 3.37364483f , 0.80086398f , -1.61115754f , -1.84962809f , -4.63047361f , -7.54744434f , -8.66370773f , -11.56917572f , -14.30193806f , -18.52358246f , -19.55438995f , -20.00398636f , -19.80403900f , -20.08826447f , -20.32636070f , -20.57789421f ,
- 25.43884087f , 14.71314049f , 10.84564495f , 7.29425287f , 5.99180174f , 4.52135897f , 4.43509150f , 2.96715736f , 2.20721149f , 0.85104460f , -0.42902783f , -1.01505911f , -1.67976689f , -3.03431702f , -4.04744673f , -5.05236149f , -5.71568680f , -7.14737368f , -7.96077490f , -9.41807270f , -8.88839054f , -8.62583065f , -8.43768692f , -8.79677773f ,
- 33.08629990f , 21.98393631f , 16.71452332f , 13.11685467f , 10.53023720f , 8.59362793f , 6.77428055f , 4.80111885f , 2.96947551f , 1.50105977f , -0.29485464f , -1.76483214f , -3.38473845f , -5.02232218f , -6.55174637f , -8.24214268f , -9.90916348f , -11.56876373f , -13.40682983f , -16.22795105f , -17.44435501f , -19.50963020f , -21.48133469f , -22.37619972f ,
- 0.14234349f , 0.00043129f , -0.46088508f , -0.47227818f , 0.19577537f , 0.57165289f , 0.14063163f , -0.08314086f , -0.17897955f , 0.26915708f , 0.29296365f , 0.25751004f , -0.29272652f , -0.35612249f , -0.45116535f , -0.22750567f , -0.13805020f , -0.08609761f , -0.08811182f , -0.00370739f , 0.04999773f , 0.10020024f , 0.12026346f , 0.12320870f ,
- 37.20217514f , 25.50048447f , 26.05090904f , 21.39400101f , 14.80546665f , 10.78633976f , 9.48393726f , 6.51000643f , 4.64587116f , 2.54244065f , 1.88398576f , -0.17826277f , -3.92847228f , -7.94585609f , -9.83112335f , -12.51981831f , -16.25451469f , -22.52105331f , -26.16354942f , -28.17800331f , -28.44519234f , -28.99005890f , -29.07491684f , -29.13504791f ,
- 22.87589455f , 20.69346428f , 16.08814049f , 12.09293556f , 8.58536339f , 6.12085295f , 5.03096294f , 2.46971536f , 1.38820446f , 0.41556263f , -0.71674269f , -1.87001503f , -1.97099841f , -3.12624931f , -4.61008024f , -5.90624523f , -5.81033182f , -7.63588858f , -9.32999802f , -11.98378181f , -13.66734123f , -15.22948647f , -17.72668266f , -22.15813255f ,
- 17.13776016f , 7.48015785f , 3.87183666f , 3.80275106f , 3.69309711f , 2.47135592f , 3.28866863f , 5.23638964f , 5.97343540f , 3.02334547f , 1.66290724f , 1.17763150f , 0.56503248f , -4.12660456f , -4.84892178f , -8.03931713f , -10.07701778f , -12.74638939f , -15.61114883f , -18.82812119f , -20.06874847f , -20.77385521f , -23.02597237f , -28.41068077f ,
- -0.68962491f , -0.67818958f , -0.47791985f , -0.18780768f , 0.07656835f , 0.29909450f , 0.36705506f , 0.60864949f , 0.66434783f , 0.54813319f , 0.31165063f , 0.41151917f , 0.27194378f , -0.09006688f , -0.59337950f , -1.27168393f , -1.60383165f , -2.03537226f , -1.01842117f , -1.12101495f , -2.20869303f , -2.13650179f , -1.40165854f , -1.00871158f ,
- 49.11537170f , 34.27339554f , 29.03029442f , 23.60639191f , 19.18561935f , 16.01621819f , 10.65990448f , 5.50423098f , 3.26754117f , 0.54238629f , -2.50046039f , -1.85086572f , -5.88433218f , -8.55415058f , -9.42830467f , -11.97149277f , -14.98629475f , -17.55759621f , -17.94509125f , -18.13786888f , -17.94290543f , -28.52441216f , -28.69857025f , -28.89863968f ,
- 32.58505249f , 18.45134735f , 10.62341118f , 4.82959938f , 2.78050184f , 2.30071044f , 2.89666629f , 3.55971622f , 4.36246777f , 3.80749893f , 2.22673583f , 1.03990865f , -0.54025501f , -2.73137355f , -4.92715406f , -6.82418060f , -7.95124388f , -9.07779884f , -9.96023846f , -11.46563911f , -10.75256252f , -10.58728790f , -10.22681522f , -9.05898476f ,
- 16.11109161f , 14.82219410f , 13.34882832f , 7.98469877f , 9.43520164f , 7.92174578f , 5.07156849f , 3.38034701f , 3.45362854f , 2.55894756f , 0.36423218f , -0.89059198f , -2.32811356f , -5.22609854f , -8.06139755f , -8.08888912f , -7.59058094f , -9.63050747f , -13.39019203f , -16.84990501f , -16.90269279f , -20.11418533f , -23.25974846f , -26.99926376f ,
- -1.15594578f , -1.16174018f , -1.02029443f , -0.85063583f , -0.73866522f , -0.75481141f , -0.86772621f , -1.00807703f , -1.13209546f , -1.11179471f , -1.20630574f , -1.01733243f , 0.24630366f , 3.09700346f , 3.12491417f , 1.54673541f , -0.17814836f , -1.87219131f , -0.85840708f , 1.11508834f , 1.62732244f , 0.97436380f , -0.19077510f , -0.80510545f ,
- 32.42321777f , 27.32720947f , 20.86049461f , 15.20588684f , 12.79125309f , 12.29267693f , 12.11658001f , 11.01210213f , 10.89878845f , 7.15270519f , 2.06876802f , -2.13045192f , -6.80808592f , -11.65817642f , -14.62570095f , -16.24762154f , -16.86284065f , -17.20292854f , -18.81791878f , -20.65732384f , -19.57567215f , -19.88597488f , -22.49367523f , -26.33296204f ,
- 25.36096573f , 13.31346798f , 8.91108418f , 5.01322508f , 3.48370409f , 2.18634796f , 2.12754703f , 1.25077868f , 0.72989434f , 0.29854974f , -0.73259068f , -0.59268522f , 0.14181496f , -0.68818730f , -1.80540454f , -2.34638786f , -4.05338144f , -5.46354723f , -7.10088396f , -9.38928127f , -8.44892311f , -9.48880005f , -9.86396503f , -10.07871723f ,
- 7.17678213f , 9.03277683f , 10.13266754f , 10.24296856f , 10.17098331f , 8.09959507f , 5.65843153f , 1.62803376f , -0.36960009f , -0.74838853f , -0.79447383f , -0.80214244f , -2.22858644f , -4.54312086f , -4.46352482f , -5.71911240f , -5.88809395f , -8.41744232f , -10.94176769f , -12.21683311f , -12.21341038f , -11.48782635f , -14.09292316f , -23.15090752f ,
- 18.21541405f , 14.70297527f , 14.13050365f , 12.94417000f , 11.81984806f , 9.76036167f , 6.53366423f , 4.50655460f , 0.83037621f , -0.42548206f , -1.35710704f , -2.34608483f , -3.56638503f , -5.17272615f , -5.63396835f , -7.03527308f , -7.91377544f , -8.77217388f , -10.20801735f , -12.21526527f , -12.12676907f , -11.62418461f , -12.46908951f , -15.99641514f ,
- 44.82578278f , 29.92639542f , 27.50827789f , 23.80286217f , 17.65353203f , 14.31119919f , 9.68513775f , 4.39934206f , 2.73908210f , 0.84895563f , -2.34653950f , -2.60779619f , -5.48460007f , -7.85637569f , -8.35718441f , -10.63293934f , -12.35181427f , -14.18777370f , -14.52088261f , -15.19802761f , -14.50250244f , -14.72802734f , -15.11614609f , -15.65816784f ,
- 22.81040764f , 18.14611626f , 15.16109562f , 7.86977768f , 8.17525578f , 4.43149519f , 3.84347200f , 1.57480264f , 0.94041783f , 0.21524446f , -0.86289990f , -1.21070933f , -2.15402818f , -2.98346281f , -3.67899656f , -4.07589436f , -4.21469736f , -4.80487633f , -5.08027840f , -6.07973146f , -5.15939760f , -4.76911354f , -4.57167721f , -4.45344400f ,
- 24.49489975f , 17.31044769f , 13.22760391f , 10.45895958f , 8.42623138f , 6.75540257f , 5.42271709f , 3.69801641f , 2.30738783f , 1.11391723f , -0.26593676f , -1.45248365f , -2.67149425f , -4.03488445f , -5.14615870f , -6.45010090f , -7.70261431f , -9.10985470f , -10.61737823f , -13.08172894f , -13.92179298f , -15.81127357f , -17.59627724f , -19.73897552f ,
- 8.98934364f , 4.76031303f , 2.62020183f , 1.48485959f , 0.28737816f , 0.05866807f , -0.01028116f , -0.07208341f , -0.13242376f , -0.04422715f , -0.09028641f , -0.04876806f , 0.10697100f , 0.04797191f , 0.01100808f , -0.07014611f , -0.04378227f , -0.04009765f , -0.17876917f , -0.72032106f , -0.11678807f , -0.05392319f , -0.07008670f , -0.21385938f ,
- 36.29371643f , 24.65291214f , 21.01904678f , 16.67200279f , 11.48446560f , 8.12246799f , 9.78220177f , 7.74590874f , 5.69669485f , 4.02027988f , 3.36120009f , 0.58418810f , -3.89836407f , -7.63864374f , -10.03672886f , -12.67631626f , -16.54735374f , -22.06600380f , -27.53655815f , -31.70346832f , -32.28223419f , -33.58357620f , -33.78388596f , -33.85955811f ,
- 20.20799255f , 13.75940609f , 10.45750713f , 8.23875809f , 6.45997095f , 5.16953897f , 4.34209776f , 2.95543051f , 1.74270713f , 0.87219697f , -0.25581297f , -1.09575856f , -2.07853103f , -3.06528211f , -3.94644260f , -5.01998711f , -6.08012724f , -7.13329268f , -8.25736523f , -10.45005131f , -10.79236698f , -12.32848263f , -13.70973110f , -15.25794792f ,
- 7.88285303f , 6.51488161f , 3.92537451f , 4.23367739f , 4.89059639f , 5.43539810f , 6.37946939f , 8.50651741f , 9.33964443f , 8.69559956f , 6.91200352f , 3.63401532f , -0.99519163f , -7.15117836f , -11.47043896f , -15.28446960f , -18.89196777f , -23.08573532f , -28.80813408f , -30.38180542f , -29.53565407f , -31.03279877f , -32.39319229f , -33.27596664f ,
- 0.40477216f , 0.24463084f , -0.76651365f , -0.71309596f , -0.87443089f , -0.30846810f , -0.39305758f , 0.23431541f , 0.22700633f , -0.23816873f , -0.20784868f , -0.32913551f , 0.34776384f , 0.50111002f , 0.59345955f , 0.10497253f , 0.34248179f , 0.54556167f , 0.25770640f , 0.16739839f , -4.25213432f , -4.33188486f , -4.59072590f , -5.18169022f ,
- 44.52682495f , 33.44413376f , 27.75477028f , 20.87782860f , 15.96038628f , 11.38267708f , 8.04888916f , 10.34346294f , 9.36942101f , 5.06397772f , 1.65765107f , -0.60627878f , -5.02781725f , -9.60684490f , -14.71248531f , -15.51352501f , -16.35951424f , -19.44139671f , -23.93828964f , -27.02204704f , -23.39621544f , -25.11229706f , -27.06189728f , -29.88434029f ,
- 30.53590775f , 18.24347496f , 10.48498344f , 3.34677172f , 1.29623032f , 1.39035857f , 2.45928121f , 3.70242572f , 4.65490055f , 4.28991556f , 2.71830440f , 1.69632769f , 0.22320883f , -2.12041640f , -4.55487108f , -6.90537930f , -8.85028553f , -10.44450092f , -11.88594723f , -13.62341404f , -13.19523811f , -13.18412113f , -12.81897163f , -11.68476582f ,
- 5.23515940f , 11.02192688f , 12.84599209f , 11.99070740f , 7.98806524f , 4.52272415f , 4.08583927f , 2.00564265f , -0.15996964f , -2.10115862f , -4.96646547f , -5.90554714f , 4.82052660f , 0.89168262f , -6.95808125f , 2.50679994f , -6.73005676f , -6.52649450f , -14.76829720f , -15.44077110f , -21.42759705f , -23.35196304f , -25.43357277f , -27.50794983f ,
- 1.84942830f , 0.77272046f , 0.24707772f , -0.08593588f , -0.23682129f , -0.24805132f , -0.09850720f , -0.04999159f , -0.00995130f , 0.02216339f , 0.08926903f , 0.20275106f , 0.22498472f , 0.26662621f , 0.16996276f , -0.06895026f , -0.26348418f , -0.41196167f , -0.47150335f , -0.43742141f , -0.53234649f , -0.56433624f , -0.59429443f , -0.65639752f ,
- 14.08870220f , 13.32911205f , 10.19654274f , 6.80626822f , 6.89704180f , 6.85630465f , 6.28267908f , 6.48725128f , 6.74154425f , 5.72381783f , 4.45444155f , 2.14331675f , -1.56116712f , -5.51466084f , -8.73317051f , -13.38193130f , -16.39547157f , -18.36110878f , -22.47372246f , -24.78481865f , -23.78740883f , -25.83082390f , -28.30295181f , -29.63710213f ,
- 12.11153984f , 11.18265629f , 8.56032085f , 6.07614088f , 4.32917595f , 3.62714767f , 2.88151503f , 0.00486909f , 0.16551718f , 0.11766627f , -1.01007175f , -1.58863187f , -0.66722620f , -1.26095092f , -2.03257895f , -2.68355250f , -1.88288093f , -2.89664102f , -3.82705688f , -5.15467978f , -5.96337652f , -7.68645287f , -9.75820160f , -14.60475540f ,
- 10.68691158f , 5.49249125f , 4.08632946f , 3.73180628f , 5.00127029f , 5.47980690f , 5.41938591f , 4.71624136f , 3.67419004f , 2.41826725f , 0.86259502f , -0.22994517f , -1.90842390f , -3.87555194f , -5.49712229f , -7.17735624f , -8.88335800f , -10.96466255f , -12.92337704f , -15.48291206f , -16.37232208f , -15.13042545f , -16.82096863f , -22.42011452f ,
- 15.85285378f , 10.13984489f , 8.02905941f , 4.50967121f , 2.95999980f , 2.60214114f , 0.53660029f , 0.86555701f , 0.22102003f , -0.33034071f , -0.07463158f , 0.21286504f , -0.93098062f , -1.75468397f , -1.58335686f , -1.24065292f , -1.48353171f , -1.76630950f , -2.04288220f , -3.12292504f , -2.45715189f , -2.74685717f , -3.16709018f , -5.91369343f ,
- 40.10007477f , 32.17766190f , 23.94418526f , 17.08811951f , 13.37568951f , 12.24086761f , 11.66988850f , 10.55005550f , 9.33296108f , 5.75441313f , 1.48114145f , -2.81252980f , -7.79981041f , -11.41279602f , -13.67298222f , -14.21839428f , -14.48849964f , -15.18556213f , -15.61604404f , -16.76811600f , -15.01851368f , -14.17923927f , -13.81790257f , -13.10479736f ,
- 24.85771179f , 14.51553345f , 11.72882080f , 8.90813828f , 8.43283081f , 6.32554102f , 6.22324610f , 3.79361701f , 4.27097321f , 0.56961524f , -1.24056125f , -1.41678429f , -3.11242867f , -4.09969568f , -5.68787241f , -6.75505066f , -7.30343008f , -8.00887489f , -7.82331944f , -9.66470909f , -8.76680851f , -8.39351845f , -8.12993431f , -7.16756201f ,
- 28.97707558f , 19.26215744f , 14.32650089f , 11.15691090f , 8.93038845f , 7.45748949f , 5.97504330f , 4.08204174f , 2.51096678f , 1.17593741f , -0.48250875f , -1.45828211f , -2.81734180f , -4.23465633f , -5.64280844f , -7.11844778f , -8.37782097f , -10.01226807f , -11.81233501f , -14.42724609f , -15.63475609f , -17.08984566f , -18.90253639f , -21.68543816f ,
- -0.37224483f , -0.21122639f , 0.15951714f , 0.02087032f , 1.22483158f , 0.00348772f , -0.18272802f , -0.44353136f , -0.08490600f , -0.11233181f , -0.16806731f , -0.22428627f , -0.01276036f , 0.06931113f , 0.01195190f , -0.11203818f , 0.03106703f , 0.26289529f , 0.23697743f , 0.22796448f , 0.04144126f , 0.09472501f , 0.14482924f , 0.17954086f ,
- 39.73665619f , 26.81943703f , 21.29967880f , 18.16204262f , 13.44168472f , 11.03711700f , 11.62625027f , 7.02647495f , 4.79233932f , 3.35499501f , 2.79116821f , -0.41337949f , -4.65079498f , -8.28630638f , -10.48777294f , -13.31785393f , -16.91392136f , -22.94918823f , -27.85824203f , -29.88930130f , -30.09802246f , -28.58382988f , -28.66120720f , -28.70516014f ,
- 19.10952950f , 22.74327850f , 23.97905540f , 21.18729591f , 11.64360809f , 6.94751596f , 4.65807104f , 0.78640783f , -0.24381419f , 1.02887869f , 0.82303244f , -0.54234630f , -0.94865251f , -1.77358091f , -5.30440760f , -8.68288422f , -8.39182663f , -8.75503826f , -11.02817535f , -13.34524441f , -13.31265545f , -13.47730160f , -16.70124626f , -23.44244576f ,
- 5.32545233f , 7.05786848f , 6.26387453f , 5.78526258f , 5.88421535f , 5.73053551f , 5.83421803f , 6.25754404f , 5.95633888f , 5.21652365f , 3.57697511f , 1.02363062f , -2.68831611f , -5.48803329f , -7.67456436f , -10.52217293f , -13.10689449f , -14.01679230f , -18.51670074f , -20.16453171f , -19.27928925f , -21.94375420f , -27.47334480f , -29.79807281f ,
- -2.60717487f , -1.83319664f , -1.31210554f , -0.76391363f , -0.20487705f , -0.30073228f , -0.07237651f , 0.09489144f , -0.11017539f , -0.08628271f , -0.06826403f , 0.06346101f , 0.18584041f , 0.16889001f , 0.13889854f , 0.14046463f , 0.05026200f , -0.19259109f , 0.12724322f , 0.05020098f , -0.06773847f , -0.35614878f , -0.63952541f , -0.86939591f ,
- 43.34894180f , 31.48630524f , 28.12536430f , 24.63106918f , 16.25746918f , 12.06399059f , 10.17741966f , 6.35993147f , 4.57542324f , 1.64055872f , 0.70682496f , -0.49986696f , -4.10422993f , -8.01978779f , -9.94273472f , -12.91026783f , -16.30473137f , -20.63467598f , -21.94548988f , -22.36483765f , -22.45355415f , -22.54744720f , -22.58737946f , -22.65038681f ,
- 30.95190620f , 18.16899109f , 9.72149658f , 4.10552931f , 2.30458689f , 2.12724614f , 2.85707808f , 4.13076019f , 5.31916714f , 4.81190920f , 3.00600863f , 1.67334628f , -0.53532135f , -3.10476613f , -5.73052549f , -7.79181433f , -9.06767464f , -10.22359562f , -11.19510365f , -12.66148758f , -12.00313091f , -11.91836929f , -11.49621868f , -10.27651405f ,
- 19.52749825f , 13.26932335f , 10.77497768f , 9.87707806f , 8.94397163f , 8.45470905f , 7.96926117f , 5.37859535f , 3.56771731f , 1.95985627f , 0.70804149f , -0.21590416f , -3.00161719f , -5.06863308f , -7.59307814f , -9.56244850f , -11.54047012f , -12.52976322f , -14.91271400f , -17.65096283f , -17.99032593f , -18.96465111f , -20.50286484f , -29.15997505f ,
- -0.41770393f , -0.57753342f , -1.20728409f , -2.88331747f , -5.34745789f , -6.08694220f , -3.71453929f , -2.12419772f , -1.18535638f , -0.59698033f , 0.42981535f , 1.32175910f , 2.83778572f , 4.84865475f , 5.04370260f , 3.07809186f , 1.49566460f , 0.65009278f , 0.04541466f , -0.15811041f , -0.29866409f , -0.41704908f , -0.46928179f , -0.48526672f ,
- 30.59598160f , 24.69124985f , 19.35356522f , 17.04518127f , 12.47758865f , 9.30305386f , 9.31541252f , 8.18128777f , 5.78386831f , 3.40561008f , 1.86525965f , -2.05713415f , -3.91759825f , -7.05117083f , -9.88467789f , -11.80012417f , -15.62137604f , -16.45769119f , -16.11259651f , -17.03925705f , -16.63202477f , -20.41814423f , -23.23829842f , -27.13690567f ,
- 22.04087639f , 9.82030296f , 6.62304544f , 3.54571700f , 2.28869224f , 1.43831360f , 1.01925826f , 0.60685647f , 0.52726758f , 0.28217983f , -0.60519862f , -0.40057555f , 0.33728161f , 0.16425660f , -0.30877599f , -1.72851086f , -3.62104511f , -5.35534239f , -7.36662674f , -9.61280251f , -9.84184837f , -9.76028061f , -10.30779839f , -12.96220016f ,
- 7.59925270f , 9.89327908f , 11.32660198f , 11.55432892f , 11.11032295f , 9.16942692f , 6.63248444f , 2.69755864f , 0.57976800f , 0.05171308f , -0.55509138f , -1.34203660f , -3.50475025f , -5.48786688f , -5.35051298f , -6.98438931f , -7.01662779f , -9.47507668f , -12.24847126f , -13.41042137f , -12.92720699f , -12.06966019f , -14.46927357f , -23.34392357f ,
- 6.96612597f , 5.00931787f , 3.76138091f , 3.18334484f , 2.03293252f , 1.34288895f , 1.58868873f , 1.00840783f , 0.40005356f , 0.06600340f , -0.13207078f , -0.20888096f , -0.49867839f , -0.91563702f , -1.39049554f , -1.52579367f , -1.76741624f , -2.06173539f , -2.48300815f , -3.86886954f , -3.38073707f , -3.92400837f , -4.47162819f , -5.09745169f ,
- 47.14703751f , 30.38273811f , 21.96264458f , 14.39871597f , 10.23386383f , 8.95710278f , 6.93860054f , 5.62253952f , 4.24646330f , 1.48851633f , -1.20669615f , -3.14844489f , -5.07624435f , -6.20617819f , -6.85559320f , -7.39740086f , -7.59652758f , -7.76342344f , -7.96090555f , -8.85080433f , -7.36783743f , -6.51624918f , -6.18211889f , -5.45559025f ,
- 33.12013626f , 16.84858894f , 12.65143013f , 8.74576950f , 7.71503162f , 5.75152826f , 5.57081461f , 3.33705091f , 2.19604564f , 0.46275416f , -1.08203483f , -1.74722302f , -2.23058796f , -3.73542142f , -4.79898882f , -5.51074600f , -5.92822361f , -7.29669523f , -7.87425613f , -9.19938278f , -8.26733780f , -7.79288721f , -7.17766953f , -6.91147518f ,
- 22.72534180f , 16.73917770f , 15.96501827f , 15.48456001f , 14.21817970f , 11.09321880f , 7.22196627f , 3.27875924f , 0.86349517f , -0.35276374f , -0.96022642f , -1.97590554f , -4.21987820f , -5.87952375f , -6.43021441f , -8.40103912f , -8.45606804f , -10.49744606f , -12.33858109f , -13.72036362f , -13.35521221f , -11.95208740f , -13.21454906f , -18.77292252f ,
- 0.89415503f , 2.55427527f , 2.19861484f , 1.76997423f , 1.68467879f , 1.11462021f , 0.72990263f , 0.68752390f , 0.55451417f , 0.46162665f , -0.10212867f , 0.08975709f , -1.02394462f , -0.74809217f , -1.54942429f , -0.89107299f , -1.00796068f , -0.70048058f , -0.53988647f , -0.51691598f , -0.45218167f , -0.00372395f , -0.01138951f , -0.04693869f ,
- 42.55582428f , 31.86493301f , 25.10536003f , 19.38906479f , 13.20624542f , 10.70058155f , 8.71647072f , 6.43070078f , 4.15740585f , 2.91404939f , 0.74730510f , -0.24514204f , -2.99233270f , -7.08516312f , -9.33087540f , -12.22711372f , -14.99213314f , -18.51732445f , -22.07689285f , -25.69321823f , -27.76980782f , -30.33328629f , -35.40525818f , -43.80059433f ,
- 17.17425156f , 15.04495525f , 13.74315548f , 9.50892258f , 6.63219738f , 3.98290706f , 2.99513650f , 0.72657228f , 0.40510508f , -0.37188929f , -0.42712122f , -0.44993770f , -0.85454285f , -2.16015244f , -2.33109641f , -3.77121162f , -4.37596750f , -5.36669207f , -5.62877464f , -7.46640444f , -6.83423185f , -7.70908165f , -7.39536428f , -11.27804089f ,
- 2.52714753f , 2.49289870f , -0.13784029f , -0.12163699f , 1.75517499f , 2.99553514f , 4.49444866f , 5.77764273f , 6.11328125f , 5.99628973f , 5.25506210f , 3.72307754f , 0.61337721f , -3.33252883f , -7.41996574f , -11.31843758f , -14.65295410f , -17.27932930f , -23.77917290f , -26.47192383f , -24.69055176f , -28.23755074f , -33.64114761f , -36.70846558f ,
- 0.26897269f , 0.29896018f , -0.59694219f , -0.58600718f , -0.59563857f , -0.14940611f , -0.22029303f , 0.11002608f , 0.09471268f , -0.08665721f , -0.04912328f , -0.19163008f , 0.17407294f , 0.29674888f , 0.32706621f , 0.06863109f , 0.22149041f , 0.41376126f , 0.17968638f , 0.12345629f , -1.91504288f , -1.83034718f , -1.79148746f , -2.04030466f ,
- 46.61645508f , 34.87612534f , 28.30528450f , 21.24158478f , 16.02840996f , 11.78007889f , 8.85846806f , 10.30448627f , 9.45803833f , 5.21806145f , 1.68192971f , -0.74372375f , -5.16118431f , -10.11946869f , -14.85457230f , -15.61676884f , -16.83375549f , -19.81565475f , -22.77931786f , -24.86022949f , -19.57012367f , -21.15659714f , -22.98768044f , -25.62114906f ,
- 33.50306320f , 20.94828606f , 11.29131508f , 3.76779723f , 1.88436973f , 2.24041677f , 3.07290483f , 3.88969660f , 4.82355642f , 4.29338741f , 2.81698418f , 1.50617039f , -0.22714122f , -2.44629383f , -5.18593407f , -7.46794319f , -9.20017433f , -10.38420296f , -11.62056923f , -13.33395100f , -12.78791428f , -12.68239403f , -12.26134491f , -11.07050896f ,
- 14.10636425f , 12.71654224f , 11.35340214f , 6.63278866f , 7.45038319f , 5.69565058f , 3.01491594f , 1.82628620f , 2.48782039f , 2.02510524f , 0.75415736f , -0.22476493f , -1.60228145f , -3.62377214f , -6.14920473f , -6.03494453f , -5.61935091f , -7.92571545f , -12.52105999f , -15.74191380f , -16.80817795f , -20.57492828f , -24.48945808f , -28.24258423f ,
- 0.19937749f , 0.12145615f , -0.77132010f , -0.71175891f , -0.93605912f , -0.31743777f , -0.29512858f , 0.09480342f , 0.14056028f , -0.12526789f , -0.09476471f , -0.30501965f , 0.25228870f , 0.52946067f , 0.56253082f , 0.14792542f , 0.34610838f , 0.49112254f , 0.26700655f , 0.18578406f , -0.02644314f , -0.05281431f , -0.03051598f , -0.05372978f ,
- 27.67247200f , 21.21397018f , 19.23110199f , 14.58107758f , 9.06582832f , 6.16479349f , 5.19902563f , 4.85638475f , 5.00597048f , 5.02013874f , 4.74315405f , 1.14152813f , -2.22816443f , -4.39935923f , -7.21801662f , -11.83607006f , -15.51521206f , -16.95382690f , -19.09778404f , -21.91887093f , -22.66965294f , -25.31122971f , -28.42613792f , -31.17256165f ,
- 11.87517643f , 8.35047531f , 6.28900909f , 4.94152260f , 3.84217644f , 2.98525238f , 2.59193397f , 1.77286649f , 1.13057005f , 0.57406390f , -0.14166087f , -0.61366737f , -1.26566494f , -1.89665902f , -2.40094352f , -3.00182557f , -3.57644248f , -4.17064571f , -4.82954073f , -6.52423048f , -6.40167952f , -7.34070396f , -8.16668510f , -8.83840561f ,
- 22.19146919f , 12.36240387f , 9.77023125f , 7.21114588f , 6.19833231f , 5.60523272f , 5.27842569f , 4.64398146f , 4.52219105f , 2.91414714f , 0.94011378f , 0.25184512f , -1.67108417f , -4.17819881f , -6.24735117f , -8.17109394f , -10.08654118f , -12.12491417f , -14.44429111f , -16.77396011f , -16.61188507f , -15.37945271f , -16.77342606f , -22.42259216f ,
- 24.26110077f , 14.98621845f , 11.37115288f , 7.53246927f , 5.87425423f , 4.31526375f , 3.63155198f , 2.21215534f , 1.20856023f , 0.27279723f , -0.83065307f , -1.13145101f , -1.61203635f , -2.64372611f , -3.19713020f , -3.79212451f , -4.30746126f , -5.19196177f , -6.05636358f , -7.64335585f , -7.13419104f , -7.34445190f , -7.59247351f , -8.24604034f ,
- 49.59980774f , 36.70146179f , 26.21045494f , 18.96593857f , 14.66215992f , 12.35246658f , 7.91571426f , 4.46859789f , 4.55067158f , 3.66973281f , -0.18894276f , -1.13036156f , -2.81119108f , -7.01159000f , -10.32988167f , -12.34438610f , -13.80298901f , -15.68917179f , -16.59648895f , -18.04370117f , -16.93032265f , -17.15782166f , -17.23012543f , -16.81400299f ,
- 26.24615288f , 16.32177734f , 12.63861752f , 8.90179348f , 7.98338699f , 5.88846350f , 5.62527227f , 3.35444164f , 2.27727008f , 0.38706595f , -1.15045261f , -1.47619927f , -2.39863658f , -3.88151002f , -5.00069237f , -5.60923672f , -5.99917269f , -7.16092062f , -7.55632973f , -8.88112926f , -7.98447180f , -7.57788992f , -7.00798178f , -6.71480894f ,
- 34.06352615f , 26.54057884f , 17.68980789f , 12.03931808f , 10.71124458f , 6.47080278f , 4.33683681f , 3.58446765f , 0.97453946f , 0.07721954f , -0.66921860f , -1.29634130f , -1.56973386f , -3.47828341f , -5.09566927f , -5.83764601f , -8.20822048f , -10.21011162f , -11.12835598f , -12.94603825f , -13.56561852f , -18.43250847f , -19.20955467f , -19.59786224f ,
- 0.95227748f , 0.58713847f , 0.31188840f , 0.27555063f , 0.34262455f , 0.30559424f , 0.15511483f , 0.24209952f , -0.01565590f , 0.27935538f , -0.07689041f , 0.16362046f , -0.12529252f , -0.41308093f , -0.45669210f , -0.33647329f , -0.06432384f , -0.04425672f , -0.05423176f , -0.09260799f , 1.18880558f , 1.71499527f , 1.66458070f , 1.84440422f ,
- 40.51910782f , 28.87430191f , 26.44847679f , 22.61171722f , 14.58166790f , 10.04493809f , 8.90122890f , 6.69188166f , 4.74618101f , 1.55060208f , 0.26953381f , -0.23009424f , -3.10289311f , -7.76883173f , -9.03342628f , -11.38734531f , -15.26344204f , -20.89108467f , -23.61590576f , -24.70707703f , -24.72460747f , -25.31776428f , -25.42388153f , -25.48863602f ,
- 21.86741066f , 19.33110237f , 16.09799957f , 12.12207603f , 7.65350389f , 5.31046820f , 4.50258398f , 3.46295428f , 1.98402655f , 0.36231637f , -0.75526041f , -2.47129464f , -1.34295225f , -2.90498233f , -4.77146578f , -5.83896399f , -5.19093323f , -5.94871426f , -6.67448521f , -9.30622387f , -10.69075203f , -13.05691051f , -14.45488358f , -18.82699394f ,
- 17.39302254f , 10.72895432f , 7.20909882f , 6.08006477f , 5.16837120f , 5.15259743f , 5.89495230f , 6.39498520f , 6.43017626f , 4.73164368f , 2.29907250f , 0.83655185f , -1.61507225f , -4.66745806f , -6.97347021f , -10.42446899f , -13.22788048f , -15.54260540f , -18.53327751f , -21.36825371f , -21.31904602f , -21.81181335f , -22.37908173f , -22.59859848f ,
- -0.01662111f , -0.25115231f , -0.21056390f , -0.29628995f , 0.14847504f , 0.01114315f , -0.00287740f , -0.02265828f , 0.20096491f , 0.01801417f , 0.01865144f , 0.08115936f , 0.06854093f , 0.03268814f , -0.06264148f , -0.19867666f , -0.29278329f , -0.48747075f , -0.51964116f , -0.52115518f , -0.62580901f , -0.67440128f , -0.64710861f , -0.70800090f ,
- 50.63159180f , 32.35544586f , 28.22938156f , 26.12494469f , 19.17036057f , 15.54605675f , 10.90270996f , 5.06216860f , 2.83115578f , 0.26169294f , -2.59751272f , -2.23182607f , -6.02089071f , -9.04337597f , -9.29519939f , -11.44281673f , -13.14252472f , -13.87999630f , -14.00658417f , -14.13973713f , -14.08796120f , -28.49422073f , -28.55380249f , -28.66899681f ,
- 32.93387222f , 21.26923561f , 12.45925331f , 7.33453608f , 4.77903414f , 2.72644329f , 2.77173924f , 3.24125862f , 4.11953831f , 3.23369288f , 1.40657330f , 0.18600486f , -0.99559313f , -2.52648664f , -4.61264372f , -6.59295559f , -7.73660517f , -8.74180222f , -9.62380314f , -10.94507694f , -10.15025043f , -10.08863640f , -9.69090939f , -8.64610767f ,
- 19.57560349f , 16.97666168f , 15.32033443f , 9.42695236f , 10.81062126f , 9.27347946f , 6.17076063f , 3.87660646f , 4.01463747f , 2.81778264f , -0.01208094f , -1.53821909f , -3.11120200f , -6.04038715f , -9.02472019f , -8.91995525f , -8.31732368f , -9.97514439f , -13.60401344f , -16.95523643f , -16.28038406f , -19.30029488f , -21.93006134f , -25.31139183f ,
- -0.42336991f , -0.69359350f , -0.79506743f , -0.19419681f , -0.43531519f , -0.60549897f , -0.57378924f , -0.71198583f , -0.67573565f , -0.92463225f , -0.75932795f , -0.88697869f , -0.09116954f , 0.78057998f , 1.43234348f , 2.25282049f , 1.19868934f , 0.34737879f , 0.56014186f , 0.85799438f , 3.28324819f , 3.73368144f , 2.45774937f , 1.97252631f ,
- 34.38531113f , 33.28102493f , 22.44291687f , 21.71539307f , 14.89051437f , 12.06779766f , 11.31605339f , 6.32059956f , 6.47309685f , 2.75739145f , -0.72276920f , -4.60511971f , -2.12165952f , -3.55129719f , -10.11487579f , -14.52775002f , -18.18198204f , -20.44789314f , -21.58519745f , -22.53190994f , -22.04618073f , -22.58295822f , -22.41326904f , -22.20569420f ,
- 28.00102234f , 14.65698147f , 10.06700230f , 6.12028360f , 4.52054358f , 2.66990614f , 2.51413369f , 1.24868000f , 1.04878569f , 0.22633910f , -1.12691772f , -1.15263200f , -0.74640560f , -1.10290110f , -2.06341290f , -2.48550367f , -3.55061507f , -4.52637577f , -6.00973654f , -8.38346672f , -7.37356853f , -8.63987446f , -9.06530762f , -8.95927715f ,
- 9.00067616f , 10.26587391f , 11.45584679f , 11.44188595f , 10.68400574f , 8.38729477f , 5.69343138f , 1.98902297f , 0.07958379f , -0.50896430f , -0.83697474f , -1.44278872f , -2.87292027f , -4.73982143f , -4.71389008f , -5.85515070f , -5.86282825f , -7.65532827f , -9.99789906f , -11.01864147f , -10.61325741f , -9.58348751f , -12.15856743f , -21.34374619f ,
- 21.37445641f , 22.85872078f , 20.62342262f , 13.71718597f , 8.38479900f , 4.66404533f , 2.74082160f , 0.35184097f , -0.49886125f , -0.66627383f , -0.80947453f , -1.35072243f , -1.72979438f , -2.81121135f , -2.55301118f , -3.12950158f , -2.59265637f , -3.53384900f , -4.62459230f , -8.21864986f , -9.64109135f , -9.61122894f , -11.18858528f , -17.21859741f ,
- 52.95914078f , 32.75603485f , 30.16634941f , 25.88944244f , 19.02377129f , 16.02350807f , 11.37754154f , 4.71347761f , 3.22399068f , 0.38588712f , -2.36943150f , -3.03161478f , -6.27093697f , -9.42517185f , -9.90064812f , -11.53384590f , -12.21652794f , -12.39763260f , -12.44114876f , -12.50287819f , -12.35077858f , -12.41636753f , -12.45803928f , -12.50715065f ,
- 28.04634666f , 16.86526871f , 13.82318878f , 9.40035915f , 8.49054623f , 4.69572687f , 4.31990623f , 2.24289536f , 1.52588129f , -0.15709598f , -1.59520829f , -0.06550518f , -1.94989491f , -3.66548038f , -4.27683449f , -4.56677961f , -4.99815702f , -5.49210978f , -5.61179161f , -6.72458935f , -5.75457907f , -5.41288614f , -5.03387022f , -3.80432510f ,
- 25.75157547f , 17.28746796f , 13.10127354f , 10.33002377f , 8.27671814f , 6.59895802f , 5.40835238f , 3.63577080f , 2.23206282f , 1.08383977f , -0.28453460f , -1.38477814f , -2.64369345f , -3.91356444f , -5.05506754f , -6.35320854f , -7.60085487f , -8.91501999f , -10.29950809f , -12.61900711f , -13.07838917f , -14.44057560f , -15.59240627f , -16.55293274f ,
- 24.60115242f , 11.35327435f , 6.30881643f , 4.50763512f , 0.50214702f , -0.71103203f , 2.54261613f , -0.67276359f , -1.09342635f , 1.93361044f , 1.37798584f , 1.15170944f , 1.77881491f , -0.16942300f , -3.11068201f , -2.93669724f , -0.59286201f , 1.04607284f , 4.16106987f , 6.48291349f , 11.32464409f , 15.29464436f , 15.33285236f , 7.41661787f ,
+/* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */
+/* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */
+
+/* Stage1 Word8 tables 16x8+ 17*10+ 17*16 + 78*18 = = 1974 Word8 -> 987 Word16 */
+
+/* ROM storeSizeW8 = W8reduction (3072- (987+230) )/3072 = 1207/3072 --> 39.3 % */
+/* ROM with DCTII-24 in PROM = W8reduction (3072- (987) )/3072 = /3072 --> 31.8 % */
+
+/* additional minor Table ROM ( dct_mid points 18 Word16, dct_col_upshifts 52, scaleFactors 2*2 = ~= 74 Word16s */
+
+
+const Word16 cdk1_ivas_entries_per_segment[FDCNG_VQ_DCT_NSEGM] = { 16, 17, 17, 78 };
+const Word16 cdk1_ivas_cum_entries_per_segment[FDCNG_VQ_DCT_NSEGM + 1] = { 0, 16 ,33, 50, 128 };
+const Word16 /* DCT trunc_len */ cdk1_ivas_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MINTRUNC, 10, 16, FDCNG_VQ_DCT_MAXTRUNC }; /* 8, 10, 16, 18 */
+const Word16 /* segment inner DCT trunc_len */ cdk1_ivas_trunc_dct_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MAXTRUNC - FDCNG_VQ_DCT_MINTRUNC, FDCNG_VQ_DCT_MAXTRUNC - 10 , FDCNG_VQ_DCT_MAXTRUNC - 16 , 0 };
+
+/* to get back to FDCNG VQ domain for segment S use : idct as follows */
+/* cdk1r_vec[col, row] = cdk1r_tr_midQ_truncQ(col 1:24 ) + invScaleFQ * idctMat( cdk1_ivas_dct_sS_W8[1:col]< KMAX=127 needs support , 32bit- saturates at dim=6
- getK(21,9)+ maxqKInd=64 --> KMAX=512, needs support , 32bit saturates at dim=5
- getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=1024, needs support , 32bit saturates at dim~=4
- getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=32767, needs support, 32bit saturates at dim =3
-*/
+
const uint8_t hBitsMinus1_N01[2] = {1, 7};
const uint8_t hBitsMinus1_N02[65]=
@@ -22124,75 +22281,6 @@ const Word16 InvDiffTable[32] = /* Q20 */
0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081
};
-const float sns_vq_cdk1[8*32] = {
- -2.0529254143208289e+00f, -2.0105187772519200e+00f, -1.9181418840663027e+00f, -2.0529955931580051e+00f, -1.7965682581646625e+00f, -1.2350476819733338e+00f, -7.4106681145668685e-01f, -1.3500749433562539e-01f,
- +6.8395648103934958e-01f, -5.6618076612019363e-01f, -1.1629656439143417e+00f, -1.6994296999691509e+00f, -1.7665333688662666e+00f, -1.4601240490692278e+00f, -1.0934184548732562e+00f, -5.8974136946769384e-01f,
- -2.7268374190678193e+00f, -2.1818157040224055e+00f, -6.0427109270377999e-01f, +3.1651466770121833e-01f, +9.3430762386407940e-01f, +1.0478771837003078e+00f, +9.9559582196380947e-01f, +1.1082403839542609e+00f,
- +2.4379206786519574e+00f, +1.9640422580297323e+00f, +9.2771600149270417e-01f, +9.4135273318020941e-03f, -6.4013168732630366e-01f, -1.0138049129223088e+00f, -1.0924849368417169e+00f, -9.1129148479978594e-01f,
- +8.1762121316616565e-01f, -1.9433974959365836e-02f, -4.0054937117179751e-01f, -3.9231079150228149e-01f, -2.9970406532808125e-01f, -6.2996056616087495e-02f, +3.7544100964377108e-01f, +6.3685372354777436e-01f,
- +1.4734834246724329e+00f, +2.3539621556904251e+00f, +9.7194661426112050e-01f, -5.4110096556162990e-01f, -9.8129311847374545e-01f, -6.1342289097457547e-01f, +3.7249272152905366e-01f, +8.1252213656497096e-01f,
- -1.2496145961286331e+00f, -3.2376394756447752e-01f, +5.1439178441534027e-02f, +1.0005059991983459e-01f, +2.3749822119608346e-01f, +4.0542724931792579e-01f, +5.1033138353497232e-01f, +5.5694404671095077e-01f,
- +7.7965743766052975e-01f, +2.1917885215778097e+00f, +1.7164750043876311e+00f, +5.7945306635665195e-01f, -1.0190291924038120e-01f, -4.0418854005812310e-01f, -4.7849155803986132e-01f, -3.4725769238259874e-01f,
- +6.8865034807898129e-01f, +5.7566331510263680e-01f, -7.7725260497355977e-03f, -5.3794851427474544e-01f, -7.6313855691212973e-01f, -7.8413803908382473e-01f, -7.0161107722315574e-01f, -4.8903452069978415e-01f,
- +1.6928828230225725e+00f, +9.3495589460148931e-01f, +3.5426821621575499e-01f, +3.9507891687964890e-02f, -7.9631988607824541e-02f, -1.6624589421972935e-01f, -1.6180598135213178e-01f, -1.2860376999895359e-01f,
- -1.6962541680165768e+00f, +4.3456061122651995e-01f, +1.0710566866483171e+00f, +1.3249974344239270e+00f, +1.0825630027900910e+00f, +9.0621333090389167e-01f, +6.5428541538000140e-01f, +6.7283424156333382e-01f,
- +4.5763916137396308e+00f, +4.0870427709381518e+00f, +2.6750799962096261e+00f, +1.4487891616901025e+00f, +2.4432209950451603e-01f, -5.4383244175422862e-01f, -9.4142251186129933e-01f, -1.0862058366913647e+00f,
- +1.1883989487611160e+00f, +1.1685324900978113e+00f, +9.3045980943772877e-01f, +8.3738457417173884e-01f, +6.3496480700237246e-01f, +4.6405143429051326e-01f, +3.1705534227338888e-01f, +2.0799507760170197e-01f,
- +2.8980578835865609e+00f, +3.0880495072396617e+00f, +1.8680019598806248e+00f, +7.0446466488259230e-01f, +1.0107302845552169e-01f, -2.8986489567349910e-01f, -4.1462748482286188e-01f, -3.6206036514823836e-01f,
- -1.7524799389036466e-01f, +1.1936698995397648e+00f, +1.6088971749375909e+00f, +1.7111901074418125e+00f, +1.4837525009734551e+00f, +5.2536808756057463e-01f, -3.1226889149907566e-01f, -3.5746958704581933e-01f,
- +9.0352696786286879e-01f, +2.4731406386331605e+00f, +2.9079925242729416e+00f, +2.7918041274045429e+00f, +2.2373843929092465e+00f, +8.5208847870338755e-01f, -7.6200320575426320e-02f, -2.5316053664429367e-01f,
- -1.1865763437968528e+00f, -7.4234595628060440e-01f, -6.0141100860138463e-01f, -8.5065089175547848e-01f, -8.8329724313055402e-01f, -6.5351381126344021e-01f, -5.0230651881879618e-01f, -2.3359707426927168e-01f,
- +2.7673589888377261e+00f, +6.6328569264593351e-01f, -4.1472488624881343e-01f, -9.3187436659797018e-01f, -1.0754140202622839e+00f, -1.0146723389090857e+00f, -8.7888946611264573e-01f, -6.0836606213569688e-01f,
- -1.8124429341308173e+00f, -9.7828066142280434e-01f, +6.5968430845517978e-01f, +2.1854499449267628e+00f, +2.2517483941731826e+00f, +2.3821501109065295e+00f, +1.9235238012956650e+00f, +1.5065083288921912e+00f,
- +4.9050283992558246e+00f, +2.4264119698434983e+00f, +8.3367299614637902e-01f, -4.3119484392510427e-02f, -5.8100382033177300e-01f, -7.7353747986816990e-01f, -8.7895223350767071e-01f, -8.6819816920933113e-01f,
- +6.5228388674538984e-01f, +1.1174683594915380e-01f, +1.2383281142011383e-01f, +6.0151217547540869e-01f, +9.5444246174773772e-01f, +1.2805750123888453e+00f, +9.2140926443564275e-01f, +5.7786881373204924e-01f,
- +1.9490989723028713e+00f, +2.8004262751807882e+00f, +1.9081816065970161e+00f, +3.7248785750983177e-01f, +1.3095620385608037e-01f, +7.9016424306166244e-01f, +1.1640502521465221e+00f, +1.0066783002173452e+00f,
- -1.0171864644867654e-01f, +1.7954757784640871e+00f, +1.8915637038163424e+00f, +1.0909542570620605e+00f, +6.1888445783828194e-01f, +7.6574083569028828e-01f, +8.9561325653114987e-01f, +8.0797624213033170e-01f,
- +1.9350543800926379e+00f, +3.2339385307849722e+00f, +3.0806729276317419e+00f, +2.1684844197871249e+00f, +7.8035951982399498e-01f, -6.7854327548476567e-01f, -9.6732224945258960e-01f, -5.8068474286758409e-01f,
- -1.5383985945543574e-01f, +7.1583722374971992e-01f, +5.8674384505519706e-01f, +3.7092544478085621e-01f, +1.0970155384441491e-01f, -2.3854313229153577e-02f, -5.3508967318497622e-02f, +3.3979575877473786e-02f,
- +2.7095625819635165e+00f, +1.7832208238203791e+00f, +9.6783753432609421e-01f, +5.8919108500645523e-01f, +4.1191953120474317e-01f, +1.9592175852184501e-01f, -1.0134844291353281e-02f, -1.6725603195278577e-01f,
- -2.6560188981865329e-01f, +1.4059113655935889e+00f, +1.9844196049902063e+00f, +2.4291429998935334e+00f, +2.2837873843112892e+00f, +1.8570922995202830e+00f, +1.2056879204230433e+00f, +8.4717915626409468e-01f,
- +3.1939221203717074e+00f, +3.7963726820313615e+00f, +3.2748823221663406e+00f, +2.4724357608035472e+00f, +1.6860933687497499e+00f, +6.4628696101838046e-01f, -7.8170867286998971e-02f, -6.1406792037327973e-01f,
- +1.6686627356973500e+00f, +2.4375118241337517e+00f, +2.2118134266295129e+00f, +1.4754862720822910e+00f, +1.0100987843177478e+00f, +4.8216927165041135e-01f, +5.0597779432044222e-02f, -7.2090396257990311e-02f,
- +3.4953550651375287e+00f, +3.2379627985821369e+00f, +2.1155532232841976e+00f, +1.3293556793682053e+00f, +1.0159800928862721e+00f, +6.8710150035919371e-01f, +5.0950588745743997e-01f, +2.0092204555514792e-01f,
- +1.6537233329850265e+00f, +1.8429927128987775e+00f, +1.5795688890212489e+00f, +1.5313117335176101e+00f, +1.4688051742099697e+00f, +1.3047757088193301e+00f, +9.3703047481911916e-01f, +6.6034404507297240e-01f,
- +1.9642176175501569e+00f, +2.9388625018759811e+00f, +2.9051270203314714e+00f, +2.2145871562616142e+00f, +1.8151504726187455e+00f, +1.4766756664819134e+00f, +1.0710276243190799e+00f, +6.1861320930710639e-01f
-};
-
-const float sns_vq_cdk2[8*32] = {
- -5.9829995937529679e-01f, -1.6330921039310822e+00f, -2.2069628561771211e+00f, -2.3101968732645872e+00f, -2.2987624447001700e+00f, -2.2585659584659474e+00f, -2.2426863949716420e+00f, -2.2717425510152180e+00f,
- -1.4313340820994043e+00f, -1.7500847356351696e+00f, -1.7795938232358199e+00f, -1.7213803415353539e+00f, -1.6610776464291162e+00f, -1.6069804294990451e+00f, -1.5625217472935489e+00f, -1.5641247494491251e+00f,
- -4.2712987825717169e-01f, -8.1657540705874065e-01f, -1.1438786300941690e+00f, -1.5047514473946468e+00f, -1.8039927073343207e+00f, -1.9709309014182719e+00f, -2.0721822202754367e+00f, -2.2015067008471854e+00f,
- -8.8390021618372749e-01f, -9.1027146153915306e-01f, -8.4148501893353445e-01f, -7.0803242455046478e-01f, -4.0873435152568971e-01f, -5.8364530253510127e-02f, +1.5450950372912373e-01f, +2.3879767518520115e-01f,
- +2.2959495262308716e-01f, -4.5380527270641730e-01f, -1.2610303555144773e+00f, -1.9593984147017431e+00f, -2.5055916891711632e+00f, -2.7888667896972388e+00f, -2.9113125863020777e+00f, -2.9748256948291001e+00f,
- -1.1488842521346578e+00f, -1.3517692148186562e+00f, -1.3594824205078988e+00f, -1.2204819600745185e+00f, -9.1363085887906581e-01f, -6.8205390481915806e-01f, -5.8474638022763137e-01f, -6.3572794299637214e-01f,
- -7.7093095554781843e-01f, -9.4474580908674310e-01f, -9.4836193194533303e-01f, -9.4516185118638463e-01f, -1.0483710354237581e+00f, -1.1355351751536940e+00f, -1.2428754319298756e+00f, -1.3831917119547590e+00f,
- -9.3476137541952931e-01f, -7.0790164340965811e-01f, -3.3885900459516044e-01f, +8.2267549037198462e-02f, +4.8079994558165973e-01f, +8.0682939355530092e-01f, +1.0305358697421620e+00f, +1.0235050392855534e+00f,
- +1.0095585388252226e+00f, -1.5967777106488176e-01f, -2.2123760679560007e+00f, -2.4162196770688293e+00f, -2.1066059048135193e+00f, -1.8818990363917070e+00f, -1.9958495939733885e+00f, -2.3481921543456847e+00f,
- +9.2392277358713179e-02f, -1.8364442239470730e-01f, -5.9563356599054251e-01f, -1.0147004796192145e+00f, -1.3476180323301636e+00f, -1.5136187252106814e+00f, -1.5799100551406959e+00f, -1.7192022915180234e+00f,
- -1.4222957040291027e-02f, -1.7371797028437352e-01f, -3.0805783645739226e-01f, -4.0484411256102021e-01f, -6.6432144720337050e-01f, -1.0344124279519349e+00f, -1.6814321622332238e+00f, -2.5032237993558693e+00f,
- +6.8743182828212471e-02f, +3.3095426522069737e-01f, +5.0002819580392865e-01f, +5.6165737804402860e-01f, +5.0172311732338448e-01f, +3.6961533646464034e-01f, +8.5026798082935839e-02f, -3.9473330479310409e-01f,
- +1.0356440140522545e+00f, +7.8065342952998484e-01f, +6.7193695552111687e-02f, -9.5261546302001587e-01f, -2.0142463788396388e+00f, -2.7767542927506610e+00f, -3.1928041080758338e+00f, -3.4042594311363201e+00f,
- -6.6289350610256359e-01f, -6.3896764348680091e-01f, -5.1207254963552118e-01f, -3.6335660396488040e-01f, -2.8247932520862895e-01f, -3.1477486911353381e-01f, -4.4809778805307687e-01f, -6.9186118822875298e-01f,
- +7.9969719144308171e-02f, +2.1588869900646174e-01f, +3.0323707912603959e-01f, +2.6884673422742911e-01f, +5.9642290590166340e-02f, -2.8613663980468629e-01f, -7.9406912376026706e-01f, -1.4470063450324298e+00f,
- -2.0240948732059452e-01f, +2.3334712655850515e-01f, +5.7657451283939798e-01f, +7.9742677228839842e-01f, +9.3220814515190065e-01f, +1.0323450144255806e+00f, +1.0118085786908606e+00f, +7.9014188629614879e-01f,
- -7.1530830084194669e-02f, -1.2396351139455990e+00f, -2.0842499795217195e+00f, -1.3035503744881123e+00f, -8.3471992091295932e-01f, -1.1295869482135590e+00f, -1.7132725973269993e+00f, -2.1802158117711343e+00f,
- -1.7835942638423960e-01f, -7.1247931965515532e-01f, -1.5124017210947220e+00f, -1.9967695368388680e+00f, -1.8783401399959028e+00f, -1.4021324347049549e+00f, -1.0637376079630234e+00f, -1.1080152582418752e+00f,
- +1.0480932547841233e+00f, +2.7493060468886921e-01f, -1.1919132498368252e+00f, -1.2523434724836580e+00f, -7.8936067946054767e-01f, -8.2091162445205956e-01f, -1.3128033132740213e+00f, -1.9655091841161074e+00f,
- -3.3232308742031469e-01f, -2.2713591199678415e-01f, -1.4351679017954885e-01f, -1.9801985565791998e-02f, +1.0057467598256911e-01f, +2.2696827939185557e-01f, +3.0695375436198624e-01f, +2.2875897090753330e-01f,
- +3.4676185796153502e-01f, -1.0768837168056489e-01f, -6.9753922421077807e-01f, -1.0937050061788010e+00f, -1.5428629138891437e+00f, -2.0449896355500123e+00f, -2.4848880613940572e+00f, -2.8583647439574880e+00f,
- -1.2173513563721174e-02f, -3.2908222329502096e-01f, -7.4562386900667521e-01f, -1.0159346083066496e+00f, -9.9134754982937601e-01f, -8.0708475073517449e-01f, -5.9033001697337439e-01f, -5.3497643414524321e-01f,
- -1.0362333131951586e-01f, -2.6988877087476748e-01f, -3.8890071054155473e-01f, -4.9037107401879965e-01f, -5.6504591412573135e-01f, -7.3336953439609320e-01f, -9.9258959592254403e-01f, -1.3661070412637724e+00f,
- -7.9157092539986307e-01f, -3.3641122720876027e-01f, +2.9168895215304702e-01f, +1.0181013149521261e+00f, +1.5982627043961528e+00f, +1.9868228787387316e+00f, +2.1282934389276504e+00f, +1.9646952813708398e+00f,
- +8.5453347281306224e-01f, +8.1178943134578940e-01f, -4.8818346255935796e-01f, -2.1067304958054955e+00f, -2.5063149014598722e+00f, -2.0640557329267200e+00f, -1.6543474135830516e+00f, -1.7651753795641250e+00f,
- +6.2358146522917657e-01f, +5.4834889364422190e-01f, +1.7179524311839983e-01f, -3.5307730840525375e-01f, -7.7064726884538126e-01f, -1.0122724639555478e+00f, -1.1610381095678584e+00f, -1.4059777048358271e+00f,
- +7.4374029892860283e-01f, +9.2218263151186131e-01f, +7.8921361199673412e-01f, +5.4697537641890215e-01f, +3.4695498575470718e-02f, -6.0728616781597766e-01f, -1.5817464846714542e+00f, -2.9492076413515940e+00f,
- +1.0792513778563164e+00f, +1.4361817236342909e+00f, +1.4897259644477068e+00f, +1.4980968655148907e+00f, +1.3061906859741226e+00f, +9.2722643966101292e-01f, +4.6901200392574449e-01f, -8.4108696494310742e-02f,
- +8.5358364275519205e-01f, +6.0645747733831856e-01f, +2.0465300574744516e-01f, -3.7181339249044437e-01f, -1.0727735914037746e+00f, -1.6784774674483536e+00f, -2.1020318554063260e+00f, -2.5024013237162377e+00f,
- +1.2794365477031622e-01f, +1.2747703630869173e-01f, -4.1758739312140455e-02f, -2.4311752788462185e-01f, -3.1778646043737568e-01f, -2.8915217065224763e-01f, -2.9094454849599488e-01f, -4.4820832489443191e-01f,
- +1.2951853228518271e+00f, +9.5620359941142952e-01f, +5.3144852217798388e-01f, +2.1179514725221937e-01f, -6.5987484250824083e-02f, -3.2087563737255587e-01f, -5.4468525409236357e-01f, -8.8065574221328113e-01f,
- -1.0568174530545921e-02f, +8.7151888563731761e-01f, +1.5660992592896033e+00f, +1.9198797896705255e+00f, +2.0755726094083351e+00f, +2.1798356493630360e+00f, +2.0711596722334082e+00f, +1.7022476043512389e+00f
-};
const float tcx_mdct_window_48[420] =
{
diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h
index 79971cba6a04ba94418cd46db8aa32c2d993191d..e6284ab417d0b2ef4a0704e8ef60dbdc45e968c2 100644
--- a/lib_com/rom_com.h
+++ b/lib_com/rom_com.h
@@ -1137,6 +1137,50 @@ extern const float olapWinAna640[640];
extern const float olapWinSyn256[256];
extern const float olapWinSyn320[320];
+#ifdef ERI_FDCNGVQ_LOW_ROM_TESTING
+extern const float *const cdk_37bits_ivas_orig[];
+#endif
+
+extern const Word8 cdk1_ivas_dct_s0_W8[];
+extern const Word8 cdk1_ivas_dct_s1_W8[];
+extern const Word8 cdk1_ivas_dct_s2_W8[];
+extern const Word8 cdk1_ivas_dct_s3_W8[];
+extern const Word8 *const cdk_37bits_ivas_stage1_W8Qx_dct_sections[];
+
+extern const Word16 cdk1_ivas_entries_per_segment[];
+extern const Word16 cdk1_ivas_cum_entries_per_segment[];
+extern const Word16 cdk1_ivas_cols_per_segment[];
+extern const Word16 cdk1_ivas_trunc_dct_cols_per_segment[];
+
+extern const Word16 *stage1_dct_col_syn_shift[];
+extern const float cdk1r_tr_midQ_truncQ[];
+extern const float fdcng_dct_invScaleF[];
+extern const float fdcng_dct_scaleF[];
+
+extern const Word16 unique_idctT2_24coeffsQ16[];
+extern const Word8 idctT2_24_compressed_idx[];
+
+extern const Word16 unique_idctT2_21coeffsQ16[];
+extern const Word8 idctT2_21_compressed_idx[];
+
+
+extern const float idctT2_24_X_matrixFloatQ[];
+
+extern const Word16 cdk1_ivas_entries_per_segment[];
+extern const Word16 cdk1_ivas_cum_entries_per_segment[];
+
+/* circular mse ordered list fwd/rev directions for candidate evaluations */
+extern const Word8 cdk1_ivas_segm_neighbour_fwd[];
+extern const Word8 cdk1_ivas_segm_neighbour_rev[];
+
+
+extern const float cdk_37bits_1[];
+extern const float cdk_37bits_2[];
+extern const float cdk_37bits_3[];
+extern const float cdk_37bits_4[];
+extern const float cdk_37bits_5[];
+extern const float cdk_37bits_6[];
+
/*----------------------------------------------------------------------------------*
* TCX
@@ -1297,9 +1341,6 @@ extern const Word16 invTable[INV_TABLE_SIZE + 1];
extern const Word16 sqrtTable[SQRT_TABLE_SIZE + 1];
extern const Word16 invSqrtTable[SQRT_TABLE_SIZE + 1];
-extern const float sns_vq_cdk1[8 * 32];
-extern const float sns_vq_cdk2[8 * 32];
-
extern const float tcx_mdct_window_48[420];
extern const float tcx_mdct_window_half_48[180];
extern const float tcx_mdct_window_trans_48[60];
diff --git a/lib_com/stl.h b/lib_com/stl.h
index 234aec9e1609d68771d2cd80be104a0d4b17126c..c9ca42280642ae4ba91cc65258d8a567b04a195c 100644
--- a/lib_com/stl.h
+++ b/lib_com/stl.h
@@ -57,7 +57,7 @@
#ifndef _STL_H
#define _STL_H
-#include "options.h" /* TODO: TEMPORARY during BASOP development - to be removed */
+#include "options.h" /* note: needed until BASOP_NOGLOB is accepted */
#include "typedef.h"
#include "basop32.h"
#include "move.h"
diff --git a/lib_com/tcx_utils.c b/lib_com/tcx_utils.c
index 07618c7cd21ce15d5a3de2c053159ac4509b1636..ec219456b089e0c7a44d09f42e2f1a6a8498f980 100644
--- a/lib_com/tcx_utils.c
+++ b/lib_com/tcx_utils.c
@@ -59,16 +59,9 @@ void tcx_get_windows(
const float **left_win, /* o : left overlap window */
int16_t *right_overlap, /* o : right overlap length */
const float **right_win, /* o : right overlap window */
- const int16_t fullband, /* i : fullband flag */
- const int16_t isLfe /* i : LFE flag */
+ const int16_t fullband /* i : fullband flag */
)
{
- /* LFE is only FULL_OVERLAP*/
- if ( isLfe )
- {
- assert( left_mode == FULL_OVERLAP && right_mode == FULL_OVERLAP );
- }
-
if ( !fullband )
{
/* Left part */
@@ -91,16 +84,8 @@ void tcx_get_windows(
}
else if ( left_mode == FULL_OVERLAP )
{
- if ( isLfe )
- {
- *left_overlap = hTcxCfg->tcx_mdct_window_length;
- *left_win = hTcxCfg->tcx_mdct_window;
- }
- else
- {
- *left_overlap = hTcxCfg->tcx_mdct_window_length;
- *left_win = hTcxCfg->tcx_aldo_window_1_trunc;
- }
+ *left_overlap = hTcxCfg->tcx_mdct_window_length;
+ *left_win = hTcxCfg->tcx_aldo_window_1_trunc;
}
else
{
@@ -121,16 +106,8 @@ void tcx_get_windows(
}
else if ( right_mode == FULL_OVERLAP )
{
- if ( isLfe )
- {
- *right_overlap = hTcxCfg->tcx_mdct_window_length;
- *right_win = hTcxCfg->tcx_mdct_window;
- }
- else
- {
- *right_overlap = hTcxCfg->tcx_mdct_window_delay;
- *right_win = hTcxCfg->tcx_aldo_window_2;
- }
+ *right_overlap = hTcxCfg->tcx_mdct_window_delay;
+ *right_win = hTcxCfg->tcx_aldo_window_2;
}
else
{
@@ -164,16 +141,8 @@ void tcx_get_windows(
}
else if ( left_mode == FULL_OVERLAP )
{
- if ( isLfe )
- {
- *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB;
- *left_win = hTcxCfg->tcx_mdct_windowFB;
- }
- else
- {
- *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB;
- *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc;
- }
+ *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB;
+ *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc;
}
else
{
@@ -199,16 +168,8 @@ void tcx_get_windows(
}
else if ( right_mode == FULL_OVERLAP )
{
- if ( isLfe )
- {
- *right_overlap = hTcxCfg->tcx_mdct_window_lengthFB;
- *right_win = hTcxCfg->tcx_mdct_windowFB;
- }
- else
- {
- *right_overlap = hTcxCfg->tcx_mdct_window_delayFB;
- *right_win = hTcxCfg->tcx_aldo_window_2_FB;
- }
+ *right_overlap = hTcxCfg->tcx_mdct_window_delayFB;
+ *right_win = hTcxCfg->tcx_aldo_window_2_FB;
}
else
{
@@ -276,8 +237,7 @@ void WindowSignal(
int16_t *L_frame, /* i/o: frame length */
float out[], /* o : output windowed signal */
const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */
- const int16_t fullband, /* i : fullband flag */
- const int16_t isLfe /* i : LFE flag */
+ const int16_t fullband /* i : fullband flag */
)
{
int16_t l, r;
@@ -288,7 +248,7 @@ void WindowSignal(
* Init *
*-----------------------------------------------------------*/
- tcx_get_windows( hTcxCfg, left_overlap_mode, right_overlap_mode, &l, &left_win, &r, &right_win, fullband, isLfe );
+ tcx_get_windows( hTcxCfg, left_overlap_mode, right_overlap_mode, &l, &left_win, &r, &right_win, fullband );
/* Init lengths */
@@ -314,7 +274,7 @@ void WindowSignal(
tcx_windowing_analysis( in - l / 2 + offset, *L_frame, l, left_win, r, right_win, out );
- if ( left_overlap_mode == FULL_OVERLAP && truncate_aldo && !isLfe )
+ if ( left_overlap_mode == FULL_OVERLAP && truncate_aldo )
{
/* fade truncated ALDO window to avoid discontinuities */
if ( !fullband )
diff --git a/lib_com/tools.c b/lib_com/tools.c
index db7c5a3f8e7a82c0653b81c6ba08031b6abf47a9..ab688adbb9f77cfc81f361399a4bedd55486d7a7 100644
--- a/lib_com/tools.c
+++ b/lib_com/tools.c
@@ -210,7 +210,11 @@ float sum2_f(
void set_c(
int8_t y[], /* i/o: Vector to set */
const int8_t a, /* i : Value to set the vector to */
+#ifdef JBM_TSM_ON_TCS
+ const int32_t N /* i : Length of the vector */
+#else
const int16_t N /* i : Length of the vector */
+#endif
)
{
int16_t i;
@@ -387,7 +391,11 @@ uint32_t mvr2s(
return 0;
}
+#ifdef JBM_TSM_ON_TCS
+ if ( (void *) y <= (const void *) x )
+#else
if ( (void *) y < (const void *) x )
+#endif
{
for ( i = 0; i < n; i++ )
{
@@ -553,6 +561,7 @@ int16_t maximum_s(
{
if ( vec[i] > tmp )
{
+ ind = i;
tmp = vec[i];
}
}
diff --git a/lib_debug/debug.c b/lib_debug/debug.c
index 85e48e8bae0b71aaa6c4dfc4484b6ddbd53dd285..ce10231876d27e76b141333f2fa70423abb4430e 100644
--- a/lib_debug/debug.c
+++ b/lib_debug/debug.c
@@ -201,6 +201,7 @@ int16_t dbgwrite(
return 0;
}
+
/*-------------------------------------------------------------------*
* dbgwrite_mat_repeat()
*
diff --git a/lib_debug/sba_debug.c b/lib_debug/sba_debug.c
index 040cadf88774b68fad67286377ef5ad721c15ee5..73bb630b5fe54dee3600127f19cf5882c425bdbc 100644
--- a/lib_debug/sba_debug.c
+++ b/lib_debug/sba_debug.c
@@ -51,11 +51,11 @@
#define MAX_IN_FILE_LEN ( 1000 )
#define MAX_PLUG_IN_FILE_LEN ( MAX_IN_FILE_LEN )
#define MAX_DEBUG_TAG_LEN ( 50 )
-#define NUM_DEBUG_FILES ( 4 )
+#define NUM_DEBUG_FILES ( 5 )
#define MAX_TAG_LEN ( 200 )
WAVEFILEOUT *spar_foa_enc_wav[3];
-WAVEFILEOUT *spar_foa_dec_wav[4];
+WAVEFILEOUT *spar_foa_dec_wav[NUM_DEBUG_FILES];
float max_diff = 0;
int32_t dbg_frm_num;
int32_t dbg_band;
@@ -202,6 +202,7 @@ void ivas_spar_dump_signal_wav(
{
for ( i = 0; i < no_channel; i++, k++ )
{
+#if 0
if ( ppPcm )
{
tmp_value = roundf( ppPcm[i][j] * PCM16_TO_FLT_FAC );
@@ -210,6 +211,16 @@ void ivas_spar_dump_signal_wav(
{
tmp_value = roundf( pcm_array[i][j] * PCM16_TO_FLT_FAC );
}
+#else
+ if ( ppPcm )
+ {
+ tmp_value = roundf( ppPcm[i][j] );
+ }
+ else
+ {
+ tmp_value = roundf( pcm_array[i][j] );
+ }
+#endif
if ( tmp_value > MAX16B_FLT )
{
largest_value = (float) fabs( tmp_value ) > largest_value ? (float) fabs( tmp_value ) : largest_value;
@@ -272,6 +283,12 @@ void ivas_close_sba_decoder_debug_files(
CloseWav( spar_foa_dec_wav[3] );
}
+ if ( spar_foa_dec_wav[4] != NULL )
+ {
+ UpdateWave( fs, n_ch, 16, spar_foa_dec_wav[4] );
+ CloseWav( spar_foa_dec_wav[4] );
+ }
+
return;
}
@@ -315,7 +332,7 @@ void ivas_open_sba_decoder_debug_files(
const int16_t n_ch,
const int16_t n_transport )
{
- int8_t fb_wav_dump_path[4][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "" };
+ int8_t fb_wav_dump_path[NUM_DEBUG_FILES][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "", "" };
cstrcat( (char *) fb_wav_dump_path[0], sizeof( fb_wav_dump_path[0] ), "dec_out.wav" );
spar_foa_dec_wav[0] = CreateWav( (const char *) fb_wav_dump_path[0], fs, n_ch, 32 /* const uint32_t writeWaveExt */ );
@@ -329,6 +346,9 @@ void ivas_open_sba_decoder_debug_files(
cstrcat( (char *) fb_wav_dump_path[3], sizeof( fb_wav_dump_path[3] ), "cldfbSynthesis.wav" );
spar_foa_dec_wav[3] = CreateWav( (const char *) fb_wav_dump_path[3], fs, n_transport, 16 /* const uint32_t writeWaveExt */ );
+ cstrcat( (char *) fb_wav_dump_path[4], sizeof( fb_wav_dump_path[4] ), "cldfbAnalysis.wav" );
+ spar_foa_dec_wav[4] = CreateWav( (const char *) fb_wav_dump_path[4], fs, n_transport, 16 /* const uint32_t writeWaveExt */ );
+
return;
}
diff --git a/lib_debug/sba_debug.h b/lib_debug/sba_debug.h
index cd4fd58c11a22f39e99b8d73a6c6dd12ce7212d1..a314d1568cc2df74be82d26610a30b00e78b6866 100644
--- a/lib_debug/sba_debug.h
+++ b/lib_debug/sba_debug.h
@@ -41,9 +41,10 @@
#include "ivas_cnst.h"
#include "tinywaveout_c.h"
+
#ifdef DEBUG_SBA_AUDIO_DUMP
extern WAVEFILEOUT *spar_foa_enc_wav[3];
-extern WAVEFILEOUT *spar_foa_dec_wav[4];
+extern WAVEFILEOUT *spar_foa_dec_wav[5];
#endif
#ifdef DEBUG_AGC
diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c
index b0d30e88dd8fa9ed29921243169f2cd0c05ebfa7..eb2e84f598c8f4d0dd102fdf6abf06bd3980cd8f 100644
--- a/lib_dec/acelp_core_dec.c
+++ b/lib_dec/acelp_core_dec.c
@@ -45,9 +45,7 @@
#include "prot.h"
#include "ivas_cnst.h"
#include "ivas_prot.h"
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
#include "ivas_rom_com.h"
-#endif
#include "wmc_auto.h"
/*-------------------------------------------------------------------*
@@ -77,6 +75,8 @@ ivas_error acelp_core_dec(
const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */
const int16_t nchan_out, /* i : number of output channels */
STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */
+ ,
+ const int16_t read_sid_info /* i : read SID info flag */
)
{
float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */
@@ -512,7 +512,7 @@ ivas_error acelp_core_dec(
}
else
{
- if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT && st->read_sid_info )
+ if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT )
{
FdCng_decodeSID( st );
*sid_bw = 0;
@@ -528,8 +528,8 @@ ivas_error acelp_core_dec(
}
ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) );
}
- if ( !st->read_sid_info )
- // if (!st->read_sid_info && st->cng_paramISM_flag) /* read_sid_info can only be 0 in ParamISM mode */
+
+ if ( !read_sid_info )
{
float noise_lvl_highest;
@@ -614,11 +614,11 @@ ivas_error acelp_core_dec(
nb_bits = -1;
}
- config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
- if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) /* ISfm: why is this called again after above */
+ if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME )
{
- config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
}
}
@@ -650,25 +650,25 @@ ivas_error acelp_core_dec(
if ( !tdm_lp_reuse_flag )
{
- lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- tdm_lsfQ_PCh
-#endif
- );
+ lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode, tdm_lsfQ_PCh );
}
else
{
const float *pt_interp_2;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
- int16_t beta_index[1];
-
- beta_index[0] = get_next_indice( st, TDM_IC_LSF_PRED_BITS );
- tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, beta_index );
-#else
- mvr2r( tdm_lspQ_PCh, lsp_new, M );
- mvr2r( tdm_lsfQ_PCh, lsf_new, M );
-#endif
+
+ if ( st->active_cnt != 1 )
+ {
+ int16_t beta_index;
+
+ beta_index = get_next_indice( st, TDM_IC_LSF_PRED_BITS );
+ tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, &beta_index );
+ }
+ else
+ {
+ mvr2r( tdm_lspQ_PCh, lsp_new, M );
+ mvr2r( tdm_lsfQ_PCh, lsf_new, M );
+ }
+
if ( st->rate_switching_reset )
{
/* extrapolation in case of unstable LSF convert */
@@ -1079,7 +1079,7 @@ ivas_error acelp_core_dec(
* Formant post-filter
*-----------------------------------------------------------------*/
- if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) /* VE2TV: TBV for TD stereo */
+ if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k )
{
mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k );
@@ -1125,7 +1125,7 @@ ivas_error acelp_core_dec(
st->lp_noise = st->hFdCngDec->lp_noise;
}
- if ( st->element_mode != IVAS_CPE_TD && !st->cng_paramISM_flag )
+ if ( st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag )
{
/*Noise estimate*/
ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) );
@@ -1301,7 +1301,7 @@ ivas_error acelp_core_dec(
/*WB/SWB-FD_CNG*/
if ( ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && ( st->cng_type == FD_CNG ) && ( st->hFdCngDec->hFdCngCom->numCoreBands < st->cldfbSyn->no_channels ) )
{
- generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_paramISM_flag );
+ generate_comfort_noise_dec_hf( realBuffer, imagBuffer, st->hFdCngDec->hFdCngCom, st->cng_ism_flag );
if ( st->hFdCngDec->hFdCngCom->regularStopBand < st->cldfbSyn->no_channels )
{
diff --git a/lib_dec/acelp_core_switch_dec.c b/lib_dec/acelp_core_switch_dec.c
index 6953551452220ee793e544469e2d4f379acb1228..51d459b205e980505dd12a2d5c87795b95244c8b 100644
--- a/lib_dec/acelp_core_switch_dec.c
+++ b/lib_dec/acelp_core_switch_dec.c
@@ -158,7 +158,7 @@ ivas_error acelp_core_switch_dec(
* Excitation decoding
*----------------------------------------------------------------*/
- config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, 0, 0, 0 /*st->GSC_IVAS_mode*/ );
+ config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, st->active_cnt, 0, 0, 0 /*st->GSC_IVAS_mode*/ );
decod_gen_voic_core_switch( st, L_frame_for_cs, 0, Aq, exc, cbrate );
diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c
index b780db062f4d416a2fbcf2bde7dbb15b79bd18c4..64403736c43fae6a323f248a586792506f0bac99 100644
--- a/lib_dec/cng_dec.c
+++ b/lib_dec/cng_dec.c
@@ -109,12 +109,7 @@ void CNG_dec(
}
else
{
- lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL );
}
}
else
diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c
index 1e238fb52f1603f5638fa7ece5dce5031f73a830..aa8f576cec3f5b277eaf4a1c8b980e6c96f0d167 100644
--- a/lib_dec/core_dec_init.c
+++ b/lib_dec/core_dec_init.c
@@ -190,7 +190,7 @@ void open_decoder_LPD(
{
if ( !is_init || st->element_mode != IVAS_CPE_MDCT )
{
- init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag, st->mct_chan_mode );
+ init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag );
}
else
{
@@ -670,10 +670,11 @@ void open_decoder_LPD(
st->last_tns_active = 0;
st->second_last_tns_active = 0;
st->second_last_core = -1;
- /* TODO: also apply for MCT modes, once issue #24 is solved */
- if ( st->hTcxCfg != NULL && !MCT_flag && st->element_mode != EVS_MONO )
+
+ if ( st->hTcxCfg != NULL &&
+ st->element_mode != EVS_MONO )
{
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode, st->mct_chan_mode );
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode );
}
if ( hTcxDec != NULL )
{
diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c
index a092255a38897557b1260d1cd9860907a810aa15..ef0a12696f448598703f5635ee0b0510f49cec17 100644
--- a/lib_dec/core_dec_switch.c
+++ b/lib_dec/core_dec_switch.c
@@ -91,7 +91,7 @@ void mode_switch_decoder_LPD(
switchWB = 1; /*force init when coming from MODE1*/
}
- st->igf = getIgfPresent( st->element_mode, total_brate, bwidth, st->rf_flag, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, total_brate, bwidth, st->rf_flag );
if ( st->hIGFDec != NULL )
{
@@ -140,7 +140,7 @@ void mode_switch_decoder_LPD(
if ( st->hTcxCfg != NULL )
{
st->hTcxCfg->pCurrentTnsConfig = NULL;
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode, st->mct_chan_mode );
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode );
}
if ( st->hTcxCfg->fIsTNSAllowed && st->hIGFDec != NULL && st->hTcxCfg != NULL )
diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c
index c2a3955afba78484d27ac1a564e75a6a9f4d6113..e70b1d59d7bed6fc4f19a37cc37dfcbc97726c14 100644
--- a/lib_dec/core_switching_dec.c
+++ b/lib_dec/core_switching_dec.c
@@ -51,7 +51,7 @@
*---------------------------------------------------------------------*/
static void core_switch_lb_upsamp( Decoder_State *st, float *output );
-static void smoothTransitionMdctStereoDtx( float synth[], const int16_t output_frame, const int16_t delay_comp );
+static void smoothTransitionDtxToTcx( float synth[], const int16_t output_frame, const int16_t delay_comp );
/*---------------------------------------------------------------------*
* core_switching_pre_dec()
@@ -374,7 +374,7 @@ ivas_error core_switching_pre_dec(
st->gc_threshold = 0.0f;
set_f( st->dispMem, 0, 8 );
- st->last_coder_type = GENERIC; /* fcs : this might be superfluous */
+ st->last_coder_type = GENERIC;
fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 );
st->lp_gainp = 0.0f;
@@ -556,6 +556,7 @@ ivas_error core_switching_post_dec(
float *synth, /* i/o: output synthesis */
float *output, /* i/o: LB synth/upsampled LB synth */
float output_mem[], /* i : OLA memory from last TCX/HQ frame */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */
const int16_t output_frame, /* i : frame length */
const int16_t core_switching_flag, /* i : ACELP->HQ switching flag */
@@ -677,10 +678,10 @@ ivas_error core_switching_post_dec(
synth[i + delay_comp] = ( synth[i + delay_comp] * i + ( tmpDelta - i ) * st->previoussynth[i + delay_comp] ) / tmpDelta;
}
- if ( st->element_mode == IVAS_CPE_MDCT && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 )
+ if ( ( st->element_mode == IVAS_CPE_MDCT || ( ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 )
{
/* smooth transitions to avoid pops in car noise items */
- smoothTransitionMdctStereoDtx( synth, output_frame, delay_comp );
+ smoothTransitionDtxToTcx( synth, output_frame, delay_comp );
}
/* Reset memories of CLDFBs */
@@ -1245,16 +1246,16 @@ static void core_switch_lb_upsamp(
}
/*---------------------------------------------------------------------*
- * smoothTransitionMdctStereoDtx()
+ * smoothTransitionDtxToTcx()
*
- * apply smoothing to the transition part for MDCT-Stereo DTX
+ * apply smoothing to the transition part for inactive to active transitions in DTX
*---------------------------------------------------------------------*/
#define TRANSITION_SMOOTHING_LEN_16k 15
#define TRANSITION_SMOOTHING_LEN_32k 31
#define TRANSITION_SMOOTHING_LEN_48k 47
-static void smoothTransitionMdctStereoDtx(
+static void smoothTransitionDtxToTcx(
float synth[], /* i/o: synthesis */
const int16_t output_frame, /* i : output frame length */
const int16_t delay_comp /* i : delay compensation in samples */
diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c
index 9c8172589405790afab9bd795820260975bbb10b..8a574c95f6aa933a8d595bfb7055bdc6f061ed3a 100644
--- a/lib_dec/dec_tcx.c
+++ b/lib_dec/dec_tcx.c
@@ -107,7 +107,8 @@ void decoder_tcx(
decoder_tcx_tns( st, L_frame_glob, L_spec, L_frame, L_frameTCX, &x[0], fUseTns, &tnsData, bfi, frame_cnt, 0 );
decoder_tcx_imdct( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x[0], &xn_buf[0], MDCT_IV,
- fUseTns, &synth[0], &synthFB[0], bfi, frame_cnt, 0, sba_dirac_stereo_flag );
+ fUseTns, &synth[0], &synthFB[0], bfi, frame_cnt,
+ sba_dirac_stereo_flag );
return;
}
@@ -335,7 +336,8 @@ void IMDCT(
v_multc( old_syn_overl, hTcxDec->conceal_eof_gain * st->last_concealed_gain_syn_deemph, old_syn_overl, overlap );
}
- if ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 || st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && ( st->tcxonly ) )
+ if ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) &&
+ ( st->tcxonly ) )
{
/* Mode decision in PLC
@@ -354,7 +356,6 @@ void IMDCT(
if ( ( !bfi && hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || ( bfi && ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && ( hTcxCfg->tcx_curr_overlap_mode != FULL_OVERLAP ) ) )
{
- assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE );
/* minimum or half overlap, two transforms, grouping into one window */
L_win = L_frame >> 1;
L_ola = ( hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? tcx_mdct_window_min_length : tcx_mdct_window_half_length;
@@ -392,7 +393,7 @@ void IMDCT(
/* To assure that no garbage values are passed to overlap */
set_zero( xn_buf + L_frame + tcx_offset + ( L_ola >> 1 ), overlap - tcx_offset - ( L_ola >> 1 ) );
}
- else if ( !bfi && ( frame_cnt == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ else if ( !bfi && ( frame_cnt == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) )
{
/* special overlap attempt, two transforms, grouping into one window */
@@ -553,7 +554,9 @@ void IMDCT(
/* Window and overlap-add past frame if past frame is TCX */
if ( ( frame_cnt != 0 ) || ( st->last_core_bfi > ACELP_CORE ) )
{
- if ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 || st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && ( st->tcxonly ) ) || ( hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) )
+ if ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) &&
+ ( st->tcxonly ) ) ||
+ ( hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) )
{
if ( !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) && ( st->last_core != ACELP_CORE ) )
{
@@ -616,7 +619,7 @@ void IMDCT(
}
}
- if ( !aldo && ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxDec->L_frameTCX >> 1 ) ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( !aldo && ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxDec->L_frameTCX >> 1 ) ) )
{
/* Compute windowed synthesis in case of switching to ALDO windows in next frame */
mvr2r( xn_buf + L_frame - nz, old_out, nz + overlap );
@@ -1504,7 +1507,7 @@ void decoder_tcx_tns(
if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && isTCX5 )
{
- if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* TBC: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */
+ if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */
{
tcx5TnsUngrouping( L_frameTCX >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x, DEC );
}
@@ -1559,7 +1562,6 @@ void decoder_tcx_imdct(
float synthFB[],
const int16_t bfi, /* i : Bad frame indicator */
const int16_t frame_cnt, /* i : frame counter in the super frame */
- const int16_t isLFE, /* i : is LFE */
const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */
)
{
@@ -1591,7 +1593,8 @@ void decoder_tcx_imdct(
hTcxCfg->tcx_last_overlap_mode = hTcxCfg->tcx_curr_overlap_mode;
}
- if ( !isLFE && st->igf )
+ if (
+ st->igf )
{
proc = st->hIGFDec->flatteningTrigger;
@@ -1689,7 +1692,10 @@ void decoder_tcx_imdct(
if ( st->element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag )
{
- IMDCT( xn_bufFB, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_window : hTcxCfg->tcx_aldo_window_1_trunc, st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_window : hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index,
+ IMDCT( xn_bufFB, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf,
+ hTcxCfg->tcx_aldo_window_1_trunc,
+ hTcxCfg->tcx_aldo_window_2,
+ hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index,
kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir );
}
@@ -1709,7 +1715,9 @@ void decoder_tcx_imdct(
if ( st->element_mode != EVS_MONO )
{
- IMDCT( x_tmp, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_windowFB : hTcxCfg->tcx_aldo_window_1_FB_trunc, st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_windowFB : hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index,
+ IMDCT( x_tmp, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB,
+ hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB,
+ hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index,
kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir );
}
else
@@ -1734,7 +1742,7 @@ void decoder_tcx_imdct(
if ( st->element_mode > EVS_MONO )
{
- st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TBV - or maybe used min(L_frame_TCX,L_FRAME48k) ... */
+ st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TODO - or maybe used min(L_frame_TCX,L_FRAME48k) ... */
}
else
{
diff --git a/lib_dec/dlpc_stoch.c b/lib_dec/dlpc_stoch.c
index 1bbba46b1b2c9c18fcddd5a3eaf0123d95318d18..22a1cda26cef68a9207dd93e0a80742a8304283d 100644
--- a/lib_dec/dlpc_stoch.c
+++ b/lib_dec/dlpc_stoch.c
@@ -81,32 +81,17 @@ void lpc_unquantize(
{
if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED )
{
- lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL );
}
else
{
if ( st->core == TCX_20_CORE )
{
- lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL );
}
else
{
- lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL );
}
}
diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c
index 1ce3bf2035f97aee410f014857fefa7da3b749d1..fb797f92c9da1216601ceaf646c687e71bd30cd9 100644
--- a/lib_dec/er_dec_tcx.c
+++ b/lib_dec/er_dec_tcx.c
@@ -551,20 +551,39 @@ void con_tcx(
mvr2r( synth - M, buf, M );
mvr2r( buf, mem_syn, M );
-
if ( A_cng != NULL )
{
+#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY
+ float alpha_delayed;
+
+ alpha_delayed = 1.0f;
+ if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE )
+ {
+ alpha_delayed = Damping_fact( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE );
+ }
+
+ if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f )
+#else
if ( st->plcBackgroundNoiseUpdated && alpha != 1.0f )
+#endif
{
float lsp_local[M], lsp_fade[M], alpha_inv;
+#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY
+ alpha_inv = 1.0f - alpha_delayed;
+#else
alpha_inv = 1.0f - alpha;
+#endif
a2lsp_stab( A_local, lsp_local, lsp_local );
for ( i = 0; i < M; i++ )
{
+#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY
+ lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i];
+#else
lsp_fade[i] = alpha * lsp_local[i] + alpha_inv * st->lspold_cng[i];
+#endif
}
lsp2a_stab( lsp_fade, A_local, M );
diff --git a/lib_dec/er_util.c b/lib_dec/er_util.c
index 809b0134d9653d91a028804f78eee5468a801782..5326f28e904ef627af30b8f7a4aa926f4a857320 100644
--- a/lib_dec/er_util.c
+++ b/lib_dec/er_util.c
@@ -318,8 +318,7 @@ int16_t GetPLCModeDecision(
{
TonalMDCTConceal_Detect( st->hTonalMDCTConc, ( hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, &numIndices,
- ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ),
- st->mct_chan_mode == MCT_CHAN_MODE_LFE );
+ ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) );
if ( ( numIndices > 10 ) || ( ( numIndices > 5 ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) || ( ( numIndices > 0 ) && ( ( st->last_good <= UNVOICED_TRANSITION ) || ( hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) )
{
diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c
index 23914302375ae1e39dd2cf8bccdc03c1a485d997..fcc1a5ec521f74564435923ae098780dd65e02b4 100644
--- a/lib_dec/evs_dec.c
+++ b/lib_dec/evs_dec.c
@@ -261,7 +261,7 @@ ivas_error evs_dec(
if ( st->core == ACELP_CORE )
{
/* ACELP core decoder */
- if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL ) ) != IVAS_ERR_OK )
+ if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -276,7 +276,7 @@ ivas_error evs_dec(
* Postprocessing for ACELP/MDCT core switching
*---------------------------------------------------------------------*/
- if ( ( error = core_switching_post_dec( st, synth, NULL, NULL, 0, output_frame, core_switching_flag, 0, -1, EVS_MONO ) ) != IVAS_ERR_OK )
+ if ( ( error = core_switching_post_dec( st, synth, NULL, NULL, 0, MONO_FORMAT, output_frame, core_switching_flag, 0, -1, EVS_MONO ) ) != IVAS_ERR_OK )
{
return error;
}
diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c
index 1d4b2ccf905fd310a4db7cdc96b63f8b94939e8b..db8b6a659f45ea35805d908d8b962cd3195f737d 100644
--- a/lib_dec/fd_cng_dec.c
+++ b/lib_dec/fd_cng_dec.c
@@ -158,8 +158,8 @@ void initFdCngDec(
hFdCngDec->cna_ILD_LT = 0.0f;
hFdCngDec->first_cna_noise_updated = 0;
hFdCngDec->first_cna_noise_update_cnt = 0;
- hFdCngDec->cna_nbands = 6;
- mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, MAX_CNA_NBANDS + 1 );
+ hFdCngDec->cna_nbands = CNA_INIT_NBANDS;
+ mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 );
hFdCngDec->cna_act_fact = 1.0f;
hFdCngDec->cna_rescale_fact = 0.0f;
hFdCngDec->cna_seed = 5687;
@@ -425,7 +425,7 @@ void ApplyFdCng(
( *timeDomainInput( -FLT_MAX ) &&
*( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX &&
*( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) &&
- ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD ) &&
+ ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD || ( st->ini_frame < 100 && st->is_ism_format ) ) &&
!( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) ||
( st->element_mode == IVAS_CPE_TD ) ) &&
( !st->BER_detect ) )
@@ -966,10 +966,13 @@ void FdCng_decodeSID(
float v[32];
int16_t indices[32];
HANDLE_FD_CNG_COM hFdCngCom;
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
- const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas;
const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS;
+ invTrfMatrix = (float *) tmpRAM;
+
hFdCngCom = ( st->hFdCngDec )->hFdCngCom;
sidNoiseEst = hFdCngCom->sidNoiseEst;
@@ -987,7 +990,17 @@ void FdCng_decodeSID(
index = get_next_indice( st, 7 );
/* MSVQ decoder */
- msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL );
+
+ if ( st->element_mode != EVS_MONO )
+ {
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL );
+ }
+ else
+ { /* Legacy EVS_MONO MSVQ tables */
+ msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL );
+ }
+
/* Decode gain */
gain = ( (float) index - gain_q_offset ) / 1.5f;
@@ -1091,7 +1104,7 @@ void generate_comfort_noise_dec(
c2 = (float) sqrt( 1 - hFdCngCom->coherence );
seed2 = &( hFdCngCom->seed2 );
- if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( ( st->element_mode == IVAS_CPE_MDCT && st->idchan == 1 ) || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
seed2 = &( hFdCngCom->seed3 );
}
@@ -1101,7 +1114,7 @@ void generate_comfort_noise_dec(
if ( hFdCngCom->startBand == 0 )
{
- if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
rand_gauss( &tmp1, seed );
rand_gauss( &tmp2, seed2 );
@@ -1126,7 +1139,7 @@ void generate_comfort_noise_dec(
for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ )
{
/* Real part in FFT bins */
- if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
rand_gauss( &tmp1, seed );
rand_gauss( &tmp2, seed2 );
@@ -1140,7 +1153,7 @@ void generate_comfort_noise_dec(
ptr_r += 2;
/* Imaginary part in FFT bins */
- if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
rand_gauss( &tmp1, seed );
rand_gauss( &tmp2, seed2 );
@@ -1218,7 +1231,7 @@ void generate_comfort_noise_dec(
for ( i = 0; i < hFdCngCom->numSlots; i++ )
{
/* Real part in CLDFB band */
- if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
rand_gauss( &tmp1, seed );
rand_gauss( &tmp2, seed2 );
@@ -1231,7 +1244,7 @@ void generate_comfort_noise_dec(
bufferReal[i][j] *= (float) sqrt( ( scaleCldfb * *ptr_level ) * 0.5f );
/* Imaginary part in CLDFB band */
- if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_paramISM_flag ) )
+ if ( st->element_mode == IVAS_CPE_MDCT || ( st->element_mode == IVAS_SCE && st->cng_ism_flag ) )
{
rand_gauss( &tmp1, seed );
rand_gauss( &tmp2, seed2 );
@@ -1328,10 +1341,10 @@ void generate_comfort_noise_dec(
*-------------------------------------------------------------------*/
void generate_comfort_noise_dec_hf(
- float **bufferReal, /* o : Real part of input bands */
- float **bufferImag, /* o : Imaginary part of input bands */
- HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
- const int16_t cng_coh_flag /* i : CNG Flag for coherence handling */
+ float **bufferReal, /* o : Real part of input bands */
+ float **bufferImag, /* o : Imaginary part of input bands */
+ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
+ const int16_t cng_coh_flag /* i : CNG Flag for coherence handling */
)
{
int16_t i, j;
@@ -1347,7 +1360,7 @@ void generate_comfort_noise_dec_hf(
{
seed2 = &( hFdCngCom->seed3 );
- c1 = (float) sqrt( hFdCngCom->coherence );
+ c1 = (float) sqrt( hFdCngCom->coherence ); // VE!!!!! all occurences of "(float) sqrt()" should be replaced by "sqrtf()"
c2 = (float) sqrt( 1 - hFdCngCom->coherence );
}
@@ -1781,6 +1794,161 @@ void generate_stereo_masking_noise(
}
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------
+ * generate_masking_noise_hf_cldfb()
+ *
+ * Generate additional comfort noise (kind of noise filling)
+ *-------------------------------------------------------------------*/
+
+void generate_masking_noise_lb_dirac(
+ HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */
+ float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */
+ const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */
+ const int16_t cna_flag /* i : CNA flag for LB and HB */
+)
+{
+ int16_t i;
+ float *cngNoiseLevel = hFdCngCom->cngNoiseLevel;
+ float *fftBuffer = hFdCngCom->fftBuffer;
+ float *ptr_r;
+ float *ptr_i;
+ float *ptr_level;
+ int16_t *seed = &( hFdCngCom->seed );
+ float scale;
+ int16_t n_samples_out, n_samples_start, n_samples_out_loop;
+
+ push_wmops( "fd_cng_dirac" );
+
+ /* Init */
+ scale = 0.f;
+ n_samples_out = hFdCngCom->frameSize / DEFAULT_JBM_CLDFB_TIMESLOTS * nCldfbTs;
+ n_samples_start = 0;
+
+ /*LB CLDFB - CNA from STFT*/
+#ifdef DEBUG_MODE_DIRAC
+ {
+ int16_t tmp_s;
+ tmp_s = (int16_t) ( 32768.f * 0.5f * hFdCngCom->likelihood_noisy_speech * cna_flag + 0.5f );
+ dbgwrite( &tmp_s, sizeof( int16_t ), 1, hFdCngCom->frameSize / 16, "./res/ivas_dirac_likelihood_noisy.pcm" );
+ }
+#endif
+ if ( cna_flag )
+ {
+ /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */
+ if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE )
+ {
+ /* Compute additional CN level */
+ for ( i = 0; i < 15; i++ )
+ {
+ if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_dirac[i].bwmode ) &&
+ ( hFdCngCom->CngBitrate >= scaleTable_cn_dirac[i].bitrateFrom ) &&
+ ( hFdCngCom->CngBitrate < scaleTable_cn_dirac[i].bitrateTo ) )
+ {
+ break;
+ }
+ }
+
+ scale = (float) pow( 10.f, -scaleTable_cn_dirac[i].scale / 10.f ) - 1.f;
+ scale *= hFdCngCom->likelihood_noisy_speech;
+ }
+ }
+
+ /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/
+ if ( cna_flag && tdBuffer != NULL )
+ {
+ while ( n_samples_out > 0 )
+ {
+ n_samples_out_loop = min( hFdCngCom->frameSize, n_samples_out );
+ if ( scale != 0 )
+ {
+ /*Generate LF comfort noise only at first slot, for the whole frame*/
+ ptr_level = cngNoiseLevel;
+
+ /* Generate Gaussian random noise in real and imaginary parts of the FFT bins
+ Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */
+ if ( hFdCngCom->startBand == 0 )
+ {
+ rand_gauss( &fftBuffer[0], seed );
+ ptr_r = fftBuffer + 2;
+ fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */
+ ptr_level++;
+ }
+ else
+ {
+ fftBuffer[0] = 0.f;
+ set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) );
+ ptr_r = fftBuffer + 2 * hFdCngCom->startBand;
+ }
+ ptr_i = ptr_r + 1;
+
+ for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ )
+ {
+ /* Real part in FFT bins */
+ rand_gauss( ptr_r, seed );
+ ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f );
+ ptr_r += 2;
+ /* Imaginary part in FFT bins */
+ rand_gauss( ptr_i, seed );
+ ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f );
+ ptr_i += 2;
+ }
+
+ /* Remaining FFT bins are set to zero */
+ set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin );
+ /* Nyquist frequency is discarded */
+ fftBuffer[1] = 0.f;
+
+ /* Perform STFT synthesis */
+ SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom );
+
+#ifdef DEBUG_MODE_DIRAC
+ {
+ int16_t tmp[1000];
+
+ for ( i = 0; i < hFdCngCom->frameSize; i++ )
+ {
+ tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f );
+ }
+ dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" );
+ }
+#endif
+ }
+
+ else
+ {
+ /* very low level case - update random seeds */
+ generate_masking_noise_update_seed( hFdCngCom );
+
+ set_f( fftBuffer, 0.f, hFdCngCom->fftlen );
+
+ /* Perform STFT synthesis */
+ SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom );
+
+#ifdef DEBUG_MODE_DIRAC
+ {
+ int16_t tmp[1000];
+
+ for ( i = 0; i < hFdCngCom->frameSize; i++ )
+ {
+ tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f );
+ }
+ dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" );
+ }
+#endif
+ }
+ n_samples_out -= hFdCngCom->frameSize;
+ n_samples_start += hFdCngCom->frameSize;
+ }
+ }
+
+ pop_wmops();
+
+ return;
+}
+#endif
+
+
/*-------------------------------------------------------------------
* generate_masking_noise_hf_cldfb()
*
@@ -1799,10 +1967,12 @@ void generate_masking_noise_dirac(
)
{
int16_t i;
+#ifndef JBM_TSM_ON_TCS
float *cngNoiseLevel = hFdCngCom->cngNoiseLevel;
float *fftBuffer = hFdCngCom->fftBuffer;
float *ptr_r;
float *ptr_i;
+#endif
float *ptr_level;
int16_t *seed = &( hFdCngCom->seed );
float scale;
@@ -1849,12 +2019,12 @@ void generate_masking_noise_dirac(
scale *= hFdCngCom->likelihood_noisy_speech;
}
}
-
/* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/
if ( cna_flag && tdBuffer != NULL )
{
if ( scale != 0 )
{
+#ifndef JBM_TSM_ON_TCS
/*Generate LF comfort noise only at first slot, for the whole frame*/
if ( slot_index == 0 )
{
@@ -1909,12 +2079,13 @@ void generate_masking_noise_dirac(
}
#endif
}
-
+#endif
/* LF CLDFB*/
cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb );
}
else
{
+#ifndef JBM_TSM_ON_TCS
if ( slot_index == 0 )
{
/* very low level case - update random seeds */
@@ -1937,7 +2108,7 @@ void generate_masking_noise_dirac(
}
#endif
}
-
+#endif
/* LB ana CLDFB*/
cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb );
}
@@ -1992,6 +2163,12 @@ void FdCngDecodeMDCTStereoSID(
int16_t indices[FD_CNG_stages_37bits];
int16_t N, i, ch, p, stages;
int16_t is_out_ms;
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+
+
+ invTrfMatrix = (float *) tmpRAM;
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
is_out_ms = 0;
if ( hCPE->hCoreCoder[0]->cng_sba_flag )
@@ -2035,7 +2212,7 @@ void FdCngDecodeMDCTStereoSID(
}
/* MSVQ decoder */
- msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, ms_ptr[ch], NULL );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[ch], NULL );
}
dtx_read_padding_bits( sts[1], ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
@@ -2079,7 +2256,7 @@ void FdCngDecodeMDCTStereoSID(
/*-------------------------------------------------------------------
* FdCngDecodeDiracMDCTStereoSID()
*
- * Decode FD-Cng parameters for CNG in 2TC DirAC mode from the bitstream
+ * Decode FD-CNG parameters for CNG in 2TC DirAC mode from the bitstream
*-------------------------------------------------------------------*/
void FdCngDecodeDiracMDCTStereoSID(
@@ -2094,6 +2271,12 @@ void FdCngDecodeDiracMDCTStereoSID(
float gain[CPE_CHANNELS];
int16_t indices[FD_CNG_stages_37bits];
int16_t N, i, ch, p;
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+
+
+ invTrfMatrix = (float *) tmpRAM; /* dynamically filled */
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
@@ -2116,7 +2299,7 @@ void FdCngDecodeDiracMDCTStereoSID(
gain[1] = gain[0];
/* MSVQ decoder */
- msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, ms_ptr[0], NULL );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[0], NULL );
mvr2r( ms_ptr[0], ms_ptr[1], N );
/*inverseMS( N, ms_ptr[0], ms_ptr[1], 1.f );*/
diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c
index e8112c6c4da76ee0a2eb5e970a749427acd9a494..ff684b47d36375e0b6d28a53ba3622f007b53307 100644
--- a/lib_dec/gs_dec.c
+++ b/lib_dec/gs_dec.c
@@ -111,7 +111,7 @@ void decod_audio(
}
/* set bit-allocation */
- config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
/*---------------------------------------------------------------*
* Decode energy dynamics
@@ -541,8 +541,7 @@ void gsc_dec(
i++;
}
- if ( st->element_mode > EVS_MONO && coder_type == AUDIO &&
- st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */
+ if ( st->element_mode > EVS_MONO && coder_type == AUDIO && st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation is mapped to 8 kb/s instead of 9.6 kb/s in this case */
{
i--;
}
diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c
index a8c24a11f5ef8e1afd5723f012d208e64bb2134d..c9997f5782eade42665d738f97eaf86edda80139 100644
--- a/lib_dec/init_dec.c
+++ b/lib_dec/init_dec.c
@@ -326,7 +326,7 @@ ivas_error init_decoder(
set_f( st->old_synth_sw, 0.0f, NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) );
}
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE || st->element_mode == EVS_MONO ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE || st->element_mode == EVS_MONO ) )
{
if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL )
{
@@ -519,16 +519,9 @@ ivas_error init_decoder(
}
/* open synthesis for output sampling rate */
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( error = openCldfb( &st->cldfbSyn, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
{
- if ( ( error = openCldfb( &st->cldfbSyn, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
- else
- {
- st->cldfbSyn = NULL;
+ return error;
}
st->cldfbSynHB = NULL;
@@ -585,7 +578,7 @@ ivas_error init_decoder(
*-----------------------------------------------------------------*/
/* TCX-LTP */
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) )
{
if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
{
@@ -598,7 +591,7 @@ ivas_error init_decoder(
}
/* TCX core */
- // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172
+
if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT )
{
if ( ( st->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL )
@@ -617,7 +610,7 @@ ivas_error init_decoder(
}
/* TCX config. data structure */
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) )
{
if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL )
{
@@ -630,7 +623,7 @@ ivas_error init_decoder(
}
/* Tonal MDCT concealment data structure */
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) )
{
if ( ( st->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL )
{
@@ -646,7 +639,7 @@ ivas_error init_decoder(
* IGF
*-----------------------------------------------------------------*/
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) )
{
if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL )
{
@@ -709,7 +702,7 @@ ivas_error init_decoder(
* FD-CNG decoder
*-----------------------------------------------------------------*/
- if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT )
+ if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX )
{
/* Create FD_CNG instance */
if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK )
@@ -738,8 +731,8 @@ ivas_error init_decoder(
st->tdm_LRTD_flag = 0;
st->cna_dirac_flag = 0;
st->cng_sba_flag = 0;
- st->cng_paramISM_flag = 0;
- st->read_sid_info = 1; /* by default read the sid info from bitstream */
+ st->cng_ism_flag = 0;
+ st->is_ism_format = 0;
return error;
diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c
index 6858f8653ce96038bb1eb6659c4b9b9bca9c434f..e77d43d2e8ff87b147c67008c0cca927fd036efd 100644
--- a/lib_dec/ivas_binRenderer_internal.c
+++ b/lib_dec/ivas_binRenderer_internal.c
@@ -59,7 +59,10 @@ static void ivas_binRenderer_filterModule(
float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */
float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */
float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */
- BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to process */
+#endif
+ BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */
)
{
int16_t bandIdx, k, chIdx, tapIdx;
@@ -78,7 +81,11 @@ static void ivas_binRenderer_filterModule(
filterTapsRightRealPtr = hBinRenderer->hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx];
filterTapsRightImagPtr = hBinRenderer->hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx];
+#ifdef JBM_TSM_ON_TCS
+ for ( k = 0; k < numTimeSlots; k++ )
+#else
for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ )
+#endif
{
float outRealLeft = 0.0f, outRealRight = 0.0f, outImagLeft = 0.0f, outImagRight = 0.0f;
@@ -143,11 +150,16 @@ static ivas_error ivas_binRenderer_convModuleOpen(
if ( !isLoudspeaker )
{
+#ifdef UPDATE_SBA_FILTER
+ hBinRenderer->nInChannels = audioCfg2channels( input_config );
+#else
hBinRenderer->nInChannels = 16;
+#endif
}
else
{
- hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present
+ /* Note: needs to be revisited if multiple LFE support is required */
+ hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker );
}
if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir )
@@ -179,7 +191,11 @@ static ivas_error ivas_binRenderer_convModuleOpen(
}
else
{
+#ifdef UPDATE_SBA_FILTER
+ hBinRenConvModule->numTaps = BINAURAL_NTAPS;
+#else
hBinRenConvModule->numTaps = 7;
+#endif
/* Use fixed order filtering */
bandIdx = 0;
@@ -342,11 +358,42 @@ static ivas_error ivas_binRenderer_convModuleOpen(
}
else
{
+#ifdef UPDATE_SBA_FILTER
+ if ( input_config == AUDIO_CONFIG_HOA3 )
+ {
+ /* HOA3 filter coefficients */
+ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx];
+ }
+ else if ( input_config == AUDIO_CONFIG_HOA2 )
+ {
+ /* HOA2 filter coefficients */
+ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx];
+ }
+ else if ( input_config == AUDIO_CONFIG_FOA )
+ {
+ /* FOA filter coefficients */
+ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx];
+ hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx];
+ }
+ else
+ {
+ return IVAS_ERR_INVALID_INPUT_FORMAT;
+ }
+#else
/* HOA3 filter coefficients */
hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx];
hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx];
hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx];
hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx];
+#endif
}
}
}
@@ -385,16 +432,28 @@ static ivas_error ivas_binaural_hrtf_open(
HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s;
HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s;
+#ifdef UPDATE_SBA_FILTER
+ HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s;
+ HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s;
+#endif
HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s;
for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
{
for ( j = 0; j < HRTF_LS_CHANNELS; j++ )
{
+#ifdef UPDATE_SBA_FILTER
+ mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], BINAURAL_NTAPS );
+ mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], BINAURAL_NTAPS );
+#else
mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], 7 );
mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], 7 );
mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], 7 );
mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], 7 );
+#endif
+
mvr2r( leftBRIRReal[i][j], HrtfFastConv->leftBRIRReal[i][j], BINAURAL_NTAPS_MAX );
mvr2r( leftBRIRImag[i][j], HrtfFastConv->leftBRIRImag[i][j], BINAURAL_NTAPS_MAX );
@@ -402,6 +461,29 @@ static ivas_error ivas_binaural_hrtf_open(
mvr2r( rightBRIRImag[i][j], HrtfFastConv->rightBRIRImag[i][j], BINAURAL_NTAPS_MAX );
}
+#ifdef UPDATE_SBA_FILTER
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS );
+ mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS );
+ }
+ for ( j = 0; j < 9; j++ )
+ {
+ mvr2r( leftHRIRReal_HOA2[i][j], HrtfFastConv->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
+ mvr2r( leftHRIRImag_HOA2[i][j], HrtfFastConv->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRReal_HOA2[i][j], HrtfFastConv->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRImag_HOA2[i][j], HrtfFastConv->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
+ }
+ for ( j = 0; j < 4; j++ )
+ {
+ mvr2r( leftHRIRReal_FOA[i][j], HrtfFastConv->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS );
+ mvr2r( leftHRIRImag_FOA[i][j], HrtfFastConv->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS );
+ mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS );
+ }
+#else
for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
{
mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 );
@@ -409,6 +491,7 @@ static ivas_error ivas_binaural_hrtf_open(
mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 );
mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 );
}
+#endif
}
mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX );
@@ -428,15 +511,15 @@ static ivas_error ivas_binaural_hrtf_open(
static void ivas_binaural_obtain_DMX(
const int16_t numTimeSlots,
- BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */
- float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */
- float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */
- float realDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- float imagDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] )
+ BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */
+ float RealBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */
+ float ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */
+ float realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] )
{
int16_t chIdx, bandIdx, k;
- // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT -> TBV
+ // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT
if ( hBinRenderer->ivas_format == MC_FORMAT || hBinRenderer->ivas_format == ISM_FORMAT )
{
/* Obtain the downmix */
@@ -658,7 +741,26 @@ ivas_error ivas_binRenderer_open(
}
else
{
+#ifdef UPDATE_SBA_FILTER
+ if ( hBinRenderer->nInChannels == 16 )
+ {
+ st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f );
+ }
+ else if ( hBinRenderer->nInChannels == 9 )
+ {
+ st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f );
+ }
+ else if ( hBinRenderer->nInChannels == 4 )
+ {
+ st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f );
+ }
+ else
+ {
+ return IVAS_ERR_INVALID_INPUT_FORMAT;
+ }
+#else
st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f );
+#endif
}
}
else
@@ -851,9 +953,14 @@ void ivas_binRenderer_close(
*-------------------------------------------------------------------------*/
void ivas_binaural_add_LFE(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- int16_t output_frame, /* i : length of input frame */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ int16_t output_frame, /* i : length of input frame */
+#ifdef JBM_TSM_ON_TCS
+ float *input_f[], /* i : transport channels */
+ float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
)
{
int16_t render_lfe, idx_lfe;
@@ -880,10 +987,17 @@ void ivas_binaural_add_LFE(
}
for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ )
{
+#ifdef JBM_TSM_ON_TCS
+ v_multc( input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame );
+ /* copy LFE to left and right channels */
+ v_add( output_f[0], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame );
+ v_add( output_f[1], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame );
+#else
v_multc( output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame );
/* copy LFE to left and right channels */
v_add( output_f[0], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame );
v_add( output_f[1], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame );
+#endif
}
}
@@ -899,8 +1013,12 @@ void ivas_binaural_add_LFE(
*-------------------------------------------------------------------------*/
void ivas_binaural_cldfb(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
)
{
float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
@@ -943,12 +1061,19 @@ void ivas_binaural_cldfb(
}
/* Implement binaural rendering */
+#ifdef JBM_TSM_ON_TCS
+#ifdef EXTERNAL_ORIENTATIONS
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+#else
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+#endif
+#else
#ifdef EXTERNAL_ORIENTATIONS
- ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
#else
ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
#endif
-
+#endif
/* Implement CLDFB synthesis */
for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
{
@@ -969,6 +1094,106 @@ void ivas_binaural_cldfb(
return;
}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------*
+ * ivas_binaural_cldfb_sf()
+ *
+ * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis
+ *-------------------------------------------------------------------------*/
+
+void ivas_binaural_cldfb_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+)
+{
+ float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
+ int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch;
+ int16_t slot_size, slots_to_render, first_sf, last_sf;
+ int16_t slot_index_start, slot_index_start_cldfb;
+
+ /* Implement a 5 msec loops */
+ maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 );
+ slot_size = st_ivas->hTcBuffer->nb_subframes;
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / slot_size );
+ first_sf = st_ivas->hTcBuffer->subframes_rendered;
+ last_sf = first_sf;
+ slot_index_start = st_ivas->hTcBuffer->slots_rendered;
+ slot_index_start_cldfb = 0;
+ st_ivas->hTcBuffer->slots_rendered += slots_to_render;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+ for ( subframeIdx = first_sf; subframeIdx < last_sf; subframeIdx++ )
+ {
+ for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ )
+ {
+ index_slot = slot_index_start + slot_idx;
+
+ /* Implement CLDFB analysis */
+ idx_in = 0;
+ idx_lfe = 0;
+
+ for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ )
+ {
+ if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[idx_lfe] == ch ) )
+ {
+ if ( idx_lfe < ( st_ivas->hIntSetup.num_lfe - 1 ) )
+ {
+ idx_lfe++;
+ }
+ }
+ else
+ {
+ cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][maxBand * index_slot] ),
+ Cldfb_RealBuffer[idx_in][slot_idx],
+ Cldfb_ImagBuffer[idx_in][slot_idx],
+ maxBand, st_ivas->cldfbAnaDec[idx_in] );
+ idx_in++;
+ }
+ }
+ }
+
+ /* Implement binaural rendering */
+#ifdef JBM_TSM_ON_TCS
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+#else
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+#endif
+
+ /* Implement CLDFB synthesis */
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+ float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+
+ for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ )
+ {
+ RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx];
+ ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx];
+ }
+
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_index_start_cldfb * maxBand] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] );
+ }
+ slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx];
+ slot_index_start_cldfb += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx];
+ }
+
+ st_ivas->hTcBuffer->subframes_rendered = last_sf;
+
+ return;
+}
+#endif
#endif
@@ -979,11 +1204,14 @@ void ivas_binaural_cldfb(
*-------------------------------------------------------------------------*/
void ivas_binRenderer(
- BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */
- HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */
+ BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */
+ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */
#ifdef EXTERNAL_ORIENTATIONS
COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */
int16_t subframe_idx, /* i : subframe index */
+#endif
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to render*/
#endif
float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */
float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */
@@ -992,7 +1220,9 @@ void ivas_binRenderer(
)
{
int16_t chIdx, k;
+#ifndef JBM_TSM_ON_TCS
int16_t numTimeSlots = MAX_PARAM_SPATIAL_SUBFRAMES;
+#endif
push_wmops( "fastconv_binaural_rendering" );
@@ -1039,17 +1269,29 @@ void ivas_binRenderer(
if ( hHeadTrackData->shd_rot_max_order == -1 )
{
QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat );
+#ifdef JBM_TSM_ON_TCS
+ rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 );
+#else
rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 );
+#endif
}
else if ( hHeadTrackData->shd_rot_max_order > 0 )
{
+#ifdef JBM_TSM_ON_TCS
+ rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order );
+#else
rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order );
+#endif
}
}
else
{
/* Rotation in SD (CICPx) */
+#ifdef JBM_TSM_ON_TCS
+ rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band );
+#else
rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band );
+#endif
}
}
#endif
@@ -1057,19 +1299,26 @@ void ivas_binRenderer(
/* HOA decoding to CICP19 if needed*/
if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx );
+#else
ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, hBinRenderer->hoa_dec_mtx );
+#endif
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, numTimeSlots, hBinRenderer );
+#else
ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, hBinRenderer );
+#endif
/* Obtain the binaural dmx and compute the reverb */
if ( hBinRenderer->hReverb != NULL )
{
- float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- float inRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- float inIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
-
+ float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float inRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float inIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
ivas_binaural_obtain_DMX( numTimeSlots, hBinRenderer, RealBuffer, ImagBuffer, inRe, inIm );
for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ )
@@ -1081,7 +1330,11 @@ void ivas_binRenderer(
}
}
- ivas_binaural_reverb_processFrame( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm, 0u );
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm );
+#else
+ ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm );
+#endif
/* Add the conv module and reverb module output */
for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ )
diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c
old mode 100755
new mode 100644
index f1a897351f795869ed103400eb180358e0c9e8af..9d6211bf8f56e6508b593c3a41feb509c85a6465
--- a/lib_dec/ivas_core_dec.c
+++ b/lib_dec/ivas_core_dec.c
@@ -90,6 +90,7 @@ ivas_error ivas_core_dec(
int16_t use_cldfb_for_dft;
float *p_output_mem;
int16_t flag_sec_CNA;
+ int16_t read_sid_info;
int16_t last_element_mode;
int16_t nchan_out;
float *save_hb_synth;
@@ -105,6 +106,7 @@ ivas_error ivas_core_dec(
use_cldfb_for_dft = 0;
tdm_LRTD_flag = -1;
+ read_sid_info = 1; /* read SID by default */
if ( hSCE != NULL )
{
@@ -116,6 +118,13 @@ ivas_error ivas_core_dec(
hStereoTD = NULL;
p_output_mem = NULL;
nchan_out = 1;
+ if ( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT )
+ {
+ if ( st_ivas->hISMDTX.sce_id_dtx != hSCE->sce_id )
+ {
+ read_sid_info = 0;
+ }
+ }
}
else
{
@@ -332,7 +341,7 @@ ivas_error ivas_core_dec(
if ( st->core == ACELP_CORE )
{
/* ACELP core decoder */
- if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng ) ) != IVAS_ERR_OK )
+ if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -341,7 +350,7 @@ ivas_error ivas_core_dec(
if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT )
{
/* TCX decoder */
- stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format, st_ivas == NULL ? 0 : st_ivas->ism_mode );
+ stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format );
}
if ( st->core == HQ_CORE )
@@ -446,7 +455,7 @@ ivas_error ivas_core_dec(
mvr2r( synth[n], hSCE->save_synth, output_frame );
}
- if ( ( error = core_switching_post_dec( st, synth[n], output[n], p_output_mem, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE ) ) != IVAS_ERR_OK )
+ if ( ( error = core_switching_post_dec( st, synth[n], output[n], p_output_mem, ( st_ivas != NULL ) ? st_ivas->ivas_format : UNDEFINED_FORMAT, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE ) ) != IVAS_ERR_OK )
{
return error;
}
diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c
index a066164da4dea999bdcbdcd92f064b4e941226e5..e112a8ec040ce6bc96adc27314eafd8d69f3ab69 100644
--- a/lib_dec/ivas_corecoder_dec_reconfig.c
+++ b/lib_dec/ivas_corecoder_dec_reconfig.c
@@ -87,8 +87,8 @@ ivas_error ivas_corecoder_dec_reconfig(
*-----------------------------------------------------------------*/
/* remove dummy CPE element for DFT stereo-like upmix */
- if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) ||
- ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) )
+ if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) ||
+ ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) )
{
st_ivas->hCPE[0]->hCoreCoder[0] = NULL;
st_ivas->hCPE[0]->hCoreCoder[1] = NULL;
@@ -146,6 +146,21 @@ ivas_error ivas_corecoder_dec_reconfig(
for ( cpe_id = st_ivas->nCPE; cpe_id < nCPE_old; cpe_id++ )
{
+ /* don't deallocate first CPE in case of mono/stereo output of 1 TC SBA, only deallocate core coder */
+ if ( cpe_id == 0 && st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old )
+ {
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ if ( st_ivas->hCPE[cpe_id]->hCoreCoder[n] != NULL )
+ {
+ destroy_core_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] );
+
+ free( st_ivas->hCPE[cpe_id]->hCoreCoder[n] );
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n] = NULL;
+ }
+ }
+ continue;
+ }
destroy_cpe_dec( st_ivas->hCPE[cpe_id] );
st_ivas->hCPE[cpe_id] = NULL;
}
@@ -185,6 +200,11 @@ ivas_error ivas_corecoder_dec_reconfig(
return error;
}
}
+ if ( st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old && st_ivas->nchan_transport == 1 && nSCE_old == 0 )
+ {
+ st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */
+ st_ivas->hCPE[0]->hCoreCoder[1] = NULL;
+ }
for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ )
{
@@ -264,9 +284,21 @@ ivas_error ivas_corecoder_dec_reconfig(
if ( ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) ||
( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) )
{
- if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
+ /* if at least one CPE is already available, only allocate DFT Stereo struct */
+ if ( st_ivas->nCPE > 0 )
{
- return error;
+ if ( ( error = stereo_dft_dec_create( &( st_ivas->hCPE[0]->hStereoDft ), st_ivas->hCPE[0]->element_brate, st_ivas->hDecoderConfig->output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ /* otherwise create extra dummy CPE */
+ else
+ {
+ if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
set_f( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );
@@ -297,37 +329,9 @@ ivas_error ivas_corecoder_dec_reconfig(
* Set CNA/CNG flags
*-----------------------------------------------------------------*/
- /// VE: this could be merged with part of ivas_init_decoder()
- if ( st_ivas->ivas_format == SBA_FORMAT )
+ if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
{
- if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 )
- {
- /* skip as done in init function */
- }
- else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) )
- {
- st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1;
- st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1;
- }
- else if ( st_ivas->nchan_transport == 2 )
- {
- for ( n = 0; n < CPE_CHANNELS; n++ )
- {
- st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0;
- st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1;
- }
- }
- else
- {
- for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
- {
- for ( n = 0; n < CPE_CHANNELS; n++ )
- {
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cna_dirac_flag = 0;
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 0;
- }
- }
- }
+ ivas_sba_set_cna_cng_flag( st_ivas );
}
/* special case, if the decoder goes from 1TC DTX to 2TC active frame (in case the bitstream started with an SBA SID frame), allocate DTX memories */
@@ -507,8 +511,13 @@ ivas_error ivas_cldfb_dec_reconfig(
}
}
+#ifndef SBA_MODE_CLEAN_UP
/* CLDFB Interpolation weights */
- if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) )
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 )
+#else
+ /* CLDFB Interpolation weights */
+ if ( st_ivas->ivas_format == SBA_FORMAT && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 )
+#endif
{
ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig );
}
diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c
old mode 100644
new mode 100755
index ddd4ae363feef98107508958914daa32ca85362b..a19fb21dc2fdcbb8574a9147eb0989cc936c662b
--- a/lib_dec/ivas_cpe_dec.c
+++ b/lib_dec/ivas_cpe_dec.c
@@ -292,7 +292,7 @@ ivas_error ivas_cpe_dec(
}
else
{
- /* subtract metadata bitbudget */ /* IVAS_fmToDo: TBC whether it is not better to distribute the metadata bits equally between 2 channels */
+ /* subtract metadata bitbudget */
sts[0]->bits_frame_channel -= nb_bits_metadata;
}
}
@@ -405,7 +405,12 @@ ivas_error ivas_cpe_dec(
}
else
{
- stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0 );
+ stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0
+#ifdef FIX_STEREO_474
+ ,
+ MAX_PARAM_SPATIAL_SUBFRAMES
+#endif
+ );
}
/* synthesis iFFT */
@@ -687,10 +692,6 @@ ivas_error create_cpe_dec(
st->total_brate = hCPE->element_brate / ( CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
st->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL )
- {
- st->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
if ( ( error = init_decoder( st, n, st_ivas->mc_mode ) ) != IVAS_ERR_OK )
{
@@ -831,11 +832,13 @@ void destroy_cpe_dec(
int16_t n;
Decoder_State *st;
- /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */
- if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->mct_chan_mode == MCT_CHAN_MODE_LFE && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg )
+#ifndef REMOVE_OBS_CODE
+ /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */ /*TODO Check this again with LFE clean up!*/
+ if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg )
{
hCPE->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
}
+#endif
for ( n = 0; n < CPE_CHANNELS; n++ )
{
diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c
index e154317da134551b5f78ab5e5cd97499e1412c8d..024fecc8a4e23ca14938ed795a11a786af62e0fc 100644
--- a/lib_dec/ivas_dec.c
+++ b/lib_dec/ivas_dec.c
@@ -57,14 +57,18 @@ ivas_error ivas_dec(
)
{
int16_t n, output_frame, nchan_out;
- Decoder_State *st; /* used for bitstream handling */
- float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */
+ Decoder_State *st; /* used for bitstream handling */
+ float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */
int16_t nchan_remapped;
float output_lfe_ch[L_FRAME48k];
int16_t nb_bits_metadata[MAX_SCE];
int32_t output_Fs, ivas_total_brate;
AUDIO_CONFIG output_config;
+ float pan_left, pan_right;
ivas_error error;
+#ifdef JBM_TSM_ON_TCS
+ float *p_output[MAX_OUTPUT_CHANNELS];
+#endif
error = IVAS_ERR_OK;
@@ -80,7 +84,11 @@ ivas_error ivas_dec(
if ( st_ivas->bfi == 0 )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_dec_setup( st_ivas, NULL, NULL ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_dec_setup( st_ivas ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -97,6 +105,13 @@ ivas_error ivas_dec(
output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
+#ifdef JBM_TSM_ON_TCS
+ for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ )
+ {
+ p_output[n] = &output[n][0];
+ }
+#endif
+
#ifdef EXTERNAL_ORIENTATIONS
/*----------------------------------------------------------------*
* Combine orientations
@@ -146,7 +161,11 @@ ivas_error ivas_dec(
/* Rendering */
if ( st_ivas->renderer_type == RENDERER_MC )
{
- ivas_ls_setup_conversion( st_ivas, output_frame, output );
+#ifdef JBM_TSM_ON_TCS
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+#else
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output );
+#endif
}
}
else if ( st_ivas->ivas_format == ISM_FORMAT )
@@ -161,11 +180,17 @@ ivas_error ivas_dec(
}
else if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm );
+ if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
else /* ISM_MODE_DISC */
{
- ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL );
+ if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
for ( n = 0; n < st_ivas->nchan_transport; n++ )
@@ -196,6 +221,13 @@ ivas_error ivas_dec(
{
ivas_mono_downmix_render_passive( st_ivas, output, output_frame );
}
+ else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f;
+ pan_right = 1.f - pan_left;
+ v_multc( output[0], pan_right, output[1], output_frame );
+ v_multc( output[0], pan_left, output[0], output_frame );
+ }
else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
{
ivas_param_ism_dec( st_ivas, output );
@@ -203,7 +235,11 @@ ivas_error ivas_dec(
if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
{
/* Convert CICP19 -> Ambisonics */
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#else
ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#endif
}
}
}
@@ -214,37 +250,75 @@ ivas_error ivas_dec(
{
ivas_mono_downmix_render_passive( st_ivas, output, output_frame );
}
+ else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f;
+ pan_right = 1.f - pan_left;
+ v_multc( output[0], pan_right, output[1], output_frame );
+ v_multc( output[0], pan_left, output[0], output_frame );
+ }
else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
{
/* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */
+#ifdef JBM_TSM_ON_TCS
+ ivas_ism_render( st_ivas, p_output, output_frame );
+#else
ivas_ism_render( st_ivas, output, output_frame );
+#endif
}
+#ifdef DEBUGGING
else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
+#else
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+#endif
{
/* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */
- ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_transport, output_frame, st_ivas->hIntSetup.ambisonics_order );
+#ifdef JBM_TSM_ON_TCS
+ ivas_ism2sba( p_output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order );
+#else
+ ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order );
+#endif
}
/* Binaural rendering */
if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
{
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK )
+#else
if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
}
else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
{
- if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL,
+#ifdef JBM_TSM_ON_TCS
+ p_output,
+#else
+ output,
+#endif
+ output_Fs ) ) != IVAS_ERR_OK )
{
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output );
+#else
ivas_binaural_add_LFE( st_ivas, output_frame, output );
+#endif
}
#ifdef DEBUGGING
else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_cldfb( st_ivas, p_output );
+#else
ivas_binaural_cldfb( st_ivas, output );
+#endif
}
#endif
}
@@ -254,29 +328,54 @@ ivas_error ivas_dec(
set_s( nb_bits_metadata, 0, MAX_SCE );
/* read parameters from the bitstream */
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL )
+#endif
{
st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->ivas_format == SBA_FORMAT )
{
- ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, 0 );
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode,
+ ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ),
+ 0 );
}
else
{
+#endif
if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
{
return error;
}
+#ifndef SBA_MODE_CLEAN_UP
}
+#endif
}
+#ifndef SBA_MODE_CLEAN_UP
else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->hQMetaData != NULL )
{
st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
- ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, st_ivas->hSpar->dirac_to_spar_md_bands );
+
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode,
+ ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ),
+ st_ivas->hSpar->dirac_to_spar_md_bands );
+#else
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0],
+ ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ),
+ st_ivas->hSpar->dirac_to_spar_md_bands );
+#endif
}
+#endif
if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK )
{
@@ -311,20 +410,43 @@ ivas_error ivas_dec(
return error;
}
}
-
+#ifdef DEBUG_LBR_SBA
+ /* SCE Decoder Output */
+ for ( int t = 0; t < 960; t++ )
+ {
+ for ( int c = 0; c < st_ivas->nchan_transport; c++ )
+ {
+ float val = output[c][t] / MAX16B_FLT;
+ dbgwrite( &val, sizeof( float ), 1, 1, "int_dec_core_out.raw" );
+ }
+ }
+#endif
#ifdef DEBUG_SBA_AUDIO_DUMP
/* Dump audio signal after core-decoding */
ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" );
#endif
+
/* TCs remapping */
nchan_remapped = st_ivas->nchan_transport;
if ( st_ivas->sba_dirac_stereo_flag )
{
- nchan_remapped = CPE_CHANNELS;
+ nchan_remapped = nchan_out;
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
- ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi );
+ ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame );
+
+ if ( st_ivas->hSpar->hPCA != NULL )
+ {
+ ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output );
+ }
+
+ ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi,
+ ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) );
}
ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT );
@@ -336,20 +458,7 @@ ivas_error ivas_dec(
/* HP filtering */
#ifndef DEBUG_SPAR_BYPASS_EVS_CODEC
-#ifdef SBA_HPF_TUNING_DEC
- int16_t nchan_hp20;
- if ( st_ivas->ivas_format == MASA_FORMAT )
- {
- nchan_hp20 = nchan_remapped;
- }
- else
- {
- nchan_hp20 = getNumChanSynthesis( st_ivas );
- }
- for ( n = 0; n < nchan_hp20; n++ )
-#else
for ( n = 0; n < nchan_remapped; n++ )
-#endif
{
hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
}
@@ -358,10 +467,25 @@ ivas_error ivas_dec(
{
nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame );
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+#else
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
+
+#endif
{
ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame );
}
+#ifdef JBM_TSM_ON_TCS
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->renderer_type != RENDERER_DISABLE )
+#else
+ else if ( st_ivas->renderer_type != RENDERER_DISABLE )
+#endif
+ {
+ ivas_spar_dec_agc_pca( st_ivas, output, output_frame );
+ }
+#endif
}
if ( st_ivas->ivas_format == MASA_FORMAT )
@@ -370,7 +494,16 @@ ivas_error ivas_dec(
}
else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
{
- float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */
+ float gain;
+
+ if ( nchan_remapped == 1 )
+ {
+ gain = 1.4454f;
+ }
+ else
+ {
+ gain = 1.3657f;
+ }
for ( n = 0; n < nchan_remapped; n++ )
{
@@ -387,21 +520,33 @@ ivas_error ivas_dec(
ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped );
#endif
}
+#ifndef SBA_MODE_CLEAN_UP
else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT )
+#else
+ else if ( st_ivas->ivas_format == MASA_FORMAT )
+#endif
{
if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_sba_linear_renderer( p_output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_sba_linear_renderer( output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
}
else if ( st_ivas->renderer_type == RENDERER_DIRAC )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec( st_ivas, output, nchan_remapped );
+#else
ivas_dirac_dec( st_ivas, output, nchan_remapped, NULL, NULL, -1 );
+#endif
}
}
- else if ( !st_ivas->sba_dirac_stereo_flag )
+ else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 )
{
ivas_sba_upmixer_renderer( st_ivas, output, output_frame ); /* Note: ivas_sba_linear_renderer() or ivas_dirac_dec() are called internally */
}
@@ -413,10 +558,6 @@ ivas_error ivas_dec(
/* LFE channel decoder */
if ( st_ivas->mc_mode == MC_MODE_MCT )
{
- if ( st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg == NULL )
- {
- st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg = st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg;
- }
ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch );
}
@@ -440,39 +581,166 @@ ivas_error ivas_dec(
if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+#else
ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+#endif
}
/* Rendering */
if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
{
+ if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig,
#ifdef EXTERNAL_ORIENTATIONS
- if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK )
+ st_ivas->hCombinedOrientationData,
#else
- if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK )
+ st_ivas->hHeadTrackData,
#endif
+ &st_ivas->hIntSetup, st_ivas->hEFAPdata,
+#ifdef JBM_TSM_ON_TCS
+ p_output,
+#else
+ output,
+#endif
+ output_Fs ) ) != IVAS_ERR_OK )
{
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output );
+#else
ivas_binaural_add_LFE( st_ivas, output_frame, output );
+#endif
+ }
+ else if ( st_ivas->renderer_type == RENDERER_MC )
+ {
+#ifdef JBM_TSM_ON_TCS
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+#else
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output );
+#endif
+ }
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#else
+ ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#endif
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
+ {
+#ifdef JBM_TSM_ON_TCS
+ if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output );
+#else
+ if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ ivas_binaural_add_LFE( st_ivas, output_frame, output );
+#endif
+ }
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch );
+
+ ivas_mc_paramupmix_dec_read_BS( ivas_total_brate, st, st_ivas, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] );
+
+ if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame );
+
+ ivas_mc_paramupmix_dec( st_ivas, output );
+
+ /* HP filtering */
+ for ( n = 0; n < st_ivas->nchan_transport; n++ )
+ {
+ if ( n != LFE_CHANNEL )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+ }
+
+ if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) )
+ {
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+#else
+ ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+#endif
+ }
+
+ /* Rendering */
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output );
+#else
+ ivas_binaural_add_LFE( st_ivas, output_frame, output );
+#endif
}
else if ( st_ivas->renderer_type == RENDERER_MC )
{
- ivas_ls_setup_conversion( st_ivas, output_frame, output );
+ if ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
+ {
+#ifdef JBM_TSM_ON_TCS
+ ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output );
+#else
+ ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, output );
+#endif
+ }
+ else
+ {
+#ifdef JBM_TSM_ON_TCS
+ ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, p_output, p_output );
+#else
+ ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, output );
+#endif
+ }
}
else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#else
ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#endif
}
else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK )
+#else
if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output );
+#else
ivas_binaural_add_LFE( st_ivas, output_frame, output );
+#endif
}
}
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
@@ -504,11 +772,19 @@ ivas_error ivas_dec(
/* Rendering */
if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO )
{
- ivas_ls_setup_conversion( st_ivas, output_frame, output );
+#ifdef JBM_TSM_ON_TCS
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+#else
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output );
+#endif
}
else
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_param_mc_dec( st_ivas, p_output );
+#else
ivas_param_mc_dec( st_ivas, output );
+#endif
}
}
else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
@@ -594,11 +870,19 @@ ivas_error ivas_dec(
}
else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport );
+#else
ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport, NULL, NULL, -1 );
+#endif
if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#else
ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+#endif
}
else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) )
{
@@ -622,12 +906,21 @@ ivas_error ivas_dec(
* - float to integer conversion
*----------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+ ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect );
+
+#ifdef DEBUGGING
+ st_ivas->noClipping +=
+#endif
+ ivas_syn_output( p_output, output_frame, nchan_out, data );
+#else
ivas_limiter_dec( st_ivas->hLimiter, output, nchan_out, output_frame, st_ivas->BER_detect );
#ifdef DEBUGGING
st_ivas->noClipping +=
#endif
ivas_syn_output( output, output_frame, nchan_out, data );
+#endif
/*----------------------------------------------------------------*
* Common updates
diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c
index b6d9a5ded0f74ac1ba834950a65c482e161ef55c..10c161e47d2a420f95d20b98cb6e4f3ebbf91b55 100644
--- a/lib_dec/ivas_dirac_dec.c
+++ b/lib_dec/ivas_dirac_dec.c
@@ -51,7 +51,7 @@
* Local function prototypes
*-----------------------------------------------------------------------*/
-static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem );
+static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, const int16_t hodirac_flag );
static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem );
@@ -65,7 +65,7 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA
static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect );
-static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport );
+static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport, const int16_t *sba_map_tc_ind );
static void ivas_dirac_dec_compute_diffuse_proto( DIRAC_DEC_HANDLE hDirAC, const int16_t slot_idx );
@@ -103,6 +103,144 @@ ivas_error ivas_dirac_dec_open(
}
+/*-------------------------------------------------------------------------
+ * ivas_dirac_allocate_parameters()
+ *
+ * Allocate and initialize DirAC parameters
+ *-------------------------------------------------------------------------*/
+
+ivas_error ivas_dirac_allocate_parameters(
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ const int16_t params_flag /* i : set of parameters flag */
+)
+{
+ int16_t i;
+
+ if ( params_flag == 1 )
+ {
+ if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ {
+ if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands );
+ }
+ }
+ else if ( params_flag == 2 )
+ {
+ if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ {
+ if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands );
+
+ if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ }
+ set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands );
+ }
+ }
+
+ return IVAS_ERR_OK;
+}
+
+
/*-------------------------------------------------------------------------
* ivas_dirac_dec_config()
*
@@ -130,6 +268,10 @@ ivas_error ivas_dirac_dec_config(
int32_t output_Fs, ivas_total_brate;
ivas_error error;
int16_t nchan_transport_orig;
+ int16_t hodirac_flag;
+#ifdef JBM_TSM_ON_TCS
+ int16_t map_idx;
+#endif
DIRAC_CONFIG_FLAG flag_config;
flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp;
@@ -138,6 +280,7 @@ ivas_error ivas_dirac_dec_config(
hDirAC = NULL;
output_Fs = st_ivas->hDecoderConfig->output_Fs;
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
+ hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order );
if ( flag_config == DIRAC_RECONFIGURE )
{
@@ -159,7 +302,10 @@ ivas_error ivas_dirac_dec_config(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) );
}
nchan_transport_old = 0;
-
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->hParamIsm = NULL;
+ hDirAC->hParamIsmRendering = NULL;
+#endif
st_ivas->hDirAC = hDirAC;
}
@@ -170,9 +316,14 @@ ivas_error ivas_dirac_dec_config(
num_protos_diff_old = 0;
nchan_transport_orig = st_ivas->nchan_transport;
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+#endif
{
- st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order );
+ st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
}
nchan_transport = st_ivas->nchan_transport;
@@ -250,18 +401,51 @@ ivas_error ivas_dirac_dec_config(
if ( flag_config == DIRAC_OPEN )
{
hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
+#ifdef JBM_TSM_ON_TCS
+ set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS );
+ hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS;
+ hDirAC->subframes_rendered = 0;
+ hDirAC->slots_rendered = 0;
+ hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME;
+#else
hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f );
hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots;
assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES );
+#endif
+ }
+
+ if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate > IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_256k ) || ( ivas_total_brate <= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate > IVAS_256k ) ) )
+ {
+ if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL )
+ {
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL )
+ {
+ ivas_dirac_deallocate_parameters( hDirAC, 2 );
+ }
}
/* band config needed only for SPAR with FOA output */
- if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR && !hodirac_flag )
+#else
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->ivas_format == SBA_FORMAT && !hodirac_flag )
+#endif
{
return IVAS_ERR_OK;
}
- if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC )
+
+ if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC
+#ifdef FIX_DIRAC_LS_SYNTHESIS_CONFIG
+ && !hodirac_flag
+#endif
+ )
{
hDirAC->synthesisConf = DIRAC_SYNTHESIS_PSD_LS;
hDirAC->panningConf = DIRAC_PANNING_VBAP;
@@ -412,6 +596,19 @@ ivas_error ivas_dirac_dec_config(
}
set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff );
+ hDirAC->sba_map_tc = sba_map_tc;
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ if ( st_ivas->sba_order > SBA_FOA_ORDER && ivas_total_brate >= IVAS_512k )
+ {
+ hDirAC->sba_map_tc = sba_map_tc_512;
+ }
+ }
+
if ( nchan_transport == 1 )
{
hDirAC->num_protos_ambi = 1;
@@ -509,17 +706,20 @@ ivas_error ivas_dirac_dec_config(
{
hDirAC->num_protos_diff = 1;
hDirAC->num_protos_dir = nchan_transport;
-
+#ifndef SBA_MODE_CLEAN_UP
if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) )
+#else
+ if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT ) ) )
+#endif
{
hDirAC->num_protos_dir++;
}
for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ )
{
- if ( sba_map_tc[k] < hDirAC->num_outputs_dir )
+ if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir )
{
- hDirAC->proto_index_dir[sba_map_tc[k]] = k;
+ hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k;
}
}
}
@@ -620,7 +820,11 @@ ivas_error ivas_dirac_dec_config(
if ( flag_config == DIRAC_OPEN )
{
hDirAC->hoa_decoder = NULL;
+#ifndef SBA_MODE_CLEAN_UP
if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->sba_mode == SBA_MODE_SPAR || ( nchan_transport > 2 ) )
+#else
+ if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->ivas_format == SBA_FORMAT || ( nchan_transport > 2 ) )
+#endif
{
if ( hDirAC->hOutSetup.is_loudspeaker_setup )
{
@@ -696,7 +900,8 @@ ivas_error ivas_dirac_dec_config(
/* output synthesis */
if ( flag_config == DIRAC_OPEN )
{
- if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK )
+ if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs,
+ hodirac_flag ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -706,7 +911,8 @@ ivas_error ivas_dirac_dec_config(
{
ivas_dirac_dec_output_synthesis_close( hDirAC );
- if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK )
+ if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs,
+ hodirac_flag ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -800,14 +1006,16 @@ ivas_error ivas_dirac_dec_config(
}
/* output synthesis */
- ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE );
+ ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE,
+ hodirac_flag );
/* Allocate stack memory */
if ( flag_config != DIRAC_OPEN )
{
ivas_dirac_free_mem( &( hDirAC->stack_mem ) );
}
- if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ),
+ hodirac_flag ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -820,31 +1028,47 @@ ivas_error ivas_dirac_dec_config(
hDirAC->dirac_bs_md_write_idx = 0;
hDirAC->dirac_read_idx = 0;
hDirAC->spar_to_dirac_write_idx = 0;
-
-#ifdef FIX_350_MASA_DELAY_COMP
+#ifndef FIX_393_459_460_SBA_MD
+ hDirAC->hConfig->dec_param_estim_old = hDirAC->hConfig->dec_param_estim;
+#endif
if ( st_ivas->mc_mode == MC_MODE_MCMASA )
{
hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES;
+
+#ifdef JBM_TSM_ON_TCS
+ set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+ for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ )
+ {
+ hDirAC->render_to_md_map[map_idx] = map_idx;
+ }
+
+#endif
}
else if ( st_ivas->ivas_format == MASA_FORMAT )
{
hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR;
hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR;
- }
-#else
- if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->mc_mode == MC_MODE_MCMASA )
- {
- hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES;
- }
+
+#ifdef JBM_TSM_ON_TCS
+ set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+ for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ )
+ {
+ hDirAC->render_to_md_map[map_idx] = map_idx;
+ }
#endif
+ }
else
{
int16_t num_slots_in_subfr;
num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1;
-
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_DIRAC )
{
+#ifdef FIX_393_459_460_SBA_MD
+ hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES;
+#else
hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES * num_slots_in_subfr;
+#endif
hDirAC->dirac_bs_md_write_idx = 0;
hDirAC->spar_to_dirac_write_idx = 0;
hDirAC->dirac_read_idx = 0;
@@ -852,145 +1076,123 @@ ivas_error ivas_dirac_dec_config(
}
else
{
- hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr;
- hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
- hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
+#endif
+#ifdef FIX_393_459_460_SBA_MD
+ hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR );
+ hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR;
+ hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR;
+#else
+ hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr;
+ hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
+ hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
+#endif
hDirAC->dirac_read_idx = 0;
hDirAC->dirac_estimator_idx = 0;
+#ifndef SBA_MODE_CLEAN_UP
}
- }
-
- if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
+#endif
+#ifdef JBM_TSM_ON_TCS
- if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+#ifdef FIX_393_459_460_SBA_MD
+ for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ )
+#else
+ for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ )
+#endif
+ {
+#ifdef FIX_393_459_460_SBA_MD
+ hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr;
+#else
+ hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME;
+#endif
+ }
+#endif
}
- if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ return error;
}
- if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
-
- if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ else
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ hDirAC->azimuth2 = NULL;
+ hDirAC->elevation2 = NULL;
+ hDirAC->energy_ratio2 = NULL;
+ hDirAC->spreadCoherence2 = NULL;
}
- if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
+ hDirAC->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ hDirAC->dithering_seed = DIRAC_DITH_SEED;
+ st_ivas->hDirAC = hDirAC;
+ }
+#ifndef FIX_393_459_460_SBA_MD
+ else if ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim )
+ {
+ int16_t num_slots_in_subfr;
+ num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1;
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
- if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ ivas_dirac_deallocate_parameters( hDirAC, 1 );
}
- set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands );
+ hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr;
+ hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
+ hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr;
+ hDirAC->dirac_read_idx = 0;
+ hDirAC->dirac_estimator_idx = 0;
- if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ return error;
}
- set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ }
+ }
+#endif
+#ifdef JBM_TSM_ON_TCS
+ /* allocate transport channels*/
+ if ( flag_config == DIRAC_OPEN )
+ {
+ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL )
+ {
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_DIRAC )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands );
+ int16_t nchan_to_allocate;
- if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
+ nchan_to_allocate = nchan_transport;
+ if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) )
+ {
+ nchan_to_allocate++; /* we need a channel for the CNG in this case*/
+ }
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ nchan_to_allocate = 2 * BINAURAL_CHANNELS;
+ }
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_to_allocate, nchan_to_allocate, hDirAC->slot_size ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
- set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands );
- }
-
- if ( st_ivas->ivas_format == MASA_FORMAT )
- {
- if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
-
- if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
-
- if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
-
- if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
-
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) );
- }
- set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands );
- }
- }
- else
- {
- hDirAC->azimuth2 = NULL;
- hDirAC->elevation2 = NULL;
- hDirAC->energy_ratio2 = NULL;
- hDirAC->spreadCoherence2 = NULL;
- }
-
- hDirAC->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */
-
- hDirAC->dithering_seed = DIRAC_DITH_SEED;
- st_ivas->hDirAC = hDirAC;
- }
+ }
+ }
+#endif /* JBM_TMS_ON_TCS*/
return error;
}
@@ -1093,150 +1295,185 @@ void ivas_dirac_dec_close(
hDirAC->buffer_energy = NULL;
}
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ ivas_dirac_deallocate_parameters( hDirAC, 1 );
+ ivas_dirac_deallocate_parameters( hDirAC, 2 );
+
+ if ( hDirAC->masa_stereo_type_detect != NULL )
+ {
+ free( hDirAC->masa_stereo_type_detect );
+ hDirAC->masa_stereo_type_detect = NULL;
+ }
+
+ ivas_dirac_free_mem( &( hDirAC->stack_mem ) );
+
+ free( *hDirAC_out );
+ *hDirAC_out = NULL;
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_dirac_deallocate_parameters()
+ *
+ * Deallocate DirAC parameters
+ *-------------------------------------------------------------------------*/
+
+void ivas_dirac_deallocate_parameters(
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ const int16_t params_flag /* i : set of parameters flag */
+)
+{
+ int16_t i;
+
+ if ( params_flag == 1 )
{
- if ( hDirAC->azimuth[i] != NULL )
+ if ( hDirAC->azimuth != NULL )
{
- free( hDirAC->azimuth[i] );
- hDirAC->azimuth[i] = NULL;
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ {
+ if ( hDirAC->azimuth[i] != NULL )
+ {
+ free( hDirAC->azimuth[i] );
+ hDirAC->azimuth[i] = NULL;
+ }
+ }
+
+ free( hDirAC->azimuth );
+ hDirAC->azimuth = NULL;
}
- if ( hDirAC->elevation[i] != NULL )
+ if ( hDirAC->elevation != NULL )
{
- free( hDirAC->elevation[i] );
- hDirAC->elevation[i] = NULL;
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ {
+ if ( hDirAC->elevation[i] != NULL )
+ {
+ free( hDirAC->elevation[i] );
+ hDirAC->elevation[i] = NULL;
+ }
+ }
+
+ free( hDirAC->elevation );
+ hDirAC->elevation = NULL;
}
- if ( hDirAC->diffuseness_vector[i] != NULL )
+
+ if ( hDirAC->energy_ratio1 != NULL )
{
- free( hDirAC->diffuseness_vector[i] );
- hDirAC->diffuseness_vector[i] = NULL;
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ {
+ if ( hDirAC->energy_ratio1[i] != NULL )
+ {
+ free( hDirAC->energy_ratio1[i] );
+ hDirAC->energy_ratio1[i] = NULL;
+ }
+ }
+ free( hDirAC->energy_ratio1 );
+ hDirAC->energy_ratio1 = NULL;
}
- }
- if ( hDirAC->azimuth != NULL )
- {
- free( hDirAC->azimuth );
- hDirAC->azimuth = NULL;
- }
- if ( hDirAC->elevation != NULL )
- {
- free( hDirAC->elevation );
- hDirAC->elevation = NULL;
- }
- if ( hDirAC->diffuseness_vector != NULL )
- {
- free( hDirAC->diffuseness_vector );
- hDirAC->diffuseness_vector = NULL;
- }
- if ( hDirAC->azimuth2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->diffuseness_vector != NULL )
{
- if ( hDirAC->azimuth2[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->azimuth2[i] );
- hDirAC->azimuth2[i] = NULL;
+ if ( hDirAC->diffuseness_vector[i] != NULL )
+ {
+ free( hDirAC->diffuseness_vector[i] );
+ hDirAC->diffuseness_vector[i] = NULL;
+ }
}
+
+ free( hDirAC->diffuseness_vector );
+ hDirAC->diffuseness_vector = NULL;
}
- free( hDirAC->azimuth2 );
- hDirAC->azimuth2 = NULL;
- }
- if ( hDirAC->elevation2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->spreadCoherence != NULL )
{
- if ( hDirAC->elevation2[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->elevation2[i] );
- hDirAC->elevation2[i] = NULL;
+ if ( hDirAC->spreadCoherence[i] != NULL )
+ {
+ free( hDirAC->spreadCoherence[i] );
+ hDirAC->spreadCoherence[i] = NULL;
+ }
}
+ free( hDirAC->spreadCoherence );
+ hDirAC->spreadCoherence = NULL;
}
- free( hDirAC->elevation2 );
- hDirAC->elevation2 = NULL;
- }
- if ( hDirAC->energy_ratio1 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->surroundingCoherence != NULL )
{
- if ( hDirAC->energy_ratio1[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->energy_ratio1[i] );
- hDirAC->energy_ratio1[i] = NULL;
+ if ( hDirAC->surroundingCoherence[i] != NULL )
+ {
+ free( hDirAC->surroundingCoherence[i] );
+ hDirAC->surroundingCoherence[i] = NULL;
+ }
}
+ free( hDirAC->surroundingCoherence );
+ hDirAC->surroundingCoherence = NULL;
}
- free( hDirAC->energy_ratio1 );
- hDirAC->energy_ratio1 = NULL;
}
-
- if ( hDirAC->energy_ratio2 != NULL )
+ else if ( params_flag == 2 )
{
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->azimuth2 != NULL )
{
- if ( hDirAC->energy_ratio2[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->energy_ratio2[i] );
- hDirAC->energy_ratio2[i] = NULL;
+ if ( hDirAC->azimuth2[i] != NULL )
+ {
+ free( hDirAC->azimuth2[i] );
+ hDirAC->azimuth2[i] = NULL;
+ }
}
+ free( hDirAC->azimuth2 );
+ hDirAC->azimuth2 = NULL;
}
- free( hDirAC->energy_ratio2 );
- hDirAC->energy_ratio2 = NULL;
- }
- if ( hDirAC->spreadCoherence != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->elevation2 != NULL )
{
- if ( hDirAC->spreadCoherence[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->spreadCoherence[i] );
- hDirAC->spreadCoherence[i] = NULL;
+ if ( hDirAC->elevation2[i] != NULL )
+ {
+ free( hDirAC->elevation2[i] );
+ hDirAC->elevation2[i] = NULL;
+ }
}
+ free( hDirAC->elevation2 );
+ hDirAC->elevation2 = NULL;
}
- free( hDirAC->spreadCoherence );
- hDirAC->spreadCoherence = NULL;
- }
- if ( hDirAC->spreadCoherence2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->energy_ratio2 != NULL )
{
- if ( hDirAC->spreadCoherence2[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->spreadCoherence2[i] );
- hDirAC->spreadCoherence2[i] = NULL;
+ if ( hDirAC->energy_ratio2[i] != NULL )
+ {
+ free( hDirAC->energy_ratio2[i] );
+ hDirAC->energy_ratio2[i] = NULL;
+ }
}
+ free( hDirAC->energy_ratio2 );
+ hDirAC->energy_ratio2 = NULL;
}
- free( hDirAC->spreadCoherence2 );
- hDirAC->spreadCoherence2 = NULL;
- }
- if ( hDirAC->surroundingCoherence != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+ if ( hDirAC->spreadCoherence2 != NULL )
{
- if ( hDirAC->surroundingCoherence[i] != NULL )
+ for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
{
- free( hDirAC->surroundingCoherence[i] );
- hDirAC->surroundingCoherence[i] = NULL;
+ if ( hDirAC->spreadCoherence2[i] != NULL )
+ {
+ free( hDirAC->spreadCoherence2[i] );
+ hDirAC->spreadCoherence2[i] = NULL;
+ }
}
+ free( hDirAC->spreadCoherence2 );
+ hDirAC->spreadCoherence2 = NULL;
}
- free( hDirAC->surroundingCoherence );
- hDirAC->surroundingCoherence = NULL;
- }
-
- if ( hDirAC->masa_stereo_type_detect != NULL )
- {
- free( hDirAC->masa_stereo_type_detect );
- hDirAC->masa_stereo_type_detect = NULL;
}
- ivas_dirac_free_mem( &( hDirAC->stack_mem ) );
-
- free( *hDirAC_out );
- *hDirAC_out = NULL;
-
return;
}
@@ -1250,9 +1487,12 @@ void ivas_dirac_dec_close(
static ivas_error ivas_dirac_alloc_mem(
DIRAC_DEC_HANDLE hDirAC,
const RENDERER_TYPE renderer_type,
- DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem )
+ DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem,
+ const int16_t hodirac_flag )
{
int16_t num_freq_bands, num_freq_bands_diff, size;
+ int16_t size_ho;
+ int16_t size_pf;
int16_t num_outputs_dir, num_outputs_diff;
int16_t num_protos_dir;
@@ -1265,6 +1505,16 @@ static ivas_error ivas_dirac_alloc_mem(
num_outputs_diff = hDirAC->num_outputs_diff;
size = num_freq_bands * num_outputs_dir;
+ if ( hodirac_flag )
+ {
+ size_ho = size * DIRAC_HO_NUMSECTORS;
+ size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS;
+ }
+ else
+ {
+ size_ho = size;
+ size_pf = num_freq_bands;
+ }
/* PSD related buffers */
hDirAC_mem->cy_auto_dir_smooth = NULL;
@@ -1311,7 +1561,7 @@ static ivas_error ivas_dirac_alloc_mem(
hDirAC->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square;
/* Target and smoothed nrg factors/gains */
- if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL )
+ if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
}
@@ -1337,11 +1587,13 @@ static ivas_error ivas_dirac_alloc_mem(
hDirAC->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth;
/*Responses (gains/factors)*/
- if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL )
+ if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
}
set_zero( hDirAC_mem->direct_responses, size );
+
+
hDirAC->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses;
/* Prototypes */
@@ -1378,18 +1630,19 @@ static ivas_error ivas_dirac_alloc_mem(
/* Gains/power factors*/
hDirAC_mem->direct_power_factor = NULL;
hDirAC_mem->diffuse_power_factor = NULL;
+
if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC )
{
- if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL )
+ if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
}
-
- if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL )
+ if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) );
}
}
+
hDirAC->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor;
hDirAC->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor;
@@ -1506,18 +1759,20 @@ static void ivas_dirac_free_mem(
*------------------------------------------------------------------------*/
void ivas_dirac_dec_read_BS(
- const int32_t ivas_total_brate, /* i : IVAS total bitrate */
- Decoder_State *st, /* i/o: decoder state structure */
- DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
- IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */
- int16_t *nb_bits, /* o : number of bits read */
- const SBA_MODE sba_mode, /* i : SBA mode */
- int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ Decoder_State *st, /* i/o: decoder state structure */
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */
+ int16_t *nb_bits, /* o : number of bits read */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode, /* i : SBA mode */
+#endif
+ const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */
+ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
)
{
int16_t i, j, b, dir, orig_dirac_bands;
int16_t next_bit_pos_orig;
-
*nb_bits = 0;
if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 )
{
@@ -1528,13 +1783,15 @@ void ivas_dirac_dec_read_BS(
b = st->bit_stream[( st->next_bit_pos )--];
( *nb_bits )++;
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode != SBA_MODE_SPAR )
{
assert( ( b == 0 ) || ( hQMetaData->q_direction[0].cfg.start_band > 0 ) );
}
-
+#endif
if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/
{
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode != SBA_MODE_SPAR )
{
if ( hDirAC != NULL )
@@ -1559,6 +1816,7 @@ void ivas_dirac_dec_read_BS(
}
else
{
+#endif
orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands;
hQMetaData->sba_inactive_mode = 1;
@@ -1573,8 +1831,11 @@ void ivas_dirac_dec_read_BS(
}
}
+#ifndef SBA_MODE_CLEAN_UP
*nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode );
-
+#else
+ *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT );
+#endif
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
{
hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0];
@@ -1592,7 +1853,9 @@ void ivas_dirac_dec_read_BS(
}
hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
+#ifndef SBA_MODE_CLEAN_UP
}
+#endif
}
else
{
@@ -1607,7 +1870,8 @@ void ivas_dirac_dec_read_BS(
hQMetaData->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES;
}
- *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) );
+ *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ),
+ hodirac_flag );
}
#ifdef DEBUGGING
@@ -1641,10 +1905,15 @@ void ivas_dirac_dec_read_BS(
}
}
+#ifndef SBA_MODE_CLEAN_UP
*nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode );
-
+#else
+ *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT );
+#endif
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
{
hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0];
@@ -1662,19 +1931,29 @@ void ivas_dirac_dec_read_BS(
}
hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
+#ifndef SBA_MODE_CLEAN_UP
}
else
{
*nb_bits += SID_FORMAT_NBITS;
}
+#endif
st->next_bit_pos = next_bit_pos_orig;
}
if ( hDirAC != NULL )
{
- ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, dirac_to_spar_md_bands );
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode,
+ hodirac_flag,
+ dirac_to_spar_md_bands );
+#else
+ ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, SBA_FORMAT,
+ hodirac_flag,
+ dirac_to_spar_md_bands );
+#endif
}
return;
@@ -1692,30 +1971,39 @@ void ivas_qmetadata_to_dirac(
DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */
MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
- const SBA_MODE sba_mode, /* i : SBA mode */
- int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode, /* i : SBA mode */
+#else
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+#endif
+ const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */
+ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */
)
{
int16_t block, band;
int16_t *seed_ptr;
int16_t band_start, band_end, diff_idx;
float diffuseness;
- int16_t ts_start, ts_end, ts, b, ele, azi;
+#ifndef FIX_393_459_460_SBA_MD
+ int16_t ts_start, ts_end, ts;
+#endif
+ int16_t b, ele, azi;
float azimuth, elevation;
IVAS_QDIRECTION *q_direction;
int16_t *band_mapping;
int16_t *band_grouping;
int16_t start_band;
- int16_t nbands;
- int16_t nblocks;
+ int16_t nbands = 0;
+ int16_t nblocks = 0;
int16_t qBand_idx;
+ int16_t idx_sec = 0;
+ int16_t no_secs = 1;
q_direction = &( hQMetaData->q_direction[0] );
hDirAC->numSimultaneousDirections = hQMetaData->no_directions;
if ( hMasa != NULL && ivas_total_brate > IVAS_SID_5k2 )
{
-#ifdef FIX_350_MASA_DELAY_COMP
int16_t meta_write_index;
band_mapping = hMasa->data.band_mapping;
@@ -1752,45 +2040,10 @@ void ivas_qmetadata_to_dirac(
}
}
}
-#else
- band_mapping = hMasa->data.band_mapping;
- for ( band = 0; band < hMasa->config.numCodingBands; ++band )
- {
- for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
- {
- for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block )
- {
- hDirAC->azimuth[block][b] = (int16_t) q_direction->band_data[band].azimuth[block];
- hDirAC->elevation[block][b] = (int16_t) q_direction->band_data[band].elevation[block];
- hDirAC->energy_ratio1[block][b] = q_direction->band_data[band].energy_ratio[block];
- hDirAC->diffuseness_vector[block][b] = 1.0f - q_direction->band_data[band].energy_ratio[block];
-
- if ( q_direction->coherence_band_data != NULL )
- {
- hDirAC->spreadCoherence[block][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f;
- }
- else
- {
- hDirAC->spreadCoherence[block][b] = 0.0f;
- }
-
- if ( hQMetaData->surcoh_band_data != NULL )
- {
- hDirAC->surroundingCoherence[block][b] = hQMetaData->surcoh_band_data[band].surround_coherence[block] / 255.0f;
- }
- else
- {
- hDirAC->surroundingCoherence[block][b] = 0.0f;
- }
- }
- }
- }
-#endif
if ( hQMetaData->no_directions == 2 )
{
q_direction = &( hQMetaData->q_direction[1] );
-#ifdef FIX_350_MASA_DELAY_COMP
for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block )
{
meta_write_index = ( hDirAC->dirac_bs_md_write_idx + block ) % hDirAC->dirac_md_buffer_length;
@@ -1815,32 +2068,7 @@ void ivas_qmetadata_to_dirac(
}
}
}
-#else
- for ( band = 0; band < hMasa->config.numCodingBands; ++band )
- {
- for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b )
- {
- for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block )
- {
- hDirAC->azimuth2[block][b] = (int16_t) q_direction->band_data[band].azimuth[block];
- hDirAC->elevation2[block][b] = (int16_t) q_direction->band_data[band].elevation[block];
- hDirAC->energy_ratio2[block][b] = q_direction->band_data[band].energy_ratio[block];
- hDirAC->diffuseness_vector[block][b] -= q_direction->band_data[band].energy_ratio[block];
-
- if ( q_direction->coherence_band_data != NULL )
- {
- hDirAC->spreadCoherence2[block][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f;
- }
- else
- {
- hDirAC->spreadCoherence2[block][b] = 0.0f;
- }
- }
- }
- }
-#endif
}
-#ifdef FIX_350_MASA_DELAY_COMP
else if ( hDirAC->azimuth2 != NULL && hDirAC->elevation2 != NULL && hDirAC->energy_ratio2 != NULL && hDirAC->spreadCoherence2 != NULL )
{
/* zero out old dir2 data */
@@ -1853,22 +2081,30 @@ void ivas_qmetadata_to_dirac(
set_zero( hDirAC->spreadCoherence2[meta_write_index], hDirAC->num_freq_bands );
}
}
-#endif
}
else /* SBA mode/SID/Zero frame*/
{
+#ifndef FIX_393_459_460_SBA_MD
int16_t num_slots_in_subfr;
+#endif
int16_t tmp_write_idx_param_band;
int16_t tmp_write_idx_band;
+ float diffuseness_sec = 0.f;
+#ifndef FIX_393_459_460_SBA_MD
num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1;
+#endif
/* ungroup */
seed_ptr = &hDirAC->dithering_seed;
nblocks = q_direction->cfg.nblocks;
nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands];
band_grouping = hDirAC->band_grouping;
+#ifndef SBA_MODE_CLEAN_UP
if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR )
+#else
+ if ( ivas_total_brate <= IVAS_SID_5k2 && ivas_format != SBA_FORMAT )
+#endif
{
/* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/
start_band = 0;
@@ -1878,10 +2114,12 @@ void ivas_qmetadata_to_dirac(
}
else
{
- assert( ( hQMetaData->no_directions == 1 ) && "Only 1 direction supported in SBA mode!" );
start_band = hDirAC->hConfig->enc_param_start_band;
-
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
hDirAC->hConfig->nbands = IVAS_MAX_NUM_BANDS;
}
@@ -1906,142 +2144,256 @@ void ivas_qmetadata_to_dirac(
{
band_start = band_grouping[band];
band_end = band_grouping[band + 1];
+#ifdef JBM_TSM_ON_TCS
+ tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx;
+
+ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+#else
for ( block = 0; block < hDirAC->nb_subframes; block++ )
+#endif
{
+#ifdef JBM_TSM_ON_TCS
+#ifndef FIX_393_459_460_SBA_MD
+ ts_start = hDirAC->block_grouping[block];
+ ts_end = hDirAC->block_grouping[block + 1];
+#endif
+#endif
for ( b = band_start; b < band_end; b++ )
{
+#ifdef JBM_TSM_ON_TCS
+ tmp_write_idx_band = tmp_write_idx_param_band;
+#endif
hDirAC->spreadCoherence[block][b] = 0.0f;
hDirAC->surroundingCoherence[block][b] = 0.0f;
- }
+
+#ifdef JBM_TSM_ON_TCS
+#ifndef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+#endif
+ hDirAC->elevation[tmp_write_idx_band][b] = 0;
+ hDirAC->azimuth[tmp_write_idx_band][b] = 0;
+ hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f;
+
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0;
+ tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
+#ifndef FIX_393_459_460_SBA_MD
+ }
+ else
+ {
+ for ( ts = ts_start; ts < ts_end; ts++ )
+ {
+ hDirAC->elevation[tmp_write_idx_band][b] = 0;
+ hDirAC->azimuth[tmp_write_idx_band][b] = 0;
+#if 0
+ hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f;
+#endif
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0;
+ tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
+ }
+ }
+#endif
+#endif
+ }
}
}
/* Bands with spatial data transmitted */
-
- for ( band = start_band; band < nbands; band++ )
+ if ( hodirac_flag )
{
- band_start = band_grouping[band];
- band_end = band_grouping[band + 1];
- tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx;
-
- if ( sba_mode == SBA_MODE_SPAR )
- {
- qBand_idx = dirac_to_spar_md_bands[band] - start_band;
- }
- else
- {
- qBand_idx = band;
- }
- diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0];
-#ifdef DEBUG_MODE_DIRAC
- dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" );
-#endif
- diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0];
+ no_secs = DIRAC_HO_NUMSECTORS;
+ }
- for ( block = 0; block < hDirAC->nb_subframes; block++ )
+ for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ )
+ {
+ for ( band = start_band; band < nbands; band++ )
{
- int16_t block_qmetadata;
+ band_start = band_grouping[band];
+ band_end = band_grouping[band + 1];
+ tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx;
- ts_start = hDirAC->block_grouping[block];
- ts_end = hDirAC->block_grouping[block + 1];
-
- block_qmetadata = min( block, nblocks - 1 );
- block_qmetadata = max( block_qmetadata, 0 );
-
- if ( q_direction->band_data[qBand_idx].azimuth[block_qmetadata] < 0.f )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
+ {
+ qBand_idx = dirac_to_spar_md_bands[band] - start_band;
+ }
+ else
{
- q_direction->band_data[qBand_idx].azimuth[block_qmetadata] += 360.f;
+ qBand_idx = band;
}
- azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata];
- elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata];
+ diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0];
+#ifdef DEBUG_MODE_DIRAC
+ dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" );
+#endif
+ diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0];
- for ( b = band_start; b < band_end; b++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+#else
+ for ( block = 0; block < hDirAC->nb_subframes; block++ )
+#endif
{
- tmp_write_idx_band = tmp_write_idx_param_band;
- azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f );
- ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f );
- /* limit the elevation to [-90, 90] */
- ele = min( 90, ele );
- ele = max( -90, ele );
+ int16_t block_qmetadata;
- if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL )
- {
- hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f;
- }
- else
+#ifndef FIX_393_459_460_SBA_MD
+ ts_start = hDirAC->block_grouping[block];
+ ts_end = hDirAC->block_grouping[block + 1];
+#endif
+
+ block_qmetadata = min( block, nblocks - 1 );
+ block_qmetadata = max( block_qmetadata, 0 );
+
+ if ( q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] < 0.f )
{
- hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] += 360.f;
}
- if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL )
+ if ( hMasa == NULL && hodirac_flag )
{
- hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f;
+ azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata];
+ elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata];
+ diffuseness = 1.f - q_direction[0].band_data[qBand_idx].energy_ratio[block_qmetadata];
+ diffuseness_sec = q_direction[1].band_data[qBand_idx].energy_ratio[block_qmetadata];
+ assert( diffuseness_sec < 1.0001f && diffuseness_sec > -0.0001f );
}
else
{
- hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata];
+ elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata];
}
- hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0];
-
- if ( hDirAC->hConfig->dec_param_estim == FALSE )
- {
- hDirAC->elevation[tmp_write_idx_band][b] = ele;
- hDirAC->azimuth[tmp_write_idx_band][b] = azi;
- hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness;
- }
- else
+ for ( b = band_start; b < band_end; b++ )
{
- for ( ts = ts_start; ts < ts_end; ts++ )
+ tmp_write_idx_band = tmp_write_idx_param_band;
+
+ if ( hodirac_flag )
{
- hDirAC->elevation[tmp_write_idx_band][b] = ele;
- hDirAC->azimuth[tmp_write_idx_band][b] = azi;
- hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness;
- tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
+ azi = (int16_t) ( azimuth + 0.5f );
+ ele = (int16_t) ( elevation + 0.5f );
+ }
+ else
+ {
+ azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f );
+ ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f );
+ /* limit the elevation to [-90, 90] */
+ ele = min( 90, ele );
+ ele = max( -90, ele );
}
- }
- } /* for ( band = ...) */
- tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length;
- } /* for ( block =...) */
- }
-#ifdef DEBUG_MODE_DIRAC
- {
- for ( block = 0; block < hDirAC->nb_subframes; block++ )
- {
- int16_t block_qmetadata;
+ if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL )
+ {
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f;
+ }
+ else
+ {
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ }
- block_qmetadata = min( block, nblocks - 1 );
- block_qmetadata = max( block_qmetadata, 0 );
- for ( band = start_band; band < nbands; band++ )
- {
- dbgwrite( &q_direction->band_data[band].azimuth[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_azi.dat" );
- dbgwrite( &q_direction->band_data[band].elevation[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_ele.dat" );
- }
- }
- }
+ if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL )
+ {
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f;
+ }
+ else
+ {
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ }
+
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0];
+
+#ifndef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+#endif
+
+ hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness;
+
+ if ( hodirac_flag )
+ {
+ if ( idx_sec == 0 )
+ {
+ hDirAC->elevation[tmp_write_idx_band][b] = ele;
+ hDirAC->azimuth[tmp_write_idx_band][b] = azi;
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use
+ }
+ else
+ {
+ assert( idx_sec == 1 );
+ hDirAC->elevation2[tmp_write_idx_band][b] = ele;
+ hDirAC->azimuth2[tmp_write_idx_band][b] = azi;
+ hDirAC->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec;
+ }
+ }
+ else
+ {
+ hDirAC->elevation[tmp_write_idx_band][b] = ele;
+ hDirAC->azimuth[tmp_write_idx_band][b] = azi;
+ }
+#ifndef FIX_393_459_460_SBA_MD
+ }
+ else
+ {
+ for ( ts = ts_start; ts < ts_end; ts++ )
+ {
+ hDirAC->elevation[tmp_write_idx_band][b] = ele;
+ hDirAC->azimuth[tmp_write_idx_band][b] = azi;
+ hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness;
+ tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
+ }
+ }
#endif
+ }
+#ifdef FIX_393_459_460_SBA_MD
+ tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hDirAC->dirac_md_buffer_length;
+#else
+ tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length;
+#endif
+
+ } /* for ( block =...) */
+ } /* for ( band = ...) */
+ } /* for ( idx_sec = ...)*/
/* Bands not transmitted -> zeroed*/
for ( b = band_grouping[band]; b < hDirAC->num_freq_bands; b++ )
{
tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx;
+
+#ifdef JBM_TSM_ON_TCS
+ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+#else
for ( block = 0; block < hDirAC->nb_subframes; block++ )
+#endif
{
+#ifndef FIX_393_459_460_SBA_MD
ts_start = hDirAC->block_grouping[block];
ts_end = hDirAC->block_grouping[block + 1];
+#endif
hDirAC->spreadCoherence[block][b] = 0.0f;
hDirAC->surroundingCoherence[block][b] = 0.0f;
hDirAC->energy_ratio1[block][b] = 0;
+#ifndef FIX_393_459_460_SBA_MD
if ( hDirAC->hConfig->dec_param_estim == FALSE )
{
+#endif
hDirAC->elevation[tmp_write_idx_band][b] = 0;
hDirAC->azimuth[tmp_write_idx_band][b] = 0;
hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f;
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0;
+#endif
tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
+#ifndef FIX_393_459_460_SBA_MD
}
else
{
@@ -2050,25 +2402,262 @@ void ivas_qmetadata_to_dirac(
hDirAC->elevation[tmp_write_idx_band][b] = 0;
hDirAC->azimuth[tmp_write_idx_band][b] = 0;
hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f;
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f;
+ hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0;
+#endif
tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length;
}
}
+#endif
}
}
}
- /* update buffer write index */
+/* update buffer write index */
+#ifndef FIX_393_459_460_SBA_MD
if ( hDirAC->hConfig->dec_param_estim == FALSE )
{
+#endif
hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length;
+#ifndef FIX_393_459_460_SBA_MD
}
else
{
hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + CLDFB_NO_COL_MAX ) % hDirAC->dirac_md_buffer_length;
}
+#endif
+ return;
+}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------
+ * ivas_dirac_dec_set_md_map()
+ *
+ * Set metadata index mapping for DirAC
+ *------------------------------------------------------------------------*/
+
+void ivas_dirac_dec_set_md_map(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nCldfbTs /* i : number of CLDFB time slots */
+)
+{
+ int16_t num_slots_in_subfr;
+ DIRAC_DEC_HANDLE hDirAC;
+
+ hDirAC = st_ivas->hDirAC;
+#ifdef DEBUGGING
+ assert( hDirAC );
+#endif
+
+ /* adapt subframes */
+ hDirAC->num_slots = nCldfbTs;
+ hDirAC->slots_rendered = 0;
+#ifndef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hParamIsm != NULL || hDirAC->hConfig->dec_param_estim == 0 )
+ {
+#endif
+ num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES;
+#ifndef FIX_393_459_460_SBA_MD
+ }
+ else
+ {
+ num_slots_in_subfr = 1;
+ }
+#endif
+ hDirAC->subframes_rendered = 0;
+
+ ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes );
+
+ /* set mapping according to dirac_read_idx */
+
+ set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+
+ if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 )
+ {
+ ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map );
+ }
+ else
+ {
+ ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map );
+ }
+
+ if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 )
+ {
+ float tmp;
+ int16_t sf_idx, slot_idx, slot_idx_abs;
+
+ slot_idx_abs = 0;
+ for ( sf_idx = 0; sf_idx < hDirAC->nb_subframes; sf_idx++ )
+ {
+ tmp = 0.0f;
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[sf_idx]; slot_idx++ )
+ {
+ tmp += (float) hDirAC->render_to_md_map[slot_idx_abs];
+ slot_idx_abs++;
+ }
+ hDirAC->render_to_md_map[sf_idx] = ( (int16_t) roundf( tmp / (float) hDirAC->subframe_nbslots[sf_idx] ) + hDirAC->dirac_read_idx ) % hDirAC->dirac_md_buffer_length;
+ }
+
+ set_s( &hDirAC->render_to_md_map[hDirAC->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hDirAC->nb_subframes );
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_dirac_dec()
+ *
+ * DirAC decoding process
+ *------------------------------------------------------------------------*/
+
+void ivas_dirac_dec(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+ const int16_t nchan_transport /* i : number of transport channels */
+)
+{
+ int16_t subframe_idx;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+ float cng_td_buffer[L_FRAME16k];
+ int16_t nchan_out, n, n_samples_sf;
+ nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+
+ n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * st_ivas->hDirAC->slot_size;
+
+ for ( n = 0; n < nchan_out; n++ )
+ {
+ output_f_local[n] = &output_f[n][0];
+ }
+
+ for ( n = 0; n < nchan_transport; n++ )
+ {
+ st_ivas->hTcBuffer->tc[n] = output_f[n];
+ }
+
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT )
+#endif
+ {
+ Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0];
+ st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0];
+ generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna );
+ }
+
+ ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS );
+
+ for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ )
+ {
+ ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL );
+ for ( n = 0; n < nchan_out; n++ )
+ {
+ output_f_local[n] += n_samples_sf;
+ }
+ }
+
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ else
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ for ( n = 0; n < nchan_transport; n++ )
+ {
+ st_ivas->hTcBuffer->tc[n] = NULL;
+ }
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT )
+#endif
+ {
+ st_ivas->hTcBuffer->tc[nchan_transport] = NULL;
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_dirac_dec_render()
+ *
+ * DirAC decoding renderer process
+ *------------------------------------------------------------------------*/
+
+void ivas_dirac_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ int16_t slots_to_render, first_sf, last_sf, subframe_idx;
+ uint16_t slot_size, n_samples_sf, ch, nchan_intern;
+ DIRAC_DEC_HANDLE hDirAC;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+
+ hDirAC = st_ivas->hDirAC;
+
+ nchan_intern = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+#ifdef DEBUGGING
+ assert( hDirAC );
+#endif
+ for ( ch = 0; ch < nchan_intern; ch++ )
+ {
+ output_f_local[ch] = output_f[ch];
+ }
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size );
+ *nSamplesRendered = slots_to_render * slot_size;
+ first_sf = hDirAC->subframes_rendered;
+ last_sf = first_sf;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hDirAC->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+
+#ifdef DEBUGGING
+ assert( slots_to_render == 0 );
+#endif
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL );
+ n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size;
+ for ( ch = 0; ch < nchan_intern; ch++ )
+ {
+ output_f_local[ch] += n_samples_sf;
+ }
+ }
+ if ( hDirAC->slots_rendered == hDirAC->num_slots )
+ {
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ else
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ }
+
+ *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size;
return;
}
+#endif
/*-------------------------------------------------------------------------
@@ -2077,13 +2666,25 @@ void ivas_qmetadata_to_dirac(
* DirAC decoding process
*------------------------------------------------------------------------*/
+#ifndef JBM_TSM_ON_TCS
void ivas_dirac_dec(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
+void ivas_dirac_dec_render_sf(
+#endif
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
+ float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
const int16_t nchan_transport, /* i : number of transport channels */
float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
- float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX],
- const int16_t i_sf )
+ float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX]
+#ifndef JBM_TSM_ON_TCS
+ ,
+ const int16_t i_sf
+#endif
+)
{
int16_t i, ch, idx_in, idx_lfe;
DIRAC_DEC_HANDLE hDirAC;
@@ -2091,9 +2692,15 @@ void ivas_dirac_dec(
float surCohEner;
float surCohRatio[CLDFB_NO_CHANNELS_MAX];
int16_t subframe_idx;
+#ifndef JBM_TSM_ON_TCS
int16_t sf1, sf2;
+#endif
int16_t slot_idx, index_slot;
+ int16_t hodirac_flag;
float *p_Rmat;
+#ifdef JBM_TSM_ON_TCS
+ int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx;
+#endif
/*CLDFB: last output channels reserved to LFT for CICPx*/
float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
@@ -2102,12 +2709,29 @@ void ivas_dirac_dec(
float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
int16_t index, num_freq_bands;
+#ifdef JBM_TSM_ON_TCS
+ /* local copies of azi, ele, diffuseness */
+#ifdef FIX_393_459_460_SBA_MD
+ int16_t azimuth[CLDFB_NO_CHANNELS_MAX];
+ int16_t elevation[CLDFB_NO_CHANNELS_MAX];
+ float diffuseness_vector[CLDFB_NO_CHANNELS_MAX];
+#else
+ int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+#endif
+#endif
+
DIRAC_DEC_STACK_MEM DirAC_mem;
float *reference_power, *reference_power_smooth;
float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL;
uint16_t coherence_flag;
+#ifndef JBM_TSM_ON_TCS
push_wmops( "ivas_dirac_dec" );
+#else
+ push_wmops( "ivas_dirac_dec_render" );
+#endif
/* Initialize aux buffers */
hDirAC = st_ivas->hDirAC;
@@ -2119,7 +2743,13 @@ void ivas_dirac_dec(
onset_filter = DirAC_mem.onset_filter;
onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands;
+ hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order );
+
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT )
+#else
if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR )
+#endif
{
coherence_flag = st_ivas->hQMetaData->coherence_flag;
}
@@ -2147,7 +2777,7 @@ void ivas_dirac_dec(
#endif
/* Subframe loop */
-
+#ifndef JBM_TSM_ON_TCS
if ( i_sf == -1 )
{
sf1 = 0;
@@ -2158,654 +2788,1084 @@ void ivas_dirac_dec(
sf1 = i_sf;
sf2 = i_sf + 1;
}
+#endif
+#ifdef JBM_TSM_ON_TCS
+ slot_idx_start = hDirAC->slots_rendered;
+ slot_idx_start_cldfb_synth = 0;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ subframe_idx = hDirAC->subframes_rendered;
+#else
for ( subframe_idx = sf1; subframe_idx < sf2; subframe_idx++ )
{
- if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
+#endif
+#ifdef JBM_TSM_ON_TCS
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+ md_idx = hDirAC->render_to_md_map[subframe_idx];
+ }
+ else
+ {
+ md_idx = hDirAC->render_to_md_map[slot_idx_start];
+ }
+#endif
+#ifdef JBM_TSM_ON_TCS
+ /* Another workaround for self test BE */
+#ifndef FIX_642
+ if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 )
+ {
+ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat );
+
+ p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0];
+
+ if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
{
- set_zero( reference_power_smooth, hDirAC->num_freq_bands );
+ num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+ {
+ index_slot = slot_idx_start + slot_idx;
+ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat );
+ }
}
- else
+ }
+ else
+ {
+ p_Rmat = 0;
+ }
+#endif
+
+ /* copy parameters into local buffers*/
+#ifdef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+ mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands );
+ mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands );
+ mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector, hDirAC->num_freq_bands );
+ }
+ else
+ {
+ set_zero( diffuseness_vector, hDirAC->num_freq_bands );
+ }
+#else
+ if ( hDirAC->hConfig->dec_param_estim == TRUE )
+ {
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+ {
+ mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands );
+ mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands );
+ mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands );
+ }
+ }
+ else
+ {
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
{
- set_zero( onset_filter_subframe, hDirAC->num_freq_bands );
+ mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth[slot_idx], hDirAC->num_freq_bands );
+ mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation[slot_idx], hDirAC->num_freq_bands );
+ mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands );
}
+ }
+#endif
+#endif
-#ifdef EXTERNAL_ORIENTATIONS
+ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
+ {
+ set_zero( reference_power_smooth, hDirAC->num_freq_bands );
+ }
+ else
+ {
+ set_zero( onset_filter_subframe, hDirAC->num_freq_bands );
+ }
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hHeadTrackData
+#ifndef FIX_642
+ && st_ivas->hDecoderConfig->voip_active == 1
+#endif
+#ifdef EXTERNAL_ORIENTATIONS
+ && st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx]
+#endif
+ )
+#else
+#ifdef EXEXTERNAL_ORIENTATIONS
if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] )
- {
- p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0];
#else
if ( st_ivas->hHeadTrackData )
- {
- QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat );
+#endif
+#endif
+ {
+#ifdef EXTERNAL_ORIENTATIONS
+ p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0];
+#else
+ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat );
- p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0];
+ p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0];
#endif
- if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
+ if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
+ {
+ num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+#ifdef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
{
- num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+ rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat );
+ }
+#else
+#ifdef JBM_TSM_ON_TCS
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+#else
for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ )
+#endif
{
+#ifdef JBM_TSM_ON_TCS
+ rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat );
+#else
+ /* note, this seems wrong since it does not take the dirac read ptr into account */
index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx;
+ /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */
rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat );
+#endif
}
- }
+#endif
}
+ }
+#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642 )
+ else if ( !st_ivas->hHeadTrackData )
+#else
else
- {
- p_Rmat = 0;
- }
+#endif
+ {
+ p_Rmat = 0;
+ }
- if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+ /* compute response */
+ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
{
- /* compute response */
- if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
- {
- ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands,
+ ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands,
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ diffuseness_vector,
+#else
+ diffuseness_vector[0],
+#endif
+#else
hDirAC->diffuseness_vector[hDirAC->dirac_read_idx],
- hDirAC->h_output_synthesis_psd_params.max_band_decorr,
- hDirAC->h_output_synthesis_psd_state.direct_power_factor,
- hDirAC->h_output_synthesis_psd_state.diffuse_power_factor );
+#endif
+ hDirAC->h_output_synthesis_psd_params.max_band_decorr,
+ hDirAC->h_output_synthesis_psd_state.direct_power_factor,
+ hDirAC->h_output_synthesis_psd_state.diffuse_power_factor );
- if ( coherence_flag )
+ if ( coherence_flag )
+ {
+ for ( i = 0; i < hDirAC->num_freq_bands; i++ )
{
- for ( i = 0; i < hDirAC->num_freq_bands; i++ )
- {
- dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i];
- surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[subframe_idx][i];
- hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner;
- hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner;
+ dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i];
+#ifdef JBM_TSM_ON_TCS
+ surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i];
+#else
+ surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i];
+#endif
+ hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner;
+ hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner;
- surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner );
- }
- }
- else
- {
- set_zero( surCohRatio, hDirAC->num_freq_bands );
+ surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner );
}
}
else
{
- ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands,
+ set_zero( surCohRatio, hDirAC->num_freq_bands );
+ }
+ }
+ else
+ {
+ ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands,
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->diffuseness_vector[md_idx],
+#else
hDirAC->diffuseness_vector[hDirAC->dirac_read_idx],
- hDirAC->h_output_synthesis_psd_params.max_band_decorr,
- hDirAC->h_output_synthesis_psd_state.direct_power_factor,
- hDirAC->h_output_synthesis_psd_state.diffuse_power_factor );
+#endif
+ hDirAC->h_output_synthesis_psd_params.max_band_decorr,
+ hDirAC->h_output_synthesis_psd_state.direct_power_factor,
+ hDirAC->h_output_synthesis_psd_state.diffuse_power_factor );
- if ( coherence_flag )
- {
- for ( i = 0; i < hDirAC->num_freq_bands; i++ )
- {
- surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i];
- }
- }
- else
+ if ( coherence_flag )
+ {
+ for ( i = 0; i < hDirAC->num_freq_bands; i++ )
{
- set_zero( surCohRatio, hDirAC->num_freq_bands );
- }
- }
-
-#ifdef EXTERNAL_ORIENTATIONS
- if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 )
+#ifdef JBM_TSM_ON_TCS
+ surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i];
#else
- if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 )
+ surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i];
#endif
- {
- ivas_dirac_dec_compute_directional_responses( hDirAC,
- st_ivas->hVBAPdata,
- st_ivas->hMasa,
- subframe_idx,
- subframe_idx,
- surCohRatio,
- st_ivas->hHeadTrackData->shd_rot_max_order,
- p_Rmat );
+ }
}
else
{
- ivas_dirac_dec_compute_directional_responses( hDirAC,
- st_ivas->hVBAPdata,
- st_ivas->hMasa,
- subframe_idx,
- subframe_idx,
- surCohRatio,
- 0,
- 0 );
+ set_zero( surCohRatio, hDirAC->num_freq_bands );
}
}
+#ifdef EXTERNAL_ORIENTATIONS
+ if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 )
+#else
+ if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 )
+#endif
+ {
+ ivas_dirac_dec_compute_directional_responses( hDirAC,
+ st_ivas->hVBAPdata,
+ st_ivas->hMasa,
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ azimuth,
+ elevation,
+#else
+ hDirAC->azimuth[md_idx],
+ hDirAC->elevation[md_idx],
+#endif
+ md_idx,
+#endif
+ surCohRatio,
+ st_ivas->hHeadTrackData->shd_rot_max_order,
+ p_Rmat,
+ hodirac_flag );
+ }
+ else
+ {
+ ivas_dirac_dec_compute_directional_responses( hDirAC,
+ st_ivas->hVBAPdata,
+ st_ivas->hMasa,
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ azimuth,
+ elevation,
+#else
+ hDirAC->azimuth[md_idx],
+ hDirAC->elevation[md_idx],
+#endif
+ md_idx,
+#endif
+ surCohRatio,
+ 0,
+ NULL,
+ hodirac_flag );
+ }
+ }
+#ifdef JBM_TSM_ON_TCS
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+#else
for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ )
+#endif
+ {
+#ifdef JBM_TSM_ON_TCS
+ index_slot = slot_idx_start + slot_idx;
+ if ( hDirAC->hConfig->dec_param_estim == TRUE )
+ {
+ md_idx = hDirAC->render_to_md_map[index_slot];
+ }
+ else
{
+ md_idx = hDirAC->render_to_md_map[subframe_idx];
+ }
+#else
index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx;
+#endif
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#else
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#endif
+ {
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- for ( ch = 0; ch < nchan_transport; ch++ )
- {
- mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands );
- mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands );
- }
+ mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands );
+ mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands );
}
- else
+ }
+ else
+ {
+ /* CLDFB Analysis*/
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- /* CLDFB Analysis*/
- for ( ch = 0; ch < nchan_transport; ch++ )
- {
- cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ),
+#ifdef JBM_TSM_ON_TCS
+ cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ),
+ Cldfb_RealBuffer[ch][0],
+ Cldfb_ImagBuffer[ch][0],
+ hDirAC->num_freq_bands,
+ st_ivas->cldfbAnaDec[ch] );
+#else
+ cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ),
Cldfb_RealBuffer[ch][0],
Cldfb_ImagBuffer[ch][0],
hDirAC->num_freq_bands,
st_ivas->cldfbAnaDec[ch] );
- }
+#endif
}
+ }
- /* CNG in DirAC, extra CLDFB ana for CNA*/
+ /* CNG in DirAC, extra CLDFB ana for CNA*/
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT )
+#else
if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR )
- {
- Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0];
+#endif
+ {
+ Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0];
- generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom,
- st_ivas->cldfbAnaDec[1],
+ generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom,
+ st_ivas->cldfbAnaDec[1],
+#ifdef JBM_TSM_ON_TCS
+ st_ivas->hTcBuffer->tc[1],
+#else
&( output_f[1][L_FRAME48k - L_FRAME16k] ),
- Cldfb_RealBuffer[1][0],
- Cldfb_ImagBuffer[1][0],
- index_slot,
- st->cna_dirac_flag && st->flag_cna,
- ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag );
- }
-
- /* LFE synthesis */
- if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) )
- {
- ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth,
- Cldfb_RealBuffer, Cldfb_ImagBuffer,
- Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1],
- slot_idx,
+#endif
+ Cldfb_RealBuffer[1][0],
+ Cldfb_ImagBuffer[1][0],
+ index_slot,
+ st->cna_dirac_flag && st->flag_cna,
+ ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag );
+ }
+
+ /* LFE synthesis */
+ if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) )
+ {
+ ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth,
+ Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1],
+ slot_idx,
+#ifdef JBM_TSM_ON_TCS
+ md_idx,
+#else
subframe_idx,
- nchan_transport );
- }
-
- /*-----------------------------------------------------------------*
- * protoype signal computation
- *-----------------------------------------------------------------*/
+#endif
+ nchan_transport );
+ }
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
- {
+ /*-----------------------------------------------------------------*
+ * protoype signal computation
+ *-----------------------------------------------------------------*/
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
+ {
#ifdef EXTERNAL_ORIENTATIONS
- if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
+ if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
#else
- if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
+ if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
#endif
- {
- protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f,
- reference_power, slot_idx, nchan_transport,
- hDirAC->num_outputs_diff,
- hDirAC->num_freq_bands,
- p_Rmat );
- }
- else
- {
- protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f,
- reference_power, slot_idx, nchan_transport,
- hDirAC->num_outputs_diff,
- hDirAC->num_freq_bands,
- 0 );
- }
- }
- else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO )
{
- protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
- 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect );
+ protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f,
+ reference_power, slot_idx, nchan_transport,
+ hDirAC->num_outputs_diff,
+ hDirAC->num_freq_bands,
+ p_Rmat );
}
else
{
- switch ( nchan_transport )
- {
- case 8:
- case 6:
- case 4:
- protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer,
- hDirAC->proto_frame_f,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- reference_power,
- hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
- slot_idx, hDirAC->num_outputs_diff,
- hDirAC->num_freq_bands,
- hDirAC->hoa_decoder,
- nchan_transport );
- break;
- case 2:
- protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer,
- hDirAC->proto_frame_f,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- reference_power,
- hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
- hDirAC->hOutSetup.is_loudspeaker_setup,
- slot_idx,
- hDirAC->num_freq_bands,
- hDirAC->masa_stereo_type_detect );
- break;
- case 1:
- protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer,
- hDirAC->proto_frame_f,
- hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
- reference_power,
- hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
- slot_idx,
- hDirAC->num_protos_diff,
- hDirAC->num_freq_bands );
- break;
- default:
- return;
- }
- }
-
- /*-----------------------------------------------------------------*
- * Compute DirAC parameters at decoder side
- *-----------------------------------------------------------------*/
-
- if ( hDirAC->hConfig->dec_param_estim == TRUE )
- {
- hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */
-
- index = hDirAC->index_buffer_intensity;
+ protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f,
+ reference_power, slot_idx, nchan_transport,
+ hDirAC->num_outputs_diff,
+ hDirAC->num_freq_bands,
+ 0 );
+ }
+ }
+ else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO )
+ {
+ protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
+ 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect );
+ }
+ else
+ {
+ switch ( nchan_transport )
+ {
+ case 11:
+ case 8:
+ case 6:
+ case 4:
+ protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hDirAC->proto_frame_f,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ reference_power,
+ hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
+ slot_idx, hDirAC->num_outputs_diff,
+ hDirAC->num_freq_bands,
+ hDirAC->hoa_decoder,
+ nchan_transport,
+ hDirAC->sba_map_tc );
+ break;
+ case 2:
+ protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hDirAC->proto_frame_f,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ reference_power,
+ hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
+ hDirAC->hOutSetup.is_loudspeaker_setup,
+ slot_idx,
+ hDirAC->num_freq_bands,
+ hDirAC->masa_stereo_type_detect );
+ break;
+ case 1:
+ protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hDirAC->proto_frame_f,
+ hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f,
+ reference_power,
+ hDirAC->h_output_synthesis_psd_state.proto_power_smooth,
+ slot_idx,
+ hDirAC->num_protos_diff,
+ hDirAC->num_freq_bands );
+ break;
+ default:
+ return;
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Compute DirAC parameters at decoder side
+ *-----------------------------------------------------------------*/
+
+ if ( hDirAC->hConfig->dec_param_estim == TRUE )
+ {
+#ifdef FIX_393_459_460_SBA_MD
+ mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band );
+ mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band );
+ if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 )
+ {
num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+ rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat );
+ }
+#endif
- computeIntensityVector_dec( Cldfb_RealBuffer,
- Cldfb_ImagBuffer,
- num_freq_bands,
- hDirAC->buffer_intensity_real[0][index - 1],
- hDirAC->buffer_intensity_real[1][index - 1],
- hDirAC->buffer_intensity_real[2][index - 1] );
+ hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */
- computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1],
- hDirAC->buffer_intensity_real[1][index - 1],
- hDirAC->buffer_intensity_real[2][index - 1],
+ index = hDirAC->index_buffer_intensity;
+
+ num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+
+ computeIntensityVector_dec( Cldfb_RealBuffer,
+ Cldfb_ImagBuffer,
num_freq_bands,
+ hDirAC->buffer_intensity_real[0][index - 1],
+ hDirAC->buffer_intensity_real[1][index - 1],
+ hDirAC->buffer_intensity_real[2][index - 1] );
+ computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1],
+ hDirAC->buffer_intensity_real[1][index - 1],
+ hDirAC->buffer_intensity_real[2][index - 1],
+ num_freq_bands,
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ azimuth,
+ elevation
+#else
+ azimuth[slot_idx],
+ elevation[slot_idx]
+#endif
+#else
hDirAC->azimuth[hDirAC->dirac_estimator_idx],
- hDirAC->elevation[hDirAC->dirac_estimator_idx] );
+ hDirAC->elevation[hDirAC->dirac_estimator_idx]
+#endif
+ );
- mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands );
+ mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands );
+
+ computeDiffuseness( hDirAC->buffer_intensity_real,
+ hDirAC->buffer_energy,
+ num_freq_bands,
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ hDirAC->diffuseness_vector[md_idx]
+#else
+ diffuseness_vector[slot_idx]
+#endif
+#else
+ hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx]
+#endif
+ );
- computeDiffuseness( hDirAC->buffer_intensity_real,
- hDirAC->buffer_energy,
- num_freq_bands,
- hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] );
- hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length;
- }
+#ifndef JBM_TSM_ON_TCS
+ hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length;
+#endif
+ }
#ifdef DEBUG_MODE_DIRAC
- {
- static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL;
+ {
+ static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL;
- if ( fp_direction_vector == NULL )
- fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" );
- if ( fp_diffuseness == NULL )
- fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" );
- if ( fp_referencePower == NULL )
- fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" );
+ if ( fp_direction_vector == NULL )
+ fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" );
+ if ( fp_diffuseness == NULL )
+ fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" );
+ if ( fp_referencePower == NULL )
+ fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" );
- for ( i = 0; i < hDirAC->num_freq_bands; i++ )
- {
- float radius_length;
- float dv[3];
+ for ( i = 0; i < hDirAC->num_freq_bands; i++ )
+ {
+ float radius_length;
+ float dv[3];
- if ( hDirAC->hConfig->dec_param_estim == FALSE )
- {
- radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 );
- dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 );
- dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 );
- dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 );
-
- fwrite( dv, sizeof( float ), 3, fp_direction_vector );
- fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness );
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
- {
- reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i];
- }
- fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower );
- }
- else
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+ radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 );
+ dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 );
+ dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 );
+ dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 );
+
+ fwrite( dv, sizeof( float ), 3, fp_direction_vector );
+ fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness );
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
- radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 );
- dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 );
- dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 );
- dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 );
-
- fwrite( dv, sizeof( float ), 3, fp_direction_vector );
- fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness );
- fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower );
+ reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i];
}
+ fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower );
+ }
+ else
+ {
+ radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 );
+ dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 );
+ dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 );
+ dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 );
+
+ fwrite( dv, sizeof( float ), 3, fp_direction_vector );
+ fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness );
+ fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower );
}
}
+ }
#endif
- /*-----------------------------------------------------------------*
- * frequency domain decorrelation
- *-----------------------------------------------------------------*/
+ /*-----------------------------------------------------------------*
+ * frequency domain decorrelation
+ *-----------------------------------------------------------------*/
- if ( hDirAC->proto_signal_decorr_on == 1 )
+ if ( hDirAC->proto_signal_decorr_on == 1 )
+ {
+ /* decorrelate prototype frame */
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
- /* decorrelate prototype frame */
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
- {
- ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands,
- hDirAC->num_outputs_diff,
- hDirAC->num_protos_diff,
- hDirAC->synthesisConf,
- nchan_transport,
- hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff,
- hDirAC->num_protos_diff,
- hDirAC->proto_index_diff,
- hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ),
- onset_filter,
- hDirAC->h_freq_domain_decorr_ap_params,
- hDirAC->h_freq_domain_decorr_ap_state );
-
- v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands );
- v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands );
- p_onset_filter = onset_filter_subframe;
- }
- else
- {
- ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands,
- hDirAC->num_outputs_diff,
- hDirAC->num_protos_diff,
- hDirAC->synthesisConf,
- nchan_transport,
- hDirAC->proto_frame_f,
- hDirAC->num_protos_diff,
- hDirAC->proto_index_diff,
- DirAC_mem.frame_dec_f,
- onset_filter,
- hDirAC->h_freq_domain_decorr_ap_params,
- hDirAC->h_freq_domain_decorr_ap_state );
-
- hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f;
- p_onset_filter = onset_filter;
- }
+ ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands,
+ hDirAC->num_outputs_diff,
+ hDirAC->num_protos_diff,
+ hDirAC->synthesisConf,
+ nchan_transport,
+ hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff,
+ hDirAC->num_protos_diff,
+ hDirAC->proto_index_diff,
+ hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ),
+ onset_filter,
+ hDirAC->h_freq_domain_decorr_ap_params,
+ hDirAC->h_freq_domain_decorr_ap_state );
+
+ v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands );
+ v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands );
+ p_onset_filter = onset_filter_subframe;
}
else
{
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
- {
- set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands );
- p_onset_filter = onset_filter_subframe;
- }
- else
- {
- /* no frequency domain decorrelation: use prototype frame */
- hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f;
- p_onset_filter = NULL;
- }
+ ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands,
+ hDirAC->num_outputs_diff,
+ hDirAC->num_protos_diff,
+ hDirAC->synthesisConf,
+ nchan_transport,
+ hDirAC->proto_frame_f,
+ hDirAC->num_protos_diff,
+ hDirAC->proto_index_diff,
+ DirAC_mem.frame_dec_f,
+ onset_filter,
+ hDirAC->h_freq_domain_decorr_ap_params,
+ hDirAC->h_freq_domain_decorr_ap_state );
+
+ hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f;
+ p_onset_filter = onset_filter;
}
-
- /*-----------------------------------------------------------------*
- * output synthesis
- *-----------------------------------------------------------------*/
-
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD )
+ }
+ else
+ {
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
+ {
+ set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands );
+ p_onset_filter = onset_filter_subframe;
+ }
+ else
{
- /*Compute diffuse prototypes*/
- ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx );
+ /* no frequency domain decorrelation: use prototype frame */
+ hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f;
+ p_onset_filter = NULL;
}
+ }
+
+ /*-----------------------------------------------------------------*
+ * output synthesis
+ *-----------------------------------------------------------------*/
+
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD )
+ {
+ /*Compute diffuse prototypes*/
+ ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx );
+ }
- /*Compute PSDs*/
+ /*Compute PSDs*/
+#ifndef JBM_TSM_ON_TCS
+#ifdef EXTERNAL_ORIENTATIONS
+ if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 2 )
+#else
+ if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 )
+#endif
+ {
+ ivas_dirac_dec_output_synthesis_process_slot( reference_power,
+ p_onset_filter,
+ hDirAC,
+ p_Rmat,
+ st_ivas->hVBAPdata,
+ hDirAC->hOutSetup,
+ nchan_transport,
+ st_ivas->sba_analysis_order > 1 &&
+ st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k );
+ }
+ else
+ {
+ ivas_dirac_dec_output_synthesis_process_slot( reference_power,
+ p_onset_filter,
+ hDirAC,
+ 0,
+ st_ivas->hVBAPdata,
+ hDirAC->hOutSetup,
+ nchan_transport,
+ st_ivas->sba_analysis_order > 1 &&
+ st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k
+ );
+ }
+#else
#ifdef EXTERNAL_ORIENTATIONS
- if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 2 )
+ if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order > 0 )
#else
- if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 )
+ if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 )
#endif
{
ivas_dirac_dec_output_synthesis_process_slot( reference_power,
p_onset_filter,
+#ifdef FIX_393_459_460_SBA_MD
+ azimuth,
+ elevation,
+ hDirAC->diffuseness_vector[md_idx],
+#else
+ azimuth[slot_idx],
+ elevation[slot_idx],
+ diffuseness_vector[slot_idx],
+#endif
hDirAC,
+ st_ivas->hHeadTrackData->shd_rot_max_order,
p_Rmat,
st_ivas->hVBAPdata,
hDirAC->hOutSetup,
nchan_transport,
- index_slot );
+ md_idx,
+ hodirac_flag
+
+ );
}
else
{
ivas_dirac_dec_output_synthesis_process_slot( reference_power,
p_onset_filter,
+#ifdef FIX_393_459_460_SBA_MD
+ azimuth,
+ elevation,
+ hDirAC->diffuseness_vector[md_idx],
+#else
+ azimuth[slot_idx],
+ elevation[slot_idx],
+ diffuseness_vector[slot_idx],
+#endif
hDirAC,
0,
+ 0,
st_ivas->hVBAPdata,
hDirAC->hOutSetup,
nchan_transport,
- index_slot );
+ md_idx,
+ hodirac_flag );
}
+#endif
- if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
- {
- v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands );
- }
+#ifdef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim )
+ {
+ float fac = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx];
+ v_multc_acc( hDirAC->diffuseness_vector[md_idx], fac, diffuseness_vector, hDirAC->num_freq_bands );
+ }
+#endif
- if ( hDirAC->hConfig->dec_param_estim )
- {
- hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length;
- }
+ if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD )
+ {
+ v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands );
}
- if ( hDirAC->hConfig->dec_param_estim == 0 )
+#ifndef JBM_TSM_ON_TCS
+ if ( hDirAC->hConfig->dec_param_estim )
{
hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length;
}
+#endif
+ }
- if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
+#ifndef JBM_TSM_ON_TCS
+ if ( hDirAC->hConfig->dec_param_estim == 0 )
+ {
+ hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length;
+ }
+#endif
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] );
+
+#ifndef FIX_393_459_460_SBA_MD
+ if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ {
+ md_idx = hDirAC->render_to_md_map[subframe_idx];
+ }
+ else
+ {
+ md_idx = hDirAC->render_to_md_map[slot_idx_start];
+ }
+#endif
+
+#ifndef FIX_393_459_460_SBA_MD
+ /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */
+ /* :TODO: remove */
+ /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/
+ if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots )
+ {
+ /* we are at the end, get the next one using the normal dirac read idx...*/
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length;
+ }
+ else
+ {
+ md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length;
+ }
+ }
+ else
+ {
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
{
- ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer,
- Cldfb_ImagBuffer,
- hDirAC,
- nchan_transport,
- p_onset_filter );
+ md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]];
}
else
{
- /* Determine encoding quality based additional smoothing factor */
- float qualityBasedSmFactor = 1.0f;
- if ( st_ivas->hMasa != NULL )
+ md_idx = hDirAC->render_to_md_map[subframe_idx + 1];
+ }
+ }
+#endif
+
+#endif
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
+ {
+ ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer,
+ Cldfb_ImagBuffer,
+ hDirAC,
+ nchan_transport,
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->subframe_nbslots[subframe_idx],
+#endif
+ p_onset_filter,
+#ifdef FIX_393_459_460_SBA_MD
+ diffuseness_vector,
+#else
+#ifdef JBM_TSM_ON_TCS
+ md_idx,
+#endif
+#endif
+ hodirac_flag );
+ }
+ else
+ {
+ /* Determine encoding quality based additional smoothing factor */
+ float qualityBasedSmFactor = 1.0f;
+
+ if ( st_ivas->hMasa != NULL )
+ {
+ qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality;
+ qualityBasedSmFactor *= qualityBasedSmFactor;
+ }
+
+#ifdef JBM_TSM_ON_TCS
+#ifndef FIX_393_459_460_SBA_MD
+ /* Workaround for BE (should be gone when #393 is adressed) */
+ if ( hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band];
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
{
- qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality;
- qualityBasedSmFactor *= qualityBasedSmFactor;
+ mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands );
+ mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands );
+ mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands );
}
-
- ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer,
- Cldfb_ImagBuffer,
- hDirAC,
- reference_power_smooth,
- qualityBasedSmFactor );
}
+#endif
- /*-----------------------------------------------------------------*
- * CLDFB synthesis (and binaural rendering)
- *-----------------------------------------------------------------*/
+#endif
+ ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer,
+ Cldfb_ImagBuffer,
+ hDirAC,
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->subframe_nbslots[subframe_idx],
+#ifdef FIX_393_459_460_SBA_MD
+ diffuseness_vector,
+#else
+ md_idx,
+#endif
+#endif
+ reference_power_smooth,
+ qualityBasedSmFactor );
+ }
+
+ /*-----------------------------------------------------------------*
+ * CLDFB synthesis (and binaural rendering)
+ *-----------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+ index_slot = slot_idx_start_cldfb_synth;
+#else
index_slot = subframe_idx * hDirAC->subframe_nbslots;
+#endif
- if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
- {
- /* Perform binaural rendering */
- ivas_binRenderer( st_ivas->hBinRenderer,
- st_ivas->hHeadTrackData,
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ /* Perform binaural rendering */
+ ivas_binRenderer( st_ivas->hBinRenderer,
+ st_ivas->hHeadTrackData,
#ifdef EXTERNAL_ORIENTATIONS
- st_ivas->hCombinedOrientationData,
- subframe_idx,
+ st_ivas->hCombinedOrientationData,
+ subframe_idx,
#endif
- Cldfb_RealBuffer_Binaural,
- Cldfb_ImagBuffer_Binaural,
- Cldfb_RealBuffer,
- Cldfb_ImagBuffer );
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->subframe_nbslots[subframe_idx],
+#endif
+ Cldfb_RealBuffer_Binaural,
+ Cldfb_ImagBuffer_Binaural,
+ Cldfb_RealBuffer,
+ Cldfb_ImagBuffer );
- /* Inverse CLDFB*/
- for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ )
- {
- /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
- float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
- float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+ /* Inverse CLDFB*/
+ for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ )
+ {
+ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+ float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+ float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+#else
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
- {
- RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i];
- ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i];
- }
+#endif
+ {
+ RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i];
+ }
+#ifdef JBM_TSM_ON_TCS
+ cldfbSynthesis( RealBuffer,
+ ImagBuffer,
+ &( output_f[ch][index_slot * hDirAC->num_freq_bands] ),
+ hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx],
+ st_ivas->cldfbSynDec[ch] );
+#else
cldfbSynthesis( RealBuffer,
ImagBuffer,
&( output_f[ch][index_slot * hDirAC->num_freq_bands] ),
hDirAC->num_freq_bands * hDirAC->subframe_nbslots,
st_ivas->cldfbSynDec[ch] );
- }
+#endif
}
+ }
+#ifdef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->ivas_format == SBA_FORMAT )
+#else
else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#endif
+ {
+ for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ )
{
- for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ )
- {
+#ifdef JBM_TSM_ON_TCS
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+#else
for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ )
- {
- mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands );
- mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands );
- }
+#endif
+ {
+ mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands );
+ mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands );
}
}
- else
- {
- float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
- float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
- int16_t outchannels;
+ }
+ else
+ {
+ float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+ float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES];
+ int16_t outchannels;
- idx_in = 0;
- idx_lfe = 0;
+ idx_in = 0;
+ idx_lfe = 0;
- outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe;
- if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 ||
- hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 ||
- hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 ||
- hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 ||
- hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 ||
- ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) )
- {
- outchannels++;
- }
+ outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe;
+ if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 ||
+ hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 ||
+ hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 ||
+ hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 ||
+ hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 ||
+ ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) )
+ {
+ outchannels++;
+ }
- if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM )
- {
- float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
- float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
- const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands;
+ if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM )
+ {
+ float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
+ float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
+ const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands;
+#ifdef JBM_TSM_ON_TCS
+ const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx];
+#else
const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots;
+#endif
- /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */
- mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe );
- mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe );
+ /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */
+ mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe );
+ mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe );
- for ( ch = 0; ch < outchannels; ch++ )
+ for ( ch = 0; ch < outchannels; ch++ )
+ {
+ if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) )
{
- if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) )
- {
- /* Move the LFE channel to the correct place */
- mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
+ /* Move the LFE channel to the correct place */
+ mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
- if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) )
- {
- idx_lfe++;
- }
- }
- else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) )
+ if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) )
{
- /* Move the separated channel to the correct place. Thus, the separated channel is
- * combined with the synthesized channels here when there is a matching channel. */
- mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
+ idx_lfe++;
}
- else
- {
- /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+ }
+ else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) )
+ {
+ /* Move the separated channel to the correct place. Thus, the separated channel is
+ * combined with the synthesized channels here when there is a matching channel. */
+ mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
+ }
+ else
+ {
+ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+#else
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
- {
- RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
- ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
- }
- cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] );
-
- if ( !st_ivas->hLsSetupCustom->separate_ch_found )
- {
- /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel
- * is combined with the synthesized channels here when there is no matching channel. */
- v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
- }
+#endif
+ {
+ RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
+ }
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] );
- idx_in++;
+ if ( !st_ivas->hLsSetupCustom->separate_ch_found )
+ {
+ /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel
+ * is combined with the synthesized channels here when there is no matching channel. */
+ v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe );
}
+
+ idx_in++;
}
}
- else
+ }
+ else
+ {
+ for ( ch = 0; ch < outchannels; ch++ )
{
- for ( ch = 0; ch < outchannels; ch++ )
+ if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) )
{
- if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) )
+ if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled )
{
- if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled )
- {
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+#else
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
- {
- RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i];
- ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i];
- }
- cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] );
- }
- else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled )
- {
- /* LFE has been synthesized in the time domain, do nothing. */
- }
- else
- {
- set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands );
- }
-
- if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) )
+#endif
{
- idx_lfe++;
+ RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i];
}
+#ifdef JBM_TSM_ON_TCS
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] );
+#else
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] );
+#endif
}
- else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) )
+ else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled )
{
- /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated
- * channel is combined with the synthesized channels here. */
+ /* LFE has been synthesized in the time domain, do nothing. */
}
else
{
- /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+#ifdef JBM_TSM_ON_TCS
+ set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands );
+#else
+ set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands );
+#endif
+ }
+
+ if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) )
+ {
+ idx_lfe++;
+ }
+ }
+ else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) )
+ {
+ /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated
+ * channel is combined with the synthesized channels here. */
+ }
+ else
+ {
+ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+#else
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
- {
- RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
- ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
- }
- cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] );
- idx_in++;
+#endif
+ {
+ RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
}
+#ifdef JBM_TSM_ON_TCS
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] );
+#else
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] );
+#endif
+ idx_in++;
}
}
}
}
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx];
+ hDirAC->subframes_rendered++;
+#endif
+#ifndef JBM_TSM_ON_TCS
+}
+#endif
- pop_wmops();
+pop_wmops();
- return;
+return;
}
@@ -3493,7 +4553,8 @@ static void protoSignalComputation4(
const int16_t num_outputs_diff,
const int16_t num_freq_bands,
const float *mtx_hoa_decoder,
- const int16_t nchan_transport )
+ const int16_t nchan_transport,
+ const int16_t *sba_map_tc_ind )
{
int16_t k, l;
int16_t n;
@@ -3519,8 +4580,8 @@ static void protoSignalComputation4(
proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f;
for ( n = 0; n < nchan_transport; n++ )
{
- proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]];
- proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]];
+ proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]];
+ proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]];
}
}
}
diff --git a/lib_dec/ivas_dirac_decorr_dec.c b/lib_dec/ivas_dirac_decorr_dec.c
index bcaa6cf2a13916ccb0b68bd275d0f243ba4df33d..8c19d9698b29c3fc6d4f84edcc0a1826e9d20b39 100644
--- a/lib_dec/ivas_dirac_decorr_dec.c
+++ b/lib_dec/ivas_dirac_decorr_dec.c
@@ -156,7 +156,7 @@ ivas_error ivas_dirac_dec_decorr_open(
freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX;
}
- freq_domain_decorr_ap_params->use_ducker = 1; /* fcs: fixed for now but can be adaptive in an extended version */
+ freq_domain_decorr_ap_params->use_ducker = 1; /* ToDo: fcs: fixed for now but can be adaptive in an extended version */
assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" );
diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c
index a2fc9ee8210be12378d3175c808075fd88ebcd8d..ffe6fea38249029d090ac8ee38e6171705641479 100644
--- a/lib_dec/ivas_dirac_output_synthesis_cov.c
+++ b/lib_dec/ivas_dirac_output_synthesis_cov.c
@@ -104,13 +104,25 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open(
set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in );
set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out );
set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in );
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) );
+ }
+ set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in );
+#endif
}
for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
{
h_dirac_output_synthesis_state->cx_old[idx] = NULL;
h_dirac_output_synthesis_state->cy_old[idx] = NULL;
h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL;
+#ifdef JBM_TSM_ON_TCS
+ h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL;
+#endif
}
+
for ( idx = 0; idx < num_param_bands_residual; idx++ )
{
if ( ( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL )
@@ -118,10 +130,21 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) );
}
set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out );
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) );
+ }
+ set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out );
+#endif
}
for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
{
h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL;
+#ifdef JBM_TSM_ON_TCS
+ h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL;
+#endif
}
/*-----------------------------------------------------------------*
@@ -145,6 +168,30 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open(
}
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------*
+ * ivas_dirac_dec_output_synthesis_get_interpolator()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_dirac_dec_output_synthesis_get_interpolator(
+ DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */
+ const uint16_t interp_length /* i : interpolator length */
+)
+{
+ int16_t idx;
+
+ for ( idx = 1; idx <= interp_length; ++idx )
+ {
+ h_dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) interp_length;
+ }
+
+ return;
+}
+#endif
+
+
/*-------------------------------------------------------------------*
* ivas_dirac_dec_output_synthesis_cov_init()
*
@@ -168,11 +215,17 @@ void ivas_dirac_dec_output_synthesis_cov_init(
set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in );
set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out );
set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in );
+#ifdef JBM_TSM_ON_TCS
+ set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in );
+#endif
}
for ( idx = 0; idx < n_param_bands_res; idx++ )
{
set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out );
+#ifdef JBM_TSM_ON_TCS
+ set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out );
+#endif
}
return;
@@ -243,6 +296,20 @@ void ivas_dirac_dec_output_synthesis_cov_close(
free( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] );
h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL;
}
+
+#ifdef JBM_TSM_ON_TCS
+ if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL )
+ {
+ free( h_dirac_output_synthesis_state->mixing_matrix[idx] );
+ h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL;
+ }
+
+ if ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] != NULL )
+ {
+ free( h_dirac_output_synthesis_state->mixing_matrix_res[idx] );
+ h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL;
+ }
+#endif
}
return;
@@ -256,13 +323,21 @@ void ivas_dirac_dec_output_synthesis_cov_close(
*-------------------------------------------------------------------*/
void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot(
- float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
- float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */
+#ifdef JBM_TSM_ON_TCS
+ float *RealBuffer, /* i : input channel filter bank samples (real part) */
+ float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */
+#else
+ float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
+ float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */
+#endif
float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */
float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */
PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */
- const int16_t nchan_in, /* i : number of input channels */
- const int16_t idx_slot /* i : index of the slot to be added to the input covariance */
+ const int16_t nchan_in /* i : number of input channels */
+#ifndef JBM_TSM_ON_TCS
+ ,
+ const int16_t idx_slot /* i : index of the slot to be added to the input covariance */
+#endif
)
{
int16_t param_band, band_idx, ch_idx;
@@ -288,8 +363,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot(
int16_t band = brange[0] + band_idx;
for ( ch_idx = 0; ch_idx < nchan_in; ch_idx++ )
{
+#ifdef JBM_TSM_ON_TCS
+ real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx * hParamMC->num_freq_bands + band];
+ imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx * hParamMC->num_freq_bands + band];
+#else
real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx][idx_slot][band];
imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx][idx_slot][band];
+#endif
}
}
@@ -312,17 +392,27 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot(
*-------------------------------------------------------------------*/
void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot(
- float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */
- float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */
- float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */
- float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */
+#ifdef JBM_TSM_ON_TCS
+ float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */
+ float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */
+#else
+ float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */
+ float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */
+#endif
+ float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */
+ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */
+ float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */
+#else
float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */
float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */
- const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */
- const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */
- const int16_t nX, /* i : number of input channels */
- const int16_t nY, /* i : number of output channels */
- PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */
+#endif
+ const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */
+ const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */
+ const int16_t nX, /* i : number of input channels */
+ const int16_t nY, /* i : number of output channels */
+ PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */
)
{
int16_t param_band_idx, band, ch_idx;
@@ -407,8 +497,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot(
/* collect input signals, still in cldfb buffers */
for ( ch_idx = 0; ch_idx < nX; ch_idx++ )
{
+#ifdef JBM_TSM_ON_TCS
+ input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx * hParamMC->num_freq_bands + band];
+ input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx * hParamMC->num_freq_bands + band];
+#else
input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx][slot_idx_tot][band];
input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx][slot_idx_tot][band];
+#endif
}
/* apply mixing matrix */
diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c
old mode 100644
new mode 100755
index 3541bc5cfe44b7cd35728ae4bd86534e37ee5e7e..33004c540c55f0bf162793198d51e79b192b40a4
--- a/lib_dec/ivas_dirac_output_synthesis_dec.c
+++ b/lib_dec/ivas_dirac_output_synthesis_dec.c
@@ -87,13 +87,16 @@ static void normalizePanningGains( float *direct_response, const int16_t num_cha
*------------------------------------------------------------------------*/
ivas_error ivas_dirac_dec_output_synthesis_open(
- DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
- RENDERER_TYPE renderer_type, /* i : renderer type */
- const int16_t nchan_transport, /* i : number of transport channels*/
- const int32_t output_Fs /* i : output sampling rate */
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+ RENDERER_TYPE renderer_type, /* i : renderer type */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int32_t output_Fs /* i : output sampling rate */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
)
{
int16_t idx, ch_idx;
+ int16_t size;
float tmp;
uint16_t num_diffuse_responses;
float temp_alpha_synthesis[CLDFB_NO_CHANNELS_MAX];
@@ -161,13 +164,25 @@ ivas_error ivas_dirac_dec_output_synthesis_open(
}
/* buffer length and interpolator */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( JBM_CLDFB_SLOTS_IN_SUBFRAME * sizeof( float ) ) ) == NULL )
+#else
if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( hDirAC->subframe_nbslots * sizeof( float ) ) ) == NULL )
+#endif
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) );
}
/* target PSD buffers */
- if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL )
+ if ( hodirac_flag )
+ {
+ size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS;
+ }
+ else
+ {
+ size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir;
+ }
+ if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) );
}
@@ -204,7 +219,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open(
}
/* direct and diffuse gain buffers */
- if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL )
+ if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) );
}
@@ -272,9 +287,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open(
}
/* compute interpolator */
+#ifdef JBM_TSM_ON_TCS
+ for ( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx )
+#else
for ( idx = 1; idx <= hDirAC->subframe_nbslots; ++idx )
+#endif
{
+#ifdef JBM_TSM_ON_TCS
+ dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) JBM_CLDFB_SLOTS_IN_SUBFRAME;
+#else
dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) hDirAC->subframe_nbslots;
+#endif
}
/* prepare diffuse response function */
@@ -346,8 +369,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open(
void ivas_dirac_dec_output_synthesis_init(
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
)
{
+ int16_t size;
+
DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params;
DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state;
@@ -364,7 +391,16 @@ void ivas_dirac_dec_output_synthesis_init(
set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir );
}
- set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir );
+ if ( hodirac_flag )
+ {
+ size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS;
+ }
+ else
+ {
+ size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir;
+ }
+ set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, size );
+
if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_diff );
@@ -382,8 +418,7 @@ void ivas_dirac_dec_output_synthesis_init(
{
set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_protos_dir );
}
-
- set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir );
+ set_zero( h_dirac_output_synthesis_state->gains_dir_prev, size );
if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
@@ -511,25 +546,43 @@ void ivas_dirac_dec_output_synthesis_close(
*------------------------------------------------------------------------*/
void ivas_dirac_dec_output_synthesis_process_slot(
- const float *reference_power, /* i : Estimated power */
- const float *onset, /* i : onset filter */
- DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+ const float *reference_power, /* i : Estimated power */
+ const float *onset, /* i : onset filter */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t *azimuth,
+ const int16_t *elevation,
+ const float *diffuseness,
+#endif
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t sh_rot_max_order,
+#endif
const float *p_Rmat, /* i : rotation matrix */
const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */
const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */
- const int16_t nchan_transport, /* i : number of transport channels*/
- const int16_t index_slot )
+ const int16_t nchan_transport /* i : number of transport channels*/
+#if defined( JBM_TSM_ON_TCS )
+ ,
+ const int16_t md_idx
+#endif
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
+)
{
int16_t num_freq_bands, num_channels_dir;
int16_t num_freq_bands_diff, num_channels_diff;
int16_t ch_idx;
float aux_buf[CLDFB_NO_CHANNELS_MAX];
int16_t diff_start_band;
+#ifndef JBM_TSM_ON_TCS
const float *diffuseness;
+#endif
DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params;
DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state;
+#ifndef JBM_TSM_ON_TCS
diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx];
+#endif
h_dirac_output_synthesis_params = &( hDirAC->h_output_synthesis_psd_params );
h_dirac_output_synthesis_state = &( hDirAC->h_output_synthesis_psd_state );
@@ -550,113 +603,195 @@ void ivas_dirac_dec_output_synthesis_process_slot(
num_channels_dir = hOutSetup.nchan_out_woLFE;
}
- if ( hDirAC->hConfig->dec_param_estim == TRUE )
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag )
{
- /* compute direct responses */
ivas_dirac_dec_compute_directional_responses( hDirAC,
hVBAPdata,
NULL,
- index_slot,
- index_slot / MAX_PARAM_SPATIAL_SUBFRAMES, NULL,
+#ifdef JBM_TSM_ON_TCS
+ azimuth,
+ elevation,
+ md_idx,
+#endif
+ NULL,
2,
- p_Rmat );
+ p_Rmat,
+ hodirac_flag );
+ }
+ if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac_flag )
+ {
if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
+#ifdef JBM_TSM_ON_TCS
+ v_multc( hDirAC->energy_ratio1[md_idx], -1.f, aux_buf, num_freq_bands );
+ v_addc( aux_buf, 1.f, aux_buf, num_freq_bands );
+ mvr2r( hDirAC->energy_ratio1[md_idx],
+ h_dirac_output_synthesis_state->direct_power_factor,
+ num_freq_bands );
+ mvr2r( aux_buf,
+ h_dirac_output_synthesis_state->diffuse_power_factor,
+ num_freq_bands );
+
+ v_multc( hDirAC->energy_ratio2[md_idx], -1.f, aux_buf, num_freq_bands );
+ v_addc( aux_buf, 1.f, aux_buf, num_freq_bands );
+ mvr2r( hDirAC->energy_ratio2[md_idx],
+ &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands],
+ num_freq_bands );
+ mvr2r( aux_buf,
+ &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands],
+ num_freq_bands );
+#else
+ v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands );
+ v_addc( aux_buf, 1.f, aux_buf, num_freq_bands );
+ mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx],
+ h_dirac_output_synthesis_state->direct_power_factor,
+ num_freq_bands );
+ mvr2r( aux_buf,
+ h_dirac_output_synthesis_state->diffuse_power_factor,
+ num_freq_bands );
+
+ v_multc( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands );
+ v_addc( aux_buf, 1.f, aux_buf, num_freq_bands );
+ mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx],
+ &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands],
+ num_freq_bands );
+ mvr2r( aux_buf,
+ &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands],
+ num_freq_bands );
+#endif
+ }
+ else
+ {
+#ifdef JBM_TSM_ON_TCS
ivas_dirac_dec_compute_gain_factors( num_freq_bands,
- diffuseness,
+ hDirAC->diffuseness_vector[md_idx],
h_dirac_output_synthesis_params->max_band_decorr,
h_dirac_output_synthesis_state->direct_power_factor,
h_dirac_output_synthesis_state->diffuse_power_factor );
+#else
+ ivas_dirac_dec_compute_gain_factors( num_freq_bands,
+ hDirAC->diffuseness_vector[hDirAC->dirac_read_idx],
+ h_dirac_output_synthesis_params->max_band_decorr,
+ h_dirac_output_synthesis_state->direct_power_factor,
+ h_dirac_output_synthesis_state->diffuse_power_factor );
+#endif
+ }
+ }
+ else // ( hDirAC->hConfig->dec_param_estim == TRUE )
+ if ( hDirAC->hConfig->dec_param_estim == TRUE )
+ {
- v_multc( h_dirac_output_synthesis_state->direct_power_factor,
- 0.25f,
- h_dirac_output_synthesis_state->direct_power_factor,
- num_freq_bands );
- v_multc( h_dirac_output_synthesis_state->diffuse_power_factor,
- 0.25f,
- h_dirac_output_synthesis_state->diffuse_power_factor,
- num_freq_bands );
-
+ /* compute direct responses */
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec_compute_directional_responses( hDirAC,
+ hVBAPdata,
+ NULL,
+ azimuth,
+ elevation,
+ md_idx,
+ NULL,
+ sh_rot_max_order,
+ p_Rmat,
+ hodirac_flag );
+#endif
- /*Direct gain*/
- for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ )
+ if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
- int16_t k;
- if ( ch_idx != 0 )
- {
- float a, b, c;
+ ivas_dirac_dec_compute_gain_factors( num_freq_bands,
+ diffuseness,
+ h_dirac_output_synthesis_params->max_band_decorr,
+ h_dirac_output_synthesis_state->direct_power_factor,
+ h_dirac_output_synthesis_state->diffuse_power_factor );
+
+
+ v_multc( h_dirac_output_synthesis_state->direct_power_factor,
+ 0.25f,
+ h_dirac_output_synthesis_state->direct_power_factor,
+ num_freq_bands );
+ v_multc( h_dirac_output_synthesis_state->diffuse_power_factor,
+ 0.25f,
+ h_dirac_output_synthesis_state->diffuse_power_factor,
+ num_freq_bands );
- /*Directonal sound gain nrg compensation*/
- for ( k = 0; k < num_freq_bands_diff; k++ )
+ /*Direct gain*/
+ for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ )
+ {
+ int16_t k;
+ if ( ch_idx != 0 )
{
- a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k];
- b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON );
- c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/
- h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) );
+ float a, b, c;
+
+ /*Directonal sound gain nrg compensation*/
+ for ( k = 0; k < num_freq_bands_diff; k++ )
+ {
+ a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k];
+ b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON );
+ c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/
+ h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) );
+ }
+ for ( ; k < num_freq_bands; k++ )
+ {
+ a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k];
+ b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON );
+ c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/
+ h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) );
+ }
}
- for ( ; k < num_freq_bands; k++ )
+ else
{
- a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k];
- b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON );
- c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/
- h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) );
+ /*Diffuseness modellling nrg compensation*/
+ for ( k = 0; k < num_freq_bands_diff; k++ )
+ {
+ h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) );
+ }
+ for ( ; k < num_freq_bands; k++ )
+ {
+ h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) );
+ }
}
}
- else
+
+ /*Directional gain (panning)*/
+ for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ )
{
- /*Diffuseness modellling nrg compensation*/
- for ( k = 0; k < num_freq_bands_diff; k++ )
- {
- h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) );
- }
- for ( ; k < num_freq_bands; k++ )
- {
- h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) );
- }
+ v_mult( h_dirac_output_synthesis_state->direct_power_factor,
+ &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands],
+ aux_buf,
+ num_freq_bands );
+
+ v_add( aux_buf,
+ &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ num_freq_bands );
+ }
+
+ /*Diffuse gain*/
+ for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ )
+ {
+ v_multc( h_dirac_output_synthesis_state->diffuse_power_factor,
+ hDirAC->diffuse_response_function[ch_idx],
+ aux_buf,
+ num_freq_bands_diff );
+
+ v_add( aux_buf,
+ &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff],
+ &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff],
+ num_freq_bands_diff );
}
- }
- /*Directional gain (panning)*/
- for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ )
- {
- v_mult( h_dirac_output_synthesis_state->direct_power_factor,
- &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands],
- aux_buf,
- num_freq_bands );
-
- v_add( aux_buf,
- &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands],
- &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands],
- num_freq_bands );
- }
- /*Diffuse gain*/
- for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ )
+ return;
+ }
+ else
{
- v_multc( h_dirac_output_synthesis_state->diffuse_power_factor,
- hDirAC->diffuse_response_function[ch_idx],
- aux_buf,
- num_freq_bands_diff );
-
- v_add( aux_buf,
- &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff],
- &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff],
- num_freq_bands_diff );
+ /* compute reference and diffuse power factor for this frame */
+ ivas_dirac_dec_compute_power_factors( num_freq_bands,
+ diffuseness,
+ h_dirac_output_synthesis_params->max_band_decorr,
+ h_dirac_output_synthesis_state->direct_power_factor,
+ h_dirac_output_synthesis_state->diffuse_power_factor );
}
-
- return;
}
- else
- {
- /* compute reference and diffuse power factor for this frame */
-
- ivas_dirac_dec_compute_power_factors( num_freq_bands,
- diffuseness,
- h_dirac_output_synthesis_params->max_band_decorr,
- h_dirac_output_synthesis_state->direct_power_factor,
- h_dirac_output_synthesis_state->diffuse_power_factor );
- }
- }
diff_start_band = 0;
if ( h_dirac_output_synthesis_params->use_onset_filters )
@@ -696,7 +831,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const int16_t nchan_transport, /* i : number of transport channels */
- const float *onset_filter )
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nbslots, /* i : number of slots to process */
+#endif
+ const float *onset_filter,
+#ifdef FIX_393_459_460_SBA_MD
+ float *diffuseness,
+#else
+#ifdef JBM_TSM_ON_TCS
+ const int16_t md_idx,
+#endif
+#endif
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
+)
{
int16_t buf_idx, ch_idx, i, l;
int16_t num_freq_bands, num_freq_bands_diff;
@@ -715,6 +862,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
DIRAC_OUTPUT_SYNTHESIS_STATE h_dirac_output_synthesis_state;
int16_t nchan_transport_foa;
int16_t ch_idx_diff;
+ float aux_buf[CLDFB_NO_CHANNELS_MAX];
+ float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX];
+#ifndef FIX_393_459_460_SBA_MD
+ const float *diffuseness;
+#endif
/* collect some often used parameters */
h_dirac_output_synthesis_params = hDirAC->h_output_synthesis_psd_params;
@@ -728,11 +880,72 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
num_channels_diff = hDirAC->num_outputs_diff;
nchan_transport_foa = min( 4, nchan_transport );
+#ifndef FIX_393_459_460_SBA_MD
+#ifdef JBM_TSM_ON_TCS
+ diffuseness = hDirAC->diffuseness_vector[md_idx];
+#else
+ diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx];
+#endif
+#endif
+
/*-----------------------------------------------------------------*
* comput target Gains
*-----------------------------------------------------------------*/
- if ( hDirAC->hConfig->dec_param_estim == FALSE )
+ if ( hodirac_flag )
+ {
+ assert( hDirAC->hConfig->dec_param_estim == FALSE );
+ /*Direct gain*/
+ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
+ {
+ v_multc( diffuseness,
+ 1.f,
+ &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ num_freq_bands );
+ v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f,
+ &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ num_freq_bands );
+
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] );
+ }
+ }
+
+ /*Directional gain*/
+ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
+ {
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ aux_buf[l] = 1.f - diffuseness[l];
+ ratio[l] = 1.f - h_dirac_output_synthesis_state.direct_power_factor[hDirAC->num_freq_bands + l];
+ ratio[l + num_freq_bands] = 1.f - ratio[l];
+ }
+
+ v_mult( aux_buf, ratio, ratio, num_freq_bands );
+ v_mult( aux_buf, &ratio[num_freq_bands], &ratio[num_freq_bands], num_freq_bands );
+
+ v_mult( ratio,
+ &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands],
+ &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands],
+ num_freq_bands );
+ v_mult( &ratio[num_freq_bands],
+ &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir],
+ &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir],
+ num_freq_bands );
+ }
+
+ /*Diffuse gain*/
+ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ )
+ {
+ v_multc( h_dirac_output_synthesis_state.diffuse_power_factor,
+ hDirAC->diffuse_response_function[ch_idx],
+ &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff],
+ num_freq_bands_diff );
+ }
+ }
+ else if ( hDirAC->hConfig->dec_param_estim == FALSE )
{
/*Direct gain*/
for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
@@ -778,17 +991,35 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth;
p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev;
- /*Direct gains*/
- for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
+ /* Direct gains */
+ if ( hodirac_flag )
{
- for ( l = 0; l < num_freq_bands; l++ )
+ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
{
- g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f );
- g2 = ( 1.f - g1 ) * *( p_gains_dir );
- g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) );
- g2 = max( g2, 0.85f );
- g2 = min( g2, 1.15f );
- *( p_gains_dir++ ) = g2;
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f );
+ g2 = ( 1.f - g1 ) * *( p_gains_dir );
+ g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) );
+ g2 = max( g2, 0.99f );
+ g2 = min( g2, 2.0f );
+ *( p_gains_dir++ ) = g2;
+ }
+ }
+ }
+ else
+ {
+ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
+ {
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f );
+ g2 = ( 1.f - g1 ) * *( p_gains_dir );
+ g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) );
+ g2 = max( g2, 0.85f );
+ g2 = min( g2, 1.15f );
+ *( p_gains_dir++ ) = g2;
+ }
}
}
@@ -806,6 +1037,36 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
}
}
+ if ( hodirac_flag )
+ {
+ p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir;
+ p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev + num_freq_bands * num_channels_dir;
+
+ /*Direct gains*/
+ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ )
+ {
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ p_cy_cross_dir_smooth++;
+ p_gains_dir++;
+ }
+ }
+
+ /*Directional gains*/
+ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
+ {
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f );
+ g2 = ( 1.f - g1 ) * *( p_gains_dir );
+ g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) );
+ g2 = max( g2, -DIRAC_GAIN_LIMIT );
+ g2 = min( g2, DIRAC_GAIN_LIMIT );
+ *( p_gains_dir++ ) = g2;
+ }
+ }
+ }
+
/*Diffuse gains*/
p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff;
p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev + nchan_transport_foa * num_freq_bands_diff;
@@ -826,7 +1087,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
* gain interpolation and output streams
*-----------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+ for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx )
+#else
for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx )
+#endif
{
g1 = h_dirac_output_synthesis_params.interpolator[buf_idx];
g2 = 1.f - g1;
@@ -848,26 +1113,74 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
/*Directional stream*/
for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ )
{
- p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f +
- buf_idx * 2 * num_freq_bands * num_protos_dir +
- proto_direct_index[ch_idx] * 2 * num_freq_bands;
- if ( proto_direct_index[ch_idx] == 0 )
+ if ( hodirac_flag )
{
- for ( l = 0; l < num_freq_bands; l++ )
+ if ( proto_direct_index[ch_idx] == 0 )
{
- g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) );
- output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) );
- output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) );
+ float *p_proto2;
+ float gs1, gs2;
+ p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f +
+ buf_idx * 2 * num_freq_bands * num_protos_dir +
+ proto_direct_index[0] * 2 * num_freq_bands;
+ p_proto2 = h_dirac_output_synthesis_state.proto_direct_buffer_f +
+ buf_idx * 2 * num_freq_bands * num_protos_dir +
+ proto_direct_index[1] * 2 * num_freq_bands;
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ gs1 = g1 * ( *( p_gains_dir ) ) + g2 * ( *( p_gains_dir_prev ) );
+ gs2 = g1 * ( *( p_gains_dir + num_freq_bands * num_channels_dir ) ) + g2 * ( *( p_gains_dir_prev + num_freq_bands * num_channels_dir ) );
+ p_gains_dir++;
+ p_gains_dir_prev++;
+
+ output_real[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + // s1
+ 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); // s2
+ p_proto++;
+ p_proto2++;
+ output_imag[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) +
+ 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) );
+ p_proto++;
+ p_proto2++;
+ }
+ }
+ else
+ {
+ p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f +
+ buf_idx * 2 * num_freq_bands * num_protos_dir +
+ proto_direct_index[ch_idx] * 2 * num_freq_bands;
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ p_gains_dir++;
+ p_gains_dir_prev++;
+
+
+ output_real[l * num_channels_dir + ch_idx] = *( p_proto++ );
+ output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ );
+ }
}
}
else
{
- for ( l = 0; l < num_freq_bands; l++ )
+ p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f +
+ buf_idx * 2 * num_freq_bands * num_protos_dir +
+ proto_direct_index[ch_idx] * 2 * num_freq_bands;
+ if ( proto_direct_index[ch_idx] == 0 )
{
- p_gains_dir++;
- p_gains_dir_prev++;
- output_real[l * num_channels_dir + ch_idx] = *( p_proto++ );
- output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ );
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) );
+ output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) );
+ output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) );
+ }
+ }
+ else
+ {
+ for ( l = 0; l < num_freq_bands; l++ )
+ {
+ p_gains_dir++;
+ p_gains_dir_prev++;
+ output_real[l * num_channels_dir + ch_idx] = *( p_proto++ );
+ output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ );
+ }
}
}
}
@@ -885,8 +1198,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
for ( l = 0; l < num_freq_bands_diff; l++ )
{
g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) );
- output_real[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */
- output_imag[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) );
+ output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */
+ output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) );
}
}
else
@@ -950,11 +1263,27 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd(
*-----------------------------------------------------------------*/
/* store estimates for next synthesis block */
- mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir );
+ if ( hodirac_flag )
+ {
+ mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS );
+ }
+ else
+ {
+ mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir );
+ }
+
mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff );
/* reset values */
- set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir );
+ if ( hodirac_flag )
+ {
+ set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS );
+ }
+ else
+ {
+ set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir );
+ }
+
set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff );
return;
@@ -971,10 +1300,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nbslots, /* i : number of slots to process */
+#ifdef FIX_393_459_460_SBA_MD
+ float *diffuseness_vector,
+#else
+ const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */
+#endif
+#endif
float *reference_power_smooth,
float qualityBasedSmFactor )
{
- int16_t buf_idx, num_freq_bands, diff_start_band;
+ int16_t buf_idx, num_freq_bands;
+ int16_t diff_start_band;
int16_t k, l;
int16_t nchan_out_woLFE;
float *p_power_smooth_prev, *p_power_diff_smooth_prev;
@@ -1016,7 +1354,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
/*-----------------------------------------------------------------*
* compute target PSDs
*-----------------------------------------------------------------*/
-
if ( hDirAC->hConfig->enc_param_start_band == 0 )
{
diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0;
@@ -1044,7 +1381,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
h_dirac_output_synthesis_state->diffuse_responses_square,
h_dirac_output_synthesis_state->cy_auto_diff_smooth );
}
-
/*-----------------------------------------------------------------*
* compute variables for stereo transport signal type detection
*-----------------------------------------------------------------*/
@@ -1097,7 +1433,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
indexFast = min( l, alphaMaxBinFast );
/* Estimate the smoothness of the directions based on the diffuseness parameter */
+ /* TODO: check this, seems buggy in the case of parame estim on the decoder side,
+ because the pointer here points already to the following subframe, ist this intended?*/
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_393_459_460_SBA_MD
+ instDirectionSmoothness = 1.0f - diffuseness_vector[l];
+#else
+ /* Workaround for BE */
+ instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */
+#endif
+#else
instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx][l]; /* Currently, all subframes have same energy ratio value. */
+#endif
instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f );
/* Average the direction smoothness parameter over time */
@@ -1241,8 +1588,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls(
/*-----------------------------------------------------------------*
* gain interpolation and output streams
*-----------------------------------------------------------------*/
-
+#ifdef JBM_TSM_ON_TCS
+ for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx )
+#else
for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx )
+#endif
{
g1 = h_dirac_output_synthesis_params->interpolator[buf_idx];
g2 = 1.f - g1;
@@ -1484,11 +1834,16 @@ void ivas_dirac_dec_compute_directional_responses(
DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */
const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */
const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */
- const int16_t direction_idx, /* i : index for direction (azi and ele), can slot index (>2TCs) or subrame index (<=2TCs) */
- const int16_t subframe_idx, /* i : subframe index */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t *azimuth,
+ const int16_t *elevation,
+ const int16_t md_idx,
+#endif
const float *surCohRatio,
const int16_t shd_rot_max_order, /* i : split-order rotation method */
const float *p_Rmat /* i : rotation matrix */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
)
{
int16_t k, l;
@@ -1497,7 +1852,9 @@ void ivas_dirac_dec_compute_directional_responses(
float direct_response_ls[MAX_OUTPUT_CHANNELS];
float direct_response_square[MAX_OUTPUT_CHANNELS];
float *direct_response;
+#ifndef JBM_TSM_ON_TCS
const int16_t *azimuth, *elevation;
+#endif
const int16_t *azimuth2, *elevation2;
float direct_response_dir2[MAX_OUTPUT_CHANNELS];
float directRatio[MASA_MAXIMUM_DIRECTIONS];
@@ -1518,13 +1875,21 @@ void ivas_dirac_dec_compute_directional_responses(
}
num_channels_dir = hDirAC->num_outputs_dir;
+#ifdef JBM_TSM_ON_TCS
+ if ( hDirAC->numSimultaneousDirections == 2 )
+ {
+ azimuth2 = hDirAC->azimuth2[md_idx];
+ elevation2 = hDirAC->elevation2[md_idx];
+ }
+#else
azimuth = hDirAC->azimuth[hDirAC->dirac_read_idx];
elevation = hDirAC->elevation[hDirAC->dirac_read_idx];
if ( hDirAC->numSimultaneousDirections == 2 )
{
- azimuth2 = hDirAC->azimuth2[direction_idx];
- elevation2 = hDirAC->elevation2[direction_idx];
+ azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx];
+ elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx];
}
+#endif
codingBand = -1;
assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" );
@@ -1558,34 +1923,63 @@ void ivas_dirac_dec_compute_directional_responses(
if ( hDirAC->panningConf == DIRAC_PANNING_HOA3 )
{
set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS );
+ set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS );
+
if ( p_Rmat != 0 )
{
ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat );
+
+ if ( hodirac_flag )
+ {
+ ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat );
+ }
}
else
{
ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirAC->hOutSetup.ambisonics_order );
+
+ if ( hodirac_flag )
+ {
+ ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirAC->hOutSetup.ambisonics_order );
+ }
}
if ( hMasa == NULL && hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD )
{
mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir );
+
+ if ( hodirac_flag )
+ {
+ mvr2r_inc( direct_response_dir2, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k + hDirAC->num_freq_bands * num_channels_dir], hDirAC->num_freq_bands, num_channels_dir );
+ }
}
else if ( ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) && ( hMasa != NULL ) ) ||
hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO )
{
/* Synthesize the first direction */
- spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[subframe_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
-
+#ifdef JBM_TSM_ON_TCS
+ spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
+#else
+ spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
+#endif
/* Synthesize the second direction and combine the gains */
if ( hDirAC->numSimultaneousDirections == 2 )
{
- spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[subframe_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
-
+#ifdef JBM_TSM_ON_TCS
+ spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
+#else
+ spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order );
+#endif
/* Combine gains from the two directions */
- totalDirect = hDirAC->energy_ratio1[subframe_idx][k] + hDirAC->energy_ratio2[subframe_idx][k] + EPSILON;
- directRatio[0] = hDirAC->energy_ratio1[subframe_idx][k] / totalDirect;
- directRatio[1] = hDirAC->energy_ratio2[subframe_idx][k] / totalDirect;
+#ifdef JBM_TSM_ON_TCS
+ totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON;
+ directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect;
+ directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect;
+#else
+ totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON;
+ directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect;
+ directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect;
+#endif
for ( l = 0; l < num_channels_dir; l++ )
{
direct_response_hoa[l] *= directRatio[0];
@@ -1633,20 +2027,33 @@ void ivas_dirac_dec_compute_directional_responses(
else if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/
{
/* Synthesize the first direction */
- spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[subframe_idx][k], direct_response_ls, num_channels_dir, hVBAPdata );
+#ifdef JBM_TSM_ON_TCS
+ spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata );
+#else
+ spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata );
+#endif
normalizePanningGains( direct_response_ls, num_channels_dir );
/* Synthesize the second direction and combine the gains */
if ( hDirAC->numSimultaneousDirections == 2 )
{
- spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[subframe_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata );
-
+#ifdef JBM_TSM_ON_TCS
+ spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata );
+#else
+ spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata );
+#endif
normalizePanningGains( direct_response_dir2, num_channels_dir );
/* Combine gains from the two directions */
- totalDirect = hDirAC->energy_ratio1[subframe_idx][k] + hDirAC->energy_ratio2[subframe_idx][k] + EPSILON;
- directRatio[0] = hDirAC->energy_ratio1[subframe_idx][k] / totalDirect;
- directRatio[1] = hDirAC->energy_ratio2[subframe_idx][k] / totalDirect;
+#ifdef JBM_TSM_ON_TCS
+ totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON;
+ directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect;
+ directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect;
+#else
+ totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON;
+ directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect;
+ directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect;
+#endif
for ( l = 0; l < num_channels_dir; l++ )
{
direct_response_ls[l] *= directRatio[0];
diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c
index 6d84cfec524cec8cb74ace45158ecd95644d8331..59e49cb7519237062db98b287530485a110b8818 100644
--- a/lib_dec/ivas_init_dec.c
+++ b/lib_dec/ivas_init_dec.c
@@ -63,10 +63,15 @@ static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas );
ivas_error ivas_dec_setup(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */
+ int16_t *data /* o : flushed PCM samples */
+#endif
)
{
int16_t k, idx, num_bits_read;
- int16_t num_obj, element_mode_flag;
+ int16_t nchan_ism, element_mode_flag;
Decoder_State *st;
int32_t ivas_total_brate;
ivas_error error;
@@ -102,15 +107,27 @@ ivas_error ivas_dec_setup(
{
/* read the number of objects */
st_ivas->nchan_transport = 1;
- num_obj = 1;
+ nchan_ism = 1;
k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 );
- while ( st_ivas->bit_stream[k] && num_obj < MAX_NUM_OBJECTS )
+ while ( st_ivas->bit_stream[k] && nchan_ism < MAX_NUM_OBJECTS )
{
- num_obj++;
+ nchan_ism++;
k--;
}
- ivas_ism_dec_config( st_ivas, num_obj );
+ st_ivas->nchan_ism = nchan_ism;
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#else
+ if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#endif
}
else if ( st_ivas->ivas_format == SBA_FORMAT )
{
@@ -184,7 +201,11 @@ ivas_error ivas_dec_setup(
num_bits_read += MC_LS_SETUP_BITS;
/* select MC format mode; reconfigure the MC format decoder */
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc_dec_config( st_ivas, idx, nSamplesRendered, data );
+#else
ivas_mc_dec_config( st_ivas, idx );
+#endif
}
/*-------------------------------------------------------------------*
@@ -223,6 +244,9 @@ ivas_error ivas_dec_setup(
case SID_MDCT_STEREO:
st_ivas->element_mode_init = IVAS_CPE_MDCT;
break;
+ case SID_ISM:
+ st_ivas->element_mode_init = IVAS_SCE;
+ break;
case SID_MASA_1TC:
st_ivas->element_mode_init = IVAS_SCE;
st_ivas->nchan_transport = 1;
@@ -249,15 +273,18 @@ ivas_error ivas_dec_setup(
if ( st_ivas->ini_frame > 0 && st_ivas->ivas_format == SBA_FORMAT )
{
int16_t nchan_transport_old, nchan_transport;
+#ifndef SBA_MODE_CLEAN_UP
SBA_MODE sba_mode_old;
- int32_t last_ivas_total_brate;
-
- last_ivas_total_brate = st_ivas->last_active_ivas_total_brate;
- sba_mode_old = ivas_sba_mode_select( last_ivas_total_brate );
+ sba_mode_old = ivas_sba_mode_select();
+#endif
nchan_transport_old = st_ivas->nchan_transport;
nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1;
+#ifdef SBA_MODE_CLEAN_UP
+ if ( ( nchan_transport_old != nchan_transport ) )
+#else
if ( ( nchan_transport_old != nchan_transport ) || ( sba_mode_old != st_ivas->sba_mode ) )
+#endif
{
/*Setting the default bitrate for the reconfig function*/
if ( st_ivas->sid_format == SID_SBA_2TC )
@@ -266,7 +293,12 @@ ivas_error ivas_dec_setup(
}
else
{
+#ifdef SBA_MODE_CLEAN_UP
+ st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4;
+#else
st_ivas->hDecoderConfig->ivas_total_brate = ( st_ivas->sba_mode == SBA_MODE_SPAR ) ? IVAS_24k4 : IVAS_13k2;
+
+#endif
}
if ( ( error = ivas_sba_dec_reconfigure( st_ivas ) ) != IVAS_ERR_OK )
@@ -366,6 +398,18 @@ static ivas_error ivas_read_format(
case 2:
st_ivas->ivas_format = ISM_FORMAT;
+ if ( ivas_total_brate >= IVAS_24k4 )
+ {
+ if ( st_ivas->bit_stream[*num_bits_read] )
+ {
+ /* placeholder for combined format signaling */
+
+ ( *num_bits_read )++;
+ }
+
+ ( *num_bits_read )++;
+ }
+
break;
case 3:
if ( st_ivas->bit_stream[*num_bits_read] )
@@ -375,8 +419,9 @@ static ivas_error ivas_read_format(
else
{
st_ivas->ivas_format = SBA_FORMAT;
-
- st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate );
+#ifndef SBA_MODE_CLEAN_UP
+ st_ivas->sba_mode = ivas_sba_mode_select();
+#endif
}
( *num_bits_read )++;
break;
@@ -403,15 +448,6 @@ static ivas_error ivas_read_format(
case SID_ISM:
st_ivas->ivas_format = ISM_FORMAT;
- if ( st_ivas->ism_mode == ISM_MODE_DISC )
- {
- ivas_ism_dec_config( st_ivas, 1 ); /* currently DTX supported for 1 ISM when ISM Mode is DISC_ISM */
- }
-
- if ( st_ivas->ism_mode == ISM_MODE_PARAM )
- {
- ivas_ism_dec_config( st_ivas, st_ivas->nSCE ); /* for Param-ISM, we need to generate 2 TCs */
- }
break;
case SID_MULTICHANNEL:
st_ivas->ivas_format = MC_FORMAT;
@@ -449,11 +485,11 @@ static ivas_error ivas_read_format(
int16_t tc_mode_offset;
tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 );
idx = st_ivas->bit_stream[tc_mode_offset];
- // TBD: needs more work for HOA
if ( st_ivas->sba_analysis_order == 0 )
{
st_ivas->sba_analysis_order = SBA_FOA_ORDER;
}
+#ifndef SBA_MODE_CLEAN_UP
if ( idx == 1 )
{
st_ivas->sba_mode = SBA_MODE_SPAR;
@@ -462,6 +498,7 @@ static ivas_error ivas_read_format(
{
st_ivas->sba_mode = SBA_MODE_DIRAC;
}
+#endif
}
/* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */
@@ -497,28 +534,10 @@ int16_t getNumChanSynthesis(
{
n = CPE_CHANNELS;
}
-#ifdef SBA_HPF_TUNING_DEC
- else if ( st_ivas->ivas_format == SBA_FORMAT )
- {
- if ( st_ivas->sba_analysis_order > 1 )
- {
- n = 0;
- }
- else
- {
- n = st_ivas->nchan_transport;
- }
- }
- else if ( st_ivas->hMCT != NULL )
- {
- n = st_ivas->nchan_transport;
- }
-#else
else if ( st_ivas->hMCT != NULL || st_ivas->ivas_format == SBA_FORMAT )
{
n = st_ivas->nchan_transport;
}
-#endif
return n;
}
@@ -574,7 +593,9 @@ ivas_error ivas_init_decoder_front(
st_ivas->ism_mode = ISM_MODE_NONE;
st_ivas->mc_mode = MC_MODE_NONE;
+#ifndef SBA_MODE_CLEAN_UP
st_ivas->sba_mode = SBA_MODE_NONE;
+#endif
st_ivas->sba_dirac_stereo_flag = 0;
@@ -694,9 +715,16 @@ ivas_error ivas_init_decoder(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
)
{
+#ifndef SBA_MODE_CLEAN_UP
int16_t i, k, n;
+#else
+ int16_t i, n;
+#endif
int16_t sce_id, cpe_id;
int16_t numCldfbAnalyses, numCldfbSyntheses;
+#ifdef JBM_TSM_ON_TCS
+ int16_t granularity, n_channels_transport_jbm;
+#endif
int32_t output_Fs, ivas_total_brate;
int32_t binauralization_delay_ns;
AUDIO_CONFIG output_config;
@@ -778,13 +806,18 @@ ivas_error ivas_init_decoder(
}
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*-----------------------------------------------------------------*
* Set head/orientation tracking
*-----------------------------------------------------------------*/
if ( st_ivas->hDecoderConfig->Opt_Headrotation )
{
+#ifdef FIX_439_OTR_PARAMS
+ if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#else
if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_NONE )
{
if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_NONE ) ) != IVAS_ERR_OK )
@@ -806,7 +839,6 @@ ivas_error ivas_init_decoder(
return error;
}
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF_VEC )
{
if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_VEC ) ) != IVAS_ERR_OK )
@@ -825,9 +857,8 @@ ivas_error ivas_init_decoder(
{
return IVAS_ERR_WRONG_MODE;
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
- }
#endif
+ }
/*-----------------------------------------------------------------*
* Allocate and initialize SCE/CPE and other handles
@@ -883,11 +914,13 @@ ivas_error ivas_init_decoder(
st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */
st_ivas->nCPE = 0;
+ st_ivas->ism_extmeta_active = -1;
+ st_ivas->ism_extmeta_cnt = 0;
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- st_ivas->nchan_transport = 2;
- st_ivas->nSCE = 2;
+ st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE;
+ st_ivas->nSCE = MAX_PARAM_ISM_WAVE;
if ( ( error = ivas_param_ism_dec_open( st_ivas ) ) != IVAS_ERR_OK )
{
@@ -908,8 +941,12 @@ ivas_error ivas_init_decoder(
}
reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] );
+
+ st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1;
}
+ st_ivas->hISMDTX.sce_id_dtx = 0;
+
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2;
@@ -932,8 +969,10 @@ ivas_error ivas_init_decoder(
}
else if ( st_ivas->ivas_format == SBA_FORMAT )
{
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
{
+#endif
if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK )
{
return error;
@@ -947,7 +986,20 @@ ivas_error ivas_init_decoder(
}
}
- if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_dirac_sba_config(
+ st_ivas->hQMetaData,
+#ifndef SBA_MODE_CLEAN_UP
+ &st_ivas->nchan_transport,
+ &st_ivas->nSCE,
+ &st_ivas->nCPE,
+#endif
+ &st_ivas->element_mode_init,
+ ivas_total_brate,
+ st_ivas->sba_analysis_order,
+#ifndef SBA_MODE_CLEAN_UP
+ st_ivas->sba_mode,
+#endif
+ ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -959,10 +1011,12 @@ ivas_error ivas_init_decoder(
return error;
}
+#ifndef SBA_MODE_CLEAN_UP
for ( k = 0; k < DIRAC_MAX_NBANDS; k++ )
{
st_ivas->hSpar->dirac_to_spar_md_bands[k] = st_ivas->hDirAC->dirac_to_spar_md_bands[k];
}
+#endif
st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band;
}
else
@@ -970,11 +1024,19 @@ ivas_error ivas_init_decoder(
int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1];
st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
+ if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) )
+ {
+ st_ivas->hSpar->enc_param_start_band = 0;
+
+ set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands );
+ st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands;
+ }
ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 );
}
- st_ivas->sba_dirac_stereo_flag = ( output_config == AUDIO_CONFIG_STEREO );
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
+#ifndef SBA_MODE_CLEAN_UP
}
else /* SBA_MODE_DIRAC */
{
@@ -983,12 +1045,18 @@ ivas_error ivas_init_decoder(
return error;
}
- st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && output_config == AUDIO_CONFIG_STEREO );
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
}
+#endif
}
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM &&
+ st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format != SBA_FORMAT )
+#else
if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM &&
st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR )
+#endif
{
if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK )
{
@@ -1020,7 +1088,7 @@ ivas_error ivas_init_decoder(
}
/* create CPE element for DFT Stereo like upmix */
- if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nchan_transport == 1 )
+ if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 )
{
if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
{
@@ -1040,24 +1108,7 @@ ivas_error ivas_init_decoder(
}
/* set CNA/CNG flags */
- if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 )
- {
- st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */
- st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0;
- }
- else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) )
- {
- st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1;
- st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1;
- }
- else if ( st_ivas->nchan_transport == 2 )
- {
- for ( n = 0; n < CPE_CHANNELS; n++ )
- {
- st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */
- st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1;
- }
- }
+ ivas_sba_set_cna_cng_flag( st_ivas );
}
else if ( st_ivas->ivas_format == MC_FORMAT )
{
@@ -1096,6 +1147,46 @@ ivas_error ivas_init_decoder(
return error;
}
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ /* init EFAP for custom LS setup */
+ if ( output_config == AUDIO_CONFIG_LS_CUSTOM )
+ {
+ if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ st_ivas->nSCE = 0;
+ st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
+ st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
+
+ if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ st_ivas->element_mode_init = IVAS_CPE_MDCT;
+
+ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
+ {
+ if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] );
+ }
+ }
+
+ if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
/* init EFAP for custom LS setup */
@@ -1149,7 +1240,7 @@ ivas_error ivas_init_decoder(
return error;
}
- st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && output_config == AUDIO_CONFIG_STEREO );
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO )
{
@@ -1286,6 +1377,7 @@ ivas_error ivas_init_decoder(
}
else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
{
+
if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
@@ -1298,6 +1390,19 @@ ivas_error ivas_init_decoder(
return error;
}
}
+
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES );
+ n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif
}
else if ( st_ivas->renderer_type == RENDERER_MC )
{
@@ -1327,23 +1432,32 @@ ivas_error ivas_init_decoder(
}
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config,
st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config,
- st_ivas->hRenderConfig, st_ivas->hDecoderConfig->Opt_Headrotation, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
-#endif
{
return error;
}
st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns;
+
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES );
+ n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif
}
if ( st_ivas->ivas_format == ISM_FORMAT &&
st_ivas->ism_mode == ISM_MODE_DISC &&
( st_ivas->renderer_type == RENDERER_TD_PANNING ||
+ st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ||
st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ||
st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ||
st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ||
@@ -1359,7 +1473,7 @@ ivas_error ivas_init_decoder(
* LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay
*-----------------------------------------------------------------*/
- if ( st_ivas->mc_mode == MC_MODE_MCT )
+ if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
{
binauralization_delay_ns = st_ivas->binaural_latency_ns;
if ( st_ivas->hBinRenderer != NULL )
@@ -1380,13 +1494,6 @@ ivas_error ivas_init_decoder(
return error;
}
- /* reuse core-coder buffers for LFE decoder */
- cpe_id = LFE_CHANNEL / CPE_CHANNELS;
- n = LFE_CHANNEL % CPE_CHANNELS;
-
- st_ivas->hLFE->prevsynth_buf = &st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_synth_sw[0];
- st_ivas->hLFE->prior_out_buffer = &st_ivas->hCPE[cpe_id]->hCoreCoder[n]->previoussynth[0];
-
set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN );
set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k );
}
@@ -1422,7 +1529,11 @@ ivas_error ivas_init_decoder(
}
/* CLDFB Interpolation weights */
- if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag )
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 )
+#endif
{
ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig );
}
@@ -1436,6 +1547,32 @@ ivas_error ivas_init_decoder(
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to open limiter handle" );
}
+#ifdef JBM_TSM_ON_TCS
+ /*-----------------------------------------------------------------*
+ * Allocate and initialize JBM struct + buffer
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL )
+ {
+ /* no module has yet open the TC buffer, open a default one */
+ n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ if ( st_ivas->hTcBuffer == NULL )
+ {
+ /* we need the handle anyway, but without the buffer*/
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif
+
return error;
}
@@ -1542,7 +1679,7 @@ void destroy_core_dec(
hCoreCoder->hTcxDec = NULL;
}
- if ( hCoreCoder->hTcxCfg != NULL && hCoreCoder->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( hCoreCoder->hTcxCfg != NULL )
{
free( hCoreCoder->hTcxCfg );
hCoreCoder->hTcxCfg = NULL;
@@ -1632,6 +1769,7 @@ void ivas_initialize_handles_dec(
st_ivas->hMasa = NULL;
st_ivas->hQMetaData = NULL;
st_ivas->hMCT = NULL;
+ st_ivas->hMCParamUpmix = NULL;
st_ivas->hParamMC = NULL;
st_ivas->hLFE = NULL;
@@ -1660,6 +1798,10 @@ void ivas_initialize_handles_dec(
st_ivas->hCombinedOrientationData = NULL;
#endif
+#ifdef JBM_TSM_ON_TCS
+ st_ivas->hTcBuffer = NULL;
+#endif
+
return;
}
@@ -1737,6 +1879,9 @@ void ivas_destroy_dec(
/* ISM renderer handle */
if ( st_ivas->hIsmRendererData != NULL )
{
+#ifdef JBM_TSM_ON_TCS
+ free( st_ivas->hIsmRendererData->interpolator );
+#endif
free( st_ivas->hIsmRendererData );
st_ivas->hIsmRendererData = NULL;
}
@@ -1773,6 +1918,9 @@ void ivas_destroy_dec(
/* LFE handle */
ivas_lfe_dec_close( &( st_ivas->hLFE ) );
+ /* Param-Upmix MC handle */
+ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
+
/* Parametric MC handle */
ivas_param_mc_dec_close( &st_ivas->hParamMC );
@@ -1812,15 +1960,7 @@ void ivas_destroy_dec(
}
/* Head track data handle */
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_headTrack_close( &st_ivas->hHeadTrackData );
-#else
- if ( st_ivas->hHeadTrackData != NULL )
- {
- free( st_ivas->hHeadTrackData );
- st_ivas->hHeadTrackData = NULL;
- }
-#endif
#ifdef EXTERNAL_ORIENTATIONS
/* External orientation data handle */
@@ -1863,6 +2003,10 @@ void ivas_destroy_dec(
st_ivas->hDecoderConfig = NULL;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer );
+#endif
+
/* main IVAS handle */
free( st_ivas );
@@ -1871,7 +2015,7 @@ void ivas_destroy_dec(
/*-------------------------------------------------------------------*
- * ivas_init_dec_get_num_cldfb_analyses()
+ * ivas_init_dec_get_num_cldfb_instances()
*
* Return number of CLDFB analysis & synthesis instances
*-------------------------------------------------------------------*/
@@ -1906,6 +2050,7 @@ void ivas_init_dec_get_num_cldfb_instances(
*numCldfbAnalyses += 2;
}
break;
+ case RENDERER_NON_DIEGETIC_DOWNMIX:
case RENDERER_MONO_DOWNMIX:
if ( st_ivas->ivas_format == ISM_FORMAT )
{
@@ -1915,7 +2060,11 @@ void ivas_init_dec_get_num_cldfb_instances(
}
break;
case RENDERER_DIRAC:
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#else
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#endif
{
*numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans;
@@ -1932,7 +2081,11 @@ void ivas_init_dec_get_num_cldfb_instances(
*numCldfbSyntheses = MAX_OUTPUT_CHANNELS;
}
}
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format != SBA_FORMAT )
+#else
if ( st_ivas->sba_mode != SBA_MODE_SPAR )
+#endif
{
if ( st_ivas->nchan_transport > 2 && st_ivas->sba_planar )
{
@@ -1973,7 +2126,11 @@ void ivas_init_dec_get_num_cldfb_instances(
case RENDERER_BINAURAL_MIXER_CONV_ROOM:
case RENDERER_BINAURAL_FASTCONV:
case RENDERER_BINAURAL_FASTCONV_ROOM:
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#else
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#endif
{
if ( st_ivas->sba_dirac_stereo_flag )
{
@@ -2033,6 +2190,11 @@ void ivas_init_dec_get_num_cldfb_instances(
default:
assert( 0 && "Renderer not handled for CLDFB reservation." );
}
+ if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO )
+ {
+ *numCldfbAnalyses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses );
+ *numCldfbSyntheses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses );
+ }
return;
}
@@ -2067,6 +2229,12 @@ static ivas_error doSanityChecks_IVAS(
assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" );
assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" );
+ /* Verify output configuration compatible with non-diegetic panning */
+ if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && ( st_ivas->ivas_format != MONO_FORMAT ) && ( st_ivas->transport_config != AUDIO_CONFIG_ISM1 ) )
+ {
+ return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" );
+ }
+
/* Verify stereo output configuration */
if ( st_ivas->ivas_format == STEREO_FORMAT )
{
@@ -2126,7 +2294,7 @@ static ivas_error doSanityChecks_IVAS(
#endif
#ifdef DEBUGGING
- if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) )
+ if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) )
{
return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" );
}
diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c
index 51ea82bfe158df61f0d385f506bfbfc69019841b..fe98ca0dcb4fff6317395dc2ffc9701fd98d4b5a 100644
--- a/lib_dec/ivas_ism_dec.c
+++ b/lib_dec/ivas_ism_dec.c
@@ -32,6 +32,9 @@
#include
#include "options.h"
+#ifdef JBM_TSM_ON_TCS
+#include "prot.h"
+#endif
#include "ivas_prot.h"
#include "ivas_prot_rend.h"
#ifdef DEBUGGING
@@ -39,7 +42,6 @@
#endif
#include "wmc_auto.h"
-
/*-------------------------------------------------------------------------*
* ivas_ism_bitrate_switching()
*
@@ -49,20 +51,40 @@
static ivas_error ivas_ism_bitrate_switching(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
const int16_t nchan_transport_old, /* i : last number of transport channels */
- const ISM_MODE last_ism_mode, /* i : last ISM mode */
- const int16_t num_obj /* i : number of objects in the bitstream */
+ const ISM_MODE last_ism_mode /* i : last ISM mode */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples rendered */
+ int16_t *data /* o : rendered samples */
+#endif
)
{
ivas_error error;
int32_t element_brate_tmp[MAX_NUM_OBJECTS];
int16_t nSCE_old, nCPE_old;
+ int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode;
+#ifdef JBM_TSM_ON_TCS
+ TC_BUFFER_MODE tc_buffer_mode_new;
+ int16_t tc_nchan_tc_new;
+ int16_t tc_nchan_allocate_new;
+ int16_t tc_granularity_new;
+ AUDIO_CONFIG intern_config_old;
+ IVAS_OUTPUT_SETUP hIntSetupOld;
+ RENDERER_TYPE renderer_type_old;
+#endif
error = IVAS_ERR_OK;
nCPE_old = st_ivas->nCPE;
nSCE_old = st_ivas->nSCE;
- if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, num_obj, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
+ /* we have to temporarily set the ism mode back to the old one, otherwise this can give wrong results*/
+ ism_mode = st_ivas->ism_mode;
+ st_ivas->ism_mode = last_ism_mode;
+ ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
+ st_ivas->ism_mode = ism_mode;
+
+ if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -87,6 +109,14 @@ static ivas_error ivas_ism_bitrate_switching(
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ /* save old IntSetup, might be needed for JBM flushing...*/
+ intern_config_old = st_ivas->intern_config;
+ hIntSetupOld = st_ivas->hIntSetup;
+ tc_granularity_new = 1;
+ renderer_type_old = st_ivas->renderer_type;
+#endif
+
/*-----------------------------------------------------------------*
* Initialize the needed renderer struct and destroy the unnecessary renderer struct
*-----------------------------------------------------------------*/
@@ -99,6 +129,41 @@ static ivas_error ivas_ism_bitrate_switching(
ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config );
}
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ /* transfer subframe info from DirAC or ParamMC to central tc buffer */
+ if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) )
+ {
+ st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes;
+ st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered;
+ st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots;
+ st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered;
+ mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+
+ /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv
+ render what still fits in the new granularity */
+ tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs );
+
+ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity )
+ {
+ if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ /* JBM: when granularity goes up set samples to discard at the beginning of the frame */
+ else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity )
+ {
+ if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+#endif
+
if ( st_ivas->ism_mode != last_ism_mode )
{
/* EFAP handle */
@@ -121,16 +186,29 @@ static ivas_error ivas_ism_bitrate_switching(
ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin );
/* Open the TD Binaural renderer */
+#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR
+ if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL )
+ {
+ if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#else
if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
}
+#endif
}
else
{
/* close the ISM renderer and reinitialize */
if ( st_ivas->hIsmRendererData != NULL )
{
+#ifdef JBM_TSM_ON_TCS
+ free( st_ivas->hIsmRendererData->interpolator );
+#endif
free( st_ivas->hIsmRendererData );
st_ivas->hIsmRendererData = NULL;
}
@@ -151,9 +229,6 @@ static ivas_error ivas_ism_bitrate_switching(
st_ivas->intern_config,
st_ivas->hOutSetup.output_config,
st_ivas->hRenderConfig,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- st_ivas->hDecoderConfig->Opt_Headrotation,
-#endif
st_ivas->hSetOfHRTF,
st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
{
@@ -187,6 +262,20 @@ static ivas_error ivas_ism_bitrate_switching(
}
/* Close the TD Binaural renderer */
+#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR
+ if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE )
+ {
+ if ( st_ivas->hBinRendererTd != NULL )
+ {
+ ivas_td_binaural_close( &st_ivas->hBinRendererTd );
+ }
+
+ if ( st_ivas->hHrtfTD != NULL )
+ {
+ st_ivas->hHrtfTD = NULL;
+ }
+ }
+#else
if ( st_ivas->hBinRendererTd != NULL )
{
ivas_td_binaural_close( &st_ivas->hBinRendererTd );
@@ -196,12 +285,16 @@ static ivas_error ivas_ism_bitrate_switching(
{
st_ivas->hHrtfTD = NULL;
}
+#endif
}
else
{
/* Close the ISM renderer */
if ( st_ivas->hIsmRendererData != NULL )
{
+#ifdef JBM_TSM_ON_TCS
+ free( st_ivas->hIsmRendererData->interpolator );
+#endif
free( st_ivas->hIsmRendererData );
st_ivas->hIsmRendererData = NULL;
}
@@ -225,6 +318,65 @@ static ivas_error ivas_ism_bitrate_switching(
}
}
+ /*-----------------------------------------------------------------*
+ * CLDFB instances
+ *-----------------------------------------------------------------*/
+
+ if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+#ifdef JBM_TSM_ON_TCS
+ /*-----------------------------------------------------------------*
+ * Reconfigure TC buffer
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDecoderConfig->voip_active == 1 )
+ {
+ int16_t tc_nchan_full_new;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+
+ hTcBuffer = st_ivas->hTcBuffer;
+ tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
+ tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+ tc_nchan_allocate_new = tc_nchan_tc_new;
+ tc_nchan_full_new = tc_nchan_tc_new;
+
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS;
+ tc_nchan_full_new = tc_nchan_allocate_new;
+ }
+
+ if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+ {
+ tc_nchan_full_new = 0;
+ }
+
+ /* reconfigure buffer */
+ if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new ||
+ hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new )
+ {
+ if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */
+ if ( st_ivas->hDirAC != NULL )
+ {
+ st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
+ st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
+ st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots;
+ st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
+
+ mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ }
+#endif
+
return error;
}
@@ -237,12 +389,17 @@ static ivas_error ivas_ism_bitrate_switching(
*-------------------------------------------------------------------------*/
ivas_error ivas_ism_dec_config(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- const int16_t num_obj /* i : number of objects in the bitstream */
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+ ,
+ const ISM_MODE last_ism_mode /* i/o: last ISM mode */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */
+ int16_t *data
+#endif
)
{
int32_t ivas_total_brate;
- ISM_MODE last_ism_mode;
ivas_error error;
int16_t nchan_transport_old;
@@ -250,11 +407,9 @@ ivas_error ivas_ism_dec_config(
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
- /* store last frame ISM mode */
- last_ism_mode = st_ivas->ism_mode;
/* Assumes that num of input objects are constant */
- nchan_transport_old = num_obj;
+ nchan_transport_old = st_ivas->nchan_ism;
if ( last_ism_mode == ISM_MODE_PARAM )
{
@@ -264,43 +419,63 @@ ivas_error ivas_ism_dec_config(
if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_5k2 && ivas_total_brate != FRAME_NO_DATA )
{
/* select ISM format mode */
- st_ivas->ism_mode = ivas_ism_mode_select( num_obj, ivas_total_brate );
+ st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->nchan_ism, ivas_total_brate );
- st_ivas->nchan_transport = num_obj;
+ st_ivas->nchan_transport = st_ivas->nchan_ism;
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- st_ivas->nchan_transport = 2;
+ st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE;
if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
{
- st_ivas->hDecoderConfig->nchan_out = num_obj;
+ st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism;
}
}
if ( st_ivas->ini_active_frame != 0 )
{
/* ISM bit-rate switching */
- if ( st_ivas->hDecoderConfig->last_ivas_total_brate != IVAS_SID_5k2 && st_ivas->hDecoderConfig->last_ivas_total_brate != FRAME_NO_DATA )
{
if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) )
{
- ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj );
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK )
+#endif
+ {
+ return error;
+ }
}
}
}
}
else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 )
{
- if ( last_ism_mode == ISM_MODE_PARAM )
+ st_ivas->nchan_transport = st_ivas->nchan_ism;
+ if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- nchan_transport_old = MAX_PARAM_ISM_WAVE;
+ st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE;
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
+ {
+ st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism;
+ }
}
- else
+
+ /* ISM mode switching */
+ if ( st_ivas->ism_mode != last_ism_mode )
{
- st_ivas->nchan_transport = num_obj;
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK )
+#endif
+ {
+ return error;
+ }
}
}
- switch ( num_obj )
+ switch ( st_ivas->nchan_ism )
{
case 1:
st_ivas->transport_config = AUDIO_CONFIG_ISM1;
diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c
index b9d00792df2fca472c46ed04235568b6327aa8a6..054603a15ea3c27ae68f0828c0f800aec1e29b57 100644
--- a/lib_dec/ivas_ism_dtx_dec.c
+++ b/lib_dec/ivas_ism_dtx_dec.c
@@ -40,51 +40,6 @@
#include "wmc_auto.h"
-/*-------------------------------------------------------------------*
- * ivas_ism_preprocessing()
- *
- *
- *-------------------------------------------------------------------*/
-
-static void ivas_ism_preprocessing(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
- const int16_t sce_id /* i : SCE # identifier */
-)
-{
- int32_t ivas_total_brate;
- SCE_DEC_HANDLE hSCE;
- Decoder_State *st;
-
- hSCE = st_ivas->hSCE[sce_id];
- st = hSCE->hCoreCoder[0];
-
- ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
-
- if ( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
- {
- /* reset the bitstream to atleast read the cng type and bandwidth for non transmitted SCE */
- st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream;
-
- if ( sce_id == st_ivas->hISMDTX.sce_id_dtx )
- {
- st->read_sid_info = 1; /* read the sid info from bitstream */
- }
- else
- {
- st->read_sid_info = 0; /* do not read the sid info from bitstream but use the estimated noise */
- }
-
- st->cng_paramISM_flag = 1;
- }
- else
- {
- st->cng_paramISM_flag = 0;
- }
-
- return;
-}
-
-
/*-------------------------------------------------------------------*
* ivas_ism_dtx_dec()
*
@@ -96,74 +51,110 @@ ivas_error ivas_ism_dtx_dec(
int16_t *nb_bits_metadata /* o : number of metadata bits */
)
{
- int16_t ch, pos, num_obj, num_obj_prev;
+ int16_t ch, pos, nchan_ism, nchan_ism_prev;
int32_t ivas_total_brate;
+ int16_t md_diff_flag[MAX_NUM_OBJECTS];
+ int16_t idx, flag_noisy_speech, sce_id_dtx;
+ ISM_MODE last_ism_mode, ism_mode_bstr;
+ ivas_error error;
+ Decoder_State *st;
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
- if ( st_ivas->nchan_transport == 1 )
- {
- nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
-
- return IVAS_ERR_OK;
- }
- if ( st_ivas->ism_mode == ISM_MODE_PARAM )
- {
- num_obj_prev = st_ivas->hDirAC->hParamIsm->num_obj;
- }
- else /* ism_mode == ISM_MODE_DISC */
- {
- num_obj_prev = st_ivas->nchan_transport;
- }
+ nchan_ism_prev = st_ivas->nchan_ism;
- /* read number of objects */
if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 )
{
- num_obj = 1;
+ /* read number of objects */
+ nchan_ism = 1;
pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
- while ( get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ) == 1 && num_obj < MAX_NUM_OBJECTS )
+ while ( get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 ) == 1 && nchan_ism < MAX_NUM_OBJECTS )
{
- ( num_obj )++;
+ ( nchan_ism )++;
pos--;
}
+ st_ivas->nchan_ism = nchan_ism;
+ pos--;
- if ( num_obj != num_obj_prev )
+ if ( nchan_ism != nchan_ism_prev )
{
- /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" );
}
- ivas_ism_dec_config( st_ivas, num_obj );
+ last_ism_mode = st_ivas->ism_mode;
- if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ /* read ism_mode */
+ if ( nchan_ism > 2 )
{
- st_ivas->hDirAC->hParamIsm->num_obj = num_obj;
+ pos -= nchan_ism; /* SID metadata flags */
+
+ idx = get_indice( st_ivas->hSCE[0]->hCoreCoder[0], pos, 1 );
+ ism_mode_bstr = (ISM_MODE) ( idx + 1 );
+ st_ivas->ism_mode = ism_mode_bstr;
}
- else /* ism_mode == ISM_MODE_DISC */
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK )
+#endif
{
- st_ivas->nchan_transport = num_obj;
+ return error;
}
}
else
{
- num_obj = num_obj_prev;
+ nchan_ism = nchan_ism_prev;
}
/* Metadata decoding and dequantization */
- ivas_param_ism_metadata_dtx_dec( st_ivas );
+ ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode,
+ &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata );
- for ( ch = 0; ch < st_ivas->nchan_transport; ch++ )
+ if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi )
{
- nb_bits_metadata[ch] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
+ if ( st_ivas->hDirAC != NULL )
+ {
+ st_ivas->hDirAC->hParamIsm->flag_noisy_speech = flag_noisy_speech;
+ }
+
+ st_ivas->hISMDTX.sce_id_dtx = sce_id_dtx;
}
+ set_s( md_diff_flag, 1, nchan_ism );
+
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ {
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ st_ivas->hDirAC->azimuth_values[ch] = st_ivas->hIsmMetaData[ch]->azimuth;
+ st_ivas->hDirAC->elevation_values[ch] = st_ivas->hIsmMetaData[ch]->elevation;
+ }
+ }
+
+ update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag );
+
+ st_ivas->hISMDTX.ism_dtx_hangover_cnt = 0;
+
+ if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi )
+ {
+ for ( ch = 0; ch < st_ivas->nchan_transport; ch++ )
+ {
+ nb_bits_metadata[ch] = nb_bits_metadata[sce_id_dtx];
+ }
+ }
+
+ if ( !st_ivas->bfi )
{
for ( ch = 0; ch < st_ivas->nchan_transport; ch++ )
{
- ivas_ism_preprocessing( st_ivas, ch );
+ st = st_ivas->hSCE[ch]->hCoreCoder[0];
+ st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream;
+ st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */
+ st->cng_ism_flag = 1;
+ st->L_frame = min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */
}
}
diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c
index 8c54602e9f7b022b080b7a5a73cf97108b89212e..a39c496ab6e3e0f4f7bd1d131a8ebdb559673073 100644
--- a/lib_dec/ivas_ism_metadata_dec.c
+++ b/lib_dec/ivas_ism_metadata_dec.c
@@ -37,21 +37,99 @@
#include "ivas_rom_com.h"
#include "prot.h"
#include "ivas_stat_enc.h"
+#include
#ifdef DEBUGGING
#include "debug.h"
#endif
#include "wmc_auto.h"
-#ifdef TD5
/*-----------------------------------------------------------------------*
* Local functions
*-----------------------------------------------------------------------*/
-static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, int16_t *flag_abs_azimuth );
+static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth );
+
static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius );
-#endif
+
+/*-------------------------------------------------------------------------*
+ * Local constants
+ *-------------------------------------------------------------------------*/
+
+#define IVAS_ISM_DTX_HO_MAX 5
+
+#define CNG_MD_MAX_DIFF_AZIMUTH 5
+#define CNG_MD_MAX_DIFF_ELEVATION 5
+
+
+/*-------------------------------------------------------------------*
+ * ism_metadata_smooth()
+ *
+ * Smooth the metadata evolution
+ *-------------------------------------------------------------------*/
+
+static void ism_metadata_smooth(
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int32_t ism_total_brate, /* i : ISms total bitrate */
+ const int16_t nchan_ism /* i : number of objects */
+)
+{
+ ISM_METADATA_HANDLE hIsmMetaData;
+ int16_t ch;
+ float diff;
+
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ hIsmMetaData = hIsmMeta[ch];
+
+ /* smooth azimuth */
+ diff = hIsmMetaData->last_true_azimuth - hIsmMetaData->last_azimuth;
+
+ if ( diff > ISM_AZIMUTH_MAX )
+ {
+ diff -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN );
+ hIsmMetaData->last_azimuth += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN );
+ }
+ else if ( diff < ISM_AZIMUTH_MIN )
+ {
+ diff += ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN );
+ }
+
+ if ( ism_total_brate > IVAS_SID_5k2 && fabsf( diff ) > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_AZIMUTH )
+ {
+ /* skip the smoothing */
+ }
+ else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_AZIMUTH )
+ {
+ hIsmMetaData->azimuth = hIsmMetaData->last_azimuth + sign( diff ) * CNG_MD_MAX_DIFF_AZIMUTH;
+ }
+ else if ( diff != 0 )
+ {
+ hIsmMetaData->azimuth = hIsmMetaData->last_true_azimuth;
+ }
+
+ if ( hIsmMetaData->azimuth > ISM_AZIMUTH_MAX )
+ {
+ hIsmMetaData->azimuth -= ( ISM_AZIMUTH_MAX - ISM_AZIMUTH_MIN );
+ }
+
+ /* smooth elevation */
+ diff = hIsmMetaData->last_true_elevation - hIsmMetaData->last_elevation;
+
+ if ( ism_total_brate > IVAS_SID_5k2 && diff > IVAS_ISM_DTX_HO_MAX * CNG_MD_MAX_DIFF_ELEVATION )
+ {
+ /* skip the smoothing */
+ }
+ else if ( fabsf( diff ) > CNG_MD_MAX_DIFF_ELEVATION )
+ {
+ hIsmMetaData->elevation = hIsmMetaData->last_elevation + sign( diff ) * CNG_MD_MAX_DIFF_ELEVATION;
+ }
+ }
+
+ return;
+}
+
/*-------------------------------------------------------------------------*
* ivas_ism_metadata_dec()
@@ -60,69 +138,44 @@ static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int
*-------------------------------------------------------------------------*/
ivas_error ivas_ism_metadata_dec(
- const int32_t ism_total_brate, /* i : ISM total bitrate */
- int16_t *nchan_transport, /* o : number of transport channels */
- ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
- SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */
- const int16_t bfi, /* i : bfi flag */
- int16_t nb_bits_metadata[], /* o : number of metadata bits */
- ISM_MODE ism_mode, /* i : ISM mode */
- const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */
+ const int32_t ism_total_brate, /* i : ISM total bitrate */
+ const int16_t nchan_ism, /* i : number of ISM channels */
+ int16_t *nchan_transport, /* o : number of transport channels */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */
+ const int16_t bfi, /* i : bfi flag */
+ int16_t nb_bits_metadata[], /* o : number of metadata bits */
+ ISM_MODE ism_mode, /* i : ISM mode */
+ ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */
+ const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */
+ int16_t *ism_extmeta_active, /* i/o: Extended metadata active in renderer*/
+ int16_t *ism_extmeta_cnt /* i/o: Number of change frames observed*/
)
{
-#ifdef TD5
int16_t ch, nb_bits_start = 0, last_bit_pos;
int16_t idx_radius;
-#else
- int16_t ch, nb_bits_start = 0, last_bit_pos, sgn, diff;
-#endif
int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS];
DEC_CORE_HANDLE st0;
-#ifdef TD5
- int16_t ism_extended_metadata_flag;
+ int16_t ism_extmeta_bitstream;
+ int16_t non_diegetic_flag_global;
+ float yaw, pitch, radius;
int16_t flag_abs_radius;
int16_t flag_abs_orientation;
- int16_t idx_azimuth, flag_abs_azimuth;
- int16_t idx_elevation;
-#else
- int16_t idx_azimuth, nbits_diff_azimuth, flag_abs_azimuth;
- int16_t idx_elevation, nbits_diff_elevation;
-#endif
+ int16_t flag_abs_position;
+ int16_t idx_angle1;
+ int16_t idx_angle2;
int16_t next_bit_pos_orig;
uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig;
ISM_METADATA_HANDLE hIsmMetaData;
int16_t nchan_transport_prev, ism_metadata_flag_global;
int16_t localVAD[MAX_NUM_OBJECTS];
int16_t ism_imp[MAX_NUM_OBJECTS];
- int16_t num_obj = 0, nbands, nblocks;
+ int16_t nbands, nblocks;
+ int16_t md_diff_flag[MAX_NUM_OBJECTS];
ivas_error error;
- error = IVAS_ERR_OK;
-
push_wmops( "ism_meta_dec" );
- if ( ism_total_brate == IVAS_SID_5k2 || ism_total_brate == FRAME_NO_DATA )
- {
- /* no metadata decoding in CNG */
- for ( ch = 0; ch < *nchan_transport; ch++ )
- {
- hIsmMeta[ch]->ism_metadata_flag = 0;
- }
-
- /* set padding bits as metadata bits to keep later bitrate checks valid */
- nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
-
-#ifdef DEBUGGING
- /* sanity check */
- if ( *nchan_transport != 1 )
- {
- return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\n!!! Error: SID/CNG frame not expect for decoding more than 1 object. Exiting.\n\n" );
- }
-#endif
-
- pop_wmops();
- return error;
- }
/* initialization */
st0 = hSCE[0]->hCoreCoder[0];
@@ -133,9 +186,8 @@ ivas_error ivas_ism_metadata_dec(
bstr_orig = st0->bit_stream;
next_bit_pos_orig = st0->next_bit_pos;
st0->next_bit_pos = 0;
-#ifdef TD5
- ism_extended_metadata_flag = 0;
-#endif
+ ism_extmeta_bitstream = 0;
+ non_diegetic_flag_global = 0;
/* reverse the bitstream for easier reading of indices */
for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ )
@@ -151,37 +203,51 @@ ivas_error ivas_ism_metadata_dec(
* Read ISM common signaling
*----------------------------------------------------------------*/
- /* read number of objects */
- num_obj = 1;
- while ( get_next_indice( st0, 1 ) == 1 && num_obj < MAX_NUM_OBJECTS )
- {
- ( num_obj )++;
- }
+ /* number of objects was read in ivas_dec_setup() */
+ st0->next_bit_pos += nchan_ism;
- ism_mode = ivas_ism_mode_select( num_obj, ism_total_brate );
+ ism_mode = ivas_ism_mode_select( nchan_ism, ism_total_brate );
if ( ism_mode == ISM_MODE_PARAM )
{
- hParamIsm->num_obj = num_obj;
+ *nchan_transport = MAX_PARAM_ISM_WAVE;
}
else if ( ism_mode == ISM_MODE_DISC )
{
- *nchan_transport = num_obj;
+ *nchan_transport = nchan_ism;
}
if ( *nchan_transport != nchan_transport_prev )
{
- /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" );
}
-#ifdef TD5
/* read extended metadata presence flag */
if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
{
- ism_extended_metadata_flag = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
+ ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
+
+ /* read global non-diegetic object flag */
+ if ( ism_extmeta_bitstream )
+ {
+ non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
+ }
+ }
+ /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */
+ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */
+ {
+ *ism_extmeta_active = ism_extmeta_bitstream;
+ *ism_extmeta_cnt = 0;
+ }
+ else
+ {
+ ( *ism_extmeta_cnt )++;
+ if ( *ism_extmeta_cnt == ISM_METADATA_RS_MAX_FRAMES ) /* ISM_METADATA_RS_MAX_FRAMES change frames observed - update state */
+ {
+ *ism_extmeta_active = ism_extmeta_bitstream;
+ *ism_extmeta_cnt = 0;
+ }
}
-#endif
/* Read ISM present flags (one per object) */
for ( ch = 0; ch < *nchan_transport; ch++ )
@@ -200,7 +266,7 @@ ivas_error ivas_ism_metadata_dec(
ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
}
- for ( ; ch < num_obj; ch++ )
+ for ( ; ch < nchan_ism; ch++ )
{
hIsmMeta[ch]->ism_metadata_flag = 1;
ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
@@ -233,208 +299,94 @@ ivas_error ivas_ism_metadata_dec(
nb_bits_start = st0->next_bit_pos;
}
- for ( ch = 0; ch < num_obj; ch++ )
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
hIsmMetaData = hIsmMeta[ch];
if ( ism_mode == ISM_MODE_DISC )
{
nb_bits_start = st0->next_bit_pos;
}
-
- flag_abs_azimuth = 0;
-#ifdef TD5
+ flag_abs_position = 0;
flag_abs_orientation = 0;
flag_abs_radius = 0;
-#endif
if ( hIsmMeta[ch]->ism_metadata_flag )
{
-#ifdef TD5
- decode_angle_indices( st0, &( hIsmMetaData->angle[0] ), &flag_abs_azimuth );
- idx_azimuth = hIsmMetaData->angle[0].last_azimuth_idx;
- idx_elevation = hIsmMetaData->angle[0].last_elevation_idx;
-
- /* Azimuth/Elevation dequantization */
- if ( ism_mode == ISM_MODE_PARAM )
- {
- hParamIsm->azi_index[ch] = idx_azimuth;
- hParamIsm->ele_index[ch] = idx_elevation;
- }
- else /* ISM_MODE_DISC */
- {
- hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
-
- /* radius/raw/pitch dequantization */
- if ( ism_extended_metadata_flag )
- {
- decode_angle_indices( st0, &( hIsmMetaData->angle[1] ), &flag_abs_orientation );
- idx_azimuth = hIsmMetaData->angle[1].last_azimuth_idx;
- idx_elevation = hIsmMetaData->angle[1].last_elevation_idx;
-
- hIsmMetaData->yaw = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- hIsmMetaData->pitch = ism_dequant_meta( idx_elevation, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
-
- idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius );
- hIsmMetaData->radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA );
- }
- else
- {
- hIsmMetaData->radius = 1.0f;
- }
- }
-#else
- /*----------------------------------------------------------------*
- * Azimuth decoding and dequantization
- *----------------------------------------------------------------*/
-
- /* Decode azimuth index */
- if ( get_next_indice( st0, 1 ) == 1 ) /* azimuth_abs_flag */
+ if ( non_diegetic_flag_global )
{
- idx_azimuth = get_next_indice( st0, ISM_AZIMUTH_NBITS );
- flag_abs_azimuth = 1;
+ /* read non-diegetic flag for each object */
+ hIsmMetaData->non_diegetic_flag = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
}
else
{
- diff = 0;
- sgn = 1;
-
- if ( get_next_indice( st0, 1 ) == 0 )
- {
- nbits_diff_azimuth = 1;
- }
- else
- {
- nbits_diff_azimuth = 1;
-
- if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */
- {
- sgn = -1;
- }
-
- nbits_diff_azimuth++;
-
- /* read until the stop bit */
- while ( ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) )
- {
- diff++;
- nbits_diff_azimuth++;
- }
-
- if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 )
- {
- /* count stop bit */
- nbits_diff_azimuth++;
- }
- }
-
- idx_azimuth = hIsmMetaData->last_azimuth_idx + sgn * diff;
+ hIsmMetaData->non_diegetic_flag = 0;
}
- /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */
- if ( idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
- {
- idx_azimuth -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */
- }
- else if ( idx_azimuth < 0 )
+ if ( hIsmMetaData->non_diegetic_flag )
{
- idx_azimuth += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */
- }
-
- /* +180° == -180° */
- if ( idx_azimuth == ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
- {
- idx_azimuth = 0;
- }
-
- /* sanity check in case of FER or BER */
- if ( idx_azimuth < 0 || idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
- {
- idx_azimuth = hIsmMetaData->last_azimuth_idx;
- }
-
- /* Azimuth dequantization */
- if ( ism_mode == ISM_MODE_PARAM )
- {
- hParamIsm->azi_index[ch] = idx_azimuth;
- }
- else /* ISM_MODE_DISC */
- {
- hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- }
-
- /*----------------------------------------------------------------*
- * Elevation decoding and dequantization
- *----------------------------------------------------------------*/
-
- /* Decode elevation index */
- if ( flag_abs_azimuth == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */
- {
- idx_elevation = get_next_indice( st0, ISM_ELEVATION_NBITS );
+ /* Panning gain decoding */
+ decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position );
+ idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx;
+ idx_angle2 = 1 << ( ISM_ELEVATION_NBITS - 1 );
+
+ /* Panning gain dequantization */
+ hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ hIsmMetaData->elevation = 0.0f;
+
+ /* save for smoothing metadata evolution */
+ hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth;
+ hIsmMetaData->last_true_elevation = hIsmMetaData->elevation;
}
else
{
- diff = 0;
- sgn = 1;
+ decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position );
+ idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx;
+ idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx;
- if ( get_next_indice( st0, 1 ) == 0 )
+ /* Azimuth/Elevation dequantization */
+ if ( ism_mode == ISM_MODE_PARAM )
{
- nbits_diff_elevation = 1;
+ hParamIsm->azi_index[ch] = idx_angle1;
+ hParamIsm->ele_index[ch] = idx_angle2;
}
- else
+ else /* ISM_MODE_DISC */
{
- nbits_diff_elevation = 1;
+ hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ hIsmMetaData->elevation = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
- if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */
+ /* radius/raw/pitch dequantization */
+ if ( ism_extmeta_bitstream )
{
- sgn = -1;
+ decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation );
+ idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx;
+ idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx;
+ yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
+
+ idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius );
+ radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA );
+ if ( *ism_extmeta_active == 1 )
+ {
+ hIsmMetaData->yaw = yaw;
+ hIsmMetaData->pitch = pitch;
+ hIsmMetaData->radius = radius;
+ }
}
-
- nbits_diff_elevation++;
-
- /* read until the stop bit */
- while ( ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) )
+ else
{
- diff++;
- nbits_diff_elevation++;
- }
-
- if ( nbits_diff_elevation < ISM_ELEVATION_NBITS )
- {
- /* count stop bit */
- nbits_diff_elevation++;
+ if ( *ism_extmeta_active == 0 )
+ {
+ hIsmMetaData->yaw = 0.0f;
+ hIsmMetaData->pitch = 0.0f;
+ hIsmMetaData->radius = 1.0f;
+ }
}
}
-
- idx_elevation = hIsmMetaData->last_elevation_idx + sgn * diff;
- }
-
- /* sanity check in case of FER or BER */
- if ( idx_elevation < 0 || idx_elevation > ( 1 << ISM_ELEVATION_NBITS ) - 1 )
- {
- idx_elevation = hIsmMetaData->last_elevation_idx;
+ /* save for smoothing metadata evolution */
+ hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth;
+ hIsmMetaData->last_true_elevation = hIsmMetaData->elevation;
}
-
- /* Elevation dequantization */
- if ( ism_mode == ISM_MODE_PARAM )
- {
- hParamIsm->ele_index[ch] = idx_elevation;
- }
- else /* ISM_MODE_DISC */
- {
- hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
- }
-
- /*----------------------------------------------------------------*
- * Final updates
- *----------------------------------------------------------------*/
-
- /* updates */
- hIsmMetaData->last_azimuth_idx = idx_azimuth;
- hIsmMetaData->last_elevation_idx = idx_elevation;
-#endif
}
-
/* save number of metadata bits read */
if ( ism_mode == ISM_MODE_DISC )
{
@@ -495,26 +447,7 @@ ivas_error ivas_ism_metadata_dec(
}
else /* BFI */
{
-#ifdef FIX_380_BFI_PARAMISM
- /* "num_obj", "hIsmMeta->azimuth" and "hIsmMeta->elevation" are recycled from the last frame */
- if ( ism_mode == ISM_MODE_PARAM )
- {
- num_obj = hParamIsm->num_obj;
- }
- else if ( ism_mode == ISM_MODE_DISC )
- {
- num_obj = *nchan_transport;
- }
-
- for ( ch = 0; ch < num_obj; ch++ )
-#else
- /* "*nISms", "hIsmMeta->azimuth" and "hIsmMeta->elevation" are recycled from the last frame */
- for ( ch = 0; ch < *nchan_transport; ch++ )
- {
- hIsmMeta[ch]->ism_metadata_flag = hIsmMeta[ch]->last_ism_metadata_flag;
- }
- for ( ; ch < num_obj; ch++ )
-#endif
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag;
}
@@ -523,37 +456,29 @@ ivas_error ivas_ism_metadata_dec(
if ( ism_mode == ISM_MODE_PARAM )
{
- for ( ch = 0; ch < num_obj; ch++ )
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
-#ifdef FIX_380_BFI_PARAMISM
- hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch];
- hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch];
-#else
hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch];
- /*hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] % hParamIsm->az_alpha[ch];*/
- hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch];
hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch];
- /*hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] % hParamIsm->ele_alpha;*/
- hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch];
-#endif
-#ifdef TD5
- hIsmMeta[ch]->angle[0].last_azimuth_idx = hParamIsm->azi_index[ch];
- hIsmMeta[ch]->angle[0].last_elevation_idx = hParamIsm->ele_index[ch];
-#else
- hIsmMeta[ch]->last_azimuth_idx = hParamIsm->azi_index[ch];
- hIsmMeta[ch]->last_elevation_idx = hParamIsm->ele_index[ch];
-#endif
+ hIsmMeta[ch]->position_angle.last_angle1_idx = hParamIsm->azi_index[ch];
+ hIsmMeta[ch]->position_angle.last_angle2_idx = hParamIsm->ele_index[ch];
}
}
}
+ if ( hISMDTX.ism_dtx_hangover_cnt < IVAS_ISM_DTX_HO_MAX )
+ {
+ ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism );
+ hISMDTX.ism_dtx_hangover_cnt += 1;
+ }
+
/*----------------------------------------------------------------*
* Configuration and decision about bitrates per channel
*----------------------------------------------------------------*/
if ( !bfi )
{
- if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, num_obj, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -562,9 +487,9 @@ ivas_error ivas_ism_metadata_dec(
{
hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag;
+ hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
if ( ism_mode == ISM_MODE_DISC )
{
- hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global )
{
hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1;
@@ -575,7 +500,7 @@ ivas_error ivas_ism_metadata_dec(
hSCE[ch]->hCoreCoder[0]->total_brate = total_brate[ch];
}
- for ( ; ch < num_obj; ch++ )
+ for ( ; ch < nchan_ism; ch++ )
{
hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag;
}
@@ -589,6 +514,10 @@ ivas_error ivas_ism_metadata_dec(
}
}
+ /*----------------------------------------------------------------*
+ * Set bitsream pointers
+ *----------------------------------------------------------------*/
+
/* set the bitstream pointer to its original position */
st0->bit_stream = bstr_orig;
st0->next_bit_pos = next_bit_pos_orig;
@@ -599,14 +528,22 @@ ivas_error ivas_ism_metadata_dec(
hSCE[ch]->hCoreCoder[0]->bit_stream = hSCE[ch - 1]->hCoreCoder[0]->bit_stream + ( hSCE[ch - 1]->hCoreCoder[0]->total_brate / FRAMES_PER_SEC );
}
+ /*----------------------------------------------------------------*
+ * Updates
+ *----------------------------------------------------------------*/
+
+ set_s( md_diff_flag, 1, nchan_ism );
+
+ update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag );
+
for ( ch = 0; ch < *nchan_transport; ch++ )
{
- hSCE[ch]->hCoreCoder[0]->cng_paramISM_flag = 0;
+ hSCE[ch]->hCoreCoder[0]->cng_ism_flag = 0;
}
pop_wmops();
- return error;
+ return IVAS_ERR_OK;
}
@@ -634,30 +571,29 @@ ivas_error ivas_ism_metadata_dec_create(
}
st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0;
-#ifdef TD5
- st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 );
- st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 );
+ st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0;
+ st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 );
+ st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0;
+ st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 );
st_ivas->hIsmMetaData[ch]->last_radius_idx = 8; /* Init to radius 1.0 */
-#else
- st_ivas->hIsmMetaData[ch]->last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 );
-#endif
+
+ st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0;
+ st_ivas->hIsmMetaData[ch]->last_true_elevation = 0;
ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] );
}
- if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
{
return error;
}
+ st_ivas->hISMDTX.ism_dtx_hangover_cnt = IVAS_ISM_DTX_HO_MAX;
+
return IVAS_ERR_OK;
}
-#ifdef TD5
/*-------------------------------------------------------------------------
* decode_angle_indices()
*
@@ -667,21 +603,22 @@ ivas_error ivas_ism_metadata_dec_create(
static void decode_angle_indices(
DEC_CORE_HANDLE st0, /* i/o: bitstream handle */
ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */
- int16_t *flag_abs_azimuth /* o : Azimuth encoding mode */
+ const int16_t non_diegetic_flag, /* i : Non diegetic flag */
+ int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */
)
{
- int16_t idx_azimuth, nbits_diff_azimuth, diff, sgn;
- int16_t idx_elevation, nbits_diff_elevation;
+ int16_t idx_angle1, nbits_diff_angle1, diff, sgn;
+ int16_t idx_angle2, nbits_diff_angle2;
/*----------------------------------------------------------------*
- * Azimuth decoding and dequantization
+ * Azimuth/yaw decoding and dequantization
*----------------------------------------------------------------*/
- /* Decode azimuth index */
+ /* Decode azimuth/yaw index */
if ( get_next_indice( st0, 1 ) == 1 ) /* azimuth_abs_flag */
{
- idx_azimuth = get_next_indice( st0, ISM_AZIMUTH_NBITS );
- *flag_abs_azimuth = 1;
+ idx_angle1 = get_next_indice( st0, ISM_AZIMUTH_NBITS );
+ *flag_abs_angle1 = 1;
}
else
{
@@ -690,115 +627,122 @@ static void decode_angle_indices(
if ( get_next_indice( st0, 1 ) == 0 )
{
- nbits_diff_azimuth = 1;
+ nbits_diff_angle1 = 1;
}
else
{
- nbits_diff_azimuth = 1;
+ nbits_diff_angle1 = 1;
if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */
{
sgn = -1;
}
- nbits_diff_azimuth++;
+ nbits_diff_angle1++;
/* read until the stop bit */
- while ( ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) )
+ while ( ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) )
{
diff++;
- nbits_diff_azimuth++;
+ nbits_diff_angle1++;
}
- if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 )
+ if ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 )
{
/* count stop bit */
- nbits_diff_azimuth++;
+ nbits_diff_angle1++;
}
}
- idx_azimuth = angle->last_azimuth_idx + sgn * diff;
+ idx_angle1 = angle->last_angle1_idx + sgn * diff;
}
- /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */
- if ( idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
+ /* azimuth/yaw is on a circle - check for diff coding for -180° -> 180° and vice versa changes */
+ if ( idx_angle1 > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
{
- idx_azimuth -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */
+ idx_angle1 -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */
}
- else if ( idx_azimuth < 0 )
+ else if ( idx_angle1 < 0 )
{
- idx_azimuth += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */
+ idx_angle1 += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */
}
/* +180° == -180° */
- if ( idx_azimuth == ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
+ if ( idx_angle1 == ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
{
- idx_azimuth = 0;
+ idx_angle1 = 0;
}
/* sanity check in case of FER or BER */
- if ( idx_azimuth < 0 || idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
+ if ( idx_angle1 < 0 || idx_angle1 > ( 1 << ISM_AZIMUTH_NBITS ) - 1 )
{
- idx_azimuth = angle->last_azimuth_idx;
+ idx_angle1 = angle->last_angle1_idx;
}
/*----------------------------------------------------------------*
- * Elevation decoding and dequantization
+ * Elevation/pitch decoding and dequantization
*----------------------------------------------------------------*/
- /* Decode elevation index */
- if ( *flag_abs_azimuth == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */
+ if ( non_diegetic_flag == 0 )
{
- idx_elevation = get_next_indice( st0, ISM_ELEVATION_NBITS );
- }
- else
- {
- diff = 0;
- sgn = 1;
-
- if ( get_next_indice( st0, 1 ) == 0 )
+ /* Decode elevation/pitch index */
+ if ( *flag_abs_angle1 == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */
{
- nbits_diff_elevation = 1;
+ idx_angle2 = get_next_indice( st0, ISM_ELEVATION_NBITS );
}
else
{
- nbits_diff_elevation = 1;
+ diff = 0;
+ sgn = 1;
- if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */
+ if ( get_next_indice( st0, 1 ) == 0 )
{
- sgn = -1;
+ nbits_diff_angle2 = 1;
}
+ else
+ {
+ nbits_diff_angle2 = 1;
- nbits_diff_elevation++;
+ if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */
+ {
+ sgn = -1;
+ }
- /* read until the stop bit */
- while ( ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) )
- {
- diff++;
- nbits_diff_elevation++;
- }
+ nbits_diff_angle2++;
- if ( nbits_diff_elevation < ISM_ELEVATION_NBITS )
- {
- /* count stop bit */
- nbits_diff_elevation++;
+ /* read until the stop bit */
+ while ( ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) )
+ {
+ diff++;
+ nbits_diff_angle2++;
+ }
+
+ if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS )
+ {
+ /* count stop bit */
+ nbits_diff_angle2++;
+ }
}
+
+ idx_angle2 = angle->last_angle2_idx + sgn * diff;
}
- idx_elevation = angle->last_elevation_idx + sgn * diff;
+ /* sanity check in case of FER or BER */
+ if ( idx_angle2 < 0 || idx_angle2 > ( 1 << ISM_ELEVATION_NBITS ) - 1 )
+ {
+ idx_angle2 = angle->last_angle2_idx;
+ }
}
-
- /* sanity check in case of FER or BER */
- if ( idx_elevation < 0 || idx_elevation > ( 1 << ISM_ELEVATION_NBITS ) - 1 )
+ else
{
- idx_elevation = angle->last_elevation_idx;
+ idx_angle2 = angle->last_angle2_idx; /* second MD parameter is not transmitted for non-diegetic object */
}
/*----------------------------------------------------------------*
* Final updates
*----------------------------------------------------------------*/
- angle->last_azimuth_idx = idx_azimuth;
- angle->last_elevation_idx = idx_elevation;
+ angle->last_angle2_idx = idx_angle2;
+ angle->last_angle1_idx = idx_angle1;
return;
}
@@ -871,4 +815,174 @@ static int16_t decode_radius(
return idx_radius;
}
-#endif
+
+
+/*-------------------------------------------------------------------*
+ * ivas_ism_metadata_sid_dec()
+ *
+ * Decode ISM metadata in SID frame
+ *-------------------------------------------------------------------*/
+
+void ivas_ism_metadata_sid_dec(
+ SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int32_t ism_total_brate, /* i : ISms total bitrate */
+ const int16_t bfi, /* i : bfi flag */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels*/
+ const ISM_MODE ism_mode, /* i : ISM mode */
+ int16_t *flag_noisy_speech, /* o : noisy speech flag */
+ int16_t *sce_id_dtx, /* o : SCE DTX ID */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ int16_t nb_bits_metadata[] /* o : number of metadata bits */
+)
+{
+ int16_t i, ch, last_bit_pos;
+ float q_step, q_step_border;
+ int16_t idx, idx_azimuth, idx_elevation;
+ int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id;
+ int16_t md_diff_flag[MAX_NUM_OBJECTS];
+ ISM_MODE ism_mode_bstr;
+ DEC_CORE_HANDLE st0;
+ ISM_METADATA_HANDLE hIsmMetaData;
+ int16_t next_bit_pos_orig;
+ uint16_t bstr_meta[IVAS_SID_5k2 / FRAMES_PER_SEC], *bstr_orig;
+
+ if ( ism_total_brate == FRAME_NO_DATA )
+ {
+ ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism );
+
+ return;
+ }
+
+ /* initialization */
+ st0 = hSCE[0]->hCoreCoder[0];
+
+ last_bit_pos = (int16_t) ( ( ism_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
+ bstr_orig = st0->bit_stream;
+ next_bit_pos_orig = st0->next_bit_pos;
+ st0->next_bit_pos = 0;
+
+ /* reverse the bitstream for easier reading of indices */
+ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ )
+ {
+ bstr_meta[i] = st0->bit_stream[last_bit_pos - i];
+ }
+ st0->bit_stream = bstr_meta;
+ st0->total_brate = ism_total_brate; /* needed for BER detection in get_next_indice() */
+
+ if ( !bfi )
+ {
+ /*----------------------------------------------------------------*
+ * ISm common signaling
+ *----------------------------------------------------------------*/
+
+ /* number of objects was already read in ivas_ism_get_dtx_dec() */
+ /* update the position in the bitstream */
+ st0->next_bit_pos += nchan_ism;
+
+ /* read SID metadata flag( one per object ) */
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ md_diff_flag[ch] = get_next_indice( st0, 1 );
+ }
+
+ /*----------------------------------------------------------------*
+ * Set quantization bits based on the number of coded objects
+ *----------------------------------------------------------------*/
+
+ ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id );
+
+ /*----------------------------------------------------------------*
+ * Spatial parameters, loop over TCs - 1
+ *----------------------------------------------------------------*/
+
+ *flag_noisy_speech = 0;
+ *sce_id_dtx = 0;
+
+ /* read ISM mode flag to explicitly signal number of spatial parameters */
+ if ( nchan_ism > 2 )
+ {
+ idx = get_next_indice( st0, 1 );
+ ism_mode_bstr = (ISM_MODE) ( idx + 1 );
+ /* note: ISM mode was already read and used for configuration in in ivas_ism_dtx_dec() */
+
+ if ( ism_mode_bstr == ISM_MODE_PARAM )
+ {
+ /* read noisy speech flag */
+ *flag_noisy_speech = get_next_indice( st0, 1 );
+ nBits_sce_id = 1;
+ }
+ }
+
+ if ( nchan_transport > 1 )
+ {
+ /* read sce id */
+ *sce_id_dtx = get_next_indice( st0, nBits_sce_id );
+
+ /* decode the coherence */
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ if ( ch == *sce_id_dtx )
+ {
+ hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = 1.0f;
+ continue;
+ }
+
+ idx = get_next_indice( st0, nBits_coh );
+ hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 );
+ }
+ }
+
+ if ( ism_mode == ISM_MODE_PARAM )
+ {
+ hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence;
+ }
+
+ /*----------------------------------------------------------------*
+ * Metadata decoding and dequantization, loop over all objects
+ *----------------------------------------------------------------*/
+
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ hIsmMetaData = hIsmMeta[ch];
+ if ( md_diff_flag[ch] == 1 )
+ {
+ /* Azimuth decoding */
+ idx_azimuth = get_next_indice( st0, nBits_azimuth );
+ hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth );
+
+ /* Elevation decoding */
+ idx_elevation = get_next_indice( st0, nBits_elevation );
+ hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation );
+
+ /* update last indexes to correspond to active frames coding */
+ if ( nBits_azimuth > ISM_AZIMUTH_NBITS )
+ {
+ hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS );
+ hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS );
+ }
+ else
+ {
+ hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth );
+ hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation );
+ }
+
+ /* save for smoothing metadata evolution */
+ hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth;
+ hIsmMetaData->last_true_elevation = hIsmMetaData->elevation;
+ }
+ }
+
+ /* take into account padding bits as metadata bits to keep later bitrate checks valid */
+ nb_bits_metadata[*sce_id_dtx] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
+
+ /* set the bitstream pointer to its original position */
+ st0->bit_stream = bstr_orig;
+ st0->next_bit_pos = next_bit_pos_orig;
+ }
+
+ /* smooth the metadata evolution */
+ ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism );
+
+ return;
+}
diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c
index acf62ba1a718f259da0e54fa256a0880e8a387f9..da4ce9210742163bccc1535f4177c8721d981fd4 100644
--- a/lib_dec/ivas_ism_param_dec.c
+++ b/lib_dec/ivas_ism_param_dec.c
@@ -51,6 +51,8 @@
static void ivas_param_ism_dec_dequant_DOA(
DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */
+ ,
+ const int16_t nchan_ism /* i : number of ISM channels */
)
{
int16_t i;
@@ -58,13 +60,13 @@ static void ivas_param_ism_dec_dequant_DOA(
hParamIsm = hDirAC->hParamIsm;
- assert( hParamIsm->num_obj <= MAX_NUM_OBJECTS );
+ assert( nchan_ism <= MAX_NUM_OBJECTS );
/* Get the azimuth and elevation values */
- for ( i = 0; i < hParamIsm->num_obj; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
- hDirAC->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- hDirAC->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
+ hDirAC->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ hDirAC->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
}
return;
@@ -156,7 +158,137 @@ static void ivas_ism_get_proto_matrix(
}
+#ifdef JBM_TSM_ON_TCS
+static void ivas_param_ism_collect_slot(
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ float *Cldfb_RealBuffer_in,
+ float *Cldfb_ImagBuffer_in,
+ const int16_t ch,
+ float ref_power[],
+ float cx_diag[][PARAM_ISM_MAX_DMX] )
+{
+
+ int16_t band_idx, bin_idx;
+ int16_t brange[2];
+ float tmp;
+
+ /* loop over parameter bands to collect transport channel energies */
+ for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ )
+ {
+ brange[0] = hDirAC->hParamIsm->band_grouping[band_idx];
+ brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1];
+ for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ )
+ {
+ tmp = 0.0f;
+ tmp += ( Cldfb_RealBuffer_in[bin_idx] * Cldfb_RealBuffer_in[bin_idx] );
+ tmp += ( Cldfb_ImagBuffer_in[bin_idx] * Cldfb_ImagBuffer_in[bin_idx] );
+ cx_diag[bin_idx][ch] += tmp;
+ ref_power[bin_idx] += tmp;
+ }
+ }
+
+ return;
+}
+
+
+static void ivas_param_ism_compute_mixing_matrix(
+ const int16_t nchan_ism, /* i : number of ISM channels */
+ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
+ ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */
+ float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN],
+ const int16_t nchan_transport,
+ const int16_t nchan_out_woLFE,
+ float cx_diag[][PARAM_ISM_MAX_DMX],
+ float ref_power[],
+ float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] )
+{
+ int16_t band_idx, bin_idx;
+ int16_t i, w, obj_indx;
+ int16_t brange[2];
+ float direct_power[MAX_NUM_OBJECTS];
+ float cy_diag[PARAM_ISM_MAX_CHAN];
+ float cy_diag_tmp[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN];
+ float *dir_res_ptr;
+ float *proto_matrix;
+ float response_matrix[PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS];
+ int16_t num_wave;
+
+ proto_matrix = hDirAC->hParamIsmRendering->proto_matrix;
+
+ assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) );
+ assert( nchan_transport == 2 );
+
+ if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag )
+ {
+ num_wave = nchan_ism;
+ }
+ else
+ {
+ num_wave = MAX_PARAM_ISM_WAVE;
+ }
+ set_zero( response_matrix, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS );
+
+ /* loop over parameter bands to compute the mixing matrix */
+ for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ )
+ {
+ brange[0] = hDirAC->hParamIsm->band_grouping[band_idx];
+ brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1];
+
+ /* Compute covaraince matrix from direct response*/
+ for ( w = 0; w < num_wave; w++ )
+ {
+ set_zero( cy_diag_tmp[w], nchan_out_woLFE );
+
+ if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag )
+ {
+ dir_res_ptr = direct_response[w];
+ }
+ else
+ {
+ obj_indx = hDirAC->hParamIsm->obj_indices[band_idx][0][w];
+ dir_res_ptr = direct_response[obj_indx];
+ }
+ mvr2r( dir_res_ptr, response_matrix + w * nchan_out_woLFE, nchan_out_woLFE );
+ /* we only need the diagonal of Cy*/
+ matrix_product_diag( dir_res_ptr, nchan_out_woLFE, 1, 0, dir_res_ptr, 1, nchan_out_woLFE, 0, cy_diag_tmp[w] );
+ }
+
+ for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ )
+ {
+
+ set_zero( cy_diag, nchan_out_woLFE );
+ for ( w = 0; w < num_wave; w++ )
+ {
+ if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag )
+ {
+ direct_power[w] = ( 1.0f / nchan_ism ) * ref_power[bin_idx];
+ }
+ else
+ {
+ direct_power[w] = hDirAC->power_ratios[band_idx][0][w] * ref_power[bin_idx];
+ }
+
+ if ( direct_power[w] != 0.f )
+ {
+ for ( i = 0; i < nchan_out_woLFE; i++ )
+ {
+ cy_diag[i] += direct_power[w] * cy_diag_tmp[w][i];
+ }
+ }
+ direct_power[w] = sqrtf( direct_power[w] );
+ }
+ /* Compute mixing matrix */
+ computeMixingMatricesISM( nchan_transport, num_wave, nchan_out_woLFE, response_matrix, direct_power, cx_diag[bin_idx], cy_diag, proto_matrix, 1,
+ PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix[bin_idx] );
+ }
+ }
+
+ return;
+}
+
+#else
static void ivas_param_ism_compute_mixing_matrix(
+ const int16_t nchan_ism, /* i : number of ISM channels */
DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */
ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */
float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
@@ -183,12 +315,12 @@ static void ivas_param_ism_compute_mixing_matrix(
proto_matrix = hDirAC->hParamIsmRendering->proto_matrix;
- assert( ( hDirAC->hParamIsm->num_obj == 3 ) || ( hDirAC->hParamIsm->num_obj == 4 ) );
+ assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) );
assert( nchan_transport == 2 );
if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag )
{
- num_wave = hDirAC->hParamIsm->num_obj;
+ num_wave = nchan_ism;
}
else
{
@@ -249,7 +381,7 @@ static void ivas_param_ism_compute_mixing_matrix(
{
if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag )
{
- direct_power[w] = ( 1.0f / hDirAC->hParamIsm->num_obj ) * ref_power;
+ direct_power[w] = ( 1.0f / nchan_ism ) * ref_power;
}
else
{
@@ -273,6 +405,46 @@ static void ivas_param_ism_compute_mixing_matrix(
return;
}
+#endif
+
+
+#ifdef JBM_TSM_ON_TCS
+static void ivas_param_ism_render_slot(
+ DIRAC_DEC_HANDLE hDirAC,
+ float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX],
+ float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX],
+ float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX],
+ const int16_t interpolator_idx,
+ const int16_t out_slot_idx,
+ const int16_t num_ch_LS,
+ const int16_t nchan_transport )
+{
+ int16_t outchIdx, inchIdx, bin_idx;
+ float tmp_1, mixing_matrix_smooth;
+
+ tmp_1 = hDirAC->hParamIsmRendering->interpolator[interpolator_idx];
+
+ for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ )
+ {
+ /* smooth the mixing matrix */
+ for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ )
+ {
+ for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ )
+ {
+ mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] +
+ ( 1 - tmp_1 ) * hDirAC->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS];
+
+ Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][bin_idx];
+ Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][bin_idx];
+ }
+ }
+ }
+
+ return;
+}
+#endif
static void ivas_param_ism_rendering(
@@ -395,7 +567,6 @@ ivas_error ivas_param_ism_dec_open(
IVAS_OUTPUT_SETUP hOutSetup;
AUDIO_CONFIG output_config;
int32_t output_Fs;
- int16_t nchan_out;
ivas_error error;
error = IVAS_ERR_OK;
@@ -424,26 +595,27 @@ ivas_error ivas_param_ism_dec_open(
output_Fs = st_ivas->hDecoderConfig->output_Fs;
output_config = st_ivas->hDecoderConfig->output_config;
- nchan_out = st_ivas->hDecoderConfig->nchan_out;
- if ( output_config == AUDIO_CONFIG_EXTERNAL )
- {
- hDirAC->hParamIsm->num_obj = nchan_out;
- }
- else
- {
- hDirAC->hParamIsm->num_obj = MAX_NUM_OBJECTS;
- }
- ivas_param_ism_config( hDirAC->hParamIsm );
+ ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->nchan_ism );
/*-----------------------------------------------------------------*
* set input parameters
*-----------------------------------------------------------------*/
hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX );
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->hConfig = NULL;
+ set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS );
+ hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS;
+ hDirAC->subframes_rendered = 0;
+ hDirAC->slots_rendered = 0;
+ hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME;
+#else
hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f );
hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots;
assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES );
+#endif
hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f );
hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS;
@@ -466,7 +638,7 @@ ivas_error ivas_param_ism_dec_open(
if ( output_config == AUDIO_CONFIG_EXTERNAL )
{
/* nchan_out is essential for memory initialization for CLDFB Synthesis */
- st_ivas->hIntSetup.nchan_out_woLFE = hDirAC->hParamIsm->num_obj;
+ st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->nchan_ism;
st_ivas->hIntSetup.is_loudspeaker_setup = 1;
}
@@ -475,10 +647,24 @@ ivas_error ivas_param_ism_dec_open(
if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) )
{
/* Initialize Param ISM Rendering handle */
- if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK )
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
{
- return error;
+ if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else
+ {
+#endif
+ if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#ifdef JBM_TSM_ON_TCS
}
+#endif
}
if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) )
@@ -494,120 +680,90 @@ ivas_error ivas_param_ism_dec_open(
set_zero( hDirAC->azimuth_values, MAX_NUM_OBJECTS );
set_zero( hDirAC->elevation_values, MAX_NUM_OBJECTS );
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES;
+#else
hDirAC->dirac_md_buffer_length = 0;
+#endif
hDirAC->dirac_bs_md_write_idx = 0;
hDirAC->dirac_read_idx = 0;
hDirAC->spar_to_dirac_write_idx = 0;
if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) )
{
+#ifndef JBM_TSM_ON_TCS
hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES;
- if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
-
- if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
-
- if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
-
- if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
-
- if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
-
- if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+#endif
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ return error;
}
- if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
+ if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ return error;
}
+ }
- if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
+ st_ivas->hISMDTX.dtx_flag = 0;
- if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
+ st_ivas->hDirAC = hDirAC;
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE )
{
- if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
- set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
- set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
- set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
- set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ int16_t nchan_transport = st_ivas->nchan_transport;
+ int16_t nchan_full = 0;
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ nchan_full = nchan_transport;
+ hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL;
+ hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL;
}
- set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ else
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
- }
- set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands );
+ if ( ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) );
+ }
+ set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands );
- if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ if ( ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) );
+ }
+ set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands );
}
- set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ if ( st_ivas->hTcBuffer == NULL )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
- set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands );
-
- if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ }
+ else
+ {
+ hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL;
+ hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL;
+ if ( st_ivas->hTcBuffer == NULL )
{
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) );
+ int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out;
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
- set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands );
}
}
-
- st_ivas->hISMDTX.dtx_flag = 0;
-
- st_ivas->hDirAC = hDirAC;
+ else
+ {
+ hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL;
+ hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL;
+ }
+#endif
pop_wmops();
return error;
@@ -625,7 +781,6 @@ void ivas_param_ism_dec_close(
AUDIO_CONFIG output_config /* i : output audio configuration */
)
{
- int16_t i;
DIRAC_DEC_HANDLE hDirAC;
if ( hDirAC_out == NULL || *hDirAC_out == NULL )
@@ -644,151 +799,43 @@ void ivas_param_ism_dec_close(
if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) )
{
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->azimuth[i] != NULL )
- {
- free( hDirAC->azimuth[i] );
- hDirAC->azimuth[i] = NULL;
- }
-
- if ( hDirAC->elevation[i] != NULL )
- {
- free( hDirAC->elevation[i] );
- hDirAC->elevation[i] = NULL;
- }
- }
+ ivas_dirac_deallocate_parameters( hDirAC, 1 );
+ ivas_dirac_deallocate_parameters( hDirAC, 2 );
+ }
- if ( hDirAC->azimuth != NULL )
+ if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) )
+ {
+ /* Param ISM Rendering */
+ if ( hDirAC->hParamIsmRendering->interpolator != NULL )
{
- free( hDirAC->azimuth );
- hDirAC->azimuth = NULL;
+ free( hDirAC->hParamIsmRendering->interpolator );
+ hDirAC->hParamIsmRendering->interpolator = NULL;
}
- if ( hDirAC->elevation != NULL )
+ if ( hDirAC->hParamIsmRendering->proto_matrix != NULL )
{
- free( hDirAC->elevation );
- hDirAC->elevation = NULL;
+ free( hDirAC->hParamIsmRendering->proto_matrix );
+ hDirAC->hParamIsmRendering->proto_matrix = NULL;
}
+ }
- if ( hDirAC->azimuth2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->azimuth2[i] != NULL )
- {
- free( hDirAC->azimuth2[i] );
- hDirAC->azimuth2[i] = NULL;
- }
- }
- free( hDirAC->azimuth2 );
- hDirAC->azimuth2 = NULL;
- }
+#ifdef JBM_TSM_ON_TCS
+ if ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc != NULL )
+ {
+ free( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc );
+ hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL;
+ }
+ if ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc != NULL )
+ {
+ free( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc );
+ hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL;
+ }
+#endif
- if ( hDirAC->elevation2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->elevation2[i] != NULL )
- {
- free( hDirAC->elevation2[i] );
- hDirAC->elevation2[i] = NULL;
- }
- }
- free( hDirAC->elevation2 );
- hDirAC->elevation2 = NULL;
- }
-
- if ( hDirAC->energy_ratio1 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->energy_ratio1[i] != NULL )
- {
- free( hDirAC->energy_ratio1[i] );
- hDirAC->energy_ratio1[i] = NULL;
- }
- }
- free( hDirAC->energy_ratio1 );
- hDirAC->energy_ratio1 = NULL;
- }
-
- if ( hDirAC->energy_ratio2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->energy_ratio2[i] != NULL )
- {
- free( hDirAC->energy_ratio2[i] );
- hDirAC->energy_ratio2[i] = NULL;
- }
- }
- free( hDirAC->energy_ratio2 );
- hDirAC->energy_ratio2 = NULL;
- }
-
- if ( hDirAC->spreadCoherence != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->spreadCoherence[i] != NULL )
- {
- free( hDirAC->spreadCoherence[i] );
- hDirAC->spreadCoherence[i] = NULL;
- }
- }
- free( hDirAC->spreadCoherence );
- hDirAC->spreadCoherence = NULL;
- }
-
- if ( hDirAC->spreadCoherence2 != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->spreadCoherence2[i] != NULL )
- {
- free( hDirAC->spreadCoherence2[i] );
- hDirAC->spreadCoherence2[i] = NULL;
- }
- }
- free( hDirAC->spreadCoherence2 );
- hDirAC->spreadCoherence2 = NULL;
- }
-
- if ( hDirAC->surroundingCoherence != NULL )
- {
- for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ )
- {
- if ( hDirAC->surroundingCoherence[i] != NULL )
- {
- free( hDirAC->surroundingCoherence[i] );
- hDirAC->surroundingCoherence[i] = NULL;
- }
- }
- free( hDirAC->surroundingCoherence );
- hDirAC->surroundingCoherence = NULL;
- }
- }
-
- if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) )
- {
- /* Param ISM Rendering */
- if ( hDirAC->hParamIsmRendering->interpolator != NULL )
- {
- free( hDirAC->hParamIsmRendering->interpolator );
- hDirAC->hParamIsmRendering->interpolator = NULL;
- }
- if ( hDirAC->hParamIsmRendering->proto_matrix != NULL )
- {
- free( hDirAC->hParamIsmRendering->proto_matrix );
- hDirAC->hParamIsmRendering->proto_matrix = NULL;
- }
- }
-
- if ( hDirAC->hParamIsmRendering != NULL )
- {
- free( hDirAC->hParamIsmRendering );
- hDirAC->hParamIsmRendering = NULL;
- }
+ if ( hDirAC->hParamIsmRendering != NULL )
+ {
+ free( hDirAC->hParamIsmRendering );
+ hDirAC->hParamIsmRendering = NULL;
+ }
free( *hDirAC_out );
*hDirAC_out = NULL;
@@ -811,7 +858,10 @@ void ivas_param_ism_dec(
int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i;
int16_t subframe_idx, slot_idx, index_slot, bin_idx;
int32_t ivas_total_brate;
-
+#ifdef JBM_TSM_ON_TCS
+ float ref_power[CLDFB_NO_CHANNELS_MAX];
+ float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX];
+#endif
/* CLDFB Input Buffers */
float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
@@ -837,7 +887,7 @@ void ivas_param_ism_dec(
nchan_transport = st_ivas->nchan_transport;
if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
{
- nchan_out = st_ivas->hDirAC->hParamIsm->num_obj;
+ nchan_out = st_ivas->nchan_ism;
nchan_out_woLFE = nchan_out;
st_ivas->hDecoderConfig->nchan_out = nchan_out;
}
@@ -853,11 +903,20 @@ void ivas_param_ism_dec(
push_wmops( "ivas_param_ism_dec" );
+#ifdef JBM_TSM_ON_TCS
+ /* set buffers to zero */
+ for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ )
+ {
+ set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX );
+ }
+ set_zero( ref_power, CLDFB_NO_CHANNELS_MAX );
+#endif
+
/* Frame-level Processing */
/* De-quantization */
if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
{
- ivas_param_ism_dec_dequant_DOA( hDirAC );
+ ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism );
ivas_param_ism_dec_dequant_powrat( hDirAC );
st_ivas->hISMDTX.dtx_flag = 0;
}
@@ -869,7 +928,7 @@ void ivas_param_ism_dec(
/* obtain the direct response using EFAP */
if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) )
{
- for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ )
+ for ( i = 0; i < st_ivas->nchan_ism; i++ )
{
efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP );
}
@@ -878,7 +937,7 @@ void ivas_param_ism_dec(
{
int16_t j;
- for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ )
+ for ( i = 0; i < st_ivas->nchan_ism; i++ )
{
for ( j = 0; j < nchan_out_woLFE; j++ )
{
@@ -917,6 +976,10 @@ void ivas_param_ism_dec(
for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ )
{
cldfbAnalysis_ts( &( output_f[ch][hDirAC->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] );
+
+#ifdef JBM_TSM_ON_TCS
+ ivas_param_ism_collect_slot( hDirAC, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag );
+#endif
}
}
@@ -927,26 +990,41 @@ void ivas_param_ism_dec(
}
/* Compute mixing matrix */
- ivas_param_ism_compute_mixing_matrix( hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix );
-
+#ifdef JBM_TSM_ON_TCS
+ ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix );
+#else
+ ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix );
+#endif
/* subframe loop for synthesis*/
for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ )
{
+#ifdef JBM_TSM_ON_TCS
+ uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots[subframe_idx];
+#else
uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots;
+#endif
uint16_t idx_in;
uint16_t idx_lfe;
/* Set some memories to zero */
for ( ch = 0; ch < nchan_out_woLFE; ch++ )
{
+#ifdef JBM_TSM_ON_TCS
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+#else
for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ )
+#endif
{
set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands );
set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands );
}
}
+#ifdef JBM_TSM_ON_TCS
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+#else
for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ )
+#endif
{
index_slot = slot_idx_start + slot_idx;
@@ -964,8 +1042,11 @@ void ivas_param_ism_dec(
{
if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) )
{
+#ifdef JBM_TSM_ON_TCS
+ set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands );
+#else
set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands );
-
+#endif
if ( idx_lfe < ( hSetup.num_lfe - 1 ) )
{
idx_lfe++;
@@ -977,14 +1058,23 @@ void ivas_param_ism_dec(
float *ImagBuffer[16];
/* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+#else
for ( i = 0; i < hDirAC->subframe_nbslots; i++ )
+#endif
{
RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
}
+#ifdef JBM_TSM_ON_TCS
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ),
+ hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] );
+#else
cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ),
hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] );
+#endif
idx_in++;
}
@@ -996,7 +1086,7 @@ void ivas_param_ism_dec(
ivas_param_ism_update_mixing_matrix( hDirAC, mixing_matrix, nchan_transport, nchan_out_woLFE );
/* store MetaData parameters */
- for ( ch = 0; ch < hDirAC->hParamIsm->num_obj; ch++ )
+ for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
{
if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f )
{
@@ -1015,6 +1105,439 @@ void ivas_param_ism_dec(
return;
}
+#ifdef JBM_TSM_ON_TCS
+
+/*-------------------------------------------------------------------------*
+ * ivas_ism_dec_digest_tc()
+ *
+ *
+ *-------------------------------------------------------------------------*/
+
+void ivas_ism_dec_digest_tc(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+
+ ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
+
+ if ( st_ivas->renderer_type == RENDERER_TD_PANNING ||
+ st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ||
+ st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ||
+ st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ||
+ ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) )
+ {
+ int16_t i, num_objects;
+ int16_t azimuth, elevation;
+
+ /* we have a full frame interpolator, adapt it */
+ /* for BE testing */
+ if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available )
+ {
+ int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND );
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
+ {
+ st_ivas->hIsmRendererData->interpolator[0] = 0.0f;
+ for ( i = 1; i < interpolator_length; i++ )
+ {
+ st_ivas->hIsmRendererData->interpolator[i] = st_ivas->hIsmRendererData->interpolator[i - 1] + 1.f / ( interpolator_length - 1 );
+ }
+ }
+ else
+ {
+ for ( i = 0; i < interpolator_length; i++ )
+ {
+ st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 );
+ }
+ }
+ }
+ else
+ {
+ ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ),
+ st_ivas->hTcBuffer->n_samples_available,
+ st_ivas->hIsmRendererData->interpolator );
+ }
+ /* also get the gains here */
+ num_objects = st_ivas->nchan_transport;
+ for ( i = 0; i < num_objects; i++ )
+ {
+ mvr2r( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS );
+
+ if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO )
+ {
+ ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth,
+ st_ivas->hIsmMetaData[i]->elevation,
+ &st_ivas->hIsmRendererData->gains[i][0],
+ &st_ivas->hIsmRendererData->gains[i][1] );
+ }
+ else
+ {
+ // TODO tmu review when #215 is resolved
+ azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f );
+ elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f );
+
+ if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hHeadTrackData == NULL )
+ {
+ if ( st_ivas->hIntSetup.is_planar_setup )
+ {
+ /* If no elevation support in output format, then rendering should be done with zero elevation */
+ elevation = 0;
+ }
+
+ if ( st_ivas->hEFAPdata != NULL )
+ {
+ efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP );
+ }
+ }
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
+ {
+ /*get HOA gets for direction (ACN/SN3D)*/
+ ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order );
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------*
+ * ivas_param_ism_dec_digest_tc()
+ *
+ *
+ *-------------------------------------------------------------------------*/
+
+void ivas_param_ism_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */
+ float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */
+)
+{
+ int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i;
+ int16_t slot_idx, bin_idx;
+ int32_t ivas_total_brate;
+ float ref_power[CLDFB_NO_CHANNELS_MAX];
+ float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX];
+ /* Direct Response/EFAP Gains */
+ float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN];
+ DIRAC_DEC_HANDLE hDirAC;
+
+ /* Initialization */
+ hDirAC = st_ivas->hDirAC;
+ assert( hDirAC );
+
+ nchan_transport = st_ivas->nchan_transport;
+ ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
+
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
+ {
+ nchan_out = st_ivas->nchan_ism;
+ nchan_out_woLFE = nchan_out;
+ st_ivas->hDecoderConfig->nchan_out = nchan_out;
+ }
+ else
+ {
+ nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+ nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
+ }
+
+ push_wmops( "ivas_param_ism_dec" );
+
+ /* general setup */
+ ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hDirAC->hParamIsmRendering->interpolator );
+
+ ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots );
+
+ /* set buffers to zero */
+ for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ )
+ {
+ set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX );
+ }
+ set_zero( ref_power, CLDFB_NO_CHANNELS_MAX );
+
+ /* Frame-level Processing */
+ /* De-quantization */
+ if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
+ {
+ ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism );
+ ivas_param_ism_dec_dequant_powrat( hDirAC );
+ st_ivas->hISMDTX.dtx_flag = 0;
+ }
+ else
+ {
+ st_ivas->hISMDTX.dtx_flag = 1;
+ }
+
+ /* obtain the direct response using EFAP */
+ if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) )
+ {
+ for ( i = 0; i < st_ivas->nchan_ism; i++ )
+ {
+ efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP );
+ }
+ }
+ else
+ {
+ int16_t j;
+
+ for ( i = 0; i < st_ivas->nchan_ism; i++ )
+ {
+ for ( j = 0; j < nchan_out_woLFE; j++ )
+ {
+ if ( i == j )
+ {
+ direct_response[i][j] = 1.0f;
+ }
+ else
+ {
+ direct_response[i][j] = 0.0f;
+ }
+ }
+ }
+
+ for ( i = 0; i < nchan_transport; i++ )
+ {
+ for ( j = 0; j < nchan_out_woLFE; j++ )
+ {
+ if ( i == j )
+ {
+ hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 1.0f;
+ }
+ else
+ {
+ hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 0.0f;
+ }
+ }
+ }
+ }
+
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ /*-----------------------------------------------------------------*
+ * CLDFB Analysis
+ *-----------------------------------------------------------------*/
+ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ )
+ {
+ float RealBuffer[CLDFB_NO_CHANNELS_MAX];
+ float ImagBuffer[CLDFB_NO_CHANNELS_MAX];
+
+ cldfbAnalysis_ts( &( transport_channels_f[ch][hDirAC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] );
+ mvr2r( RealBuffer, &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands );
+ mvr2r( ImagBuffer, &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands );
+
+ ivas_param_ism_collect_slot( hDirAC, RealBuffer, ImagBuffer, ch, ref_power, cx_diag );
+ }
+ }
+
+ /* Obtain Mixing Matrix on a frame-level */
+ for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ )
+ {
+ set_f( hDirAC->hParamIsmRendering->mixing_matrix_lin[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE );
+ }
+
+ /* Compute mixing matrix */
+ ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hDirAC->hParamIsmRendering->mixing_matrix_lin );
+
+ pop_wmops();
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------*
+ * ivas_ism_param_dec_render_sf()
+ *
+ *
+ *-------------------------------------------------------------------------*/
+
+static void ivas_ism_param_dec_render_sf(
+ Decoder_Struct *st_ivas,
+ IVAS_OUTPUT_SETUP hSetup,
+ const int16_t nchan_transport,
+ const int16_t nchan_out,
+ const int16_t nchan_out_woLFE,
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ int16_t ch, slot_idx, i, index_slot;
+ /* CLDFB Output Buffers */
+ float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX];
+ float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX];
+ DIRAC_DEC_HANDLE hDirAC;
+
+ int16_t slot_idx_start;
+ int16_t idx_in;
+ int16_t idx_lfe;
+ int16_t subframe_idx;
+
+ hDirAC = st_ivas->hDirAC;
+ slot_idx_start = hDirAC->slots_rendered;
+ subframe_idx = hDirAC->subframes_rendered;
+
+ /* Set some memories to zero */
+ for ( ch = 0; ch < nchan_out_woLFE; ch++ )
+ {
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+ {
+ set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands );
+ set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands );
+ }
+ }
+
+ for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ )
+ {
+ index_slot = slot_idx_start + slot_idx;
+
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ Cldfb_RealBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands];
+ Cldfb_ImagBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands];
+ }
+
+ /* Compute bandwise rendering to target LS using covariance rendering */
+ ivas_param_ism_render_slot( hDirAC, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in,
+ Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->hParamIsmRendering->mixing_matrix_lin, index_slot, slot_idx,
+ nchan_out_woLFE, nchan_transport );
+ }
+
+ /* CLDFB Synthesis */
+ idx_in = 0;
+ idx_lfe = 0;
+
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) )
+ {
+ set_zero( output_f[ch], hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands );
+ if ( idx_lfe < ( hSetup.num_lfe - 1 ) )
+ {
+ idx_lfe++;
+ }
+ }
+ else
+ {
+ float *RealBuffer[16];
+ float *ImagBuffer[16];
+
+ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+ for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ )
+ {
+ RealBuffer[i] = Cldfb_RealBuffer[idx_in][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i];
+ }
+ cldfbSynthesis( RealBuffer, ImagBuffer, output_f[ch],
+ hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] );
+ idx_in++;
+ }
+ }
+
+ hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx];
+ hDirAC->subframes_rendered++;
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------*
+ * ivas_param_ism_dec_render()
+ *
+ *
+ *-------------------------------------------------------------------------*/
+
+void ivas_param_ism_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ int16_t ch, slots_to_render, first_sf, last_sf, subframe_idx;
+ uint16_t slot_size, n_samples_sf;
+ DIRAC_DEC_HANDLE hDirAC;
+ IVAS_OUTPUT_SETUP hSetup;
+ int16_t nchan_transport, nchan_out, nchan_out_woLFE;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+
+ hDirAC = st_ivas->hDirAC;
+ hSetup = st_ivas->hIntSetup;
+#ifdef DEBUGGING
+ assert( hDirAC );
+#endif
+ nchan_transport = st_ivas->nchan_transport;
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
+ {
+ nchan_out = st_ivas->nchan_ism;
+ nchan_out_woLFE = nchan_out;
+ st_ivas->hDecoderConfig->nchan_out = nchan_out;
+ }
+ else
+ {
+ nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+ nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
+ }
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size );
+ *nSamplesRendered = slots_to_render * slot_size;
+ first_sf = hDirAC->subframes_rendered;
+ last_sf = first_sf;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hDirAC->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+#ifdef DEBUGGING
+ assert( slots_to_render == 0 );
+#endif
+
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] = &output_f[ch][0];
+ }
+
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ ivas_ism_param_dec_render_sf( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local );
+ n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size;
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] += n_samples_sf;
+ }
+ }
+
+ if ( hDirAC->slots_rendered == hDirAC->num_slots )
+ {
+ /* copy the memories */
+ /* store mixing matrix for next subframe */
+ ivas_param_ism_update_mixing_matrix( hDirAC, hDirAC->hParamIsmRendering->mixing_matrix_lin, nchan_transport, nchan_out_woLFE );
+
+ /* store MetaData parameters */
+ for ( ch = 0; ch < st_ivas->nchan_ism; ch++ )
+ {
+ if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f )
+ {
+ st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch] - 360.0f;
+ }
+ else
+ {
+ st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch];
+ }
+
+ st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hDirAC->elevation_values[ch];
+ }
+ }
+
+ *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size;
+
+ return;
+}
+#endif
+
/*-------------------------------------------------------------------------*
* ivas_param_ism_params_to_masa_param_mapping()
@@ -1042,7 +1565,7 @@ void ivas_param_ism_params_to_masa_param_mapping(
if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) )
{
- ivas_param_ism_dec_dequant_DOA( hDirAC );
+ ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism );
ivas_param_ism_dec_dequant_powrat( hDirAC );
st_ivas->hISMDTX.dtx_flag = 0;
}
@@ -1051,7 +1574,7 @@ void ivas_param_ism_params_to_masa_param_mapping(
st_ivas->hISMDTX.dtx_flag = 1;
}
- if ( hDirAC->hParamIsm->num_obj > 1 )
+ if ( st_ivas->nchan_ism > 1 )
{
if ( st_ivas->hISMDTX.dtx_flag )
{
@@ -1061,6 +1584,7 @@ void ivas_param_ism_params_to_masa_param_mapping(
hDirAC->numSimultaneousDirections = 1;
azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] );
elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] );
+
for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
{
for ( bin_idx = 0; bin_idx < nBins; bin_idx++ )
@@ -1104,6 +1628,7 @@ void ivas_param_ism_params_to_masa_param_mapping(
}
}
}
+
for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
{
for ( bin_idx = 0; bin_idx < nBins; bin_idx++ )
@@ -1120,6 +1645,7 @@ void ivas_param_ism_params_to_masa_param_mapping(
hDirAC->numSimultaneousDirections = 1;
azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] );
elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] );
+
for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
{
for ( bin_idx = 0; bin_idx < nBins; bin_idx++ )
@@ -1135,135 +1661,3 @@ void ivas_param_ism_params_to_masa_param_mapping(
return;
}
-
-
-static void ivas_param_ism_dec_dequantize_DOA_dtx(
- int16_t azi_bits,
- int16_t ele_bits,
- int16_t azi_idx,
- int16_t ele_idx,
- float *azi_val,
- float *ele_val )
-{
- int16_t nbits, npoints, angle_spacing, az_alpha, ele_alpha, tmp_alpha;
-
- /* Step 1: Determine angle spacing/n_points based on minimum value among elevation/azimuth bits */
- nbits = min( azi_bits, ele_bits );
-
- if ( nbits == ISM_ELEVATION_NBITS )
- {
- angle_spacing = 5;
- }
- else
- {
- angle_spacing = (int16_t) ( ( 180.f / (float) ( 1 << nbits ) ) + 0.5f );
- }
-
- npoints = (int16_t) ( ( 90 / angle_spacing ) + 0.5f );
-
- /* sanity check */
- if ( angle_spacing == 360 )
- {
- assert( azi_idx == 0 );
- assert( ele_idx == 0 );
-
- *azi_val = 0.f;
- *ele_val = 0.f;
- return;
- }
-
- /* Get the azimuth and elevation values */
- ele_alpha = 2 * npoints - 1;
- assert( ( 0 <= ele_idx ) && ( ele_idx < ele_alpha ) );
- *ele_val = (float) ( ( ele_idx - npoints ) * angle_spacing );
-
- az_alpha = 4 * npoints - 1;
- assert( ( 0 <= azi_idx ) && ( azi_idx < az_alpha ) );
- tmp_alpha = (int16_t) ( azi_idx * ( 360.f / az_alpha ) );
-
- if ( tmp_alpha > 180.0f )
- {
- *azi_val = ( (float) tmp_alpha ) - 360.0f;
- }
- else
- {
- *azi_val = (float) tmp_alpha;
- }
-
- return;
-}
-
-
-/*-------------------------------------------------------------------------
- * ivas_param_ism_metadata_dtx_dec()
- *
- *
- *-------------------------------------------------------------------------*/
-
-void ivas_param_ism_metadata_dtx_dec(
- Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
-)
-{
- int16_t azi_idx, ele_idx, i;
- int16_t last_bit_pos, next_bit_pos_orig;
- uint16_t bstr_meta[IVAS_SID_5k2 / FRAMES_PER_SEC], *bstr_orig;
- DEC_CORE_HANDLE st0;
- PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */
- int16_t coh_idx;
-
- if ( st_ivas->hDecoderConfig->ivas_total_brate == FRAME_NO_DATA )
- {
- return;
- }
-
- st0 = st_ivas->hSCE[0]->hCoreCoder[0];
- hParamIsm = st_ivas->hDirAC->hParamIsm;
-
- last_bit_pos = (int16_t) ( ( st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS );
- bstr_orig = st0->bit_stream;
- next_bit_pos_orig = st0->next_bit_pos;
- st0->next_bit_pos = 0;
-
- /* reverse the bitstream for easier reading of indices */
- for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ )
- {
- bstr_meta[i] = st0->bit_stream[last_bit_pos - i];
- }
- st0->bit_stream = bstr_meta;
- st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* needed for BER detection in get_next_indice() */
-
- /* number of objects was already read in ivas_ism_get_dtx_dec() */
- /* update the position in the bitstream */
- st0->next_bit_pos += hParamIsm->num_obj;
-
- /* read sce id */
- st_ivas->hISMDTX.sce_id_dtx = get_next_indice( st0, 1 );
-
- /* read the noisy speech flag */
- hParamIsm->flag_noisy_speech = get_next_indice( st0, 1 );
-
- /* decode the coherence */
- coh_idx = get_next_indice( st0, PARAM_ISM_DTX_COH_SCA_BITS );
- st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( coh_idx ) / (float) ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 );
- st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence;
-
- /* get the DOA'S */
- for ( i = 0; i < hParamIsm->num_obj; i++ )
- {
- /* read from bitstream and dequantize */
- azi_idx = get_next_indice( st0, PARAM_ISM_DTX_AZI_BITS );
- ele_idx = get_next_indice( st0, PARAM_ISM_DTX_ELE_BITS );
-
- ivas_param_ism_dec_dequantize_DOA_dtx( PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, azi_idx, ele_idx, &( st_ivas->hDirAC->azimuth_values[i] ), &( st_ivas->hDirAC->elevation_values[i] ) );
- }
-
- /* set the bitstream pointer to its original position */
- st0->bit_stream = bstr_orig;
- st0->next_bit_pos = next_bit_pos_orig;
-
-#ifdef DEBUG_MODE_PARAM_ISM
- dbgwrite( &( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence ), sizeof( float ), 1, 1, "./res/ParamISM_coh_dec.dat" );
-#endif
-
- return;
-}
diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c
index 16a9d7c1562705d7745900adfef82c0c75ff6697..70d84e7b7fd37ab9c07660985e2ea8856a6526e9 100644
--- a/lib_dec/ivas_ism_renderer.c
+++ b/lib_dec/ivas_ism_renderer.c
@@ -58,6 +58,9 @@ ivas_error ivas_ism_renderer_open(
{
int16_t i;
uint16_t interpolator_length;
+#ifdef JBM_TSM_ON_TCS
+ uint16_t init_interpolator_length;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -78,13 +81,34 @@ ivas_error ivas_ism_renderer_open(
for ( i = 0; i < MAX_NUM_OBJECTS; i++ )
{
set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS );
+#ifdef JBM_TSM_ON_TCS
+ set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS );
+#endif
}
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS );
+ interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ }
+ else
+ {
+ init_interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ interpolator_length = init_interpolator_length;
+ }
+ st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length );
+ for ( i = 0; i < interpolator_length; i++ )
+ {
+ st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 );
+ }
+#else
interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
for ( i = 0; i < interpolator_length; i++ )
{
st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 );
}
+#endif
return error;
}
@@ -97,9 +121,13 @@ ivas_error ivas_ism_renderer_open(
*-------------------------------------------------------------------------*/
void ivas_ism_render(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: core-coder transport channels/object output */
+#else
float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */
- const int16_t output_frame /* i : output frame length per channel */
+#endif
+ const int16_t output_frame /* i : output frame length per channel */
)
{
int16_t i, j, k, j2;
@@ -107,13 +135,13 @@ void ivas_ism_render(
float tmp_output_f[MAX_OUTPUT_CHANNELS][L_FRAME48k];
float gains[MAX_NUM_OBJECTS][MAX_OUTPUT_CHANNELS];
float g1, g2;
- int16_t num_objects, nchan_out_woLFE, lfe_index;
+ int16_t nchan_ism, nchan_out_woLFE, lfe_index;
int16_t azimuth, elevation;
#ifndef EXTERNAL_ORIENTATIONS
float Rmat[3][3];
#endif
- num_objects = st_ivas->nchan_transport;
+ nchan_ism = st_ivas->nchan_ism;
nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
lfe_index = 0;
@@ -123,7 +151,7 @@ void ivas_ism_render(
set_f( tmp_output_f[j], 0.0f, output_frame );
}
- for ( i = 0; i < num_objects; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
mvr2r( output_f[i], input_f[i], output_frame );
}
@@ -141,7 +169,7 @@ void ivas_ism_render(
}
#endif
- for ( i = 0; i < num_objects; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO )
{
@@ -158,7 +186,7 @@ void ivas_ism_render(
rotateAziEle(st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup);
#else
/* Head rotation: rotate the object positions depending the head's orientation */
- if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 )
+ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag )
{
rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup );
#endif
@@ -211,6 +239,99 @@ void ivas_ism_render(
return;
}
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------*
+ * ivas_ism_render_sf()
+ *
+ * Object rendering process
+ *-------------------------------------------------------------------------*/
+
+void ivas_ism_render_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *output_f[], /* i/o: core-coder transport channels/object output */
+ const int16_t n_samples_to_render /* i : output frame length per channel */
+)
+{
+ int16_t i, j, k, j2;
+ float *g1, g2, *tc;
+ int16_t num_objects, nchan_out_woLFE, lfe_index;
+ int16_t azimuth, elevation;
+ int16_t tc_offset;
+ int16_t interp_offset;
+ float Rmat[3][3];
+ float gain, prev_gain;
+
+ num_objects = st_ivas->nchan_transport;
+ nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE;
+
+ tc_offset = st_ivas->hTcBuffer->n_samples_rendered;
+ interp_offset = st_ivas->hTcBuffer->n_samples_rendered;
+
+ for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ )
+ {
+ set_f( output_f[i], 0.0f, n_samples_to_render );
+ }
+
+ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 )
+ {
+ /* Calculate rotation matrix from the quaternion */
+ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat );
+
+ ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render,
+ n_samples_to_render,
+ st_ivas->hIsmRendererData->interpolator );
+ interp_offset = 0;
+ }
+
+ for ( i = 0; i < num_objects; i++ )
+ {
+ /* Head rotation: rotate the object positions depending the head's orientation */
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag )
+#else
+ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 )
+#endif
+ {
+ rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup );
+ if ( st_ivas->hEFAPdata != NULL )
+ {
+ efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP );
+ }
+ }
+
+ lfe_index = 0;
+ for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ )
+ {
+ if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) )
+ {
+ ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++;
+ }
+
+ gain = st_ivas->hIsmRendererData->gains[i][j];
+ prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j];
+ if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f )
+ {
+ g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset];
+ tc = &st_ivas->hTcBuffer->tc[i][tc_offset];
+ for ( k = 0; k < n_samples_to_render; k++ )
+ {
+ g2 = 1.0f - *g1;
+ output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ );
+ }
+ }
+
+ /* update here only in case of head rotation */
+ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 )
+ {
+ st_ivas->hIsmRendererData->prev_gains[i][j] = gain;
+ }
+ }
+ }
+
+ return;
+}
+#endif
+
/*-------------------------------------------------------------------------*
* ivas_ism_get_stereo_gains()
diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c
new file mode 100644
index 0000000000000000000000000000000000000000..04ae4904146b577b413d189be0648e46aca1ec04
--- /dev/null
+++ b/lib_dec/ivas_jbm_dec.c
@@ -0,0 +1,1867 @@
+/******************************************************************************************************
+
+ (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository. All Rights Reserved.
+
+ This software is protected by copyright law and by international treaties.
+ The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository retain full ownership rights in their respective contributions in
+ the software. This notice grants no license of any kind, including but not limited to patent
+ license, nor is any license granted by implication, estoppel or otherwise.
+
+ Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
+ contributions.
+
+ This software is provided "AS IS", without any express or implied warranties. The software is in the
+ development stage. It is intended exclusively for experts who have experience with such software and
+ solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
+ and fitness for a particular purpose are hereby disclaimed and excluded.
+
+ Any dispute, controversy or claim arising under or in relation to providing this software shall be
+ submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
+ accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
+ the United Nations Convention on Contracts on the International Sales of Goods.
+
+*******************************************************************************************************/
+
+#include
+#include "options.h"
+#include "cnst.h"
+#include "ivas_cnst.h"
+#include "rom_com.h"
+#include "prot.h"
+#include "ivas_prot.h"
+#include "ivas_prot_rend.h"
+#include "ivas_rom_com.h"
+#include
+#ifdef DEBUGGING
+#include "debug.h"
+#endif
+#include "wmc_auto.h"
+
+
+#ifdef JBM_TSM_ON_TCS
+
+/*-----------------------------------------------------------------------*
+ * Local function prototypes
+ *-----------------------------------------------------------------------*/
+
+static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] );
+
+static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] );
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_tc()
+ *
+ * Principal IVAS JBM decoder routine, decoding of metadata and transport channels
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *data /* o : transport channel signals */
+)
+{
+ int16_t n, output_frame, nchan_out;
+ Decoder_State *st; /* used for bitstream handling */
+ float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */
+ int16_t nchan_remapped, hodirac_flag;
+ float output_lfe_ch[L_FRAME48k];
+ int16_t nb_bits_metadata[MAX_SCE];
+ int32_t output_Fs, ivas_total_brate;
+ AUDIO_CONFIG output_config;
+ ivas_error error;
+ float *p_output[MAX_TRANSPORT_CHANNELS];
+
+ error = IVAS_ERR_OK;
+
+ push_wmops( "ivas_jbm_dec_tc" );
+
+ /*----------------------------------------------------------------*
+ * Initialization of local vars after struct has been set
+ *----------------------------------------------------------------*/
+
+ output_Fs = st_ivas->hDecoderConfig->output_Fs;
+ nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm;
+ output_config = st_ivas->hDecoderConfig->output_config;
+ ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
+ hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order );
+
+ output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
+
+ for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ )
+ {
+ p_output[n] = &output[n][0];
+ }
+
+ /*----------------------------------------------------------------*
+ * Decoding + Rendering
+ *----------------------------------------------------------------*/
+
+ if ( st_ivas->bfi && st_ivas->ini_frame == 0 )
+ {
+ /* zero output when first frame(s) is lost */
+ for ( n = 0; n < nchan_out; n++ )
+ {
+ set_f( output[n], 0.0f, output_frame );
+ }
+
+#ifdef DEBUG_MODE_INFO
+ create_sce_dec( st_ivas, 0, ivas_total_brate );
+ output_debug_mode_info_dec( st_ivas->hSCE[0]->hCoreCoder, 1, output_frame, NULL );
+ destroy_sce_dec( st_ivas->hSCE[0] );
+ st_ivas->hSCE[0] = NULL;
+#endif
+ }
+ else if ( st_ivas->ivas_format == STEREO_FORMAT )
+ {
+ st_ivas->hCPE[0]->element_brate = ivas_total_brate;
+
+ if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /* HP filtering */
+ for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+
+ if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 )
+ {
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+ }
+ }
+ else if ( st_ivas->ivas_format == ISM_FORMAT )
+ {
+ /* Metadata decoding and configuration */
+ if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA )
+ {
+ if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ {
+ if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else /* ISM_MODE_DISC */
+ {
+ if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ for ( n = 0; n < st_ivas->nchan_transport; n++ )
+ {
+ if ( ( error = ivas_sce_dec( st_ivas, n, &output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /* HP filtering */
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+ if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
+ {
+ ivas_mono_downmix_render_passive( st_ivas, output, output_frame );
+ }
+ }
+ else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
+ {
+ set_s( nb_bits_metadata, 0, MAX_SCE );
+
+ /* read parameters from the bitstream */
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT )
+#endif
+ {
+ st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
+
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+ {
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, 0 );
+#else
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, 0 );
+#endif
+ }
+ else
+ {
+ if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->hQMetaData != NULL )
+ {
+ st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands );
+#else
+ ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands );
+#endif
+ }
+#endif
+
+ if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 )
+ {
+ st_ivas->hCPE[0]->element_brate = ivas_total_brate;
+ }
+
+ /* core-decoding of transport channels */
+ if ( st_ivas->nSCE == 1 )
+ {
+ if ( ( error = ivas_sce_dec( st_ivas, 0, &output[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->nCPE == 1 )
+ {
+ if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->nCPE > 1 )
+ {
+ if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+#ifdef DEBUG_SBA_AUDIO_DUMP
+ /* Dump audio signal after core-decoding */
+ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" );
+#endif
+ /* TCs remapping */
+ nchan_remapped = st_ivas->nchan_transport;
+ if ( st_ivas->sba_dirac_stereo_flag )
+ {
+ nchan_remapped = nchan_out;
+
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame );
+
+ if ( st_ivas->hSpar->hPCA != NULL )
+ {
+ ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output );
+ }
+
+ ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi,
+ ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) );
+ }
+
+ ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT );
+ }
+ else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) )
+ {
+ nchan_remapped = 1; /* Only one channel transported */
+ }
+
+ /* HP filtering */
+#ifndef DEBUG_SPAR_BYPASS_EVS_CODEC
+ for ( n = 0; n < nchan_remapped; n++ )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+#endif
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+ {
+ nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame );
+
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+#else
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
+#endif
+ {
+ ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame );
+ }
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else
+#endif
+ {
+ ivas_spar_dec_agc_pca( st_ivas, output, output_frame );
+ }
+ }
+
+ if ( st_ivas->ivas_format == MASA_FORMAT )
+ {
+ ivas_masa_prerender( st_ivas, output, output_frame );
+ }
+ else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+ {
+ float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */
+
+ for ( n = 0; n < nchan_remapped; n++ )
+ {
+ v_multc( output[n], gain, output[n], output_frame );
+ }
+ }
+ }
+ else if ( st_ivas->ivas_format == MC_FORMAT )
+ {
+ st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0];
+
+ /* LFE channel decoder */
+ if ( st_ivas->mc_mode == MC_MODE_MCT )
+ {
+ if ( st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg == NULL )
+ {
+ st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg = st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg;
+ }
+ ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch );
+ }
+
+ if ( st_ivas->mc_mode == MC_MODE_MCT )
+ {
+ if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame );
+
+ /* HP filtering */
+ for ( n = 0; n < st_ivas->nchan_transport; n++ )
+ {
+ if ( n != LFE_CHANNEL )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+ }
+ if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) )
+ {
+ if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) <= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) )
+ {
+ ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+ }
+ }
+ if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
+ {
+ if ( st_ivas->renderer_type == RENDERER_MC )
+ {
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f );
+ }
+ }
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
+ {
+ /* read Parametric MC parameters from the bitstream */
+ ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] );
+
+ if ( st_ivas->nCPE == 1 )
+ {
+ if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->nCPE > 1 )
+ {
+ if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /* HP filtering */
+ for ( n = 0; n < st_ivas->nchan_transport; n++ )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+
+ /* Rendering */
+ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO )
+ {
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output );
+ }
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
+ {
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */
+ }
+
+ /* read McMASA parameters from the bitstream */
+ if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ /* Decode the transport audio signals */
+ if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */
+ n = LFE_CHANNEL - 1;
+
+ /* Decode the separated channel to output[n] to be combined with the synthesized channels */
+ if ( ( error = ivas_sce_dec( st_ivas, 0, &output[n], output_frame, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */
+ if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 ||
+ output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 ||
+ output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) )
+ {
+ ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, output, output_frame, n, LFE_CHANNEL );
+ }
+ else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
+ {
+ /* Delay the separated channel to sync with the DirAC rendering */
+ delay_signal( output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size );
+ }
+ }
+ else
+ {
+ if ( st_ivas->nSCE == 1 )
+ {
+ if ( ( error = ivas_sce_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->nCPE == 1 )
+ {
+ if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+
+ if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */
+ {
+ ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, 1 );
+ }
+
+ /* HP filtering */
+ for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ )
+ {
+ hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs );
+ }
+
+ if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO )
+ {
+ ivas_mono_stereo_downmix_mcmasa( st_ivas, output, output_frame );
+ }
+ }
+ }
+
+
+ /*----------------------------------------------------------------*
+ * Write IVAS transport channels
+ *----------------------------------------------------------------*/
+
+ ivas_syn_output_f( p_output, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data );
+
+
+ /*----------------------------------------------------------------*
+ * Common updates
+ *----------------------------------------------------------------*/
+
+ if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */
+ {
+ st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate;
+ st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate;
+ }
+
+ if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */
+ {
+ st_ivas->ini_frame++;
+ }
+
+ if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */
+ {
+ st_ivas->ini_active_frame++;
+ }
+
+#ifdef DEBUG_MODE_INFO
+ dbgwrite( &st_ivas->bfi, sizeof( int16_t ), 1, output_frame, "res/bfi" );
+ dbgwrite( &st_ivas->BER_detect, sizeof( int16_t ), 1, output_frame, "res/BER_detect" );
+ {
+ float tmpF = ivas_total_brate / 1000.0f;
+ dbgwrite( &tmpF, sizeof( float ), 1, output_frame, "res/ivas_total_brate.dec" );
+ }
+#endif
+
+ pop_wmops();
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_feed_tc_to_renderer()
+ *
+ * Feed decoded transport channels and metadata to the IVAS JBM renderer routine
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_feed_tc_to_renderer(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */
+ int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/
+ float *data /* i : transport channels */
+)
+{
+
+ float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */
+ float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS];
+ int16_t n_render_timeslots;
+ int16_t n;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" );
+
+ for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ )
+ {
+ p_data_f[n] = &data_f[n][0];
+ }
+ ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f );
+ n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity;
+
+ if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER )
+ {
+ ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
+ }
+ else if ( st_ivas->ivas_format == STEREO_FORMAT )
+ {
+ ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
+ }
+ else if ( st_ivas->ivas_format == ISM_FORMAT )
+ {
+ /* Rendering */
+ if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ {
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots );
+ ivas_param_ism_params_to_masa_param_mapping( st_ivas );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f );
+ }
+ }
+ else /* ISM_MODE_DISC */
+ {
+ ivas_ism_dec_digest_tc( st_ivas );
+ }
+ }
+ else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
+ {
+ ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
+ }
+ else if ( st_ivas->ivas_format == MC_FORMAT )
+ {
+ if ( st_ivas->mc_mode == MC_MODE_MCT )
+ {
+ ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas );
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
+ {
+ ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f );
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
+ {
+ ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available );
+ }
+ }
+
+ pop_wmops();
+
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_dec_render()
+ *
+ * Principal IVAS JBM rendering routine
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const uint16_t nSamplesAsked, /* i : number of samples wanted */
+ uint16_t *nSamplesRendered, /* o : number of samples rendered */
+ uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */
+ int16_t *data /* o : output synthesis signal */
+)
+{
+ int16_t n, nchan_out;
+ int16_t nchan_transport;
+ float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */
+ int16_t nchan_remapped;
+ int32_t output_Fs;
+ AUDIO_CONFIG output_config;
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ float pan_left, pan_right;
+#endif
+ int16_t nSamplesAskedLocal;
+ ivas_error error;
+ float *p_output[MAX_OUTPUT_CHANNELS];
+ float *p_tc[MAX_TRANSPORT_CHANNELS];
+
+ error = IVAS_ERR_OK;
+
+ push_wmops( "ivas_dec_render" );
+
+ /*----------------------------------------------------------------*
+ * Initialization of local vars after struct has been set
+ *----------------------------------------------------------------*/
+
+ output_Fs = st_ivas->hDecoderConfig->output_Fs;
+ nchan_out = st_ivas->hDecoderConfig->nchan_out;
+ nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm;
+ output_config = st_ivas->hDecoderConfig->output_config;
+ nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard;
+
+ for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ )
+ {
+ p_output[n] = &output[n][0];
+ }
+
+ for ( n = 0; n < st_ivas->hTcBuffer->nchan_transport_internal; n++ )
+ {
+ p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered];
+ }
+
+ /*----------------------------------------------------------------*
+ * Rendering
+ *----------------------------------------------------------------*/
+
+ if ( st_ivas->ivas_format == UNDEFINED_FORMAT )
+ {
+ assert( 0 );
+ }
+ else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER )
+ {
+ ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output );
+ }
+ else if ( st_ivas->ivas_format == STEREO_FORMAT )
+ {
+ /* Rendering */
+ if ( st_ivas->renderer_type == RENDERER_MC )
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output );
+ }
+ }
+ else if ( st_ivas->ivas_format == ISM_FORMAT )
+ {
+ /* Rendering */
+ if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ {
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output );
+ }
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+ pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f;
+ pan_right = 1.f - pan_left;
+ v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered );
+ v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered );
+ }
+#endif
+ else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
+
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ /* Convert CICP19 -> Ambisonics */
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
+ }
+ }
+ }
+ else /* ISM_MODE_DISC */
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+
+ /* Loudspeaker or Ambisonics rendering */
+ if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */
+ ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered );
+ }
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f;
+ pan_right = 1.f - pan_left;
+ v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered );
+ v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered );
+ }
+#endif
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
+ {
+ /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */
+ ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order );
+ }
+
+ /* Binaural rendering */
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
+ {
+ if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL,
+ NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output );
+ }
+#ifdef DEBUGGING
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ ivas_binaural_cldfb_sf( st_ivas, *nSamplesRendered, p_output );
+ }
+#endif
+ }
+ }
+ else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
+ {
+ nchan_remapped = nchan_transport;
+
+ /* Loudspeakers, Ambisonics or Binaural rendering */
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
+ }
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT )
+#else
+ else if ( st_ivas->ivas_format == MASA_FORMAT )
+#endif
+ {
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC )
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+ for ( n = 0; n < nchan_remapped; n++ )
+ {
+ mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered );
+ }
+
+ if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->renderer_type == RENDERER_DIRAC )
+ {
+ ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
+ }
+ }
+ else /* SBA_MODE_SPAR */
+ {
+ ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
+ }
+ }
+ else if ( st_ivas->ivas_format == MC_FORMAT )
+ {
+ if ( st_ivas->mc_mode == MC_MODE_MCT )
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+ if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) )
+ {
+ ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE );
+ }
+
+ /* Rendering */
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData,
+ &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_MC )
+ {
+ *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal );
+ ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
+ {
+ if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output );
+ }
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
+ {
+ ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
+ {
+ int16_t offset = st_ivas->hDirAC->slots_rendered * st_ivas->hDirAC->slot_size;
+ nchan_remapped = st_ivas->nchan_transport;
+
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */
+ {
+ ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output );
+
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ /* we still need to copy the separate channel if available */
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
+ }
+
+ ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f );
+ }
+ else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) )
+ {
+ for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ )
+ {
+ set_zero( output[n], *nSamplesRendered );
+ }
+ }
+ }
+
+ /* copy discrete C and TD LFE from internal TC to output */
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 ||
+ output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 ||
+ output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) )
+ {
+ mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL] + offset, output[LFE_CHANNEL], *nSamplesRendered );
+ mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
+ }
+ else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 )
+ {
+ /* Delay the separated channel to sync with the DirAC rendering */
+ mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered );
+ }
+ }
+ }
+ }
+
+ /*----------------------------------------------------------------*
+ * Write IVAS output channels
+ * - compensation for saturation
+ * - float to integer conversion
+ *----------------------------------------------------------------*/
+
+ st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered;
+ st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered;
+
+ if ( st_ivas->hTcBuffer->n_samples_discard > 0 )
+ {
+ for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ )
+ {
+ p_output[n] += st_ivas->hTcBuffer->n_samples_discard;
+ }
+ *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard;
+ st_ivas->hTcBuffer->n_samples_discard = 0;
+ }
+
+ ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect );
+
+#ifdef DEBUGGING
+ st_ivas->noClipping +=
+#endif
+ ivas_syn_output( p_output, *nSamplesRendered, nchan_out, data );
+
+ *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available;
+
+ pop_wmops();
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_dec_flush_renderer()
+ *
+ * Flush samples if renderer granularity changes on a bitrate change
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_flush_renderer(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t tc_granularity_new, /* i : new renderer granularity */
+ const RENDERER_TYPE renderer_type_old, /* i : old renderer type */
+ const AUDIO_CONFIG intern_config_old, /* i : old internal config */
+ const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */
+ const MC_MODE mc_mode_old, /* i : old MC mode */
+ const ISM_MODE ism_mode_old, /* i : old ISM mode */
+ uint16_t *nSamplesRendered, /* o : number of samples flushed */
+ int16_t *data /* o : rendered samples */
+)
+{
+ ivas_error error;
+ int16_t n_samples_still_available;
+ int16_t n_slots_still_available;
+ int16_t n_samples_to_render;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+ float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
+ float *p_output[MAX_CICP_CHANNELS];
+
+ error = IVAS_ERR_OK;
+
+ *nSamplesRendered = 0;
+ hTcBuffer = st_ivas->hTcBuffer;
+
+ /* get number of possible slots in new granularity */
+ n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered;
+ n_slots_still_available = n_samples_still_available / tc_granularity_new;
+ *nSamplesRendered = n_slots_still_available * tc_granularity_new;
+ n_samples_to_render = *nSamplesRendered;
+ n_samples_still_available -= n_samples_to_render;
+ assert( n_samples_still_available < tc_granularity_new );
+
+ if ( n_slots_still_available )
+ {
+ int16_t ch_idx;
+
+ /* render what is still there with zero padding */
+ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ )
+ {
+ /* move it at the beginning of the TC buffer with zero padding */
+ mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render );
+ set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render );
+ mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available );
+ }
+
+ /* simple change of the slot info */
+ hTcBuffer->num_slots = 1;
+ hTcBuffer->nb_subframes = 1;
+ hTcBuffer->subframes_rendered = 0;
+ hTcBuffer->slots_rendered = 0;
+ hTcBuffer->subframe_nbslots[0] = 1;
+ hTcBuffer->n_samples_buffered = hTcBuffer->n_samples_granularity + n_samples_still_available;
+ hTcBuffer->n_samples_available = 0;
+ hTcBuffer->n_samples_flushed = n_samples_to_render;
+ hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity;
+
+ for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ )
+ {
+ p_output[ch_idx] = output[ch_idx];
+ }
+
+ if ( st_ivas->ivas_format == ISM_FORMAT )
+ {
+ if ( ism_mode_old == ISM_MODE_DISC )
+ {
+ /* Binaural rendering */
+ if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD )
+ {
+ if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */
+ set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity );
+
+ ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity );
+
+ if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL,
+ NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, p_output, p_output );
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" );
+ }
+ }
+ else if ( st_ivas->ivas_format == MC_FORMAT )
+ {
+ if ( mc_mode_old == MC_MODE_MCT )
+ {
+ if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, hIntSetupOld,
+ st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output );
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD )
+ {
+ if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+
+ ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output );
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" );
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" );
+ }
+ }
+
+ /* Only write out the valid data*/
+ ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect );
+
+#ifdef DEBUGGING
+ st_ivas->noClipping +=
+#endif
+ ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, data );
+
+
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_set_discard_samples()
+ *
+ * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_set_discard_samples(
+ Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */
+)
+{
+ int16_t nMaxSlotsPerSubframe, nSlotsInFirstSubframe;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ /* render first frame with front zero padding and discarding those samples */
+ nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
+ nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1];
+ if ( nSlotsInFirstSubframe > 0 )
+ {
+ st_ivas->hTcBuffer->n_samples_discard = ( nMaxSlotsPerSubframe - nSlotsInFirstSubframe ) * st_ivas->hTcBuffer->n_samples_granularity;
+ /* set last subframes number to max to ensure correct continuation */
+ st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe;
+ }
+
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_adapted_linear_interpolator()
+ *
+ * Get an interpolator that is adapted to time scale modified IVAS frame
+ *--------------------------------------------------------------------------*/
+
+void ivas_jbm_dec_get_adapted_linear_interpolator(
+ const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */
+ const int16_t interp_length, /* i : length of the interpolator to be created */
+ float *interpolator /* o : the interpolator */
+)
+{
+ int16_t jbm_segment_len, idx;
+ float dec;
+#ifdef DEBUGGING
+ assert( default_interp_length % 2 == 0 );
+#endif
+
+ jbm_segment_len = ( default_interp_length >> 1 );
+ dec = 1.0f / default_interp_length;
+
+ interpolator[interp_length - 1] = 1.0f;
+ for ( idx = interp_length - 2; idx >= jbm_segment_len; idx-- )
+ {
+ interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec );
+ }
+
+ if ( interpolator[idx + 1] > 0.0f )
+ {
+ dec = interpolator[idx + 1] / ( jbm_segment_len + 1 );
+ for ( ; idx >= 0; idx-- )
+ {
+ interpolator[idx] = interpolator[idx + 1] - dec;
+ }
+ }
+ else
+ {
+ set_f( interpolator, 0.0f, idx + 1 );
+ }
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_adapted_subframes()
+ *
+ * Get an interpolator that is adapted to time scale modified IVAS frame
+ *--------------------------------------------------------------------------*/
+
+void ivas_jbm_dec_get_adapted_subframes(
+ const int16_t nCldfbTs, /* i : number of time slots in the current frame */
+ int16_t *subframe_nbslots, /* i/o: subframe grid */
+ int16_t *nb_subframes /* i/o: number of subframes in the frame */
+)
+{
+ uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe;
+ uint16_t nCldfbSlotsLocal = nCldfbTs;
+
+ /* get last subframe size from previous frame, determine how many slots have to be processed
+ in the first subframe (i.e. potential leftover of a 5ms subframe) */
+ nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] );
+ *nb_subframes = 0;
+ if ( nSlotsInFirstSubframe > 0 )
+ {
+ *nb_subframes = 1;
+ nCldfbSlotsLocal -= nSlotsInFirstSubframe;
+ }
+
+ *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME );
+ nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME;
+
+ set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes );
+
+ if ( nSlotsInFirstSubframe > 0 )
+ {
+ subframe_nbslots[0] = nSlotsInFirstSubframe;
+ }
+
+ if ( nSlotsInLastSubframe > 0 )
+ {
+ subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe;
+ }
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_adapted_linear_interpolator()
+ *
+ * Get an meta data map adapted to a time scale modified IVAS frame
+ *--------------------------------------------------------------------------*/
+
+void ivas_jbm_dec_get_md_map(
+ const int16_t default_len, /* i : default frame length in metadata slots */
+ const int16_t len, /* i : length of the modfied frames in metadata slots */
+ const int16_t subframe_len, /* i : default length of a subframe */
+ const int16_t offset, /* i : current read offset into the md buffer */
+ const int16_t buf_len, /* i : length of the metadata buffer */
+ int16_t *map /* o : metadata index map */
+)
+{
+ int16_t jbm_segment_len, map_idx, src_idx, src_idx_map;
+ float dec, src_idx_f;
+
+#ifdef DEBUGGING
+ assert( default_len % 2 == 0 );
+#endif
+ jbm_segment_len = ( default_len >> 1 );
+ dec = 1.0f / default_len;
+
+ for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- )
+ {
+ src_idx_map = max( 0, src_idx / subframe_len );
+ map[map_idx] = ( offset + src_idx_map ) % buf_len;
+ }
+
+ /* changed part (first segment), interpolate index to parameters
+ (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */
+ if ( src_idx >= 0 )
+ {
+ dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len );
+ src_idx_f = (float) ( src_idx + 1 ) - dec;
+ for ( ; map_idx >= 0; map_idx-- )
+ {
+ src_idx = max( 0, ( (int16_t) round_f( src_idx_f ) ) / subframe_len );
+ map[map_idx] = ( offset + src_idx ) % buf_len;
+ src_idx_f -= dec;
+ }
+ }
+ else
+ {
+ set_s( map, offset, map_idx + 1 );
+ }
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_num_tc_channels()
+ *
+ * Get the number of transport channels provided by the JBM transport channel decode function
+ *--------------------------------------------------------------------------*/
+
+int16_t ivas_jbm_dec_get_num_tc_channels(
+ Decoder_Struct *st_ivas /* i : IVAS decoder handle */
+)
+{
+ int16_t num_tc;
+ int32_t ivas_total_brate;
+ AUDIO_CONFIG output_config;
+
+ if ( st_ivas->renderer_type == RENDERER_DISABLE )
+ {
+ num_tc = st_ivas->hDecoderConfig->nchan_out;
+ }
+ else
+ {
+ num_tc = st_ivas->nchan_transport;
+ }
+ output_config = st_ivas->hDecoderConfig->output_config;
+
+ ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
+ if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 )
+ {
+ num_tc = 1;
+ }
+ else if ( st_ivas->ivas_format == ISM_FORMAT )
+ {
+ if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX )
+ {
+ num_tc = 1;
+ }
+ }
+ else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT )
+ {
+ if ( st_ivas->sba_dirac_stereo_flag )
+ {
+ num_tc = CPE_CHANNELS;
+ }
+ else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) )
+ {
+ num_tc = 1; /* Only one channel transported */
+ }
+
+ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 )
+ {
+ num_tc = CPE_CHANNELS;
+ }
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+ {
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && num_tc >= 3 ) ||
+ ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && num_tc == 3 ) )
+#else
+ if ( ( st_ivas->sba_planar && num_tc >= 3 ) || ( num_tc == 3 ) )
+#endif
+ {
+ num_tc++;
+ }
+ }
+ }
+ else if ( st_ivas->ivas_format == MC_FORMAT )
+ {
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO )
+ {
+ num_tc = 1;
+ }
+ else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO )
+ {
+ num_tc = 2;
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_MCT )
+ {
+ /* do all static dmx already in the TC decoder if less channels than transported... */
+ if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) )
+ {
+ if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) > ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) )
+ {
+ num_tc = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+ }
+ }
+ else if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
+ {
+ num_tc = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
+ }
+ }
+ else if ( st_ivas->mc_mode == MC_MODE_MCMASA )
+ {
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ num_tc++;
+ }
+ if ( st_ivas->hOutSetup.separateChannelEnabled && ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 ||
+ output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 ||
+ output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) )
+ {
+ /* LFE is synthesized in TD with the TCs*/
+ num_tc++;
+ }
+ }
+ }
+
+ return num_tc;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_copy_tc()
+ *
+ * Copy interleaved transport chnannels to the correct buffers, update the TC
+ * buffer handle
+ *--------------------------------------------------------------------------*/
+
+static void ivas_jbm_dec_copy_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nSamplesForRendering, /* i : number of samples to digest */
+ int16_t *nSamplesResidual, /* o : number of samples that will be left for the next frame */
+ float *data, /* i : (interleaved) transport channel samples */
+ float *tc_digest_f[] /* o : samples that will be directly digested (e.g. by CLDFB) */
+)
+{
+ int16_t ch;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+ int16_t n_samples_still_available, m;
+ int16_t n_ch_full_copy;
+ int16_t n_ch_res_copy;
+
+ hTcBuffer = st_ivas->hTcBuffer;
+ n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered;
+ hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard;
+ hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity );
+ *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available;
+ n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full );
+ n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full;
+
+ for ( ch = 0; ch < n_ch_full_copy; ch++ )
+ {
+ set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard );
+ mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available );
+ for ( m = 0; m < nSamplesForRendering; m++ )
+ {
+ hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch];
+ }
+ }
+
+ if ( n_ch_res_copy > 0 )
+ {
+ for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ )
+ {
+ mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available );
+ for ( m = 0; m < nSamplesForRendering; m++ )
+ {
+ tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch];
+ }
+ mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual );
+ }
+ }
+
+ hTcBuffer->n_samples_rendered = 0;
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_render_granularity()
+ *
+ *
+ *--------------------------------------------------------------------------*/
+
+/*! r: render granularity */
+int16_t ivas_jbm_dec_get_render_granularity(
+ const RENDERER_TYPE rendererType, /* i : renderer type */
+ const int32_t output_Fs /* i : sampling rate */
+)
+{
+ int16_t render_granularity;
+
+ if ( rendererType == RENDERER_BINAURAL_OBJECTS_TD || rendererType == RENDERER_BINAURAL_MIXER_CONV || rendererType == RENDERER_BINAURAL_MIXER_CONV_ROOM )
+ {
+ render_granularity = NS2SA( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES );
+ }
+ else
+ {
+ render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS );
+ }
+
+ return render_granularity;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_tc_buffer_open()
+ *
+ * open and initialize JBM transport channel buffer
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_tc_buffer_open(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */
+ const int16_t nchan_transport_jbm, /* i : number of real transport channels */
+ const int16_t nchan_transport_internal, /* i : number of totally buffered channels */
+ const int16_t nchan_full, /* i : number of channels to fully store */
+ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */
+)
+{
+ int16_t nsamp_to_allocate;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+ ivas_error error;
+ int16_t nMaxSlotsPerSubframe;
+ int16_t nchan_residual;
+ int16_t ch_idx;
+
+ error = IVAS_ERR_OK;
+
+ /*-----------------------------------------------------------------*
+ * prepare library opening
+ *-----------------------------------------------------------------*/
+
+ if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
+ }
+
+ hTcBuffer->tc_buffer_mode = tc_buffer_mode;
+ hTcBuffer->nchan_transport_jbm = nchan_transport_jbm;
+ hTcBuffer->nchan_transport_internal = nchan_transport_internal;
+ hTcBuffer->nchan_buffer_full = nchan_full;
+ nchan_residual = nchan_transport_internal - nchan_full;
+ hTcBuffer->n_samples_granularity = n_samples_granularity;
+ hTcBuffer->n_samples_available = 0;
+ hTcBuffer->n_samples_buffered = 0;
+ hTcBuffer->n_samples_rendered = 0;
+ hTcBuffer->slots_rendered = 0;
+ hTcBuffer->subframes_rendered = 0;
+ hTcBuffer->n_samples_discard = 0;
+ hTcBuffer->n_samples_flushed = 0;
+ hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
+ nsamp_to_allocate = 0;
+ nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity;
+ hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES;
+ set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES );
+
+ if ( hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_NONE )
+ {
+ hTcBuffer->tc_buffer = NULL;
+ for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = NULL;
+ }
+ }
+ else
+ {
+ int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 );
+ int16_t n_samp_residual = hTcBuffer->n_samples_granularity - 1;
+ int32_t offset;
+
+ nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full;
+ nsamp_to_allocate += nchan_residual * n_samp_residual;
+
+ if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
+ }
+ set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate );
+
+ offset = 0;
+ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset];
+ offset += n_samp_full;
+ }
+ for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset];
+ offset += n_samp_residual;
+ }
+ for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = NULL;
+ }
+ }
+
+ st_ivas->hTcBuffer = hTcBuffer;
+
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_tc_buffer_reconfigure()
+ *
+ * open and initialize JBM transport channel buffer
+ *--------------------------------------------------------------------------*/
+
+ivas_error ivas_jbm_dec_tc_buffer_reconfigure(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */
+ const int16_t nchan_transport_jbm, /* i : new number of real transport channels */
+ const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */
+ const int16_t nchan_full, /* i : new number of channels to fully store */
+ const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */
+)
+{
+ ivas_error error;
+ int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual;
+ int16_t ch_idx;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+
+ error = IVAS_ERR_OK;
+
+ hTcBuffer = st_ivas->hTcBuffer;
+
+ /* if granularity changes, adapt subframe_nb_slots */
+ if ( n_samples_granularity != hTcBuffer->n_samples_granularity )
+ {
+#ifdef DEBUGGING
+ int16_t nMaxSlotsPerSubframeOld;
+#endif
+ int16_t nMaxSlotsPerSubframeNew;
+
+ nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity;
+#ifdef DEBUGGING
+ nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
+ assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld );
+ if ( n_samples_granularity < hTcBuffer->n_samples_granularity )
+ {
+ assert( ( hTcBuffer->n_samples_granularity % n_samples_granularity ) == 0 );
+ }
+ else
+ {
+ assert( ( n_samples_granularity % hTcBuffer->n_samples_granularity ) == 0 );
+ }
+#endif
+ /* if samples were flushed, take that into account here */
+ if ( n_samples_granularity < hTcBuffer->n_samples_granularity && hTcBuffer->n_samples_flushed > 0 )
+ {
+ hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = hTcBuffer->n_samples_flushed / n_samples_granularity;
+ hTcBuffer->n_samples_flushed = 0;
+ }
+ else
+ {
+ hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = nMaxSlotsPerSubframeNew;
+ }
+ }
+
+ hTcBuffer->tc_buffer_mode = tc_buffer_mode;
+ hTcBuffer->nchan_transport_jbm = nchan_transport_jbm;
+ hTcBuffer->nchan_transport_internal = nchan_transport_internal;
+ hTcBuffer->nchan_buffer_full = nchan_full;
+ nchan_residual = nchan_transport_internal - nchan_full;
+ hTcBuffer->n_samples_granularity = n_samples_granularity;
+#ifdef DEBUGGING
+ /* what is remaining from last frames needs always be smaller than n_samples_granularity */
+ assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity );
+#endif
+
+ /* realloc buffers */
+ free( hTcBuffer->tc_buffer );
+ n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 );
+ n_samp_residual = hTcBuffer->n_samples_granularity - 1;
+ nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full;
+ nsamp_to_allocate += nchan_residual * n_samp_residual;
+
+ if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) );
+ }
+ set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate );
+
+ offset = 0;
+ for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset];
+ offset += n_samp_full;
+ }
+ for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset];
+ offset += n_samp_residual;
+ }
+ for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ )
+ {
+ hTcBuffer->tc[ch_idx] = NULL;
+ }
+
+ return error;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_tc_buffer_playout()
+ *
+ *
+ *--------------------------------------------------------------------------*/
+
+static void ivas_jbm_dec_tc_buffer_playout(
+ Decoder_Struct *st_ivas,
+ const uint16_t nSamplesAsked,
+ uint16_t *nSamplesRendered,
+ float *output[] )
+{
+
+ int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf;
+
+ slot_size = st_ivas->hTcBuffer->n_samples_granularity;
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size );
+ st_ivas->hTcBuffer->slots_rendered += slots_to_render;
+ *nSamplesRendered = (uint16_t) slots_to_render * slot_size;
+ first_sf = st_ivas->hTcBuffer->subframes_rendered;
+ last_sf = first_sf;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+
+ for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ )
+ {
+ mvr2r( st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output[ch_idx], *nSamplesRendered );
+ }
+
+ st_ivas->hTcBuffer->subframes_rendered = last_sf;
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_tc_buffer_close()
+ *
+ * Close JBM transport channel buffer
+ *--------------------------------------------------------------------------*/
+
+void ivas_jbm_dec_tc_buffer_close(
+ DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */
+)
+{
+ int16_t i;
+
+ if ( *phTcBuffer != NULL )
+ {
+ for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ )
+ {
+ ( *phTcBuffer )->tc[i] = NULL;
+ }
+ if ( ( *phTcBuffer )->tc_buffer != NULL )
+ {
+ free( ( *phTcBuffer )->tc_buffer );
+ ( *phTcBuffer )->tc_buffer = NULL;
+ }
+
+ free( *phTcBuffer );
+ *phTcBuffer = NULL;
+ }
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_td_renderers_adapt_subframes()
+ *
+ * Close JBM transport channel buffer
+ *--------------------------------------------------------------------------*/
+
+void ivas_jbm_dec_td_renderers_adapt_subframes(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+ int16_t nMaxSlotsPerSubframe, nSlotsAvailable;
+ uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe;
+
+ nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity;
+ nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity;
+ st_ivas->hTcBuffer->num_slots = nSlotsAvailable;
+ st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity;
+ nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1];
+ st_ivas->hTcBuffer->nb_subframes = 0;
+
+ if ( nSlotsInFirstSubframe > 0 )
+ {
+ st_ivas->hTcBuffer->nb_subframes = 1;
+ nSlotsAvailable -= nSlotsInFirstSubframe;
+ }
+ st_ivas->hTcBuffer->nb_subframes += (int16_t) ceilf( (float) nSlotsAvailable / (float) nMaxSlotsPerSubframe );
+ nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe;
+ set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes );
+
+ if ( nSlotsInFirstSubframe > 0 )
+ {
+ st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe;
+ }
+
+ if ( nSlotsInLastSubframe > 0 )
+ {
+ st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe;
+ }
+
+ st_ivas->hTcBuffer->slots_rendered = 0;
+ st_ivas->hTcBuffer->subframes_rendered = 0;
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------------*
+ * ivas_jbm_dec_get_tc_buffer_mode()
+ *
+ *
+ *--------------------------------------------------------------------------*/
+
+TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+ TC_BUFFER_MODE buffer_mode;
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+
+ switch ( st_ivas->renderer_type )
+ {
+ /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */
+ case RENDERER_DISABLE:
+ case RENDERER_MCMASA_MONO_STEREO:
+ case RENDERER_MONO_DOWNMIX:
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+ break;
+ case RENDERER_TD_PANNING:
+ case RENDERER_BINAURAL_OBJECTS_TD:
+ case RENDERER_BINAURAL_FASTCONV:
+ case RENDERER_BINAURAL_FASTCONV_ROOM:
+ case RENDERER_BINAURAL_PARAMETRIC:
+ case RENDERER_BINAURAL_PARAMETRIC_ROOM:
+ case RENDERER_STEREO_PARAMETRIC:
+ case RENDERER_DIRAC:
+ case RENDERER_PARAM_ISM:
+ case RENDERER_BINAURAL_MIXER_CONV:
+ case RENDERER_BINAURAL_MIXER_CONV_ROOM:
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ case RENDERER_NON_DIEGETIC_DOWNMIX:
+#endif
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ break;
+ case RENDERER_MC_PARAMMC:
+ if ( st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO )
+ {
+ buffer_mode = TC_BUFFER_MODE_BUFFER; /* TCs are already the DMX to mono or stereo */
+ }
+ else
+ {
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ }
+ break;
+ case RENDERER_MC:
+ if ( ivas_jbm_dec_get_num_tc_channels( st_ivas ) != st_ivas->hDecoderConfig->nchan_out )
+ {
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ }
+ break;
+ case RENDERER_SBA_LINEAR_ENC:
+ if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) )
+ {
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+ }
+ else
+ {
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ }
+ break;
+ case RENDERER_SBA_LINEAR_DEC:
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
+#endif
+ {
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+ }
+ else
+ {
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ }
+ break;
+#ifdef DEBUGGING
+ default:
+ assert( 0 );
+#endif
+ }
+
+ return buffer_mode;
+}
+#endif
diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c
index 5b0223a9bede4e37fc715c8c1178154926ccdaa7..8d6cebe036d31c4b4182ef6e1f3b259feaad6f2c 100644
--- a/lib_dec/ivas_masa_dec.c
+++ b/lib_dec/ivas_masa_dec.c
@@ -47,22 +47,23 @@
/*-----------------------------------------------------------------------*
* Local constants
*-----------------------------------------------------------------------*/
-#define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */
-#ifdef FIX_350_MASA_DELAY_COMP
-#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
-#endif
+
+#define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */
+#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
+
/*-----------------------------------------------------------------------*
* Local function prototypes
*-----------------------------------------------------------------------*/
-
+#ifndef HR_METADATA
static int16_t quantize_theta( float x, int16_t no_cb, float *xhat );
static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 );
static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n );
+#endif
+
static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 );
-#ifdef FIX_350_MASA_DELAY_COMP
+
static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport );
-#endif
static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData );
@@ -195,8 +196,36 @@ ivas_error ivas_masa_decode(
/* Remove already read bits from the bit budget */
hQMetaData->metadata_max_bits -= *nb_bits_read;
-
- *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos );
+#ifdef HR_METADATA
+ if ( ivas_total_brate >= IVAS_384k )
+ {
+ if ( ivas_total_brate >= IVAS_512k )
+ {
+ *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4
+#ifdef FIX_HBR_MASAMETA
+ ,
+ hMasa->config.numCodingBands
+#endif
+ );
+ }
+ else
+ {
+ *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3
+#ifdef FIX_HBR_MASAMETA
+ ,
+ hMasa->config.numCodingBands
+#endif
+ );
+ }
+ }
+ else
+ {
+#endif
+ *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos,
+ 0 );
+#ifdef HR_METADATA
+ }
+#endif
/* Get direction decoding quality. EC 1 and 2 are handled by the default value. */
if ( hQMetaData->ec_flag == 2 )
@@ -258,8 +287,11 @@ ivas_error ivas_masa_decode(
}
tmp_elem_mode = -1;
+#ifndef SBA_MODE_CLEAN_UP
*nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format, SBA_MODE_NONE );
-
+#else
+ *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format );
+#endif
if ( st_ivas->nchan_transport == 2 )
{
assert( st_ivas->nCPE > 0 );
@@ -279,7 +311,14 @@ ivas_error ivas_masa_decode(
}
if ( st_ivas->hDirAC != NULL )
{
- ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE, 0 );
+ ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate,
+#ifndef SBA_MODE_CLEAN_UP
+ SBA_MODE_NONE,
+#else
+ ivas_format,
+#endif
+ 0,
+ 0 );
}
st->next_bit_pos = next_bit_pos_orig;
@@ -308,12 +347,10 @@ ivas_error ivas_masa_decode(
}
}
-#ifdef FIX_350_MASA_DELAY_COMP
if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
{
create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport );
}
-#endif
return error /* *nb_bits_read*/;
}
@@ -355,19 +392,15 @@ ivas_error ivas_masa_dec_open(
}
generate_gridEq( hMasa->data.sph_grid16 );
-#ifdef FIX_350_MASA_DELAY_COMP
if ( ( hMasa->data.extOutMeta = (MASA_DECODER_EXT_OUT_META *) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL )
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) );
}
-#endif
}
else
{
hMasa->data.sph_grid16 = NULL;
-#ifdef FIX_350_MASA_DELAY_COMP
hMasa->data.extOutMeta = NULL;
-#endif
}
if ( st_ivas->mc_mode == MC_MODE_MCMASA )
@@ -381,6 +414,27 @@ ivas_error ivas_masa_dec_open(
st_ivas->hMasa = hMasa;
+#ifdef JBM_TSM_ON_TCS
+ /* allocate transport channels*/
+ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC )
+ {
+ int16_t nchan_to_allocate;
+ TC_BUFFER_MODE buffer_mode;
+
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) )
+ {
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+ }
+
+ nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif /* JBM_TMS_ON_TCS*/
+
return error;
}
@@ -411,13 +465,11 @@ void ivas_masa_dec_close(
hMasa->data.sph_grid16 = NULL;
}
-#ifdef FIX_350_MASA_DELAY_COMP
if ( hMasa->data.extOutMeta != NULL )
{
free( hMasa->data.extOutMeta );
hMasa->data.extOutMeta = NULL;
}
-#endif
if ( hMasa->hMasaLfeSynth != NULL )
{
@@ -464,6 +516,10 @@ static ivas_error ivas_masa_dec_config(
{
int16_t i;
MASA_DECODER_HANDLE hMasa;
+#ifdef FIX_HBR_MASAMETA
+ uint8_t maxBand;
+ int16_t maxBin;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -472,6 +528,19 @@ static ivas_error ivas_masa_dec_config(
ivas_masa_set_elements( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE );
ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) );
+
+#ifdef HR_METADATA
+ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k )
+ {
+ hMasa->config.mergeRatiosOverSubframes = 0;
+ /* initialize spherical grid */
+ if ( hMasa->data.sph_grid16 == NULL )
+ {
+ hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) );
+ generate_gridEq( hMasa->data.sph_grid16 );
+ }
+ }
+#endif
st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits;
st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping;
st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport;
@@ -501,7 +570,26 @@ static ivas_error ivas_masa_dec_config(
ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format );
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
+#ifdef FIX_HBR_MASAMETA
+ /* Find maximum band usable */
+ maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH );
+ maxBand = 0;
+ while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
+ {
+ maxBand++;
+ }
+ maxBand--;
+
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
+ {
+ /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */
+ masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta );
+ }
+ else
+ {
+ masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL );
+ }
+#else
if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
{
/* need to apply the sampling rate correction also for the EXT output MASA meta buffer */
@@ -511,8 +599,6 @@ static ivas_error ivas_masa_dec_config(
{
masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL );
}
-#else
- masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs );
#endif
return error;
@@ -531,7 +617,11 @@ void ivas_masa_prerender(
const int16_t output_frame /* i : output frame length per channel */
)
{
+#ifdef FIX_490_MASA_2TC_LBR_DTX
+ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE )
+#else
if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 )
+#endif
{
if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL )
{
@@ -553,7 +643,7 @@ void ivas_masa_prerender(
/*-------------------------------------------------------------------*
* Local functions
*-------------------------------------------------------------------*/
-
+#ifndef HR_METADATA
/* !r: index of quantized value */
static int16_t quantize_theta(
float x, /* i : theta value to be quantized */
@@ -722,7 +812,7 @@ static uint16_t index_theta_phi_16(
return idx_sph;
}
-
+#endif
static void index_16bits(
IVAS_QMETADATA_HANDLE hQMetaData,
@@ -737,8 +827,8 @@ static void index_16bits(
{
for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ )
{
- hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( hQMetaData->q_direction[d].band_data[band].elevation[block],
- hQMetaData->q_direction[d].band_data[band].azimuth[block], Sph_Grid16 );
+ hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ),
+ &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 );
}
}
}
@@ -1093,6 +1183,7 @@ ivas_error ivas_masa_dec_reconfigure(
uint16_t *bit_stream;
Decoder_State **sts;
int32_t ivas_total_brate, last_ivas_total_brate;
+ int16_t numCldfbAnalyses_old, numCldfbSyntheses_old;
ivas_error error;
error = IVAS_ERR_OK;
@@ -1100,6 +1191,26 @@ ivas_error ivas_masa_dec_reconfigure(
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
+ ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
+
+ /* renderer might have changed, reselect */
+ ivas_renderer_select( st_ivas );
+
+ if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->hDirAC == NULL )
+ {
+ /* init a new DirAC dec */
+ if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL )
+ {
+ /* close unnecessary DirAC dec */
+ ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
+ }
+ /* possible reconfigure is done later */
+
/*-----------------------------------------------------------------*
* Allocate and initialize SCE/CPE and other handles
*-----------------------------------------------------------------*/
@@ -1156,34 +1267,85 @@ ivas_error ivas_masa_dec_reconfigure(
}
}
}
+ if ( st_ivas->hDiracDecBin != NULL )
+ {
+ /* regularization factor is bitrate-dependent */
+ st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
+ }
+ /*-----------------------------------------------------------------*
+ * TD Decorrelator
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDiracDecBin != NULL )
+ {
+ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * CLDFB instances
+ *-----------------------------------------------------------------*/
+
+ if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /*-----------------------------------------------------------------*
+ * Set-up MASA coding elements and bitrates
+ *-----------------------------------------------------------------*/
ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp );
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active == 1 )
+ {
+ int16_t tc_nchan_to_allocate;
+ int16_t tc_nchan_transport;
+ TC_BUFFER_MODE buffer_mode_new;
+
+ buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
+ tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+
+ tc_nchan_to_allocate = tc_nchan_transport;
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
+ }
+
+ if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode )
+ {
+ if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+#endif
+
return error;
}
-/*-------------------------------------------------------------------*
- * ivas_spar_param_to_masa_param_mapping()
- *
- * Determine MASA metadata from the SPAR metadata
- *-------------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+#endif
void ivas_spar_param_to_masa_param_mapping(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
- const int16_t firstSubframe, /* i : First subframe to map */
- const int16_t nSubframes /* i : Number of subframes to map */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
+ const int16_t subframe /* i : Subframe to map */
)
{
- int16_t i, j, sf, band, bin, slot, ch, nBins, nchan_transport;
+ int16_t i, j, band, bin, slot, ch, nBins, nchan_transport;
int16_t mixer_mat_index;
int16_t dirac_write_idx;
DIRAC_DEC_HANDLE hDirAC;
DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist;
- float mixer_mat_sf_bands_real[MAX_PARAM_SPATIAL_SUBFRAMES][SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS];
- float mixer_mat_sf_bins_real[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS];
+ float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS];
+ float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS];
int16_t *band_grouping;
int16_t band_start, band_end;
float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX];
@@ -1193,6 +1355,11 @@ void ivas_spar_param_to_masa_param_mapping(
float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS];
float Iy, Iz, Ix, E, azi, ele, I, ratio;
float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum;
+#ifdef JBM_TSM_ON_TCS
+ int16_t slot_idx, slot_idx_start, sf;
+ SPAR_DEC_HANDLE hSpar;
+ float slot_fac;
+#endif
/* Set values */
hDirAC = st_ivas->hDirAC;
@@ -1200,7 +1367,12 @@ void ivas_spar_param_to_masa_param_mapping(
hDiffuseDist = st_ivas->hDirAC->hDiffuseDist;
nchan_transport = st_ivas->nchan_transport;
band_grouping = hDirAC->band_grouping;
+#ifdef JBM_TSM_ON_TCS
+ hSpar = st_ivas->hSpar;
+ dirac_write_idx = hDirAC->render_to_md_map[subframe];
+#else
dirac_write_idx = hDirAC->dirac_read_idx; /* Mixing matrices, from which MASA meta is determined, already have the delay compensation */
+#endif
/* Init arrays */
for ( i = 0; i < FOA_CHANNELS; i++ )
@@ -1209,54 +1381,75 @@ void ivas_spar_param_to_masa_param_mapping(
}
/* Delay the SPAR mixing matrices to have them synced with the audio */
- for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ )
+#ifdef JBM_TSM_ON_TCS
+ slot_idx_start = hSpar->slots_rendered;
+ slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe];
+
+ for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ )
{
- if ( sf < SPAR_META_DELAY_SUBFRAMES )
+ sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME;
+#endif
+ if ( subframe < SPAR_META_DELAY_SUBFRAMES )
{
+#ifdef JBM_TSM_ON_TCS
mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
+#else
+ mixer_mat_index = subframe + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1;
+#endif
for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
{
for ( i = 0; i < FOA_CHANNELS; i++ )
{
for ( j = 0; j < FOA_CHANNELS; j++ )
{
- mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
+#ifdef JBM_TSM_ON_TCS
+ mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
+#else
+ mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band];
+#endif
}
}
}
}
else
{
+#ifdef JBM_TSM_ON_TCS
mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES;
+#else
+ mixer_mat_index = subframe - SPAR_META_DELAY_SUBFRAMES;
+#endif
for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
{
for ( i = 0; i < FOA_CHANNELS; i++ )
{
for ( j = 0; j < FOA_CHANNELS; j++ )
{
- mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS];
+#ifdef JBM_TSM_ON_TCS
+ mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS];
+#else
+ mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS];
+#endif
}
}
}
}
+#ifdef JBM_TSM_ON_TCS
}
+#endif
/* Map the mixing matrices from the frequency bands to frequency bins */
bin = 0;
- for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ )
+ for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
{
- for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ )
+ band_start = band_grouping[band];
+ band_end = band_grouping[band + 1];
+ for ( bin = band_start; bin < band_end; bin++ )
{
- band_start = band_grouping[band];
- band_end = band_grouping[band + 1];
- for ( bin = band_start; bin < band_end; bin++ )
+ for ( i = 0; i < FOA_CHANNELS; i++ )
{
- for ( i = 0; i < FOA_CHANNELS; i++ )
+ for ( j = 0; j < FOA_CHANNELS; j++ )
{
- for ( j = 0; j < FOA_CHANNELS; j++ )
- {
- mixer_mat_sf_bins_real[sf][bin][i][j] = mixer_mat_sf_bands_real[sf][band][i][j];
- }
+ mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j];
}
}
}
@@ -1264,125 +1457,143 @@ void ivas_spar_param_to_masa_param_mapping(
nBins = bin;
/* Determine MASA metadata */
- for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ )
+ /* Determine transport signal energies and cross correlations when more than 1 TC */
+ if ( nchan_transport == 2 )
{
- /* Determine transport signal energies and cross correlations when more than 1 TC */
- if ( nchan_transport == 2 )
- {
- set_zero( transportSignalEnergies[0], nBins );
- set_zero( transportSignalEnergies[1], nBins );
- set_zero( transportSignalCrossCorrelation, nBins );
+ set_zero( transportSignalEnergies[0], nBins );
+ set_zero( transportSignalEnergies[1], nBins );
+ set_zero( transportSignalCrossCorrelation, nBins );
- for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ )
+#else
+ for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ )
+#endif
+ {
+ for ( bin = 0; bin < nBins; bin++ )
{
- int16_t slotThis = slot + ( hDirAC->subframe_nbslots * sf );
-
- for ( bin = 0; bin < nBins; bin++ )
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
{
- for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
- {
- instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] );
- instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] );
- transportSignalEnergies[ch][bin] += instEne;
- }
- transportSignalCrossCorrelation[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin];
- transportSignalCrossCorrelation[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin];
+ instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
+ instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
+ transportSignalEnergies[ch][bin] += instEne;
}
+ transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
+ transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
}
}
+ }
+
+ if ( hDiffuseDist != NULL )
+ {
+#ifdef JBM_TSM_ON_TCS
+ set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX );
+ set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX );
+ set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX );
+#else
+ set_zero( hDiffuseDist->diffuseRatioX[subframe], CLDFB_NO_CHANNELS_MAX );
+ set_zero( hDiffuseDist->diffuseRatioY[subframe], CLDFB_NO_CHANNELS_MAX );
+ set_zero( hDiffuseDist->diffuseRatioZ[subframe], CLDFB_NO_CHANNELS_MAX );
+#endif
+ }
+
+ for ( bin = 0; bin < nBins; bin++ )
+ {
+ /* Set the energy of the first transport signal */
+ if ( nchan_transport == 1 )
+ {
+ inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
+ }
+ else
+ {
+ inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */
+ }
+ /* Decorrelated channels assumed to have the same energy as the source channel */
+ inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
+ inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
+ inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
- if ( hDiffuseDist != NULL )
+ /* In case residuals were transmitted, use their actual energies and cross correlations */
+ if ( nchan_transport == 2 )
{
- set_zero( hDiffuseDist->diffuseRatioX[sf], CLDFB_NO_CHANNELS_MAX );
- set_zero( hDiffuseDist->diffuseRatioY[sf], CLDFB_NO_CHANNELS_MAX );
- set_zero( hDiffuseDist->diffuseRatioZ[sf], CLDFB_NO_CHANNELS_MAX );
+ inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
+ inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
+ inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
}
- for ( bin = 0; bin < nBins; bin++ )
+ compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] );
+
+ /* Estimate MASA metadata */
+ Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */
+ Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */
+ Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */
+ I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */
+ E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
+ azi = atan2f( Iy, Ix ); /* Azimuth */
+ ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */
+ ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */
+ ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
+
+ hDirAC->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
+ hDirAC->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
+ hDirAC->energy_ratio1[dirac_write_idx][bin] = ratio;
+ hDirAC->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
+
+ hDirAC->spreadCoherence[dirac_write_idx][bin] = 0.0f;
+ hDirAC->surroundingCoherence[dirac_write_idx][bin] = 0.0f;
+
+ /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */
+ if ( hDiffuseDist != NULL )
{
- /* Set the energy of the first transport signal */
if ( nchan_transport == 1 )
{
- inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */
+ diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] );
+ diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] );
+ diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] );
+ }
+ else if ( nchan_transport == 2 )
+ {
+ diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] );
+ diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] );
+ diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] );
}
else
{
- inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */
+ diffuseGainY = 1.0f;
+ diffuseGainX = 1.0f;
+ diffuseGainZ = 1.0f;
}
- /* Decorrelated channels assumed to have the same energy as the source channel */
- inCovarianceMtx[1][1] = inCovarianceMtx[0][0];
- inCovarianceMtx[2][2] = inCovarianceMtx[0][0];
- inCovarianceMtx[3][3] = inCovarianceMtx[0][0];
- /* In case residuals were transmitted, use their actual energies and cross correlations */
- if ( nchan_transport == 2 )
+ diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
+
+#ifdef JBM_TSM_ON_TCS
+ if ( diffuseGainSum == 0.0f )
{
- inCovarianceMtx[1][1] = transportSignalEnergies[1][bin];
- inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin];
- inCovarianceMtx[1][0] = inCovarianceMtx[0][1];
+ hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f;
+ hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f;
+ hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f;
}
-
- compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[sf][bin] );
-
- /* Estimate MASA metadata */
- Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */
- Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */
- Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */
- I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */
- E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */
- azi = atan2f( Iy, Ix ); /* Azimuth */
- ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */
- ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */
- ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) );
-
- hDirAC->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 );
- hDirAC->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 );
- hDirAC->energy_ratio1[dirac_write_idx][bin] = ratio;
- hDirAC->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio;
-
- hDirAC->spreadCoherence[dirac_write_idx][bin] = 0.0f;
- hDirAC->surroundingCoherence[dirac_write_idx][bin] = 0.0f;
-
- /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */
- if ( hDiffuseDist != NULL )
+ else
{
- if ( nchan_transport == 1 )
- {
- diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] );
- diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] );
- diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] );
- }
- else if ( nchan_transport == 2 )
- {
- diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] * transportSignalEnergies[1][bin] );
- diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][3][1] * transportSignalEnergies[1][bin] );
- diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][2][1] * transportSignalEnergies[1][bin] );
- }
- else
- {
- diffuseGainY = 1.0f;
- diffuseGainX = 1.0f;
- diffuseGainZ = 1.0f;
- }
-
- diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ;
-
- if ( diffuseGainSum == 0.0f )
- {
- hDiffuseDist->diffuseRatioX[sf][bin] = 1.0f / 3.0f;
- hDiffuseDist->diffuseRatioY[sf][bin] = 1.0f / 3.0f;
- hDiffuseDist->diffuseRatioZ[sf][bin] = 1.0f / 3.0f;
- }
- else
- {
- hDiffuseDist->diffuseRatioX[sf][bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
- hDiffuseDist->diffuseRatioY[sf][bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
- hDiffuseDist->diffuseRatioZ[sf][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
- }
+ hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
+ hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
+ hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
+ }
+#else
+ if ( diffuseGainSum == 0.0f )
+ {
+ hDiffuseDist->diffuseRatioX[subframe][bin] = 1.0f / 3.0f;
+ hDiffuseDist->diffuseRatioY[subframe][bin] = 1.0f / 3.0f;
+ hDiffuseDist->diffuseRatioZ[subframe][bin] = 1.0f / 3.0f;
}
+ else
+ {
+ hDiffuseDist->diffuseRatioX[subframe][bin] = diffuseGainX / ( diffuseGainSum + EPSILON );
+ hDiffuseDist->diffuseRatioY[subframe][bin] = diffuseGainY / ( diffuseGainSum + EPSILON );
+ hDiffuseDist->diffuseRatioZ[subframe][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON );
+ }
+#endif
}
-
- dirac_write_idx = ( dirac_write_idx + 1 ) % hDirAC->dirac_md_buffer_length;
}
return;
@@ -1428,7 +1639,6 @@ static void compute_foa_cov_matrix(
return;
}
-#ifdef FIX_350_MASA_DELAY_COMP
static void create_masa_ext_out_meta(
MASA_DECODER *hMasa,
IVAS_QMETADATA_HANDLE hQMetaData,
@@ -1560,4 +1770,3 @@ static void create_masa_ext_out_meta(
return;
}
-#endif
diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c
index c7745650d9f16286408dddc7bc90810c1af99b91..14e29ed36d972c4d26fc327fe99befbfbebfb2e3 100644
--- a/lib_dec/ivas_mc_param_dec.c
+++ b/lib_dec/ivas_mc_param_dec.c
@@ -76,7 +76,11 @@ typedef struct parameter_band_mapping_struct
static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out );
+#ifdef JBM_TSM_ON_TCS
+static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands );
+#else
static void param_mc_protoSignalComputation( float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t slot_index, const int16_t num_freq_bands );
+#endif
static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx );
@@ -86,13 +90,23 @@ static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq,
static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild_q, float *icc_q, const int16_t param_band_index, const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nY, const int16_t nX, float *Cx_state, float *Cproto, float *Cy_state );
+#ifdef JBM_TSM_ON_TCS
+static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY );
+
+static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov );
+#else
static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY );
static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov );
+#endif
+#ifdef JBM_TSM_ON_TCS
+static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY );
+#else
static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const uint16_t nX, const uint16_t nY );
+#endif
-static void param_mc_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator );
+static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator );
static void param_mc_set_num_synth_bands( const int32_t output_Fs, PARAM_MC_DEC_HANDLE hParamMC );
@@ -224,7 +238,13 @@ ivas_error ivas_param_mc_dec_open(
*-----------------------------------------------------------------*/
hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX;
+#ifdef JBM_TSM_ON_TCS
+ set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS );
+ hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS;
+#else
hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC;
+#endif
hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f );
hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands;
@@ -420,6 +440,9 @@ ivas_error ivas_param_mc_dec_open(
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator );
+#endif
#ifdef EXTERNAL_ORIENTATIONS
@@ -461,6 +484,39 @@ ivas_error ivas_param_mc_dec_open(
ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov );
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO )
+ {
+ if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) );
+ }
+ set_zero( hParamMC->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands );
+
+ if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) );
+ }
+ set_zero( hParamMC->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands );
+
+ if ( st_ivas->hTcBuffer == NULL )
+ {
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+ else
+ {
+ hParamMC->Cldfb_RealBuffer_tc = NULL;
+ hParamMC->Cldfb_ImagBuffer_tc = NULL;
+ }
+
+ hParamMC->subframes_rendered = 0;
+ hParamMC->slots_rendered = 0;
+#endif
+
st_ivas->hParamMC = hParamMC;
return error;
@@ -603,13 +659,14 @@ ivas_error ivas_param_mc_dec_reconfig(
#endif
}
- /*-----------------------------------------------------------------*
- * set input parameters
- *-----------------------------------------------------------------*/
+ /*-----------------------------------------------------------------*
+ * set input parameters
+ *-----------------------------------------------------------------*/
+#ifndef JBM_TSM_ON_TCS
hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX;
hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC;
-
+#endif
hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f );
hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands;
@@ -920,6 +977,10 @@ ivas_error ivas_param_mc_dec_reconfig(
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator );
+#endif
+
ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual );
@@ -1130,6 +1191,19 @@ void ivas_param_mc_dec_close(
hParamMC->hoa_encoder = NULL;
}
+#ifdef JBM_TSM_ON_TCS
+ if ( hParamMC->Cldfb_RealBuffer_tc != NULL )
+ {
+ free( hParamMC->Cldfb_RealBuffer_tc );
+ hParamMC->Cldfb_RealBuffer_tc = NULL;
+ }
+ if ( hParamMC->Cldfb_ImagBuffer_tc != NULL )
+ {
+ free( hParamMC->Cldfb_ImagBuffer_tc );
+ hParamMC->Cldfb_ImagBuffer_tc = NULL;
+ }
+#endif
+
free( *hParamMC_out );
*hParamMC_out = NULL;
@@ -1247,7 +1321,9 @@ void ivas_param_mc_dec_read_BS(
num_lfe_bands = 0;
}
- param_mc_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator );
+#ifndef JBM_TSM_ON_TCS
+ ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator );
+#endif
if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 )
{
@@ -1334,12 +1410,448 @@ void ivas_param_mc_dec_read_BS(
/* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */
hMetadataPMC->bAttackPresent = 0;
hMetadataPMC->attackIndex = 0;
+#ifndef JBM_TSM_ON_TCS
+ ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator );
+#endif
+ }
+
+ pop_wmops();
+
+ return;
+}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------
+ * ivas_param_mc_dec_digest_tc()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+void ivas_param_mc_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */
+ float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */
+)
+{
+ PARAM_MC_DEC_HANDLE hParamMC;
+ int16_t i, ch;
+ int16_t slot_idx, param_band_idx;
+ int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb;
+ int16_t nchan_out_cov;
+ /*CLDFB*/
+ float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
+ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
+ float real_part, imag_part;
+ /* format converter */
+ int16_t channel_active[MAX_OUTPUT_CHANNELS];
+ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup;
+
+ hParamMC = st_ivas->hParamMC;
+ assert( hParamMC );
+
+ push_wmops( "param_mc_dec_digest_tc" );
+
+ set_s( channel_active, 0, MAX_CICP_CHANNELS );
+ nchan_transport = st_ivas->nchan_transport;
+ nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
+
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ nchan_out_cldfb = BINAURAL_CHANNELS;
+ set_s( channel_active, 1, nchan_out_cldfb );
+ nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
+ hSynthesisOutputSetup = &st_ivas->hTransSetup;
+ }
+ else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB )
+ {
+ nchan_out_cov = nchan_out_transport;
+ nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
+ hSynthesisOutputSetup = &st_ivas->hTransSetup;
+ }
+ else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO )
+ {
+ nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
+ nchan_out_cldfb = nchan_out_cov;
+ set_s( channel_active, 1, nchan_out_cov );
+ hSynthesisOutputSetup = &st_ivas->hOutSetup;
+ }
+ else
+ {
+ nchan_out_cov = nchan_out_transport;
+ nchan_out_cldfb = nchan_out_transport;
+ set_s( channel_active, 1, nchan_out_cov );
+ hSynthesisOutputSetup = &st_ivas->hTransSetup;
+ }
+
+ /* adapt transient position */
+ if ( hParamMC->hMetadataPMC->bAttackPresent )
+ {
+ hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) );
+ }
+ /* adapt subframes */
+ hParamMC->num_slots = nCldfbSlots;
+ hParamMC->slots_rendered = 0;
+ hParamMC->subframes_rendered = 0;
+ ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes );
+
+ ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator );
+
+ for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ )
+ {
+ set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
+ set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
+ }
+
+ /* slot loop for gathering the input data */
+ for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ )
+ {
+ float RealBuffer[CLDFB_NO_CHANNELS_MAX];
+ float ImagBuffer[CLDFB_NO_CHANNELS_MAX];
+
+ /* CLDFB Analysis*/
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] );
+
+ mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands );
+ mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands );
+ }
+
+ if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex )
+ {
+ ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport );
+ }
+ }
+
+ /* map from complex input covariance to real values */
+ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ )
+ {
+ /* Cx for transport channels */
+ for ( i = 0; i < nchan_transport * nchan_transport; i++ )
+ {
+ real_part = cx[param_band_idx][i];
+ imag_part = cx_imag[param_band_idx][i];
+
+ /* (a-ib)(c+id) = ac + bd + i(ad-bc) */
+ if ( param_band_idx < hParamMC->max_param_band_abs_cov )
+ {
+ cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part );
+ }
+ else
+ {
+ cx[param_band_idx][i] = real_part;
+ }
+ }
+ }
+
+ /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/
+ if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) )
+ {
+ for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
+ {
+ v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport );
+ mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport );
+ }
+ }
+
+
+ if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO )
+ {
+ ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov );
+ }
+ else
+ {
+ /* generate mixing matrices */
+ ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov );
+ }
+
+ pop_wmops();
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_param_mc_dec()
+ *
+ * Parametric MC decoding process
+ *------------------------------------------------------------------------*/
+
+void ivas_param_mc_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ PARAM_MC_DEC_HANDLE hParamMC;
+ int16_t i, ch;
+ int16_t subframe_idx;
+ int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render;
+ int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb;
+ int16_t nchan_out_cov;
+ /*CLDFB*/
+ float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ /*Decorrelator*/
+ float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX];
+ /* format converter */
+ int16_t channel_active[MAX_OUTPUT_CHANNELS];
+ uint16_t nband_synth, nbands_to_zero;
+ uint16_t nchan_out_init;
+ uint32_t output_Fs;
+
+ hParamMC = st_ivas->hParamMC;
+ assert( hParamMC );
+
+ push_wmops( "param_mc_dec_render" );
+
+ set_s( channel_active, 0, MAX_CICP_CHANNELS );
+ nchan_transport = st_ivas->nchan_transport;
+ nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
+ nchan_out_init = nchan_out_transport;
+ output_Fs = st_ivas->hDecoderConfig->output_Fs;
+
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ nchan_out_cldfb = BINAURAL_CHANNELS;
+ set_s( channel_active, 1, nchan_out_cldfb );
+ if ( st_ivas->hHeadTrackData )
+ {
+ nchan_out_init = MAX_INTERN_CHANNELS;
+ }
+ nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
}
+ else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB )
+ {
+ nchan_out_cov = nchan_out_transport;
+ nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
+ }
+ else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO )
+ {
+ nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe;
+ nchan_out_cldfb = nchan_out_cov;
+ set_s( channel_active, 1, nchan_out_cov );
+ }
+ else
+ {
+ nchan_out_cov = nchan_out_transport;
+ nchan_out_cldfb = nchan_out_transport;
+ set_s( channel_active, 1, nchan_out_cov );
+ }
+
+ /* set everything to zero that will not be decoded */
+ nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth];
+ nbands_to_zero = hParamMC->num_freq_bands - nband_synth;
+ for ( ch = 0; ch < nchan_out_init; ch++ )
+ {
+ for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ )
+ {
+ set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero );
+ set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero );
+ }
+ }
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) );
+ *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS );
+ first_sf = hParamMC->subframes_rendered;
+ last_sf = first_sf;
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hParamMC->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+#ifdef DEBUGGING
+ assert( slots_to_render == 0 );
+#endif
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ slots_to_render += hParamMC->subframe_nbslots[subframe_idx];
+ }
+ }
+ slot_idx_start = hParamMC->slots_rendered;
+ slot_idx_start_cldfb_synth = 0;
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ )
+ {
+
+ if ( hParamMC->max_band_decorr > 0 )
+ {
+ /*-----------------------------------------------------------------*
+ * protoype signal computation
+ *-----------------------------------------------------------------*/
+
+ param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands],
+ &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands],
+ hParamMC->proto_frame_f, hParamMC->diff_proto_info,
+ hParamMC->num_freq_bands );
+
+ /*-----------------------------------------------------------------*
+ * frequency domain decorrelation
+ *-----------------------------------------------------------------*/
+
+ /* decorrelate prototype frame */
+ ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands,
+ hParamMC->num_outputs_diff,
+ hParamMC->diff_proto_info->num_protos_diff,
+ DIRAC_SYNTHESIS_COV_MC_LS,
+ nchan_transport,
+ hParamMC->proto_frame_f,
+ hParamMC->diff_proto_info->num_protos_diff,
+ hParamMC->diff_proto_info->proto_index_diff,
+ hParamMC->proto_frame_dec_f,
+ onset_filter,
+ hParamMC->h_freq_domain_decorr_ap_params,
+ hParamMC->h_freq_domain_decorr_ap_state );
+
+ /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */
+ /* memory for the decorrelated signal */
+ ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx );
+ }
+
+ /*-----------------------------------------------------------------*
+ * output synthesis
+ *-----------------------------------------------------------------*/
+
+ ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands],
+ &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands],
+ Cldfb_RealBuffer, Cldfb_ImagBuffer,
+ hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start,
+ nchan_transport, nchan_out_cov, hParamMC );
+
+ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) )
+ {
+ if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV )
+ {
+ ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE );
+ }
+ else
+ {
+ /* remove LFE */
+ uint16_t idx_out;
+ uint16_t idx_lfe;
+ IVAS_OUTPUT_SETUP hLsSetup;
+
+ hLsSetup = st_ivas->hTransSetup;
+
+ /* If LFE should be rendered, add it to other channels before removing */
+ if ( st_ivas->hBinRenderer->render_lfe )
+ {
+ for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ )
+ {
+ /* Copy just the first band of LFE*/
+ v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 );
+ v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 );
+
+ for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ )
+ {
+ if ( hLsSetup.index_lfe[idx_lfe] != ch )
+ {
+ v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 );
+ v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 );
+ }
+ }
+ }
+ }
+
+ idx_out = 0;
+ idx_lfe = 0;
+
+ for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ )
+ {
+ if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) )
+ {
+ if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) )
+ {
+ idx_lfe++;
+ }
+ }
+ else if ( ch != idx_out )
+ {
+ mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth );
+ mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth );
+ idx_out++;
+ }
+ else
+ {
+ idx_out++;
+ }
+ }
+ }
+ }
+ }
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, hParamMC->subframe_nbslots[subframe_idx],
+ Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer );
+ }
+ else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB )
+ {
+ /* format conversion*/
+ ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active );
+ }
+
+ /* CLDFB synthesis */
+ for ( ch = 0; ch < nchan_out_cldfb; ch++ )
+ {
+ float *RealBuffer[16];
+ float *ImagBuffer[16];
+
+ if ( channel_active[ch] )
+ {
+ /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */
+ for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ )
+ {
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i];
+ }
+ else
+ {
+ RealBuffer[i] = Cldfb_RealBuffer[ch][i];
+ ImagBuffer[i] = Cldfb_ImagBuffer[ch][i];
+ }
+ }
+ cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ),
+ hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] );
+ }
+ else
+ {
+ set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] );
+ }
+ }
+ slot_idx_start += hParamMC->subframe_nbslots[subframe_idx];
+ slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx];
+ }
+
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC )
+ {
+ ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f );
+ }
+
+ /* update */
+ if ( hParamMC->slots_rendered == hParamMC->num_slots )
+ {
+ hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth;
+ param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov );
+ }
+ hParamMC->subframes_rendered = last_sf;
+ *nSamplesAvailable = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS );
pop_wmops();
return;
}
+#endif
/*-------------------------------------------------------------------------
@@ -1348,6 +1860,41 @@ void ivas_param_mc_dec_read_BS(
* Parametric MC decoding process
*------------------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+void ivas_param_mc_dec(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */
+)
+{
+ PARAM_MC_DEC_HANDLE hParamMC;
+ float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX];
+ uint16_t nSamplesAsked, nSamplesAvailable, nSamplesRendered;
+
+ hParamMC = st_ivas->hParamMC;
+ assert( hParamMC );
+ push_wmops( "param_mc_dec" );
+
+ /* set some handle pointers to the stack buffers */
+ hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in;
+ hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in;
+
+ nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f );
+ ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailable, output_f );
+#ifdef DEBUGGING
+ assert( nSamplesRendered == nSamplesAsked );
+ assert( nSamplesAvailable == 0 );
+#endif
+
+ /* set handle pointers back to NULL */
+ hParamMC->Cldfb_RealBuffer_tc = NULL;
+ hParamMC->Cldfb_ImagBuffer_tc = NULL;
+
+ pop_wmops();
+ return;
+}
+#else
void ivas_param_mc_dec(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */
@@ -1355,7 +1902,8 @@ void ivas_param_mc_dec(
{
PARAM_MC_DEC_HANDLE hParamMC;
int16_t i, ch;
- int16_t subframe_idx, num_subframes;
+ int16_t subframe_idx;
+ int16_t nb_subframes;
int16_t slot_idx, param_band_idx, slot_idx_start;
int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb;
int16_t nchan_out_cov;
@@ -1506,12 +2054,13 @@ void ivas_param_mc_dec(
ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, mixing_matrix, mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov );
}
+ /*** split here... ***/
+
/* subframe loop for synthesis*/
- num_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots;
- for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ )
+ nb_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots;
+ for ( subframe_idx = 0; subframe_idx < nb_subframes; subframe_idx++ )
{
slot_idx_start = subframe_idx * hParamMC->subframe_nbslots;
-
for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots; slot_idx++ )
{
@@ -1658,7 +2207,6 @@ void ivas_param_mc_dec(
ImagBuffer[i] = Cldfb_ImagBuffer[ch][i];
}
}
-
cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hParamMC->num_freq_bands] ),
hParamMC->num_freq_bands * hParamMC->subframe_nbslots, st_ivas->cldfbSynDec[ch] );
}
@@ -1681,6 +2229,7 @@ void ivas_param_mc_dec(
return;
}
+#endif
/*-------------------------------------------------------------------------
@@ -1755,12 +2304,19 @@ static void ivas_param_mc_dec_init(
*------------------------------------------------------------------------*/
static void param_mc_protoSignalComputation(
+#ifdef JBM_TSM_ON_TCS
+ float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */
+ float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */
+#else
float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */
float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */
- float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */
- const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */
- const int16_t slot_index, /* i : current slot index */
- const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */
+#endif
+ float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */
+ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */
+#ifndef JBM_TSM_ON_TCS
+ const int16_t slot_index, /* i : current slot index */
+#endif
+ const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */
)
{
int16_t band;
@@ -1781,8 +2337,13 @@ static void param_mc_protoSignalComputation(
int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt];
p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2];
+#ifdef JBM_TSM_ON_TCS
+ p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands];
+ p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands];
+#else
p_real_buffer = &RealBuffer[source_ch_idx][slot_index][0];
p_imag_buffer = &ImagBuffer[source_ch_idx][slot_index][0];
+#endif
for ( band = 0; band < num_freq_bands; band++ )
{
@@ -1954,15 +2515,18 @@ static int16_t ivas_param_mc_range_decoder_LC(
*
* compute the interpolator used in the final synthesis
*------------------------------------------------------------------------*/
-
-static void param_mc_compute_interpolator(
+static void ivas_param_mc_dec_compute_interpolator(
const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */
const uint16_t attackPos, /* i : position of the transient */
const uint16_t interp_length, /* i : number of interpolation values to be calculated */
float *interpolator /* o : interpolator */
)
{
+#ifdef JBM_TSM_ON_TCS
+ int16_t idx;
+#else
uint16_t idx;
+#endif
if ( bAttackPresent )
{
@@ -1977,10 +2541,14 @@ static void param_mc_compute_interpolator(
}
else
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator );
+#else
for ( idx = 1; idx <= interp_length; ++idx )
{
interpolator[idx - 1] = (float) idx / (float) interp_length;
}
+#endif
}
return;
@@ -2040,12 +2608,17 @@ static void ivas_param_mc_get_mixing_matrices(
PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */
IVAS_OUTPUT_SETUP *hSynthesisOutputSetup,
float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */
- float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */
- float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */
- const int16_t nY_intern, /* i : number of channels in the transported format */
- const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */
- const int16_t nX, /* i : number of transport channels */
- const int16_t nY_cov /* i : number of covariance synthesis output channels */
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */
+ float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */
+#else
+ float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */
+ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */
+#endif
+ const int16_t nY_intern, /* i : number of channels in the transported format */
+ const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */
+ const int16_t nX, /* i : number of transport channels */
+ const int16_t nY_cov /* i : number of covariance synthesis output channels */
)
{
int16_t param_band_idx;
@@ -2294,11 +2867,16 @@ static void ivas_param_mc_get_mixing_matrices(
static void ivas_param_mc_get_mono_stereo_mixing_matrices(
PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */
float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */
- float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */
- float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */
- const int16_t nY_intern, /* i : number of channels of the transport format */
- const int16_t nX, /* i : number of transport channels */
- const int16_t nY_cov ) /* i : number of output channels */
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */
+ float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */
+#else
+ float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */
+ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */
+#endif
+ const int16_t nY_intern, /* i : number of channels of the transport format */
+ const int16_t nX, /* i : number of transport channels */
+ const int16_t nY_cov ) /* i : number of output channels */
{
int16_t param_band_idx;
float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
@@ -2413,17 +2991,21 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices(
*------------------------------------------------------------------------*/
static void param_mc_update_mixing_matrices(
- PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */
+ PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */
+ float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */
+#else
float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : direct mixing matrices for the frame just processed */
float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : residual mixing matrices for the frame just processed */
- const uint16_t nX, /* i : number of transport channels */
- const uint16_t nY ) /* i : number of synthesis channels */
+#endif
+ const uint16_t nX, /* i : number of transport channels */
+ const uint16_t nY ) /* i : number of synthesis channels */
{
uint16_t param_band_idx;
for ( param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++ )
{
- /* final mixing */
int16_t brange[2];
brange[0] = hParamMC->band_grouping[param_band_idx];
diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c
new file mode 100644
index 0000000000000000000000000000000000000000..346868ab6a4686978faf188fd65dbad3f220c634
--- /dev/null
+++ b/lib_dec/ivas_mc_paramupmix_dec.c
@@ -0,0 +1,693 @@
+/******************************************************************************************************
+
+ (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository. All Rights Reserved.
+
+ This software is protected by copyright law and by international treaties.
+ The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository retain full ownership rights in their respective contributions in
+ the software. This notice grants no license of any kind, including but not limited to patent
+ license, nor is any license granted by implication, estoppel or otherwise.
+
+ Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
+ contributions.
+
+ This software is provided "AS IS", without any express or implied warranties. The software is in the
+ development stage. It is intended exclusively for experts who have experience with such software and
+ solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
+ and fitness for a particular purpose are hereby disclaimed and excluded.
+
+ Any dispute, controversy or claim arising under or in relation to providing this software shall be
+ submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
+ accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
+ the United Nations Convention on Contracts on the International Sales of Goods.
+
+*******************************************************************************************************/
+
+#include
+#include "options.h"
+#include
+#include "cnst.h"
+#include "prot.h"
+#include "ivas_prot.h"
+#include "ivas_cnst.h"
+#include "ivas_rom_com.h"
+#include "ivas_rom_dec.h"
+#include "math.h"
+#ifdef DEBUGGING
+#include "debug.h"
+#endif
+#ifdef DEBUG_PLOT
+#include "deb_out.h"
+#endif
+#include "wmc_auto.h"
+#include "rom_dec.h"
+
+/*-----------------------------------------------------------------------*
+ * Local function prototypes
+ *-----------------------------------------------------------------------*/
+static void ps_pred_process( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], int16_t ch );
+
+static void paramupmix_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr[], float pcm_in[][L_FRAME48k], float **pp_out_pcm, const int16_t output_frame );
+
+static int huff_read( Decoder_State *st, const int16_t ( *ht )[2] );
+
+static void huffman_decode( Decoder_State *st, int16_t nv, int16_t ivStart, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t bNoDt, int32_t *vq );
+
+static void dequant_alpha( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *vq, float *v );
+
+static void dequant_beta( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta );
+
+static void get_ec_data( Decoder_State *st, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nParBand, int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] );
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_dec_read_BS()
+ *
+ * Read the ParamUpmix MC metadata
+ *------------------------------------------------------------------------*/
+
+void ivas_mc_paramupmix_dec_read_BS(
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ Decoder_State *st, /* i/o: decoder state structure */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */
+ int16_t *nb_bits /* o : number of bits written */
+)
+{
+ int16_t i, k;
+ int32_t alpha_quant[IVAS_MAX_NUM_BANDS];
+ int16_t nb_bits_read_orig;
+ int16_t next_bit_pos_orig, last_bit_pos;
+ uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig;
+
+ push_wmops( "mc_paramupmix_read_bs" );
+ *nb_bits = 0;
+
+ if ( st->bfi )
+ {
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ )
+ {
+ hMCParamUpmix->alphas[i][k] = hMCParamUpmix->alpha_prev[i][k];
+ hMCParamUpmix->betas[i][k] = hMCParamUpmix->beta_prev[i][k];
+ }
+ }
+ hMCParamUpmix->first_frame = 1;
+ }
+ else /* if (!st->bfi) */
+ {
+ bit_stream_orig = st->bit_stream;
+ next_bit_pos_orig = st->next_bit_pos;
+ last_bit_pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 );
+ nb_bits_read_orig = 0;
+ last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */
+ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ )
+ {
+ bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i];
+ }
+ st->bit_stream = bstr_meta;
+ st->next_bit_pos = 0;
+ st->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 );
+ st->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ get_ec_data( st, ALPHA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/,
+ 0 /*parBandStart*/, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i] );
+
+ get_ec_data( st, BETA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/,
+ 0 /*parBandStart*/, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i] );
+ }
+ *nb_bits += st->next_bit_pos;
+ st->bit_stream = bit_stream_orig;
+ st->next_bit_pos = next_bit_pos_orig;
+
+ if ( hMCParamUpmix->first_frame )
+ {
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ mvr2r( hMCParamUpmix->alphas[i], hMCParamUpmix->alpha_prev[i], IVAS_MAX_NUM_BANDS );
+ mvr2r( hMCParamUpmix->betas[i], hMCParamUpmix->beta_prev[i], IVAS_MAX_NUM_BANDS );
+ }
+ hMCParamUpmix->first_frame = 0;
+ }
+ }
+
+ pop_wmops();
+
+ return;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_dec()
+ *
+ * MC ParamUpmix decoding process
+ *------------------------------------------------------------------------*/
+void ivas_mc_paramupmix_dec(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels */
+)
+{
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix;
+ int16_t i, k, ch;
+ int16_t slot_idx;
+ int16_t first_empty_channel;
+ int16_t nchan_out_transport;
+ /*CLDFB*/
+ float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
+ int16_t channel_active[MAX_OUTPUT_CHANNELS];
+ int32_t output_Fs;
+ int16_t output_frame;
+ float Pcm_decorr[MC_PARAMUPMIX_COMBINATIONS][L_FRAME48k]; /* decorrelated channels */
+ float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/
+ int16_t noparamupmix_delay;
+ AUDIO_CONFIG output_config;
+
+ hMCParamUpmix = st_ivas->hMCParamUpmix;
+ assert( hMCParamUpmix );
+
+ push_wmops( "mc_paramupmix_dec" );
+
+ set_s( channel_active, 0, MAX_CICP_CHANNELS );
+ nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
+ set_s( channel_active, 1, nchan_out_transport ); /* change to nchan_out_transport */
+ output_Fs = st_ivas->hDecoderConfig->output_Fs;
+ output_config = st_ivas->hDecoderConfig->output_config;
+ output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
+
+ if ( ( output_config == AUDIO_CONFIG_STEREO ) || ( output_config == AUDIO_CONFIG_MONO ) )
+ {
+ first_empty_channel = 8; /* Don't upmix */
+ }
+ else
+ {
+ first_empty_channel = 12;
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ pPcm_temp[i] = Pcm_decorr[i]; /* decorrelated */
+ }
+
+ paramupmix_td_decorr_process( hMCParamUpmix->hTdDecorr, &( output_f[4] ), pPcm_temp, output_frame );
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */
+ pPcm_temp[2 * i + 1] = Pcm_decorr[i]; /* decorrelated */
+ }
+
+ /* CLDFB Analysis*/
+ for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ )
+ {
+ /* slot loop for gathering the input data */
+ for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ )
+ {
+ cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch] );
+ }
+ }
+ for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ )
+ {
+ ps_pred_process( hMCParamUpmix,
+ Cldfb_RealBuffer[2 * ch], /* in/out */
+ Cldfb_ImagBuffer[2 * ch],
+ Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */
+ Cldfb_ImagBuffer[2 * ch + 1],
+ ch );
+
+ /*-- m, s -> l, r ----------------------------*/
+ for ( i = 0; i < CLDFB_NO_COL_MAX; i++ )
+ {
+ for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ )
+ {
+ float qlre = Cldfb_RealBuffer[2 * ch][i][k];
+ float qlim = Cldfb_ImagBuffer[2 * ch][i][k];
+ float qrre = Cldfb_RealBuffer[2 * ch + 1][i][k];
+ float qrim = Cldfb_ImagBuffer[2 * ch + 1][i][k];
+
+ Cldfb_RealBuffer[2 * ch][i][k] = qlre + qrre;
+ Cldfb_ImagBuffer[2 * ch][i][k] = qlim + qrim;
+ Cldfb_RealBuffer[2 * ch + 1][i][k] = qlre - qrre;
+ Cldfb_ImagBuffer[2 * ch + 1][i][k] = qlim - qrim;
+ }
+ }
+
+ mvr2r( hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS );
+ mvr2r( hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS );
+ }
+
+ /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */
+ pPcm_temp[0] = output_f[4];
+ pPcm_temp[1] = output_f[6];
+ pPcm_temp[2] = output_f[5];
+ pPcm_temp[3] = output_f[7];
+ pPcm_temp[4] = output_f[8];
+ pPcm_temp[5] = output_f[10];
+ pPcm_temp[6] = output_f[9];
+ pPcm_temp[7] = output_f[11];
+
+ /* CLDFB synthesis */
+ for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ )
+ {
+ for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ )
+ {
+ float *ptr_im[1], *ptr_re[1];
+ ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx];
+ ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx];
+
+ cldfbSynthesis( ptr_re, ptr_im, &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ),
+ hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] );
+ }
+ }
+
+ /* adjust delay of other channels */
+ noparamupmix_delay = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS );
+ for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ )
+ {
+ float tmp_buf[L_SUBFRAME5MS_48k];
+ mvr2r( &output_f[ch][output_frame - noparamupmix_delay], tmp_buf, noparamupmix_delay );
+ mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], output_frame - noparamupmix_delay );
+ mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay );
+ mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay );
+ }
+ }
+
+ for ( ch = first_empty_channel; ch < MAX_OUTPUT_CHANNELS; ch++ )
+ {
+ set_f( output_f[ch], 0.0, L_FRAME48k );
+ }
+ pop_wmops();
+
+ return;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_getNumTransportChannels()
+ *
+ *
+ *------------------------------------------------------------------------*/
+int16_t ivas_mc_paramupmix_getNumTransportChannels()
+{
+ int16_t nchan_transport;
+ nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; /* 5.1.2 */
+ return nchan_transport;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_dec_open()
+ *
+ * Open Parametric MC decoder handle
+ *-------------------------------------------------------------------------*/
+
+ivas_error ivas_mc_paramupmix_dec_open(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix;
+ int32_t output_Fs;
+ int16_t nchan_transport;
+ uint16_t i;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ /*-----------------------------------------------------------------*
+ * prepare library opening
+ *-----------------------------------------------------------------*/
+
+ if ( ( hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_DEC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param-Upmix MC\n" ) );
+ }
+ output_Fs = st_ivas->hDecoderConfig->output_Fs;
+ hMCParamUpmix->first_frame = 1;
+
+ st_ivas->nchan_transport = ivas_mc_paramupmix_getNumTransportChannels();
+ nchan_transport = st_ivas->nchan_transport;
+
+ switch ( nchan_transport )
+ {
+ case 8:
+ st_ivas->nCPE = 4;
+ st_ivas->nSCE = 0;
+ st_ivas->element_mode_init = IVAS_CPE_MDCT;
+ break;
+#ifdef DEBUGGING
+ default:
+ assert( 0 && "Number of TC not supported for MC ParamUpmix!" );
+#endif
+ }
+ /*-----------------------------------------------------------------*
+ * set input parameters
+ *-----------------------------------------------------------------*/
+
+ hMCParamUpmix->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f );
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ ivas_td_decorr_dec_open( &( hMCParamUpmix->hTdDecorr[i] ), output_Fs, 2, 1 );
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ )
+ {
+ if ( ( hMCParamUpmix->pcm_delay[i] = (float *) malloc( 240 * sizeof( float ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for delay buffer\n" ) );
+ }
+ set_zero( hMCParamUpmix->pcm_delay[i], 240 );
+ }
+
+ st_ivas->hMCParamUpmix = hMCParamUpmix;
+
+ return error;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_dec_close()
+ *
+ * Close ParamUpmix MC memories
+ *------------------------------------------------------------------------*/
+
+void ivas_mc_paramupmix_dec_close(
+ MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix /* i/o: Parametric MC decoder handle */
+)
+{
+ int16_t i;
+
+ if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL )
+ {
+ return;
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ ivas_td_decorr_dec_close( &( ( *hMCParamUpmix )->hTdDecorr[i] ) );
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ )
+ {
+ if ( ( *hMCParamUpmix )->pcm_delay[i] != NULL )
+ {
+ free( ( *hMCParamUpmix )->pcm_delay[i] );
+ }
+ }
+ free( *hMCParamUpmix );
+
+ *hMCParamUpmix = NULL;
+
+ return;
+}
+
+/*****************************************************************************************/
+/* local functions */
+/*****************************************************************************************/
+
+static void ps_pred_process(
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix,
+ float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */
+ float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
+ float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */
+ float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
+ int16_t ch )
+{
+ float vmre, vmim, vsre, vsim;
+ int16_t iqmf, ipar, ismp, iismp;
+ float alpha_smp, dalpha, beta_smp, dbeta;
+ float *alpha1, *alpha2;
+ float *beta1, *beta2;
+ float *alpha_prev = hMCParamUpmix->alpha_prev[ch];
+ float *beta_prev = hMCParamUpmix->beta_prev[ch];
+
+ int16_t qmf_to_par_band[] = {
+ 0, 1, 2, 3, 4, 5, 5, 6, 6, 7,
+ 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,
+ 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11
+ };
+
+ for ( iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++ )
+ {
+ /* For changing no of parameter bands (ipar1 != ipar2), TIGGER_FRAMING assumed */
+ ipar = qmf_to_par_band[iqmf];
+ alpha1 = alpha_prev;
+ beta1 = beta_prev;
+
+ ismp = 0;
+ alpha2 = hMCParamUpmix->alphas[ch];
+ beta2 = hMCParamUpmix->betas[ch];
+ alpha_smp = alpha1[ipar];
+ beta_smp = beta1[ipar];
+ dalpha = ( alpha2[ipar] - alpha1[ipar] ) / CLDFB_NO_COL_MAX;
+ dbeta = ( beta2[ipar] - beta1[ipar] ) / CLDFB_NO_COL_MAX;
+
+ for ( iismp = 0; iismp < CLDFB_NO_COL_MAX; iismp++ )
+ {
+ alpha_smp += dalpha;
+ beta_smp += dbeta;
+
+ vmre = qmf_mod_re[ismp][iqmf];
+ vmim = qmf_mod_im[ismp][iqmf];
+ vsre = qmf_side_re[ismp][iqmf];
+ vsim = qmf_side_im[ismp][iqmf];
+
+ qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre;
+ qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim;
+
+ ismp++;
+ }
+
+ alpha1 = alpha2;
+ beta1 = beta2;
+ }
+}
+
+static void paramupmix_td_decorr_process(
+ ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */
+ float pcm_in[][L_FRAME48k], /* i : input audio channels */
+ float **pp_out_pcm, /* o : output audio channels */
+ const int16_t output_frame /* i : output frame length */
+)
+{
+ int16_t j, k;
+ int16_t offset;
+ float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k];
+
+ offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU );
+
+ /* Look-ahead delay */
+ for ( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ )
+ {
+ mvr2r( pcm_in[k], pp_out_pcm[k], output_frame );
+ delay_signal( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset );
+
+ /* In ducking gains */
+ if ( hTdDecorr[k]->ducking_flag )
+ {
+ ivas_td_decorr_get_ducking_gains( hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0 );
+
+ for ( j = 0; j < output_frame; j++ )
+ {
+ pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j];
+ }
+ }
+
+ /* All pass delay section */
+ ivas_td_decorr_APD_iir_filter( &hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame );
+
+ /* Out ducking gains */
+ if ( hTdDecorr[k]->ducking_flag )
+ {
+ for ( j = 0; j < output_frame; j++ )
+ {
+ pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j];
+ }
+ }
+ }
+
+ return;
+}
+
+static int huff_read(
+ Decoder_State *st,
+ const int16_t ( *ht )[2] )
+{
+ int16_t node = 0;
+ uint16_t next_bit = 0;
+
+ do
+ {
+ next_bit = st->bit_stream[st->next_bit_pos];
+ st->next_bit_pos++;
+ node = ht[node][next_bit];
+ } while ( node > 0 );
+
+ return -( node + 1 );
+}
+
+static void huffman_decode(
+ Decoder_State *st,
+ int16_t nv,
+ int16_t ivStart,
+ PAR_TYPE parType,
+ QUANT_TYPE quant_type,
+ int16_t bNoDt,
+ int32_t *vq )
+{
+ const int16_t( *huff_node_table )[2];
+ int16_t iv, bdt, nquant, offset;
+
+
+ nquant = 0;
+ switch ( parType )
+ {
+ case ALPHA:
+ nquant = alpha_quant_table[quant_type].nquant;
+ break;
+ case BETA:
+ nquant = beta_quant_table[quant_type][0].nquant;
+ break;
+ default:
+ assert( 0 );
+ }
+
+ offset = nquant - 1; /* range of df/dt [-(nquant - 1), nquant - 1] */
+
+ if ( bNoDt )
+ {
+ bdt = 0;
+ }
+ else
+ {
+ bdt = st->bit_stream[st->next_bit_pos];
+ st->next_bit_pos++;
+ }
+ if ( bdt )
+ { /* Get dt */
+ switch ( parType )
+ {
+ case ALPHA:
+ huff_node_table = huff_nodes_dt.alpha[quant_type];
+ break;
+ case BETA:
+ huff_node_table = huff_nodes_dt.beta[quant_type];
+ break;
+ default:
+ huff_node_table = NULL;
+ assert( 0 );
+ }
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ vq[iv] = huff_read( st, huff_node_table ) + vq[iv] - offset;
+ }
+ }
+ else /* Get f0, df */
+ {
+ switch ( parType )
+ {
+ case ALPHA:
+ huff_node_table = huff_nodes_df0.alpha[quant_type];
+ break;
+ case BETA:
+ huff_node_table = huff_nodes_df0.beta[quant_type];
+ break;
+ default:
+ huff_node_table = NULL;
+ assert( 0 );
+ }
+ vq[ivStart] = huff_read( st, huff_node_table );
+
+ switch ( parType )
+ {
+ case ALPHA:
+ huff_node_table = huff_nodes_df.alpha[quant_type];
+ break;
+ case BETA:
+ huff_node_table = huff_nodes_df.beta[quant_type];
+ break;
+ default:
+ assert( 0 );
+ }
+
+ for ( iv = ivStart + 1; iv < nv; iv++ )
+ {
+ vq[iv] = huff_read( st, huff_node_table ) + vq[iv - 1] - offset;
+ }
+ }
+}
+
+static void dequant_alpha(
+ int16_t nv,
+ int16_t ivStart,
+ QUANT_TYPE quant_type,
+ int32_t *vq,
+ float *v )
+{
+ int16_t iv;
+ ACPL_QUANT_TABLE *quant_table = &alpha_quant_table[quant_type];
+
+ for ( iv = 0; iv < ivStart; iv++ )
+ {
+ v[iv] = 0;
+ }
+
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ v[iv] = quant_table->data[vq[iv]];
+ }
+}
+
+static void dequant_beta(
+ int16_t nv,
+ int16_t ivStart,
+ QUANT_TYPE quant_type,
+ int32_t *aq,
+ int32_t *bq,
+ float *beta )
+{
+ int16_t iv;
+ ACPL_QUANT_TABLE *quant_table;
+ const int16_t qmap[2][33] = {
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 }
+ };
+
+ for ( iv = 0; iv < ivStart; iv++ )
+ {
+ beta[iv] = 0;
+ }
+
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ quant_table = &beta_quant_table[quant_type][qmap[quant_type][aq[iv]]];
+ beta[iv] = quant_table->data[bq[iv]];
+ }
+}
+
+static void get_ec_data(
+ Decoder_State *st,
+ PAR_TYPE parType,
+ QUANT_TYPE quant_type,
+ int16_t nParBand,
+ int16_t parBandStart,
+ int32_t *parQ,
+ int32_t *alphaQEnv,
+ float ab[IVAS_MAX_NUM_BANDS] )
+{
+ huffman_decode( st, nParBand, parBandStart, parType, quant_type, 0, parQ );
+ if ( parType == ALPHA )
+ {
+ dequant_alpha( nParBand, parBandStart, quant_type, parQ, ab );
+ mvl2l( parQ, alphaQEnv, (int16_t) nParBand );
+ }
+ else
+ {
+ dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab );
+ }
+}
diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c
old mode 100644
new mode 100755
index 3ef12f309478a30e2deec4c55970c6234dcb43cf..99b3ff68744b0daf4e3460cd3c9ab3b764ad6bc3
--- a/lib_dec/ivas_mcmasa_dec.c
+++ b/lib_dec/ivas_mcmasa_dec.c
@@ -76,7 +76,7 @@ ivas_error ivas_mcmasa_dec_reconfig(
return error;
}
- st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && st_ivas->hOutSetup.output_config == AUDIO_CONFIG_STEREO );
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO )
{
@@ -131,16 +131,14 @@ ivas_error ivas_mcmasa_dec_reconfig(
}
else
{
- /* the decision for useTdDecorr is done in ivas_dirac_dec_init_binaural_data(). here, comparing against the same condition. */
- if ( st_ivas->hDiracDecBin->useTdDecorr != ( ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) )
+ /* if necessary, close/open td-decorrs */
+ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK )
{
- /* st_ivas->hDiracDecBin->useTdDecorr will change => close and re-open. */
- ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin );
- if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
- {
- return error;
- }
+ return error;
}
+
+ /* regularization factor is bitrate-dependent */
+ st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
}
}
diff --git a/lib_dec/ivas_mct_core_dec.c b/lib_dec/ivas_mct_core_dec.c
index 7e11b23c9a91da28664cd07c259ea63e26b6e429..6c5e6575a68a95f7771c605fdddc785335a3e4fc 100644
--- a/lib_dec/ivas_mct_core_dec.c
+++ b/lib_dec/ivas_mct_core_dec.c
@@ -70,7 +70,7 @@ void ivas_mct_side_bits(
Decoder_State *st, *sts[MCT_MAX_CHANNELS];
nf_side_bits = 0;
- nChannels = hMCT->nchan_out_woLFE + hMCT->num_lfe;
+ nChannels = hMCT->nchan_out_woLFE;
/*initializations */
for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ )
@@ -88,7 +88,8 @@ void ivas_mct_side_bits(
for ( ch = 0; ch < nChannels; ch++ )
{
st = sts[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE || st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -108,15 +109,14 @@ void ivas_mct_side_bits(
availableBits = 0;
ivas_mct_dec_mct( hMCT, sts, nChannels );
- /* availableBits = ((hMCT->mc_bitrate/50) - sts[0]->next_bit_pos);
- availableBits -= NBBITS_MCT_RATIO * nChannels;*/
/*read channel bitrate ratios from bitstream*/
for ( ch = 0; ch < nChannels; ch++ )
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && hMCT->LFE_off ) || st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
chBitRatios[ch] = 0;
st->bits_frame_channel = 0;
@@ -189,7 +189,7 @@ void ivas_mct_core_dec(
* Initializations
*--------------------------------------------------------------------------------*/
- nChannels = hMCT->nchan_out_woLFE + hMCT->num_lfe;
+ nChannels = hMCT->nchan_out_woLFE;
/*initializations */
for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ )
@@ -203,7 +203,8 @@ void ivas_mct_core_dec(
for ( ch = 0, i = 0; ch < nChannels; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -232,7 +233,8 @@ void ivas_mct_core_dec(
{
st = sts[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) /*indicates LFE */
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) /*indicates LFE */
{
continue;
}
diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c
old mode 100644
new mode 100755
index 553cdf2a1bc37c43ba94d7f697d35f2530169ffd..46c4343800b8474a557627ae809ed95d5562798b
--- a/lib_dec/ivas_mct_dec.c
+++ b/lib_dec/ivas_mct_dec.c
@@ -54,8 +54,11 @@
* Local function prototypes
*-----------------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
+static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamplesRendered, int16_t *data );
+#else
static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas );
-
+#endif
/*--------------------------------------------------------------------------*
* ivas_mct_dec()
@@ -106,10 +109,6 @@ ivas_error ivas_mct_dec(
}
}
- if ( !st_ivas->bfi )
- {
- hMCT->LFE_off = 0; /* in case of PLC, stick to LFE_off of previous frame; otherwise, the update happens in ivas_mdct_dec_side_bits_frame_channel() */
- }
for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
{
@@ -131,9 +130,9 @@ ivas_error ivas_mct_dec(
if ( !st_ivas->bfi )
{
- ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0],
- &hMCT->LFE_off, nTnsBitsTCX10[cpe_id], param[cpe_id], 1,
- ( ( cpe_id + 1 ) * CPE_CHANNELS > st_ivas->nchan_transport ) );
+ ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1,
+ ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) );
+
st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[1]->BER_detect;
@@ -156,7 +155,8 @@ ivas_error ivas_mct_dec(
set_zero( x[n][1], L_FRAME48k / 2 );
}
- ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], hMCT->LFE_off, nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id],
+ ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id],
+ nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id],
fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 );
st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect;
@@ -189,7 +189,8 @@ ivas_error ivas_mct_dec(
x[n][1] = &output[n + cpe_id * CPE_CHANNELS][L_FRAME48k / 2];
}
- ivas_mdct_core_tns_ns( hCPE, hMCT->LFE_off, fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 );
+ ivas_mdct_core_tns_ns( hCPE,
+ fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 );
}
if ( st_ivas->renderer_type == RENDERER_MC )
@@ -197,6 +198,7 @@ ivas_error ivas_mct_dec(
/* Equalization in MDCT Domain */
ivas_ls_setup_conversion_process_mdct( st_ivas, output );
}
+
else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
{
float *x_all[MAX_CICP_CHANNELS][NB_DIV];
@@ -224,7 +226,8 @@ ivas_error ivas_mct_dec(
x[n][1] = &output[n + cpe_id * CPE_CHANNELS][L_FRAME48k / 2];
}
- ivas_mdct_core_reconstruct( hCPE, x, synth, hMCT->LFE_off, fUseTns[cpe_id], 1 );
+ ivas_mdct_core_reconstruct( hCPE, x, synth,
+ fUseTns[cpe_id], 1 );
/*----------------------------------------------------------------*
* CoreCoder Post-processing and updates
@@ -232,10 +235,6 @@ ivas_error ivas_mct_dec(
for ( n = 0; n < CPE_CHANNELS; n++ )
{
- if ( sts[n]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- break;
- }
if ( st_ivas->sba_dirac_stereo_flag )
{
@@ -243,7 +242,7 @@ ivas_error ivas_mct_dec(
}
/* Postprocessing for ACELP/MDCT core switching and synchronization */
- if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], 0, output_frame, 0 /*core_switching_flag*/, st_ivas->sba_dirac_stereo_flag, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK )
+ if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, st_ivas->sba_dirac_stereo_flag, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -277,6 +276,21 @@ ivas_error ivas_mct_dec(
}
#endif
}
+ /* move channels after LFE to correct output for multi-channel MCT */
+ if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
+ {
+ float tmp[L_FRAME48k];
+
+ /*save center channel output*/
+ mvr2r( output[hMCT->nchan_out_woLFE - 1], tmp, output_frame );
+
+ for ( n = hMCT->nchan_out_woLFE - 1; n >= LFE_CHANNEL; n-- )
+ {
+ mvr2r( output[n - 1], output[n + 1], output_frame );
+ }
+ mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame );
+ set_zero( output[LFE_CHANNEL], output_frame );
+ }
#ifdef DEBUG_MODE_INFO
for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ )
@@ -312,7 +326,7 @@ ivas_error create_mct_dec(
int16_t max_blocks;
int16_t cpe_id;
- /*-----------------------------------------------------------------*
+ /*--------------------------------------------------------- --------*
* Allocate MCT handle
*-----------------------------------------------------------------*/
@@ -326,20 +340,17 @@ ivas_error create_mct_dec(
*-----------------------------------------------------------------*/
/* Determine active channels */
- if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT )
+ if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT )
{
- hMCT->num_lfe = st_ivas->hTransSetup.num_lfe;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport - hMCT->num_lfe; /* LFE channel is coded separately */
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
}
- else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC )
+ else if ( st_ivas->mc_mode == MC_MODE_MCT )
{
- hMCT->num_lfe = 0;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
}
- else if ( st_ivas->ivas_format == SBA_FORMAT )
+ else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
{
- hMCT->num_lfe = 0;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
}
else
{
@@ -354,14 +365,11 @@ ivas_error create_mct_dec(
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) )
- {
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
}
}
/* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
- if ( ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) % 2 )
+ if ( ( hMCT->nchan_out_woLFE ) %
+ 2 )
{
st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
}
@@ -441,20 +449,17 @@ ivas_error mct_dec_reconfigure(
if ( b_nchan_change )
{
/* Determine active channels */
- if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT )
+ if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT )
{
- hMCT->num_lfe = st_ivas->hTransSetup.num_lfe;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport - hMCT->num_lfe; /* LFE channel is coded separately */
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
}
- else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC )
+ else if ( st_ivas->mc_mode == MC_MODE_MCT )
{
- hMCT->num_lfe = 0;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
}
- else if ( st_ivas->ivas_format == SBA_FORMAT )
+ else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
{
- hMCT->num_lfe = 0;
- hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
+ hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe;
}
else
{
@@ -468,15 +473,12 @@ ivas_error mct_dec_reconfigure(
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) )
- {
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
}
}
/* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
- if ( ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) % 2 )
+ if ( ( hMCT->nchan_out_woLFE ) %
+ 2 )
{
st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
}
@@ -493,10 +495,11 @@ ivas_error mct_dec_reconfigure(
st->total_brate = st_ivas->hCPE[cpe_id]->element_brate;
- if ( !( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) )
+ if ( !(
+ ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) )
{
st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
- st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag );
if ( st->igf )
{
IGFDecSetMode( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag );
@@ -622,6 +625,11 @@ void ivas_mct_dec_close(
ivas_error ivas_mc_dec_config(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
const int16_t idx /* i : LS config. index */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */
+ int16_t *data /* o : flushed samples (JBM) */
+#endif
)
{
AUDIO_CONFIG signaled_config;
@@ -651,7 +659,11 @@ ivas_error ivas_mc_dec_config(
{
if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode )
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data );
+#else
ivas_mc_dec_reconfig( st_ivas );
+#endif
}
}
@@ -670,6 +682,11 @@ ivas_error ivas_mc_dec_config(
static ivas_error ivas_mc_dec_reconfig(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */
+ int16_t *data /* o : flushed samples (JBM) */
+#endif
)
{
int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old;
@@ -679,6 +696,14 @@ static ivas_error ivas_mc_dec_reconfig(
Decoder_State *st;
ivas_error error;
MC_MODE mc_mode, last_mc_mode;
+#ifdef JBM_TSM_ON_TCS
+ TC_BUFFER_MODE tc_buffer_mode_new;
+ int16_t tc_nchan_tc_new;
+ int16_t tc_nchan_allocate_new;
+ int16_t tc_granularity_new;
+ AUDIO_CONFIG intern_config_old;
+ IVAS_OUTPUT_SETUP hIntSetupOld;
+#endif
error = IVAS_ERR_OK;
@@ -707,15 +732,65 @@ static ivas_error ivas_mc_dec_reconfig(
{
nchan_hp20_old = nchan_transport_old;
}
- st_ivas->sba_dirac_stereo_flag = 0; /* needs to be after getNumChanSynthesis() */
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
+
+#ifdef JBM_TSM_ON_TCS
+ /* save old IntSetup, might be needed for JBM flushing...*/
+ intern_config_old = st_ivas->intern_config;
+ hIntSetupOld = st_ivas->hIntSetup;
+ tc_granularity_new = 1;
+#endif
/* renderer might have changed, reselect */
renderer_type_old = st_ivas->renderer_type;
ivas_renderer_select( st_ivas );
+
/* side effect of the renderer selection can be a changed internal config */
ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config );
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ /* transfer subframe info from DirAC or ParamMC to central tc buffer */
+ if ( last_mc_mode == MC_MODE_PARAMMC )
+ {
+ st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes;
+ st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered;
+ st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots;
+ st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered;
+ mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hDirAC != NULL )
+ {
+ st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes;
+ st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered;
+ st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots;
+ st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered;
+ mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv
+ render what still fits in the new granularity */
+ tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs );
+ if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity )
+ {
+ if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ /* JBM: when granularity goes up set samples to discard at the beginning of the frame */
+ else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity )
+ {
+ if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+#endif
+
+
if ( st_ivas->mc_mode == MC_MODE_MCT )
{
st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) );
@@ -733,10 +808,23 @@ static ivas_error ivas_mc_dec_reconfig(
ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
}
+ if ( last_mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
+ ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) );
+ }
/* De-allocate McMasa-related handles */
ivas_masa_dec_close( &( st_ivas->hMasa ) );
ivas_qmetadata_close( &st_ivas->hQMetaData );
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDirAC != NULL )
+ {
+ ivas_dirac_dec_close( &st_ivas->hDirAC );
+ vbap_free_data( &( st_ivas->hVBAPdata ) );
+ }
+#endif
+
/* init LS conversion if the renderer type asks for it */
if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL )
{
@@ -747,6 +835,46 @@ static ivas_error ivas_mc_dec_reconfig(
}
}
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ st_ivas->nSCE = 0;
+ st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
+ st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
+
+ if ( last_mc_mode != MC_MODE_PARAMUPMIX )
+ /* This should always be the case, only supporting one bitrate currently */
+ {
+ /*De-allocate handles for other MC modes*/
+ if ( st_ivas->hParamMC != NULL )
+ {
+ ivas_param_mc_dec_close( &st_ivas->hParamMC );
+
+ /* remove ls conversion if it was allocated by ParamMC */
+ ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
+ }
+
+ ivas_masa_dec_close( &( st_ivas->hMasa ) );
+ ivas_qmetadata_close( &st_ivas->hQMetaData );
+
+ /* init LS conversion if the renderer type asks for it */
+ if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL )
+ {
+ if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else
+ {
+ assert( 0 );
+ }
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
if ( last_mc_mode != MC_MODE_PARAMMC )
@@ -774,6 +902,15 @@ static ivas_error ivas_mc_dec_reconfig(
ivas_masa_dec_close( &( st_ivas->hMasa ) );
ivas_qmetadata_close( &st_ivas->hQMetaData );
+#ifdef JBM_TSM_ON_TCS
+ if ( st_ivas->hDirAC != NULL )
+ {
+ ivas_dirac_dec_close( &st_ivas->hDirAC );
+
+ vbap_free_data( &( st_ivas->hVBAPdata ) );
+ }
+#endif
+
if ( last_mc_mode == MC_MODE_MCT )
{
if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS )
@@ -808,6 +945,8 @@ static ivas_error ivas_mc_dec_reconfig(
ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion );
}
+ ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) );
+
if ( st_ivas->hParamMC != NULL )
{
ivas_param_mc_dec_close( &st_ivas->hParamMC );
@@ -887,18 +1026,8 @@ static ivas_error ivas_mc_dec_reconfig(
}
}
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode, st->mct_chan_mode );
- }
- else if ( last_mc_mode == MC_MODE_PARAMMC && st_ivas->mc_mode == MC_MODE_MCT && nchan_transport_old > 2 )
- {
-#ifdef DEBUGGING
- assert( st_ivas->hCPE[1] != NULL );
-#endif
- st = st_ivas->hCPE[1]->hCoreCoder[1];
- st->mct_chan_mode = MCT_CHAN_MODE_LFE;
- st->hTcxCfg->fIsTNSAllowed = 0;
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode );
}
-
if ( st_ivas->mc_mode == MC_MODE_MCMASA )
{
uint8_t separateChannelEnabled;
@@ -911,6 +1040,11 @@ static ivas_error ivas_mc_dec_reconfig(
new_brate_SCE = 0;
new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ new_brate_SCE = 0;
+ new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
+ }
else
{
new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/
@@ -947,20 +1081,11 @@ static ivas_error ivas_mc_dec_reconfig(
return error;
}
- /*-----------------------------------------------------------------*
- * CLDFB instances
- *-----------------------------------------------------------------*/
-
- if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
- {
- return error;
- }
/*-----------------------------------------------------------------*
* Allocate the LFE handle that is coded seperately after the allocation of the core coders
*-----------------------------------------------------------------*/
-
- if ( st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hLFE == NULL )
+ if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL )
{
int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns;
if ( st_ivas->hBinRenderer != NULL )
@@ -981,9 +1106,6 @@ static ivas_error ivas_mc_dec_reconfig(
return error;
}
- /* reuse core-coder buffers for LFE decoder */
- st_ivas->hLFE->prevsynth_buf = &st_ivas->hCPE[1]->hCoreCoder[1]->old_synth_sw[0];
- st_ivas->hLFE->prior_out_buffer = &st_ivas->hCPE[1]->hCoreCoder[1]->previoussynth[0];
set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN );
set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k );
@@ -1017,6 +1139,10 @@ static ivas_error ivas_mc_dec_reconfig(
else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL )
{
ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
+
+#ifdef JBM_TSM_ON_TCS
+ vbap_free_data( &( st_ivas->hVBAPdata ) );
+#endif
}
}
@@ -1113,9 +1239,6 @@ static ivas_error ivas_mc_dec_reconfig(
st_ivas->intern_config,
st_ivas->hDecoderConfig->output_config,
st_ivas->hRenderConfig,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- st_ivas->hDecoderConfig->Opt_Headrotation,
-#endif
st_ivas->hSetOfHRTF,
st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK )
{
@@ -1146,5 +1269,82 @@ static ivas_error ivas_mc_dec_reconfig(
#endif
}
+ /*-----------------------------------------------------------------*
+ * TD Decorrelator
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDiracDecBin != NULL )
+ {
+ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * CLDFB instances
+ *-----------------------------------------------------------------*/
+
+ if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+#ifdef JBM_TSM_ON_TCS
+ /*-----------------------------------------------------------------*
+ * Reconfigure TC buffer
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDecoderConfig->voip_active == 1 )
+ {
+ int16_t tc_nchan_full_new;
+ DECODER_TC_BUFFER_HANDLE hTcBuffer;
+
+ hTcBuffer = st_ivas->hTcBuffer;
+ tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas );
+ tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+ tc_nchan_allocate_new = tc_nchan_tc_new;
+ tc_nchan_full_new = tc_nchan_tc_new;
+ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS;
+ tc_nchan_full_new = tc_nchan_allocate_new;
+ }
+ if ( st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO )
+ {
+ tc_nchan_full_new = 0;
+ }
+
+ /* reconfigure buffer */
+ if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new ||
+ hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ||
+ tc_granularity_new != hTcBuffer->n_samples_granularity )
+ {
+ if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */
+ if ( st_ivas->hDirAC != NULL )
+ {
+ st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
+ st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
+ st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots;
+ st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
+ mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ else if ( st_ivas->hParamMC != NULL )
+ {
+ st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
+ st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
+ st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots;
+ st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
+ mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ }
+#endif
+
return error;
}
diff --git a/lib_dec/ivas_mct_dec_mct.c b/lib_dec/ivas_mct_dec_mct.c
index 7177785984335e307778d3166401851188d13e81..987a9cc72f25a60b4e820972aeb8ae6c4fcb4b8e 100644
--- a/lib_dec/ivas_mct_dec_mct.c
+++ b/lib_dec/ivas_mct_dec_mct.c
@@ -49,9 +49,7 @@
static void indexToChannelPair(
MCT_DEC_BLOCK_DATA_HANDLE hBlock,
const int16_t nChannels,
- const int16_t pairIdx,
- Decoder_State **sts /* i/o: decoder state structure */
-)
+ const int16_t pairIdx )
{
int16_t ch1, ch2;
int16_t tmpIdx = 0;
@@ -60,10 +58,6 @@ static void indexToChannelPair(
{
for ( ch1 = 0; ch1 < ch2; ch1++ )
{
- if ( sts[ch1]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch2]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- continue;
- }
if ( tmpIdx == pairIdx )
{
@@ -105,7 +99,8 @@ void ivas_mct_dec_mct(
/*first get core and overlap info for all channels*/
for ( ch = 0; ch < nchan; ch++ )
{
- if ( ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE ) && hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if (
+ hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
hMCT->mc_global_ild[ch] = get_next_indice( sts[0], SMDCT_GLOBAL_ILD_BITS );
}
@@ -119,7 +114,8 @@ void ivas_mct_dec_mct(
{
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
hMCT->lowE_ch[ch] = get_next_indice( sts[0], 1 );
}
@@ -128,7 +124,8 @@ void ivas_mct_dec_mct(
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
nchan_active++;
}
@@ -141,7 +138,7 @@ void ivas_mct_dec_mct(
/*get channel pair index from BS*/
channelPairIndex = get_next_indice( sts[0], hMCT->bitsChannelPairIndex );
- indexToChannelPair( hBlock, nchan, channelPairIndex, sts );
+ indexToChannelPair( hBlock, nchan, channelPairIndex );
/*point to decoder states of actual channels to read block pair bits*/
p_st[0] = sts[hBlock->ch1];
@@ -170,7 +167,8 @@ static void applyGlobalILD(
int16_t nSubframes, L_subframeTCX;
float qratio;
- for ( ch = 0; ch < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch++ )
+ for ( ch = 0; ch < ( hMCT->nchan_out_woLFE );
+ ch++ )
{
nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV;
L_subframeTCX = sts[ch]->hTcxDec->L_frameTCX / nSubframes;
@@ -252,7 +250,7 @@ void mctStereoIGF_dec(
float *p_x[CPE_CHANNELS][NB_DIV];
int16_t singleChEle[MCT_MAX_CHANNELS];
- set_s( singleChEle, 1, ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) );
+ set_s( singleChEle, 1, ( hMCT->nchan_out_woLFE ) );
for ( b = 0; b < hMCT->currBlockDataCnt; b++ )
{
@@ -305,9 +303,10 @@ void mctStereoIGF_dec(
}
- if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) ) != 0 )
+ if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 )
{
- for ( ch = 0; ch < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch++ )
+ for ( ch = 0; ch < ( hMCT->nchan_out_woLFE );
+ ch++ )
{
if ( singleChEle[ch] )
{
@@ -316,7 +315,7 @@ void mctStereoIGF_dec(
{
continue;
}
- if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE || st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c
index 7763290f8718b03ab40211b3ce781899be1b1996..becf11e070428610fdc436ab17ac3a884021c195 100644
--- a/lib_dec/ivas_mdct_core_dec.c
+++ b/lib_dec/ivas_mdct_core_dec.c
@@ -35,6 +35,7 @@
#include "options.h"
#include "prot.h"
#include "rom_com.h"
+#include "ivas_rom_com.h"
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -162,22 +163,11 @@ static void dec_prm_tcx_sidebits(
getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st0 );
st->hTcxDec->kernel_type[0] = st->hTcxDec->kernel_type[1] = MDCT_IV;
- if ( st->element_mode == IVAS_CPE_MDCT && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 );
- if ( st->core == TCX_10_CORE )
- {
- st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 );
- }
- }
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 );
+ if ( st->core == TCX_10_CORE )
{
- st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP;
- st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP;
- st->hTcxCfg->last_aldo = 0;
+ st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 );
}
-
if ( st->core == TCX_20_CORE )
{
st->transform_type[0] = st->transform_type[1] = TCX_20;
@@ -298,7 +288,6 @@ void ivas_mdct_dec_side_bits_frame_channel(
int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */
Decoder_State *st0, /* i : pointer to bitstream handle */
- int16_t *LFE_off, /* o : flag if LFE has content */
int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */
int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */
const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/
@@ -340,11 +329,7 @@ void ivas_mdct_dec_side_bits_frame_channel(
continue;
}
st = sts[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- *LFE_off = get_next_indice( st0, 1 );
- }
- else if ( MCT_flag )
+ if ( MCT_flag )
{
tmp = get_next_indice( st0, 1 );
if ( tmp )
@@ -362,7 +347,7 @@ void ivas_mdct_dec_side_bits_frame_channel(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && *LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
sts[ch]->coder_type = INACTIVE;
sts[ch]->side_bits_frame_channel = 0;
@@ -384,41 +369,103 @@ void ivas_mdct_dec_side_bits_frame_channel(
* SNS parameters
*--------------------------------------------------------------------------------*/
- skipped_first_channel = 0;
sns_low_br_mode = 0;
- for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ skipped_first_channel = 0;
+ if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) )
{
- st = sts[ch];
-
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && *LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ param_lpc[0][0] = SNS_STEREO_MODE_LR;
+ param_lpc[0][1] = SNS_STEREO_MODE_LR;
+ param_lpc[0][2] = 0;
+ param_lpc[0][3] = 0;
+ if ( sts[0]->core == sts[1]->core )
{
- skipped_first_channel = 1;
- continue;
- }
+ int16_t nSubframes;
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
- start_bit_pos_sns = st0->next_bit_pos;
+ for ( int16_t n = 0; n < nSubframes; ++n )
+ {
+ param_lpc[0][n] = get_next_indice( st0, 1 );
+ }
- if ( ch == 0 || skipped_first_channel )
+ /* zero side flags only get transmitted if needed */
+ for ( int16_t n = 0; n < nSubframes; ++n )
+ {
+ if ( param_lpc[0][n] == SNS_STEREO_MODE_MS )
+ {
+ param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] = get_next_indice( st0, 1 );
+ }
+ }
+ }
+ for ( ch = 0; ch < CPE_CHANNELS; ++ch )
{
- /* read SNS stereo mode */
- param_lpc[0][0] = get_next_indice( st0, 1 ) << 1;
+ int16_t nSubframes;
+ int16_t idxIndices;
- /* read low br mode flag (if it is possible to be non-zero) */
- if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE ) )
+ st = sts[ch];
+ nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ idxIndices = 0;
+
+ for ( int16_t n = 0; n < nSubframes; ++n )
{
- sns_low_br_mode = get_next_indice( st0, 1 );
+ const int16_t is_side = ch == 1 && param_lpc[0][n] == SNS_STEREO_MODE_MS;
+ const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits;
+ int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 );
+
+ if ( is_side )
+ {
+ /* check for zero-side flag */
+ if ( param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] )
+ {
+ continue;
+ }
+ nStages = SNS_MSVQ_NSTAGES_SIDE;
+ bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits;
+ }
+ for ( int16_t j = 0; j < nStages; ++j )
+ {
+ /* plus one in index for stereo mode storage! */
+ param_lpc[ch][j + idxIndices + SNS_STEREO_MODE_OFFSET_INDICES] = get_next_indice( st0, bits[j] );
+ }
+ idxIndices += nStages;
}
}
-
- tmp = ch;
- if ( ch == 1 && param_lpc[0][0] == 2 )
+ }
+ else
+ {
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- tmp = 3;
- }
+ st = sts[ch];
- getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) );
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ {
+ skipped_first_channel = 1;
+ continue;
+ }
+
+ start_bit_pos_sns = st0->next_bit_pos;
+
+ if ( ch == 0 || skipped_first_channel )
+ {
+ /* read SNS stereo mode */
+ param_lpc[0][0] = get_next_indice( st0, 1 ) << 1;
- st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns;
+ /* read low br mode flag (if it is possible to be non-zero) */
+ if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) )
+ {
+ sns_low_br_mode = get_next_indice( st0, 1 );
+ }
+ }
+
+ tmp = ch;
+ if ( ch == 1 && param_lpc[0][0] == 2 )
+ {
+ tmp = 3;
+ }
+
+ getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) );
+
+ st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns;
+ }
}
}
@@ -434,7 +481,6 @@ void ivas_mdct_dec_side_bits_frame_channel(
void ivas_mdct_core_invQ(
CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */
- const int16_t LFE_off, /* i : flag if LFE content */
int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */
int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */
@@ -456,7 +502,7 @@ void ivas_mdct_core_invQ(
int16_t *prm[CPE_CHANNELS];
/* LPC */
Word16 Aind[CPE_CHANNELS][M + 1];
- float lsf[CPE_CHANNELS][( NB_DIV + 1 ) * M];
+ float sns[CPE_CHANNELS][NB_DIV][M];
/* TCX */
float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX];
int16_t tcx_offset[CPE_CHANNELS];
@@ -521,7 +567,7 @@ void ivas_mdct_core_invQ(
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) /* indicates LFE with no content, or odd number of channels */
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
st->total_brate = st->bits_frame_channel;
continue;
@@ -575,12 +621,6 @@ void ivas_mdct_core_invQ(
/* PLC: [Common: mode decision]
* PLC: Decide which Concealment to use. Update pitch lags if needed */
st->core = GetPLCModeDecision( st );
-
- /*disable ACELP_PLC for LFE channel */
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- st->core = st->last_core;
- }
}
if ( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && st->core > ACELP_CORE )
@@ -631,23 +671,31 @@ void ivas_mdct_core_invQ(
if ( bfi == 0 )
{
- if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) )
{
- sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &lsf[0][M], &lsf[1][M] );
+ dequantize_sns( param_lpc, sns, sts );
}
else
{
- for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
- st = sts[ch];
- if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ sns_avq_dec_stereo( param_lpc[0], param_lpc[1], sts[0]->L_frame, &sns[0][0][0], &sns[1][0][0] );
+ }
+ else
+ {
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- sns_avq_dec( param_lpc[ch], &lsf[ch][M], st->numlpc );
+ st = sts[ch];
+ if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ {
+ sns_avq_dec( param_lpc[ch], sns[ch], st->L_frame, st->numlpc );
+ }
}
}
}
}
+
/*--------------------------------------------------------------*
* Rate switching
*---------------------------------------------------------------*/
@@ -670,7 +718,7 @@ void ivas_mdct_core_invQ(
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) /* indicates LFE with no content, or odd number of channels */
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
set_f( x[ch][0], 0.f, st->hTcxCfg->tcx_coded_lines );
/* usually set in decoder_tcx_invQ(), needed for concealment */
@@ -690,7 +738,7 @@ void ivas_mdct_core_invQ(
/* Stability Factor */
if ( !bfi )
{
- mvr2r( &lsf[ch][( k + 1 ) * M], &Aq[ch][k * M], M );
+ mvr2r( sns[ch][k], &Aq[ch][k * M], M );
}
else
{
@@ -726,11 +774,6 @@ void ivas_mdct_core_invQ(
decoder_tcx_noiseshaping_igf( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], NULL, &tmp_concealment_method, bfi );
}
}
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) /*indicates LFE with no content*/
- {
- set_f( &x[ch][0][MCT_LFE_MAX_LINE], 0.f, st->hTcxCfg->tcx_coded_lines - MCT_LFE_MAX_LINE );
- }
}
pop_wmops();
@@ -748,7 +791,6 @@ void ivas_mdct_core_reconstruct(
CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
float *x[][NB_DIV], /* i/o: synthesis @internal_FS */
float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */
- const int16_t LFE_off, /* i : flag if LFE content */
int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */
const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/
)
@@ -772,7 +814,6 @@ void ivas_mdct_core_reconstruct(
int16_t pitch[CPE_CHANNELS][NB_SUBFR16k];
float pit_gain[CPE_CHANNELS][NB_SUBFR16k];
- int16_t isLFE;
int16_t skip_decoding;
set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX );
@@ -787,17 +828,11 @@ void ivas_mdct_core_reconstruct(
st = sts[ch];
skip_decoding = 0;
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) /* indicates LFE with no content, or odd number of channels */
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
skip_decoding = 1;
}
- isLFE = 0;
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- isLFE = 1;
- }
-
nSubframes[ch] = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV;
synth = synth_buf + st->hTcxDec->old_synth_len;
synthFB = synth_bufFB + st->hTcxDec->old_synth_lenFB;
@@ -822,7 +857,8 @@ void ivas_mdct_core_reconstruct(
decoder_tcx_imdct( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch],
tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], &x[ch][k][0], xn_buf,
( ( hCPE->nchan_out == 1 && st->hTcxDec->kernel_type[k] == MDST_IV ) || st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ? MDCT_IV : st->hTcxDec->kernel_type[k],
- fUseTns[ch][k], &synth[k * L_frame[ch]], &synthFB[k * L_frameTCX[ch]], bfi, k, isLFE, 0 );
+ fUseTns[ch][k], &synth[k * L_frame[ch]], &synthFB[k * L_frameTCX[ch]], bfi, k,
+ 0 );
}
else
{
@@ -969,7 +1005,6 @@ void ivas_mdct_core_reconstruct(
void ivas_mdct_core_tns_ns(
CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
- const int16_t LFE_off, /* i : flag if LFE has content */
int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */
STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */
float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */
@@ -997,6 +1032,7 @@ void ivas_mdct_core_tns_ns(
set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX );
+
/* TNS, ITF, IMDCT and updates */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
@@ -1006,7 +1042,8 @@ void ivas_mdct_core_tns_ns(
L_frameTCX_glob[ch] = st->hTcxDec->L_frameTCX / nSubframes[ch];
L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) || ( st->bfi && st->core == ACELP_CORE ) ) /* indicates LFE with no content, or odd number of channels */
+ if (
+ ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) || ( st->bfi && st->core == ACELP_CORE ) ) /* indicates LFE with no content, or odd number of channels */
{
if ( st->hTonalMDCTConc != NULL )
{
diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c
index 98150021101814c1e63a372e659d95e25c601b7f..1a54c5ab7525f83b0e80df808afe8ba9e3d56c9e 100644
--- a/lib_dec/ivas_objectRenderer_internal.c
+++ b/lib_dec/ivas_objectRenderer_internal.c
@@ -53,13 +53,8 @@ ivas_error ivas_td_binaural_open(
Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
)
{
-#ifdef TD5
return ivas_td_binaural_open_unwrap( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, st_ivas->ivas_format,
st_ivas->transport_config, st_ivas->hRenderConfig->directivity, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns );
-#else
- return ivas_td_binaural_open_unwrap( &st_ivas->hHrtfTD, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, st_ivas->ivas_format,
- st_ivas->transport_config, st_ivas->hTransSetup, &st_ivas->hBinRendererTd, &st_ivas->binaural_latency_ns );
-#endif
}
@@ -71,32 +66,192 @@ ivas_error ivas_td_binaural_open(
*---------------------------------------------------------------------*/
ivas_error ivas_td_binaural_renderer(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+#else
float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
- const int16_t output_frame /* i : output frame length */
+#endif
+ const int16_t output_frame /* i : output frame length */
)
{
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t ism_md_subframe_update;
+
+ if ( st_ivas->hDecoderConfig->Opt_delay_comp )
+ {
+ ism_md_subframe_update = 1;
+ }
+ else
+ {
+ ism_md_subframe_update = 2;
+ }
return ivas_td_binaural_renderer_unwrap(
st_ivas->hReverb,
st_ivas->transport_config,
st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format,
-#ifdef TD5
-#ifdef EXTERNAL_ORIENTATIONS
st_ivas->hIsmMetaData,
+#ifdef EXTERNAL_ORIENTATIONS
( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL,
( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL,
- ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame );
#else
- st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL,
- ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame );
+ st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL,
#endif
+ ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame );
#else
-#ifdef EXTERNAL_ORIENTATIONS
+ return ivas_td_binaural_renderer_unwrap(
+ st_ivas->hReverb,
+ st_ivas->transport_config,
+ st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format,
st_ivas->hIsmMetaData,
+#ifdef EXTERNAL_ORIENTATIONS
( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL,
( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL,
#else
- st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, output, output_frame );
+ st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL,
#endif
+ ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame );
#endif
}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*---------------------------------------------------------------------*
+ * ivas_td_binaural_renderer_sf()
+ *
+ * Receives the current frames for the object streams, updates metadata
+ * and renders the current frame.
+ *---------------------------------------------------------------------*/
+
+ivas_error ivas_td_binaural_renderer_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */
+)
+{
+ int16_t first_sf, last_sf, subframe_idx;
+ float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
+ float *p_reverb_signal[BINAURAL_CHANNELS];
+ float *output_f_local[BINAURAL_CHANNELS];
+ float *tc_local[MAX_TRANSPORT_CHANNELS];
+ int16_t ch, slot_size, slots_to_render, output_frame;
+ ivas_error error;
+
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t ism_md_subframe_update_jbm;
+ int16_t c_indx, nS;
+
+ /* Number of subframes to delay metadata to sync with audio */
+ if ( st_ivas->hDecoderConfig->Opt_delay_comp )
+ {
+ ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 );
+ }
+ else
+ {
+ ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2;
+ }
+
+#endif
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ p_reverb_signal[ch] = reverb_signal[ch];
+ }
+
+ for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ )
+ {
+ tc_local[ch] = st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered;
+ }
+
+ for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ )
+ {
+ output_f_local[ch] = output[ch];
+ }
+
+ slot_size = st_ivas->hTcBuffer->n_samples_granularity;
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size );
+ first_sf = st_ivas->hTcBuffer->subframes_rendered;
+ last_sf = first_sf;
+ st_ivas->hTcBuffer->slots_rendered += slots_to_render;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity;
+
+ /* Update object position(s) */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ c_indx = 0;
+
+ for ( nS = 0; nS < st_ivas->nchan_transport; nS++ )
+ {
+ if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */
+ {
+ st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS];
+ st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE;
+ c_indx++;
+ }
+ }
+ if ( subframe_idx == ism_md_subframe_update_jbm )
+ {
+ TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData );
+ }
+#else
+ TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local );
+#endif
+
+ /* Update the listener's location/orientation */
+ TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, st_ivas->hDecoderConfig->Opt_Headrotation,
+ ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL,
+ ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL );
+
+ if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) )
+ {
+ if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /* Render subframe */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ) ) != IVAS_ERR_OK )
+#endif
+ {
+ return error;
+ }
+
+ if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */
+ {
+ if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on )
+ {
+ /* add reverb to rendered signals */
+ v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame );
+ v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame );
+ }
+ }
+
+ for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ )
+ {
+ tc_local[ch] += output_frame;
+ }
+
+ for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ )
+ {
+ output_f_local[ch] += output_frame;
+ }
+ }
+
+ st_ivas->hTcBuffer->subframes_rendered = last_sf;
+
+ return IVAS_ERR_OK;
+}
+#endif
diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c
index 225a1c85b5f9ecdcf444ceebda5552857c6bb4a6..7d14ee5041ad42eb604bd594911bfa2232b7ef0a 100644
--- a/lib_dec/ivas_out_setup_conversion.c
+++ b/lib_dec/ivas_out_setup_conversion.c
@@ -312,7 +312,16 @@ ivas_error ivas_ls_setup_conversion_open(
int16_t output_frame;
int32_t output_Fs;
int16_t nchan_out;
+ int16_t paramUpmixMonoStereo;
+ if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
+ {
+ paramUpmixMonoStereo = TRUE;
+ }
+ else
+ {
+ paramUpmixMonoStereo = FALSE;
+ }
output_Fs = st_ivas->hDecoderConfig->output_Fs;
nchan_out = st_ivas->hDecoderConfig->nchan_out;
output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
@@ -351,7 +360,22 @@ ivas_error ivas_ls_setup_conversion_open(
}
else
{
- inChannels = st_ivas->nchan_transport;
+ if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ if ( paramUpmixMonoStereo == TRUE )
+ {
+ inChannels = audioCfg2channels( AUDIO_CONFIG_5_1_2 );
+ }
+ else
+ {
+ inChannels = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe;
+ }
+ }
+ else
+ {
+ inChannels = st_ivas->nchan_transport;
+ }
+
/*Initialization of MDCT bands with TCX20 resolution */
ivas_lssetupconversion_mdct_init_bands( output_frame, TCX_20_CORE, &hLsSetUpConversion->sfbOffset[0], &hLsSetUpConversion->sfbCnt );
if ( ( hLsSetUpConversion->targetEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL )
@@ -397,7 +421,14 @@ ivas_error ivas_ls_setup_conversion_open(
{
if ( st_ivas->transport_config != AUDIO_CONFIG_INVALID )
{
- get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config );
+ if ( paramUpmixMonoStereo == TRUE )
+ {
+ get_ls_conversion_matrix( hLsSetUpConversion, AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config );
+ }
+ else
+ {
+ get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config );
+ }
}
else
{
@@ -465,8 +496,14 @@ void ivas_ls_setup_conversion_close(
void ivas_ls_setup_conversion(
Decoder_Struct *st_ivas, /* i : IVAS decoder structure */
+ const int16_t input_chans, /* i : number of input channels to the renderer */
const int16_t output_frame, /* i : frame length */
- float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */
+#ifdef JBM_TSM_ON_TCS
+ float *input[], /* i : LS input/output synthesis signal */
+ float *output[] /* i/o: LS input/output synthesis signal */
+#else
+ float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */
+#endif
)
{
int16_t chInIdx, chOutIdx, idx;
@@ -481,7 +518,7 @@ void ivas_ls_setup_conversion(
for ( chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ )
{
set_zero( output_tmp[chOutIdx], output_frame );
- for ( chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ )
+ for ( chInIdx = 0; chInIdx < input_chans; chInIdx++ )
{
dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx];
@@ -493,14 +530,22 @@ void ivas_ls_setup_conversion(
{
for ( idx = 0; idx < output_frame; idx++ )
{
+#ifdef JBM_TSM_ON_TCS
+ output_tmp[chOutIdx][idx] += input[chInIdx][idx];
+#else
output_tmp[chOutIdx][idx] += output[chInIdx][idx];
+#endif
}
}
else
{
for ( idx = 0; idx < output_frame; idx++ )
{
+#ifdef JBM_TSM_ON_TCS
+ tmpVal = dmxCoeff * input[chInIdx][idx];
+#else
tmpVal = dmxCoeff * output[chInIdx][idx];
+#endif
output_tmp[chOutIdx][idx] += tmpVal;
}
}
@@ -600,7 +645,9 @@ void ivas_ls_setup_conversion_process_mdct(
{
dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx];
- if ( !( chInIdx == LFE_CHANNEL && st_ivas->hMCT->LFE_off ) && mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE )
+ if (
+ chInIdx != LFE_CHANNEL &&
+ mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE )
{
/* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */
if ( dmxCoeff )
@@ -693,7 +740,9 @@ void ivas_ls_setup_conversion_process_mdct(
/* Step 4: Perform equalization */
for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ )
{
- if ( !( chInIdx == LFE_CHANNEL && st_ivas->hMCT->LFE_off ) && mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE )
+ if (
+ chInIdx != LFE_CHANNEL &&
+ mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE )
{
if ( transform_type[chInIdx][0] == TCX_20 )
{
@@ -1094,7 +1143,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc(
*-------------------------------------------------------------------------*/
void ivas_lssetupconversion_process_param_mc(
- Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */
+ Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t num_timeslots,
+#endif
float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */
float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */
int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */
@@ -1121,8 +1173,12 @@ void ivas_lssetupconversion_process_param_mc(
set_s( channel_active, 0, outChannels );
- /* Loop over each time slots and compute dmx for each time slot */
+/* Loop over each time slots and compute dmx for each time slot */
+#ifdef JBM_TSM_ON_TCS
+ for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ )
+#else
for ( slotIdx = 0; slotIdx < st_ivas->hParamMC->subframe_nbslots; slotIdx++ )
+#endif
{
/* copy buffers */
for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ )
diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c
index 9a542f0797324e7c6fded5c74a0b7bd337c46879..071261f85c5a739ae76338c361343306ab9cd6f2 100644
--- a/lib_dec/ivas_output_config.c
+++ b/lib_dec/ivas_output_config.c
@@ -114,7 +114,7 @@ void ivas_renderer_select(
else
{
*renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM;
-#if defined( DEBUGGING )
+#ifdef DEBUGGING
if ( st_ivas->hRenderConfig->renderer_type_override == RENDER_TYPE_OVERRIDE_FASTCONV )
{
*renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM;
@@ -152,7 +152,8 @@ void ivas_renderer_select(
if ( st_ivas->hDecoderConfig->Opt_Headrotation )
{
- nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order );
+ nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
if ( nchan_internal == 2 )
{
st_ivas->hHeadTrackData->shd_rot_max_order = 1;
@@ -192,15 +193,16 @@ void ivas_renderer_select(
{
#ifdef DEBUGGING
#ifdef EXTERNAL_ORIENTATIONS
- if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) )
+ if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) )
#else
- if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) )
+ if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) )
#endif
#else
#ifdef EXTERNAL_ORIENTATIONS
- if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( st_ivas->mc_mode == MC_MODE_MCT ) )
+ if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
#else
- if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT ) )
+ if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
+#endif
#endif
#endif
{
@@ -208,7 +210,7 @@ void ivas_renderer_select(
}
else
{
- if ( st_ivas->mc_mode == MC_MODE_MCT )
+ if ( ( st_ivas->mc_mode == MC_MODE_MCT ) || ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
{
*renderer_type = RENDERER_BINAURAL_MIXER_CONV;
}
@@ -240,7 +242,7 @@ void ivas_renderer_select(
}
else /* AUDIO_CONFIG_BINAURAL_ROOM */
{
- if ( st_ivas->mc_mode == MC_MODE_MCT )
+ if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
{
*renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM;
}
@@ -267,6 +269,13 @@ void ivas_renderer_select(
* Non-binaural rendering configurations
*-----------------------------------------------------------------*/
+ else if ( st_ivas->ivas_format == MONO_FORMAT )
+ {
+ if ( output_config == AUDIO_CONFIG_STEREO )
+ {
+ *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX;
+ }
+ }
else if ( st_ivas->ivas_format == STEREO_FORMAT )
{
if ( output_config != AUDIO_CONFIG_STEREO && output_config != AUDIO_CONFIG_MONO )
@@ -276,46 +285,57 @@ void ivas_renderer_select(
}
else if ( st_ivas->ivas_format == ISM_FORMAT )
{
- if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ if ( ( output_config == AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) )
{
- *renderer_type = RENDERER_PARAM_ISM;
- if ( output_config == AUDIO_CONFIG_MONO )
- {
- *renderer_type = RENDERER_MONO_DOWNMIX;
- }
- else if ( output_config == AUDIO_CONFIG_STEREO )
- {
- *renderer_type = RENDERER_DISABLE;
- }
- else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 )
- {
- *renderer_type = RENDERER_SBA_LINEAR_ENC;
- *internal_config = AUDIO_CONFIG_7_1_4;
- }
+ *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX;
}
- else /* ISM_MODE_DISC */
+ else
{
- *renderer_type = RENDERER_TD_PANNING;
- if ( output_config == AUDIO_CONFIG_MONO )
- {
- *renderer_type = RENDERER_MONO_DOWNMIX;
- }
- else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 )
+ if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- *renderer_type = RENDERER_SBA_LINEAR_ENC;
+ *renderer_type = RENDERER_PARAM_ISM;
+ if ( output_config == AUDIO_CONFIG_MONO )
+ {
+ *renderer_type = RENDERER_MONO_DOWNMIX;
+ }
+ else if ( output_config == AUDIO_CONFIG_STEREO )
+ {
+ *renderer_type = RENDERER_DISABLE;
+ }
+ else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 )
+ {
+ *renderer_type = RENDERER_SBA_LINEAR_ENC;
+ *internal_config = AUDIO_CONFIG_7_1_4;
+ }
}
- else if ( output_config == AUDIO_CONFIG_EXTERNAL )
+ else /* ISM_MODE_DISC */
{
- *renderer_type = RENDERER_DISABLE;
+ *renderer_type = RENDERER_TD_PANNING;
+ if ( output_config == AUDIO_CONFIG_MONO )
+ {
+ *renderer_type = RENDERER_MONO_DOWNMIX;
+ }
+ else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 )
+ {
+ *renderer_type = RENDERER_SBA_LINEAR_ENC;
+ }
+ else if ( output_config == AUDIO_CONFIG_EXTERNAL )
+ {
+ *renderer_type = RENDERER_DISABLE;
+ }
}
}
}
else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT )
{
*renderer_type = RENDERER_DIRAC;
-
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT &&
+ ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) )
+#else
if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR &&
- ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM ) )
+ ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) )
+#endif
{
if ( output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_FOA )
{
@@ -332,7 +352,7 @@ void ivas_renderer_select(
st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC;
}
else if ( ( st_ivas->ivas_format == MASA_FORMAT && output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ||
- ( st_ivas->ivas_format == SBA_FORMAT && output_config == AUDIO_CONFIG_STEREO && st_ivas->nchan_transport == 1 ) )
+ ( st_ivas->ivas_format == SBA_FORMAT && ( output_config == AUDIO_CONFIG_STEREO || output_config == AUDIO_CONFIG_MONO ) ) )
{
*renderer_type = RENDERER_DISABLE;
}
@@ -367,6 +387,21 @@ void ivas_renderer_select(
*renderer_type = RENDERER_SBA_LINEAR_ENC;
}
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ *internal_config = transport_config;
+ if ( *internal_config != output_config )
+ {
+ if ( output_config != AUDIO_CONFIG_FOA && output_config != AUDIO_CONFIG_HOA2 && output_config != AUDIO_CONFIG_HOA3 )
+ {
+ *renderer_type = RENDERER_MC;
+ }
+ else
+ {
+ *renderer_type = RENDERER_SBA_LINEAR_ENC;
+ }
+ }
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 )
diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c
index 4444a73cee237441b406bcbce27b60ff7adff240..e73b3aa1d61f6025322a0913b7b8ea964680ab23 100644
--- a/lib_dec/ivas_pca_dec.c
+++ b/lib_dec/ivas_pca_dec.c
@@ -232,7 +232,7 @@ void ivas_pca_dec(
mvr2r( &hPCA->mem_eigVec_interp[IVAS_PCA_N_SLOTS * 16], hPCA->mem_eigVec_interp, IVAS_PCA_DELAY_CMP * 16 );
- /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // VE: and what happens in DTX where "ivas_total_brate" can be close to zero?
+ /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // ToDo: and what happens in DTX where "ivas_total_brate" can be close to zero?
/* handle bit rate switching */
if ( ivas_total_brate != PCA_BRATE || ( ivas_total_brate == PCA_BRATE && n_channels > FOA_CHANNELS ) )
@@ -240,8 +240,6 @@ void ivas_pca_dec(
/* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */
pca_dec_reset_dquat( ql, qr );
- // VE: todo - rather call PCA resets in the first PCA frame
-
if ( ( last_ivas_total_brate != PCA_BRATE ) || ( last_ivas_total_brate == PCA_BRATE && hPCA->prev_pca_bypass > 1 ) )
{
pca_dec_reset_mem_eigvec( hPCA );
diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c
index 9c6597fdcb881530b248d221ae0934ea93b22882..cfd748afde8b0959e535b91ced447c6f87a2c65c 100644
--- a/lib_dec/ivas_qmetadata_dec.c
+++ b/lib_dec/ivas_qmetadata_dec.c
@@ -49,9 +49,19 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, i
static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, int16_t *dfRatio_bits );
-static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band );
+static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
-static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band );
+static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, int16_t *index, const uint16_t alphabet_size );
@@ -77,11 +87,21 @@ static int16_t read_truncGR_azimuth( uint16_t *bitstream, IVAS_QDIRECTION *q_dir
static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, uint16_t *out, const int16_t start_pos, const int16_t len, const int16_t *huff_code, const int16_t max_len );
-static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir );
+static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData );
-static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames );
+static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
static void decode_combined_index( uint64_t comb_index, const int16_t *no_cv_vec, uint16_t *index, const int16_t len );
@@ -91,6 +111,19 @@ static int16_t read_GR_min_removed_data( uint16_t *bitstream, int16_t *p_bit_pos
static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t no_bands, int16_t *no_cv_vec, uint16_t *decoded_index, const int16_t no_symb );
+#ifdef HR_METADATA
+static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame );
+
+static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction );
+
+static int16_t ivas_qmetadata_raw_decode_dir_512( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const SPHERICAL_GRID_DATA *sph_grid16 );
+
+static int16_t read_surround_coherence_hr( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData );
+
+static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t nbits_coh );
+#endif
+
+
/*-----------------------------------------------------------------------*
* Global function definitions
*-----------------------------------------------------------------------*/
@@ -103,9 +136,11 @@ static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream,
/*! r: number of bits read */
int16_t ivas_qmetadata_dec_decode(
- IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */
- uint16_t *bitstream, /* i : bitstream */
- int16_t *index /* i/o: bitstream position */
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index /* i/o: bitstream position */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */
)
{
int16_t d, b, m;
@@ -135,7 +170,6 @@ int16_t ivas_qmetadata_dec_decode(
int16_t reduce_bits;
int16_t ind_order[MASA_MAXIMUM_CODING_SUBBANDS];
-
#ifdef DEBUG_MODE_QMETADATA
static FILE *pF = NULL;
static FILE *pF_azi = NULL;
@@ -192,23 +226,43 @@ int16_t ivas_qmetadata_dec_decode(
}
bits_diff_sum = 0;
-
bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] );
- if ( hQMetaData->no_directions == 2 )
+ if ( hodirac_flag )
{
- /* Calculate bits for dfRatio */
- dir2band = 0;
- for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ if ( hQMetaData->no_directions == 2 )
{
- if ( hQMetaData->twoDirBands[b] == 1 )
+ /* Calculate bits for dfRatio */
+ dir2band = 0;
+ for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
{
- dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] );
- dir2band++;
+ if ( hQMetaData->twoDirBands[b] == 1 )
+ {
+ dfRatio_bits[dir2band] = ivas_get_df_ratio_bits_hodirac( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] );
+ dir2band++;
+ }
}
+
+ bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits );
}
+ }
+ else
+ {
+ if ( hQMetaData->no_directions == 2 )
+ {
+ /* Calculate bits for dfRatio */
+ dir2band = 0;
+ for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ if ( hQMetaData->twoDirBands[b] == 1 )
+ {
+ dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] );
+ dir2band++;
+ }
+ }
- bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits );
+ bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits );
+ }
}
/* Calculate direct-to-total energy ratios for both directions from diffuse-to-total ratio and distribution factor of direct-to-total ratios */
@@ -224,14 +278,33 @@ int16_t ivas_qmetadata_dec_decode(
diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]];
dfRatio_qsteps = 1 << dfRatio_bits[dir2band];
- dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) );
+ /* already encoded as total and ratios in HO-DirAC */
+ if ( hodirac_flag )
+ {
+ dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) );
+ dir1ratio = 1.f - diffRatio;
+ dir2ratio = dfRatio;
+ }
+ else
+ {
+ dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) );
+
+ dir1ratio = dfRatio * ( 1.0f - diffRatio );
+ dir2ratio = ( 1.0f - diffRatio ) - dir1ratio;
+ }
- dir1ratio = dfRatio * ( 1.0f - diffRatio );
- dir2ratio = ( 1.0f - diffRatio ) - dir1ratio;
/* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */
hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
- hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ if ( hodirac_flag )
+ {
+ float tmp;
+ hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS );
+ }
+ else
+ {
+ hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ }
for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
{
@@ -287,7 +360,8 @@ int16_t ivas_qmetadata_dec_decode(
index_dirRatio1Inv = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0];
index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0];
- masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod );
+ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod,
+ hodirac_flag );
for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
{
@@ -385,9 +459,15 @@ int16_t ivas_qmetadata_dec_decode(
/* Read coherence, if any */
bits_coherence = 0;
+
if ( all_coherence_zero == 0 )
{
- bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d );
+ bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
else
{
@@ -435,11 +515,21 @@ int16_t ivas_qmetadata_dec_decode(
if ( raw_flag[0] == 0 )
{
- bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band );
+ bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
else
{
- bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band );
+ bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
}
/* Decode quantized directions band-wise */
@@ -459,7 +549,12 @@ int16_t ivas_qmetadata_dec_decode(
{
if ( raw_flag[b] == 0 )
{
- bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b );
+ bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
else
{
@@ -503,7 +598,12 @@ int16_t ivas_qmetadata_dec_decode(
{
if ( raw_flag[b] )
{
- bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b );
+ bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
}
}
@@ -537,7 +637,12 @@ int16_t ivas_qmetadata_dec_decode(
{
if ( nblocks > 1 )
{
- decode_spread_coherence( hQMetaData, d, nblocks );
+ decode_spread_coherence( hQMetaData, d, nblocks
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
}
else
@@ -575,72 +680,500 @@ int16_t ivas_qmetadata_dec_decode(
{
fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f );
fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f );
- fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] );
+ fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] );
+ if ( q_direction->coherence_band_data != NULL )
+ {
+ fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[b].spread_coherence[m] );
+ }
+ if ( d == 0 && hQMetaData->surcoh_band_data != NULL )
+ {
+ fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] );
+ }
+ }
+ }
+ fprintf( pF_azi, "\n" );
+ fprintf( pF_ele, "\n" );
+ fprintf( pF_ratio, "\n" );
+ fprintf( pF_spcoh, "\n" );
+ if ( d == 0 )
+ {
+ fprintf( pF_surcoh, "\n" );
+ }
+#endif
+ }
+
+ /* move 2 dir data to its correct subband */
+ if ( hQMetaData->no_directions == 2 )
+ {
+ d = hQMetaData->q_direction[1].cfg.nbands - 1;
+ nblocks = hQMetaData->q_direction[0].cfg.nblocks;
+
+ for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- )
+ {
+ if ( hQMetaData->twoDirBands[b] == 1 )
+ {
+ mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks );
+ mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks );
+ mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks );
+
+ if ( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] < 7 )
+ {
+ for ( m = 0; m < nblocks; m++ )
+ {
+ hQMetaData->q_direction[1].band_data[b].azimuth[m] += hQMetaData->q_direction[0].band_data[b].azimuth[m] - 180;
+ if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] >= 180 )
+ {
+ hQMetaData->q_direction[1].band_data[b].azimuth[m] -= 360;
+ }
+ if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] < -180 )
+ {
+ hQMetaData->q_direction[1].band_data[b].azimuth[m] += 360;
+ }
+ }
+ }
+
+ if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
+ {
+ mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks );
+ }
+ d--;
+ }
+ else
+ {
+ set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks );
+
+ if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks );
+ }
+ }
+ }
+
+ /* Scale energy ratios that sum to over one */
+ if ( !hodirac_flag )
+ {
+ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ float ratioSum;
+
+ ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0];
+
+ if ( ratioSum > 1.0f )
+ {
+ set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks );
+ }
+ }
+ }
+ }
+
+ /* Store status information for renderer use */
+ hQMetaData->ec_flag = ec_flag;
+
+ hQMetaData->dir_comp_ratio = (float) bits_dir_used / (float) bits_dir_target;
+
+ if ( hQMetaData->dir_comp_ratio > 1.0f )
+ {
+ hQMetaData->dir_comp_ratio = 1.0f;
+ }
+
+ return ( start_index_0 - *index );
+}
+
+
+#ifdef HR_METADATA
+/*-----------------------------------------------------------------------*
+ * ivas_qmetadata_dec_decode_hr_384_512()
+ *
+ * Main function for decoding Spatial Metadata at HRs
+ *-----------------------------------------------------------------------*/
+
+/*! r: number of bits read */
+int16_t ivas_qmetadata_dec_decode_hr_384_512(
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index, /* i/o: bitstream position */
+ const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */
+ const int16_t bits_sph_idx,
+ const int16_t bits_sp_coh
+#ifdef FIX_HBR_MASAMETA
+ ,
+ uint8_t ncoding_bands_config
+#endif
+)
+{
+ int16_t d, b, m;
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ int16_t bits_diff_sum;
+#endif
+#else
+ int16_t bits_diff_sum;
+#endif
+ int16_t nbands, start_band;
+ IVAS_QDIRECTION *q_direction;
+ int16_t start_index_0;
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ int16_t bits_no_dirs_coh, bits_sur_coherence;
+#endif
+#else
+ int16_t bits_no_dirs_coh, bits_sur_coherence;
+#endif
+ uint16_t all_coherence_zero;
+ int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS];
+#ifdef FIX_HBR_MASAMETA
+ int16_t codedBands, sf_nbands0, sf_nbands1;
+ sf_nbands1 = 1;
+#endif
+
+#ifdef DEBUG_MODE_QMETADATA
+ static FILE *pF = NULL;
+ static FILE *pF_azi = NULL;
+ static FILE *pF_ele = NULL;
+ static FILE *pF_ratio = NULL;
+ static FILE *pF_spcoh = NULL;
+ static FILE *pF_surcoh = NULL;
+
+ if ( pF == NULL )
+ pF = fopen( "./res/qmetadata_dec.txt", "w" );
+ if ( pF_azi == NULL )
+ pF_azi = fopen( "./res/qmetadata_azi_dec.txt", "w" );
+ if ( pF_ele == NULL )
+ pF_ele = fopen( "./res/qmetadata_ele_dec.txt", "w" );
+ if ( pF_ratio == NULL )
+ pF_ratio = fopen( "./res/qmetadata_ratio_dec.txt", "w" );
+ if ( pF_spcoh == NULL )
+ pF_spcoh = fopen( "./res/qmetadata_spcoh_dec.txt", "w" );
+ if ( pF_surcoh == NULL )
+ pF_surcoh = fopen( "./res/qmetadata_surcoh_dec.txt", "w" );
+#endif
+
+ start_index_0 = *index;
+#ifdef FIX_HBR_MASAMETA
+ /* read number of higher inactive/not encoded bands */
+ if ( bitstream[( *index )--] )
+ {
+ codedBands = MASA_MAXIMUM_CODING_SUBBANDS - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1;
+ }
+ else
+ {
+ codedBands = MASA_MAXIMUM_CODING_SUBBANDS;
+ }
+ for ( b = codedBands; b < ncoding_bands_config; b++ )
+ {
+ for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ )
+ {
+ hQMetaData->q_direction[0].band_data[b].azimuth[m] = 0.0f;
+ hQMetaData->q_direction[0].band_data[b].elevation[m] = 0.0f;
+ hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 0.0f;
+
+ if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL )
+ {
+ hQMetaData->q_direction[0].coherence_band_data[b].spread_coherence[m] = 0u;
+ }
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+ hQMetaData->q_direction[1].band_data[b].azimuth[m] = 0.0f;
+ hQMetaData->q_direction[1].band_data[b].elevation[m] = 0.0f;
+ hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 0.0f;
+
+ if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL )
+ {
+ hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence[m] = 0u;
+ }
+ }
+
+ if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL )
+ {
+ hQMetaData->surcoh_band_data[b].surround_coherence[m] = 0u;
+ }
+ }
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+ hQMetaData->twoDirBands[b] = 0;
+ }
+ }
+ sf_nbands0 = hQMetaData->q_direction[0].cfg.nbands;
+
+ hQMetaData->q_direction[0].cfg.nbands = codedBands;
+
+#endif
+ /*Coherence flag decoding*/
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh = 0;
+#endif
+#else
+ bits_no_dirs_coh = 0;
+#endif
+ all_coherence_zero = 1;
+ if ( hQMetaData->coherence_flag )
+ {
+ /* read if coherence is zero */
+ all_coherence_zero = bitstream[( *index )--];
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh += 1;
+#endif
+#else
+ bits_no_dirs_coh += 1;
+#endif
+ }
+
+ hQMetaData->all_coherence_zero = (uint8_t) all_coherence_zero;
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+ set_c( (int8_t *) hQMetaData->twoDirBands, 1, hQMetaData->q_direction[0].cfg.nbands );
+ }
+
+ if ( bits_sph_idx == 11 && hQMetaData->no_directions == 2 )
+ {
+ /* Read which bands have 2 directions */
+ hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands;
+#ifdef FIX_HBR_MASAMETA
+ sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands;
+ if ( hQMetaData->q_direction[1].cfg.nbands > codedBands )
+ {
+ hQMetaData->q_direction[1].cfg.nbands = codedBands;
+ }
+#endif
+ set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands );
+ d = *index;
+ dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 );
+ p[0] = dif_p[0];
+ hQMetaData->twoDirBands[p[0]] = 1;
+#ifdef FIX_HBR_MASAMETA
+ for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ )
+#else
+ for ( b = 1; b < hQMetaData->numTwoDirBands; b++ )
+#endif
+ {
+ dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 );
+ p[b] = p[b - 1] + dif_p[b] + 1;
+ hQMetaData->twoDirBands[p[b]] = 1;
+ }
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh += ( d - *index );
+#endif
+#else
+ bits_no_dirs_coh += ( d - *index );
+#endif
+ }
+
+#ifdef FIX_HBR_MASAMETA
+ if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 )
+ {
+ sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands;
+ if ( hQMetaData->q_direction[1].cfg.nbands > codedBands )
+ {
+ hQMetaData->q_direction[1].cfg.nbands = codedBands;
+ }
+ }
+#endif
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_diff_sum =
+#endif
+#else
+ bits_diff_sum =
+#endif
+ ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) );
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_diff_sum +=
+#endif
+#else
+ bits_diff_sum +=
+#endif
+ ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) );
+ }
+
+
+ for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
+ {
+ hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m]];
+ }
+ }
+ if ( hQMetaData->no_directions == 2 )
+ {
+ for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ )
+ {
+ for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ )
+ {
+ hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]];
+ if ( hQMetaData->q_direction[1].band_data[b].energy_ratio[m] > 1.0f - hQMetaData->q_direction[0].band_data[b].energy_ratio[m] )
+ {
+ hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - hQMetaData->q_direction[0].band_data[b].energy_ratio[m];
+ }
+ }
+ }
+ }
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+ for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ )
+ {
+ for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ )
+ {
+ hQMetaData->q_direction[1].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m];
+ hQMetaData->q_direction[1].band_data[b].bits_sph_idx[m] = bits_sph_idx;
+ }
+ }
+ }
+
+ for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
+ {
+ hQMetaData->q_direction[0].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0];
+ hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m] = bits_sph_idx;
+ }
+ }
+
+ if ( all_coherence_zero == 0 )
+ {
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_sur_coherence =
+#endif
+#else
+ bits_sur_coherence =
+#endif
+ read_surround_coherence_hr( bitstream, index, hQMetaData );
+ }
+ else
+ {
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_sur_coherence = 0;
+#endif
+#else
+ bits_sur_coherence = 0;
+#endif
+ /*Surround coherence*/
+ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ if ( hQMetaData->surcoh_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
+ }
+ }
+ }
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh += bits_sur_coherence;
+#endif
+#else
+ bits_no_dirs_coh += bits_sur_coherence;
+#endif
+
+ for ( d = 0; d < hQMetaData->no_directions; d++ )
+ {
+ q_direction = &hQMetaData->q_direction[d];
+ nbands = q_direction->cfg.nbands;
+ start_band = q_direction->cfg.start_band;
+
+ /* Read coherence, if any */
+ if ( all_coherence_zero == 0 )
+ {
+ read_coherence_data_hr_512( bitstream, index, hQMetaData, d, bits_sp_coh );
+ }
+ else
+ {
+ /*Surround coherence*/
+ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
+ {
+ if ( hQMetaData->surcoh_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
+ }
+
+ if ( hQMetaData->q_direction[d].coherence_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->q_direction[d].coherence_band_data[b].spread_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
+ }
+ }
+ }
+
+ /* Decode quantized directions frame-wise */
+ ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 );
+
+#ifdef DEBUG_MODE_QMETADATA
+ fprintf( pF, "frame %d: diff %d surcoh %d ", frame, bits_diff_sum, bits_sur_coherence );
+ fprintf( pF, "dir %d\n", start_index_0 - *index );
+ fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d );
+ fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d );
+ fprintf( pF_spcoh, "frame %d/dir %d: ", frame, d );
+ fprintf( pF_ratio, "frame %d/dir %d: ", frame, d );
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ for ( m = 0; m < q_direction->cfg.nblocks; m++ )
+ {
+
+ fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] );
+ fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f );
+ fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f );
if ( q_direction->coherence_band_data != NULL )
{
fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[b].spread_coherence[m] );
}
- if ( d == 0 && hQMetaData->surcoh_band_data != NULL )
- {
- fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] );
- }
}
}
+ fprintf( pF_ratio, "\n" );
fprintf( pF_azi, "\n" );
fprintf( pF_ele, "\n" );
- fprintf( pF_ratio, "\n" );
fprintf( pF_spcoh, "\n" );
- if ( d == 0 )
- {
- fprintf( pF_surcoh, "\n" );
- }
#endif
}
- /* move 2 dir data to its correct subband */
+
if ( hQMetaData->no_directions == 2 )
{
- d = hQMetaData->q_direction[1].cfg.nbands - 1;
- nblocks = hQMetaData->q_direction[0].cfg.nblocks;
-
- for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- )
+ /* move 2 dir data to its correct subband */
+ if ( bits_sph_idx == 11 )
{
- if ( hQMetaData->twoDirBands[b] == 1 )
- {
- mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks );
- mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks );
- mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks );
- if ( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] < 7 )
+ int16_t nblocks;
+ d = hQMetaData->q_direction[1].cfg.nbands - 1;
+ nblocks = hQMetaData->q_direction[0].cfg.nblocks;
+
+ for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- )
+ {
+ if ( hQMetaData->twoDirBands[b] == 1 )
{
- for ( m = 0; m < nblocks; m++ )
+ mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks );
+ mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks );
+ mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks );
+
+
+ if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
{
- hQMetaData->q_direction[1].band_data[b].azimuth[m] += hQMetaData->q_direction[0].band_data[b].azimuth[m] - 180;
- if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] >= 180 )
- {
- hQMetaData->q_direction[1].band_data[b].azimuth[m] -= 360;
- }
- if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] < -180 )
- {
- hQMetaData->q_direction[1].band_data[b].azimuth[m] += 360;
- }
+ mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks );
}
+ d--;
}
-
- if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
+ else
{
- mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks );
- }
- d--;
- }
- else
- {
- set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks );
- set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks );
- set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks );
+ set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks );
- if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
- {
- set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks );
+ if ( hQMetaData->q_direction[1].coherence_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks );
+ }
}
}
}
@@ -649,30 +1182,74 @@ int16_t ivas_qmetadata_dec_decode(
for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ )
{
float ratioSum;
+ for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
+ {
+ ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] + hQMetaData->q_direction[1].band_data[b].energy_ratio[m];
+
+ if ( ratioSum > 1.0f )
+ {
+ hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] / ratioSum;
+ hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = hQMetaData->q_direction[1].band_data[b].energy_ratio[m] / ratioSum;
+ }
+ }
+ }
+ }
- ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0];
+#ifdef DEBUG_MODE_QMETADATA
+ for ( d = 0; d < hQMetaData->no_directions; d++ )
+ {
+ q_direction = &hQMetaData->q_direction[d];
+ nbands = q_direction->cfg.nbands;
+ start_band = q_direction->cfg.start_band;
- if ( ratioSum > 1.0f )
+
+ if ( d == 0 )
+ {
+ fprintf( pF_surcoh, "frame %d/dir %d: ", frame, d );
+ }
+ for ( b = start_band; b < nbands; b++ )
+ {
+ for ( m = 0; m < q_direction->cfg.nblocks; m++ )
{
- set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks );
- set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks );
+
+
+ if ( d == 0 && hQMetaData->surcoh_band_data != NULL )
+ {
+ fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] );
+ }
}
}
- }
+
+ if ( d == 0 )
+ {
+ fprintf( pF_surcoh, "\n" );
+ }
+ }
+#endif
/* Store status information for renderer use */
- hQMetaData->ec_flag = ec_flag;
+ hQMetaData->ec_flag = 0;
- hQMetaData->dir_comp_ratio = (float) bits_dir_used / (float) bits_dir_target;
+ hQMetaData->dir_comp_ratio = 1.0f;
if ( hQMetaData->dir_comp_ratio > 1.0f )
{
hQMetaData->dir_comp_ratio = 1.0f;
}
+#ifdef FIX_HBR_MASAMETA
+ hQMetaData->q_direction[0].cfg.nbands = sf_nbands0;
+ if ( hQMetaData->no_directions == 2 )
+ {
+ hQMetaData->q_direction[1].cfg.nbands = sf_nbands1;
+ }
+#endif
+
return ( start_index_0 - *index );
}
+#endif
+
/*-----------------------------------------------------------------------*
* ivas_qmetadata_dec_sid_decode()
@@ -687,8 +1264,11 @@ int16_t ivas_qmetadata_dec_sid_decode(
int16_t *index, /* i/o: bitstream position */
const int16_t nchan_transport, /* i : number of transport channels */
int16_t *element_mode, /* o : element mode */
- const int16_t ivas_format, /* i : IVAS format */
- const SBA_MODE sba_mode /* i : SBA mode */
+ const int16_t ivas_format /* i : IVAS format */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
+ const SBA_MODE sba_mode /* i : SBA mode */
+#endif
)
{
int16_t b, m, i;
@@ -719,10 +1299,13 @@ int16_t ivas_qmetadata_dec_sid_decode(
if ( ivas_format == SBA_FORMAT )
{
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
/* TODO: still use old sid frame size to keep bitexactness */
metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/
+#ifndef SBA_MODE_CLEAN_UP
}
else
{
@@ -730,6 +1313,7 @@ int16_t ivas_qmetadata_dec_sid_decode(
/* TODO: still use old sid frame size to keep bitexactness */
metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
}
+#endif
}
else
{
@@ -755,8 +1339,11 @@ int16_t ivas_qmetadata_dec_sid_decode(
/* Fix configuration for SID */
q_direction = &hQMetaData->q_direction[0]; /* only 1 direction */
-
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
nbands = DIRAC_DTX_BANDS; /* only 2 bands transmitted */
}
@@ -769,7 +1356,11 @@ int16_t ivas_qmetadata_dec_sid_decode(
start_band = 0; /* start from band 0 */
/* Read 2D signaling*/
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode != SBA_MODE_SPAR )
+#else
+ if ( ivas_format != SBA_FORMAT )
+#endif
{
q_direction->not_in_2D = bitstream[( *index )--];
}
@@ -854,6 +1445,7 @@ int16_t ivas_qmetadata_dec_sid_decode(
}
}
/* TODO: temporary hack to keep BE */
+#ifndef SBA_MODE_CLEAN_UP
if ( ivas_format == SBA_FORMAT )
{
if ( sba_mode != SBA_MODE_SPAR )
@@ -862,6 +1454,9 @@ int16_t ivas_qmetadata_dec_sid_decode(
}
}
else
+#else
+ if ( ivas_format != SBA_FORMAT )
+#endif
{
metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
}
@@ -940,6 +1535,12 @@ static int16_t ivas_diffuseness_huff_ec_decode(
}
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_entropy_decode_diffuseness()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
static int16_t ivas_qmetadata_entropy_decode_diffuseness(
uint16_t *bitstream, /* i : bitstream */
int16_t *index,
@@ -1036,6 +1637,142 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness(
}
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_entropy_decode_diffuseness_hr()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr(
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index,
+ IVAS_QDIRECTION *q_direction,
+ uint16_t *diffuseness_index_max_ec_frame )
+{
+ int16_t b;
+ uint16_t dif_min;
+ int16_t index_start;
+ int16_t nbands;
+ int16_t start_band;
+
+ index_start = *index;
+ nbands = q_direction->cfg.nbands;
+ start_band = q_direction->cfg.start_band;
+
+ /* diffuseness decoding */
+ /* Handle one band as special case*/
+ if ( nbands == 1 )
+ {
+ q_direction->band_data[0].energy_ratio_index[0] = 0;
+ for ( b = 0; b < MASA_BITS_ER_HR; b++ )
+ {
+ q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--];
+ }
+ *diffuseness_index_max_ec_frame = 5;
+
+ return MASA_BITS_ER_HR;
+ }
+
+ if ( bitstream[( *index )--] == 0 ) /* dif_use_raw_coding */
+ {
+ /* Decode with similarity strategy with low band count. On higher band counts, decode with Huffman-coding strategy. */
+
+ if ( bitstream[( *index )--] != 0 ) /* dif_have_unique_value */
+ {
+ dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS ); /* dif_unique_value */
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ q_direction->band_data[b].energy_ratio_index[0] = dif_min;
+ }
+ }
+ else /* all diffuseness values are dif_min_value or dif_min_value + 1 */
+ {
+ dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS - 1 ); /* dif_min_value */
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ q_direction->band_data[b].energy_ratio_index[0] = dif_min + bitstream[( *index )--]; /* dif_bit_offset_values */
+ }
+ }
+ }
+ else /* different values for diffuseness */
+ {
+ dif_min = HR_MASA_ER_LEVELS;
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ q_direction->band_data[b].energy_ratio_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS );
+ dif_min = min( dif_min, q_direction->band_data[b].energy_ratio_index[0] );
+ }
+ }
+
+ *diffuseness_index_max_ec_frame = 10;
+ /* adaptively select the diffuseness_index_max_ec threshold */
+ if ( dif_min > 10 )
+ {
+ *diffuseness_index_max_ec_frame = HR_MASA_ER_LEVELS - 1;
+ }
+
+ return ( index_start - *index );
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_entropy_decode_diffuseness_hr_512()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512(
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index,
+ IVAS_QDIRECTION *q_direction )
+{
+ int16_t b, k;
+
+ int16_t index_start;
+ int16_t nbands, nblocks;
+ int16_t start_band;
+
+ index_start = *index;
+ nbands = q_direction->cfg.nbands;
+ nblocks = q_direction->cfg.nblocks;
+ start_band = q_direction->cfg.start_band;
+
+ /* diffuseness decoding */
+ /* Handle one band as special case*/
+ if ( nbands == 1 )
+ {
+ q_direction->band_data[0].energy_ratio_index[0] = 0;
+ for ( b = 0; b < MASA_BITS_ER_HR; b++ )
+ {
+ q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--];
+ }
+
+ return MASA_BITS_ER_HR;
+ }
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ for ( k = 0; k < nblocks; k++ )
+ {
+ q_direction->band_data[b].energy_ratio_index[k] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS );
+ }
+ }
+
+ return ( index_start - *index );
+}
+#endif
+
+
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_entropy_decode_df_ratio()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
static int16_t ivas_qmetadata_entropy_decode_df_ratio(
uint16_t *bitstream,
int16_t *index,
@@ -1161,7 +1898,12 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
int16_t *index,
const uint16_t diffuseness_index_max_ec_frame,
const int16_t nbands,
- const int16_t start_band )
+ const int16_t start_band
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
+)
{
int16_t b, m;
int16_t diff_idx;
@@ -1188,7 +1930,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
/*Raw coding for high diffuseness*/
for ( b = start_band; b < nbands; b++ )
{
- diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx = 0;
+ }
+ else
+ {
+#endif
+ diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ }
+#endif
+
diff_idx_min = min( diff_idx_min, diff_idx );
if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
{
@@ -1199,7 +1953,11 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3] * 2 - 1;
}
+#ifdef HR_METADATA
+ if ( q_direction->band_data[b].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame )
+#else
if ( diff_idx > diffuseness_index_max_ec_frame )
+#endif
{
bands_entropic[b] = 0;
@@ -1252,7 +2010,18 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
if ( bands_entropic[b] )
{
int16_t tmp_index;
- diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx = 0;
+ }
+ else
+ {
+#endif
+ diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ }
+#endif
if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
{
@@ -1261,6 +2030,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
else
{
avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] );
+
/*reorder elevation indexing*/
tmp_index = avg_elevation_index_projected - ( elev_alph[b] >> 1 );
if ( tmp_index < 0 )
@@ -1277,6 +2047,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
for ( m = 0; m < nblocks; m++ )
{
q_direction->band_data[b].elevation_index[m] = avg_elevation_index_projected;
+
/*deduce aplhabet for azimuth*/
if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
{
@@ -1300,7 +2071,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
{
if ( bands_entropic[b] )
{
- diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx = 0;
+ }
+ else
+ {
+#endif
+ diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ }
+#endif
+
for ( m = 0; m < nblocks; m++ )
{
int16_t tmp_index;
@@ -1323,7 +2106,6 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
}
else
{
-
avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] );
tmp_index = ivas_qmetadata_DecodeExtendedGR( bitstream, index, elev_alph[b], gr_param_elev );
@@ -1359,7 +2141,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
{
if ( bands_entropic[b] )
{
- diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx = 0;
+ }
+ else
+ {
+#endif
+ diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ }
+#endif
+
for ( m = 0; m < nblocks; m++ )
{
q_direction->band_data[b].elevation_index[m] = 0;
@@ -1419,6 +2213,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
set_zero( avg_direction_vector, 3 );
use_adapt_avg = 0;
idx = 0;
+
for ( b = start_band; b < nbands; b++ )
{
if ( bands_entropic[b] )
@@ -1478,6 +2273,59 @@ static int16_t ivas_qmetadata_entropy_decode_dir(
}
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------------
+ * ivas_qmetadata_raw_decode_dir()
+ *
+ * Main function for raw decoding of the directions
+ *------------------------------------------------------------------------*/
+
+static int16_t ivas_qmetadata_raw_decode_dir_512(
+ IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *index,
+ const int16_t nbands,
+ const int16_t start_band,
+ const SPHERICAL_GRID_DATA *sph_grid16 /* i : spherical grid for deindexing */
+)
+{
+ int16_t b, m, i;
+ int16_t nblocks;
+ int16_t index_start;
+ uint16_t value;
+
+ index_start = *index;
+ nblocks = q_direction->cfg.nblocks;
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ for ( m = 0; m < nblocks; m++ )
+ {
+ value = 0;
+ for ( i = 0; i < q_direction->band_data[b].bits_sph_idx[m]; i++ )
+ {
+ value = ( value << 1 ) + bitstream[( *index )--];
+ }
+ q_direction->band_data[b].spherical_index[m] = value;
+
+ if ( q_direction->band_data[b].bits_sph_idx[m] == 16 )
+ {
+ deindex_sph_idx( value, sph_grid16, &( q_direction->band_data[b].elevation[m] ), &( q_direction->band_data[b].azimuth[m] ) );
+ }
+ else
+ {
+ deindex_spherical_component( q_direction->band_data[b].spherical_index[m], &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m],
+ &q_direction->band_data[b].azimuth_index[m], &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m],
+ q_direction->cfg.mc_ls_setup );
+ }
+ }
+ }
+
+ return ( index_start - *index );
+}
+
+#endif
+
/*-------------------------------------------------------------------------
* ivas_qmetadata_raw_decode_dir()
*
@@ -1489,7 +2337,12 @@ static int16_t ivas_qmetadata_raw_decode_dir(
uint16_t *bitstream, /* i : bitstream */
int16_t *index,
const int16_t nbands,
- const int16_t start_band )
+ const int16_t start_band
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
+)
{
int16_t b, m, azith_alph;
int16_t diff_idx;
@@ -1507,7 +2360,18 @@ static int16_t ivas_qmetadata_raw_decode_dir(
}
else
{
- diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx = 0;
+ }
+ else
+ {
+#endif
+ diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0];
+#ifdef HR_METADATA
+ }
+#endif
for ( m = 0; m < nblocks; m++ )
{
@@ -1531,7 +2395,7 @@ static int16_t ivas_qmetadata_raw_decode_dir(
* Read the bitstream following the encoding scheme of EncodeQuasiUniform
*------------------------------------------------------------------------*/
-/* !r: Value read from the bitstream */
+/*! r: Value read from the bitstream */
static uint16_t ivas_qmetadata_DecodeQuasiUniform(
const uint16_t *bitstream, /* i : pointer to the bitstream to read */
int16_t *index, /* i : position in the bitstream to start reading (gets updated with reading) */
@@ -1542,7 +2406,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform(
uint16_t tresh, value;
#ifdef DEBUGGING
- assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
+ assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
#endif
bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */
@@ -1572,7 +2436,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform(
* Reads the bitstream and decodes the value using the ExtendedGR algorithm
*------------------------------------------------------------------------*/
-/* !r: Value decoded from the bitstream */
+/*! r: Value decoded from the bitstream */
static int16_t ivas_qmetadata_DecodeExtendedGR(
uint16_t *bitstream, /* i : pointer to the bitstream to read */
int16_t *index, /* i/o: position in the bitstream to start reading (gets updated with reading) */
@@ -1631,7 +2495,7 @@ static int16_t ivas_qmetadata_DecodeExtendedGR(
* Calculates the correct elevation index from the decoded data
*------------------------------------------------------------------------*/
-/* !r: Elevation index as it will be read by the dequantizer */
+/*! r: Elevation index as it will be read by the dequantizer */
static int16_t ivas_qmetadata_ReorderElevationDecoded(
const int16_t elev_dist, /* i : Distance to the average extracted from the bitstream */
const int16_t elev_avg, /* i : Average value over time-blocks extracted from the bitstream */
@@ -1661,7 +2525,7 @@ static int16_t ivas_qmetadata_ReorderElevationDecoded(
* Local functions: requentizeEC3
*-----------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t read_directions(
IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */
const uint8_t coding_subbands, /* i : number of directions */
@@ -1713,6 +2577,7 @@ static int16_t read_directions(
max_nb_idx = k;
}
}
+
if ( q_direction->cfg.nblocks == 1 )
{
byteBuffer = 0;
@@ -1892,7 +2757,7 @@ static int16_t read_directions(
* read and decode the azimuth indexes for one subband
*-------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t decode_azimuth(
IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */
uint16_t *bitstream, /* i : bitstream to be read */
@@ -2061,7 +2926,7 @@ static int16_t decode_azimuth(
* Reads the bitstream and decode the elevation index
*-------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t decode_elevation(
IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */
uint16_t *bitstream, /* i : input bitstream */
@@ -2189,7 +3054,7 @@ static int16_t decode_elevation(
* decoding in fixed rate case, i.e. when using the spherical indexes
*-----------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t decode_fixed_rate(
IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata */
const uint16_t *bitstream, /* i : bitstream to be read */
@@ -2229,7 +3094,7 @@ static int16_t decode_fixed_rate(
* Azimuth bitstream reading and decoding in 2D case
*-------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t decode_azimuth2D(
IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */
uint16_t *bitstream, /* i : bitstream to be read */
@@ -2423,7 +3288,7 @@ static int16_t read_truncGR_azimuth(
*
*-------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t read_common_direction(
uint16_t *bitstream, /* i : bitstream to be read */
IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */
@@ -2548,6 +3413,10 @@ static void decode_spread_coherence(
IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: quantized metadata structure */
int16_t idx_d, /* i : direction index */
const int16_t no_frames /* i : number of time subframes */
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
)
{
int16_t i, j;
@@ -2557,6 +3426,9 @@ static void decode_spread_coherence(
int16_t MASA_grouping[MASA_MAXIMUM_CODING_SUBBANDS];
IVAS_QDIRECTION *q_direction;
int16_t coding_subbands, coding_subbands_0, d, two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS];
+#ifdef HR_METADATA
+ int16_t min_index;
+#endif
coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands;
coding_subbands = hQMetaData->q_direction[idx_d].cfg.nbands;
@@ -2613,6 +3485,26 @@ static void decode_spread_coherence(
{
var_azi = var( q_direction->band_data[i].azimuth, no_frames );
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ minimum_s( (int16_t *) ( q_direction->band_data[i].energy_ratio_index ), q_direction->cfg.nblocks, &min_index );
+ min_index = min_index >> 1;
+ }
+ else
+ {
+ min_index = q_direction->band_data[i].energy_ratio_index[0];
+ }
+
+ if ( var_azi < MASA_DELTA_AZI_DCT0 )
+ {
+ idx_sub_cb = MASA_NO_CV_COH * min_index;
+ }
+ else
+ {
+ idx_sub_cb = MASA_NO_CV_COH * ( min_index + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */
+ }
+#else
if ( var_azi < MASA_DELTA_AZI_DCT0 )
{
idx_sub_cb = MASA_NO_CV_COH * q_direction->band_data[i].energy_ratio_index[0];
@@ -2621,8 +3513,10 @@ static void decode_spread_coherence(
{
idx_sub_cb = MASA_NO_CV_COH * ( q_direction->band_data[i].energy_ratio_index[0] + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */
}
+#endif
dct_coh[i][0] = coherence_cb0_masa[idx_sub_cb + q_direction->coherence_band_data[i].spread_coherence_dct0_index];
+
if ( coding_subbands < coding_subbands_0 )
{
assert( idx_d == 1 );
@@ -2651,7 +3545,7 @@ static void decode_spread_coherence(
* Read Hufman code
*-------------------------------------------------------------------*/
-/* !r: number of bits read */
+/*! r: number of bits read */
static ivas_error read_huf(
int16_t *num_bits_read,
const uint16_t *bitstream, /* i : bitstream to be read */
@@ -2880,18 +3774,103 @@ static int16_t decode_fixed_rate_composed_index_coherence(
}
-/*------------------------------------------------------------------ - *
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------*
+ * read_coherence_data_hr_512()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+/*! r: number of bits read */
+static int16_t read_coherence_data_hr_512(
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *p_bit_pos, /* i : position in the bitstream */
+ IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */
+ const int16_t idx_dir, /* i : direction index */
+ const int16_t nbits_coh )
+{
+ int16_t j, k, i;
+ int16_t nbands, nblocks;
+ int16_t min_index, GR_param;
+ int16_t cb_size, nbits;
+ int16_t decoded_idx;
+ float delta;
+
+ nbands = hQMetaData->q_direction[idx_dir].cfg.nbands;
+ nblocks = hQMetaData->q_direction[idx_dir].cfg.nblocks;
+
+
+ cb_size = 1 << nbits_coh;
+ delta = 256.0f / cb_size;
+ nbits = *p_bit_pos;
+ for ( k = 0; k < nblocks; k++ )
+ {
+ /* read method */
+ if ( bitstream[( *p_bit_pos )--] == 1 )
+ {
+ /* average removed */
+ /* read average index */
+ min_index = 0;
+ for ( i = 0; i < nbits_coh; i++ )
+ {
+ min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--];
+ }
+ /* read GR param */
+ GR_param = bitstream[( *p_bit_pos )--];
+ for ( j = 0; j < nbands; j++ )
+ {
+ decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, 2 * cb_size, GR_param );
+ if ( decoded_idx % 2 )
+ {
+ decoded_idx = ( ( decoded_idx + 1 ) >> 1 ) + min_index;
+ }
+ else
+ {
+ decoded_idx = -( decoded_idx >> 1 ) + min_index;
+ }
+ hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f );
+ }
+ }
+ else
+ {
+
+ /* read min_index */
+ min_index = 0;
+ for ( i = 0; i < nbits_coh; i++ )
+ {
+ min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--];
+ }
+ /* read GR param */
+ GR_param = bitstream[( *p_bit_pos )--];
+ for ( j = 0; j < nbands; j++ )
+ {
+ decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, cb_size - min_index, GR_param ) + min_index;
+ hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f );
+ }
+ }
+ }
+ nbits = nbits - *p_bit_pos;
+ return nbits;
+}
+#endif
+
+
+/*------------------------------------------------------------------- *
* read_coherence_data()
*
* Read coherence data
- *------------------------------------------------------------------ - */
+ *------------------------------------------------------------------- */
-/* !r: number of bits read */
+/*! r: number of bits read */
static int16_t read_coherence_data(
uint16_t *bitstream, /* i : bitstream */
int16_t *p_bit_pos, /* i : position in the bitstream */
IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */
const int16_t idx_dir /* i : direction index */
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
)
{
int16_t j;
@@ -2909,6 +3888,10 @@ static int16_t read_coherence_data(
int16_t decoded_idx[MASA_MAXIMUM_CODING_SUBBANDS];
uint16_t byteBuffer;
int16_t idx_ER;
+#ifdef HR_METADATA
+ int16_t min_index;
+#endif
+
coding_subbands = hQMetaData->q_direction[idx_dir].cfg.nbands;
q_direction = &( hQMetaData->q_direction[idx_dir] );
@@ -2919,7 +3902,19 @@ static int16_t read_coherence_data(
{
for ( j = 0; j < coding_subbands; j++ )
{
- idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH;
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + coding_subbands / MASA_FACTOR_CV_COH;
+ }
+ else
+ {
+
+#endif
+ idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH;
+#ifdef HR_METADATA
+ }
+#endif
no_cv_vec[j] = idx_ER + 1;
}
@@ -2943,7 +3938,11 @@ static int16_t read_coherence_data(
{
if ( no_cv_vec[j] > 1 )
{
+#ifdef HR_METADATA
+ q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) );
+#else
q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) );
+#endif
}
else
{
@@ -2960,7 +3959,11 @@ static int16_t read_coherence_data(
{
if ( no_cv_vec[j] > 1 )
{
+#ifdef HR_METADATA
+ q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) );
+#else
q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) );
+#endif
}
else
{
@@ -2973,7 +3976,19 @@ static int16_t read_coherence_data(
{
for ( j = 0; j < coding_subbands; j++ )
{
- no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index );
+ no_cv_vec[j] = len_cb_dct0_masa[min_index >> 1]; /* spread coherence DCT0*/
+ }
+ else
+ {
+#endif
+ no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/
+#ifdef HR_METADATA
+ }
+#endif
}
if ( sum_s( no_cv_vec, coding_subbands ) > MASA_COH_LIMIT_2IDX )
@@ -3096,13 +4111,14 @@ static int16_t read_coherence_data(
return nbits;
}
+
/*-------------------------------------------------------------------*
* read_surround_coherence()
*
*
*-------------------------------------------------------------------*/
-int16_t read_surround_coherence(
+static int16_t read_surround_coherence(
uint16_t *bitstream, /* i : bitstream */
int16_t *p_bit_pos, /* i : position in the bitstream */
IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */
@@ -3258,6 +4274,168 @@ int16_t read_surround_coherence(
}
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------*
+ * read_surround_coherence_hr()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+static int16_t read_surround_coherence_hr(
+ uint16_t *bitstream, /* i : bitstream */
+ int16_t *p_bit_pos, /* i : position in the bitstream */
+ IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */
+)
+{
+ int16_t coding_subbands;
+ int16_t no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS];
+ int16_t bit_pos;
+ float error_ratio_surr;
+ int16_t idx_ER[MASA_MAXIMUM_CODING_SUBBANDS];
+ int16_t bits_sur_coherence, bits_GR;
+ int16_t j, k, sf;
+ uint16_t byteBuffer;
+ uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS];
+ IVAS_QDIRECTION *q_direction;
+ int16_t min_index;
+ int16_t d, idx;
+ coding_subbands = hQMetaData->q_direction[0].cfg.nbands;
+ q_direction = hQMetaData->q_direction;
+
+ bits_sur_coherence = 0;
+ bit_pos = *p_bit_pos;
+
+ for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ )
+ {
+ d = 0;
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ error_ratio_surr = 1.0f;
+ if ( hQMetaData->no_directions == 2 )
+ {
+ d += hQMetaData->twoDirBands[j];
+ idx = max( d - 1, 0 );
+ error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx].energy_ratio[sf] * hQMetaData->twoDirBands[j];
+ }
+ else
+ {
+ error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf];
+ }
+
+
+ if ( error_ratio_surr <= 0 )
+ {
+ error_ratio_surr = 0;
+ no_cv_vec[j] = 1;
+ idx_ER[j] = 0;
+ }
+ else
+ {
+ idx_ER[j] = 7; // masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2;
+ }
+ }
+
+ if ( sum_s( no_cv_vec, coding_subbands ) == coding_subbands )
+ {
+ /* surround coherence is zero */
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ )
+ {
+ if ( hQMetaData->surcoh_band_data != NULL )
+ {
+ hQMetaData->surcoh_band_data[j].surround_coherence[k] = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* read how the surround coherence is encoded */
+ byteBuffer = bitstream[bit_pos--];
+ bits_sur_coherence += 1;
+
+ if ( byteBuffer & 1 )
+ {
+ /* GR decoding */
+ /* read GR order */
+ byteBuffer = bitstream[bit_pos--];
+ bits_sur_coherence += 1;
+
+ /* read min index */
+ bits_GR = bit_pos;
+ min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, MASA_MAX_NO_CV_SUR_COH, 0 );
+ bits_sur_coherence += bits_GR - bit_pos;
+
+ /* read GR data */
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ bits_GR = bit_pos;
+ /* decoding for min removed */
+ if ( no_cv_vec[j] > 1 )
+ {
+ idx_sur_coh[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) );
+ bits_sur_coherence += bits_GR - bit_pos;
+ }
+ else
+ {
+ idx_sur_coh[j] = 0;
+ }
+ }
+
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ if ( no_cv_vec[j] > 1 )
+ {
+ hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j] + min_index;
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index];
+ }
+ else
+ {
+ hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j];
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0;
+ }
+ }
+ }
+ else
+ {
+ /* fixed rate */
+ uint16_t sur_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS];
+ set_s( (int16_t *) sur_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS );
+
+ decode_fixed_rate_composed_index_coherence( bitstream, &bit_pos, coding_subbands, no_cv_vec, sur_coh_temp_index, MASA_MAX_NO_CV_SUR_COH );
+
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ hQMetaData->surcoh_band_data[j].sur_coherence_index = sur_coh_temp_index[j];
+ }
+
+ /* deindex surround coherence */
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ if ( no_cv_vec[j] > 1 )
+ {
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index];
+ }
+ else
+ {
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0;
+ }
+ }
+ }
+ }
+ }
+
+ /* Replace return value with the actual read bits. bits_sur_coherence might show wrong count at this point. */
+ bits_sur_coherence = *p_bit_pos - bit_pos;
+ *p_bit_pos = bit_pos;
+
+ return bits_sur_coherence;
+}
+
+#endif
+
/*-------------------------------------------------------------------*
* decode_combined_index()
*
diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c
index 78d4eafea1b1674fe291cdfa5026538b71dceb20..6a33a36aaa072eb8fb15cf98c29159072bd55bcd 100644
--- a/lib_dec/ivas_rom_dec.c
+++ b/lib_dec/ivas_rom_dec.c
@@ -226,7 +226,7 @@ const float dft_win_8k[70] =
* stereo CNA tables
*------------------------------------------------------------------------*/
-const int16_t cna_init_bands[MAX_CNA_NBANDS + 1] =
+const int16_t cna_init_bands[CNA_INIT_NBANDS + 1] =
{
1, 4, 14, 33, 67, 171, 320
};
@@ -520,9 +520,13 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] =
0.0f, 0.125f, 0.375f, 1.0f
};
-const int16_t sba_map_tc[8] =
+const int16_t sba_map_tc[11] =
{
- 0, 1, 2, 3, 4, 8, 9, 15
+ 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7
+};
+const int16_t sba_map_tc_512[11] =
+{
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15
};
@@ -538,3 +542,290 @@ const float dmxmtx_table[BINAURAL_CHANNELS][11] =
/* clang-format on */
+
+
+const int16_t huff_nodes_first_band_alpha[32][2] = { /* Alpha Fine Huffman table df0 */
+ { -17, 1 },
+ { 3, 2 },
+ { -16, -18 },
+ { 5, 4 },
+ { -15, 6 },
+ { -19, 7 },
+ { 9, 8 },
+ { 11, 10 },
+ { -14, -20 },
+ { 13, 12 },
+ { -21, 14 },
+ { -13, 15 },
+ { 17, 16 },
+ { -22, 18 },
+ { -12, 19 },
+ { -9, -10 },
+ { -11, 20 },
+ { -23, 21 },
+ { -8, 22 },
+ { -24, 23 },
+ { -25, 24 },
+ { -7, 25 },
+ { -26, 26 },
+ { 28, 27 },
+ { -6, -27 },
+ { -33, 29 },
+ { -1, -28 },
+ { -5, 30 },
+ { -29, -30 },
+ { -4, 31 },
+ { -3, -31 },
+ { -2, -32 }
+};
+const int16_t huff_nodes_first_band_alpha_coarse[16][2] = { /* Alpha Coarse Huffman table df0 */
+ { -9, 1 },
+ { -8, 2 },
+ { -10, 3 },
+ { 5, 4 },
+ { -7, 6 },
+ { -11, 7 },
+ { -5, 8 },
+ { -6, 9 },
+ { -12, 10 },
+ { -13, 11 },
+ { -4, 12 },
+ { -14, 13 },
+ { -3, 14 },
+ { -15, 15 },
+ { -2, -16 },
+ { -1, -17 }
+};
+
+
+const int16_t huff_nodes_alpha_1D_DF[64][2] = { /* Alpha Fine Huffman table df */
+ { -33, 1 },
+ { 3, 2 },
+ { -32, -34 },
+ { 5, 4 },
+ { -31, -35 },
+ { 7, 6 },
+ { -30, 8 },
+ { -36, 9 },
+ { 11, 10 },
+ { -37, 12 },
+ { -29, 13 },
+ { -28, 14 },
+ { -38, 15 },
+ { 17, 16 },
+ { -27, -39 },
+ { 19, 18 },
+ { -26, 20 },
+ { -40, 21 },
+ { 23, 22 },
+ { -41, 24 },
+ { -25, 25 },
+ { -24, 26 },
+ { -42, 27 },
+ { -43, 28 },
+ { -23, 29 },
+ { -44, 30 },
+ { -22, 31 },
+ { -45, 32 },
+ { -21, 33 },
+ { -20, 34 },
+ { -46, 35 },
+ { -19, 36 },
+ { -47, 37 },
+ { -18, -48 },
+ { 39, 38 },
+ { -17, -49 },
+ { 41, 40 },
+ { -16, 42 },
+ { -1, -50 },
+ { -65, 43 },
+ { 45, 44 },
+ { -51, 46 },
+ { -15, 47 },
+ { 49, 48 },
+ { -52, 50 },
+ { -14, 51 },
+ { 53, 52 },
+ { -13, 54 },
+ { -53, 55 },
+ { 57, 56 },
+ { -12, 58 },
+ { -54, 59 },
+ { 61, 60 },
+ { -55, 62 },
+ { -11, 63 },
+ { -10, -61 },
+ { -5, -57 },
+ { -58, -60 },
+ { -56, -59 },
+ { -4, -6 },
+ { -7, -64 },
+ { -9, -63 },
+ { -3, -8 },
+ { -2, -62 }
+};
+const int16_t huff_nodes_alpha_1D_DF_coarse[32][2] = { /* Alpha Coarse Huffman table df */
+ { -17, 1 },
+ { -18, 2 },
+ { -16, 3 },
+ { -15, 4 },
+ { -19, 5 },
+ { 7, 6 },
+ { -14, -20 },
+ { 9, 8 },
+ { -13, -21 },
+ { 11, 10 },
+ { -22, 12 },
+ { -12, 13 },
+ { -23, 14 },
+ { -11, 15 },
+ { -10, 16 },
+ { -24, 17 },
+ { -9, -25 },
+ { 19, 18 },
+ { -26, 20 },
+ { -8, 21 },
+ { 23, 22 },
+ { 25, 24 },
+ { -27, 26 },
+ { -7, 27 },
+ { -1, -33 },
+ { -6, 28 },
+ { -28, 29 },
+ { -29, 30 },
+ { -5, -31 },
+ { -30, 31 },
+ { -3, -4 },
+ { -2, -32 }
+};
+
+const int16_t huff_nodes_alpha_1D_DT[64][2] = { /* Alpha Fine Huffman table dt */
+ { -33, 1 },
+ { -34, 2 },
+ { -32, 3 },
+ { 5, 4 },
+ { -31, -35 },
+ { 7, 6 },
+ { -36, 8 },
+ { -30, 9 },
+ { 11, 10 },
+ { -29, -37 },
+ { 13, 12 },
+ { 15, 14 },
+ { -28, -38 },
+ { 17, 16 },
+ { -27, -39 },
+ { 19, 18 },
+ { -40, 20 },
+ { -26, 21 },
+ { 23, 22 },
+ { -25, -41 },
+ { 25, 24 },
+ { -24, -42 },
+ { 27, 26 },
+ { -23, -43 },
+ { 29, 28 },
+ { -22, -44 },
+ { 31, 30 },
+ { -45, 32 },
+ { -21, 33 },
+ { -20, 34 },
+ { -46, 35 },
+ { -47, 36 },
+ { -19, 37 },
+ { -48, 38 },
+ { -18, 39 },
+ { 41, 40 },
+ { -17, -49 },
+ { 43, 42 },
+ { -50, 44 },
+ { -16, 45 },
+ { 47, 46 },
+ { -51, 48 },
+ { -15, 49 },
+ { 51, 50 },
+ { -52, -65 },
+ { -1, -14 },
+ { 53, 52 },
+ { -53, 54 },
+ { -13, 55 },
+ { 57, 56 },
+ { -12, 58 },
+ { -54, 59 },
+ { 61, 60 },
+ { -11, -55 },
+ { -56, 62 },
+ { -10, 63 },
+ { -9, -57 },
+ { -5, -6 },
+ { -58, -61 },
+ { -7, -59 },
+ { -8, -62 },
+ { -4, -60 },
+ { -3, -64 },
+ { -2, -63 }
+};
+const int16_t huff_nodes_alpha_1D_DT_coarse[32][2] = { /* Alpha Coarse Huffman table dt */
+ { -17, 1 },
+ { -18, 2 },
+ { -16, 3 },
+ { -19, 4 },
+ { -15, 5 },
+ { 7, 6 },
+ { -14, -20 },
+ { 9, 8 },
+ { -21, 10 },
+ { -13, 11 },
+ { 13, 12 },
+ { -12, -22 },
+ { 15, 14 },
+ { -11, -23 },
+ { 17, 16 },
+ { -24, 18 },
+ { -10, 19 },
+ { -25, 20 },
+ { -9, 21 },
+ { 23, 22 },
+ { -26, 24 },
+ { -8, 25 },
+ { 27, 26 },
+ { -1, -33 },
+ { -7, -27 },
+ { 29, 28 },
+ { -28, 30 },
+ { -6, 31 },
+ { -5, -29 },
+ { -3, -31 },
+ { -4, -30 },
+ { -2, -32 }
+};
+
+const int16_t huff_nodes_first_band_beta[8][2] = /* Beta Fine Huffman table df0 */
+ { { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, 4 }, { -5, 5 }, { -6, 6 }, { -7, 7 }, { -8, -9 } };
+const int16_t huff_nodes_first_band_beta_coarse[4][2] = /* Beta Coarse Huffman table df0 */
+ { { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, -5 } };
+
+const int16_t huff_nodes_beta_1D_DF[16][2] = /* Beta Fine Huffman table df */
+ { { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { 9, 8 }, { -5, -13 }, { 11, 10 }, { -4, -14 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } };
+const int16_t huff_nodes_beta_1D_DF_coarse[8][2] = /* Beta Coarse Huffman table df */
+ { { -5, 1 }, { -6, 2 }, { -4, 3 }, { -3, 4 }, { -7, 5 }, { -2, 6 }, { -8, 7 }, { -1, -9 } };
+
+const int16_t huff_nodes_beta_1D_DT[16][2] = /* Beta Fine Huffman table dt */
+ { { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { -13, 8 }, { -5, 9 }, { -14, 10 }, { -4, 11 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } };
+const int16_t huff_nodes_beta_1D_DT_coarse[8][2] = /* Beta Coarse Huffman table dt */
+ { { -5, 1 }, { -6, 2 }, { -4, 3 }, { -7, 4 }, { -3, 5 }, { -8, 6 }, { -2, 7 }, { -1, -9 } };
+
+HUFF_NODE_TABLE huff_nodes_df0 = {
+ { huff_nodes_first_band_alpha, huff_nodes_first_band_alpha_coarse },
+ { huff_nodes_first_band_beta, huff_nodes_first_band_beta_coarse }
+};
+
+HUFF_NODE_TABLE huff_nodes_df = {
+ { huff_nodes_alpha_1D_DF, huff_nodes_alpha_1D_DF_coarse },
+ { huff_nodes_beta_1D_DF, huff_nodes_beta_1D_DF_coarse }
+};
+
+HUFF_NODE_TABLE huff_nodes_dt = {
+ { huff_nodes_alpha_1D_DT, huff_nodes_alpha_1D_DT_coarse },
+ { huff_nodes_beta_1D_DT, huff_nodes_beta_1D_DT_coarse }
+};
diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h
index 4366077bbb3b45e0367057e36a01ae93c01512a5..7a19f170c0b00f12d5050d4224dcd05cc7960b98 100644
--- a/lib_dec/ivas_rom_dec.h
+++ b/lib_dec/ivas_rom_dec.h
@@ -68,7 +68,7 @@ extern const float dft_win232ms_48k[450];
extern const float dft_win_8k[70];
-extern const int16_t cna_init_bands[MAX_CNA_NBANDS + 1];
+extern const int16_t cna_init_bands[CNA_INIT_NBANDS + 1];
extern const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS];
extern const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS];
@@ -111,8 +111,8 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM
extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS];
extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1];
-extern const int16_t sba_map_tc[8];
-
+extern const int16_t sba_map_tc[11];
+extern const int16_t sba_map_tc_512[11];
/*----------------------------------------------------------------------------------*
* FASTCONV and PARAMETRIC binaural renderer ROM tables
@@ -121,4 +121,26 @@ extern const int16_t sba_map_tc[8];
extern const float dmxmtx_table[BINAURAL_CHANNELS][11];
+extern const int16_t huff_nodes_first_band_alpha[32][2];
+extern const int16_t huff_nodes_first_band_alpha_coarse[16][2];
+
+
+extern const int16_t huff_nodes_alpha_1D_DF[64][2];
+extern const int16_t huff_nodes_alpha_1D_DF_coarse[32][2];
+
+extern const int16_t huff_nodes_alpha_1D_DT[64][2];
+extern const int16_t huff_nodes_alpha_1D_DT_coarse[32][2];
+
+extern const int16_t huff_nodes_first_band_beta[8][2];
+extern const int16_t huff_nodes_first_band_beta_coarse[4][2];
+
+extern const int16_t huff_nodes_beta_1D_DF[16][2];
+extern const int16_t huff_nodes_beta_1D_DF_coarse[8][2];
+
+extern const int16_t huff_nodes_beta_1D_DT[16][2];
+extern const int16_t huff_nodes_beta_1D_DT_coarse[8][2];
+extern const HUFF_NODE_TABLE huff_nodes_df0;
+extern const HUFF_NODE_TABLE huff_nodes_df;
+extern const HUFF_NODE_TABLE huff_nodes_dt;
+
#endif
diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c
old mode 100644
new mode 100755
index 745ea1b9ba052106117ba064d3f3524f69570125..478749ddc09ad76efd5c1417bcda8a0ff86ff0f9
--- a/lib_dec/ivas_sba_dec.c
+++ b/lib_dec/ivas_sba_dec.c
@@ -46,6 +46,58 @@
#endif
#include "wmc_auto.h"
+
+/*-------------------------------------------------------------------*
+ * ivas_sba_set_cna_cng_flag()
+ *
+ * Set CNA/CNG flags in IVAS SBA decoder
+ *-------------------------------------------------------------------*/
+
+void ivas_sba_set_cna_cng_flag(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+ int16_t n, cpe_id;
+
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 )
+#else
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 )
+#endif
+ {
+ /* skip as done in init function */
+ /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */
+ /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */
+ }
+ else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) )
+ {
+ st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1;
+ st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1;
+ }
+ else if ( st_ivas->nchan_transport == 2 )
+ {
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0;
+ st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1;
+ }
+ }
+ else
+ {
+ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
+ {
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cna_dirac_flag = 0;
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 0;
+ }
+ }
+ }
+
+ return;
+}
+
+
/*-------------------------------------------------------------------*
* ivas_sba_dec_reconfigure()
*
@@ -60,105 +112,103 @@ ivas_error ivas_sba_dec_reconfigure(
AUDIO_CONFIG intern_config_old;
int16_t numCldfbAnalyses_old, numCldfbSyntheses_old;
int16_t sba_dirac_stereo_flag_old;
- SBA_MODE sba_mode_old;
- int32_t ivas_total_brate, last_ivas_total_brate;
+ int32_t ivas_total_brate;
+ int32_t last_ivas_total_brate;
+
RENDERER_TYPE old_renderer_type;
+
DECODER_CONFIG_HANDLE hDecoderConfig;
ivas_error error;
- int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1];
-
error = IVAS_ERR_OK;
hDecoderConfig = st_ivas->hDecoderConfig;
ivas_total_brate = hDecoderConfig->ivas_total_brate;
last_ivas_total_brate = st_ivas->last_active_ivas_total_brate;
- sba_mode_old = ivas_sba_mode_select( last_ivas_total_brate );
- st_ivas->sba_mode = sba_mode_old;
-
/*-----------------------------------------------------------------*
* Set SBA high-level parameters
* Save old SBA high-level parameters
*-----------------------------------------------------------------*/
ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old );
-#ifndef SBA_HPF_TUNING_DEC
nchan_hp20_old = getNumChanSynthesis( st_ivas );
-#else
- int16_t analysis_order_old;
- analysis_order_old = ivas_sba_get_analysis_order( last_ivas_total_brate, st_ivas->sba_order );
- if ( analysis_order_old > 1 )
- {
- nchan_hp20_old = 0;
- }
- else
- {
- nchan_hp20_old = st_ivas->nchan_transport;
- }
-#endif
nSCE_old = st_ivas->nSCE;
nCPE_old = st_ivas->nCPE;
nchan_transport_old = st_ivas->nchan_transport;
sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag;
st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order );
- st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate );
+
+#ifdef JBM_TSM_ON_TCS
+ /* save old */
+ if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL )
+ {
+ st_ivas->hTcBuffer->num_slots = st_ivas->hSpar->num_slots;
+ st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpar->nb_subframes;
+ st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpar->slots_rendered;
+ st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpar->subframes_rendered;
+ mvs2s( st_ivas->hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+ else if ( st_ivas->hDirAC != NULL )
+ {
+ st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots;
+ st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes;
+ st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered;
+ st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered;
+ mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+ }
+#endif
/*-----------------------------------------------------------------*
* Allocate, initialize, and configure SBA handles
*-----------------------------------------------------------------*/
+ int16_t sba_order_internal;
+ SPAR_DEC_HANDLE hSpar;
+ hSpar = st_ivas->hSpar;
- if ( st_ivas->sba_mode != SBA_MODE_SPAR )
- {
- ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 0 );
+ sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
- if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -1 ) ) != IVAS_ERR_OK )
+ if ( hSpar != NULL )
+ {
+ if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) )
{
- return error;
+ free( st_ivas->hSpar->hPCA );
+ hSpar->hPCA = NULL;
}
- st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && hDecoderConfig->output_config == AUDIO_CONFIG_STEREO );
- }
- else
- {
- int16_t sba_order_internal;
- SPAR_DEC_HANDLE hSpar = st_ivas->hSpar;
-
- sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
-
- if ( hSpar != NULL )
+ if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) )
{
- if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) )
- {
- free( st_ivas->hSpar->hPCA );
- hSpar->hPCA = NULL;
- }
-
- if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) )
- {
- ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 );
-
- if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
+ ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 );
- ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format );
- }
- else
- {
- if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK )
{
return error;
}
}
- hSpar = st_ivas->hSpar;
- st_ivas->sba_dirac_stereo_flag = 0;
+ ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format );
+ }
+ else
+ {
+ if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
+ hSpar = st_ivas->hSpar;
+ st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas );
+
+#ifdef JBM_TSM_ON_TCS
+ /* synchronize subframe info */
+ st_ivas->hSpar->num_slots = st_ivas->hTcBuffer->num_slots;
+ st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
+ st_ivas->hSpar->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
+ st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
+ mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+#endif
+
if ( st_ivas->nchan_transport == 1 )
{
st_ivas->element_mode_init = IVAS_SCE;
@@ -223,7 +273,7 @@ ivas_error ivas_sba_dec_reconfigure(
ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin );
}
- if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( sba_mode_old != st_ivas->sba_mode ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) ) )
+ if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) )
{
DIRAC_CONFIG_FLAG flag_config;
@@ -231,46 +281,55 @@ ivas_error ivas_sba_dec_reconfigure(
if ( st_ivas->hDirAC != NULL )
{
flag_config = DIRAC_RECONFIGURE_MODE;
- if ( ( sba_mode_old == st_ivas->sba_mode ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) )
- {
- flag_config = DIRAC_RECONFIGURE;
- }
}
if ( ( error = ivas_dirac_dec_config( st_ivas, flag_config ) ) != IVAS_ERR_OK )
{
return error;
}
- }
- if ( st_ivas->sba_mode == SBA_MODE_SPAR )
- {
- if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK )
- {
- return error;
- }
+#ifdef JBM_TSM_ON_TCS
+ /* synchronize subframe info */
+ st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots;
+ st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes;
+ st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered;
+ st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered;
+ mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS );
+#endif
}
- if ( ( ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) && ( ( sba_mode_old != st_ivas->sba_mode ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) )
- {
- ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
-
- st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
+ if ( ( error = ivas_dirac_sba_config(
+ st_ivas->hQMetaData,
+#ifndef SBA_MODE_CLEAN_UP
+ &st_ivas->nchan_transport,
+ &st_ivas->nSCE,
+ &st_ivas->nCPE,
+#endif
+ &st_ivas->element_mode_init,
+ ivas_total_brate,
+ st_ivas->sba_analysis_order,
+#ifndef SBA_MODE_CLEAN_UP
+ st_ivas->sba_mode,
+#endif
+ ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND )
- ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
- st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 );
+ ) ) != IVAS_ERR_OK )
+ {
+ return error;
}
- else if ( st_ivas->renderer_type == RENDERER_DISABLE || ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) )
+ if ( st_ivas->renderer_type == RENDERER_DISABLE )
{
ivas_dirac_dec_close( &( st_ivas->hDirAC ) );
vbap_free_data( &( st_ivas->hVBAPdata ) );
}
- if ( st_ivas->hDirAC != NULL && st_ivas->sba_mode == SBA_MODE_SPAR )
+ if ( st_ivas->hDirAC != NULL )
{
+#ifndef SBA_MODE_CLEAN_UP
mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS );
+#endif
st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band;
}
@@ -292,6 +351,18 @@ ivas_error ivas_sba_dec_reconfigure(
return error;
}
+ /*-----------------------------------------------------------------*
+ * TD Decorrelator
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDiracDecBin != NULL )
+ {
+ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
/*-----------------------------------------------------------------*
* CLDFB instances
*-----------------------------------------------------------------*/
@@ -301,5 +372,229 @@ ivas_error ivas_sba_dec_reconfigure(
return error;
}
+#ifdef JBM_TSM_ON_TCS
+ /*-----------------------------------------------------------------*
+ * JBM TC buffer
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDecoderConfig->voip_active == 1 )
+ {
+ int16_t tc_nchan_to_allocate;
+ int16_t tc_nchan_tc;
+ TC_BUFFER_MODE tc_buffer_mode;
+
+ tc_buffer_mode = TC_BUFFER_MODE_RENDERER;
+ tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+ tc_nchan_to_allocate = tc_nchan_tc;
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO )
+ {
+ tc_buffer_mode = TC_BUFFER_MODE_BUFFER;
+ tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out;
+ tc_nchan_to_allocate = tc_nchan_tc;
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS;
+ }
+#ifndef SBA_MODE_CLEAN_UP
+ else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
+ }
+ else
+ {
+ if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) )
+ {
+ tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/
+ }
+ }
+
+ if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode )
+ {
+ if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ }
+#endif
+
return error;
}
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------*
+ * ivas_sba_dec_digest_tc()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+ivas_error ivas_sba_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nCldfbSlots, /* i : number of CLDFB slots */
+ const int16_t nSamplesForRendering /* i : number of samples provided */
+)
+{
+
+ int16_t ch_idx;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ /* set the md map */
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode == SBA_MODE_DIRAC ) )
+#else
+ if ( st_ivas->hDirAC )
+#endif
+ {
+ ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots );
+ }
+
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering );
+ }
+
+ if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) )
+ {
+ int16_t nSamplesLeftForTD, default_frame;
+ float *decorr_signal[BINAURAL_CHANNELS];
+ float *p_tc[2 * BINAURAL_CHANNELS];
+
+ default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ nSamplesLeftForTD = nSamplesForRendering;
+
+ for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ )
+ {
+ decorr_signal[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx + BINAURAL_CHANNELS];
+ p_tc[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx];
+ }
+
+ while ( nSamplesLeftForTD )
+ {
+ int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame );
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ if ( st_ivas->hDiracDecBin->hTdDecorr )
+ {
+#endif
+ ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr );
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ }
+#endif
+ for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ )
+ {
+ decorr_signal[ch_idx] += nSamplesToDecorr;
+ p_tc[ch_idx] += nSamplesToDecorr;
+ }
+ nSamplesLeftForTD -= nSamplesToDecorr;
+ }
+ }
+
+ /* if we have a late CNG generation, do it here */
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0];
+ generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna );
+ }
+
+ return error;
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_sba_dec_render()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_sba_dec_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ int16_t slots_to_render, first_sf, last_sf, subframe_idx;
+ uint16_t slot_size, ch;
+ uint16_t nchan_internal, nchan_out;
+ SPAR_DEC_HANDLE hSpar;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+
+ hSpar = st_ivas->hSpar;
+ nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
+
+ nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+
+#ifdef DEBUGGING
+ assert( hSpar );
+#endif
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] = output_f[ch];
+ }
+
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hSpar->num_slots - hSpar->slots_rendered, nSamplesAsked / slot_size );
+ *nSamplesRendered = slots_to_render * slot_size;
+ first_sf = hSpar->subframes_rendered;
+ last_sf = first_sf;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hSpar->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+#ifdef DEBUGGING
+ assert( slots_to_render == 0 );
+#endif
+
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx];
+
+ ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal );
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] += n_samples_sf;
+ }
+ }
+
+ if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC )
+ {
+ ivas_sba_linear_renderer( output_f, *nSamplesRendered, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx );
+ }
+
+ if ( st_ivas->hDirAC != NULL && hSpar->slots_rendered == hSpar->num_slots )
+ {
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ else
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ }
+
+ *nSamplesAvailable = ( hSpar->num_slots - hSpar->slots_rendered ) * slot_size;
+
+ return;
+}
+#endif
diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c
index e184654eaa1d36a2c7d0c1da9b82558746a46176..13f1401f8e589be0b01f9d165b238261a56bd043 100644
--- a/lib_dec/ivas_sba_dirac_stereo_dec.c
+++ b/lib_dec/ivas_sba_dirac_stereo_dec.c
@@ -45,6 +45,48 @@
#include "wmc_auto.h"
+/*-------------------------------------------------------------------*
+ * ivas_get_sba_dirac_stereo_flag()
+ *
+ * Set sba_dirac_stereo_flag
+ *-------------------------------------------------------------------*/
+
+int16_t ivas_get_sba_dirac_stereo_flag(
+ Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */
+)
+{
+ int16_t sba_dirac_stereo_flag;
+ AUDIO_CONFIG output_config;
+
+ sba_dirac_stereo_flag = 0;
+ output_config = st_ivas->hDecoderConfig->output_config;
+
+ if ( st_ivas->ivas_format == SBA_FORMAT || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
+ {
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#else
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#endif
+ {
+ if ( output_config == AUDIO_CONFIG_STEREO || ( output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) )
+ {
+ sba_dirac_stereo_flag = 1;
+ }
+ }
+ else
+ {
+ if ( st_ivas->nchan_transport == 1 && output_config == AUDIO_CONFIG_STEREO )
+ {
+ sba_dirac_stereo_flag = 1;
+ }
+ }
+ }
+
+ return sba_dirac_stereo_flag;
+}
+
+
/*-------------------------------------------------------------------*
* ivas_sba_dirac_stereo_config()
*
@@ -453,42 +495,86 @@ static void ivas_sba_dirac_stereo_upmix_hb(
float hb_gain[NB_DIV], /* i : side gains for HB signal */
const int16_t output_frame, /* i : output frame length per channel */
const int16_t mcmasa, /* i : McMASA flag */
+ const int16_t sba_mono_flag, /* i : flag for mono output */
+ const int16_t bwidth, /* i : bandwidth of signal */
const STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i : Stereo DFT handle for mixing matrix */
)
{
int16_t i;
+ float gp, gm;
+ float gain_fac;
if ( !mcmasa )
{
- for ( i = 0; i < output_frame / 2; i++ )
+ gain_fac = ( bwidth == FB ) ? 0.25f : 0.33f; /* last matrix element not used for SWB, divide by 3 instead of 4*/
+ if ( sba_mono_flag )
{
- float gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[1][0][8] +
- hStereoDft->mixer_mat_smooth[0][0][9] + hStereoDft->mixer_mat_smooth[1][0][9] +
- hStereoDft->mixer_mat_smooth[0][0][10] + hStereoDft->mixer_mat_smooth[1][0][10] +
- hStereoDft->mixer_mat_smooth[0][0][11] + hStereoDft->mixer_mat_smooth[1][0][11];
-
- float gm = hStereoDft->mixer_mat_smooth[0][0][8] - hStereoDft->mixer_mat_smooth[1][0][8] +
- hStereoDft->mixer_mat_smooth[0][0][9] - hStereoDft->mixer_mat_smooth[1][0][9] +
- hStereoDft->mixer_mat_smooth[0][0][10] - hStereoDft->mixer_mat_smooth[1][0][10] +
- hStereoDft->mixer_mat_smooth[0][0][11] - hStereoDft->mixer_mat_smooth[1][0][11];
-
- hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * 0.25f * gp;
- hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * 0.25f * gm;
+ gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[0][0][9] +
+ hStereoDft->mixer_mat_smooth[0][0][10];
+ if ( bwidth == FB )
+ {
+ gp += hStereoDft->mixer_mat_smooth[0][0][11];
+ }
+ for ( i = 0; i < output_frame / 2; i++ )
+ {
+ hb_stereo_synth[0][i] = hb_synth[i] * gain_fac * gp;
+ }
+ gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] +
+ hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS];
+ if ( bwidth == FB )
+ {
+ gp += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS];
+ }
+ for ( i = output_frame / 2; i < output_frame; i++ )
+ {
+ hb_stereo_synth[0][i] = hb_synth[i] * gain_fac * gp;
+ }
}
- for ( i = output_frame / 2; i < output_frame; i++ )
+ else
{
- float gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS];
-
- float gm = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS] +
- hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS];
-
- hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * 0.25f * gp;
- hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * 0.25f * gm;
+ gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[1][0][8] +
+ hStereoDft->mixer_mat_smooth[0][0][9] + hStereoDft->mixer_mat_smooth[1][0][9] +
+ hStereoDft->mixer_mat_smooth[0][0][10] + hStereoDft->mixer_mat_smooth[1][0][10];
+ if ( bwidth == FB )
+ {
+ gp += hStereoDft->mixer_mat_smooth[0][0][11] + hStereoDft->mixer_mat_smooth[1][0][11];
+ }
+
+ gm = hStereoDft->mixer_mat_smooth[0][0][8] - hStereoDft->mixer_mat_smooth[1][0][8] +
+ hStereoDft->mixer_mat_smooth[0][0][9] - hStereoDft->mixer_mat_smooth[1][0][9] +
+ hStereoDft->mixer_mat_smooth[0][0][10] - hStereoDft->mixer_mat_smooth[1][0][10];
+ if ( bwidth == FB )
+ {
+ gm += hStereoDft->mixer_mat_smooth[0][0][11] - hStereoDft->mixer_mat_smooth[1][0][11];
+ }
+
+ for ( i = 0; i < output_frame / 2; i++ )
+ {
+ hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * gain_fac * gp;
+ hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * gain_fac * gm;
+ }
+
+ gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] +
+ hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] +
+ hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS];
+ if ( bwidth == FB )
+ {
+ gp += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS];
+ }
+
+ gm = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] +
+ hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] +
+ hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS];
+ if ( bwidth == FB )
+ {
+ gm += hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS];
+ }
+
+ for ( i = output_frame / 2; i < output_frame; i++ )
+ {
+ hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * gain_fac * gp;
+ hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * gain_fac * gm;
+ }
}
}
else
@@ -611,6 +697,10 @@ void ivas_sba_dirac_stereo_smooth_parameters(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */
const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */
const int32_t output_Fs /* i : Fs for delay calculation */
+#ifdef FIX_STEREO_474
+ ,
+ const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */
+#endif
)
{
int16_t i, j, k, i_sf;
@@ -650,6 +740,9 @@ void ivas_sba_dirac_stereo_smooth_parameters(
float xfade_start_ns;
int16_t xfade_delay_subframes;
int16_t i_hist;
+#ifdef FIX_STEREO_474
+ int16_t md_sf;
+#endif
xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS;
xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) );
@@ -660,6 +753,11 @@ void ivas_sba_dirac_stereo_smooth_parameters(
{
for ( i_sf = k * 2; i_sf < ( k + 1 ) * 2; i_sf++ )
{
+
+#ifdef FIX_STEREO_474
+ md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0;
+#endif
+
if ( hStereoDft->first_frame )
{
for ( i = 0; i < 2; i++ )
@@ -704,7 +802,11 @@ void ivas_sba_dirac_stereo_smooth_parameters(
{
for ( b = 0; b < hStereoDft->nbands; b++ )
{
+#ifdef FIX_STEREO_474
+ hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS];
+#else
hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + i_sf * IVAS_MAX_NUM_BANDS];
+#endif
}
}
}
@@ -732,6 +834,7 @@ void ivas_sba_dirac_stereo_dec(
)
{
int16_t dtx_flag, fd_cng_flag;
+ int16_t sba_mono_flag;
int16_t memOffset;
float tmp_buf[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )];
float tmp_synth[L_FRAME16k];
@@ -756,12 +859,17 @@ void ivas_sba_dirac_stereo_dec(
dtx_flag = ( hSCE->hCoreCoder[0]->core_brate <= SID_2k40 );
fd_cng_flag = ( dtx_flag && hSCE->hCoreCoder[0]->cng_type == FD_CNG );
}
+ sba_mono_flag = ( st_ivas->hDecoderConfig->nchan_out == 1 ) ? 1 : 0;
memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS );
ivas_sba_dirac_stereo_config( hStereoDft->hConfig );
+#ifdef SBA_MODE_CLEAN_UP
+ hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) );
+#else
hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) );
+#endif
stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ );
if ( st_ivas->nchan_transport > 1 )
{
@@ -783,31 +891,52 @@ void ivas_sba_dirac_stereo_dec(
}
/* mapping of DirAC parameters (azimuth, elevation, diffuseness) to DFT Stereo parameters (side gain, prediction gain) */
+#ifdef SBA_MODE_CLEAN_UP
+ map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0],
+ st_ivas->ivas_format == MC_FORMAT,
+ ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame,
+ ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) );
+#else
map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0],
st_ivas->ivas_format == MC_FORMAT,
( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame,
( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) );
-
+#endif
+#ifdef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa )
+#else
if ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa )
+#endif
{
set_f( hStereoDft->res_pred_gain, 1.f, 3 * STEREO_DFT_BAND_MAX );
}
/* DFT Stereo upmix */
- stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1, /*st_ivas->sba_dirac_stereo_flag*/
- ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : 0,
+ stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag,
+ ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL,
( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0,
- st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport );
+ st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport
+#ifdef FIX_STEREO_474
+ ,
+ ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate )
+#endif
+ );
/* DFT synthesis */
stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame );
- stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame );
+ if ( !sba_mono_flag )
+ {
+ stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame );
+ }
synchro_synthesis( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ );
/* output scaling */
- v_multc( output[0], 0.5f, output[0], output_frame );
- v_multc( output[1], 0.5f, output[1], output_frame );
+ if ( !sba_mono_flag )
+ {
+ v_multc( output[0], 0.5f, output[0], output_frame );
+ v_multc( output[1], 0.5f, output[1], output_frame );
+ }
/* delay HB synth */
if ( st_ivas->nchan_transport == 1 )
@@ -823,16 +952,28 @@ void ivas_sba_dirac_stereo_dec(
/* upmix ACELP BWE */
ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain );
+#ifdef SBA_MODE_CLEAN_UP
ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame,
- ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), hStereoDft );
-
+ ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft );
+#else
+ ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame,
+ ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft );
+#endif
/* add HB to ACELP core */
v_add( output[0], hb_synth_stereo[0], output[0], output_frame );
- v_add( output[1], hb_synth_stereo[1], output[1], output_frame );
+ if ( !sba_mono_flag )
+ {
+ v_add( output[1], hb_synth_stereo[1], output[1], output_frame );
+
+ /* apply TD Stereo Filling as is done in ICBWE */
+#ifdef SBA_MODE_CLEAN_UP
+ ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) );
+#else
+ ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) );
- /* apply TD Stereo Filling as is done in ICBWE */
- ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) );
+#endif
+ }
}
return;
diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c
index bd799f9d5fbff0499d68a83b4c26734f0a779ab9..dd4af01ccf68b1fa14298f6f54e60e8f1491c2f8 100644
--- a/lib_dec/ivas_sba_rendering_internal.c
+++ b/lib_dec/ivas_sba_rendering_internal.c
@@ -65,7 +65,10 @@ void ivas_sba2mc_cldfb(
float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */
const int16_t nb_channels_out, /* i : nb of output channels */
const int16_t nb_bands, /* i : nb of CLDFB bands to process */
- const float *hoa_dec_mtx /* i : HOA decoding mtx */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nb_timeslots, /* i : number of time slots to process */
+#endif
+ const float *hoa_dec_mtx /* i : HOA decoding mtx */
)
{
int16_t iBlock, iBand, n, m;
@@ -89,7 +92,12 @@ void ivas_sba2mc_cldfb(
g = hoa_dec_mtx[SBA_NHARM_HOA3 * n + m];
p_realOut = realOut[n];
p_imagOut = imagOut[n];
+
+#ifdef JBM_TSM_ON_TCS
+ for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ )
+#else
for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ )
+#endif
{
p_real = RealBuffer[m][iBlock];
p_imag = ImagBuffer[m][iBlock];
@@ -108,7 +116,12 @@ void ivas_sba2mc_cldfb(
{
p_realOut = realOut[n];
p_imagOut = imagOut[n];
+
+#ifdef JBM_TSM_ON_TCS
+ for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ )
+#else
for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ )
+#endif
{
p_real = RealBuffer[n][iBlock];
p_imag = ImagBuffer[n][iBlock];
@@ -133,11 +146,16 @@ void ivas_sba2mc_cldfb(
*-------------------------------------------------------------------------*/
void ivas_mc2sba(
- IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */
+ IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */
+#ifdef JBM_TSM_ON_TCS
+ float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */
+ float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */
+#else
float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */
- const int16_t output_frame, /* i : output frame length per channel */
- const int16_t sba_order, /* i : Ambisonic (SBA) order */
- const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */
+#endif
+ const int16_t output_frame, /* i : output frame length per channel */
+ const int16_t sba_order, /* i : Ambisonic (SBA) order */
+ const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */
)
{
int16_t i, j, k;
@@ -168,7 +186,11 @@ void ivas_mc2sba(
/* Add LFE to omni W with gain*/
for ( k = 0; k < output_frame; k++ )
{
+#ifdef JBM_TSM_ON_TCS
+ buffer_tmp[0][k] += gain_lfe * in_buffer_td[i][k];
+#else
buffer_tmp[0][k] += gain_lfe * buffer_td[i][k];
+#endif
}
}
@@ -194,7 +216,11 @@ void ivas_mc2sba(
{
for ( k = 0; k < output_frame; k++ )
{
+#ifdef JBM_TSM_ON_TCS
+ buffer_tmp[j][k] += gains[j] * in_buffer_td[i][k];
+#else
buffer_tmp[j][k] += gains[j] * buffer_td[i][k];
+#endif
}
}
}
@@ -228,15 +254,21 @@ int16_t ivas_sba_remapTCs(
#endif
nchan_remapped = st_ivas->nchan_transport;
+#ifdef SBA_MODE_CLEAN_UP
+ if ( nchan_remapped == 3 )
+#else
if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && nchan_remapped >= 3 ) ||
( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && nchan_remapped == 3 ) )
+#endif
{
nchan_remapped++;
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode != SBA_MODE_SPAR )
{
assert( ( ( st_ivas->nchan_transport == 3 ) || ( st_ivas->nchan_transport == 5 ) || ( st_ivas->nchan_transport == 7 ) ) && "Number of channels must be odd for SBA planar!" );
}
+#endif
if ( nchan_remapped == 4 )
{
@@ -263,11 +295,12 @@ int16_t ivas_sba_remapTCs(
}
}
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode != SBA_MODE_SPAR )
{
ivas_sba_zero_vert_comp( sba_data, st_ivas->sba_analysis_order, st_ivas->sba_planar, output_frame );
}
-
+#endif
return ( nchan_remapped );
}
@@ -279,10 +312,14 @@ int16_t ivas_sba_remapTCs(
*-------------------------------------------------------------------------*/
void ivas_ism2sba(
- float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */
+#ifdef JBM_TSM_ON_TCS
+ float *buffer_td[], /* i/o: TD signal buffers */
+#else
+ float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */
+#endif
ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */
const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */
- const int16_t num_objects, /* i : number of objects */
+ const int16_t nchan_ism, /* i : number of objects */
const int16_t output_frame, /* i : output frame length per channel */
const int16_t sba_order /* i : Ambisonic (SBA) order */
)
@@ -304,7 +341,7 @@ void ivas_ism2sba(
set_zero( buffer_tmp[j], output_frame );
}
- for ( i = 0; i < num_objects; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
// TODO tmu review when #215 is resolved
azimuth = (int16_t) floorf( hIsmMetaData[i]->azimuth + 0.5f );
@@ -335,6 +372,59 @@ void ivas_ism2sba(
return;
}
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------*
+ * ivas_ism2sba()
+ *
+ * ISM transformed into SBA in TD domain.
+ *-------------------------------------------------------------------------*/
+
+void ivas_ism2sba_sf(
+ float *buffer_in[], /* i : TC buffer */
+ float *buffer_out[], /* o : TD signal buffers */
+ ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */
+ const int16_t num_objects, /* i : number of objects */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ const int16_t offset, /* i : offset for the interpolatr */
+ const int16_t sba_order /* i : Ambisonic (SBA) order */
+)
+{
+ int16_t i, j, k;
+ float g1, *g2, *tc, *out, gain, prev_gain;
+ int16_t sba_num_chans;
+
+ assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" );
+ assert( hIsmRendererData != NULL && "hIsmRendererData not allocated!" );
+
+
+ /* Init*/
+ sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 );
+ for ( j = 0; j < sba_num_chans; j++ )
+ {
+ set_zero( buffer_out[j], n_samples_to_render );
+ }
+
+ for ( i = 0; i < num_objects; i++ )
+ {
+ for ( j = 0; j < sba_num_chans; j++ )
+ {
+ g2 = hIsmRendererData->interpolator + offset;
+ g1 = 1 - *g2;
+ tc = buffer_in[i] + offset;
+ out = buffer_out[j];
+ gain = hIsmRendererData->gains[i][j];
+ prev_gain = hIsmRendererData->prev_gains[i][j];
+ for ( k = 0; k < n_samples_to_render; k++ )
+ {
+ *( out++ ) += ( ( *( g2++ ) ) * gain + g1 * prev_gain ) * ( *( tc++ ) );
+ g1 = 1.0f - *g2;
+ }
+ }
+ }
+
+ return;
+}
+#endif
/*-------------------------------------------------------------------*
* ivas_sba_upmixer_renderer()
@@ -348,13 +438,18 @@ void ivas_sba_upmixer_renderer(
const int16_t output_frame /* i : output frame length */
)
{
- int16_t i, nchan_internal;
+ int16_t nchan_internal;
+#ifndef JBM_TSM_ON_TCS
+ int16_t i;
float temp;
+#endif
push_wmops( "ivas_sba_upmixer_renderer" );
- nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order );
+ nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
+#ifndef JBM_TSM_ON_TCS
if ( st_ivas->nchan_transport >= 3 )
{
/*convert WYZX downmix to WYXZ*/
@@ -365,15 +460,27 @@ void ivas_sba_upmixer_renderer(
output[3][i] = temp;
}
}
+#endif
/* Upmixer + Renderer */
ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame );
if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC )
{
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[MAX_OUTPUT_CHANNELS];
+ int16_t ch;
+
+ for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ )
+ {
+ output_f[ch] = output[ch];
+ }
+
+ ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx );
+#else
ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx );
+#endif
}
-
pop_wmops();
return;
@@ -387,7 +494,11 @@ void ivas_sba_upmixer_renderer(
*-------------------------------------------------------------------*/
static void ivas_sba_mtx_mult(
- float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */
+#else
+ float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */
+#endif
const int16_t output_frame, /* i : output frame length per channel */
const int16_t nchan_in, /* i : Number of ambisonic channels */
const IVAS_OUTPUT_SETUP output_setup, /* i : Output configuration */
@@ -447,7 +558,11 @@ static void ivas_sba_mtx_mult(
*-------------------------------------------------------------------*/
ivas_error ivas_sba_linear_renderer(
- float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */
+#else
+ float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */
+#endif
const int16_t output_frame, /* i : output frame length per channel */
const int16_t nchan_in, /* i : number of input ambisonics channels */
const AUDIO_CONFIG output_config, /* i : output audio configuration */
@@ -581,7 +696,8 @@ void ivas_sba_mix_matrix_determiner(
/* Mixing matrix determiner */
num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands;
- ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi );
+ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi,
+ MAX_PARAM_SPATIAL_SUBFRAMES );
return;
}
diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c
old mode 100644
new mode 100755
index 87a76599929caa2a2b2e9dbd5a7ab5acc00c24ab..f405f50c04ac0e8fe294fe9a4aee07155d345df2
--- a/lib_dec/ivas_sce_dec.c
+++ b/lib_dec/ivas_sce_dec.c
@@ -77,9 +77,9 @@ ivas_error ivas_sce_dec(
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate;
- if ( st_ivas->ism_mode == ISM_MODE_PARAM )
+ if ( st_ivas->ivas_format == ISM_FORMAT )
{
- st->cng_type = FD_CNG; /* TODO: move to init if possible */
+ st->cng_type = FD_CNG;
}
/*------------------------------------------------------------------*
@@ -87,22 +87,23 @@ ivas_error ivas_sce_dec(
*-----------------------------------------------------------------*/
/* set total_brate - needed in DTX */
- if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) )
+ if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 )
{
st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC;
assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" );
+
+ if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id )
+ {
+ st->total_brate = FRAME_NO_DATA;
+ }
}
- else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 )
+ else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA )
{
- st->total_brate = ivas_total_brate;
+ st->total_brate = FRAME_NO_DATA;
}
- else if ( !st_ivas->bfi && ( last_ivas_total_brate <= SID_2k40 || last_ivas_total_brate == IVAS_SID_5k2 ) )
+ else if ( !st_ivas->bfi && st_ivas->ivas_format != ISM_FORMAT && last_ivas_total_brate <= IVAS_SID_5k2 )
{
- /* check if this is indeed needed? */
- if ( st_ivas->ivas_format != ISM_FORMAT )
- {
- st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC;
- }
+ st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC;
}
/* read the bandwidth */
@@ -148,8 +149,13 @@ ivas_error ivas_sce_dec(
st->codec_mode = MODE1;
/* set "bits_frame_nominal" */
+#ifndef SBA_MODE_CLEAN_UP
if ( ( st_ivas->hQMetaData != NULL ) &&
( st_ivas->sba_mode != SBA_MODE_SPAR ) )
+#else
+ if ( ( st_ivas->hQMetaData != NULL ) &&
+ ( st_ivas->ivas_format != SBA_FORMAT ) )
+#endif
{
if ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE )
{
@@ -160,7 +166,11 @@ ivas_error ivas_sce_dec(
st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal;
}
}
+#ifndef SBA_MODE_CLEAN_UP
else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC );
}
@@ -170,11 +180,16 @@ ivas_error ivas_sce_dec(
}
/* set "total_brate" */
- if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) )
+ if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 )
{
st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC;
+
+ if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id )
+ {
+ st->total_brate = FRAME_NO_DATA;
+ }
}
- else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 )
+ else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA )
{
st->total_brate = ivas_total_brate;
}
@@ -354,7 +369,7 @@ ivas_error create_sce_dec(
return error;
}
- if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO )
+ if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) )
{
if ( ( error = openCldfb( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK )
{
diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c
index 7aecb898d139a033876c4916c8ec4aebadeaab30..e11551d2a603439892d7d0589a20ffebe908d8d7 100644
--- a/lib_dec/ivas_sns_dec.c
+++ b/lib_dec/ivas_sns_dec.c
@@ -35,6 +35,9 @@
#include "prot.h"
#include "ivas_prot.h"
#include "rom_com.h"
+#include "ivas_rom_com.h"
+#include "ivas_cnst.h"
+#include
#include "wmc_auto.h"
/*-------------------------------------------------------------------
@@ -45,24 +48,45 @@
static void sns_1st_dec(
const int16_t index, /* i : codebook index */
- float *snsq /* i/o: i:prediction o:quantized sns */
+ const int16_t core,
+ const int16_t L_frame,
+ float *snsq /* i/o: i:prediction o:quantized sns */
)
{
int16_t i;
- const float *p_dico;
+ const int16_t *p_dico, *means;
+ const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC );
+ const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC );
- p_dico = &sns_vq_cdk1[( index % 32 ) * ( M / 2 )];
+ means = NULL;
+ switch ( L_frame )
+ {
+ case L_FRAME16k:
+ means = &sns_1st_means_16k[core - 1][0];
+ break;
+ case L_FRAME25_6k:
+ means = &sns_1st_means_25k6[core - 1][0];
+ break;
+ case L_FRAME32k:
+ means = &sns_1st_means_32k[core - 1][0];
+ break;
+ default:
+ assert( !"illegal frame length in sns_1st_cod" );
+ }
+
+
+ p_dico = &sns_1st_cdbk[0][core - 1][0] + ( index % 32 ) * ( M / 2 );
for ( i = 0; i < M / 2; i++ )
{
- snsq[i] = *p_dico++;
+ snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float;
}
- p_dico = &sns_vq_cdk2[( index >> 5 ) * ( M / 2 )];
+ p_dico = &sns_1st_cdbk[1][core - 1][0] + ( index >> 5 ) * ( M / 2 );
for ( i = M / 2; i < M; i++ )
{
- snsq[i] = *p_dico++;
+ snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float;
}
return;
@@ -103,29 +127,23 @@ static void sns_2st_dec(
*-------------------------------------------------------------------*/
void sns_avq_dec(
- int16_t *index, /* i : Quantization indices */
- float *SNS_Q, /* o : Quantized SNS vectors */
+ int16_t *index, /* i : Quantization indices */
+ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */
+ const int16_t L_frame,
const int16_t numlpc /* i : Number of sets of lpc */
)
{
int16_t i, nbi, last;
int16_t q_type;
- /* Last LPC index */
- if ( numlpc == 1 )
- {
- last = 0;
- }
- else
- {
- last = M;
- }
+ /* go from one-based indexing to zero-based indexing */
+ last = numlpc - 1;
index++;
/* Decode last LPC */
- sns_1st_dec( *index++, &SNS_Q[last] );
- sns_2st_dec( &SNS_Q[last], index );
+ sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[last] );
+ sns_2st_dec( SNS_Q[last], index );
nbi = 2 + index[0] + index[1];
index += nbi;
@@ -136,16 +154,16 @@ void sns_avq_dec(
if ( q_type == 0 )
{
- sns_1st_dec( *index++, &SNS_Q[0] );
- sns_2st_dec( &SNS_Q[0], index );
+ sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[0] );
+ sns_2st_dec( SNS_Q[0], index );
}
else if ( q_type == 1 )
{
for ( i = 0; i < M; i++ )
{
- SNS_Q[i] = SNS_Q[M + i];
+ SNS_Q[0][i] = SNS_Q[0][M + i];
}
- sns_2st_dec( &SNS_Q[0], index );
+ sns_2st_dec( SNS_Q[0], index );
}
}
@@ -160,10 +178,11 @@ void sns_avq_dec(
*-------------------------------------------------------------------*/
void sns_avq_dec_stereo(
- int16_t *indexl, /* i : Quantization indices (left channel) */
- int16_t *indexr, /* i : Quantization indices (right channe) */
- float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */
- float *SNS_Qr /* o : Quantized SNS vectors (right channe) */
+ int16_t *indexl, /* i : Quantization indices (left channel) */
+ int16_t *indexr, /* i : Quantization indices (right channe) */
+ const int16_t L_frame,
+ float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */
+ float *SNS_Qr /* o : Quantized SNS vectors (right channe) */
)
{
int16_t i, stereo_mode;
@@ -176,7 +195,7 @@ void sns_avq_dec_stereo(
{
/* MS coding */
- sns_1st_dec( *indexl++, mid_q );
+ sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, mid_q );
sns_2st_dec( mid_q, indexl );
for ( i = 0; i < M; i++ )
@@ -199,12 +218,75 @@ void sns_avq_dec_stereo(
{
/* LR decoding */
- sns_1st_dec( *indexl++, SNS_Ql );
+ sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, SNS_Ql );
sns_2st_dec( SNS_Ql, indexl );
- sns_1st_dec( *indexr++, SNS_Qr );
+ sns_1st_dec( *indexr++, TCX_20_CORE, L_frame, SNS_Qr );
sns_2st_dec( SNS_Qr, indexr );
}
return;
}
+
+void dequantize_sns(
+ int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW],
+ float snsQ_out[CPE_CHANNELS][NB_DIV][M],
+ Decoder_State **sts )
+{
+ int16_t nSubframes, k, ch;
+ int16_t sns_stereo_mode[NB_DIV];
+ int16_t zero_side_flag[NB_DIV];
+ Decoder_State *st;
+
+ sns_stereo_mode[0] = indices[0][0];
+ sns_stereo_mode[1] = indices[0][1];
+ zero_side_flag[0] = indices[0][2];
+ zero_side_flag[1] = indices[0][3];
+
+ for ( ch = 0; ch < CPE_CHANNELS; ++ch )
+ {
+ int16_t idxIndices;
+
+ st = sts[ch];
+ nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ idxIndices = 0;
+
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS;
+ const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10;
+ int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 );
+ float *snsQ = snsQ_out[ch][k];
+
+ if ( is_side )
+ {
+ const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10;
+ if ( zero_side_flag[k] )
+ {
+ set_zero( snsQ, M );
+ continue;
+ }
+
+ nStages = SNS_MSVQ_NSTAGES_SIDE;
+ msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL );
+ }
+ else
+ {
+ msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL );
+ }
+ idxIndices += nStages;
+ }
+ }
+
+ if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS )
+ {
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
+ {
+ inverseMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f );
+ }
+ }
+ }
+}
diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c
old mode 100644
new mode 100755
index 01e4db2ed40c3764b0b9d07e375cb255767d39c2..f3fd5ed04cd67273b17fcfebfaf3113563bb189e
--- a/lib_dec/ivas_spar_decoder.c
+++ b/lib_dec/ivas_spar_decoder.c
@@ -41,6 +41,7 @@
#include "ivas_prot.h"
#include "ivas_prot_rend.h"
#include "ivas_rom_com.h"
+#include "ivas_rom_dec.h"
#include "ivas_stat_com.h"
#include
#include
@@ -71,10 +72,13 @@ ivas_error ivas_spar_dec_open(
IVAS_FB_CFG *fb_cfg;
int16_t i, j, b, active_w_mixing;
int32_t output_Fs;
+ int16_t num_decor_chs;
error = IVAS_ERR_OK;
sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
- num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal );
+
+ num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate );
+
hSpar = st_ivas->hSpar;
if ( !spar_reconfig_flag )
@@ -87,12 +91,31 @@ ivas_error ivas_spar_dec_open(
}
output_Fs = st_ivas->hDecoderConfig->output_Fs;
+ if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) )
+ {
+ num_decor_chs = IVAS_HBR_MAX_DECOR_CHS;
+ }
+ else
+ {
+ num_decor_chs = num_channels_internal - 1;
+ }
/* TD decorr. */
- if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_channels_internal, 1 ) ) != IVAS_ERR_OK )
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) ) )
{
- return error;
+ hSpar->hTdDecorr = NULL;
+ }
+ else
+ {
+#endif
+ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+#ifdef FIX_163_SBA_TD_DECORR_OPT
}
+#endif
/* MD handle */
if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK )
@@ -100,11 +123,24 @@ ivas_error ivas_spar_dec_open(
return error;
}
hSpar->hMdDec->td_decorr_flag = 1;
+#ifdef FIX_501_TABLE_IDX_INIT
+ if ( hSpar->hTdDecorr )
+ {
+ hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking;
+ }
+#else
hSpar->hMdDec->table_idx = -1;
+#endif
/* set FB config. */
active_w_mixing = -1;
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs ) ) != IVAS_ERR_OK )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -173,6 +209,51 @@ ivas_error ivas_spar_dec_open(
ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config );
+#ifdef JBM_TSM_ON_TCS
+ set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS );
+ set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS );
+ hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS;
+ hSpar->subframes_rendered = 0;
+ hSpar->slots_rendered = 0;
+ hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME;
+
+ /* init render timeslot mapping */
+ {
+ int16_t map_idx;
+ set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+ for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ )
+ {
+ hSpar->render_to_md_map[map_idx] = map_idx;
+ }
+ }
+
+ /* allocate transport channels*/
+ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL )
+ {
+ int16_t nchan_to_allocate;
+ int16_t nchan_tc;
+ TC_BUFFER_MODE buffer_mode;
+
+ buffer_mode = TC_BUFFER_MODE_RENDERER;
+ nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas );
+ nchan_to_allocate = num_channels_internal;
+ if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO )
+ {
+ buffer_mode = TC_BUFFER_MODE_BUFFER;
+ nchan_tc = st_ivas->hDecoderConfig->nchan_out;
+ nchan_to_allocate = nchan_tc;
+ }
+ else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC )
+ {
+ nchan_to_allocate = 2 * BINAURAL_CHANNELS;
+ }
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif
+
st_ivas->hSpar = hSpar;
return error;
@@ -252,6 +333,16 @@ ivas_error ivas_spar_dec(
bit_stream_orig = st0->bit_stream;
next_bit_pos_orig = st0->next_bit_pos;
+#ifdef SBA_MODE_CLEAN_UP
+ /* read DirAC bitstream */
+ if ( st_ivas->hQMetaData != NULL )
+ {
+ ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hQMetaData, nb_bits_read,
+ ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ),
+ st_ivas->hSpar->dirac_to_spar_md_bands );
+ }
+#endif
+
last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 );
if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 )
{
@@ -598,7 +689,7 @@ void ivas_spar_get_cldfb_gains(
* determines if an FOA input channel is transmitted as residual channel.
*---------------------------------------------------------------------*/
-/* !r: 1 if prediction residual channel */
+/*! r: 1 if prediction residual channel */
int16_t ivas_is_res_channel(
const int16_t ch, /* i : ch index in WYZX ordering */
const int16_t nchan_transport /* i : number of transport channels (1-4) */
@@ -635,6 +726,7 @@ static void ivas_spar_dec_MD(
{
int16_t num_channels, table_idx, num_bands_out, bfi, sba_order;
int32_t ivas_total_brate;
+ int16_t num_md_sub_frames;
DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig;
SPAR_DEC_HANDLE hSpar = st_ivas->hSpar;
@@ -647,7 +739,11 @@ static void ivas_spar_dec_MD(
sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
bfi = st_ivas->bfi;
ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate;
- num_channels = ivas_sba_get_nchan_metadata( sba_order );
+ num_channels = ivas_sba_get_nchan_metadata( sba_order,
+ ivas_total_brate );
+
+ num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate );
+
num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands;
if ( ivas_total_brate > FRAME_NO_DATA && !bfi )
@@ -668,8 +764,15 @@ static void ivas_spar_dec_MD(
if ( hSpar->hMdDec->table_idx != table_idx )
{
hSpar->hMdDec->table_idx = table_idx;
- hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking;
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ if ( hSpar->hTdDecorr )
+ {
+#endif
+ hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking;
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ }
+#endif
ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order );
}
}
@@ -706,7 +809,10 @@ static void ivas_spar_dec_MD(
if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 )
{
- ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out );
+ ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out
+
+ ,
+ num_md_sub_frames );
}
else
{
@@ -717,7 +823,8 @@ static void ivas_spar_dec_MD(
{
if ( !bfi )
{
- ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out );
+ ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out,
+ num_md_sub_frames );
}
set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS );
@@ -856,7 +963,8 @@ static void ivas_spar_get_skip_mat(
const int16_t num_ch_out,
const int16_t num_ch_in,
const int16_t num_spar_bands,
- int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] )
+ int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
+ const int16_t num_md_sub_frames )
{
int16_t spar_band, out_ch, in_ch;
int16_t i_ts, skip_flag;
@@ -867,12 +975,11 @@ static void ivas_spar_get_skip_mat(
{
skip_mat[out_ch][in_ch] = 1;
skip_flag = 1;
-
for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
{
for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ )
{
- if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f || hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f )
+ if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f )
{
skip_flag = 0;
break;
@@ -885,9 +992,322 @@ static void ivas_spar_get_skip_mat(
break;
}
}
+ if ( skip_mat[out_ch][in_ch] == 1 )
+ {
+ for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
+ {
+ for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ )
+ {
+ if ( hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f )
+ {
+ skip_flag = 0;
+ break;
+ }
+ }
+
+ if ( skip_flag == 0 )
+ {
+ skip_mat[out_ch][in_ch] = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+
+static void ivas_spar_calc_smooth_facs(
+ float *cldfb_in_ts_re[CLDFB_NO_COL_MAX],
+ float *cldfb_in_ts_im[CLDFB_NO_COL_MAX],
+ int16_t nbands_spar,
+ ivas_fb_bin_to_band_data_t *bin2band,
+ float *smooth_fac,
+ float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1] )
+{
+ int16_t b, bin, i, ts;
+ float subframe_band_nrg[IVAS_MAX_NUM_BANDS];
+ float smooth_long_avg[IVAS_MAX_NUM_BANDS];
+ float smooth_short_avg[IVAS_MAX_NUM_BANDS];
+
+ bin = 0;
+ for ( b = 0; b < nbands_spar; b++ )
+ {
+ if ( b > 0 && bin2band->p_cldfb_map_to_spar_band[bin] < bin2band->p_cldfb_map_to_spar_band[bin - 1] )
+ {
+ break;
+ }
+ /* calculate band-wise subframe energies */
+ subframe_band_nrg[b] = 0.f;
+ while ( b == bin2band->p_cldfb_map_to_spar_band[bin] )
+ {
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+ {
+ subframe_band_nrg[b] += cldfb_in_ts_re[ts][bin] * cldfb_in_ts_re[ts][bin] + cldfb_in_ts_im[ts][bin] * cldfb_in_ts_im[ts][bin];
+ }
+ bin++;
+ }
+ subframe_band_nrg[b] = sqrtf( subframe_band_nrg[b] );
+ smooth_buf[b][0] = subframe_band_nrg[b];
+
+ /* calculate short and long energy averages */
+ smooth_short_avg[b] = EPSILON;
+ for ( i = 0; i < 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i++ )
+ {
+ smooth_short_avg[b] += smooth_buf[b][i];
+ }
+
+ smooth_long_avg[b] = smooth_short_avg[b];
+ for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i < 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i++ )
+ {
+ smooth_long_avg[b] += smooth_buf[b][i];
+ }
+ smooth_short_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_SHORT );
+ smooth_long_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_LONG );
+
+ /* calculate smoothing factor based on energy averages */
+ /* reduce factor for higher short-term energy */
+ smooth_fac[b] = min( 1.f, smooth_long_avg[b] / smooth_short_avg[b] );
+ /* map factor to range [0;1] */
+ smooth_fac[b] = max( 0.f, smooth_fac[b] - (float) SBA_DIRAC_NRG_SMOOTH_SHORT / SBA_DIRAC_NRG_SMOOTH_LONG ) * ( (float) SBA_DIRAC_NRG_SMOOTH_LONG / ( SBA_DIRAC_NRG_SMOOTH_LONG - SBA_DIRAC_NRG_SMOOTH_SHORT ) );
+ /* compress factor (higher compression in lowest bands) */
+ if ( b < 2 )
+ {
+ smooth_fac[b] = powf( smooth_fac[b], 0.25f );
+ }
+ else
+ {
+ smooth_fac[b] = powf( smooth_fac[b], 0.5f );
+ }
+
+ /* apply upper bounds depending on band */
+ smooth_fac[b] = max( min_smooth_gains1[b], min( max_smooth_gains2[b], smooth_fac[b] ) );
+ }
+
+ for ( b = 0; b < nbands_spar; b++ )
+ {
+ for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i > 0; i-- )
+ {
+ smooth_buf[b][i] = smooth_buf[b][i - 1];
+ }
+ }
+
+ return;
+}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------*
+ * ivas_spar_dec_agc_pca()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_spar_dec_agc_pca(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float output[][L_FRAME48k], /* i/o: input/output audio channels */
+ const int16_t output_frame /* i : output frame length */
+)
+{
+ int16_t nchan_transport;
+ int16_t num_in_ingest;
+ DECODER_CONFIG_HANDLE hDecoderConfig;
+ SPAR_DEC_HANDLE hSpar;
+
+ push_wmops( "ivas_spar_dec_agc_pca" );
+
+ hSpar = st_ivas->hSpar;
+ hDecoderConfig = st_ivas->hDecoderConfig;
+ nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport;
+
+ if ( st_ivas->nchan_transport >= 3 )
+ {
+ float temp;
+ int16_t i;
+ /*convert WYZX downmix to WYXZ*/
+ for ( i = 0; i < output_frame; i++ )
+ {
+ temp = output[2][i];
+ output[2][i] = output[3][i];
+ output[3][i] = temp;
+ }
+ }
+
+ if ( hSpar->hMdDec->td_decorr_flag )
+ {
+ num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
+ }
+ else
+ {
+ num_in_ingest = nchan_transport;
+ }
+
+ /*---------------------------------------------------------------------*
+ * AGC
+ *---------------------------------------------------------------------*/
+
+ ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame );
+#ifdef DEBUG_SBA_AUDIO_DUMP
+ /* Dump audio signal after ivas_agc_dec_process */
+ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" );
+#endif
+
+ if ( hSpar->hPCA != NULL )
+ {
+ ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output );
+#ifdef DEBUG_SBA_AUDIO_DUMP
+ /* Dump audio signal after ivas_pca_dec */
+ ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" );
+#endif
+ }
+ pop_wmops();
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_spar_dec_set_render_map()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_spar_dec_set_render_map(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
+ const int16_t nCldfbTs /* i : number of CLDFB time slots */
+)
+{
+ SPAR_DEC_HANDLE hSpar;
+
+ hSpar = st_ivas->hSpar;
+#ifdef DEBUGGING
+ assert( hSpar );
+#endif
+
+ /* adapt subframes */
+ hSpar->num_slots = nCldfbTs;
+ hSpar->slots_rendered = 0;
+ hSpar->subframes_rendered = 0;
+ set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME );
+ ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpar->subframe_nbslots, &hSpar->nb_subframes );
+ ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_map );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_spar_dec_upmixer()
+ *
+ * IVAS SPAR upmixer
+ *-------------------------------------------------------------------*/
+
+void ivas_spar_dec_set_render_params(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */
+)
+{
+ SPAR_DEC_HANDLE hSpar;
+ int16_t nchan_transport;
+ int16_t num_bands_out;
+
+ hSpar = st_ivas->hSpar;
+
+ /*---------------------------------------------------------------------*
+ * Gen umx mat
+ *---------------------------------------------------------------------*/
+
+ nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport;
+ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands;
+ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi,
+ ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) );
+
+ ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_spar_dec_digest_tc()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_spar_dec_digest_tc(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const int16_t nCldfbSlots, /* i : number of CLDFB slots */
+ const int16_t nSamplesForRendering /* i : number of samples provided */
+)
+{
+ SPAR_DEC_HANDLE hSpar;
+
+ hSpar = st_ivas->hSpar;
+ if ( hSpar->hMdDec->td_decorr_flag && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) )
+ {
+ float Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k];
+ float *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS];
+ float *p_tc[MAX_SPAR_INTERNAL_CHANNELS];
+ int16_t nchan_internal, ch;
+ int16_t nSamplesLeftForTD, default_frame;
+
+ /* TD decorrelator */
+ default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ nSamplesLeftForTD = nSamplesForRendering;
+ nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order,
+ st_ivas->hDecoderConfig->ivas_total_brate );
+
+ for ( ch = 0; ch < nchan_internal; ch++ )
+ {
+ pPcm_tmp[ch] = Pcm_tmp[ch];
+ p_tc[ch] = st_ivas->hTcBuffer->tc[ch];
+ }
+
+ while ( nSamplesLeftForTD )
+ {
+ int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame );
+
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ if ( hSpar->hTdDecorr )
+ {
+#endif
+ ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr );
+ if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) )
+ {
+ for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr );
+ }
+ }
+ else
+ {
+ for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ )
+ {
+ set_zero( p_tc[nchan_internal - 1 - ch], nSamplesToDecorr );
+ }
+ for ( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr );
+ }
+ }
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ }
+#endif
+ for ( ch = 0; ch < nchan_internal; ch++ )
+ {
+ p_tc[ch] += nSamplesToDecorr;
+ }
+
+ nSamplesLeftForTD -= nSamplesToDecorr;
}
}
+ ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots );
+
return;
}
@@ -895,41 +1315,192 @@ static void ivas_spar_get_skip_mat(
/*-------------------------------------------------------------------*
* ivas_spar_dec_upmixer()
*
+ *
+ *-------------------------------------------------------------------*/
+
+void ivas_spar_dec_upmixer(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float output[][L_FRAME48k], /* i/o: input/output audio channels */
+ const int16_t nchan_internal, /* i : number of internal channels */
+ const int16_t output_frame /* i : output frame length */
+)
+{
+ SPAR_DEC_HANDLE hSpar;
+ int16_t nchan_transport, nchan_out;
+ int16_t subframe_idx, n, i;
+ int16_t n_samples_sf;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+ float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k];
+ float *pPcm_tmp[MAX_OUTPUT_CHANNELS];
+
+ hSpar = st_ivas->hSpar;
+ nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport;
+ nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe;
+ n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+
+ for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ )
+ {
+ output_f_local[n] = &output[n][0];
+ }
+
+ for ( n = 0; n < nchan_internal; n++ )
+ {
+ st_ivas->hTcBuffer->tc[n] = output[n];
+ }
+
+ /*---------------------------------------------------------------------*
+ * TD decorrelation
+ *---------------------------------------------------------------------*/
+
+ for ( i = 0; i < nchan_internal; i++ )
+ {
+ pPcm_tmp[i] = Pcm_tmp[i];
+ }
+
+ if ( hSpar->hMdDec->td_decorr_flag )
+ {
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ if ( hSpar->hTdDecorr )
+ {
+#endif
+ ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame );
+ if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) )
+ {
+ for ( i = 0; i < nchan_internal - nchan_transport; i++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame );
+ }
+ }
+ else
+ {
+ for ( i = 0; i < nchan_internal - nchan_transport; i++ )
+ {
+ set_zero( st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame );
+ }
+ for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame );
+ }
+ }
+#ifdef FIX_163_SBA_TD_DECORR_OPT
+ }
+#endif
+ }
+
+ ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS );
+
+ if ( st_ivas->hDirAC != 0 )
+ {
+ ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS );
+ }
+
+ for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ )
+ {
+ ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal );
+ for ( n = 0; n < nchan_out; n++ )
+ {
+ output_f_local[n] += n_samples_sf;
+ }
+ }
+
+ for ( n = 0; n < nchan_internal; n++ )
+ {
+ st_ivas->hTcBuffer->tc[n] = NULL;
+ }
+
+ if ( st_ivas->hDirAC != 0 )
+ {
+ if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 )
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ else
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+ }
+
+ return;
+}
+#endif
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------*
+ * ivas_spar_dec_upmixer_sf()
+ *
* IVAS SPAR upmixer
*-------------------------------------------------------------------*/
+void ivas_spar_dec_upmixer_sf(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ float *output[], /* o : output audio channels */
+ const int16_t nchan_internal /* i : number of internal channels */
+)
+#else
void ivas_spar_dec_upmixer(
+
Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
float output[][L_FRAME48k], /* i/o: input/output audio channels */
const int16_t nchan_internal, /* i : number of internal channels */
const int16_t output_frame /* i : output frame length */
)
+#endif
{
int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out;
float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX];
float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX];
int16_t i, b, ts, out_ch, in_ch;
int16_t num_spar_bands, spar_band, nchan_transport;
- int16_t num_in_ingest, num_bands_out, split_band;
+ int16_t num_in_ingest, split_band;
+#ifdef JBM_TSM_ON_TCS
+ int16_t slot_size, slot_idx_start;
+ float *p_tc[MAX_OUTPUT_CHANNELS];
+ int16_t md_idx;
+#endif
float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k];
int16_t numch_out_dirac;
+#ifndef JBM_TSM_ON_TCS
float *pPcm_tmp[MAX_OUTPUT_CHANNELS];
+ int16_t num_bands_out;
+#endif
float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
DECODER_CONFIG_HANDLE hDecoderConfig;
SPAR_DEC_HANDLE hSpar;
+ int16_t num_md_sub_frames;
+#ifndef JBM_TSM_ON_TCS
+ int16_t md_sf_idx;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ push_wmops( "ivas_spar_dec_upmixer_sf" );
+#else
push_wmops( "ivas_spar_dec_upmixer" );
+#endif
hSpar = st_ivas->hSpar;
hDecoderConfig = st_ivas->hDecoderConfig;
+#ifndef JBM_TSM_ON_TCS
num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands;
+#endif
nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport;
num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands;
numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans;
numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans;
+ num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate );
+
+#ifdef JBM_TSM_ON_TCS
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+ slot_idx_start = hSpar->slots_rendered;
+ for ( i = 0; i < nchan_internal; i++ )
+ {
+ p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size;
+ }
+#endif
+
#ifdef DEBUG_SPAR_BYPASS_EVS_CODEC
/* by-pass core-coder */
/*write the core coder output to a file for debugging*/
@@ -967,17 +1538,19 @@ void ivas_spar_dec_upmixer(
}
#endif
+#ifndef JBM_TSM_ON_TCS
/*---------------------------------------------------------------------*
* AGC
*---------------------------------------------------------------------*/
ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame );
+
#ifdef DEBUG_SBA_AUDIO_DUMP
/* Dump audio signal after ivas_agc_dec_process */
ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" );
#endif
-
+#endif
/*---------------------------------------------------------------------*
* TD Decorr and pcm ingest
*---------------------------------------------------------------------*/
@@ -991,11 +1564,12 @@ void ivas_spar_dec_upmixer(
num_in_ingest = nchan_transport;
}
+#ifndef JBM_TSM_ON_TCS
for ( i = 0; i < nchan_internal; i++ )
{
pPcm_tmp[i] = Pcm_tmp[i];
}
-
+#endif
/*---------------------------------------------------------------------*
* PCA decoder
*---------------------------------------------------------------------*/
@@ -1003,6 +1577,7 @@ void ivas_spar_dec_upmixer(
hSpar->pca_ingest_channels = num_in_ingest;
#endif
+#ifndef JBM_TSM_ON_TCS /* will already happen in the TC decoding */
if ( hSpar->hPCA != NULL )
{
ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output );
@@ -1011,22 +1586,37 @@ void ivas_spar_dec_upmixer(
ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" );
#endif
}
+#endif
-
+#ifndef JBM_TSM_ON_TCS
/*---------------------------------------------------------------------*
* TD decorrelation
*---------------------------------------------------------------------*/
if ( hSpar->hMdDec->td_decorr_flag )
{
- ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame );
- for ( i = 0; i < nchan_internal - nchan_transport; i++ )
+ ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame );
+ if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) )
{
- mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame );
+ for ( i = 0; i < nchan_internal - nchan_transport; i++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame );
+ }
+ }
+ else
+ {
+ for ( i = 0; i < nchan_internal - nchan_transport; i++ )
+ {
+ set_zero( output[nchan_internal - 1 - i], output_frame );
+ }
+ for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ )
+ {
+ mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame );
+ }
}
}
-
+#endif
hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest;
@@ -1059,12 +1649,14 @@ void ivas_spar_dec_upmixer(
}
}
+#ifndef JBM_TSM_ON_TCS
/*---------------------------------------------------------------------*
* Gen umx mat
*---------------------------------------------------------------------*/
- ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi );
-
+ ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi,
+ num_md_sub_frames );
+#endif
/*---------------------------------------------------------------------*
* CLDFB Processing and Synthesis
@@ -1074,19 +1666,39 @@ void ivas_spar_dec_upmixer(
/* apply parameters */
/* determine if we can skip certain data */
- ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat ); /* this can be precomputed based on bitrate and format*/
+ ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat,
+ num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/
numch_out_dirac = hDecoderConfig->nchan_out;
+#ifdef DEBUG_SBA_AUDIO_DUMP
+ /* Dump audio signal after ivas_agc_dec_process */
+#ifdef JBM_TSM_ON_TCS
+ ivas_spar_dump_signal_wav( output_frame, p_tc, NULL, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" );
+#else
+ ivas_spar_dump_signal_wav( output_frame, NULL, output, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" );
+#endif
+#endif
+
+#ifndef JBM_TSM_ON_TCS
for ( int16_t i_sf = 0; i_sf < MAX_PARAM_SPATIAL_SUBFRAMES; i_sf++ )
{
+#endif
/* CLDFB analysis of incoming frame */
for ( in_ch = 0; in_ch < numch_in; in_ch++ )
{
- for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
+#else
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#endif
{
cldfbAnalysis_ts(
- &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#ifdef JBM_TSM_ON_TCS
+ &p_tc[in_ch][ts * num_cldfb_bands],
+#else
+ &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#endif
cldfb_in_ts_re[in_ch][ts],
cldfb_in_ts_im[in_ch][ts],
num_cldfb_bands,
@@ -1094,10 +1706,38 @@ void ivas_spar_dec_upmixer(
}
}
- for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+ if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) )
{
- /* determine SPAR parameters for this time slots */
- ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat );
+ ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf );
+ }
+
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
+#else
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#endif
+ {
+#ifdef JBM_TSM_ON_TCS
+ md_idx = hSpar->render_to_md_map[ts + slot_idx_start];
+ ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat );
+#else
+ /* determine SPAR parameters for this time slots */
+ ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat );
+#endif
+ if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) )
+ {
+ for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ )
+ {
+ for ( out_ch = 0; out_ch < numch_out; out_ch++ )
+ {
+ for ( in_ch = 0; in_ch < numch_in; in_ch++ )
+ {
+ mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band];
+ hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band];
+ }
+ }
+ }
+ }
for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ )
{
@@ -1113,27 +1753,26 @@ void ivas_spar_dec_upmixer(
for ( in_ch = 0; in_ch < numch_in; in_ch++ )
{
- if ( b_skip_mat[out_ch][in_ch] )
- {
- continue;
- }
- else if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */
- {
- spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band];
- cldfb_par = mixer_mat[out_ch][in_ch][spar_band];
- }
- else
+ if ( b_skip_mat[out_ch][in_ch] == 0 )
{
- cldfb_par = 0.0f;
- for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ )
+ if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */
{
- /* accumulate contributions from all SPAR bands */
- cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band];
+ spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band];
+ cldfb_par = mixer_mat[out_ch][in_ch][spar_band];
+ }
+ else
+ {
+ cldfb_par = 0.0f;
+ for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ )
+ {
+ /* accumulate contributions from all SPAR bands */
+ cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band];
+ }
}
- }
- out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par;
- out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par;
+ out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par;
+ out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par;
+ }
}
}
@@ -1144,11 +1783,45 @@ void ivas_spar_dec_upmixer(
cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch];
}
}
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) )
+ {
+ /* we have crossed an unadapted parameter sf border, update previous mixing matrices */
+ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME;
+ split_band = SPAR_DIRAC_SPLIT_START_BAND;
+ md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0;
+ if ( split_band < IVAS_MAX_NUM_BANDS )
+ {
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+
+ for ( out_ch = 0; out_ch < numch_out; out_ch++ )
+ {
+ for ( in_ch = 0; in_ch < numch_in; in_ch++ )
+ {
+ for ( b = 0; b < num_spar_bands; b++ )
+ {
+ hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS];
+ }
+ }
+ }
+ hSpar->i_subframe++;
+ hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES );
+ }
+ }
+#endif
}
if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO )
{
- ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf );
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im );
+#else
+ ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf );
+#endif
}
if ( st_ivas->hDirAC != NULL )
@@ -1162,8 +1835,11 @@ void ivas_spar_dec_upmixer(
{
if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) )
{
- set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands );
-
+#ifdef JBM_TSM_ON_TCS
+ set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands );
+#else
+ set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands );
+#endif
if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) )
{
idx_lfe++;
@@ -1173,12 +1849,20 @@ void ivas_spar_dec_upmixer(
{
if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) )
{
- for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
+#else
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#endif
{
cldfbSynthesis(
&cldfb_in_ts_re[idx_in][ts],
&cldfb_in_ts_im[idx_in][ts],
- &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#ifdef JBM_TSM_ON_TCS
+ &output[ch][ts * num_cldfb_bands],
+#else
+ &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#endif
num_cldfb_bands,
st_ivas->cldfbSynDec[idx_in] );
}
@@ -1195,12 +1879,20 @@ void ivas_spar_dec_upmixer(
/* CLDFB to time synthesis (overwrite mixer output) */
for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ )
{
- for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
+#else
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+#endif
{
cldfbSynthesis(
&cldfb_in_ts_re[out_ch][ts],
&cldfb_in_ts_im[out_ch][ts],
- &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#ifdef JBM_TSM_ON_TCS
+ &output[out_ch][ts * num_cldfb_bands],
+#else
+ &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands],
+#endif
num_cldfb_bands,
st_ivas->cldfbSynDec[out_ch] );
}
@@ -1214,6 +1906,9 @@ void ivas_spar_dec_upmixer(
ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" );
#endif
+
+#ifndef JBM_TSM_ON_TCS
+ md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0;
split_band = SPAR_DIRAC_SPLIT_START_BAND;
if ( split_band < IVAS_MAX_NUM_BANDS )
{
@@ -1230,12 +1925,20 @@ void ivas_spar_dec_upmixer(
{
for ( b = 0; b < num_spar_bands; b++ )
{
- hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS];
+ hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS];
}
}
}
}
+#endif
+#ifndef JBM_TSM_ON_TCS
}
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered];
+ hSpar->subframes_rendered++;
+#endif
pop_wmops();
diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c
old mode 100644
new mode 100755
index 3b47d6500e1ab98d6a3bcdca8da23c7fcccbfb47..03f014ecfdc005f2b708eb474f5a2748e3c932a5
--- a/lib_dec/ivas_spar_md_dec.c
+++ b/lib_dec/ivas_spar_md_dec.c
@@ -43,7 +43,6 @@
#include "wmc_auto.h"
#include "ivas_stat_dec.h"
-/*#define ENABLE_DITHER */ /* IVAS_fmToDo: development switch */
/*------------------------------------------------------------------------------------------*
* Local constants
@@ -63,9 +62,9 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0
* Static functions declaration
*------------------------------------------------------------------------------------------*/
-static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t sba_order );
+static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr );
-static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP );
+static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate );
static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, const int16_t planarCP );
@@ -75,18 +74,20 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const
static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch );
-static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi );
+static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames );
-static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t sba_order );
+static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames );
static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC );
static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band );
static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 );
-
+#ifdef FIX_501_TABLE_IDX_INIT
+static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode, const int32_t last_active_brate );
+#else
static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode );
-
+#endif
/*-------------------------------------------------------------------------
* ivas_spar_md_dec_matrix_open()
@@ -97,11 +98,12 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder
static ivas_error ivas_spar_md_dec_matrix_open(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t num_channels /* i : number of internal channels */
-)
+ ,
+ const int16_t num_md_sub_frames )
{
int16_t i, j;
- if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
+ if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" );
}
@@ -117,7 +119,7 @@ static ivas_error ivas_spar_md_dec_matrix_open(
}
for ( j = 0; j < num_channels; j++ )
{
- if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
+ if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
}
@@ -136,7 +138,7 @@ static ivas_error ivas_spar_md_dec_matrix_open(
}
for ( j = 0; j < num_channels; j++ )
{
- if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
+ if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
}
@@ -155,7 +157,7 @@ static ivas_error ivas_spar_md_dec_matrix_open(
}
for ( j = 0; j < num_channels; j++ )
{
- if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
+ if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" );
}
@@ -241,6 +243,21 @@ static ivas_error ivas_spar_md_dec_matrix_open(
return IVAS_ERR_OK;
}
+int16_t ivas_get_spar_dec_md_num_subframes(
+ const int16_t sba_order, /* i : Ambisonic (SBA) order */
+ const int32_t ivas_total_brate )
+{
+ int16_t num_subframes;
+ num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
+ if ( sba_order > SBA_FOA_ORDER )
+ {
+ if ( ivas_total_brate >= IVAS_512k )
+ {
+ num_subframes = 1;
+ }
+ }
+ return ( num_subframes );
+}
/*-------------------------------------------------------------------------
* ivas_spar_md_dec_open()
@@ -258,6 +275,7 @@ ivas_error ivas_spar_md_dec_open(
{
ivas_spar_md_dec_state_t *hMdDec;
ivas_error error;
+ int16_t num_md_sub_frames;
error = IVAS_ERR_OK;
@@ -266,16 +284,36 @@ ivas_error ivas_spar_md_dec_open(
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" );
}
- if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels ) ) != IVAS_ERR_OK )
+ num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate );
+ if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels,
+ num_md_sub_frames ) ) != IVAS_ERR_OK )
{
return error;
}
+#ifdef FIX_501_TABLE_IDX_INIT
+ if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 )
+ {
+ if ( sid_format == SID_SBA_2TC )
+ {
+ hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL );
+ }
+ else
+ {
+ hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL );
+ }
+ }
+ else
+ {
+ hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
+ }
+#else
hMdDec->table_idx = 0; /* just to initialize state variables*/
if ( ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) && ( sid_format == SID_SBA_2TC ) )
{
hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL );
}
+#endif
if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK )
{
return error;
@@ -443,10 +481,18 @@ ivas_error ivas_spar_md_dec_init(
int16_t nchan_transport;
float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2];
- hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate );
- hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
+ ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag );
+
+ ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind );
- ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands );
+ hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
+ ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ hMdDec->spar_hoa_dirac2spar_md_flag,
+ 0, 0, 0
+#endif
+ );
nchan_transport = hMdDec->spar_md_cfg.nchan_transport;
@@ -536,6 +582,19 @@ ivas_error ivas_spar_md_dec_init(
set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS );
set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, IVAS_MAX_NUM_BANDS );
+ set_zero( hMdDec->smooth_fac, IVAS_MAX_NUM_BANDS );
+ for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
+ {
+ set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
+ }
+ for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
+ {
+ for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ )
+ {
+ set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS );
+ }
+ }
+
return IVAS_ERR_OK;
}
@@ -558,17 +617,18 @@ static ivas_error ivas_spar_set_dec_config(
hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs;
}
- nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order );
+ nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order,
+ ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate );
switch ( nchan )
{
case 4: /* FOA_CHANNELS */
hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH;
break;
- case 9: /* IVAS_HOA_2_CH */ // VE: is this relevant?
+ case 9: /* IVAS_HOA_2_CH */
hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH;
break;
- case 16: /* IVAS_HOA_3_CH */ // VE: is this relevant?
+ case 16: /* IVAS_HOA_3_CH */ // ToDo: is this relevant?
hMdDec->num_decorr = IVAS_TD_DECORR_OUT_12CH;
break;
case 6: /* IVAS_HOA_2_CH */
@@ -618,18 +678,35 @@ void ivas_spar_md_dec_process(
{
int16_t j, k, b, bw, dtx_vad, nB, i_ts;
ivas_spar_md_dec_state_t *hMdDec;
+ int16_t num_md_chs;
+ int16_t num_md_sub_frames;
hMdDec = st_ivas->hSpar->hMdDec;
+ int16_t active_w_vlbr;
+ active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
+
+ num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate );
+ num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate );
+
+
ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate,
- ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode );
+ ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode
+#ifdef FIX_501_TABLE_IDX_INIT
+ ,
+ st_ivas->last_active_ivas_total_brate
+#endif
+ );
#if 0
{
char f_name[100];
int16_t num_bands = nB;
int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float );
- int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order );
+ int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order
+ ,
+ st_ivas->hDecoderConfig->ivas_total_brate
+ );
for ( b = 0; b < num_bands; b++ )
{
sprintf( f_name, "spar_band_pred_coeffs_dec.bin" );
@@ -671,9 +748,101 @@ void ivas_spar_md_dec_process(
}
}
#endif
+#ifdef DEBUG_LBR_SBA
+ /* Dumping SPAR HOA Coefficients */
+ /*char f_name[100];
+ int16_t nbands = 12;
+ int16_t num_subframes = 1;
+ int16_t num_elements = 7;
+ int16_t num_block_group = 1;
+ int16_t byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_PR.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[3], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[4], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[5], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[6], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+ nbands = 12; // 6 total, just looking at SPAR
+ num_subframes = 1;
+ num_elements = 12;
+ num_block_group = 1;
+ byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_C.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ for ( int16_t p = 0; p < 4; p++ )
+ {
+ for ( int16_t r = 0; r < 3; r++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].C_re[p][r], byte_size, 1, 1, f_name );
+ }
+ }
+ }
+ }
+ }
+ nbands = 12; // 6 total, just looking at SPAR
+ num_subframes = 1;
+ num_elements = 4;
+ num_block_group = 1;
+ byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_P.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[3], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }*/
+#endif
/* SPAR to DirAC conversion */
- ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out );
+ if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 )
+ {
+ ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw );
+ }
/* set correct number of bands*/
nB = IVAS_MAX_NUM_BANDS;
@@ -681,9 +850,131 @@ void ivas_spar_md_dec_process(
{
nB = nB >> 1;
}
+#ifdef DEBUG_LBR_SBA
+ /* Dumping SPAR Coefficients */
+ char f_name[100];
+ int16_t nbands = 4; // 6 total, just looking at SPAR
+ int16_t num_subframes = 1;
+ int16_t num_elements = 6;
+ int16_t num_block_group = 1;
+ int16_t byte_size = sizeof( float );
+ sprintf( f_name, "SBA_MD_values_dec.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+#endif
+#ifdef DEBUG_LBR_SBA
+ /* Dumping SPAR HOA Coefficients */
+ /*char f_name[100];
+ int16_t nbands = 12;
+ int16_t num_subframes = 1;
+ int16_t num_elements = 7;
+ int16_t num_block_group = 1;
+ int16_t byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_PR.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[3], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[4], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[5], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[6], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+ nbands = 12; // 6 total, just looking at SPAR
+ num_subframes = 1;
+ num_elements = 12;
+ num_block_group = 1;
+ byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_C.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ for ( int16_t p = 0; p < 4; p++ )
+ {
+ for ( int16_t r = 0; r < 3; r++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].C_re[p][r], byte_size, 1, 1, f_name );
+ }
+ }
+ }
+ }
+ }
+ nbands = 12; // 6 total, just looking at SPAR
+ num_subframes = 1;
+ num_elements = 4;
+ num_block_group = 1;
+ byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_dec_P.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[3], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }*/
+#endif
/* expand DirAC MD to all time slots */
- for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
+ for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
{
for ( b = 0; b < hMdDec->spar_md.num_bands; b++ )
{
@@ -707,7 +998,11 @@ void ivas_spar_md_dec_process(
}
}
- ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order );
+ ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB,
+ num_md_chs,
+ active_w_vlbr
+
+ );
#ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS
{
@@ -720,13 +1015,18 @@ void ivas_spar_md_dec_process(
fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] );
}
#endif
-
+ if ( bw == IVAS_RED_BAND_FACT )
+ {
+ nB = nB << 1;
+ }
for ( b = nB; b < num_bands_out; b++ )
{
hMdDec->valid_bands[b] = 1;
}
- ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, sba_order );
+ ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out,
+ num_md_chs,
+ num_md_sub_frames );
hMdDec->dtx_md_smoothing_cntr = 1;
@@ -746,6 +1046,8 @@ void ivas_spar_md_dec_process(
void ivas_spar_smooth_md_dtx(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t num_md_sub_frames /* i : number of metadata subframes */
)
{
int16_t j, k, b, dmx_ch;
@@ -781,7 +1083,7 @@ void ivas_spar_smooth_md_dtx(
}
/* expand MD to all time slots */
- for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
+ for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
{
for ( b = 0; b < num_bands_out; b++ )
{
@@ -821,6 +1123,8 @@ void ivas_spar_smooth_md_dtx(
void ivas_spar_setup_md_smoothing(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t num_md_sub_frames /* i : number of metadata subframes */
)
{
/* copy the coeffs */
@@ -872,7 +1176,8 @@ void ivas_spar_setup_md_smoothing(
}
}
- ivas_spar_smooth_md_dtx( hMdDec, num_bands_out );
+ ivas_spar_smooth_md_dtx( hMdDec, num_bands_out,
+ num_md_sub_frames );
return;
}
@@ -952,14 +1257,14 @@ static void ivas_get_spar_matrices(
const int16_t bw,
const int16_t dtx_vad,
const int16_t nB,
- const int16_t sba_order )
+ const int16_t numch_out,
+ const int16_t active_w_vlbr )
{
- int16_t numch_out, num_bands, dmx_ch, split_band;
+ int16_t num_bands, dmx_ch, split_band;
int16_t i, j, k, m, b, i_ts, active_w;
const int16_t *order;
float active_w_dm_fac, re;
- numch_out = ivas_sba_get_nchan_metadata( sba_order );
num_bands = num_bands_out;
order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order];
@@ -994,10 +1299,12 @@ static void ivas_get_spar_matrices(
}
}*/
#endif
-
+ if ( bw == IVAS_RED_BAND_FACT )
+ {
+ num_bands = num_bands >> 1;
+ }
active_w = hMdDec->spar_md_cfg.active_w;
- active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : IVAS_ACTIVEW_DM_F_SCALE;
-
+ active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : ( ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE );
for ( i_ts = 0; i_ts < n_ts; i_ts++ )
{
for ( i = 0; i < numch_out; i++ )
@@ -1008,12 +1315,6 @@ static void ivas_get_spar_matrices(
set_zero( &hMdDec->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS );
}
}
-
- if ( bw == IVAS_RED_BAND_FACT )
- {
- num_bands = num_bands >> 1;
- }
-
num_bands = min( num_bands, nB );
for ( b = 0; b < num_bands; b++ )
@@ -1342,13 +1643,14 @@ void ivas_spar_dec_gen_umx_mat(
const int16_t nchan_transport, /* i : number of transport channels */
const int16_t num_bands_out, /* i : number of output bands */
const int16_t bfi /* i : bad frame indicator */
-)
+ ,
+ const int16_t num_md_sub_frames )
{
int16_t i, j, b, i_ts, num_out_ch;
num_out_ch = hMdDec->spar_md_cfg.num_umx_chs;
- for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
+ for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
{
if ( hMdDec->td_decorr_flag == 1 )
{
@@ -1409,7 +1711,8 @@ void ivas_spar_dec_gen_umx_mat(
#endif
}
- ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi );
+ ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi,
+ num_md_sub_frames );
return;
}
@@ -1429,7 +1732,12 @@ static void ivas_spar_dec_parse_md_bs(
int16_t *dtx_vad,
const int32_t ivas_total_brate,
const int16_t use_planar_coeff,
- const int16_t sba_inactive_mode )
+ const int16_t sba_inactive_mode
+#ifdef FIX_501_TABLE_IDX_INIT
+ ,
+ const int32_t last_active_brate
+#endif
+)
{
int16_t i, j, k, num_bands;
int16_t ii, jj, ndec, ndm, b, idx;
@@ -1439,6 +1747,10 @@ static void ivas_spar_dec_parse_md_bs(
int16_t do_diff[IVAS_MAX_NUM_BANDS];
int16_t planarCP;
float quant[IVAS_SPAR_MAX_C_COEFF];
+ int16_t do_repeat[IVAS_MAX_NUM_BANDS];
+#ifdef FIX_501_TABLE_IDX_INIT
+ int16_t bw_final, bw_fact;
+#endif
*dtx_vad = 1;
*bands_bw = 1;
@@ -1511,13 +1823,33 @@ static void ivas_spar_dec_parse_md_bs(
ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band );
+
+#ifdef FIX_501_TABLE_IDX_INIT
+ if ( last_active_brate >= IVAS_24k4 )
+ {
+ bw_final = 1;
+ }
+ else
+ {
+ bw_final = 2;
+ }
+ bw_fact = *bands_bw / bw_final;
+#endif
for ( i = *nB - 1; i >= 0; i-- )
{
+#ifdef FIX_501_TABLE_IDX_INIT
+ ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bw_fact * i];
+
+ for ( b = bw_fact - 1; b >= 0; b-- )
+ {
+ idx = i * bw_fact + b;
+#else
ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i];
for ( b = *bands_bw - 1; b >= 0; b-- )
{
idx = i * *bands_bw + b;
+#endif
for ( j = 0; j < FOA_CHANNELS - 1; j++ )
{
hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j];
@@ -1530,8 +1862,13 @@ static void ivas_spar_dec_parse_md_bs(
}
}
+#ifdef FIX_501_TABLE_IDX_INIT
+ *bands_bw = bw_final;
+ *nB = num_bands / bw_final;
+#else
*nB = num_bands;
*bands_bw = 1;
+#endif
return;
}
@@ -1561,6 +1898,7 @@ static void ivas_spar_dec_parse_md_bs(
for ( i = 0; i < *nB; i++ )
{
do_diff[i] = 0;
+ do_repeat[i] = 0;
}
}
else if ( strat < 4 )
@@ -1570,9 +1908,21 @@ static void ivas_spar_dec_parse_md_bs(
for ( i = 0; i < *nB; i++ )
{
do_diff[i] = 0;
+ do_repeat[i] = 0;
}
no_ec = 1;
}
+ else if ( ivas_total_brate < IVAS_24k4 )
+ {
+ *bands_bw = 2;
+ *nB = num_bands / *bands_bw;
+
+ for ( i = 0; i < *nB; i++ )
+ {
+ do_diff[i] = 0;
+ do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) );
+ }
+ }
else
{
*bands_bw = 1;
@@ -1581,6 +1931,7 @@ static void ivas_spar_dec_parse_md_bs(
for ( i = 0; i < *nB; i++ )
{
do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 );
+ do_repeat[i] = 0;
}
ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB );
@@ -1592,7 +1943,8 @@ static void ivas_spar_dec_parse_md_bs(
if ( no_ec == 0 )
{
- ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP );
+ ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP,
+ strat, ivas_total_brate );
}
else
{
@@ -1643,9 +1995,12 @@ static void ivas_spar_dec_parse_md_bs(
{
hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j];
}
- hMdDec->valid_bands[i] |= ( do_diff[i] == 0 ) ? 1 : 0;
+ hMdDec->valid_bands[*bands_bw * i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0;
+ for ( j = 1; j < *bands_bw; j++ )
+ {
+ hMdDec->valid_bands[*bands_bw * i + j] = hMdDec->valid_bands[*bands_bw * i];
+ }
}
-
#ifdef SPAR_HOA_DBG
int16_t b;
b = 0;
@@ -1736,9 +2091,12 @@ static void ivas_decode_arith_bs(
const int16_t bands_bw,
int16_t *pDo_diff,
const int16_t freq_diff,
- const int16_t planarCP )
+ const int16_t planarCP,
+ const int16_t strat,
+ const int32_t ivas_total_brate )
{
- int16_t i, j, ndm, ndec;
+ int16_t i, ndm, ndec;
+ int16_t j;
ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
@@ -1751,22 +2109,35 @@ static void ivas_decode_arith_bs(
{
ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i];
-
- pred_cell_dims[i].dim1 = ndm + ndec - 1;
- if ( hMdDec->spar_hoa_md_flag )
+ if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) )
{
- if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
+ pred_cell_dims[i].dim1 = 0;
+ pred_cell_dims[i].dim2 = 0;
+ drct_cell_dims[i].dim1 = 0;
+ drct_cell_dims[i].dim2 = 0;
+ decd_cell_dims[i].dim1 = 0;
+ decd_cell_dims[i].dim2 = 0;
+ decx_cell_dims[i].dim1 = 0;
+ decx_cell_dims[i].dim2 = 0;
+ }
+ else
+ {
+ pred_cell_dims[i].dim1 = ndm + ndec - 1;
+ if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
{
- pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
+ if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
+ {
+ pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
+ }
}
+ pred_cell_dims[i].dim2 = 1;
+ drct_cell_dims[i].dim1 = ndec;
+ drct_cell_dims[i].dim2 = ndm - 1;
+ decd_cell_dims[i].dim1 = ndec;
+ decd_cell_dims[i].dim2 = 1;
+ decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
+ decx_cell_dims[i].dim2 = 1;
}
- pred_cell_dims[i].dim2 = 1;
- drct_cell_dims[i].dim1 = ndec;
- drct_cell_dims[i].dim2 = ndm - 1;
- decd_cell_dims[i].dim1 = ndec;
- decd_cell_dims[i].dim2 = 1;
- decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
- decx_cell_dims[i].dim2 = 1;
}
any_diff = 0;
@@ -1781,7 +2152,7 @@ static void ivas_decode_arith_bs(
if ( any_diff == 1 )
{
- if ( hMdDec->spar_hoa_md_flag )
+ if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
{
for ( i = 0; i < nB; i++ )
{
@@ -1803,7 +2174,7 @@ static void ivas_decode_arith_bs(
ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP );
- if ( hMdDec->spar_hoa_md_flag )
+ if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
{
for ( i = 0; i < nB; i++ )
{
@@ -1875,7 +2246,6 @@ static void ivas_decode_arith_bs(
ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_r.q_levels, 1, nB, DECD_COEFF );
ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_c.q_levels, 0, nB, DECX_COEFF );
}
-
return;
}
@@ -2069,7 +2439,7 @@ static void ivas_decode_huffman_bs(
drct_dim = ndec * ( ndm - 1 );
decd_dim = ndec;
pred_offset = 0;
- if ( hMdDec->spar_hoa_md_flag )
+ if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
{
if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
{
@@ -2079,10 +2449,11 @@ static void ivas_decode_huffman_bs(
for ( j = pred_offset; j < pred_dim; j++ )
{
- ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] );
+ ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0,
+ &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] );
}
- if ( hMdDec->spar_hoa_md_flag )
+ if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag )
{
if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
{
@@ -2135,16 +2506,13 @@ static void ivas_spar_md_fill_invalid_bands(
const int16_t *valid_bands,
int16_t *base_band_age,
const int16_t num_bands,
- const int16_t sba_order /* i : SBA order */
-)
+ const int16_t num_channels,
+ const int16_t num_md_sub_frames )
{
int16_t i, j, b, all_valid;
int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1;
int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS];
float w = 0;
- int16_t num_channels;
-
- num_channels = ivas_sba_get_nchan_metadata( sba_order );
set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS );
set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS );
@@ -2231,7 +2599,7 @@ static void ivas_spar_md_fill_invalid_bands(
{
for ( j = 0; j < num_channels; j++ )
{
- for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
+ for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ )
{
pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b];
pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b];
@@ -2255,7 +2623,8 @@ static void ivas_spar_md_fill_invalid_bands(
static void ivas_spar_dec_compute_ramp_down_post_matrix(
ivas_spar_md_dec_state_t *hMdDec,
const int16_t num_bands_out,
- const int16_t bfi )
+ const int16_t bfi,
+ const int16_t num_md_sub_frames )
{
int16_t num_in_ch, num_out_ch, i, j, b;
@@ -2294,7 +2663,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix(
}
/* apply the post matrix */
- for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ )
+ for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ )
{
for ( i = 0; i < num_out_ch; i++ )
{
@@ -2531,6 +2900,8 @@ void ivas_spar_to_dirac(
ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */
const int16_t dtx_vad, /* i : DTX frame flag */
const int16_t num_bands_out /* i : number of output bands */
+ ,
+ const int16_t bw /* i : band joining factor */
)
{
DIRAC_DEC_HANDLE hDirAC;
@@ -2556,16 +2927,18 @@ void ivas_spar_to_dirac(
int16_t pred_idx;
int16_t *dirac_to_spar_md_bands;
int16_t enc_param_start_band;
+ int16_t active_w_vlbr;
sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
start_band = 0;
- end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND );
+ end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw;
hDirAC = st_ivas->hDirAC;
dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands;
- enc_param_start_band = st_ivas->hSpar->enc_param_start_band;
+ enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw;
+ active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
- if ( hDirAC != NULL )
+ if ( hDirAC != NULL && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 )
{
band_grouping = hDirAC->band_grouping;
#ifdef ENABLE_DITHER
@@ -2612,7 +2985,7 @@ void ivas_spar_to_dirac(
}
else
{
- f_scale = IVAS_ACTIVEW_DM_F_SCALE;
+ f_scale = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE;
}
}
else
@@ -2661,7 +3034,11 @@ void ivas_spar_to_dirac(
qmf_band_start = band_grouping[band];
qmf_band_end = band_grouping[band + 1];
+#ifdef JBM_TSM_ON_TCS
+ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+#else
for ( block = 0; block < hDirAC->nb_subframes; block++ )
+#endif
{
int16_t ts_start, ts_end, ts;
@@ -2683,6 +3060,7 @@ void ivas_spar_to_dirac(
hDirAC->energy_ratio1[block][b] = en_ratio;
tmp_write_idx_band = tmp_write_idx_param_band;
+
if ( hDirAC->hConfig->dec_param_estim == FALSE )
{
hDirAC->elevation[tmp_write_idx_band][b] = ele_dith;
@@ -2720,13 +3098,20 @@ void ivas_spar_to_dirac(
}
/*read DirAC metadata, convert DirAC to SPAR*/
- for ( ; band < num_bands_out; band++ )
+ for ( ; band < num_bands_out / bw; band++ )
{
int16_t dirac_band_idx;
dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band;
- for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+ int16_t num_subframes;
+ num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
+ if ( st_ivas->hQMetaData->useLowerRes )
+ {
+ num_subframes = 1;
+ }
+
+ for ( block = 0; block < num_subframes; block++ )
{
if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] < 0.f )
{
@@ -2742,7 +3127,8 @@ void ivas_spar_to_dirac(
/* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */
if ( hMdDec->spar_md_cfg.nchan_transport > 1 )
{
- ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL );
+ ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL,
+ st_ivas->hQMetaData->useLowerRes, active_w_vlbr );
/* temporarily copy frame-wise prediction coefficients in DirAC bands*/
for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ )
@@ -2753,9 +3139,32 @@ void ivas_spar_to_dirac(
}
}
}
+ int16_t num_subframes;
+ num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES;
+ if ( st_ivas->hQMetaData->useLowerRes )
+ {
+ num_subframes = 1;
+ }
+ ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, num_subframes, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg,
+ end_band, num_bands_out / bw, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr );
- ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, MAX_PARAM_SPATIAL_SUBFRAMES, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL );
-
+ if ( st_ivas->hQMetaData->useLowerRes && dtx_vad )
+ {
+ for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ )
+ {
+ for ( block = 1; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
+ {
+ for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */
+ {
+ hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[i] = hMdDec->spar_md.band_coeffs[band].pred_re[i];
+ }
+ for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */
+ {
+ hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re[i] = hMdDec->spar_md.band_coeffs[band].P_re[i];
+ }
+ }
+ }
+ }
/* expand DirAC TC 20ms MD for residual channels to all subframes*/
for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
{
@@ -2772,7 +3181,7 @@ void ivas_spar_to_dirac(
}
}
- for ( b = end_band; b < num_bands_out; b++ )
+ for ( b = end_band * bw; b < num_bands_out; b++ )
{
hMdDec->valid_bands[b] = 1;
}
diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h
index 0e2332ac1aedc5d044432a0d94516cd5968426d2..26b3cb56ebfda00db0c9f3da686b88d25c162482 100644
--- a/lib_dec/ivas_stat_dec.h
+++ b/lib_dec/ivas_stat_dec.h
@@ -391,6 +391,8 @@ typedef struct
int16_t dtx_flag;
int16_t sce_id_dtx;
+ int16_t ism_dtx_hangover_cnt; /* hangover counter for ISM DTX decoder */
+
} ISM_DTX_DATA_DEC;
/*----------------------------------------------------------------------------------*
@@ -433,6 +435,11 @@ typedef struct param_ism_rendering
float *proto_matrix;
float *interpolator;
float mixing_matrix_lin_old[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX];
+#ifdef JBM_TSM_ON_TCS
+ float mixing_matrix_lin[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX];
+ float *Cldfb_RealBuffer_tc;
+ float *Cldfb_ImagBuffer_tc;
+#endif
} PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE;
@@ -569,10 +576,13 @@ typedef struct dirac_output_synthesis_cov_state_structure
float *cy_old[CLDFB_NO_CHANNELS_MAX];
float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX];
float *mixing_matrix_res_old[CLDFB_NO_CHANNELS_MAX];
+#ifdef JBM_TSM_ON_TCS
+ float *mixing_matrix[CLDFB_NO_CHANNELS_MAX];
+ float *mixing_matrix_res[CLDFB_NO_CHANNELS_MAX];
+#endif
} DIRAC_OUTPUT_SYNTHESIS_COV_STATE;
-
/* MASA stereo transport signal type detection structure */
typedef struct
{
@@ -610,9 +620,15 @@ typedef struct
/* Diffuse sound directional distribution data structure */
typedef struct ivas_diffuse_distribution_data_structure
{
+#ifdef JBM_TSM_ON_TCS
+ float diffuseRatioX[CLDFB_NO_CHANNELS_MAX];
+ float diffuseRatioY[CLDFB_NO_CHANNELS_MAX];
+ float diffuseRatioZ[CLDFB_NO_CHANNELS_MAX];
+#else
float diffuseRatioX[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
float diffuseRatioY[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
float diffuseRatioZ[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX];
+#endif
} DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE;
@@ -624,7 +640,15 @@ typedef struct ivas_dirac_dec_data_structure
IVAS_OUTPUT_SETUP hOutSetup;
int16_t slot_size;
+#ifdef JBM_TSM_ON_TCS
+ int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS];
+ int16_t subframes_rendered;
+ int16_t slots_rendered;
+ int16_t num_slots;
+ int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME];
+#else
int16_t subframe_nbslots;
+#endif
int16_t nb_subframes;
int16_t num_freq_bands;
@@ -708,7 +732,10 @@ typedef struct ivas_dirac_dec_data_structure
float power_ratios[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE];
PARAM_ISM_RENDERING_HANDLE hParamIsmRendering;
IVAS_FB_MIXER_HANDLE hFbMdft;
+#ifndef SBA_MODE_CLEAN_UP
int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS];
+#endif
+ const int16_t *sba_map_tc;
} DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE;
@@ -732,7 +759,17 @@ typedef struct ivas_param_mc_dec_data_structure
{
int16_t slot_size;
+#ifdef JBM_TSM_ON_TCS
+ float *Cldfb_RealBuffer_tc;
+ float *Cldfb_ImagBuffer_tc;
+ int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS];
+ int16_t nb_subframes;
+ int16_t subframes_rendered;
+ int16_t slots_rendered;
+ int16_t num_slots;
+#else
int16_t subframe_nbslots;
+#endif
int16_t num_freq_bands;
int16_t num_param_bands_synth;
@@ -769,7 +806,25 @@ typedef struct ivas_param_mc_dec_data_structure
} PARAM_MC_DEC_DATA, *PARAM_MC_DEC_HANDLE;
+/*----------------------------------------------------------------------------------*
+ * MC Param-Upmix Mode structures
+ *----------------------------------------------------------------------------------*/
+/* ===== MC Param-Upmix Mode main structure ===== */
+typedef struct ivas_mc_paramupmix_dec_data_structure
+{
+ int16_t num_freq_bands;
+ ivas_td_decorr_state_t *hTdDecorr[MC_PARAMUPMIX_COMBINATIONS];
+ float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ float alpha_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ float beta_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ bool first_frame;
+ float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS];
+
+} MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE;
/*------------------------------------------------------------------------------------------*
* SPAR decoder structures
*------------------------------------------------------------------------------------------*/
@@ -797,7 +852,6 @@ typedef struct ivas_spar_md_dec_state_t
int16_t td_decorr_flag;
int16_t spar_plc_enable_fadeout_flag;
float ***mixer_mat;
- /*TODO : reuse hFbMixer->prior_mixer for this as that buffer is unused in decoder with FB_HARMONIZATION*/
float mixer_mat_prev[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS];
ivas_spar_md_com_cfg spar_md_cfg;
ivas_arith_coeffs_t arith_coeffs;
@@ -805,6 +859,11 @@ typedef struct ivas_spar_md_dec_state_t
int16_t table_idx;
int16_t dtx_vad;
int16_t spar_hoa_md_flag;
+ int16_t spar_hoa_dirac2spar_md_flag;
+ int16_t HOA_md_ind[IVAS_SPAR_MAX_CH];
+ float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1];
+ float smooth_fac[IVAS_MAX_NUM_BANDS];
+ float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
} ivas_spar_md_dec_state_t;
@@ -856,6 +915,14 @@ typedef struct ivas_spar_dec_lib_t
int16_t numOutChannels;
int16_t pca_ingest_channels;
#endif
+#ifdef JBM_TSM_ON_TCS
+ int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS];
+ int16_t render_to_md_map[MAX_JBM_CLDFB_TIMESLOTS];
+ int16_t nb_subframes;
+ int16_t subframes_rendered;
+ int16_t slots_rendered;
+ int16_t num_slots;
+#endif
} SPAR_DEC_DATA, *SPAR_DEC_HANDLE;
@@ -949,11 +1016,8 @@ typedef struct mct_dec_data_structure
MCT_DEC_BLOCK_DATA_HANDLE hBlockData[MCT_MAX_BLOCKS];
int16_t chBitRatios[MCT_MAX_CHANNELS];
- int16_t lowE_ch[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */
- int16_t LFE_off;
+ int16_t lowE_ch[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */
uint16_t mc_global_ild[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */
- int16_t num_lfe;
-
} MCT_DEC_DATA, *MCT_DEC_HANDLE;
@@ -969,9 +1033,9 @@ typedef struct ivas_lfe_dec_data_structure
int16_t lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS];
float lfe_block_delay_s;
int16_t lfe_prior_buf_len;
- float *prior_out_buffer;
+ float prior_out_buffer[L_FRAME48k];
- float *prevsynth_buf;
+ float prevsynth_buf[LFE_PLC_BUFLEN];
float *lfe_delay_buf;
int16_t lfe_addl_delay;
int16_t bfi_count;
@@ -1028,7 +1092,12 @@ typedef struct vbap_data_structure
typedef struct renderer_struct
{
float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS];
+#ifdef JBM_TSM_ON_TCS
+ float *interpolator;
+ float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS];
+#else
float interpolator[L_FRAME48k];
+#endif
} ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE;
@@ -1095,7 +1164,6 @@ typedef struct ivas_mcmasa_lfe_synth_struct
} MCMASA_LFE_SYNTH_DATA, *MCMASA_LFE_SYNTH_DATA_HANDLE;
-#ifdef FIX_350_MASA_DELAY_COMP
typedef struct ivas_masa_decoder_ext_out_meta_struct
{
MASA_DECRIPTIVE_META descriptiveMeta;
@@ -1108,16 +1176,13 @@ typedef struct ivas_masa_decoder_ext_out_meta_struct
uint8_t diffuseToTotalRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
} MASA_DECODER_EXT_OUT_META;
-#endif
typedef struct ivas_masa_decoder_data_struct
{
int16_t band_mapping[MASA_FREQUENCY_BANDS + 1];
SPHERICAL_GRID_DATA *sph_grid16;
-#ifdef FIX_350_MASA_DELAY_COMP
MASA_DECODER_EXT_OUT_META *extOutMeta;
-#endif
float dir_decode_quality;
} MASA_DECODER_DATA;
@@ -1145,9 +1210,14 @@ typedef struct decoder_config_structure
int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */
int16_t Opt_Headrotation; /* indicates whether head-rotation is used */
int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */
- int16_t orientation_tracking; /* indicates orientation tracking type */
- float no_diegetic_pan;
- int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */
+#ifdef FIX_439_OTR_PARAMS
+ HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */
+#else
+ int16_t orientation_tracking; /* indicates orientation tracking type */
+#endif
+ int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */
+ float non_diegetic_pan_gain; /* non diegetic panning gain*/
+ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */
#ifdef EXTERNAL_ORIENTATIONS
int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */
#endif
@@ -1156,9 +1226,40 @@ typedef struct decoder_config_structure
#ifdef DEBUGGING
int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */
#endif
-
+#ifdef JBM_TSM_ON_TCS
+ int16_t voip_active;
+#endif
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t Opt_delay_comp; /* flag indicating delay compensation active */
+#endif
} DECODER_CONFIG, *DECODER_CONFIG_HANDLE;
+
+#ifdef JBM_TSM_ON_TCS
+typedef struct decoder_tc_buffer_structure
+{
+ float *tc_buffer; /* the buffer itself */
+ float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */
+ TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */
+ int16_t nchan_transport_jbm; /* number of TCs after TC decoding */
+ int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */
+ int16_t nchan_buffer_full; /* number of channels to be fully buffered */
+ int16_t n_samples_available; /* samples still available for rendering in the current frame */
+ int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */
+ int16_t n_samples_rendered; /* samples already rendered in the current frame */
+ int16_t n_samples_granularity; /* render granularity */
+ int16_t n_samples_flushed;
+ int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS];
+ int16_t nb_subframes;
+ int16_t subframes_rendered;
+ int16_t slots_rendered;
+ int16_t num_slots;
+ int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */
+
+} DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE;
+#endif
+
+
/*----------------------------------------------------------------------------------*
*
* Main IVAS decoder structure
@@ -1187,7 +1288,7 @@ typedef struct Decoder_Struct
int16_t ini_active_frame; /* initialization active frames counter */
int16_t bfi; /* FEC - bad frame indicator */
- int16_t BER_detect; /* BER detect flag */ /* IVAS_fmToDo: eventually replace hCoreCoder->BER_detect by a pointer to ease the updating of this main parameter */
+ int16_t BER_detect; /* BER detect flag */
uint16_t *bit_stream; /* Pointer to bitstream buffer */
int16_t writeFECoffset; /* parameter for debugging JBM stuff */
@@ -1210,11 +1311,15 @@ typedef struct Decoder_Struct
IVAS_QMETADATA_HANDLE hQMetaData; /* q_metadata handle */
MCT_DEC_HANDLE hMCT; /* MCT handle */
PARAM_MC_DEC_HANDLE hParamMC; /* Parametric MC handle */
+ MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */
MASA_DECODER_HANDLE hMasa; /* MASA handle */
LFE_DEC_HANDLE hLFE; /* LFE handle */
ISM_MODE ism_mode; /* ISM format mode */
+ int16_t nchan_ism; /* number of ISM channels */
+#ifndef SBA_MODE_CLEAN_UP
SBA_MODE sba_mode; /* SBA format mode */
+#endif
MC_MODE mc_mode; /* MC format mode */
int16_t sba_order; /* Ambisonic (SBA) order */
int16_t sba_planar; /* Ambisonic (SBA) planar flag */
@@ -1248,10 +1353,18 @@ typedef struct Decoder_Struct
COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; /* Combined external and head orientation data structure */
#endif
+#ifdef JBM_TSM_ON_TCS
+ /* JBM module */
+ DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */
+#endif
+
#ifdef DEBUGGING
int32_t noClipping; /* number of clipped samples */
#endif
int32_t last_active_ivas_total_brate;
+ int16_t ism_extmeta_active; /* Extended metadata active in decoder */
+ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */
+
} Decoder_Struct;
/* clang-format on */
diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c
index b55cf4cfbdbda5037c08726630424a19321bfd20..c12498c015e6a9d54b79278ec89f36c8bacbf6c7 100644
--- a/lib_dec/ivas_stereo_cng_dec.c
+++ b/lib_dec/ivas_stereo_cng_dec.c
@@ -90,8 +90,7 @@ void stereo_dft_dec_sid_coh(
int16_t bits_tmp;
int16_t b;
- /* TODO: still use old number of bits to keep bitexactness in output */
- nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
+ nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
/* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */
/* from the previous frame is used. */
@@ -174,7 +173,6 @@ void stereo_dft_dec_sid_coh(
( *nb_bits )++;
}
- dtx_read_padding_bits( st, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
return;
}
diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c
index f1cbf180bd1974567688e1471629750954237adb..5c2d0b37e6f7ee598768e8fffcad6eb08e2dbc7d 100644
--- a/lib_dec/ivas_stereo_dft_dec.c
+++ b/lib_dec/ivas_stereo_dft_dec.c
@@ -1126,10 +1126,15 @@ void stereo_dft_dec(
float *input_mem, /* i/o: mem of buffer DFT analysis */
STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */
const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
+ const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */
ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */
const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */
const int32_t output_Fs, /* i : Fs for delay calculation */
const int16_t nchan_transport /* i : number of transpor channels */
+#ifdef FIX_STEREO_474
+ ,
+ const int16_t num_md_sub_frames /* i: number of MD subframes */
+#endif
)
{
int16_t i, k, b, N_div, stop;
@@ -1207,7 +1212,12 @@ void stereo_dft_dec(
ivas_sba_dirac_stereo_smooth_parameters( hStereoDft,
hMdDec,
cross_fade_start_offset,
- output_Fs );
+ output_Fs
+#ifdef FIX_STEREO_474
+ ,
+ num_md_sub_frames
+#endif
+ );
}
else
{
@@ -1339,6 +1349,7 @@ void stereo_dft_dec(
{
g = hStereoDft->g_state[b];
}
+
/* store side gains from inactive frames for later use by the stereo CNA */
if ( hStereoDft->band_limits[b] < L_FRAME16k && ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) )
{
@@ -1410,49 +1421,87 @@ void stereo_dft_dec(
if ( nchan_transport == 1 )
{
- if ( b == 0 )
+ if ( sba_mono_flag )
{
- i = 0;
+ if ( b == 0 )
+ {
+ i = 0;
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_L[2 * i] = DFT_W;
+ DFT_R[2 * i] = 0.f;
- DFT_L[2 * i] = DFT_W + DFT_Y;
- DFT_R[2 * i] = DFT_W - DFT_Y;
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_L[2 * i + 1] = DFT_W;
+ DFT_R[2 * i + 1] = 0.f;
+ }
+ for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
+ {
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
+ DFT_L[2 * i] = DFT_W;
+ DFT_R[2 * i] = 0.f;
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
+ DFT_L[2 * i + 1] = DFT_W;
+ DFT_R[2 * i + 1] = 0.f;
+ }
+ for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
+ {
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_L[2 * i] = DFT_W;
+ DFT_R[2 * i] = 0.f;
- DFT_L[2 * i + 1] = DFT_W + DFT_Y;
- DFT_R[2 * i + 1] = DFT_W - DFT_Y;
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_L[2 * i + 1] = DFT_W;
+ DFT_R[2 * i + 1] = 0.f;
+ }
}
- for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
+ else
{
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
+ if ( b == 0 )
+ {
+ i = 0;
- DFT_L[2 * i] = DFT_W + DFT_Y;
- DFT_R[2 * i] = DFT_W - DFT_Y;
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
+ DFT_L[2 * i] = DFT_W + DFT_Y;
+ DFT_R[2 * i] = DFT_W - DFT_Y;
- DFT_L[2 * i + 1] = DFT_W + DFT_Y;
- DFT_R[2 * i + 1] = DFT_W - DFT_Y;
- }
- for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
- {
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
- DFT_L[2 * i] = DFT_W + DFT_Y;
- DFT_R[2 * i] = DFT_W - DFT_Y;
+ DFT_L[2 * i + 1] = DFT_W + DFT_Y;
+ DFT_R[2 * i + 1] = DFT_W - DFT_Y;
+ }
+ for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
+ {
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
- DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
- DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_L[2 * i] = DFT_W + DFT_Y;
+ DFT_R[2 * i] = DFT_W - DFT_Y;
- DFT_L[2 * i + 1] = DFT_W + DFT_Y;
- DFT_R[2 * i + 1] = DFT_W - DFT_Y;
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
+
+ DFT_L[2 * i + 1] = DFT_W + DFT_Y;
+ DFT_R[2 * i + 1] = DFT_W - DFT_Y;
+ }
+ for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
+ {
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
+
+ DFT_L[2 * i] = DFT_W + DFT_Y;
+ DFT_R[2 * i] = DFT_W - DFT_Y;
+
+ DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+ DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
+
+ DFT_L[2 * i + 1] = DFT_W + DFT_Y;
+ DFT_R[2 * i + 1] = DFT_W - DFT_Y;
+ }
}
}
else if ( nchan_transport >= 2 )
@@ -1556,7 +1605,7 @@ void stereo_dft_dec(
if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 )
{
- hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[hFdCngDec->cna_nbands];
+ hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands];
}
if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
@@ -1689,7 +1738,11 @@ void stereo_dft_dec(
if ( st0->bfi && !prev_bfi )
{
+#ifdef FIX_499_DFT_STEREO_PLC
+ idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX;
+#else
idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
+#endif
idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX;
/*dmx energy memory*/
hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) );
diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c
index 78196eaaa8522dbbb31c96757d5ea3104efbb0c9..13722f2b2ab74d76c773fd093fd10481215f424f 100644
--- a/lib_dec/ivas_stereo_icbwe_dec.c
+++ b/lib_dec/ivas_stereo_icbwe_dec.c
@@ -739,7 +739,7 @@ void stereo_icBWE_decproc(
{
if ( hCPE->element_mode == IVAS_CPE_TD )
{
- /* QC: TBV */
+ /* QC: TODO - TBV */
v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset );
v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset );
}
diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c
index 651f6402c6e6de45ecd1cd6f8090d9660983222e..cbeaf2a1e516f0b4d2473fd8f8ca1ff406dd2c2c 100644
--- a/lib_dec/ivas_stereo_mdct_core_dec.c
+++ b/lib_dec/ivas_stereo_mdct_core_dec.c
@@ -221,7 +221,8 @@ void stereo_mdct_core_dec(
if ( !bfi )
{
- ivas_mdct_dec_side_bits_frame_channel( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], NULL, nTnsBitsTCX10, param, 0, 0 );
+ ivas_mdct_dec_side_bits_frame_channel( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0],
+ nTnsBitsTCX10, param, 0, 0 );
if ( sts[0]->igf )
{
@@ -252,7 +253,8 @@ void stereo_mdct_core_dec(
}
}
- ivas_mdct_core_invQ( hCPE, 0, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0, x, Aq, ms_mask, 0 );
+ ivas_mdct_core_invQ( hCPE,
+ nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0, x, Aq, ms_mask, 0 );
for ( ch = 0; ch < nChannels; ch++ )
{
@@ -345,7 +347,8 @@ void stereo_mdct_core_dec(
stereo_decoder_tcx( hCPE->hStereoMdct, ms_mask, x_0[1], x[0], x[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 );
}
- ivas_mdct_core_tns_ns( hCPE, 0, fUseTns, tnsData, x, Aq, 0 );
+ ivas_mdct_core_tns_ns( hCPE,
+ fUseTns, tnsData, x, Aq, 0 );
if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) )
{
@@ -359,7 +362,8 @@ void stereo_mdct_core_dec(
apply_dmx_weights( hCPE, x, sts[0]->transform_type, sts[1]->transform_type );
}
- ivas_mdct_core_reconstruct( hCPE, x, signal_outFB_tmp, 0, fUseTns, 0 );
+ ivas_mdct_core_reconstruct( hCPE, x, signal_outFB_tmp,
+ fUseTns, 0 );
mvr2r( signal_out_tmp[0], signal_out[0], L_FRAME48k );
mvr2r( signal_out_tmp[1], signal_out[1], L_FRAME48k );
diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c
index cccef8ec84b5553b7761be21f3f2ee9f3ccd9c41..efc9ebe845d7fffafea2ff96565a9f82de09aa64 100644
--- a/lib_dec/ivas_stereo_mdct_stereo_dec.c
+++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c
@@ -468,6 +468,9 @@ ivas_error initMdctStereoDtxData(
/* Init FD-CNG */
initFdCngDec( st );
+ }
+ if ( st->first_CNG == 0 )
+ {
if ( ch == 1 && st->cng_sba_flag )
{
st->hFdCngDec->hFdCngCom->seed += 3;
diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c
index 2e98d358f8d7fd98629285c78947f27a2870353f..013cc24660264ccf974f7bd9529ca8de09dc9d46 100644
--- a/lib_dec/ivas_stereo_switching_dec.c
+++ b/lib_dec/ivas_stereo_switching_dec.c
@@ -963,18 +963,12 @@ ivas_error stereo_memory_dec(
if ( ivas_format == MC_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT )
{
- if ( mc_mode == MC_MODE_MCT )
+ if ( mc_mode == MC_MODE_MCT || mc_mode == MC_MODE_PARAMUPMIX )
{
/* deallocate the FdCNG handle */
for ( i = 0; i < CPE_CHANNELS; ++i )
{
deleteFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec );
-
- /* deallocate CLDFB synthesis for LFE channel */
- if ( hCPE->hCoreCoder[i]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- deleteCldfb( &hCPE->hCoreCoder[i]->cldfbSyn );
- }
}
}
else
@@ -1551,7 +1545,6 @@ void stereo_switching_dec(
mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k );
mvr2r( sts[0]->delay_buf_out, sts[1]->delay_buf_out, HQ_DELTA_MAX * HQ_DELAY_COMP );
mvr2r( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 );
- /* Todo: apply panning to buffers instead of simply using dmx in left and right channel */
}
}
else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT )
diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c
index fc3e1db99d6d48b7d9f215d1b79b15339ea419eb..ab82fb4e07653b0d0900c75137aecd588738b608 100644
--- a/lib_dec/ivas_tcx_core_dec.c
+++ b/lib_dec/ivas_tcx_core_dec.c
@@ -95,11 +95,12 @@ void stereo_tcx_init_dec(
st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag );
st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC );
hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag, st->element_mode );
- st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag, st->mct_chan_mode );
- /* TODO: also apply for MCT modes, once issue #24 is solved */
- if ( !MCT_flag && st->element_mode != EVS_MONO )
+ st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag );
+
+ if (
+ st->element_mode != EVS_MONO )
{
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode, st->mct_chan_mode );
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode );
}
if ( hTcxLtpDec != NULL )
{
@@ -150,19 +151,18 @@ void stereo_tcx_init_dec(
*-------------------------------------------------------------------*/
void stereo_tcx_core_dec(
- Decoder_State *st, /* i/o: decoder state structure */
- const FRAME_MODE frameMode, /* i : Decoder frame mode */
- float *signal_out, /* o : synthesis @internal_Fs */
- float *signal_outFB, /* o : synthesis @output_Fs */
- float pitch_buf[], /* o : floating pitch for each subframe */
- const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
- STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */
- const int16_t last_element_mode, /* i : last element mode */
- const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */
- STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */
- const int16_t nchan_out, /* i : number of output channels */
- const IVAS_FORMAT ivas_format, /* i : IVAS format */
- const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM)*/
+ Decoder_State *st, /* i/o: decoder state structure */
+ const FRAME_MODE frameMode, /* i : Decoder frame mode */
+ float *signal_out, /* o : synthesis @internal_Fs */
+ float *signal_outFB, /* o : synthesis @output_Fs */
+ float pitch_buf[], /* o : floating pitch for each subframe */
+ const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
+ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */
+ const int16_t last_element_mode, /* i : last element mode */
+ const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */
+ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */
+ const int16_t nchan_out, /* i : number of output channels */
+ const IVAS_FORMAT ivas_format /* i : IVAS format */
)
{
int16_t i, k;
@@ -726,7 +726,7 @@ void stereo_tcx_core_dec(
if ( st->element_mode != IVAS_CPE_TD )
{
- if ( ivas_format == ISM_FORMAT && ism_mode == ISM_MODE_PARAM )
+ if ( ivas_format == ISM_FORMAT )
{
float buffer[L_FRAME16k];
lerp( signal_outFB, buffer, st->L_frame, hTcxDec->L_frameTCX );
diff --git a/lib_dec/ivas_vbap.c b/lib_dec/ivas_vbap.c
index cda52c1aec8e7c74c9b05d1016cc429e99fb6151..841f3df132015ea8ac0505bde28ffb4374ec315c 100644
--- a/lib_dec/ivas_vbap.c
+++ b/lib_dec/ivas_vbap.c
@@ -178,11 +178,13 @@ ivas_error vbap_init_data(
push_wmops( "vbap_init" );
/* Basic init checks */
+ /* If the requested layout is invalid, hVBAPdata is set to NULL and the signal will
+ * be distributed with an equal gain into all output channels.
+ * The surrounding code needs to handle the NULL pointer properly. */
if ( num_speaker_nodes > VBAP_MAX_NUM_SPEAKER_NODES || num_speaker_nodes < 3 )
{
hVBAPdata = NULL;
pop_wmops();
- /* TODO: are these two paths correct behaviour or should and error be returned ? */
return IVAS_ERR_OK;
}
diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h
index 54b873b006b1c9532794cae661a7f3c2aea031ad..7954358595a32c3dceff516f4a04a87c73b09648 100644
--- a/lib_dec/jbm_jb4sb.h
+++ b/lib_dec/jbm_jb4sb.h
@@ -78,6 +78,14 @@ struct JB4_DATAUNIT
int16_t nextCoderType;
};
+#ifdef JBM_TSM_ON_TCS
+typedef enum
+{
+ JBM_RENDERER_NONE,
+ JBM_RENDERER_IVAS,
+} JBM_RENDERER_TYPE;
+#endif
+
typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE;
diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c
index c816a9d9c8b4fadbea3da7e1ccb7061dbc4cd677..9742a01183753e39f0de9897f9821ad58ad7bbb4 100644
--- a/lib_dec/jbm_pcmdsp_apa.c
+++ b/lib_dec/jbm_pcmdsp_apa.c
@@ -66,7 +66,12 @@
struct apa_state_t
{
/* output buffer */
+#ifdef JBM_TSM_ON_TCS
+ bool evs_compat_mode;
+ float *buf_out;
+#else
int16_t *buf_out;
+#endif
uint16_t buf_out_capacity;
uint16_t l_buf_out;
@@ -86,6 +91,14 @@ struct apa_state_t
/* total number of processed input samples since apa_reset() */
uint32_t l_in_total;
+#ifdef JBM_TSM_ON_TCS
+ /* time resolution in samples of the IVAS renderer*/
+ uint16_t l_ts;
+
+ /* samples already available in the renderer buffer */
+ uint16_t l_r_buf;
+#endif
+
/* sum of inserted/removed samples since last apa_set_scale() */
int32_t diffSinceSetScale;
/* number of input frames since last apa_set_scale() */
@@ -123,6 +136,17 @@ static float apa_corrEnergy2dB( float energy, uint16_t corr_len );
static float apa_getQualityIncreaseForLowEnergy( float energydB );
+#ifdef JBM_TSM_ON_TCS
+static bool logarithmic_search( const apa_state_t *ps, const float *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos );
+
+static bool find_synch( apa_state_t *ps, const float *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos );
+
+static bool copy_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out );
+
+static bool shrink_frm( apa_state_t *ps, const float frm_in[], uint16_t maxScaling, float frm_out[], uint16_t *l_frm_out );
+
+static bool extend_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out );
+#else
static bool logarithmic_search( const apa_state_t *ps, const int16_t *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos );
static bool find_synch( apa_state_t *ps, const int16_t *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos );
@@ -132,7 +156,7 @@ static bool copy_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[]
static bool shrink_frm( apa_state_t *ps, const int16_t frm_in[], uint16_t maxScaling, int16_t frm_out[], uint16_t *l_frm_out );
static bool extend_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[], uint16_t *l_frm_out );
-
+#endif
/*---------------------------------------------------------------------*
* Public functions
@@ -164,6 +188,10 @@ ivas_error apa_init(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) );
}
+#ifdef JBM_TSM_ON_TCS
+ ps->evs_compat_mode = false;
+#endif
+
apa_reset( ps );
*pps = ps;
@@ -196,9 +224,58 @@ void apa_reset(
ps->bad_frame_count = 0;
ps->good_frame_count = 0;
+#ifdef JBM_TSM_ON_TCS
+ ps->l_ts = 1;
+ ps->l_r_buf = 0;
+#endif
return;
}
+#ifdef JBM_TSM_ON_TCS
+uint8_t apa_reconfigure(
+ apa_state_t *ps,
+ uint16_t num_channels,
+ uint16_t l_ts )
+{
+
+ /* realloc buffer */
+ free( ps->buf_out );
+ ps->num_channels = (uint16_t) num_channels;
+ ps->buf_out_capacity = (uint16_t) ( APA_BUF_PER_CHANNEL * num_channels );
+ ps->buf_out = (float *) malloc( sizeof( float ) * ps->buf_out_capacity );
+ if ( !ps->buf_out )
+ {
+ return 2;
+ }
+ ps->l_buf_out = 0;
+ ps->l_in_total = 0;
+ ps->l_ts = ps->num_channels * l_ts;
+
+ /* set everything else dependent on the number of channels */
+ /* set segment size */
+ /* in the order of a pitch, set to 160 samples at 16 kHz */
+ /* used for windowing and as the correlation length, i.e., */
+ /* the size of the template segment. */
+ ps->l_seg = ( ps->rate / 100 ) * ps->num_channels;
+
+ /* set frame size */
+ /* set to 320 samples at 16 kHz */
+ ps->l_frm = ( ps->rate / FRAMES_PER_SEC ) * ps->num_channels;
+
+ /* set minimum pitch */
+ /* set to 40 samples at 16 kHz */
+ /* (defines min change in number of samples, i.e., abs(l_in-l_out) >= p_min) */
+ ps->p_min = ( ps->rate / 400 ) * ps->num_channels;
+
+ /* set search length */
+ /* must cover one pitch, set to 200 samples at 16 kHz */
+ /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */
+ ps->l_search = ( ps->rate / 80 ) * ps->num_channels;
+
+ return 0;
+}
+
+#endif
/* Sets the audio configuration. */
bool apa_set_rate(
@@ -302,6 +379,54 @@ bool apa_set_scale(
return 0;
}
+#ifdef JBM_TSM_ON_TCS
+bool apa_set_renderer_granularity(
+ apa_state_t *ps,
+ uint16_t l_ts )
+{
+ /* make sure pointer is valid */
+ if ( ps == NULL )
+ {
+ return 1;
+ }
+
+
+ /* copy to state struct */
+ ps->l_ts = l_ts * ps->num_channels;
+ return 0;
+}
+
+bool apa_set_renderer_residual_samples(
+ apa_state_t *ps,
+ uint16_t l_r_buf )
+{
+ /* make sure pointer is valid */
+ if ( ps == NULL )
+ {
+ return 1;
+ }
+
+
+ /* copy to state struct */
+ ps->l_r_buf = l_r_buf * ps->num_channels;
+ return 0;
+}
+
+bool apa_set_evs_compat_mode(
+ apa_state_t *ps,
+ bool mode )
+{
+ /* make sure pointer is valid */
+ if ( ps == NULL )
+ {
+ return 1;
+ }
+
+ ps->evs_compat_mode = mode;
+
+ return 0;
+}
+#endif
/*
********************************************************************************
@@ -454,16 +579,28 @@ bool apa_exit(
********************************************************************************
*/
uint8_t apa_exec(
- apa_state_t *ps, /* i/o: state struct */
- const int16_t a_in[], /* i : input samples */
- uint16_t l_in, /* i : number of input samples */
- uint16_t maxScaling, /* i : allowed number of inserted/removed samples */
- int16_t a_out[], /* o : output samples */
- uint16_t *l_out /* o : number of output samples */
+ apa_state_t *ps, /* i/o: state struct */
+#ifdef JBM_TSM_ON_TCS
+ const float a_in[], /* i : input samples */
+#else
+ const int16_t a_in[], /* i : input samples */
+#endif
+ uint16_t l_in, /* i : number of input samples */
+ uint16_t maxScaling, /* i : allowed number of inserted/removed samples */
+#ifdef JBM_TSM_ON_TCS
+ float a_out[], /* o : output samples */
+#else
+ int16_t a_out[], /* o : output samples */
+#endif
+ uint16_t *l_out /* o : number of output samples */
)
{
uint16_t i;
+#ifdef JBM_TSM_ON_TCS
+ float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */
+#else
int16_t frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */
+#endif
uint16_t l_frm_out;
int16_t l_rem;
int32_t dl_scaled, dl_copied, l_frm_out_target;
@@ -525,8 +662,13 @@ uint8_t apa_exec(
}
else
{
+#ifdef JBM_TSM_ON_TCS
+ float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] );
+ float *frm_in_ptr = &( frm_in[ps->l_frm] );
+#else
int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] );
int16_t *frm_in_ptr = &( frm_in[ps->l_frm] );
+#endif
/* fill input frame */
/* 1st input frame: previous output samples */
@@ -581,8 +723,13 @@ uint8_t apa_exec(
/* discard old samples; always keep at least most recent l_frm samples */
if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity )
{
+#ifdef JBM_TSM_ON_TCS
+ float *buf_out_ptr1 = ps->buf_out;
+ float *buf_out_ptr2;
+#else
int16_t *buf_out_ptr1 = ps->buf_out;
int16_t *buf_out_ptr2;
+#endif
l_rem = ( ps->l_frm - l_frm_out );
if ( l_rem < 0 )
@@ -602,7 +749,11 @@ uint8_t apa_exec(
return 5;
}
{
+#ifdef JBM_TSM_ON_TCS
+ float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] );
+#else
int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] );
+#endif
for ( i = 0; i < l_frm_out; i++ )
{
buf_out_ptr[i] = a_out[i];
@@ -660,7 +811,11 @@ uint8_t apa_exec(
*/
static void get_scaling_quality(
const apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
uint16_t s_len,
uint16_t offset,
uint16_t corr_len,
@@ -813,7 +968,11 @@ static float apa_getQualityIncreaseForLowEnergy(
*/
static bool logarithmic_search(
const apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
int16_t s_start,
uint16_t inlen,
uint16_t offset,
@@ -926,7 +1085,11 @@ static bool logarithmic_search(
*/
static bool find_synch(
apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float *in,
+#else
const int16_t *in,
+#endif
uint16_t l_in,
int16_t s_start,
uint16_t s_len,
@@ -981,8 +1144,13 @@ static bool find_synch(
*/
static bool copy_frm(
apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float frm_in[],
+ float frm_out[],
+#else
const int16_t frm_in[],
int16_t frm_out[],
+#endif
uint16_t *l_frm_out )
{
uint16_t i;
@@ -1029,9 +1197,17 @@ static bool copy_frm(
*/
static bool shrink_frm(
apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float frm_in[],
+#else
const int16_t frm_in[],
+#endif
uint16_t maxScaling,
+#ifdef JBM_TSM_ON_TCS
+ float frm_out[],
+#else
int16_t frm_out[],
+#endif
uint16_t *l_frm_out )
{
bool findSynchResult = 0;
@@ -1062,7 +1238,28 @@ static bool shrink_frm(
/* maximum scaling */
energy = -65;
quality = 5;
- if ( maxScaling != 0U && s_end > maxScaling + 1 )
+#ifdef JBM_TSM_ON_TCS
+ if ( ps->evs_compat_mode == false )
+ {
+
+ xtract = maxScaling;
+ /* take samples already in the renderer buf into account */
+ xtract += ps->l_r_buf;
+ /* snap to renderer time slot borders */
+ xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts );
+ while ( xtract < 0 )
+ {
+ xtract += ps->l_ts;
+ }
+ while ( xtract > ( s_end - ps->num_channels ) )
+ {
+ /* exceeded the possible shrinking, go back one renderer ts*/
+ xtract -= ps->l_ts;
+ }
+ }
+ else
+#endif
+ if ( maxScaling != 0U && s_end > maxScaling + 1 )
{
xtract = maxScaling;
}
@@ -1118,7 +1315,18 @@ static bool shrink_frm(
{
return 1;
}
- overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+#ifdef JBM_TSM_ON_TCS
+ if ( ps->evs_compat_mode == true )
+ {
+ overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+ }
+ else
+ {
+#endif
+ overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+#ifdef JBM_TSM_ON_TCS
+ }
+#endif
}
else
{
@@ -1165,8 +1373,13 @@ static bool shrink_frm(
*/
static bool extend_frm(
apa_state_t *ps,
+#ifdef JBM_TSM_ON_TCS
+ const float frm_in[],
+ float frm_out[],
+#else
const int16_t frm_in[],
int16_t frm_out[],
+#endif
uint16_t *l_frm_out )
{
bool findSynchResult = 0;
@@ -1180,8 +1393,14 @@ static bool extend_frm(
int16_t s_start = 0;
float energy, quality = 0.0f;
uint16_t l_frm, l_seg;
+#ifdef JBM_TSM_ON_TCS
+ const float *fadeOut, *fadeIn;
+ float *out;
+#else
const int16_t *fadeOut, *fadeIn;
int16_t *out;
+#endif
+
l_frm = ps->l_frm;
l_seg = ps->l_seg;
@@ -1271,6 +1490,15 @@ static bool extend_frm(
energy = -65;
quality = 5;
xtract[n] = s_start + ps->num_channels;
+#ifdef JBM_TSM_ON_TCS
+ if ( ps->evs_compat_mode == false )
+ {
+ /* take renderer buffer samples into accout */
+ xtract[n] += ps->l_r_buf;
+ /* snap to next renderer time slot border to resynchronize */
+ xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts;
+ }
+#endif
}
else
{
@@ -1327,13 +1555,29 @@ static bool extend_frm(
fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg;
fadeIn = frm_in + l_frm + xtract[n];
out = frm_out + ( n - 2 ) * l_seg;
- overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+#ifdef JBM_TSM_ON_TCS
+ if ( ps->evs_compat_mode == true )
+ {
+ overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+ }
+ else
+ {
+#endif
+ overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win );
+#ifdef JBM_TSM_ON_TCS
+ }
+#endif
}
else
{
/* just copy down 1st half of current segment (= 2nd half of previous segment) */
+#ifdef JBM_TSM_ON_TCS
+ float *frm_out_ptr;
+ const float *frm_in_ptr;
+#else
int16_t *frm_out_ptr;
const int16_t *frm_in_ptr;
+#endif
frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] );
frm_in_ptr = &( frm_in[l_frm + xtract[n]] );
for ( i = 0; i < l_seg; i++ )
diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h
index 543042f53b4301789af0eabe9fddee082254c8fa..a5e7cb7d61ab0810bf36913fd761bc39946a8a00 100644
--- a/lib_dec/jbm_pcmdsp_apa.h
+++ b/lib_dec/jbm_pcmdsp_apa.h
@@ -114,12 +114,26 @@ bool apa_set_rate( apa_state_t *ps, const int32_t output_Fs );
* @return 0 on success, 1 on failure */
bool apa_set_scale( apa_state_t *s, uint16_t scale );
+#ifdef JBM_TSM_ON_TCS
+bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts );
+
+bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf );
+
+bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode );
+
+uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts );
+#endif
+
bool apa_set_complexity_options( apa_state_t *s, uint16_t wss, uint16_t css );
bool apa_set_quality( apa_state_t *s, float quality, uint16_t qualityred, uint16_t qualityrise );
bool apa_exit( apa_state_t **s );
+#ifdef JBM_TSM_ON_TCS
+uint8_t apa_exec( apa_state_t *s, const float a_in[], uint16_t l_in, uint16_t maxScaling, float a_out[], uint16_t *l_out );
+#else
uint8_t apa_exec( apa_state_t *s, const int16_t a_in[], uint16_t l_in, uint16_t maxScaling, int16_t a_out[], uint16_t *l_out );
+#endif
#endif /* JBM_PCMDSP_APA_H */
diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c
index 81e833e5e56fc3860b7045c6b97405e52b71ae15..108b069402b473d58ae07320601c881e52cad8c4 100644
--- a/lib_dec/jbm_pcmdsp_fifo.c
+++ b/lib_dec/jbm_pcmdsp_fifo.c
@@ -116,6 +116,15 @@ ivas_error pcmdsp_fifo_init(
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) );
}
+#ifdef DEBUGGING
+ {
+ uint32_t i;
+ for ( i = 0; i < nDataBytes; i++ )
+ {
+ h->dataBegin[i] = 0;
+ }
+ }
+#endif
h->dataEnd = h->dataBegin + nDataBytes;
h->dataWriteIterator = h->dataBegin;
h->dataReadIterator = h->dataBegin;
@@ -166,6 +175,51 @@ int16_t pcmdsp_fifo_write(
return 0;
}
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUGGING
+/* Writes the given audio data to the FIFO. */
+int16_t pcmdsp_fifo_write_zero(
+ PCMDSP_FIFO_HANDLE h,
+ uint16_t nSamplesPerChannel )
+{
+ uint16_t nBytesToWrite;
+
+ /* check for empty input buffer */
+ if ( nSamplesPerChannel == 0U )
+ {
+ return 0;
+ }
+
+ /* check, if enough space left */
+ if ( nSamplesPerChannel > h->capacity - h->size )
+ {
+ return -1;
+ }
+
+ nBytesToWrite = nSamplesPerChannel * h->nBytesPerSampleSet;
+ if ( h->dataWriteIterator + nBytesToWrite > h->dataEnd )
+ {
+ /* wrap around: writing two parts */
+ uint16_t bytesOfFirstPart, secondSize;
+ bytesOfFirstPart = (uint16_t) ( h->dataEnd - h->dataWriteIterator );
+ secondSize = nBytesToWrite - bytesOfFirstPart;
+ set_c( (int8_t *) h->dataWriteIterator, 0, bytesOfFirstPart );
+ set_c( (int8_t *) h->dataBegin, 0, secondSize );
+ h->dataWriteIterator = h->dataBegin + secondSize;
+ }
+ else
+ {
+ /* no wrap around: simple write */
+ set_c( (int8_t *) h->dataWriteIterator, 0, nBytesToWrite );
+ h->dataWriteIterator += nBytesToWrite;
+ }
+ h->size += nSamplesPerChannel;
+
+ return 0;
+}
+#endif
+#endif
+
/* Reads the given number of audio samples from the FIFO. */
int16_t pcmdsp_fifo_read(
PCMDSP_FIFO_HANDLE h,
diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h
index 13ffd146f871fb1b4d7c227b965a1931ba2f1e11..d16bd2b8d25439384c73cebf450fabc16c247f53 100644
--- a/lib_dec/jbm_pcmdsp_fifo.h
+++ b/lib_dec/jbm_pcmdsp_fifo.h
@@ -74,6 +74,12 @@ ivas_error pcmdsp_fifo_init( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel,
int16_t pcmdsp_fifo_write( PCMDSP_FIFO_HANDLE h, const uint8_t *samples, uint16_t nSamplesPerChannel );
+#ifdef JBM_TSM_ON_TCS
+#ifdef DEBUGGING
+int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel );
+#endif
+#endif
+
int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint8_t *samples );
uint16_t pcmdsp_fifo_nReadableSamplesPerChannel( const PCMDSP_FIFO_HANDLE h );
diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c
index f575acc7ad337f77ac81495ec36340ce1ce2ef49..e83d1f7c3769ff944fd751760a0b61bc1b301f70 100644
--- a/lib_dec/jbm_pcmdsp_similarityestimation.c
+++ b/lib_dec/jbm_pcmdsp_similarityestimation.c
@@ -52,7 +52,11 @@
/* Calculates cross correlation coefficient for template segment. */
float cross_correlation_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
uint16_t x,
uint16_t y,
uint16_t corr_len )
@@ -63,7 +67,11 @@ float cross_correlation_self(
c_c = 0.0f;
for ( j = 0; j < corr_len; j++ )
{
+#ifdef JBM_TSM_ON_TCS
+ c_c += ( signal[j + x] * signal[j + y] );
+#else
c_c += ( (float) signal[j + x] * (float) signal[j + y] );
+#endif
}
return c_c;
@@ -71,7 +79,11 @@ float cross_correlation_self(
/* Calculates cross correlation coefficient for template segment. */
float cross_correlation_subsampled_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
uint16_t x,
uint16_t y,
uint16_t corr_len,
@@ -83,7 +95,11 @@ float cross_correlation_subsampled_self(
c_c = 0.0f;
for ( j = 0; j < corr_len; j += subsampling )
{
+#ifdef JBM_TSM_ON_TCS
+ c_c += ( signal[j + x] * signal[j + y] );
+#else
c_c += ( (float) signal[j + x] * (float) signal[j + y] );
+#endif
}
return c_c;
@@ -92,7 +108,11 @@ float cross_correlation_subsampled_self(
/* Calculates normalized cross correlation coefficient for template segment. */
float normalized_cross_correlation_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
uint16_t x,
uint16_t y,
uint16_t corr_len,
@@ -102,7 +122,11 @@ float normalized_cross_correlation_self(
float c_c;
float energy_xy, energy_x, energy_y;
uint16_t j;
+#ifdef JBM_TSM_ON_TCS
+ const float *signal_a, *signal_b;
+#else
const int16_t *signal_a, *signal_b;
+#endif
c_c = 0.0f;
energy_x = 0.0f;
@@ -111,11 +135,21 @@ float normalized_cross_correlation_self(
signal_b = &signal[y];
for ( j = 0; j < corr_len; j += subsampling )
{
+#ifdef JBM_TSM_ON_TCS
+ c_c += ( signal_a[j] * signal_b[j] );
+ energy_x += ( signal_a[j] ) * ( signal_a[j] );
+ energy_y += ( signal_b[j] ) * ( signal_b[j] );
+#else
c_c += ( (float) signal_a[j] * (float) signal_b[j] );
energy_x += ( (float) signal_a[j] ) * ( (float) signal_a[j] );
energy_y += ( (float) signal_b[j] ) * ( (float) signal_b[j] );
+#endif
}
+#ifdef JBM_TSM_ON_TCS
+ energy_xy = sqrtf( energy_x * energy_y );
+#else
energy_xy = (float) sqrt( (float) energy_x * (float) energy_y );
+#endif
if ( energy_xy < 1.0f )
{
energy_xy = 1.0f; /* conceal silent frames */
@@ -130,7 +164,11 @@ float normalized_cross_correlation_self(
/* Splits the signal into segments and checks if all of them have very low energy. */
bool isSilence(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
const int16_t *signal,
+#endif
uint32_t len,
uint32_t segments )
{
@@ -145,7 +183,11 @@ bool isSilence(
if ( ( i != 0U && i % samplesPerSegment == 0U ) || i + 1 == len )
{
/* check energy of current segment */
+#ifdef JBM_TSM_ON_TCS
+ energy = 10 * log10f( energy / (float) samplesPerSegment );
+#else
energy = 10 * (float) log10( energy / samplesPerSegment );
+#endif
if ( energy > -65 )
{
return false;
diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h
index 4dc92f27b7cff9320280124d17733c6d6f7feabc..44b4fd246a4d9881550107196c374923284a15c7 100644
--- a/lib_dec/jbm_pcmdsp_similarityestimation.h
+++ b/lib_dec/jbm_pcmdsp_similarityestimation.h
@@ -67,7 +67,15 @@
*
********************************************************************************
*/
-float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len );
+float cross_correlation_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
+ const int16_t *signal,
+#endif
+ uint16_t x,
+ uint16_t y,
+ uint16_t corr_len );
/*
********************************************************************************
@@ -94,7 +102,16 @@ float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uin
*
********************************************************************************
*/
-float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling );
+float cross_correlation_subsampled_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
+ const int16_t *signal,
+#endif
+ uint16_t x,
+ uint16_t y,
+ uint16_t corr_len,
+ uint16_t subsampling );
/*
********************************************************************************
@@ -132,9 +149,26 @@ float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint
*
********************************************************************************
*/
-float normalized_cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling, float *energy );
+float normalized_cross_correlation_self(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
+ const int16_t *signal,
+#endif
+ uint16_t x,
+ uint16_t y,
+ uint16_t corr_len,
+ uint16_t subsampling,
+ float *energy );
/* Splits the signal into segments and checks if all of them have very low energy. */
-bool isSilence( const int16_t *signal, uint32_t len, uint32_t segments );
+bool isSilence(
+#ifdef JBM_TSM_ON_TCS
+ const float *signal,
+#else
+ const int16_t *signal,
+#endif
+ uint32_t len,
+ uint32_t segments );
#endif /* JBM_PCMDSP_SIMILARITYESTIMATION_H */
diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c
index f9f71ac802093d4a0b8dbfcab05d43895dae989d..a31d368c9119d1d35361c9657998fba14d24dff5 100644
--- a/lib_dec/jbm_pcmdsp_window.c
+++ b/lib_dec/jbm_pcmdsp_window.c
@@ -80,9 +80,15 @@ void hannWindow(
*-----------------------------------------------------------------------*/
void overlapAdd(
+#ifdef JBM_TSM_ON_TCS
+ const float *fadeOut,
+ const float *fadeIn,
+ float *out,
+#else
const int16_t *fadeOut,
const int16_t *fadeIn,
int16_t *out,
+#endif
uint16_t n,
uint16_t nChannels,
const float *fadeOutWin,
@@ -90,7 +96,11 @@ void overlapAdd(
{
float fdOutVal, fdInVal;
int16_t i, j, hannIter;
+#ifdef JBM_TSM_ON_TCS
+ float combinedVal;
+#else
int32_t combinedVal;
+#endif
for ( j = 0; j < nChannels; j++ )
{
@@ -101,8 +111,11 @@ void overlapAdd(
fdOutVal = fadeOut[i] * fadeOutWin[hannIter];
fdInVal = fadeIn[i] * fadeInWin[hannIter];
/* round combinedVal value (taking care of sign) */
+#ifdef JBM_TSM_ON_TCS
+ combinedVal = fdInVal + fdOutVal;
+ out[i] = combinedVal;
+#else
combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) + 0.5 );
-
if ( fdInVal + fdOutVal < 0.0 )
{
combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) - 0.5 );
@@ -117,7 +130,57 @@ void overlapAdd(
{
combinedVal = MIN16B;
}
+
out[i] = (int16_t) combinedVal;
+#endif
+ hannIter++;
+ }
+ }
+
+ return;
+}
+
+void overlapAddEvs(
+ const float *fadeOut,
+ const float *fadeIn,
+ float *out,
+ uint16_t n,
+ uint16_t nChannels,
+ const float *fadeOutWin,
+ const float *fadeInWin )
+{
+ float fdOutVal, fdInVal;
+ int16_t i, j, hannIter;
+ float combinedVal;
+
+ for ( j = 0; j < nChannels; j++ )
+ {
+ /* reset Hann window iterator to beginning (both channels use same window) */
+ hannIter = 0;
+ for ( i = j; i < n; i += nChannels )
+ {
+ fdOutVal = fadeOut[i] * fadeOutWin[hannIter];
+ fdInVal = fadeIn[i] * fadeInWin[hannIter];
+ /* round combinedVal value (taking care of sign) */
+
+ combinedVal = floorf( ( fdInVal + fdOutVal ) + 0.5f );
+ if ( fdInVal + fdOutVal < 0.0 )
+ {
+ combinedVal = ceilf( ( fdInVal + fdOutVal ) - 0.5f );
+ }
+
+ /* saturate value */
+ if ( combinedVal > MAX16B_FLT )
+ {
+ combinedVal = MAX16B_FLT;
+ }
+ else if ( combinedVal < MIN16B_FLT )
+ {
+ combinedVal = MIN16B_FLT;
+ }
+
+ out[i] = combinedVal;
+
hannIter++;
}
}
diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h
index 67759e97384d759c2666f260eb2fd0754afe1326..8c1823867a8fa5d614b1d73c64a0ff6cb4c06cca 100644
--- a/lib_dec/jbm_pcmdsp_window.h
+++ b/lib_dec/jbm_pcmdsp_window.h
@@ -61,6 +61,10 @@ void hannWindow( uint16_t n, float *w );
* @param[in] nChannels number of channels
* @param[in] fadeOutWin window for fade out
* @param[in] fadeInWin window for fade in */
+#ifdef JBM_TSM_ON_TCS
+void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin );
+void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin );
+#else
void overlapAdd( const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin );
-
+#endif
#endif /* JBM_PCMDSP_WINDOW_H */
diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c
index e81a137cffb9d5377c78e70d355c883c652f4ed2..e36043b47f0252ff3a39b608ff8de5cccfe535d5 100644
--- a/lib_dec/lib_dec.c
+++ b/lib_dec/lib_dec.c
@@ -54,11 +54,27 @@ struct IVAS_DEC_VOIP
uint16_t nSamplesFrame; /* Total number of samples in a frame (includes number of channels) */
JB4_HANDLE hJBM;
PCMDSP_APA_HANDLE hTimeScaler;
- PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler;
uint16_t lastDecodedWasActive;
- int16_t *apaExecBuffer; /* Buffer for APA scaling */
+#ifdef JBM_TSM_ON_TCS
+ float *apaExecBuffer; /* Buffer for APA scaling */
+#else
+ int16_t *apaExecBuffer; /* Buffer for APA scaling */
+#endif
JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */
uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */
+#ifdef VARIABLE_SPEED_DECODING
+ IVAS_DEC_VOIP_MODE voipMode;
+ uint16_t speedFac;
+ bool needNewFrame;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ JBM_RENDERER_TYPE rendererType;
+ PCMDSP_FIFO_HANDLE hFifoOut;
+ uint8_t nTransportChannelsOld;
+ uint16_t nSamplesAvailableNext;
+#else
+ PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler;
+#endif
#ifdef SUPPORT_JBM_TRACEFILE
IVAS_JBM_TRACE_DATA JbmTraceData;
#endif
@@ -93,10 +109,27 @@ static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP );
#ifdef SUPPORT_JBM_TRACEFILE
static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t systemTimestamp_ms, const uint16_t extBufferedSamples, const int32_t output_Fs );
#endif
+#ifdef JBM_TSM_ON_TCS
+static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, float *floatBuf, int16_t *pcmBuf );
+#else
static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf );
+#endif
static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled );
-static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking, const float no_diegetic_pan );
-
+#ifdef FIX_439_OTR_PARAMS
+static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig );
+#else
+static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking );
+#endif
+#ifdef JBM_TSM_ON_TCS
+static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas );
+static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec );
+static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts );
+static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, uint16_t *nTcBufferGranularity, uint8_t *nTransportChannels, uint8_t *nOutChannels, uint16_t *nSamplesRendered, int16_t *data );
+static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf, int16_t *nOutSamples );
+static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf );
+static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf );
+static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, int16_t *nSamplesBuffered );
+#endif
/*---------------------------------------------------------------------*
* IVAS_DEC_Open()
@@ -106,10 +139,13 @@ static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int
/* may return an error but may still have allocated memory - thus run Close also in case of error to release memory */
ivas_error IVAS_DEC_Open(
- IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */
- const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */
- const int16_t orientation_tracking, /* i : orientation tracking type */
- float no_diegetic_pan )
+ IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */
+ const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */
+#ifndef FIX_439_OTR_PARAMS
+ ,
+ const int16_t orientation_tracking /* i : orientation tracking type */
+#endif
+)
{
IVAS_DEC_HANDLE hIvasDec;
Decoder_Struct *st_ivas;
@@ -162,8 +198,11 @@ ivas_error IVAS_DEC_Open(
st_ivas = hIvasDec->st_ivas;
/* initialize Decoder Config. handle */
- init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking, no_diegetic_pan );
-
+#ifdef FIX_439_OTR_PARAMS
+ init_decoder_config( hIvasDec->st_ivas->hDecoderConfig );
+#else
+ init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking );
+#endif
/* initialize pointers to handles to NULL */
ivas_initialize_handles_dec( st_ivas );
@@ -192,7 +231,9 @@ ivas_error IVAS_DEC_Open(
st_ivas->writeFECoffset = 0;
st_ivas->ism_mode = ISM_MODE_NONE;
+#ifndef SBA_MODE_CLEAN_UP
st_ivas->sba_mode = SBA_MODE_NONE;
+#endif
st_ivas->mc_mode = MC_MODE_NONE;
st_ivas->sba_order = 0;
@@ -213,9 +254,12 @@ ivas_error IVAS_DEC_Open(
*---------------------------------------------------------------------*/
static void init_decoder_config(
- DECODER_CONFIG_HANDLE hDecoderConfig, /* i/o: configuration structure */
- const int16_t orientation_tracking,
- const float no_diegetic_pan )
+ DECODER_CONFIG_HANDLE hDecoderConfig /* i/o: configuration structure */
+#ifndef FIX_439_OTR_PARAMS
+ ,
+ const int16_t orientation_tracking
+#endif
+)
{
hDecoderConfig->Opt_AMR_WB = 0;
hDecoderConfig->nchan_out = 1;
@@ -224,8 +268,21 @@ static void init_decoder_config(
hDecoderConfig->Opt_HRTF_binary = 0;
hDecoderConfig->Opt_Headrotation = 0;
hDecoderConfig->Opt_RendConfigCustom = 0;
+#ifdef FIX_439_OTR_PARAMS
+ hDecoderConfig->orientation_tracking = HEAD_ORIENT_TRK_NONE;
+#else
hDecoderConfig->orientation_tracking = orientation_tracking;
- hDecoderConfig->no_diegetic_pan = no_diegetic_pan;
+#endif
+ hDecoderConfig->Opt_non_diegetic_pan = 0;
+ hDecoderConfig->non_diegetic_pan_gain = 0;
+
+#ifdef JBM_TSM_ON_TCS
+ hDecoderConfig->voip_active = 0;
+#endif
+
+#ifdef FIX_356_ISM_METADATA_SYNC
+ hDecoderConfig->Opt_delay_comp = 0;
+#endif
#ifdef EXTERNAL_ORIENTATIONS
hDecoderConfig->Opt_ExternalOrientation = 0;
#endif
@@ -394,7 +451,17 @@ ivas_error IVAS_DEC_Configure(
#ifdef EXTERNAL_ORIENTATIONS
const int16_t enableExternalOrientation, /* i : enable external orientations */
#endif
- const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */
+#endif
+ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */
+ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const float non_diegetic_pan_gain, /* i : non diegetic panning gain */
+ const int16_t delayCompensationEnabled /* i : enable delay compensation */
+#else
+ const float non_diegetic_pan_gain /* i : non diegetic panning gain */
+#endif
)
{
Decoder_Struct *st_ivas;
@@ -412,7 +479,8 @@ ivas_error IVAS_DEC_Configure(
return IVAS_ERR_WRONG_PARAMS;
}
- if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && outputFormat != IVAS_DEC_OUTPUT_MONO )
+ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && !( ( outputFormat == IVAS_DEC_OUTPUT_MONO && Opt_non_diegetic_pan == 0 ) ||
+ ( outputFormat == IVAS_DEC_OUTPUT_STEREO && Opt_non_diegetic_pan == 1 ) ) )
{
return IVAS_ERR_WRONG_MODE;
}
@@ -442,8 +510,16 @@ ivas_error IVAS_DEC_Configure(
hDecoderConfig->Opt_LsCustom = customLsOutputEnabled;
hDecoderConfig->Opt_Headrotation = enableHeadRotation;
+#ifdef FIX_439_OTR_PARAMS
+ hDecoderConfig->orientation_tracking = orientation_tracking;
+#endif
hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled;
hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled;
+ hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan;
+ hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ hDecoderConfig->Opt_delay_comp = delayCompensationEnabled;
+#endif
#ifdef EXTERNAL_ORIENTATIONS
hDecoderConfig->Opt_ExternalOrientation = enableExternalOrientation;
#endif
@@ -472,7 +548,11 @@ ivas_error IVAS_DEC_Configure(
*---------------------------------------------------------------------*/
ivas_error IVAS_DEC_EnableVoIP(
- IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+#ifdef VARIABLE_SPEED_DECODING
+ const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */
+ const uint16_t speedFac, /* i : speed factor for variable speed */
+#endif
const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */
const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */
)
@@ -482,21 +562,42 @@ ivas_error IVAS_DEC_EnableVoIP(
error = IVAS_ERR_OK;
+#ifndef JBM_TSM_ON_TCS
/* initialize time scaler and FIFO after time scaler */
uint16_t wss, css;
+#endif
if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
-
hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig;
hIvasDec->Opt_VOIP = 1;
+#ifdef JBM_TSM_ON_TCS
+ hDecoderConfig->voip_active = 1;
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ if ( hDecoderConfig->output_config != AUDIO_CONFIG_EXTERNAL )
+ {
+#endif
+ hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config );
+
+#ifdef JBM_TSM_ON_TCS
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ else
+ {
+ hDecoderConfig->nchan_out = 1;
+ }
+#endif
+#endif
- hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config );
+#ifndef JBM_TSM_ON_TCS
assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" );
+#endif
if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK )
{
@@ -510,13 +611,32 @@ ivas_error IVAS_DEC_EnableVoIP(
hIvasDec->hVoIP->lastDecodedWasActive = 0;
hIvasDec->hVoIP->hCurrentDataUnit = NULL;
+#ifdef VARIABLE_SPEED_DECODING
+ hIvasDec->hVoIP->voipMode = voipMode;
+ hIvasDec->hVoIP->speedFac = speedFac;
+ hIvasDec->hVoIP->needNewFrame = false;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+ hIvasDec->hVoIP->nSamplesAvailableNext = 0;
+ hIvasDec->hVoIP->rendererType = JBM_RENDERER_NONE;
+ hIvasDec->hVoIP->hFifoOut = NULL;
+#else
hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->nchan_out / FRAMES_PER_SEC );
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ /* postpone init of the buffers until we know the real number of TCs*/
+ hIvasDec->hVoIP->apaExecBuffer = NULL;
+ hIvasDec->hVoIP->nTransportChannelsOld = 0;
+#else
hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( int16_t ) * APA_BUF_PER_CHANNEL * hDecoderConfig->nchan_out );
if ( hIvasDec->hVoIP->apaExecBuffer == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" );
}
+#endif
#define WMC_TOOL_SKIP
/* Bitstream conversion is not counted towards complexity and memory usage */
@@ -529,15 +649,23 @@ ivas_error IVAS_DEC_EnableVoIP(
}
/* initialize JBM */
- if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK )
- {
- return error;
- }
- if ( ( error = JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) ) != IVAS_ERR_OK )
+#ifdef VARIABLE_SPEED_DECODING
+ hIvasDec->hVoIP->hJBM = NULL;
+ if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP )
{
- return error;
+#endif
+ if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ if ( JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) != 0 )
+ {
+ return IVAS_ERR_FAILED_ALLOC;
+ }
+#ifdef VARIABLE_SPEED_DECODING
}
-
+#endif
+#ifndef JBM_TSM_ON_TCS
if ( hDecoderConfig->output_Fs == 8000 )
{
wss = 1;
@@ -562,8 +690,37 @@ ivas_error IVAS_DEC_EnableVoIP(
{
return IVAS_ERR_INIT_ERROR;
}
+#endif
- if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->nchan_out ) != IVAS_ERR_OK ||
+#ifdef JBM_TSM_ON_TCS
+ /* postpone init of time scaler and output FIFO until we know the real number of TCs */
+ hIvasDec->hVoIP->hTimeScaler = NULL;
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ hIvasDec->hVoIP->needNewFrame = true;
+ }
+#endif
+#else
+#ifdef VARIABLE_SPEED_DECODING
+ {
+ float startQuality = hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f;
+ if ( apa_init( &hIvasDec->hVoIP->hTimeScaler,
+ hDecoderConfig->nchan_out ) != IVAS_ERR_OK ||
+ apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 ||
+ apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 ||
+ apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 ||
+ pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoAfterTimeScaler ) != 0 ||
+ pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoAfterTimeScaler, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+ /* we instantly need a new frame */
+ hIvasDec->hVoIP->needNewFrame = true;
+ }
+#else
+ if ( apa_init( &hIvasDec->hVoIP->hTimeScaler,
+ hDecoderConfig->nchan_out ) != IVAS_ERR_OK ||
apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 ||
apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 ||
apa_set_quality( hIvasDec->hVoIP->hTimeScaler, 1, 4, 4 ) != 0 ||
@@ -572,6 +729,8 @@ ivas_error IVAS_DEC_EnableVoIP(
{
return IVAS_ERR_INIT_ERROR;
}
+#endif
+#endif
return error;
}
@@ -660,6 +819,13 @@ ivas_error IVAS_DEC_FeedFrame_Serial(
st->use_partial_copy = 1;
}
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ hIvasDec->hVoIP->needNewFrame = false;
+ }
+#endif
+
return error;
}
@@ -692,7 +858,11 @@ ivas_error IVAS_DEC_GetSamples(
if ( hIvasDec->mode == IVAS_DEC_MODE_EVS )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = evs_dec_main( st_ivas, *nOutSamples, NULL, pcmBuf ) ) != IVAS_ERR_OK )
+#else
if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -717,6 +887,227 @@ ivas_error IVAS_DEC_GetSamples(
}
+#ifdef JBM_TSM_ON_TCS
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_Setup( )
+ *
+ * Main function to decode to PCM data of the transport channels
+ *---------------------------------------------------------------------*/
+
+static ivas_error IVAS_DEC_Setup(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ uint16_t *nTcBufferGranularity, /* o : granularity of the TC Buffer */
+ uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */
+ uint8_t *nOutChannels, /* o : number of decoded out channels (PCM or CLDFB) */
+ uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame */
+ int16_t *data /* o : flushed samples */
+)
+{
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ *nSamplesRendered = 0;
+
+ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS )
+ {
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ if ( hIvasDec->st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN;
+ *nOutChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN;
+ }
+ else
+ {
+#endif
+ *nTransportChannels = 1;
+ *nOutChannels = 1;
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ }
+#endif
+ }
+ else
+ {
+ Decoder_Struct *st_ivas;
+
+ st_ivas = hIvasDec->st_ivas;
+
+ /*----------------------------------------------------------------*
+ * IVAS decoder setup
+ * - read IVAS format signaling
+ * - read IVAS format specific signaling
+ * - initialize decoder in the first frame based on IVAS format and number of transport channels
+ * - reconfigure the decoder when the number of TC or IVAS total bitrate change
+ *----------------------------------------------------------------*/
+
+ if ( st_ivas->bfi == 0 )
+ {
+ if ( ( error = ivas_dec_setup( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ *nTransportChannels = (uint8_t) st_ivas->hTcBuffer->nchan_transport_jbm;
+ *nTcBufferGranularity = (uint16_t) st_ivas->hTcBuffer->n_samples_granularity;
+ *nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out;
+ }
+
+ return error;
+}
+
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_GetTcSamples( )
+ *
+ * Main function to decode to PCM data of the transport channels
+ *---------------------------------------------------------------------*/
+
+ivas_error IVAS_DEC_GetTcSamples(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ float *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
+ int16_t *nOutSamples /* o : number of samples per channel written to output buffer */
+)
+{
+ Decoder_Struct *st_ivas;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
+ {
+ return IVAS_ERR_UNEXPECTED_NULL_POINTER;
+ }
+
+ st_ivas = hIvasDec->st_ivas;
+
+ *nOutSamples = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+
+ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS )
+ {
+ if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf, NULL ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else if ( hIvasDec->mode == IVAS_DEC_MODE_IVAS )
+ {
+ /* run the main IVAS decoding routine */
+ if ( ( error = ivas_jbm_dec_tc( st_ivas, pcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */
+ }
+
+ if ( hIvasDec->hasBeenFedFirstGoodFrame )
+ {
+ hIvasDec->hasDecodedFirstGoodFrame = true;
+ }
+
+ return error;
+}
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_Rendered_FeedTcSamples( )
+ *
+ * Main function to decode to PCM data of the transport channels
+ *---------------------------------------------------------------------*/
+
+ivas_error IVAS_DEC_RendererFeedTcSamples(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */
+ const int16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */
+ int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/
+ float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
+)
+{
+ Decoder_Struct *st_ivas;
+
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
+ {
+ return IVAS_ERR_UNEXPECTED_NULL_POINTER;
+ }
+
+ st_ivas = hIvasDec->st_ivas;
+
+ /* feed the TCs to the IVAS renderer */
+ if ( ( error = ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesForRendering, nSamplesResidual, pcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ return error;
+}
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_GetRenderedSamples( )
+ *
+ * Main function to decode to PCM data of the transport channels
+ *---------------------------------------------------------------------*/
+
+ivas_error IVAS_DEC_GetRenderedSamples(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */
+ const uint16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */
+ uint16_t *nSamplesRendered, /* o : number of samples rendered */
+ uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the renerer pipeline */
+ int16_t *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
+)
+{
+ Decoder_Struct *st_ivas;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
+ {
+ return IVAS_ERR_UNEXPECTED_NULL_POINTER;
+ }
+
+ st_ivas = hIvasDec->st_ivas;
+
+ /* run the main IVAS decoding routine */
+ if ( ( error = ivas_jbm_dec_render( st_ivas, nSamplesForRendering, nSamplesRendered, nSamplesAvailableNext, pcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+
+ return error;
+}
+
+ivas_error IVAS_DEC_GetBufferedNumberOfSamples(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */
+ int16_t *nSamplesBuffered /* o : number of samples still buffered */
+)
+{
+ ivas_error error;
+ error = IVAS_ERR_OK;
+
+ *nSamplesBuffered = 0;
+ if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
+ {
+ return IVAS_ERR_UNEXPECTED_NULL_POINTER;
+ }
+#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER
+ /* check if the TC buffer already exists, otherweise nothing is buffered anyway */
+ if ( hIvasDec->st_ivas->hTcBuffer != NULL )
+ {
+#endif
+ *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered;
+#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER
+ }
+#endif
+
+ return error;
+}
+#endif
+
+
/*---------------------------------------------------------------------*
* IVAS_DEC_GetNumObjects( )
*
@@ -834,23 +1225,23 @@ ivas_error IVAS_DEC_GetObjectMetadata(
{
metadata->azimuth = 0.f;
metadata->elevation = 0.f;
- metadata->radius = 0.f;
+ metadata->radius = 1.f;
metadata->spread = 0.f;
metadata->gainFactor = 1.f;
+ metadata->yaw = 0.f;
+ metadata->pitch = 0.f;
+ metadata->non_diegetic_flag = 0;
}
else
{
metadata->azimuth = hIsmMeta->azimuth;
metadata->elevation = hIsmMeta->elevation;
-#ifdef TD5
metadata->radius = hIsmMeta->radius;
metadata->yaw = hIsmMeta->yaw;
metadata->pitch = hIsmMeta->pitch;
-#else
- metadata->radius = 0.f;
-#endif
metadata->spread = 0.f;
metadata->gainFactor = 1.f;
+ metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag;
}
return IVAS_ERR_OK;
@@ -864,12 +1255,8 @@ ivas_error IVAS_DEC_GetObjectMetadata(
*---------------------------------------------------------------------*/
ivas_error IVAS_DEC_GetMasaMetadata(
- IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
-#ifdef FIX_350_MASA_DELAY_COMP
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */
-#else
- IVAS_MASA_QMETADATA_HANDLE *hMasaMetadata /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */
-#endif
)
{
if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
@@ -882,11 +1269,7 @@ ivas_error IVAS_DEC_GetMasaMetadata(
return IVAS_ERR_WRONG_MODE;
}
-#ifdef FIX_350_MASA_DELAY_COMP
*hMasaExtOutMeta = hIvasDec->st_ivas->hMasa->data.extOutMeta;
-#else
- *hMasaMetadata = hIvasDec->st_ivas->hQMetaData;
-#endif
return IVAS_ERR_OK;
}
@@ -898,23 +1281,15 @@ ivas_error IVAS_DEC_GetMasaMetadata(
*---------------------------------------------------------------------*/
ivas_error IVAS_DEC_FeedHeadTrackData(
- IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
-#ifdef TD5
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
IVAS_QUATERNION *orientation, /* i : head-tracking data, listener orientation */
- IVAS_POSITION *Pos /* i : listener position */
-#else
- IVAS_QUATERNION *orientation /* i : head-tracking data, listener orientation */
-#endif
+ IVAS_VECTOR3 *Pos /* i : listener position */
)
{
HEAD_TRACK_DATA_HANDLE hHeadTrackData;
int16_t i;
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || orientation == NULL )
-#else
- if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
-#endif
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
@@ -929,7 +1304,6 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
/* Move head-tracking data to the decoder handle */
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
/* check for Euler angle signaling */
if ( orientation[i].w == -3.0f )
{
@@ -937,17 +1311,9 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
}
ivas_orient_trk_Process( hHeadTrackData->OrientationTracker, orientation[i], FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hHeadTrackData->Quaternions[i] );
-#else
- hHeadTrackData->Quaternions[i].w = orientation[i].w;
- hHeadTrackData->Quaternions[i].x = orientation[i].x;
- hHeadTrackData->Quaternions[i].y = orientation[i].y;
- hHeadTrackData->Quaternions[i].z = orientation[i].z;
-#endif
-#ifdef TD5
hHeadTrackData->Pos[i].x = Pos[i].x;
hHeadTrackData->Pos[i].y = Pos[i].y;
hHeadTrackData->Pos[i].z = Pos[i].z;
-#endif
}
hIvasDec->st_ivas->hHeadTrackData->num_quaternions = 0;
@@ -955,7 +1321,6 @@ ivas_error IVAS_DEC_FeedHeadTrackData(
return IVAS_ERR_OK;
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*---------------------------------------------------------------------*
* IVAS_DEC_FeedRefRotData( )
*
@@ -984,7 +1349,6 @@ ivas_error IVAS_DEC_FeedRefRotData(
return IVAS_ERR_OK;
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/*---------------------------------------------------------------------*
* IVAS_DEC_FeedRefVectorData( )
*
@@ -1009,8 +1373,6 @@ ivas_error IVAS_DEC_FeedRefVectorData(
pOtr = hIvasDec->st_ivas->hHeadTrackData->OrientationTracker;
return ivas_orient_trk_SetReferenceVector( pOtr, listenerPos, refPos );
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
#ifdef EXTERNAL_ORIENTATIONS
/*---------------------------------------------------------------------*
@@ -1240,9 +1602,7 @@ ivas_error IVAS_DEC_GetRenderConfig(
mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX );
mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX );
mvr2r( hRCin->roomAcoustics.pAcoustic_dsr, hRCout->room_acoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX );
-#ifdef TD5
mvr2r( hRCin->directivity, hRCout->directivity, 3 );
-#endif
return IVAS_ERR_OK;
}
@@ -1287,9 +1647,7 @@ ivas_error IVAS_DEC_FeedRenderConfig(
mvr2r( renderConfig.room_acoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX );
mvr2r( renderConfig.room_acoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX );
mvr2r( renderConfig.room_acoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX );
-#ifdef TD5
mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 );
-#endif
return IVAS_ERR_OK;
}
@@ -1324,12 +1682,16 @@ ivas_error IVAS_DEC_GetDelay(
st_ivas = hIvasDec->st_ivas;
hDecoderConfig = st_ivas->hDecoderConfig;
-#ifdef BINAURALIZATION_DELAY_REPORT
nSamples[1] = NS2SA( hDecoderConfig->output_Fs, get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) );
nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f );
nSamples[0] = nSamples[1] + nSamples[2];
-#else
- *nSamples = (int16_t) roundf( (float) get_delay( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0], st_ivas->binaural_latency_ns ) * hDecoderConfig->output_Fs / 1000000000.f );
+
+#ifdef FIX_MASA_DELAY_PRINTOUT
+ if ( st_ivas->ivas_format == MASA_FORMAT )
+ {
+ /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */
+ nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS );
+ }
#endif
*timeScale = hDecoderConfig->output_Fs;
@@ -1523,6 +1885,29 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
return IVAS_ERR_OK;
}
+#ifdef VARIABLE_SPEED_DECODING
+#ifdef DEBUGGING
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_VoIP_SetScale( )
+ *
+ * Set the TSM scale
+ *---------------------------------------------------------------------*/
+
+ivas_error IVAS_DEC_VoIP_SetScale(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ const int16_t scale /* i : TSM scale to set */
+)
+{
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+ hIvasDec->hVoIP->speedFac = scale;
+
+ return error;
+}
+#endif
+#endif
/*---------------------------------------------------------------------*
* IVAS_DEC_VoIP_GetSamples( )
@@ -1535,11 +1920,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */
int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
const uint32_t systemTimestamp_ms /* i : current system timestamp */
+#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING )
+ ,
+ uint16_t *sampleAvailableNext /* o : samples available for the next call */
+#endif
#ifdef SUPPORT_JBM_TRACEFILE
,
JbmTraceFileWriterFn jbmWriterFn,
void *jbmWriter
#endif
+
)
{
Decoder_Struct *st_ivas;
@@ -1553,6 +1943,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
int16_t timeScalingDone;
int16_t result;
ivas_error error;
+#ifdef JBM_TSM_ON_TCS
+ int16_t nSamplesRendered;
+ uint16_t nSamplesTcsScaled;
+ uint8_t nTransportChannels;
+ uint8_t nOutChannels;
+#endif
error = IVAS_ERR_OK;
@@ -1561,133 +1957,508 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
hVoIP = hIvasDec->hVoIP;
timeScalingDone = 0;
- /* TODO(mcjbm): ringbuffer capacity should be configurable by user */
+#ifdef JBM_TSM_ON_TCS
+ nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out;
+ nTransportChannels = 0;
+ nSamplesTcsScaled = hVoIP->nSamplesFrame;
+ nSamplesRendered = 0;
+#endif
+#ifdef VARIABLE_SPEED_DECODING
+ scale = hVoIP->speedFac;
+ maxScaling = hVoIP->speedFac;
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ if ( ( hVoIP->hFifoOut != NULL && nSamplesPerChannel > hVoIP->hFifoOut->capacity ) || nSamplesPerChannel == 0 )
+#else
if ( nSamplesPerChannel > hVoIP->hFifoAfterTimeScaler->capacity || nSamplesPerChannel == 0 )
+#endif
{
return IVAS_ERR_WRONG_PARAMS;
}
/* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */
+#ifdef JBM_TSM_ON_TCS
+ while ( ( hVoIP->hFifoOut != NULL && pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) < nSamplesPerChannel ) || ( hVoIP->hFifoOut == NULL && nSamplesRendered < nSamplesPerChannel ) )
+#else
while ( pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) < nSamplesPerChannel )
+#endif
{
- extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler );
- extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs;
- dataUnit = NULL;
- /* pop one access unit from the jitter buffer */
- result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling );
- if ( result != 0 )
+#ifdef DEBUGGING
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame )
{
- return IVAS_ERR_UNKNOWN;
+ /* we need another bs frame fed into the decoder...*/
+ *sampleAvailableNext = 0;
+ return IVAS_ERR_VS_FRAME_NEEDED;
}
+#endif
+#endif
- maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000;
- /* avoid time scaling multiple times in one sound card slot */
- if ( scale != 100U )
+#ifdef JBM_TSM_ON_TCS
+ if ( hVoIP->nSamplesAvailableNext == 0 )
{
- if ( timeScalingDone )
+ if ( hVoIP->hFifoOut )
{
- scale = 100;
+ extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut );
+ nSamplesRendered = extBufferedSamples;
}
else
{
- timeScalingDone = 1;
+ int16_t nSamplesBuffered;
+ nSamplesBuffered = 0;
+#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER
+ if ( hIvasDec->hasDecodedFirstGoodFrame )
+#else
+ if ( hIvasDec->hasBeenFedFirstGoodFrame )
+#endif
+ {
+ IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered );
+ }
+ extBufferedSamples = nSamplesRendered + nSamplesBuffered;
}
- }
+#else
+ extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler );
+#endif
+ extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs;
- /* copy bitstream into decoder state */
- if ( dataUnit )
- {
- hIvasDec->hVoIP->hCurrentDataUnit = dataUnit;
+ dataUnit = NULL;
- bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize );
- IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 );
- }
- else if ( hIvasDec->hasDecodedFirstGoodFrame )
- {
- /* Decoder has been initialized with first good frame - do PLC */
- IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 );
- }
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP )
+ {
+#endif
+ /* pop one access unit from the jitter buffer */
+ result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling );
+ if ( result != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ }
+ else if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ scale = hVoIP->speedFac;
+ maxScaling = hVoIP->speedFac;
+ }
+#ifdef DEBUGGING
+ else
+ {
+ assert( "Wrong VoIP mode!\n" && 0 );
+ }
+#endif
+#endif
- /* decode */
- if ( !hIvasDec->hasBeenFedFirstGoodFrame )
- {
- /* codec mode to use not known yet - simply output silence */
+ maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000;
+ /* avoid time scaling multiple times in one sound card slot */
+ if ( scale != 100U )
+ {
+ if ( timeScalingDone )
+ {
+ scale = 100;
+ }
+ else
+ {
+ timeScalingDone = 1;
+ }
+ }
+
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP )
+ {
+#endif
+ /* copy bitstream into decoder state */
+ if ( dataUnit )
+ {
+ hIvasDec->hVoIP->hCurrentDataUnit = dataUnit;
+
+ bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize );
+ IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 );
+ }
+ else if ( hIvasDec->hasDecodedFirstGoodFrame )
+ {
+ /* Decoder has been initialized with first good frame - do PLC */
+ IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 );
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ }
+#endif
+
+ /* decode */
+ if ( !hIvasDec->hasBeenFedFirstGoodFrame )
+ {
+ /* codec mode to use not known yet - simply output silence */
+#ifdef JBM_TSM_ON_TCS
+ nSamplesTcsScaled = hVoIP->nSamplesFrame;
+ if ( hVoIP->hFifoOut != NULL )
+ {
+#ifdef DEBUGGING
+ /* feed zeros to FIFO */
+ if ( pcmdsp_fifo_write_zero( hVoIP->hFifoOut, nSamplesTcsScaled ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+#endif
+ }
+ else
+ {
+ /* directly set output zero */
+ set_s( pcmBuf, 0, nSamplesPerChannel * nOutChannels );
+ }
+ nSamplesRendered = nSamplesTcsScaled;
+#else
set_s( hVoIP->apaExecBuffer, 0, hVoIP->nSamplesFrame ); /* TODO(mcjbm): Could be optimized: just write directly to output buffer */
- }
- else
- {
+#endif
+ }
+ else
+ {
+#ifdef JBM_TSM_ON_TCS
+ uint16_t l_ts = 1;
+ uint16_t nSamplesRendered_loop;
+
+ /* setup ivas decoder and get the number of TCs */
+ /* might render some remaining samples from the previous frame too if the renderer granularity changed */
+ if ( hVoIP->hFifoOut )
+ {
+ int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100];
+ if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, rendererPcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+ }
+ else
+ {
+ if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ nSamplesRendered += nSamplesRendered_loop;
+ if ( nTransportChannels != hVoIP->nTransportChannelsOld )
+ {
+ IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts );
+ }
+
+ /* decode TCs only */
+ if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+#else
if ( ( error = IVAS_DEC_GetSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK )
{
return error;
}
+#endif
+ }
+
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP )
+ {
+#endif
+ if ( dataUnit )
+ {
+ if ( dataUnit->partial_frame != 0 )
+ {
+ hVoIP->lastDecodedWasActive = 1;
+ }
+ else
+ {
+ hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator;
+ }
+ /* data unit memory is no longer used */
+ JB4_FreeDataUnit( hVoIP->hJBM, dataUnit );
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ }
+ else
+ {
+ hVoIP->lastDecodedWasActive = 1;
+ }
+#endif
+
+ /* limit scale to range supported by time scaler */
+ if ( scale < APA_MIN_SCALE )
+ {
+ scale = APA_MIN_SCALE;
+ }
+ else if ( scale > APA_MAX_SCALE )
+ {
+ scale = APA_MAX_SCALE;
+ }
+
+ /* apply time scaling on decoded/concealed samples */
+#ifdef JBM_TSM_ON_TCS
+ if ( hIvasDec->hasBeenFedFirstGoodFrame )
+ {
+#endif
+ if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+#ifdef JBM_TSM_ON_TCS
+ result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame * nTransportChannels, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples );
+#else
+ result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples );
+#endif
+ if ( result != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+ assert( nTimeScalerOutSamples <= APA_BUF );
+
+#ifdef JBM_TSM_ON_TCS
+ nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels;
+#else
+ /* append scaled samples to FIFO */
+ if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ int16_t nSamplesAvailable = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler );
+ if ( nSamplesAvailable < nSamplesPerChannel )
+ {
+ hVoIP->needNewFrame = true;
+ }
+ }
+#endif
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE )
+ {
+ /* render IVAS frames */
+ int16_t nResidualSamples;
+
+ if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hVoIP->apaExecBuffer ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ /* feed residual samples to TSM for the next call */
+ if ( apa_set_renderer_residual_samples( hVoIP->hTimeScaler, (uint16_t) nResidualSamples ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+ }
+ else
+ {
+ /* inplace float->int16_t conversion*/
+#ifdef DEBUGGING
+ st_ivas->noClipping +=
+#endif
+ syn_output( hVoIP->apaExecBuffer, nTimeScalerOutSamples, (int16_t *) hVoIP->apaExecBuffer );
+
+ if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) hVoIP->apaExecBuffer, nSamplesTcsScaled ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
+ nSamplesRendered = nSamplesTcsScaled;
+ }
+ }
+#endif
+#ifdef SUPPORT_JBM_TRACEFILE
+ /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */
+ if ( jbmWriterFn != NULL && jbmWriter != NULL )
+ {
+ /* write JBM trace data entry */
+ store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs );
+ if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK )
+ {
+ fprintf( stderr, "\nError writing JBM Trace data to file\n" );
+ return IVAS_ERR_UNKNOWN;
+ }
+ }
+#endif
+#ifdef JBM_TSM_ON_TCS
}
- if ( dataUnit )
+ if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE )
{
- if ( dataUnit->partial_frame != 0 )
+ uint16_t nSamplesRendered_loop;
+ int16_t nSamplesToRender;
+ if ( hVoIP->hFifoOut )
{
- hVoIP->lastDecodedWasActive = 1;
+ int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100];
+
+ nSamplesToRender = nSamplesPerChannel - pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut );
+
+ /* render IVAS frames */
+ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 )
+ {
+ return IVAS_ERR_UNKNOWN;
+ }
}
else
{
- hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator;
+ nSamplesToRender = nSamplesPerChannel - nSamplesRendered;
+
+ /* render IVAS frames directly to the output buffer */
+ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
}
- /* data unit memory is no longer used */
- JB4_FreeDataUnit( hVoIP->hJBM, dataUnit );
- }
- /* limit scale to range supported by time scaler */
- if ( scale < APA_MIN_SCALE )
+ nSamplesRendered += nSamplesRendered_loop;
+
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 )
+ {
+ hVoIP->needNewFrame = true;
+ }
+#endif
+ }
+ else if ( !hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->hFifoOut == NULL )
{
- scale = APA_MIN_SCALE;
+ hVoIP->nSamplesAvailableNext = 0;
}
- else if ( scale > APA_MAX_SCALE )
+ else
{
- scale = APA_MAX_SCALE;
+ hVoIP->nSamplesAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) - nSamplesPerChannel );
+
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel )
+ {
+ hVoIP->needNewFrame = true;
+ }
+#endif
+
+ hVoIP->nSamplesAvailableNext = 0;
}
+#endif
+ }
- /* apply time scaling on decoded/concealed samples */
- if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 )
+ /* fetch a user-specified number of samples from FIFO */
+#if defined( JBM_TSM_ON_TCS )
+ if ( hVoIP->hFifoOut )
+ {
+ if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 )
+#else
+ if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 )
+#endif
{
return IVAS_ERR_UNKNOWN;
}
- result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples );
- if ( result != 0 )
+#ifdef JBM_TSM_ON_TCS
+ }
+#endif
+
+#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING )
+#ifdef JBM_TSM_ON_TCS
+ *sampleAvailableNext = hVoIP->nSamplesAvailableNext;
+#else
+ *sampleAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) );
+#ifdef VARIABLE_SPEED_DECODING
+ if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ if ( *sampleAvailableNext < nSamplesPerChannel )
+ {
+ hVoIP->needNewFrame = true;
+ }
+ }
+#endif
+#endif
+#endif
+
+ return error;
+}
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_VoIP_Flush( )
+ *
+ * Function to flush remaining audio in VoIP
+ *---------------------------------------------------------------------*/
+
+#if defined( VARIABLE_SPEED_DECODING ) || defined( JBM_TSM_ON_TCS )
+ivas_error IVAS_DEC_VoIP_Flush(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */
+ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
+ uint16_t *nSamplesAvailableNext, /* o : number of samples still available */
+ int16_t *nSamplesFlushed /* o : number of samples flushed */
+)
+{
+ ivas_error error;
+ IVAS_DEC_VOIP *hVoIP;
+#ifdef JBM_TSM_ON_TCS
+ int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100];
+ uint16_t nSamplesToRender;
+ uint16_t nSamplesFlushedLocal;
+#endif
+
+ error = IVAS_ERR_OK;
+
+ hVoIP = hIvasDec->hVoIP;
+#if defined( JBM_TSM_ON_TCS )
+ *nSamplesFlushed = min( nSamplesPerChannel, hVoIP->nSamplesAvailableNext );
+#else
+ *nSamplesFlushed = min( nSamplesPerChannel, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) );
+#endif
+
+#ifdef JBM_TSM_ON_TCS
+ if ( hVoIP->rendererType == JBM_RENDERER_NONE )
+ {
+#endif
+ /* fetch a user-specified number of samples from FIFO */
+#if defined( JBM_TSM_ON_TCS )
+ if ( pcmdsp_fifo_read( hVoIP->hFifoOut, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 )
+#else
+ if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 )
+#endif
{
return IVAS_ERR_UNKNOWN;
}
- assert( nTimeScalerOutSamples <= APA_BUF );
+#if defined( JBM_TSM_ON_TCS )
+ hVoIP->nSamplesAvailableNext -= *nSamplesFlushed;
+ *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext;
+#else
+ *nSamplesAvailableNext = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler );
+#endif
+#ifdef JBM_TSM_ON_TCS
+ }
+ else
+ {
+ nSamplesToRender = (uint16_t) *nSamplesFlushed;
+ /* render IVAS frames */
+ if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
- /* append scaled samples to FIFO */
- if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 )
+ if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesFlushedLocal ) != 0 )
{
return IVAS_ERR_UNKNOWN;
}
-#ifdef SUPPORT_JBM_TRACEFILE
- /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */
- if ( jbmWriterFn != NULL && jbmWriter != NULL )
+ if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesFlushedLocal, (uint8_t *) pcmBuf ) != 0 )
{
- /* write JBM trace data entry */
- store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs );
- if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK )
- {
- fprintf( stderr, "\nError writing JBM Trace data to file\n" );
- return IVAS_ERR_UNKNOWN;
- }
+ return IVAS_ERR_UNKNOWN;
}
-#endif
- }
- /* fetch a user-specified number of samples from FIFO */
- if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 )
- {
- return IVAS_ERR_UNKNOWN;
+ *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext;
+ *nSamplesFlushed = (int16_t) nSamplesFlushedLocal;
}
+#endif
return error;
}
+#endif
/*---------------------------------------------------------------------*
@@ -1698,9 +2469,17 @@ ivas_error IVAS_DEC_VoIP_GetSamples(
bool IVAS_DEC_VoIP_IsEmpty(
IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ const int16_t nSamplesAsked
+#endif
)
{
+#ifdef JBM_TSM_ON_TCS
+ return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->hVoIP->nSamplesAvailableNext < nSamplesAsked ) );
+#else
return JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0;
+#endif
}
@@ -1741,7 +2520,11 @@ static void IVAS_DEC_Close_VoIP(
apa_exit( &hVoIP->hTimeScaler );
+#ifdef JBM_TSM_ON_TCS
+ pcmdsp_fifo_destroy( &hVoIP->hFifoOut );
+#else
pcmdsp_fifo_destroy( &hVoIP->hFifoAfterTimeScaler );
+#endif
if ( hVoIP->apaExecBuffer != NULL )
{
@@ -1838,59 +2621,7 @@ const char *IVAS_DEC_GetErrorMessage(
ivas_error error /* i : decoder error code enum */
)
{
- switch ( error )
- {
- case IVAS_ERR_OK:
- return "no error";
- case IVAS_ERR_FAILED_ALLOC:
- return "Failed allocation error";
- case IVAS_ERR_WRONG_PARAMS:
- return "wrong parameters";
- case IVAS_ERR_INIT_ERROR:
- return "initialization error";
- case IVAS_ERR_INVALID_BITSTREAM:
- return "Invalid bitstream";
- case IVAS_ERR_DECODER_ERROR:
- return "decoder error";
- case IVAS_ERR_WRONG_MODE:
- return "wrong mode";
- case IVAS_ERR_INVALID_OUTPUT_FORMAT:
- return "invalid output format";
- case IVAS_ERR_INVALID_SAMPLING_RATE:
- return "invalid sampling rate";
- case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED:
- return "head rotation not supported";
-#ifdef EXTERNAL_ORIENTATIONS
- case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED:
- return "external orientation not supported";
-#endif
- case IVAS_ERR_INVALID_HRTF:
- return "Not supported HRTF filter set";
- case IVAS_ERR_INVALID_INPUT_FORMAT:
- return "invalid format of input bitstream";
- case IVAS_ERR_INVALID_INDEX:
- return "invalid index";
- case IVAS_ERR_INTERNAL:
- case IVAS_ERR_INTERNAL_FATAL:
- return "internal error";
- case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED:
- return "reconfigure not supported";
- case IVAS_ERR_UNEXPECTED_NULL_POINTER:
- return "unexpected NULL pointer";
-#ifdef DEBUGGING
- case IVAS_ERR_INVALID_FORCE_MODE:
- return "invalid force mode";
-#endif
- case IVAS_ERR_FAILED_FILE_READ:
- return "could not read from file";
- case IVAS_ERR_NOT_IMPLEMENTED:
- return "not implemented";
- case IVAS_ERR_UNKNOWN:
- default:
- break;
- }
-
- return "unknown error";
+ return ivas_error_to_string( error );
}
@@ -2021,12 +2752,20 @@ static ivas_error printConfigInfo_dec(
}
/*-----------------------------------------------------------------*
- * Print number of output configuration
+ * Print output configuration
*-----------------------------------------------------------------*/
if ( st_ivas->ivas_format == MONO_FORMAT )
{
- fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" );
+ if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan )
+ {
+ fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" );
+ fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f );
+ }
+ else
+ {
+ fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" );
+ }
}
else
{
@@ -2065,6 +2804,7 @@ static ivas_error printConfigInfo_dec(
fprintf( stdout, "Input configuration: %s\n", config_str );
}
}
+
get_channel_config( st_ivas->hDecoderConfig->output_config, &config_str[0] );
fprintf( stdout, "Output configuration: %s\n", config_str );
@@ -2089,8 +2829,66 @@ static ivas_error printConfigInfo_dec(
fprintf( stdout, "External orientation: ON\n" );
}
#endif
+
+#ifdef FIX_439_OTR_PARAMS
+ if ( st_ivas->hDecoderConfig->orientation_tracking != HEAD_ORIENT_TRK_NONE )
+ {
+ switch ( st_ivas->hDecoderConfig->orientation_tracking )
+ {
+ case HEAD_ORIENT_TRK_AVG:
+ fprintf( stdout, "Orientation tracking: AVG\n" );
+ break;
+ case HEAD_ORIENT_TRK_REF:
+ fprintf( stdout, "Orientation tracking: REF\n" );
+ break;
+ case HEAD_ORIENT_TRK_REF_VEC:
+ fprintf( stdout, "Orientation tracking: REF_VEC\n" );
+ break;
+ case HEAD_ORIENT_TRK_REF_VEC_LEV:
+ fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" );
+ break;
+ default:
+ break;
+ }
+ }
+#else
+ if ( st_ivas->hDecoderConfig->orientation_tracking != IVAS_ORIENT_TRK_NONE )
+ {
+ switch ( st_ivas->hDecoderConfig->orientation_tracking )
+ {
+ case IVAS_ORIENT_TRK_AVG:
+ fprintf( stdout, "Orientation tracking: AVG\n" );
+ break;
+ case IVAS_ORIENT_TRK_REF:
+ fprintf( stdout, "Orientation tracking: REF\n" );
+ break;
+ case IVAS_ORIENT_TRK_REF_VEC:
+ fprintf( stdout, "Orientation tracking: REF_VEC\n" );
+ break;
+ case IVAS_ORIENT_TRK_REF_VEC_LEV:
+ fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" );
+ break;
+ }
+ }
+#endif
+
+ if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan )
+ {
+ fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f );
+ }
}
+#ifdef JBM_TSM_ON_TCS
+ /*-----------------------------------------------------------------*
+ * Print VoIP mode info
+ *-----------------------------------------------------------------*/
+
+ if ( st_ivas->hDecoderConfig->voip_active )
+ {
+ fprintf( stdout, "VoIP mode: ON\n" );
+ }
+#endif
+
return IVAS_ERR_OK;
}
@@ -2189,10 +2987,18 @@ void IVAS_DEC_PrintDisclaimer( void )
static ivas_error evs_dec_main(
Decoder_Struct *st_ivas,
const int16_t nOutSamples,
+#ifdef JBM_TSM_ON_TCS
+ float *floatBuf,
+#endif
int16_t *pcmBuf )
{
DEC_CORE_HANDLE *hCoreCoder;
- float output[L_FRAME48k];
+ float output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN][L_FRAME48k];
+ float mixer_left, mixer_rigth;
+#ifdef JBM_TSM_ON_TCS
+ float *p_output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN];
+ int16_t ch;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -2202,19 +3008,26 @@ static ivas_error evs_dec_main(
mdct_switching_dec( hCoreCoder[0] );
+#ifdef JBM_TSM_ON_TCS
+ for ( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ )
+ {
+ p_output[ch] = output[ch];
+ }
+#endif
+
/* run the main EVS decoding routine */
if ( hCoreCoder[0]->codec_mode == MODE1 )
{
if ( hCoreCoder[0]->Opt_AMR_WB )
{
- if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output ) ) != IVAS_ERR_OK )
+ if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0] ) ) != IVAS_ERR_OK )
{
return error;
}
}
else
{
- if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK )
+ if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -2224,21 +3037,21 @@ static ivas_error evs_dec_main(
{
if ( hCoreCoder[0]->bfi == 0 )
{
- if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK )
+ if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK )
{
return error;
}
}
else if ( hCoreCoder[0]->bfi == 2 )
{
- if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK )
+ if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK )
{
return error;
}
}
else
{
- if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_MISSING ) ) != IVAS_ERR_OK )
+ if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -2247,11 +3060,45 @@ static ivas_error evs_dec_main(
st_ivas->BER_detect = hCoreCoder[0]->BER_detect;
- /* convert 'float' output data to 'short' */
+ if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX )
+ {
+ mixer_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f;
+ mixer_rigth = 1.f - mixer_left;
+ v_multc( output[0], mixer_rigth, output[1], nOutSamples );
+ v_multc( output[0], mixer_left, output[0], nOutSamples );
+ }
+
+#ifdef JBM_TSM_ON_TCS
+ if ( floatBuf != NULL )
+ {
+ /* BE workaround */
+#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING
+ int16_t pcm_buf_local[L_FRAME48k * MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN];
+#else
+ int16_t pcm_buf_local[L_FRAME48k];
+#endif
+
+ /* convert 'float' output data to 'short' */
+#ifdef DEBUGGING
+ st_ivas->noClipping +=
+#endif
+ ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcm_buf_local );
+ mvs2r( pcm_buf_local, floatBuf, nOutSamples * st_ivas->hDecoderConfig->nchan_out );
+ }
+ else
+ {
+#endif
#ifdef DEBUGGING
- st_ivas->noClipping +=
+ st_ivas->noClipping +=
+#endif
+#ifdef JBM_TSM_ON_TCS
+ ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf );
+#else
+ ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf );
+#endif
+#ifdef JBM_TSM_ON_TCS
+ }
#endif
- syn_output( output, nOutSamples, pcmBuf );
return error;
}
@@ -2437,9 +3284,179 @@ static ivas_error input_format_API_to_internal(
*sdp_hf_only = 1;
break;
default:
+#ifdef FIX_510
+ return IVAS_ERR_INVALID_BITSTREAM;
+#else
return IVAS_ERR_INVALID_INPUT_FORMAT;
+#endif
break;
}
return IVAS_ERR_OK;
}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_VoIP_GetRenderGranularity()
+ *
+ *
+ *---------------------------------------------------------------------*/
+
+static int16_t IVAS_DEC_VoIP_GetRenderGranularity(
+ Decoder_Struct *st_ivas )
+{
+
+ return st_ivas->hTcBuffer->n_samples_granularity;
+}
+
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_VoIP_GetRendererConfig()
+ *
+ *
+ *---------------------------------------------------------------------*/
+
+static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig(
+ IVAS_DEC_HANDLE hIvasDec )
+{
+ JBM_RENDERER_TYPE rendererType;
+ rendererType = JBM_RENDERER_NONE;
+
+ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS )
+ {
+ rendererType = JBM_RENDERER_NONE;
+ }
+ else
+ {
+ rendererType = JBM_RENDERER_IVAS;
+ }
+
+ return rendererType;
+}
+
+
+/*---------------------------------------------------------------------*
+ * IVAS_DEC_VoIP_reconfigure()
+ *
+ *
+ *---------------------------------------------------------------------*/
+
+ivas_error IVAS_DEC_VoIP_reconfigure(
+ IVAS_DEC_HANDLE hIvasDec,
+ const uint16_t nTransportChannels,
+ const uint16_t l_ts )
+{
+
+ IVAS_DEC_VOIP *hVoIP;
+ ivas_error error;
+
+ hVoIP = hIvasDec->hVoIP;
+
+ if ( hIvasDec->hVoIP->hTimeScaler == NULL )
+ {
+
+ uint16_t wss, css;
+ float startQuality;
+ DECODER_CONFIG_HANDLE hDecoderConfig;
+
+#ifdef VARIABLE_SPEED_DECODING
+ startQuality = hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f;
+#else
+ startQuality = 1.0f;
+#endif
+
+ /* get current renderer type*/
+ hVoIP->rendererType = IVAS_DEC_VoIP_GetRendererConfig( hIvasDec );
+ hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig;
+ if ( hDecoderConfig->output_Fs == 8000 )
+ {
+ wss = 1;
+ css = 1;
+ }
+ else if ( hDecoderConfig->output_Fs == 16000 )
+ {
+ wss = 2;
+ css = 1;
+ }
+ else if ( hDecoderConfig->output_Fs == 32000 )
+ {
+ wss = 4;
+ css = 2;
+ }
+ else if ( hDecoderConfig->output_Fs == 48000 )
+ {
+ wss = 6;
+ css = 3;
+ }
+ else
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+
+ if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" );
+ }
+ set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels );
+
+ if ( apa_init( &hIvasDec->hVoIP->hTimeScaler,
+ nTransportChannels ) != IVAS_ERR_OK ||
+ apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 ||
+ apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 ||
+ apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 ||
+ apa_set_renderer_granularity( hIvasDec->hVoIP->hTimeScaler, l_ts ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+
+ if ( hVoIP->hFifoOut == NULL && hVoIP->rendererType == JBM_RENDERER_NONE )
+ {
+ /* we still need the FIFO out buffer */
+ if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 ||
+ pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+ }
+#ifdef VARIABLE_SPEED_DECODING
+ else if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED )
+ {
+ if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 ||
+ pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+ }
+#endif
+
+ if ( hIvasDec->mode == IVAS_DEC_MODE_EVS )
+ {
+ if ( apa_set_evs_compat_mode( hIvasDec->hVoIP->hTimeScaler, true ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+ }
+ }
+ else
+ {
+ if ( apa_reconfigure( hVoIP->hTimeScaler, nTransportChannels, l_ts ) != 0 )
+ {
+ return IVAS_ERR_INIT_ERROR;
+ }
+
+ /* realloc apa_exe_buffer */
+ free( hIvasDec->hVoIP->apaExecBuffer );
+ if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" );
+ }
+ set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels );
+ }
+ hIvasDec->hVoIP->nTransportChannelsOld = (uint8_t) nTransportChannels;
+
+ error = IVAS_ERR_OK;
+
+ return error;
+}
+#endif
diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h
index 6e0a0d6499e69b85ced627861f56606fa7fb53e3..1e1a25efd8376f0d718cbdc71eefb9e5026232ed 100644
--- a/lib_dec/lib_dec.h
+++ b/lib_dec/lib_dec.h
@@ -36,7 +36,6 @@
#include "common_api_types.h"
#include
-
/*---------------------------------------------------------------------*
* Decoder enums
*---------------------------------------------------------------------*/
@@ -77,6 +76,22 @@ typedef enum
IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF = 4, /* RTP payload: only Header-Full format without zero padding for size collision avoidance */
} IVAS_DEC_INPUT_FORMAT;
+typedef enum _IVAS_DEC_COMPLEXITY_LEVEL
+{
+ IVAS_DEC_COMPLEXITY_LEVEL_ONE = 1,
+ IVAS_DEC_COMPLEXITY_LEVEL_TWO = 2,
+ IVAS_DEC_COMPLEXITY_LEVEL_THREE = 3
+} IVAS_DEC_COMPLEXITY_LEVEL;
+
+
+#ifdef VARIABLE_SPEED_DECODING
+typedef enum
+{
+ IVAS_DEC_VOIP_MODE_VOIP = 0,
+ IVAS_DEC_VOIP_MODE_VARIABLE_SPEED = 1
+} IVAS_DEC_VOIP_MODE;
+#endif
+
#ifdef DEBUGGING
typedef enum _IVAS_DEC_FORCED_REND_MODE
{
@@ -117,9 +132,11 @@ typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer );
/*! r: error code */
ivas_error IVAS_DEC_Open(
IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */
- IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */
- const int16_t orientation_tracking, /* i : orientation tracking type */
- float no_diegetic_pan
+ IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */
+#ifndef FIX_439_OTR_PARAMS
+ ,
+ const int16_t orientation_tracking /* i : orientation tracking type */
+#endif
);
/*! r: error code */
@@ -133,7 +150,17 @@ ivas_error IVAS_DEC_Configure(
#ifdef EXTERNAL_ORIENTATIONS
const int16_t enableExternalOrientation, /* i : enable external orientations */
#endif
- const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */
+#endif
+ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */
+ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const float non_diegetic_pan_gain, /* i : non diegetic panning gain */
+ const int16_t delayCompensationEnabled /* i : enable delay compensation */
+#else
+ const float non_diegetic_pan_gain /* i : non diegetic panning gain */
+#endif
);
void IVAS_DEC_Close(
@@ -169,39 +196,27 @@ ivas_error IVAS_DEC_GetObjectMetadata(
/*! r: error code */
ivas_error IVAS_DEC_GetMasaMetadata(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
-#ifdef FIX_350_MASA_DELAY_COMP
MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */
-#else
- IVAS_MASA_QMETADATA_HANDLE *hMasaMetadata /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */
-#endif
);
/*! r: error code */
ivas_error IVAS_DEC_FeedHeadTrackData(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
-#ifdef TD5
IVAS_QUATERNION *orientation, /* i : head-tracking data */
- IVAS_POSITION *Pos /* i : listener position */
-#else
- IVAS_QUATERNION *orientation /* i : head-tracking data */
-#endif
+ IVAS_VECTOR3 *Pos /* i : listener position */
);
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*! r: error code */
ivas_error IVAS_DEC_FeedRefRotData(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
IVAS_QUATERNION rotation /* i : reference rotation data */
);
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/*! r: error code */
ivas_error IVAS_DEC_FeedRefVectorData(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
const IVAS_VECTOR3 listenerPos, /* i : Listener position */
const IVAS_VECTOR3 refPos /* i : Reference position */
);
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
#ifdef EXTERNAL_ORIENTATIONS
/*! r: error code */
@@ -226,23 +241,51 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
const bool qBit /* i : Q bit for AMR-WB IO */
);
+#ifdef VARIABLE_SPEED_DECODING
+#ifdef DEBUGGING
+/*! r: error code */
+ivas_error IVAS_DEC_VoIP_SetScale(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ const int16_t scale /* i : TSM scale to set */
+);
+#endif
+#endif
+
/*! r: error code */
ivas_error IVAS_DEC_VoIP_GetSamples(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */
int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
const uint32_t systemTimestamp_ms /* i : current system timestamp */
+#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING )
+ ,
+ uint16_t *sampleAvailableNext /* o : samples available for the next call */
+#endif
#ifdef SUPPORT_JBM_TRACEFILE
, JbmTraceFileWriterFn jbmWriterFn,
void* jbmWriter
#endif
);
+#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING )
+ivas_error IVAS_DEC_VoIP_Flush(
+ IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */
+ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */
+ uint16_t *nSamplesAvailableNext, /* o : number of samples still available */
+ int16_t *nSamplesFlushed /* o : number of samples flushed */
+);
+#endif
+
/* Setter functions - apply changes to decoder configuration */
/*! r: error code */
ivas_error IVAS_DEC_EnableVoIP(
IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */
+#ifdef VARIABLE_SPEED_DECODING
+ const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */
+ const uint16_t speedFac, /* i : speed factor for variable speed */
+#endif
const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */
const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */
);
@@ -358,6 +401,10 @@ ivas_error IVAS_DEC_GetPcmFrameSize(
/*! r: true if decoder has no data in VoIP jitter buffer */
bool IVAS_DEC_VoIP_IsEmpty(
IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */
+#ifdef JBM_TSM_ON_TCS
+ ,
+ const int16_t nSamplesAsked
+#endif
);
ivas_error IVAS_DEC_VoIP_Get_CA_offset(
diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c
index e29cc480a22433b3e5b480d5eeb4e661f2728734..73f8933daff76c16e4c0117877280bd95a8be8d7 100644
--- a/lib_dec/lsf_dec.c
+++ b/lib_dec/lsf_dec.c
@@ -43,10 +43,8 @@
#include "rom_com.h"
#include "prot.h"
#include "basop_proto_func.h"
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
#include "ivas_prot.h"
#include "ivas_rom_com.h"
-#endif
#include "wmc_auto.h"
@@ -74,10 +72,8 @@ void lsf_dec(
float *lsp_new, /* o : de-quantized LSP vector */
float *lsp_mid, /* o : de-quantized mid-frame LSP vector */
const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
)
{
int16_t i, nBits, coder_type, no_param_lpc;
@@ -132,12 +128,8 @@ void lsf_dec(
}
/* LSF de-quantization */
- lsf_end_dec( st, coder_type, st->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- tdm_lsfQ_PCh
-#endif
- );
+ lsf_end_dec( st, coder_type, st->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc,
+ tdm_lsfQ_PCh );
/* convert quantized LSFs to LSPs */
lsf2lsp( lsf_new, lsp_new, M, st->sr_core );
@@ -264,13 +256,11 @@ void lsf_end_dec(
const int16_t bwidth, /* i : input signal bandwidth */
const int16_t nBits_in, /* i : number of bits used for ISF quantization*/
float *qlsf, /* o : quantized LSFs in the cosine domain */
- int16_t *lpc_param,
- int16_t *LSF_Q_prediction, /* o : LSF prediction mode */
- int16_t *nb_indices
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
+ int16_t *lpc_param, /* i : LPC parameters */
+ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */
+ int16_t *nb_indices /* o : number of indices */
,
- const float tdm_lsfQ_PCh[M]
-#endif
+ const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
)
{
float pred0[M]; /* Prediction for the safety-net quantizer (usually mean)*/
@@ -292,17 +282,13 @@ void lsf_end_dec(
int16_t nBits;
int16_t coder_type;
int16_t flag_1bit_gran;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
float pred3[M];
-#endif
+
flag_1bit_gran = ( st->element_mode > EVS_MONO );
nBits = nBits_in;
*nb_indices = 0;
- if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */
-#endif
+ if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */
)
{
coder_type = get_next_indice( st, 1 );
@@ -343,14 +329,13 @@ void lsf_end_dec(
* Select safety_net or predictive mode
*--------------------------------------------------------------------------*/
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
+ p_lpc_param = lpc_param;
+
if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL )
{
/* if secondary channel predmode is set to be > 2 */
predmode += 3;
}
-#endif
- p_lpc_param = lpc_param;
if ( predmode == 0 )
{
@@ -378,7 +363,6 @@ void lsf_end_dec(
st->safety_net = safety_net;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/* Make sure there are the correct bit allocations */
if ( st->idchan == 1 && predmode > 2 )
{
@@ -388,7 +372,6 @@ void lsf_end_dec(
mvs2s( levels1, levels0, stages0 );
mvs2s( bits1, bits0, stages0 );
}
-#endif
/*--------------------------------------------------------------------------*
* Read indices from array
@@ -533,18 +516,15 @@ void lsf_end_dec(
pred1[i] = pred0[i] + MU_MA * st->mem_MA[i];
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */
if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL )
{
tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 );
}
-#endif
if ( safety_net )
{
/* LVQ */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL )
{
@@ -557,33 +537,24 @@ void lsf_end_dec(
}
else
{
-#endif
st->BER_detect = st->BER_detect |
vq_dec_lvq( 1, qlsf, &lindice[1], stages0, M, mode_lvq, levels0[stages0 - 1] );
v_add( qlsf, pred0, qlsf, M );
v_sub( qlsf, pred1, st->mem_MA, M );
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
}
-#endif
}
else
{
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( predmode == 4 )
{
mode_lvq_p = 9;
predmode = 2;
}
-#endif
st->BER_detect = st->BER_detect |
vq_dec_lvq( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1] );
- if ( predmode == 1
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- || ( predmode == 4 )
-#endif
- ) /* MA only */
+ if ( predmode == 1 || ( predmode == 4 ) ) /* MA only */
{
mvr2r( qlsf, st->mem_MA, M );
v_add( qlsf, pred1, qlsf, M );
diff --git a/lib_dec/lsf_msvq_ma_dec.c b/lib_dec/lsf_msvq_ma_dec.c
index 2fa1f3573b0a432fe062ffce9c45b8358e721b77..9c911ab5f6f82be803ce483aced3d5e9948bbfe0 100644
--- a/lib_dec/lsf_msvq_ma_dec.c
+++ b/lib_dec/lsf_msvq_ma_dec.c
@@ -187,7 +187,7 @@ int16_t D_lsf_tcxlpc(
NumIndices = 1;
- msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, lsf_q, lsf_q_ind );
+ msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_q, lsf_q_ind );
NumIndices += TCXLPC_NUMSTAGES;
@@ -195,7 +195,8 @@ int16_t D_lsf_tcxlpc(
{
/* Only add contribution if flag is enabled */
- msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, lsf_rem_q, lsf_rem_q_ind );
+
+ msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_rem_q, lsf_rem_q_ind );
NumIndices += TCXLPC_IND_NUMSTAGES;
/* Add to MA-removed vector */
@@ -264,7 +265,7 @@ int16_t dec_lsf_tcxlpc(
}
/* Decode independent lsf */
- msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, lsf_q_ignored, lsf_q_ind );
+ msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, 0, NULL, lsf_q_ignored, lsf_q_ind );
/* Update flag */
*flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk );
diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h
index 9ba901352c2af44ebc5a816c044e8a25158cb38a..c971cf0e21f1d08f3f3c0ca19c4d774e6f4ffc0f 100644
--- a/lib_dec/stat_dec.h
+++ b/lib_dec/stat_dec.h
@@ -98,21 +98,22 @@ typedef struct
float bandNoiseShape[FFTLEN2]; /* CNG spectral shape computed at the decoder */
float partNoiseShape[NPART]; /* CNG spectral shape computed at the decoder */
- float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */
- float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */
- int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */
- int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */
- float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */
- float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */
- float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */
- float cna_cm[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - coherence from the last inactive frame */
- int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */
- int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */
- int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */
- int16_t cna_band_limits[MAX_CNA_NBANDS + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */
- float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */
- float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */
- int16_t cna_seed; /* stereo CNA - seed for random CN generator */
+ float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */
+ float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */
+ int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */
+ int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */
+ float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */
+ float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */
+ float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */
+ float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */
+ int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */
+ int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */
+ int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */
+
+ int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */
+ float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */
+ float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */
+ int16_t cna_seed; /* stereo CNA - seed for random CN generator */
int16_t flag_dtx_mode;
float lp_speech;
@@ -1345,8 +1346,8 @@ typedef struct Decoder_State
/* MCT Channel mode indication: LFE, ignore channel? */
MCT_CHAN_MODE mct_chan_mode;
- int16_t cng_paramISM_flag; /* CNG in Param-ISM flag */
- int16_t read_sid_info; /* For ParamISM, use the transmitted noise */
+ int16_t cng_ism_flag; /* CNG in ISM format flag */
+ int16_t is_ism_format; /* Indication whether the codec operates in ISM format */
} Decoder_State, *DEC_CORE_HANDLE;
diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c
index e7eda534ae5817eaeaf22c5051753828f1ec478d..a89a17cca85be7d365bcd352253ca615c1c233f0 100644
--- a/lib_dec/swb_bwe_dec.c
+++ b/lib_dec/swb_bwe_dec.c
@@ -586,8 +586,8 @@ void swb_bwe_dec(
if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft )
{
- /* TBD - wtda() does not support L_FRAME length; thus temporarily resample the signal */
- /* TBV - delay output[] by 1.25ms ? */
+ /* todo - wtda() does not support L_FRAME length; thus temporarily resample the signal */
+ /* todo - delay output[] by 1.25ms ? */
lerp( output, ysynth, L_FRAME16k, st->L_frame );
/* windowing of the ACELP core synthesis */
@@ -734,7 +734,7 @@ void swb_bwe_dec(
}
else if ( frica_flag == 1 && hBWE_FD->prev_frica_flag == 0 )
{
- /* IVAS_fmToDo: TBD - synth[] is @internal_Fs!!! */
+ /* IVAS_fmToDo: synth[] is @internal_Fs!!! */
time_reduce_pre_echo( synth, hb_synth, hBWE_FD->prev_td_energy, l_subfr );
}
else
diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c
index 79fe3b0e68df74513fc47ddd79198162d95365bc..e4f211b2aab46b252bb8b9f8560c99f34b05959b 100644
--- a/lib_dec/swb_tbe_dec.c
+++ b/lib_dec/swb_tbe_dec.c
@@ -577,7 +577,6 @@ void swb_tbe_dec(
set_f( GainShape, hBWE_TD->prev_GainShape, NUM_SHB_SUBFR );
}
- /* this never happens */
mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER );
set_f( shb_res_gshape, 0.2f, NB_SUBFR16k );
}
@@ -1864,19 +1863,16 @@ static void dequantizeSHBparams(
lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * Idx_pred + LATTICE_DIM + 1], LATTICE_DIM );
}
- /* !!! TODO: read empty bits - should be removed */
if ( nbits < NUM_BITS_SHB_MSLVQ )
{
Idx_pred = get_next_indice( st, NUM_BITS_SHB_MSLVQ - nbits );
}
- /* !!! end empty bits */
v_add( SHB_LSF_mean, lsf_q, lsf_q, LPC_SHB_ORDER );
v_sort( lsf_q, 0, LPC_SHB_ORDER - 1 );
}
else
{
- /* !!!! this purposely reverts the inclusion of extl_brate == SWB_TBE_1k75 into the logic - remove this comment when this macro is deleted !!!!! */
if ( extl_brate == SWB_TBE_1k6 || extl_brate == FB_TBE_1k8 || extl_brate == SWB_TBE_2k8 || extl_brate == FB_TBE_3k0 )
{
for ( i = 0; i < NUM_Q_LSF; i++ )
diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c
index cb27b57ebf852b74e91c4da7657f08a1be5c9cb4..041e3a3d2fa493f5b9d66325cfc9baad7e59ef1a 100644
--- a/lib_dec/tonalMDCTconcealment.c
+++ b/lib_dec/tonalMDCTconcealment.c
@@ -386,15 +386,14 @@ static void CalcMDXT(
const TonalMDCTConcealPtr hTonalMDCTConc,
const char type,
const float *timeSignal,
- float *mdxtOutput,
- const int16_t isLfe )
+ float *mdxtOutput )
{
float windowedTimeSignal[L_FRAME_PLUS + 2 * L_MDCT_OVLP_MAX];
int16_t left_overlap, right_overlap;
int16_t L_frame;
L_frame = hTonalMDCTConc->nSamples;
- WindowSignal( hTonalMDCTConc->tcx_cfg, hTonalMDCTConc->tcx_cfg->tcx_offsetFB, FULL_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, timeSignal, &L_frame, windowedTimeSignal, 1, 1, isLfe );
+ WindowSignal( hTonalMDCTConc->tcx_cfg, hTonalMDCTConc->tcx_cfg->tcx_offsetFB, FULL_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, timeSignal, &L_frame, windowedTimeSignal, 1, 1 );
if ( type == 'S' )
{
@@ -413,8 +412,7 @@ void TonalMDCTConceal_Detect(
const TonalMDCTConcealPtr hTonalMDCTConc,
const float pitchLag,
int16_t *numIndices,
- const PsychoacousticParameters *psychParamsCurrent,
- const int16_t isLfe )
+ const PsychoacousticParameters *psychParamsCurrent )
{
float secondLastMDST[L_FRAME_MAX]; /* 32 bits are required */
float secondLastMDCT[L_FRAME_MAX]; /* 32 bits are required */
@@ -431,10 +429,8 @@ void TonalMDCTConceal_Detect(
{
if ( !hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive )
{
- CalcMDXT( hTonalMDCTConc, 'S', hTonalMDCTConc->secondLastPcmOut, secondLastMDST,
- isLfe );
- CalcMDXT( hTonalMDCTConc, 'C', hTonalMDCTConc->secondLastPcmOut, secondLastMDCT,
- isLfe );
+ CalcMDXT( hTonalMDCTConc, 'S', hTonalMDCTConc->secondLastPcmOut, secondLastMDST );
+ CalcMDXT( hTonalMDCTConc, 'C', hTonalMDCTConc->secondLastPcmOut, secondLastMDCT );
hTonalMDCTConc->nNonZeroSamples = 0;
for ( i = 0; i < hTonalMDCTConc->nSamples; i++ )
{
diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c
index 48cdb5c53614619ab4a6e765bdb1450ef659d48a..d78f9bf25888ea73be399e04a4d086a681708366 100644
--- a/lib_enc/acelp_core_enc.c
+++ b/lib_enc/acelp_core_enc.c
@@ -47,9 +47,7 @@
#include "prot.h"
#include "ivas_cnst.h"
#include "ivas_prot.h"
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
#include "ivas_rom_com.h"
-#endif
#include "wmc_auto.h"
/*-------------------------------------------------------------------*
@@ -75,7 +73,6 @@ ivas_error acelp_core_enc(
float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */
int16_t *unbits, /* o : number of unused bits */
STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */
- const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
)
{
@@ -372,9 +369,10 @@ ivas_error acelp_core_enc(
nb_bits = 0;
st->acelp_cfg.FEC_mode = 0;
uc_two_stage_flag = 0;
+
if ( !nelp_mode && !ppp_mode )
{
- config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
}
/*-----------------------------------------------------------------*
@@ -410,19 +408,15 @@ ivas_error acelp_core_enc(
if ( !tdm_lp_reuse_flag )
{
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh );
-#else
- lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode );
-#endif
}
else
{
const float *pt_interp_2;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
+
if ( st->active_cnt != 1 )
{
- int16_t beta_index[1];
+ int16_t beta_index;
float lsf_wgts[M];
/* intra_frame prediction for the LSFs */
@@ -430,36 +424,24 @@ ivas_error acelp_core_enc(
Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M );
- tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, beta_index );
+ tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index );
- push_indice( hBstr, IND_IC_LSF_PRED, beta_index[0], TDM_IC_LSF_PRED_BITS );
- }
- if ( st->active_cnt == 1 )
- {
- mvr2r( lsp_new, st->lsp_old, M );
- lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core );
- lsp2lsf( lsp_new, lsf_new, M, st->sr_core );
+ push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS );
}
-#else
- if ( st->active_cnt != 1 )
- {
- mvr2r( tdm_lspQ_PCh, lsp_new, M );
- mvr2r( tdm_lsfQ_PCh, lsf_new, M );
- }
-#endif
+
pt_interp_2 = interpol_frac_12k8;
if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED )
{
pt_interp_2 = interpol_frac2;
}
-#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE
+
if ( st->active_cnt == 1 )
{
mvr2r( lsp_new, st->lsp_old, M );
lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core );
lsp2lsf( lsp_new, lsf_new, M, st->sr_core );
}
-#endif
+
/* LSP interpolation and conversion of LSPs to A(z) */
int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 );
@@ -503,7 +485,7 @@ ivas_error acelp_core_enc(
{
tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res );
- config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
}
/*---------------------------------------------------------------*
@@ -561,14 +543,10 @@ ivas_error acelp_core_enc(
lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen );
/* Configure ACELP bit allocation */
- config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
+ config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode );
/* redo LSF quantization */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL );
-#else
- lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0 );
-#endif
/* recalculation of LP residual (filtering through A[z] filter) */
calc_residu( inp, res, Aq, st->L_frame );
diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c
index 291c2128a19a6423946c78e27b1dc0bff58e44f2..0fa3ba313061ef4ef7b4df962e3a2f7d1f6f50f4 100644
--- a/lib_enc/acelp_core_switch_enc.c
+++ b/lib_enc/acelp_core_switch_enc.c
@@ -73,6 +73,10 @@ void acelp_core_switch_enc(
const float *inp;
int32_t cbrate;
float Aq[2 * ( M + 1 )];
+#ifdef IND_LIST_DYN
+ uint16_t value;
+ int16_t nb_bits;
+#endif
BSTR_ENC_HANDLE hBstr = st->hBstr;
/* initializations */
@@ -151,7 +155,7 @@ void acelp_core_switch_enc(
* Excitation encoding
*----------------------------------------------------------------*/
- config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ );
+ config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ );
encod_gen_voic_core_switch( st, st->last_L_frame, inp, Aq, A, T_op, st->voicing, exc, cbrate );
@@ -159,12 +163,25 @@ void acelp_core_switch_enc(
* Manipulate ACELP subframe indices (move them to their proper place)
*----------------------------------------------------------------*/
+#ifdef IND_LIST_DYN
+ i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits );
+#ifdef DEBUGGING
+ assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" );
+#endif
+ while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START )
+ {
+ push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits );
+ i++;
+ }
+ delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START );
+#else
for ( i = 0; i < 20; i++ )
{
hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value;
hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits;
hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1;
}
+#endif
/*----------------------------------------------------------------*
* BWE encoding
diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c
index 80520d4c38d37b99a347b7262506eee0c39eb7ed..c0c0b4f18e51df211b71704c96ec4d4c6772a236 100644
--- a/lib_enc/amr_wb_enc.c
+++ b/lib_enc/amr_wb_enc.c
@@ -342,7 +342,8 @@ void amr_wb_enc(
* WB, SWB and FB bandwidth detector
*----------------------------------------------------------------*/
- bw_detect( st, st->input, NULL, NULL );
+ bw_detect( st, st->input, NULL, NULL,
+ 0 );
/* in AMR_WB IO, limit the maximum band-width to WB */
if ( st->bwidth > WB )
diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c
index 5f46910c57076190a267f7e8f8785b2460431e5b..6de35a211a50ba5e2461bb2f42041346828d5e30 100644
--- a/lib_enc/bw_detect.c
+++ b/lib_enc/bw_detect.c
@@ -55,8 +55,9 @@
#define ALPHA_BWD 0.75f
#define BWD_LT_THRESH 0.6f
-#define BWD_COUNT_MAX 100
-#define BWD_COUNT_WIDER_BW 10
+#define BWD_COUNT_MAX 100
+#define BWD_COUNT_WIDER_BW 10
+#define BWD_COUNT_WIDER_BW_MDCT 0
#define CLDFB_ENER_OFFSET 1.6f
@@ -71,6 +72,8 @@ void bw_detect(
const float signal_in[], /* i : input signal */
float *spectrum, /* i : MDCT spectrum */
const float *enerBuffer /* i : energy buffer */
+ ,
+ const int16_t mct_on /* i : flag MCT mode */
)
{
int16_t i, j, k, bw_max, bin_width, n_bins;
@@ -80,6 +83,13 @@ void bw_detect(
const float *pt, *pt1;
float max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB;
int16_t cldfb_bin_width = 4;
+ int16_t bwd_count_wider_bw, l_frame;
+
+ bwd_count_wider_bw = BWD_COUNT_WIDER_BW;
+ if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) )
+ {
+ bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT;
+ }
if ( st->input_Fs > 8000 )
{
@@ -173,8 +183,14 @@ void bw_detect(
}
else
{
- bin_width *= (int16_t) ( ( st->input_Fs / FRAMES_PER_SEC ) / BWD_TOTAL_WIDTH );
- mvr2r( spectrum, spect, (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) );
+ l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC );
+ if ( st->core == TCX_10_CORE )
+ {
+ l_frame /= 2;
+ }
+
+ bin_width *= ( l_frame / BWD_TOTAL_WIDTH );
+ mvr2r( spectrum, spect, l_frame );
}
/*---------------------------------------------------------------------*
* compute energy per spectral bins
@@ -392,17 +408,17 @@ void bw_detect(
/* switching to a higher BW */
if ( st->last_input_bwidth == NB )
{
- if ( st->count_WB > BWD_COUNT_WIDER_BW )
+ if ( st->count_WB > bwd_count_wider_bw )
{
st->input_bwidth = WB;
st->count_WB = BWD_COUNT_MAX;
- if ( st->count_SWB > BWD_COUNT_WIDER_BW )
+ if ( st->count_SWB > bwd_count_wider_bw )
{
st->input_bwidth = SWB;
st->count_SWB = BWD_COUNT_MAX;
- if ( st->count_FB > BWD_COUNT_WIDER_BW )
+ if ( st->count_FB > bwd_count_wider_bw )
{
st->input_bwidth = FB;
st->count_FB = BWD_COUNT_MAX;
@@ -413,12 +429,12 @@ void bw_detect(
if ( st->last_input_bwidth == WB && st->input_Fs > 16000 )
{
- if ( st->count_SWB > BWD_COUNT_WIDER_BW )
+ if ( st->count_SWB > bwd_count_wider_bw )
{
st->input_bwidth = SWB;
st->count_SWB = BWD_COUNT_MAX;
- if ( st->count_FB > BWD_COUNT_WIDER_BW )
+ if ( st->count_FB > bwd_count_wider_bw )
{
st->input_bwidth = FB;
st->count_FB = BWD_COUNT_MAX;
@@ -428,7 +444,7 @@ void bw_detect(
if ( st->last_input_bwidth == SWB && st->input_Fs > 32000 )
{
- if ( st->count_FB > BWD_COUNT_WIDER_BW )
+ if ( st->count_FB > bwd_count_wider_bw )
{
st->input_bwidth = FB;
st->count_FB = BWD_COUNT_MAX;
@@ -620,22 +636,13 @@ void set_bw_stereo(
if ( hCPE->element_mode == IVAS_CPE_MDCT )
{
- /* do not check bandwidth in LFE channel */
- if ( sts[0]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- sts[0]->bwidth = sts[0]->input_bwidth;
- }
- else if ( sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- sts[1]->bwidth = sts[1]->input_bwidth;
- }
/* ensure that both CPE channels have the same audio band-width */
- else if ( sts[0]->input_bwidth == sts[1]->input_bwidth )
+ if ( sts[0]->input_bwidth == sts[1]->input_bwidth )
{
sts[0]->bwidth = sts[0]->input_bwidth;
sts[1]->bwidth = sts[0]->input_bwidth;
}
- else if ( sts[0]->input_bwidth != sts[1]->input_bwidth )
+ else
{
sts[0]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth );
sts[1]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth );
@@ -672,7 +679,8 @@ int16_t set_bw_mct(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = hCPE[cpe_id]->hCoreCoder[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE || st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c
index 04d9e4116621c977f0ae6a60f4c4adc90d259576..6d49d9c8863d9c98ded4ccaf0ffeffcd4e9e0c84 100644
--- a/lib_enc/cng_enc.c
+++ b/lib_enc/cng_enc.c
@@ -263,11 +263,7 @@ void CNG_enc(
}
else
{
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
lsf_enc( st, lsf_new, lsp_new, 0, 0, 0, 0, NULL );
-#else
- lsf_enc( st, lsf_new, lsp_new, 0, 0, 0, 0 );
-#endif
}
/* Reset CNG history if CNG frame length is changed */
@@ -885,8 +881,12 @@ void swb_CNG_enc(
else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 )
{
/* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */
+#ifdef IND_LIST_DYN
+ delete_indice( st->hBstr, IND_CNG_ENV1 );
+#else
st->hBstr->nb_bits_tot = st->hBstr->nb_bits_tot - st->hBstr->ind_list[IND_CNG_ENV1].nb_bits;
st->hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1;
+#endif
push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
push_indice( st->hBstr, IND_UNUSED, 0, 4 );
push_indice( st->hBstr, IND_SID_BW, 1, 1 );
@@ -962,8 +962,12 @@ static void shb_CNG_encod(
push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 );
push_indice( hBstr, IND_SID_BW, 1, 1 );
+#ifdef IND_LIST_DYN
+ delete_indice( hBstr, IND_CNG_ENV1 );
+#else
hBstr->nb_bits_tot = hBstr->nb_bits_tot - hBstr->ind_list[IND_CNG_ENV1].nb_bits;
hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1;
+#endif
if ( st->element_mode == IVAS_CPE_DFT )
{
push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 );
diff --git a/lib_enc/cod_tcx.c b/lib_enc/cod_tcx.c
index 8c647be38a0c3b96ea33b77f2c66f6e2c743ba9a..ac24d74bf2bf792fe34af0619f0c5fbd5186a946 100644
--- a/lib_enc/cod_tcx.c
+++ b/lib_enc/cod_tcx.c
@@ -73,7 +73,7 @@ void HBAutocorrelation(
* Windowing *
*-----------------------------------------------------------*/
- WindowSignal( hTcxCfg, hTcxCfg->tcx_offset, left_overlap_mode, right_overlap_mode, &left_overlap, &right_overlap, speech, &L_frame, xn_buf, 1, 0, 0 );
+ WindowSignal( hTcxCfg, hTcxCfg->tcx_offset, left_overlap_mode, right_overlap_mode, &left_overlap, &right_overlap, speech, &L_frame, xn_buf, 1, 0 );
/*-----------------------------------------------------------*
* Autocorrelation *
@@ -134,11 +134,11 @@ void TNSAnalysisStereo(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
+
hTcxEnc = st->hTcxEnc;
nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
@@ -382,8 +382,7 @@ void TNSAnalysisStereo(
/* individual decision for each channel */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
-
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -465,10 +464,11 @@ void TNSAnalysisStereo(
/* we have the decision, set filter data accordingly */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
+
nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
for ( k = 0; k < nSubframes; k++ )
@@ -501,10 +501,11 @@ void TNSAnalysisStereo(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
+
nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
for ( k = 0; k < nSubframes; k++ )
@@ -970,11 +971,6 @@ void EstimateStereoTCXNoiseLevel(
{
fac_ns_q = param_core[ch] + n * NPRM_DIV + 1;
maxNfCalcBw = min( noiseFillingBorder[ch][n], (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame[ch][n] + 0.5f ) );
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- maxNfCalcBw = min( maxNfCalcBw, MCT_LFE_MAX_LINE );
- }
-
if ( ( total_brate >= HQ_96k && ( st->element_mode <= IVAS_SCE || st->bwidth < SWB ) ) || total_brate > IVAS_192k )
{
fac_ns[ch][n] = 0.0f;
@@ -2107,7 +2103,7 @@ void coder_tcx(
if ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP )
{
- WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, win, 1, 1, 0 );
+ WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, win, 1, 1 );
/* Compute MDCT for xn_buf[] */
TCX_MDCT( win, spectrum, left_overlap, L_frame - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode );
@@ -2116,7 +2112,7 @@ void coder_tcx(
{
wtda( st->hTcxEnc->new_speech_TCX, win, NULL, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, L_frame );
- WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, winMDST, 1, 1, 0 );
+ WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, winMDST, 1, 1 );
edct( win, spectrum, L_frame, st->element_mode );
diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c
index a87bfefb874d890f08f4f4258c3a964755a08753..774b1398c52a32bba57e2117744381bb9df33648 100644
--- a/lib_enc/core_enc_init.c
+++ b/lib_enc/core_enc_init.c
@@ -261,7 +261,7 @@ static void init_tcx(
hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long;
hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX;
- init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag, st->mct_chan_mode );
+ init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag );
/* Init TCX target bits correction factor */
hTcxEnc->tcx_target_bits_fac = 1.0f;
diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c
index 14fcac389443b9e5fd358353b5101959384e4292..d6c866d4c56e56a671a6b8b857f98bd106d2333d 100644
--- a/lib_enc/core_enc_switch.c
+++ b/lib_enc/core_enc_switch.c
@@ -95,7 +95,7 @@ void core_coder_mode_switch(
st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f );
- st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
/* switch IGF configuration */
if ( st->igf )
@@ -112,7 +112,7 @@ void core_coder_mode_switch(
hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode );
st->hTcxCfg->tcxRateLoopOpt = ( st->hTcxCfg->resq && !st->tcxonly ) ? 1 : st->hTcxCfg->tcxRateLoopOpt;
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode, st->mct_chan_mode );
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode );
if ( st->hTcxCfg->fIsTNSAllowed )
{
@@ -151,7 +151,7 @@ void core_coder_mode_switch(
}
else
{
- st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
init_coder_ace_plus( st, last_total_brate, MCT_flag );
}
diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c
index ad52e197b940c5a39fcbd2e3f434a0f7982e07eb..2b16b49d46d5a5e7a2d69b9d34ed460ba19516e3 100644
--- a/lib_enc/core_switching_enc.c
+++ b/lib_enc/core_switching_enc.c
@@ -258,7 +258,7 @@ void core_switching_pre_enc(
/* reset BWE memories */
if ( st->hBWE_TD != NULL )
{
- set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TBV: this might not be needed */
+ set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO - TBV: this might not be needed */
}
}
diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c
index c99a8faf286fdd9f87c0acfd9ecb2a66dcee6162..8357dd3a82c2dedcf99d2b534d1ae36b5c7e12b8 100644
--- a/lib_enc/dtx.c
+++ b/lib_enc/dtx.c
@@ -64,8 +64,7 @@
#define LTE_VAR -4.0f
#define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */
-#define MAX_BRATE_DTX_IVAS IVAS_64k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */
-
+#define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */
/*-------------------------------------------------------------------*
* Local function prototypes
*-------------------------------------------------------------------*/
@@ -86,9 +85,7 @@ void dtx(
)
{
float alpha;
-
DTX_ENC_HANDLE hDtxEnc = st->hDtxEnc;
-
int16_t last_br_cng_flag, last_br_flag, br_dtx_flag;
if ( st->dtx_sce_sba != 0 )
{
@@ -99,7 +96,6 @@ void dtx(
else
{
last_br_cng_flag = st->last_total_brate_cng <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate_cng <= MAX_BRATE_DTX_IVAS );
-
last_br_flag = st->last_total_brate <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate <= MAX_BRATE_DTX_IVAS );
br_dtx_flag = 0;
}
@@ -238,7 +234,7 @@ void dtx(
}
else
{
- if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode == IVAS_SCE && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */
+ if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode != EVS_MONO && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */
{
if ( st->element_mode == EVS_MONO && ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) )
{
@@ -259,7 +255,13 @@ void dtx(
/* reset the bitstream (IVAS format signaling was already written) */
if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL )
{
- reset_indices_enc( st->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( st->hBstr,
+#ifdef IND_LIST_DYN
+ st->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
}
diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c
index 823d6cf3cdb244a96f0f894df172f66aafbf0b7d..328c1d5b5215d500452fcb61e3e6a76f71597a95 100644
--- a/lib_enc/enc_ppp.c
+++ b/lib_enc/enc_ppp.c
@@ -169,7 +169,14 @@ ivas_error encod_ppp(
}
/* delete previous indices */
- reset_indices_enc( hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( hBstr,
+#ifdef IND_LIST_DYN
+ hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
+
/* signaling matrix (writing of signaling bits) */
signaling_enc( st );
diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c
index 5dd310177230d29c68fe414a5eaa9db3e7ce91cd..76bf54b0254641fe7d8ce3aa6c3761c991cd6835 100644
--- a/lib_enc/eval_pit_contr.c
+++ b/lib_enc/eval_pit_contr.c
@@ -326,18 +326,26 @@ int16_t Pit_exc_contribution_len(
/* pitch contribution useless - delete all previously written indices belonging to pitch contribution */
for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ )
{
+#ifdef IND_LIST_DYN
+ delete_indice( hBstr, i );
+#else
if ( hBstr->ind_list[i].nb_bits != -1 )
{
hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits;
hBstr->ind_list[i].nb_bits = -1;
}
+#endif
}
+#ifdef IND_LIST_DYN
+ delete_indice( hBstr, IND_ES_PRED );
+#else
if ( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 )
{
hBstr->nb_bits_tot -= hBstr->ind_list[IND_ES_PRED].nb_bits;
hBstr->ind_list[IND_ES_PRED].nb_bits = -1;
}
+#endif
}
if ( st->core_brate < CFREQ_BITRATE )
diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c
index b90f10359b2eddf3bb4250e421fc41b8fc1bc7f2..8a0a92c76a29628d2b24654c249e512a6b18cf2f 100644
--- a/lib_enc/evs_enc.c
+++ b/lib_enc/evs_enc.c
@@ -103,6 +103,7 @@ ivas_error evs_enc(
error = IVAS_ERR_OK;
push_wmops( "evs_enc" );
+
/*------------------------------------------------------------------*
* Initialization
*-----------------------------------------------------------------*/
@@ -242,7 +243,7 @@ ivas_error evs_enc(
if ( st->core == ACELP_CORE )
{
- if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, NULL ) ) != IVAS_ERR_OK )
+ if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -263,8 +264,7 @@ ivas_error evs_enc(
core_switching_post_enc( st, old_inp_12k8, old_inp_16k, A );
-#if !defined( FIX_I4_OL_PITCH )
- /* ToDo: this is a hack to keep bitexactness wrt. EVS but the logic is wrong */
+#ifndef FIX_I4_OL_PITCH
if ( st->core == HQ_CORE )
{
mvs2s( pitch_orig, st->pitch, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching() */
@@ -686,7 +686,7 @@ static void configure_core_coder(
}
}
- st->igf = getIgfPresent( 0, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( 0, st->total_brate, st->bwidth, st->rf_mode );
if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA )
{
diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c
index 9e1ad869ab239d34105dbbc93b7573f34a75c87c..e76457e61c941f689e42359149bc27bfb3702a39 100644
--- a/lib_enc/ext_sig_ana.c
+++ b/lib_enc/ext_sig_ana.c
@@ -215,35 +215,24 @@ void core_signal_analysis_high_bitrate(
if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
{
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- wtda( hTcxEnc->new_speech_TCX, tcx20Win, NULL, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX );
+ wtda( hTcxEnc->new_speech_TCX, tcx20Win, NULL, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX );
- if ( windowed_samples != NULL ) /* store overlap data for later */
- {
- assert( frameno == 0 );
- windowed_samples[0] = (float) overlap_mode[frameno];
- windowed_samples[1] = (float) overlap_mode[frameno + 1];
- }
- }
- else
+ if ( windowed_samples != NULL ) /* store overlap data for later */
{
- /* Windowing of the LFE Signal*/
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win,
- st->element_mode != IVAS_CPE_MDCT /* truncate_aldo */,
- 1, 1 );
+ assert( frameno == 0 );
+ windowed_samples[0] = (float) overlap_mode[frameno];
+ windowed_samples[1] = (float) overlap_mode[frameno + 1];
}
-
if ( st->element_mode != IVAS_CPE_MDCT )
{
/* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 1, 1, 0 );
+ WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 1, 1 );
}
}
else
{
/* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT, 1, 0 );
+ WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT, 1 );
if ( windowed_samples != NULL ) /* save windowed speech_TCX samples */
{
@@ -282,8 +271,7 @@ void core_signal_analysis_high_bitrate(
for ( i = 0; i < 2; i++ )
{
- assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE );
- WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, tcx20Win + i * tcx5SizeFB, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1, 0 );
+ WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, tcx20Win + i * tcx5SizeFB, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1 );
TCX_MDCT( tcx5Win, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode );
@@ -298,7 +286,7 @@ void core_signal_analysis_high_bitrate(
{
assert( transform_type[frameno] == TCX_10 || transform_type[frameno] == TCX_20 );
- if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
{
edct( tcx20Win, hTcxEnc->spectrum[frameno], L_subframe, st->element_mode );
@@ -324,12 +312,6 @@ void core_signal_analysis_high_bitrate(
v_multc( hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes );
}
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- set_f( &hTcxEnc->spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE );
- st->hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE;
- }
-
if ( st->element_mode != IVAS_CPE_MDCT )
{
/* For TCX20 at bitrates up to 64 kbps we need the power spectrum */
@@ -345,14 +327,14 @@ void core_signal_analysis_high_bitrate(
{
L_subframe = L_frameTCX / nSubframes;
- if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
{
wtda_ext( hTcxEnc->new_speech_TCX, mdstWin, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX, 3 );
}
else
{
/* Windowing for the MDST */
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1, st->mct_chan_mode == MCT_CHAN_MODE_LFE );
+ WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 );
}
if ( transform_type[frameno] == TCX_5 )
@@ -383,8 +365,7 @@ void core_signal_analysis_high_bitrate(
for ( i = 0; i < 2; i++ )
{
- assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE );
- WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1, 0 );
+ WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 );
TCX_MDST( tcx5Win, mdst_spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode );
/* high-band gain control in case of BWS */
@@ -396,7 +377,7 @@ void core_signal_analysis_high_bitrate(
}
else /* transform_type[frameno] != TCX_5 */
{
- if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
{
edst( mdstWin, mdst_spectrum[frameno], L_subframe, st->element_mode );
@@ -421,11 +402,6 @@ void core_signal_analysis_high_bitrate(
v_multc( mdst_spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes );
}
}
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- set_f( &mdst_spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE );
- }
}
if ( st->element_mode != IVAS_CPE_MDCT )
@@ -467,11 +443,13 @@ void core_signal_analysis_high_bitrate(
{
ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag );
}
-
- /* Copy memory */
- mvr2r( lsp_new, st->lspold_enc, M );
}
}
+ if ( st->element_mode != IVAS_CPE_MDCT )
+ {
+ /* Copy memory */
+ mvr2r( lsp_new, st->lspold_enc, M );
+ }
return;
}
diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c
index e43b65d56a88383a225e5228d77b2c06bf1d4018..99e0e9c8dbb61736542e84f962110a6b46b535bd 100644
--- a/lib_enc/fd_cng_enc.c
+++ b/lib_enc/fd_cng_enc.c
@@ -513,12 +513,18 @@ void FdCng_encodeSID(
float w[32];
float preemph_fac = st->preemph_fac;
- const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas;
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+ float dct_target[FDCNG_VQ_DCT_MAXTRUNC];
+ float tot_sig_ext[FDCNG_VQ_MAX_LEN];
const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS;
/* Init */
N = hFdCngEnc->npartDec;
+ invTrfMatrix = (float *) tmpRAM; /* dynamically filled */
+ set_zero( v, FDCNG_VQ_MAX_LEN );
+
/* Convert to LOG */
e = 0.f;
for ( i = 0; i < N; i++ )
@@ -544,10 +550,32 @@ void FdCng_encodeSID(
/* MSVQ encoder */
set_f( w, 1.0f, N );
- msvq_enc( codebooks, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, indices );
+ if ( st->element_mode != EVS_MONO )
+ {
+ /* DCT domain compressed/truncated indices used for first stage */
+ /* quantization with stage1 stored in DCT24 domain, stages 2 through 6 directly dearched
+ in FDCNG band domain
+ */
+ if ( N == FDCNG_VQ_MAX_LEN_WB )
+ {
+ create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
+ /* truncated DCT21 analysis */
+ dctT2_N_apply_matrix( (const float *) v, dct_target, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
+ /* truncated IDCT21 extension to 24 bands */
+ extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 );
+
+ mvr2r( tot_sig_ext, v, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */
+ }
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
+ msvq_enc( cdk_37bits_ivas, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL );
+ }
+ else
+ { /* EVS_MONO tables */
+ msvq_enc( cdk_37bits, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 0, NULL, indices );
+ msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL );
+ }
- /* MSVQ decoder */
- msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL );
/* Compute gain */
gain = 0.f;
@@ -895,8 +923,21 @@ void stereoFdCngCoherence(
else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 )
{
/* case: no VAD for both channels -> INACTIVE FRAME */
- reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES );
- reset_indices_enc( sts[1]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( sts[0]->hBstr,
+#ifdef IND_LIST_DYN
+ sts[0]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
+
+ reset_indices_enc( sts[1]->hBstr,
+#ifdef IND_LIST_DYN
+ sts[1]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
/* synchronize SID sending for variable SID rate */
if ( sts[0]->core_brate != sts[1]->core_brate )
@@ -973,6 +1014,12 @@ void FdCngEncodeMDCTStereoSID(
int16_t no_side_flag;
int16_t is_inp_ms;
+ float tot_sig_ext[FDCNG_VQ_MAX_LEN], dct_target[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/
+ invTrfMatrix = (float *) tmpRAM; /* dynamically filled */
+
+
is_inp_ms = 0;
if ( hCPE->hCoreCoder[0]->cng_sba_flag == 1 )
{
@@ -1023,7 +1070,7 @@ void FdCngEncodeMDCTStereoSID(
/* Quantize noise shapes */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- /* Normalize MSVW input */
+ /* Normalize MSVQ input */
gain[ch] = 0.f;
for ( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ )
{
@@ -1035,7 +1082,37 @@ void FdCngEncodeMDCTStereoSID(
{
ms_ptr[ch][p] -= gain[ch];
}
+ }
+ /* always split channel targetloop */
+
+ /* extend fdcng envelope from length 21 to a 24 length fdncg domain envelope signal */
+ /* High quality cosine smooth basis extension used to not introduce noise in stage#1 DCT24 analysis and subsequent VQ-steps */
+ if ( N == FDCNG_VQ_MAX_LEN_WB )
+ {
+ create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*WB: create truncated IDCT21 matrix */
+
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ /* run DCT_N N==21 , truncated at 18/21 ~= 86% , i.e use a bit better better quality in extrapolation , than subsequent DCT24 analysis which is truncated at 75%*/
+
+ /* truncated DCT 21 analysis */
+ dctT2_N_apply_matrix( (const float *) ms_ptr[ch], dct_target[ch], FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
+
+ /* extrapolate extend fdcng envelope signal in the fdncg ienvelope/"time" domain using DCT21 basis vectors,
+ estimated DCT21 coeffs scaling extended basis vectors are used to create extrapolated length 24 input target envelope signal */
+ /* this DCT21 extension does not introduce DCT24 coefficient noise for the subsequent dct24 target analysis, and later in IDCT24 synthesis */
+
+ /* truncated IDCT 21 extension synthesis */
+ extend_dctN_input( ms_ptr[ch], dct_target[ch], N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix /* DCT_N basis vectors */, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
+
+ mvr2r( tot_sig_ext, ms_ptr[ch], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ */
+ }
+ }
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*always create/set up IDCT24 matrix in RAM */
+ /* end split */
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
/* MSVQ */
if ( ch )
{
@@ -1046,8 +1123,14 @@ void FdCngEncodeMDCTStereoSID(
stages = FD_CNG_stages_37bits;
}
- msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, indices[ch] );
- msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], ms_ptr[ch], NULL );
+ /* DCT24 domain compressed/truncated indices used for first stage */
+ /* mid channel quantization using stages 1 through 6 */
+ /* & side channel quantization using stages 1 through 4 */
+
+ {
+ msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[ch] );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix, ms_ptr[ch], NULL );
+ }
}
if ( no_side_flag )
@@ -1104,12 +1187,14 @@ void FdCngEncodeMDCTStereoSID(
/* ---- Write SID bitstream ---- */
+#ifndef IND_LIST_DYN
/* side info */
push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 );
push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 );
push_indice( sts[1]->hBstr, IND_SID_TYPE, coh_idx, 4 );
push_indice( sts[1]->hBstr, IND_SID_TYPE, no_side_flag, 1 );
+#endif
/* noise shapes and channel gains */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
@@ -1117,10 +1202,23 @@ void FdCngEncodeMDCTStereoSID(
if ( ch )
{
stages = FD_CNG_JOINT_stages_25bits;
+#ifdef IND_LIST_DYN
+ sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+
+ /* side info */
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 );
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 );
+#endif
}
else
{
stages = FD_CNG_stages_37bits;
+#ifdef IND_LIST_DYN
+ /* side info */
+ push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 );
+ push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 );
+ push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 );
+#endif
}
for ( int16_t i = 0; i < stages; i++ )
@@ -1133,6 +1231,7 @@ void FdCngEncodeMDCTStereoSID(
/* pad with zeros to reach common SID frame size */
push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
+
return;
}
@@ -1160,6 +1259,11 @@ void FdCngEncodeDiracMDCTStereoSID(
int16_t indices[CPE_CHANNELS][FD_CNG_stages_37bits];
int16_t gain_idx[CPE_CHANNELS];
int16_t ch, p;
+ float *invTrfMatrix;
+ float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC];
+ float dct_target[FDCNG_VQ_DCT_MAXTRUNC];
+ float tot_sig_ext[FDCNG_VQ_MAX_LEN];
+ invTrfMatrix = (float *) tmpRAM; /* dynamically filled */
/* set pointers and initialize */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
@@ -1176,7 +1280,7 @@ void FdCngEncodeDiracMDCTStereoSID(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
E[ch] = 0.0f;
- for ( p = 0; p < NPART; p++ )
+ for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[ch] if N[ch] may change */
{
ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON );
E[ch] += ms_ptr[ch][p];
@@ -1184,12 +1288,13 @@ void FdCngEncodeDiracMDCTStereoSID(
}
/* M/S transform on log envelopes */
- convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f );
+ convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */
+
+ E[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */
- E[0] = sum_f( ms_ptr[0], NPART );
/* Quantize M noise shape */
- /* Normalize MSVW input */
+ /* Normalize MSVQ input */
gain[0] = sum_f( ms_ptr[0] + N_GAIN_MIN, N_GAIN_MAX - N_GAIN_MIN );
gain[0] /= (float) ( N_GAIN_MAX - N_GAIN_MIN );
@@ -1199,14 +1304,29 @@ void FdCngEncodeDiracMDCTStereoSID(
}
/* MSVQ */
- msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, indices[0] );
- msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], ms_ptr[0], NULL );
+ /* DCT domain compressed/truncated indices used for first stage */
+ /* mid quantization using stages #1 through 6 */
+ if ( N[0] == FDCNG_VQ_MAX_LEN_WB )
+ {
+ create_IDCT_N_Matrix( invTrfMatrix, N[0], FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
+ /* truncated DCT 21 analysis */
+ dctT2_N_apply_matrix( (const float *) ms_ptr[0], dct_target, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX );
+ /* truncated IDCT21 extension to 24 synthesis */
+ extend_dctN_input( ms_ptr[0], dct_target, N[0], tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/
+
+ mvr2r( tot_sig_ext, ms_ptr[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */
+ }
+ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) );
+
+ msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[0] );
+ msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix, ms_ptr[0], NULL );
+
/* set S to zero */
set_zero( ms_ptr[1], NPART );
/* compute M gain */
- gain[0] = sum_f( ms_ptr[0], NPART );
+ gain[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */
gain[0] = ( E[0] - gain[0] ) / (float) N[0];
apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO );
@@ -1218,7 +1338,7 @@ void FdCngEncodeDiracMDCTStereoSID(
gain[1] = gain[0];
/* undo M/S */
- convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f );
+ convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */
/* restore channel noise envelopes */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
@@ -1226,7 +1346,7 @@ void FdCngEncodeDiracMDCTStereoSID(
HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc;
HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom;
- for ( p = 0; p < NPART; p++ )
+ for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[0] if N[0] may change */
{
lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f );
}
@@ -1265,6 +1385,5 @@ void FdCngEncodeDiracMDCTStereoSID(
}
push_indice( sts[0]->hBstr, IND_ENERGY, gain_idx[0], 7 );
-
return;
}
diff --git a/lib_enc/hq_core_enc.c b/lib_enc/hq_core_enc.c
index 4bc332fd5e39cbb7acdd1db5e1a9c74c40074127..3fb39b535a79f8da69a5188083fd2c870b3787a4 100644
--- a/lib_enc/hq_core_enc.c
+++ b/lib_enc/hq_core_enc.c
@@ -116,7 +116,7 @@ void hq_core_enc(
left_overlap = -1;
right_overlap = -1;
- WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1, 0 );
+ WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 );
TCX_MDCT( wtda_audio, t_audio, left_overlap, L_spec - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode );
diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c
index 9c68e3fcc760981ad66e0da3ec77b7ebd427ce18..677bc1639e39dca3ff9e3686b0d156ab99eaa31f 100644
--- a/lib_enc/igf_enc.c
+++ b/lib_enc/igf_enc.c
@@ -1707,6 +1707,41 @@ void IGFEncSetMode(
return;
}
+#ifdef IND_LIST_DYN
+
+/*-------------------------------------------------------------------*
+ * pack_bit()
+ *
+ * insert a bit into packed octet
+ *-------------------------------------------------------------------*/
+
+static void pack_bit(
+ const int16_t bit, /* i : bit to be packed */
+ uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */
+ uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */
+)
+{
+ if ( *omask == 0x80 )
+ {
+ **pt = 0;
+ }
+
+ if ( bit != 0 )
+ {
+ **pt = **pt | *omask;
+ }
+
+ *omask >>= 1;
+ if ( *omask == 0 )
+ {
+ *omask = 0x80;
+ ( *pt )++;
+ }
+
+ return;
+}
+
+#endif
/*-------------------------------------------------------------------*
* IGFEncConcatenateBitstream()
@@ -1722,10 +1757,56 @@ void IGFEncConcatenateBitstream(
{
int16_t i;
IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData;
+#ifdef IND_LIST_DYN
+ Indice *ind_list;
+ uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */
+ int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */
+ int16_t k, nb_bits_written;
+ int32_t imask;
+ uint8_t omask;
+#endif
hPrivateData = &hIGFEnc->igfData;
+#ifndef IND_LIST_DYN
hBstr->next_ind -= bsBits;
+#endif
+
+#ifdef IND_LIST_DYN
+ ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */
+ pFrame = hPrivateData->igfBitstream;
+ pFrame_size = &hPrivateData->igfBitstreamBits;
+ nb_bits_written = 0;
+
+ omask = ( 0x80 >> ( *pFrame_size & 0x7 ) );
+ pFrame += *pFrame_size >> 3;
+
+ /* bitstream packing (conversion of individual indices into a serial stream) */
+ for ( i = 0; i < bsBits; i++ )
+ {
+ if ( ind_list[i].nb_bits > 0 )
+ {
+ /* mask from MSB to LSB */
+ imask = 1 << ( ind_list[i].nb_bits - 1 );
+ /* write bit by bit */
+ for ( k = 0; k < ind_list[i].nb_bits; k++ )
+ {
+ pack_bit( ind_list[i].value & imask, &pFrame, &omask );
+ imask >>= 1;
+ }
+ nb_bits_written += ind_list[i].nb_bits;
+
+ /* delete the indice */
+ ind_list[i].nb_bits = -1;
+ }
+ }
+
+ *pFrame_size += nb_bits_written;
+
+ /* update list of indices */
+ hBstr->nb_ind_tot -= bsBits;
+ hBstr->nb_bits_tot -= nb_bits_written;
+#else
indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits );
/* make sure there are no leftovers from the temporary bitstream writing */
@@ -1735,6 +1816,7 @@ void IGFEncConcatenateBitstream(
}
hBstr->nb_bits_tot -= hIGFEnc->infoTotalBitsPerFrameWritten;
+#endif
return;
}
diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c
index d3cc3f1743d561936a31b3a12961f1997d06c9a9..1c1071570194160514f83ab3fcdbe2e1492ac3a0 100644
--- a/lib_enc/init_enc.c
+++ b/lib_enc/init_enc.c
@@ -54,7 +54,10 @@
*-----------------------------------------------------------------------*/
ivas_error init_encoder(
- Encoder_State *st, /* i/o: state structure */
+ Encoder_State *st, /* i/o: state structure */
+#ifdef IND_LIST_DYN
+ Encoder_Struct *st_ivas, /* i/o: encoder state structure */
+#endif
const int16_t idchan, /* i : channel ID */
const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */
const int16_t interval_SID, /* i : interval for SID update */
@@ -112,6 +115,15 @@ ivas_error init_encoder(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) );
}
+
+#ifdef IND_LIST_DYN
+ /* set pointer to the buffer of indices */
+ st->hBstr->ind_list = st_ivas->ind_list;
+ st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list;
+ st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices;
+ st->hBstr->nb_ind_tot = 0;
+ st->hBstr->nb_bits_tot = 0;
+#endif
}
else
{
@@ -463,7 +475,7 @@ ivas_error init_encoder(
* LP-CNG
*-----------------------------------------------------------------*/
- if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM ) )
+ if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM || ism_mode == ISM_MODE_DISC ) )
{
if ( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL )
{
@@ -692,7 +704,7 @@ ivas_error init_encoder(
* TCX core
*-----------------------------------------------------------------*/
- // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172
+ // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172
if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT )
{
if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL )
@@ -727,7 +739,7 @@ ivas_error init_encoder(
* IGF
*-----------------------------------------------------------------*/
- if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) )
{
if ( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL )
{
@@ -747,7 +759,7 @@ ivas_error init_encoder(
if ( st->codec_mode == MODE2 || st->element_mode > EVS_MONO )
{
- st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
}
else
{
@@ -801,26 +813,18 @@ ivas_error init_encoder(
/*-----------------------------------------------------------------*
* Transient detector
*-----------------------------------------------------------------*/
-
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL )
{
- if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) );
- }
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) );
+ }
- if ( st->element_mode > EVS_MONO )
- {
- InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), 0, st->hTranDet, 1 );
- }
- else
- {
- InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 );
- }
+ if ( st->element_mode > EVS_MONO )
+ {
+ InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), 0, st->hTranDet, 1 );
}
else
{
- st->hTranDet = NULL;
+ InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 );
}
/*-----------------------------------------------------------------*
diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c
index 83dbdad1e183efb3bb5990657633b3c68323b389..03cb2aa2edef36792b2d7c0a36d8e99eb2c125fc 100644
--- a/lib_enc/ivas_agc_enc.c
+++ b/lib_enc/ivas_agc_enc.c
@@ -455,7 +455,6 @@ void ivas_agc_enc_process(
/* writing to a temporary bitstream file */
if ( ivas_agc_writeBits( agcOut, n_channels, pState ) )
{
- /* TODO: return error once error codes are harmonized */
IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "SPAR ENC AGC Failed to open agcOut\n " );
}
#endif
@@ -477,7 +476,6 @@ static int16_t ivas_agc_writeBits( FILE *stream, const int16_t n_channels, ivas_
if ( pState->gain_data[i].absGainExpCurr < 0 ||
pState->gain_data[i].absGainExpCurr >= (int16_t) pow( 2, pState->agc_com.betaE ) )
{
- /* TODO: return error once error codes are harmonized */
IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error Gain values to write!!\n\n" );
}
diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c
index e53033ab98546480c4d75cce2b2a898d208dbf81..6536ee333eb4f1b071af67c0fe64eac4b3124fc8 100644
--- a/lib_enc/ivas_core_enc.c
+++ b/lib_enc/ivas_core_enc.c
@@ -103,6 +103,9 @@ ivas_error ivas_core_enc(
int16_t last_element_mode, tdm_Pitch_reuse_flag;
int32_t element_brate, last_element_brate, input_Fs;
ivas_error error;
+#ifdef IND_LIST_DYN
+ int16_t max_num_indices_BWE;
+#endif
push_wmops( "ivas_core_enc" );
@@ -195,6 +198,23 @@ ivas_error ivas_core_enc(
{
st = sts[n];
+#ifdef IND_LIST_DYN
+ /* update pointer to the buffer of indices of the second channel */
+ if ( n == 1 && st->element_mode == IVAS_CPE_TD )
+ {
+ /* adjust the pointer to the buffer of indices of the secondary channel (make space for BWE indices) */
+ max_num_indices_BWE = get_BWE_max_num_indices( sts[0]->extl_brate );
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot + max_num_indices_BWE;
+
+ /* write TD stereo spatial parameters */
+ move_indices( hStereoTD->tdm_hBstr_tmp.ind_list, st->hBstr->ind_list, hStereoTD->tdm_hBstr_tmp.nb_ind_tot );
+ st->hBstr->nb_ind_tot += hStereoTD->tdm_hBstr_tmp.nb_ind_tot;
+ st->hBstr->nb_bits_tot += hStereoTD->tdm_hBstr_tmp.nb_bits_tot;
+
+ reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP );
+ }
+#endif
+
/*---------------------------------------------------------------------*
* Write signaling info into the bitstream
*---------------------------------------------------------------------*/
@@ -219,7 +239,7 @@ ivas_error ivas_core_enc(
if ( st->core == ACELP_CORE )
{
/* ACELP core encoder */
- if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK )
+ if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -259,7 +279,8 @@ ivas_error ivas_core_enc(
if ( MCT_flag )
{
ivas_mdct_core_whitening_enc( hCPE, old_inp_16k, old_wsp, pitch_buf, hMCT->p_mdst_spectrum_long[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long[cpe_id],
- hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, &hMCT->LFE_off, 1, hMCT->nchan_out_woLFE + hMCT->num_lfe );
+ hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr,
+ 1, hMCT->nchan_out_woLFE );
}
else
{
@@ -405,7 +426,6 @@ ivas_error ivas_core_enc(
}
}
-
#ifdef DEBUG_MODE_INFO
for ( n = 0; n < n_CoreChannels; n++ )
{
@@ -448,6 +468,8 @@ ivas_error ivas_core_enc(
dbgwrite( &st->sp_aud_decision1, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision1", n, id, ENC ) );
dbgwrite( &st->sp_aud_decision2, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "sp_aud_decision2", n, id, ENC ) );
+ dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) );
+
#if ( defined DEBUG_MODE_ACELP ) || ( defined DEBUG_MODE_TCX )
if ( st->coder_type == INACTIVE || st->coder_type == UNVOICED )
{
diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c
index 6e2f6b6db2e1cf38298085f9fa7e38edf8de9af6..5f775d2403a18af76b8b74fc1d1816dfdf7c314d 100644
--- a/lib_enc/ivas_core_pre_proc_front.c
+++ b/lib_enc/ivas_core_pre_proc_front.c
@@ -443,13 +443,6 @@ ivas_error pre_proc_front_ivas(
st->vad_flag = wb_vad( st, fr_bands, &i, &i, &i, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f );
-#ifdef ITD_WINNER_GAIN_MODIFY
- /*Save the local_vad flag for the noise coherence calculation*/
- if ( element_mode == IVAS_CPE_DFT )
- {
- hCPE->hStereoDft->local_vad = (short) ( st->vad_flag );
- }
-#endif
if ( force_front_vad == 1 || front_vad_flag == 1 )
{
@@ -486,7 +479,8 @@ ivas_error pre_proc_front_ivas(
if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT )
{
- bw_detect( st, st->input, NULL, enerBuffer );
+ bw_detect( st, st->input, NULL, enerBuffer,
+ 0 );
}
if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */
@@ -569,7 +563,14 @@ ivas_error pre_proc_front_ivas(
if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) )
{
+#ifdef FIX_443_FD_CNG_INIT
+ int32_t total_brate;
+
+ total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC;
+ configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate );
+#else
configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC );
+#endif
if ( hCPE != NULL )
{
st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1;
@@ -829,34 +830,6 @@ ivas_error pre_proc_front_ivas(
/* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */
ivas_smc_mode_selection( st, element_brate, smc_dec, *relE, Etot, attack_flag, inp_12k8, S_map, flag_spitch );
-
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( element_mode == IVAS_CPE_DFT )
- {
- if ( hCPE->hStereoDft->mus_flag != smc_dec || hCPE->element_mode != hCPE->last_element_mode )
- {
- hCPE->hStereoDft->noise_coherence = 0.0f;
- set_zero( hCPE->hStereoDft->spd_L_noise, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->spd_R_noise, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->spd_L_noise_min, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->spd_R_noise_min, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->spd_L_noise_max, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->spd_R_noise_max, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->winner_gain_L, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hCPE->hStereoDft->winner_gain_R, STEREO_DFT_N_32k_ENC / 2 );
- set_f( hCPE->hStereoDft->spd_L_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
- set_f( hCPE->hStereoDft->spd_R_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
- }
- if ( smc_dec == MUSIC && st->vad_flag == 1 )
- {
- hCPE->hStereoDft->mus_flag = 2;
- }
- else
- {
- hCPE->hStereoDft->mus_flag = 0;
- }
- }
-#endif
}
/*----------------------------------------------------------------*
diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c
index e9d6968f1b2d01f41523c1a7115509890251b28c..439a0f6c63916f60cdb25a74be7b84768ea6c9bc 100644
--- a/lib_enc/ivas_corecoder_enc_reconfig.c
+++ b/lib_enc/ivas_corecoder_enc_reconfig.c
@@ -41,7 +41,6 @@
#endif
#include "wmc_auto.h"
-
/*-------------------------------------------------------------------*
* ivas_corecoder_enc_reconfig()
*
@@ -61,9 +60,24 @@ ivas_error ivas_corecoder_enc_reconfig(
int16_t n, sce_id, cpe_id;
int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing;
float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )];
- BSTR_ENC_HANDLE hBstr, hMetaData;
- Indice *ind_list, *ind_list_metadata;
- int16_t nb_bits_tot, next_ind, last_ind;
+ BSTR_ENC_HANDLE hBstr;
+#ifndef IND_LIST_DYN
+ Indice *ind_list;
+#endif
+#ifndef IND_LIST_DYN
+ Indice *ind_list_metadata;
+ BSTR_ENC_HANDLE hMetaData;
+#endif
+#ifdef IND_LIST_DYN
+ int16_t i, nb_bits;
+ Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST];
+#endif
+ int16_t nb_bits_tot;
+#ifndef IND_LIST_DYN
+ int16_t last_ind;
+ int16_t next_ind;
+#endif
+
ENCODER_CONFIG_HANDLE hEncoderConfig;
ivas_error error;
@@ -133,21 +147,29 @@ ivas_error ivas_corecoder_enc_reconfig(
}
/* something in transport changes */
+#ifndef IND_LIST_DYN
ind_list = NULL;
ind_list_metadata = NULL;
+#endif
hBstr = NULL;
+#ifndef IND_LIST_DYN
hMetaData = NULL;
+#endif
/* get the index list pointers */
if ( nSCE_old )
{
hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr;
+#ifndef IND_LIST_DYN
hMetaData = st_ivas->hSCE[0]->hMetaData;
+#endif
}
else if ( nCPE_old )
{
hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr;
+#ifndef IND_LIST_DYN
hMetaData = st_ivas->hCPE[nCPE_old - 1]->hMetaData;
+#endif
}
#ifdef DEBUGGING
else
@@ -157,11 +179,45 @@ ivas_error ivas_corecoder_enc_reconfig(
#endif
/* save bitstream information */
- ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */
nb_bits_tot = hBstr->nb_bits_tot;
+#ifndef IND_LIST_DYN
+ ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */
next_ind = hBstr->next_ind;
last_ind = hBstr->last_ind;
+#endif
+#ifdef IND_LIST_DYN
+ i = 0;
+ nb_bits = 0;
+ while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST )
+ {
+ if ( hBstr->ind_list[i].nb_bits > 0 )
+ {
+ temp_ind_list[i].id = hBstr->ind_list[i].id;
+ temp_ind_list[i].value = hBstr->ind_list[i].value;
+ temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits;
+ hBstr->ind_list[i].nb_bits = -1;
+ }
+
+ hBstr->nb_bits_tot = 0;
+ hBstr->nb_ind_tot = 0;
+
+ nb_bits += temp_ind_list[i].nb_bits;
+ i++;
+ }
+
+ for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ )
+ {
+ /* reset nb_bits of all other indices to -1 */
+ temp_ind_list[i].nb_bits = -1;
+ }
+
+#ifdef DEBUGGING
+ assert( ( nb_bits == nb_bits_tot ) && "Error saving bitstream information during core-coder reconfiguration!\n" );
+#endif
+#endif
+#ifndef IND_LIST_DYN
ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */
+#endif
if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA )
{
@@ -211,7 +267,7 @@ ivas_error ivas_corecoder_enc_reconfig(
{
if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n )
{
- mvr2r( st_ivas->hCPE[cpe_id]->hCoreCoder[0]->input_buff, input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); /* TODO VoiceAge: Please check if this should be hCoreCoder[n] */
+ mvr2r( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory );
}
}
@@ -256,23 +312,35 @@ ivas_error ivas_corecoder_enc_reconfig(
mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory );
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES;
+#endif
/* only reset indices if it is not the first index list, this already contains the IVAS format bits */
if ( sce_id > 0 )
{
- reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr,
+#ifdef IND_LIST_DYN
+ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
else
{
- st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind;
+#ifndef IND_LIST_DYN
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot;
+ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind;
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind;
+#endif
}
+#ifndef IND_LIST_DYN
st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA;
reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
}
@@ -284,22 +352,32 @@ ivas_error ivas_corecoder_enc_reconfig(
{
st_ivas->hCPE[cpe_id]->element_brate = brate_CPE;
- /* prepare bitstream buffers */
+ /* allocate buffer of indices */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 );
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
+#ifndef IND_LIST_DYN
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES;
+#endif
if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) )
{
- reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr,
+#ifdef IND_LIST_DYN
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
else
{
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind;
+#ifndef IND_LIST_DYN
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot;
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind;
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind;
+#endif
}
}
}
@@ -321,23 +399,33 @@ ivas_error ivas_corecoder_enc_reconfig(
{
if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n )
{
- mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[0]->input_buff, len_inp_memory ); /* TODO VoiceAge: Please check if this should be hCoreCoder[n] */
+ mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, len_inp_memory );
}
}
- /* prepare bitstream buffers */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
+#ifndef IND_LIST_DYN
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES;
+#endif
+ /* only reset indices if it is not the first index list, this already contains the IVAS format bits */
if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) )
{
- reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES );
+ reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr,
+#ifdef IND_LIST_DYN
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
}
else
{
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind;
+#ifndef IND_LIST_DYN
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot;
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind;
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind;
+#endif
}
if ( hEncoderConfig->Opt_DTX_ON )
@@ -348,6 +436,51 @@ ivas_error ivas_corecoder_enc_reconfig(
}
}
+#ifdef IND_LIST_DYN
+ /* restore bitstream - IVAS format bits should be written in the first core channel of the first SCE/CPE */
+ i = 0;
+ nb_bits = 0;
+ if ( st_ivas->nSCE > 0 )
+ {
+ while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST )
+ {
+ if ( temp_ind_list[i].nb_bits > 0 )
+ {
+ st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id;
+ st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value;
+ st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits;
+ }
+
+ nb_bits += temp_ind_list[i].nb_bits;
+ i++;
+ }
+ st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i;
+ st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot;
+ }
+ else if ( st_ivas->nCPE > 0 )
+ {
+ while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST )
+ {
+ if ( temp_ind_list[i].nb_bits > 0 )
+ {
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id;
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value;
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits;
+ }
+
+ nb_bits += temp_ind_list[i].nb_bits;
+ i++;
+ }
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i;
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot;
+ }
+
+#ifdef DEBUGGING
+ assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" );
+#endif
+#endif
+
+
if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA )
{
/* restore modified transport signal */
@@ -372,13 +505,11 @@ ivas_error ivas_corecoder_enc_reconfig(
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate;
-
st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC );
st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode,
st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC,
st_ivas->hCPE[0]->hCoreCoder[n]->bwidth,
- st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode,
- st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode );
+ st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode );
if ( st_ivas->hCPE[0]->hCoreCoder[n]->igf )
{
@@ -404,7 +535,7 @@ ivas_error ivas_corecoder_enc_reconfig(
}
}
- /* metadata handling for CPEs */
+ /* alllocate buffer for metadata indices */
if ( st_ivas->nCPE > 0 )
{
if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL )
@@ -413,10 +544,23 @@ ivas_error ivas_corecoder_enc_reconfig(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) );
}
+
+#ifdef IND_LIST_DYN
+ /* set pointer to the buffer of metadata indices */
+ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = st_ivas->ind_list_metadata;
+ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata;
+ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata;
+ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot = 0;
+ st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_bits_tot = 0;
+#endif
}
+#ifdef IND_LIST_DYN
+ reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot );
+#else
st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES;
reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA );
+#endif
for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ )
{
@@ -440,13 +584,11 @@ ivas_error ivas_corecoder_enc_reconfig(
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate;
-
st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC );
st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode,
st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC,
st_ivas->hCPE[0]->hCoreCoder[n]->bwidth,
- st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode,
- st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode );
+ st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode );
if ( st_ivas->hCPE[0]->hCoreCoder[n]->igf )
{
diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c
index f9b787ac563f21c3015b916703110ae0362031bc..5f19a5395af55a358fd8aafc4e25255acc3cf257 100644
--- a/lib_enc/ivas_cpe_enc.c
+++ b/lib_enc/ivas_cpe_enc.c
@@ -109,7 +109,6 @@ ivas_error ivas_cpe_enc(
hCPE = st_ivas->hCPE[cpe_id];
sts = hCPE->hCoreCoder;
hEncoderConfig = st_ivas->hEncoderConfig;
-
max_bwidth = hEncoderConfig->max_bwidth;
ivas_format = hEncoderConfig->ivas_format;
input_Fs = hEncoderConfig->input_Fs;
@@ -154,7 +153,10 @@ ivas_error ivas_cpe_enc(
}
mvr2r( data_f_ch0, sts[0]->input, input_frame );
- mvr2r( data_f_ch1, sts[1]->input, input_frame );
+ if ( data_f_ch1 != NULL ) /*this may happen for cases with odd number of channels*/
+ {
+ mvr2r( data_f_ch1, sts[1]->input, input_frame );
+ }
/*----------------------------------------------------------------*
* Stereo technology selection
@@ -272,7 +274,7 @@ ivas_error ivas_cpe_enc(
}
else
{
- /* note; "bits_frame_nominal" needed in TD stereo as well */ /* IVAS_fmToDo: is "bits_frame_nominal" set optimaly in TD stereo? */
+ /* note; "bits_frame_nominal" needed in TD stereo as well */
stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal );
}
}
@@ -296,12 +298,14 @@ ivas_error ivas_cpe_enc(
{
if ( st_ivas->hMCT )
{
+ int16_t lfe_bits;
+ lfe_bits = ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ? st_ivas->hLFE->lfe_bits : 0 );
sts[n]->total_brate = hCPE->element_brate;
- if ( sts[n]->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC );
- sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - ( st_ivas->hMCT->num_lfe == FALSE ? 0 : LFE_BITS ) - nb_bits_metadata ) / st_ivas->hMCT->nchan_out_woLFE );
- }
+ sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC );
+ sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC -
+ lfe_bits -
+ nb_bits_metadata ) /
+ st_ivas->hMCT->nchan_out_woLFE );
}
else
{
@@ -329,7 +333,12 @@ ivas_error ivas_cpe_enc(
if ( hCPE->element_mode == IVAS_CPE_DFT )
{
- stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs );
+ stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs
+#ifdef HYBRID_ITD_MAX
+ ,
+ hCPE->hStereoDft->hItd->hybrid_itd_max
+#endif
+ );
/* Time Domain ITD compensation using extrapolation */
#ifdef DEBUG_MODE_DFT
@@ -458,7 +467,11 @@ ivas_error ivas_cpe_enc(
{
if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD )
{
+#ifndef SBA_MODE_CLEAN_UP
reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode );
+#else
+ reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata );
+#endif
}
}
@@ -468,9 +481,17 @@ ivas_error ivas_cpe_enc(
stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff );
/* Reset metadata */
+#ifndef SBA_MODE_CLEAN_UP
if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) )
+#else
+ if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) )
+#endif
{
+#ifndef SBA_MODE_CLEAN_UP
reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode );
+#else
+ reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata );
+#endif
}
}
@@ -660,10 +681,7 @@ ivas_error ivas_cpe_enc(
/* Store previous attack detection flag */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
- if ( sts[n]->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent;
- }
+ sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent;
}
#ifdef DEBUG_MODE_INFO
@@ -811,6 +829,14 @@ ivas_error create_cpe_enc(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) );
}
+
+#ifdef IND_LIST_DYN
+ /* set pointer to the buffer of metadata indices */
+ hCPE->hMetaData->ind_list = st_ivas->ind_list_metadata;
+ hCPE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata;
+ hCPE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata;
+ reset_indices_enc( hCPE->hMetaData, st_ivas->ivas_max_num_indices_metadata );
+#endif
}
/*-----------------------------------------------------------------*
@@ -827,12 +853,11 @@ ivas_error create_cpe_enc(
copy_encoder_config( st_ivas, st, 1 );
st->total_brate = hCPE->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
st->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL )
- {
- st->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
-
- if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
+ if ( ( error = init_encoder( st,
+#ifdef IND_LIST_DYN
+ st_ivas,
+#endif
+ n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
{
return error;
}
diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c
index 43bc94fb04c06e30858d5419907091bac7b4872a..5aa872e4341fc2928e2886dbd0fc839642eea62e 100644
--- a/lib_enc/ivas_dirac_enc.c
+++ b/lib_enc/ivas_dirac_enc.c
@@ -62,9 +62,13 @@ ivas_error ivas_dirac_enc_open(
)
{
int16_t i, j;
+#ifndef SBA_MODE_CLEAN_UP
int32_t input_Fs;
+#endif
DIRAC_ENC_HANDLE hDirAC;
+#ifndef SBA_MODE_CLEAN_UP
IVAS_FB_CFG *fb_cfg;
+#endif
int32_t dirac_slot_ns;
ivas_error error;
@@ -79,13 +83,23 @@ ivas_error ivas_dirac_enc_open(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) );
}
-
+#ifdef FIX_485_STATIC_BUFFERS
+ hDirAC->firstrun_sector_params = 1;
+ set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+ set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+ set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+ set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+ set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+ set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS );
+#endif
/*-----------------------------------------------------------------*
* DirAC main configuration
*-----------------------------------------------------------------*/
st_ivas->hDirAC = hDirAC;
+#ifndef SBA_MODE_CLEAN_UP
input_Fs = st_ivas->hEncoderConfig->input_Fs;
+#endif
if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK )
{
@@ -93,13 +107,19 @@ ivas_error ivas_dirac_enc_open(
}
/* set FB config. */
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
{
+#endif
hDirAC->hFbMixer = NULL;
+#ifndef SBA_MODE_CLEAN_UP
}
else
{
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, input_Fs ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC,
+ FOA_CHANNELS,
+ 0, 0, input_Fs,
+ FOA_CHANNELS ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -109,7 +129,7 @@ ivas_error ivas_dirac_enc_open(
return error;
}
}
-
+#endif
for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ )
{
@@ -119,6 +139,7 @@ ivas_error ivas_dirac_enc_open(
dirac_slot_ns = DIRAC_SLOT_ENC_NS;
/* initialize delay for SPAR/DirAC delay synchronization */
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_DIRAC )
{
hDirAC->num_samples_synchro_delay = NS2SA( input_Fs, IVAS_FB_ENC_DELAY_NS );
@@ -141,6 +162,7 @@ ivas_error ivas_dirac_enc_open(
hDirAC->sba_synchro_buffer[i] = NULL;
}
}
+#endif
/* intensity 3-dim */
for ( i = 0; i < DIRAC_NUM_DIMS; i++ )
@@ -196,13 +218,15 @@ ivas_error ivas_dirac_enc_open(
hDirAC->index_buffer_intensity = 0;
st_ivas->hDirAC = hDirAC;
-
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
{
mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS );
+#endif
st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band;
+#ifndef SBA_MODE_CLEAN_UP
}
-
+#endif
return error;
}
@@ -236,7 +260,15 @@ ivas_error ivas_dirac_enc_reconfigure(
/* :TODO: if the number of parameter bands change, do a meaningful mapping of parameter buffers from old to new band setting */
- mvs2s( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
+ if ( st_ivas->hQMetaData->useLowerRes )
+ {
+ hDirAC->block_grouping[0] = 0;
+ hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES;
+ }
+ else
+ {
+ mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
+ }
return error;
}
@@ -267,7 +299,7 @@ void ivas_dirac_enc_close(
{
ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 );
}
-
+#ifndef SBA_MODE_CLEAN_UP
for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ )
{
if ( hDirAC->sba_synchro_buffer[i] != NULL )
@@ -276,7 +308,7 @@ void ivas_dirac_enc_close(
hDirAC->sba_synchro_buffer[i] = NULL;
}
}
-
+#endif
/* intensity 3-dim */
for ( i = 0; i < DIRAC_NUM_DIMS; i++ )
{
@@ -317,7 +349,7 @@ void ivas_dirac_enc_close(
return;
}
-
+#ifndef SBA_MODE_CLEAN_UP
/*-------------------------------------------------------------------------
* ivas_dirac_enc()
*
@@ -364,7 +396,9 @@ void ivas_dirac_enc(
set_zero( data_f[2], input_frame );
}
- ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC );
+ ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC,
+ 0,
+ FOA_CHANNELS );
/* encode parameters */
if ( sba_planar || hQMetaData->useLowerRes )
@@ -376,17 +410,13 @@ void ivas_dirac_enc(
}
}
- ivas_qmetadata_enc_encode( hMetaData, hQMetaData );
+ ivas_qmetadata_enc_encode( hMetaData, hQMetaData,
+ 0 );
*nb_bits_metadata = hMetaData->nb_bits_tot;
if ( Opt_DTX_ON )
{
- /* ToDo: If DIRAC_MIN_BITRATE_4_TRANS_CHAN is reached with DTX on (possible only with bitrate switching)
- metadata is not quantized since it can be deduced at the decoder from transmitted TCs.
- The solution would be to switch to active-only/ignore and resume DTX operation when switching back to a supported bitrate.
- */
-
if ( !( hQMetaData->no_directions == 1 && hQMetaData->numCodingBands == 5 ) )
{
float orig_azi[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -440,8 +470,12 @@ void ivas_dirac_enc(
}
/* encode SID parameters */
+#ifndef SBA_MODE_CLEAN_UP
ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC );
+#else
+ ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
+#endif
/* restore original metadata */
hDirAC->hConfig->nbands = nbands;
hQMetaData->q_direction[0].cfg.nbands = nbands;
@@ -459,7 +493,11 @@ void ivas_dirac_enc(
push_next_indice( hMetaData, 0, 1 );
/* encode SID parameters */
+#ifndef SBA_MODE_CLEAN_UP
ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC );
+#else
+ ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
+#endif
}
}
}
@@ -488,7 +526,7 @@ void ivas_dirac_enc_spar_delay_synchro(
int16_t sce_id, cpe_id, i_chan;
/* check last sba_mode */
- if ( ivas_sba_mode_select( st_ivas->hEncoderConfig->last_ivas_total_brate ) == SBA_MODE_SPAR )
+ if ( ivas_sba_mode_select() == SBA_MODE_SPAR )
{
/* initializations */
i_chan = 0;
@@ -524,7 +562,121 @@ void ivas_dirac_enc_spar_delay_synchro(
return;
}
+#else
+/*-------------------------------------------------------------------------
+ * ivas_dirac_enc()
+ *
+ * DirAC Encoder
+ *
+ *------------------------------------------------------------------------*/
+
+void ivas_dirac_enc(
+ DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */
+ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */
+ BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */
+ float data_f[][L_FRAME48k], /* i/o: SBA channels */
+ float **ppIn_FR_real, /* o : real freq domain values */
+ float **ppIn_FR_imag, /* o : imag freq domain values */
+ const int16_t input_frame, /* i : input frame length */
+ const int16_t dtx_vad, /* i : DTX vad flag */
+ const IVAS_FORMAT ivas_format, /* i : ivas format */
+ int16_t hodirac_flag ) /* i : hodirac flag */
+{
+ int16_t orig_dirac_bands;
+ float dir[3], avg_dir[3];
+ float energySum, vecLen;
+ int16_t i, j, b, i_ts;
+ push_wmops( "ivas_dirac_enc" );
+
+ ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS );
+
+ if ( hQMetaData->q_direction->cfg.nbands > 0 )
+ {
+ orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands;
+
+ if ( dtx_vad == 1 )
+ {
+ /* WB 4TC mode bit : disable for now*/
+ push_next_indice( hMetaData, 0, 1 );
+
+ ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag );
+ }
+ else
+ {
+ hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS;
+
+ /* compute directions */
+ for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ )
+ {
+ set_zero( dir, 3 );
+ set_zero( avg_dir, 3 );
+ energySum = 0.0f;
+
+ /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */
+ for ( j = 0; j < orig_dirac_bands - 1; j++ )
+ {
+ ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] );
+ vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j];
+
+ avg_dir[0] += dir[0] * vecLen;
+ avg_dir[1] += dir[1] * vecLen;
+ avg_dir[2] += dir[2] * vecLen;
+
+ energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j];
+ }
+
+ ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] );
+ hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON );
+
+ hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i];
+ hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i];
+ hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i];
+ }
+
+ /* 1 bit to indicate mode MD coding : temp solution*/
+ push_next_indice( hMetaData, 1, 1 );
+
+ /* encode SID parameters */
+ ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
+ }
+
+ for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ )
+ {
+ for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ )
+ {
+ hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts];
+ hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts];
+ hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]];
+ }
+ }
+ if ( dtx_vad == 0 )
+ {
+ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0];
+ hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0];
+ hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0];
+ }
+
+ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ for ( j = orig_dirac_bands - 2; j >= 0; j-- )
+ {
+ hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0];
+ hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0];
+ hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0];
+ }
+ }
+
+ hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
+ }
+ }
+ pop_wmops();
+
+ return;
+}
+#endif
/*-------------------------------------------------------------------------
* computeReferencePower_enc()
@@ -539,7 +691,14 @@ void computeReferencePower_enc(
float *reference_power, /* o : Estimated power */
const int16_t enc_param_start_band, /* i : first band to process */
const int16_t num_freq_bands, /* i : Number of frequency bands */
- const SBA_MODE sba_mode /* i : SBA mode */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode /* i : SBA mode */
+#else
+ const IVAS_FORMAT ivas_format, /* i : ivas_format */
+ int16_t ref_power_w /* i : use 0 if hodirac is enabled */
+#endif
+ ,
+ const int16_t nchan_ana /* i : number of analysis channels */
)
{
int16_t brange[2];
@@ -559,7 +718,8 @@ void computeReferencePower_enc(
reference_power_W[i] += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] );
}
reference_power[i] += reference_power_W[i];
- for ( ch_idx = 1; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ )
+
+ for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ )
{
/* abs()^2 */
for ( j = brange[0]; j < brange[1]; j++ )
@@ -570,7 +730,11 @@ void computeReferencePower_enc(
}
v_multc( reference_power, 0.5f, reference_power, num_freq_bands );
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT && ref_power_w == 1 )
+#endif
{
for ( i = 0; i < num_freq_bands; i++ )
{
@@ -596,7 +760,13 @@ void ivas_dirac_param_est_enc(
float **pp_fr_real,
float **pp_fr_imag,
const int16_t input_frame,
- const SBA_MODE sba_mode )
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode,
+#else
+ const IVAS_FORMAT ivas_format,
+#endif
+ const int16_t hodirac_flag,
+ const int16_t nchan_fb_in )
{
int16_t i, d, ts, index, l_ts, num_freq_bands;
int16_t band_m_idx, block_m_idx;
@@ -617,8 +787,15 @@ void ivas_dirac_param_est_enc(
float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX];
+ float azi_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 };
+ float ele_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 };
+ float diff_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 };
+ float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 };
+
push_wmops( "dirac_enc_param_est" );
+ num_freq_bands = hDirAC->hConfig->nbands;
+
/* Initialization */
l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES;
if ( useLowerRes )
@@ -640,7 +817,7 @@ void ivas_dirac_param_est_enc(
}
/* Copy current frame to memory for delay compensation */
- for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
pcm_in[i] = &data_f[i][0];
p_Cldfb_RealBuffer[i] = &Cldfb_RealBuffer[i][0];
@@ -665,10 +842,12 @@ void ivas_dirac_param_est_enc(
{
if ( hDirAC->hFbMixer )
{
- ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts );
- ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts,
+ hDirAC->hFbMixer->fb_cfg->num_in_chans );
+ ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts,
+ hDirAC->hFbMixer->fb_cfg->num_in_chans );
- for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
pcm_in[i] += l_ts;
}
@@ -679,15 +858,14 @@ void ivas_dirac_param_est_enc(
assert( pp_fr_real );
assert( pp_fr_imag );
#endif
- for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ )
+
+ for ( i = 0; i < nchan_fb_in; i++ )
{
- mvr2r( &pp_fr_real[i][block_m_idx * l_ts], Cldfb_RealBuffer[i], l_ts );
- mvr2r( &pp_fr_imag[i][block_m_idx * l_ts], Cldfb_ImagBuffer[i], l_ts );
+ mvr2r( &pp_fr_real[i][ts * l_ts], Cldfb_RealBuffer[i], l_ts );
+ mvr2r( &pp_fr_imag[i][ts * l_ts], Cldfb_ImagBuffer[i], l_ts );
}
}
- num_freq_bands = hDirAC->hConfig->nbands;
-
computeReferencePower_enc(
hDirAC->band_grouping,
Cldfb_RealBuffer,
@@ -695,7 +873,13 @@ void ivas_dirac_param_est_enc(
reference_power[ts],
hDirAC->hConfig->enc_param_start_band,
num_freq_bands,
- sba_mode );
+#ifndef SBA_MODE_CLEAN_UP
+ hodirac_flag ? SBA_MODE_DIRAC : sba_mode,
+#else
+ ivas_format,
+ hodirac_flag ? 0 : 1,
+#endif
+ FOA_CHANNELS );
computeIntensityVector_enc(
hDirAC,
@@ -705,15 +889,18 @@ void ivas_dirac_param_est_enc(
num_freq_bands,
intensity_real );
- computeDirectionVectors(
- intensity_real[0],
- intensity_real[1],
- intensity_real[2],
- hDirAC->hConfig->enc_param_start_band,
- num_freq_bands,
- direction_vector[0],
- direction_vector[1],
- direction_vector[2] );
+ if ( !hodirac_flag )
+ {
+ computeDirectionVectors(
+ intensity_real[0],
+ intensity_real[1],
+ intensity_real[2],
+ hDirAC->hConfig->enc_param_start_band,
+ num_freq_bands,
+ direction_vector[0],
+ direction_vector[1],
+ direction_vector[2] );
+ }
/* fill buffers of length "averaging_length" time slots for intensity and energy */
hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ) + 1; /* averaging_length = 32 */
@@ -727,49 +914,104 @@ void ivas_dirac_param_est_enc(
computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector );
- for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
+ if ( hodirac_flag )
{
- norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] );
+#ifdef DEBUGGING
+ assert( l_ts <= DIRAC_NO_FB_BANDS_MAX );
+#endif
+ calculate_hodirac_sector_parameters(
+#ifdef FIX_485_STATIC_BUFFERS
+ hDirAC,
+#endif
+ Cldfb_RealBuffer,
+ Cldfb_ImagBuffer,
+ 0.20f,
+ hDirAC->band_grouping,
+ hDirAC->hConfig->nbands,
+ hDirAC->hConfig->enc_param_start_band,
+ azi_secs,
+ ele_secs,
+ diff_secs,
+ ene_secs );
+ }
- hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx];
- hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx];
- hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx];
- renormalization_factor[band_m_idx] += norm_tmp;
+ if ( hodirac_flag )
+ {
+ for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
+ {
+ hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx];
+ renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx];
+ }
+ }
+ else
+ {
+ for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
+ {
+ norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] );
+
+ hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx];
+ hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx];
+ hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx];
+ renormalization_factor[band_m_idx] += norm_tmp;
- hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx];
- renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx];
+ hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx];
+ renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx];
+ }
}
}
- for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
+ if ( !hodirac_flag )
+
{
- renormalization_factor[band_m_idx] = EPSILON;
- for ( d = 0; d < DIRAC_NUM_DIMS; d++ )
- {
- renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] );
- }
- renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] );
- if ( renormalization_factor[band_m_idx] > EPSILON )
- {
- hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
- hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
- hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
- }
- else
+ for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
{
- hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1;
- hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0;
- hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0;
+ renormalization_factor[band_m_idx] = EPSILON;
+ for ( d = 0; d < DIRAC_NUM_DIMS; d++ )
+ {
+ renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] );
+ }
+ renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] );
+
+ if ( renormalization_factor[band_m_idx] > EPSILON )
+ {
+ hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
+ hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
+ hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx];
+ }
+ else
+ {
+ hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1;
+ hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0;
+ hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0;
+ }
+
+ /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */
+ for ( d = 0; d < DIRAC_NUM_DIMS; d++ )
+ {
+ dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx];
+ }
+
+ ivas_qmetadata_direction_vector_to_azimuth_elevation(
+ dir_v,
+ &q_direction->band_data[band_m_idx].azimuth[block_m_idx],
+ &q_direction->band_data[band_m_idx].elevation[block_m_idx] );
}
+ }
- /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */
- for ( d = 0; d < DIRAC_NUM_DIMS; d++ )
+ /* Sectors */
+ if ( hodirac_flag )
+ {
+ for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ )
{
- dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx];
- }
+ q_direction->band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[band_m_idx];
+ q_direction->band_data[band_m_idx].elevation[block_m_idx] = ele_secs[band_m_idx];
+ // q_direction->band_data[band_m_idx].energy_ratio[block_m_idx] = 1.f - diffuseness_vector[band_m_idx]; // set later
- ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &q_direction->band_data[band_m_idx].azimuth[block_m_idx], &q_direction->band_data[band_m_idx].elevation[block_m_idx] );
+ q_direction[1].band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[num_freq_bands + band_m_idx];
+ q_direction[1].band_data[band_m_idx].elevation[block_m_idx] = ele_secs[num_freq_bands + band_m_idx];
+ q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON );
+ }
}
}
diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c
index 1e4ba82207b1c46175653b55353b9f09e912e4ef..89a97ea0b079cfc7d8e906fed1665b7681df3dbe 100644
--- a/lib_enc/ivas_enc.c
+++ b/lib_enc/ivas_enc.c
@@ -62,7 +62,7 @@ ivas_error ivas_enc(
BSTR_ENC_HANDLE hMetaData;
Encoder_State *st; /* used for bitstream handling */
int16_t nb_bits_metadata[MAX_SCE];
- float data_f[MAX_INPUT_CHANNELS][L_FRAME48k]; /* IVAS_fmToDo: buffer can be allocated dynamically based on the number of analysed channels */
+ float data_f[MAX_INPUT_CHANNELS][L_FRAME48k];
int32_t ivas_total_brate;
ivas_error error;
error = IVAS_ERR_OK;
@@ -132,9 +132,13 @@ ivas_error ivas_enc(
/* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */
for ( i = 0; i < n; i++ )
{
- if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) && !( st_ivas->sba_analysis_order > 1 ) )
+#else
+ if ( ( ivas_format == SBA_FORMAT ) && !( st_ivas->sba_analysis_order > 1 ) )
+#endif
{
- hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs );
+ hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs );
}
else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */
{
@@ -217,8 +221,13 @@ ivas_error ivas_enc(
/* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */
hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData;
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR )
+#else
+ if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT )
+#endif
{
+#ifndef SBA_MODE_CLEAN_UP
if ( ivas_format == SBA_FORMAT )
{
ivas_dirac_enc( st_ivas->hDirAC, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], hEncoderConfig->Opt_DTX_ON, data_f, input_frame, hEncoderConfig->sba_planar );
@@ -227,21 +236,26 @@ ivas_error ivas_enc(
}
else
{
+#endif
+ ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */
if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
}
-
- ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport );
-
if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format,
ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1 ) ) != IVAS_ERR_OK )
{
return error;
}
+#ifndef SBA_MODE_CLEAN_UP
}
+#endif
}
+#ifndef SBA_MODE_CLEAN_UP
else if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ else if ( ivas_format == SBA_FORMAT )
+#endif
{
if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK )
{
@@ -291,6 +305,7 @@ ivas_error ivas_enc(
if ( st_ivas->mc_mode == MC_MODE_MCT )
{
st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr;
+
ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr );
}
@@ -301,6 +316,20 @@ ivas_error ivas_enc(
return error;
}
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+
+ /* encode MC ParamUpmix parameters and write bitstream */
+ ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame );
+
+ st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr;
+ ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr );
+
+ if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
/* encode Parametric MC parameters and write bitstream */
@@ -342,6 +371,10 @@ ivas_error ivas_enc(
return error;
}
+#ifdef IND_LIST_DYN
+ st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot;
+#endif
+
if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK )
{
return error;
diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c
index e117cfc5a55ba7e737c495d437a8c1fe282c91d9..61c4ccaef9afc4edcd578f279edb6194c4781c6d 100644
--- a/lib_enc/ivas_enc_cov_handler.c
+++ b/lib_enc/ivas_enc_cov_handler.c
@@ -34,6 +34,7 @@
#include "options.h"
#include "prot.h"
#include "ivas_prot.h"
+#include "ivas_rom_com.h"
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -53,7 +54,7 @@
* Local functions declarations
*------------------------------------------------------------------------------------------*/
-static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] );
+static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] );
/*-------------------------------------------------------------------------
* ivas_spar_covar_enc_open()
@@ -66,6 +67,11 @@ ivas_error ivas_spar_covar_enc_open(
ivas_filterbank_t *pFb, /* i/o: FB handle */
const int32_t input_Fs, /* i : input sampling rate */
const int16_t nchan_inp /* i : number of input channels */
+ ,
+#ifdef FIX_489_COV_SMOOTHING
+ COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */
+#endif
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
)
{
ivas_enc_cov_handler_state_t *hCovState;
@@ -82,8 +88,25 @@ ivas_error ivas_spar_covar_enc_open(
cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS;
cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE;
cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE;
+#ifdef FIX_489_COV_SMOOTHING
+ if ( smooth_mode == COV_SMOOTH_MC )
+ {
+ cov_smooth_cfg.max_update_rate = 1.0f;
+ cov_smooth_cfg.min_pool_size = 20;
+ }
+#else
+ if ( nchan_inp == 3 ) /* to discriminate between SPAR and mc there could be a better solution */
+ {
+ cov_smooth_cfg.max_update_rate = 1.0f;
+ cov_smooth_cfg.min_pool_size = 20;
+ }
+#endif
- if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK )
+#ifdef FIX_489_COV_SMOOTHING
+ if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -91,7 +114,11 @@ ivas_error ivas_spar_covar_enc_open(
cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX;
cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX;
- if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK )
+#ifdef FIX_489_COV_SMOOTHING
+ if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -152,7 +179,8 @@ void ivas_enc_cov_handler_process(
const int16_t end_band,
const int16_t num_ch,
const int16_t dtx_vad,
- const int16_t transient_det[2] )
+ const int16_t transient_det[2],
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] )
{
int16_t i, j;
int16_t dtx_cov_flag;
@@ -165,7 +193,8 @@ void ivas_enc_cov_handler_process(
pFb->fb_bin_to_band.p_short_stride_start_bin_per_band,
pFb->fb_bin_to_band.p_short_stride_num_bins_per_band,
start_band, end_band,
- cov_real );
+ cov_real,
+ HOA_md_ind );
#ifdef DEBUG_SPAR_WRITE_OUT_COV
{
@@ -257,7 +286,8 @@ static void ivas_band_cov(
const int16_t *pFb_active_bins_per_band,
const int16_t start_band,
const int16_t end_band,
- float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] )
+ float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] )
{
int16_t i, j, k;
float pV_re[L_FRAME48k];
@@ -267,9 +297,13 @@ static void ivas_band_cov(
{
for ( j = i; j < num_chans; j++ )
{
+
+ int16_t i1 = HOA_md_ind[i];
+ int16_t j1 = HOA_md_ind[j];
+
for ( k = 0; k < num_bins; k++ )
{
- pV_re[k] = ppIn_FR_real[i][k] * ppIn_FR_real[j][k] + ppIn_FR_imag[i][k] * ppIn_FR_imag[j][k];
+ pV_re[k] = ppIn_FR_real[i1][k] * ppIn_FR_real[j1][k] + ppIn_FR_imag[i1][k] * ppIn_FR_imag[j1][k];
}
for ( k = start_band; k < end_band; k++ )
diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c
index a8f5219f2a3f692b44e6edfcfbfce3771d0a8315..830a05e41a3ce8c426c5f6def0012141c3d65904 100644
--- a/lib_enc/ivas_entropy_coder.c
+++ b/lib_enc/ivas_entropy_coder.c
@@ -128,12 +128,20 @@ static ivas_error ivas_get_dyn_freq_model(
*
* Arith encoding of an array of symbols
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_arith_encode_array(
+#else
static void ivas_arith_encode_array(
+#endif
int16_t *pInput,
ivas_arith_t *pArith,
BSTR_ENC_HANDLE hMetaData,
- const int16_t in_len )
+ const int16_t in_len
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ int32_t wc_strat_arith
+#endif
+)
{
int16_t model_index, i, ind;
int16_t *pCum_freq = NULL;
@@ -144,6 +152,12 @@ static void ivas_arith_encode_array(
if ( pArith->dyn_model_bits > 0 )
{
ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits ) > wc_strat_arith )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, model_index, pArith->dyn_model_bits );
}
else
@@ -158,12 +172,27 @@ static void ivas_arith_encode_array(
ind = pInput[i] - pArith->vals[0];
ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const uint16_t *) pCum_freq );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( hMetaData->nb_bits_tot > wc_strat_arith )
+ {
+ return -1;
+ }
+#endif
}
ivas_ari_done_encoding_14bits( hMetaData, &as );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( hMetaData->nb_bits_tot > wc_strat_arith )
+ {
+ return -1;
+ }
+#endif
}
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -172,15 +201,26 @@ static void ivas_arith_encode_array(
*
* Differential arith encoding
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_arithCoder_encode_array_diff(
+#else
static void ivas_arithCoder_encode_array_diff(
+#endif
ivas_arith_t *pArith_diff,
int16_t *pIn_new,
int16_t *pIn_old_scratch,
const int16_t length,
- BSTR_ENC_HANDLE hMetaData )
+ BSTR_ENC_HANDLE hMetaData
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ int32_t wc_strat_arith
+#endif
+)
{
int16_t n;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t arith_result;
+#endif
if ( length > 0 )
{
@@ -191,10 +231,22 @@ static void ivas_arithCoder_encode_array_diff(
ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length );
+#endif
}
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -228,16 +280,27 @@ void ivas_huffman_encode(
*
* Arithmetic encode a cell array
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t arith_encode_cell_array(
+#else
static void arith_encode_cell_array(
+#endif
ivas_cell_dim_t *pCell_dims,
BSTR_ENC_HANDLE hMetaData,
const int16_t nB,
ivas_arith_t *pArith,
- int16_t *pSymbol )
+ int16_t *pSymbol
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ int32_t wc_strat_arith
+#endif
+)
{
int16_t total_symbol_len = 0;
int16_t i;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t arith_result;
+#endif
for ( i = 0; i < nB; i++ )
{
@@ -250,11 +313,24 @@ static void arith_encode_cell_array(
{
if ( pArith->range > 1 )
{
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len );
+#endif
}
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -263,16 +339,27 @@ static void arith_encode_cell_array(
*
* Arithmetic encode a cell array - differential
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t arith_encode_cell_array_diff(
+#else
static void arith_encode_cell_array_diff(
+#endif
const ivas_cell_dim_t *pCell_dims,
BSTR_ENC_HANDLE hMetaData,
int16_t nB,
ivas_arith_t *pArith_diff,
int16_t *pSymbol_old,
- int16_t *pSymbol )
+ int16_t *pSymbol
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ int32_t wc_strat_arith
+#endif
+)
{
int16_t i, total_symbol_len;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t arith_result;
+#endif
total_symbol_len = 0;
for ( i = 0; i < nB; i++ )
@@ -286,11 +373,24 @@ static void arith_encode_cell_array_diff(
{
if ( pArith_diff->range > 1 )
{
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData );
+#endif
}
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -299,8 +399,11 @@ static void arith_encode_cell_array_diff(
*
* Arithmetic encode a cell array
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+int16_t ivas_arith_encode_cmplx_cell_array(
+#else
void ivas_arith_encode_cmplx_cell_array(
+#endif
ivas_arith_t *pArith_re,
ivas_arith_t *pArith_re_diff,
const int16_t *pDo_diff,
@@ -309,7 +412,12 @@ void ivas_arith_encode_cmplx_cell_array(
int16_t *pSymbol_old_re,
ivas_cell_dim_t *pCell_dims,
BSTR_ENC_HANDLE hMetaData,
- const int16_t any_diff )
+ const int16_t any_diff
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ int32_t wc_strat_arith
+#endif
+)
{
int16_t input_old[IVAS_MAX_INPUT_LEN];
int16_t input_new[IVAS_MAX_INPUT_LEN];
@@ -317,6 +425,9 @@ void ivas_arith_encode_cmplx_cell_array(
ivas_cell_dim_t cell_dim[IVAS_MAX_NUM_BANDS], cell_dim_diff[IVAS_MAX_NUM_BANDS];
int16_t len, idx, i, j, idx1;
int16_t total_len;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t arith_result;
+#endif
idx1 = 0;
if ( any_diff == 1 )
@@ -382,14 +493,44 @@ void ivas_arith_encode_cmplx_cell_array(
}*/
#endif
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+
+ arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input );
arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new );
+#endif
}
else
{
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re,
+ wc_strat_arith );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re );
+#endif
}
+
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c
index be476b1244c1bd897f14d76ac2ac4879e106e3ff..9593f6682f0b24b050b3941f77904b5fac487609 100644
--- a/lib_enc/ivas_front_vad.c
+++ b/lib_enc/ivas_front_vad.c
@@ -407,8 +407,8 @@ ivas_error front_vad_spar(
mvr2r( st->old_wsp, old_wsp, L_WSP_MEM );
wsp = old_wsp + L_WSP_MEM;
- st->core_brate = -1; /* updated in dtx() */
- st->input_bwidth = st->last_input_bwidth; // VE: TBD - this might be updated by actual detected BW
+ st->core_brate = -1; /* updated in dtx() */
+ st->input_bwidth = st->last_input_bwidth;
/*------------------------------------------------------------------*
* compensate for SPAR filterbank delay
@@ -430,9 +430,7 @@ ivas_error front_vad_spar(
noise_est_down( fr_bands[0], hFrontVad->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &hFrontVad->hNoiseEst->totalNoise, Etot[0], &hFrontVad->hNoiseEst->Etot_last, &hFrontVad->hNoiseEst->Etot_v_h2 );
corr_shift = correlation_shift( hFrontVad->hNoiseEst->totalNoise );
-
dtx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8 );
-
/* linear prediction analysis */
alw_pitch_lag_12k8[0] = st->old_pitch_la;
alw_pitch_lag_12k8[1] = st->old_pitch_la;
diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c
index 83161e761f3de331b9bc05df570077d5134eb721..006fb176fb401fbdfaaeb77f8cb0746d03983a4b 100644
--- a/lib_enc/ivas_init_enc.c
+++ b/lib_enc/ivas_init_enc.c
@@ -57,7 +57,7 @@ void ivas_write_format(
ind = 0;
nBits = IVAS_FORMAT_SIGNALING_NBITS;
- extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_SBA - IVAS_FORMAT_SIGNALING_NBITS );
+ extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - IVAS_FORMAT_SIGNALING_NBITS );
switch ( st_ivas->hEncoderConfig->ivas_format )
{
@@ -66,6 +66,11 @@ void ivas_write_format(
break;
case ISM_FORMAT:
ind = 2;
+ if ( st_ivas->hEncoderConfig->ivas_total_brate >= IVAS_24k4 )
+ {
+ ind = 4;
+ nBits += extra_bits;
+ }
break;
case MC_FORMAT:
ind = 1;
@@ -184,12 +189,16 @@ int16_t getNumChanAnalysis(
n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE;
if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT )
{
- n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order );
+ n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 );
}
else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) )
{
n = st_ivas->hEncoderConfig->nchan_inp;
}
+ else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ n = st_ivas->hEncoderConfig->nchan_inp;
+ }
else if ( st_ivas->hEncoderConfig->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM )
{
n = st_ivas->hEncoderConfig->nchan_inp;
@@ -290,6 +299,9 @@ void ivas_initialize_handles_enc(
/* MCT handle */
st_ivas->hMCT = NULL;
+ /* MC Param-Upmix handle */
+ st_ivas->hMCParamUpmix = NULL;
+
/* Parametric MC handle */
st_ivas->hParamMC = NULL;
@@ -313,9 +325,15 @@ void ivas_initialize_handles_enc(
*-------------------------------------------------------------------*/
ivas_error ivas_init_encoder(
- Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
- Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */
+ Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */
+#ifndef IND_LIST_DYN
+ ,
+ Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */
+#endif
+#ifndef IND_LIST_DYN
+ ,
Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */
+#endif
)
{
int16_t i, n;
@@ -339,12 +357,60 @@ ivas_error ivas_init_encoder(
/* In IVAS, ensure that minimum coded bandwidth is WB */
hEncoderConfig->max_bwidth = max( hEncoderConfig->max_bwidth, WB );
}
-
+#ifndef SBA_MODE_CLEAN_UP
+ hEncoderConfig->spar_reconfig_flag = 0;
+#endif
st_ivas->ism_mode = ISM_MODE_NONE;
st_ivas->mc_mode = MC_MODE_NONE;
+#ifndef SBA_MODE_CLEAN_UP
st_ivas->sba_mode = SBA_MODE_NONE;
+#endif
st_ivas->nchan_transport = -1;
+
+#ifdef IND_LIST_DYN
+ /*-----------------------------------------------------------------*
+ * Allocate and initialize buffer of indices
+ *-----------------------------------------------------------------*/
+
+ /* set the maximum allowed number of indices in the list */
+ st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( ivas_format, ivas_total_brate );
+
+ /* allocate buffer of indices */
+ if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) );
+ }
+
+ /* reset the list of indices */
+ for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ )
+ {
+ st_ivas->ind_list[i].nb_bits = -1;
+ }
+
+ /* set the maximum allowed number of metadata indices in the list */
+ st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate );
+
+ /* allocate buffer of metadata indices */
+ if ( st_ivas->ivas_max_num_indices_metadata > 0 )
+ {
+ if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) );
+ }
+
+ /* reset the list of metadata indices */
+ for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ )
+ {
+ st_ivas->ind_list_metadata[i].nb_bits = -1;
+ }
+ }
+ else
+ {
+ st_ivas->ind_list_metadata = NULL;
+ }
+#endif
+
/*-----------------------------------------------------------------*
* Allocate and initialize SCE/CPE and other handles
*-----------------------------------------------------------------*/
@@ -361,9 +427,10 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
+#endif
/* prepare stereo downmix for EVS */
if ( hEncoderConfig->stereo_dmx_evs == 1 )
@@ -386,7 +453,8 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n];
@@ -396,6 +464,7 @@ ivas_error ivas_init_encoder(
/* MetaData for DFT stereo */
st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
else if ( ivas_format == ISM_FORMAT )
{
@@ -415,12 +484,14 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* MetaData for ISMs */
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
@@ -431,7 +502,7 @@ ivas_error ivas_init_encoder(
}
}
- if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM )
+ if ( st_ivas->hEncoderConfig->Opt_DTX_ON )
{
if ( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK )
{
@@ -448,18 +519,23 @@ ivas_error ivas_init_encoder(
if ( ivas_format == SBA_FORMAT )
{
- st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate );
+#ifndef SBA_MODE_CLEAN_UP
+ st_ivas->sba_mode = ivas_sba_mode_select();
+#endif
st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order );
-
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR )
{
+#endif
if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK )
{
return error;
}
- }
+#ifndef SBA_MODE_CLEAN_UP
+ }
+#endif
if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
@@ -481,14 +557,20 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* MetaData for SBA */
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA );
+#endif
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON )
+#else
+ if ( ivas_format == SBA_FORMAT && st_ivas->hEncoderConfig->Opt_DTX_ON )
+#endif
{
st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1;
}
@@ -501,11 +583,12 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
+#ifndef IND_LIST_DYN
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES );
+#endif
if ( hEncoderConfig->Opt_DTX_ON )
{
@@ -513,12 +596,14 @@ ivas_error ivas_init_encoder(
}
}
+#ifndef IND_LIST_DYN
/* Metadata only initialized for the last CPE index */
if ( cpe_id == st_ivas->nCPE - 1 )
{
st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
}
+#endif
}
if ( st_ivas->nCPE > 1 )
@@ -547,6 +632,8 @@ ivas_error ivas_init_encoder(
return error;
}
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
/* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when
@@ -561,6 +648,7 @@ ivas_error ivas_init_encoder(
st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
}
+#endif
}
if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK )
@@ -575,6 +663,51 @@ ivas_error ivas_init_encoder(
st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( st_ivas->hEncoderConfig->mc_input_setup );
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ st_ivas->nSCE = 0;
+ st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
+ st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
+
+ if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
+ {
+ if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+#ifndef IND_LIST_DYN
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when
+ switching to ParamMC and ind_list is only visible here, can't be done later */
+ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n];
+ reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES );
+ }
+ /* Metadata only initialized for the last CPE index*/
+ if ( cpe_id == st_ivas->nCPE - 1 )
+ {
+ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE];
+ reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
+ }
+#endif
+ }
+
+ if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
if ( ( error = ivas_param_mc_enc_open( st_ivas ) ) != IVAS_ERR_OK )
@@ -589,7 +722,8 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n];
@@ -602,6 +736,7 @@ ivas_error ivas_init_encoder(
st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
}
+#endif
}
if ( st_ivas->nCPE > 1 )
@@ -642,12 +777,14 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id];
reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA );
+#endif
}
for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
@@ -659,7 +796,8 @@ ivas_error ivas_init_encoder(
return error;
}
- /* prepare bitstream buffers */
+#ifndef IND_LIST_DYN
+ /* allocate buffer of indices */
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE];
@@ -672,6 +810,7 @@ ivas_error ivas_init_encoder(
st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE];
reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );
}
+#endif
}
}
}
@@ -725,6 +864,10 @@ void destroy_core_enc(
ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */
)
{
+#ifdef IND_LIST_DYN
+ int16_t i;
+#endif
+
destroy_cldfb_encoder( hCoreCoder );
if ( hCoreCoder->hSignalBuf != NULL )
@@ -735,6 +878,13 @@ void destroy_core_enc(
if ( hCoreCoder->hBstr != NULL )
{
+#ifdef IND_LIST_DYN
+ /* reset buffer of indices */
+ for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ )
+ {
+ hCoreCoder->hBstr->ind_list[i].nb_bits = -1;
+ }
+#endif
free( hCoreCoder->hBstr );
hCoreCoder->hBstr = NULL;
}
@@ -942,11 +1092,7 @@ void ivas_destroy_enc(
ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 );
/* MASA handle */
-#ifdef FIX_350_MASA_DELAY_COMP
ivas_masa_enc_close( &( st_ivas->hMasa ) );
-#else
- ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, ivas_format );
-#endif
/* MCT handle */
ivas_mct_enc_close( &( st_ivas->hMCT ) );
@@ -954,6 +1100,9 @@ void ivas_destroy_enc(
/* LFE handle */
ivas_lfe_enc_close( &( st_ivas->hLFE ) );
+ /* Param-Upmix MC handle */
+ ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs );
+
/* Parametric MC handle */
ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs );
@@ -970,6 +1119,19 @@ void ivas_destroy_enc(
st_ivas->hEncoderConfig = NULL;
}
+#ifdef IND_LIST_DYN
+ /* Buffer of indices */
+ if ( st_ivas->ind_list != NULL )
+ {
+ free( st_ivas->ind_list );
+ }
+
+ if ( st_ivas->ind_list_metadata != NULL )
+ {
+ free( st_ivas->ind_list_metadata );
+ }
+#endif
+
/* main IVAS handle */
free( st_ivas );
diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c
index fe358f6c90815691223046ce81053b5b023dfe66..907997cf988a94f7ad4408080fbc2bd3fd0d27a7 100644
--- a/lib_enc/ivas_ism_dtx_enc.c
+++ b/lib_enc/ivas_ism_dtx_enc.c
@@ -42,6 +42,14 @@
#include "wmc_auto.h"
+/*-----------------------------------------------------------------------*
+ * Local constants
+ *-----------------------------------------------------------------------*/
+
+#define MD_MAX_DIFF_AZIMUTH 10
+#define MD_MAX_DIFF_ELEVATION 10
+
+
/*-------------------------------------------------------------------*
* ivas_ism_dtx_open()
*
@@ -66,8 +74,7 @@ ivas_error ivas_ism_dtx_open(
hISMDTX->dtx_flag = 0;
hISMDTX->sce_id_dtx = 0;
-
- set_s( hISMDTX->dtx_speech_buffer_enc, 0, PARAM_ISM_HYS_BUF_SIZE );
+ hISMDTX->cnt_SID_ISM = -1;
for ( i = 0; i < MAX_NUM_OBJECTS; i++ )
{
@@ -83,141 +90,222 @@ ivas_error ivas_ism_dtx_open(
/*-------------------------------------------------------------------*
- * ivas_ism_dtx_enc()
+ * ivas_ism_get_dtx_enc()
*
* Analysis and decision about DTX in ISM format
*-------------------------------------------------------------------*/
/*! r: indication of DTX frame */
int16_t ivas_ism_dtx_enc(
- Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
- int16_t *sid_flag /* o : indication of SID frame */
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */
+ const int32_t ivas_total_brate, /* i : IVAS total bitrate */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ int16_t md_diff_flag[], /* o : metadata differential flag */
+ int16_t *sid_flag /* o : indication of SID frame */
)
{
- int16_t i, val, dtx_flag;
+ int16_t ch, dtx_flag;
+ int16_t nBits, nBits_MD_max;
+ int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id;
+ float lp_noise[MAX_NUM_OBJECTS], lp_noise_variation, lp_noise_mean;
+ float lp_noise_max;
+ float tmp1, tmp2;
+
+ /* initialization */
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
+ }
- dtx_flag = 0;
- *sid_flag = 0;
+ /*------------------------------------------------------------------*
+ * compute global ISM DTX flag
+ *-----------------------------------------------------------------*/
+
+ /* compute global ISM based on localVAD */
+ dtx_flag = 1;
+ for ( ch = 0; ch < nchan_transport; ch++ )
+ {
+ dtx_flag &= !vad_flag[ch];
+ }
- /* Move the DTX/CNG speech buffer */
- for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ )
+ /* compute global ISM based on long-term background noise */
+ /* one of the channels is active -> no DTX */
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = st_ivas->hISMDTX->dtx_speech_buffer_enc[i + 1];
+ lp_noise[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise;
}
- /* If both TCs are active frame, do not do any post processing */
- if ( !( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 ) )
+ lp_noise_variation = var( lp_noise, nchan_transport );
+ lp_noise_mean = mean( lp_noise, nchan_transport );
+
+ if ( lp_noise_mean > 50 || ( lp_noise_mean > 25 && lp_noise_variation > 32 ) )
{
- /* covers 3 cases
- * case 1: ch0 -> Inactive Frame, ch 1 -> Inactive Frame -> do not do any post-processing (Activate DTX)
- * case 2: ch0 -> Inactive Frame, ch 1 -> Active Frame
- * case 3: ch0 -> Active Frame, ch 1 -> Inactive Frame
- */
-
- /* case 2 -> ch 0 is inactive, set it to active */
- if ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ dtx_flag = 0;
+ }
+
+
+ /* default DTX is applied at lower bitrates; otherwise DTX is applied only in silence */
+ maximum( lp_noise, nchan_transport, &lp_noise_max );
+
+ if ( !( ( nchan_ism == 1 && ivas_total_brate <= IVAS_24k4 ) ||
+ ( nchan_ism == 2 && ivas_total_brate <= IVAS_48k ) ||
+ ( nchan_ism == 3 && ivas_total_brate <= IVAS_80k ) ||
+ ( nchan_ism == 4 && ivas_total_brate <= IVAS_96k ) ||
+ lp_noise_max < 15 ) )
+ {
+ dtx_flag = 0;
+ }
+
+ /*------------------------------------------------------------------*
+ * Reset the bitstream
+ *-----------------------------------------------------------------*/
+
+ if ( dtx_flag )
+ {
+ /* reset the bitstream (IVAS format signaling was already written) */
+ reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr,
+
+#ifdef IND_LIST_DYN
+ hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot
+#else
+ MAX_NUM_INDICES
+#endif
+ );
+ }
+
+ /*------------------------------------------------------------------*
+ * decide about SID metadata to be sent or not (per object)
+ * estimate the MD bit-budget consumption
+ *-----------------------------------------------------------------*/
+
+ if ( dtx_flag )
+ {
+ ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &tmp1, &tmp2, &nBits_coh, &nBits_sce_id );
+
+ nBits = 0;
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0;
+ /* check difference between current and last metadata */
+ md_diff_flag[ch] = 0;
+ if ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_azimuth ) > MD_MAX_DIFF_AZIMUTH )
+ {
+ md_diff_flag[ch] = 1;
+ }
+
+ if ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_elevation ) > MD_MAX_DIFF_ELEVATION )
+ {
+ md_diff_flag[ch] = 1;
+ }
+
+ /* estimate SID metadata bit-budget */
+ nBits++; /* number of objects */
+ nBits++; /* SID metadata flag */
+ if ( md_diff_flag[ch] == 1 )
+ {
+ nBits += nBits_azimuth;
+ nBits += nBits_elevation;
+ }
}
- /* case 3 -> ch 1 is inactive, set it to active */
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ /* calculate maximum available MD bit-budget */
+ nBits_MD_max = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
+ nBits_MD_max -= SID_FORMAT_NBITS;
+ if ( nchan_transport > 1 )
{
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0;
+ nBits_MD_max -= nBits_sce_id;
}
- /* case 1: both TCs are inactive */
- if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ for ( ch = 0; ch < nchan_transport - 1; ch++ )
{
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 1;
+ nBits_MD_max -= nBits_coh; /* coherence */
}
- }
- else
- {
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0;
- }
- /* Do a decision based on hysteresis */
- st_ivas->hISMDTX->dtx_flag = 1;
+ if ( nchan_ism > 3 )
+ {
+ nBits_MD_max--; /* ism_mode flag */
+ }
- for ( i = 1; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ )
- {
- if ( ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i + 1] == 1 ) && ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i - 1] == 1 ) && ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i] == 0 ) )
+ /* too many metadata bits -> switch to active coding */
+ if ( nBits > nBits_MD_max )
{
- st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 1;
+ dtx_flag = 0;
}
}
- val = sum_s( st_ivas->hISMDTX->dtx_speech_buffer_enc, PARAM_ISM_HYS_BUF_SIZE );
+ /*------------------------------------------------------------------*
+ * set core_brate for all channels
+ * get 'sid_flag' value
+ *-----------------------------------------------------------------*/
+
+ *sid_flag = 0;
- if ( val < 7 )
+ if ( !dtx_flag )
{
- for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ )
+ /* at least one of the channels is active -> no DTX */
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- st_ivas->hISMDTX->dtx_flag = st_ivas->hISMDTX->dtx_flag && st_ivas->hISMDTX->dtx_speech_buffer_enc[i];
+ hSCE[ch]->hCoreCoder[0]->core_brate = -1;
+ set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 );
}
- }
- if ( st_ivas->hISMDTX->dtx_flag )
- {
- /* case 1 */
- /* force FD-CNG */
- st_ivas->hSCE[0]->hCoreCoder[0]->cng_type = FD_CNG;
- st_ivas->hSCE[1]->hCoreCoder[0]->cng_type = FD_CNG;
+ hISMDTX->cnt_SID_ISM = -1;
- /* synchronize the core bitrate */
- if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) )
+ /* IVAS format signaling was erased in dtx() */
+ if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 )
{
- st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate;
- reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES );
+ /* replicate ivas_write_format() */
+ int16_t ind = 2;
+ nBits = IVAS_FORMAT_SIGNALING_NBITS;
+ if ( ivas_total_brate >= IVAS_24k4 )
+ {
+ ind = 4;
+ nBits = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED;
+ }
+
+ push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits );
}
-
- st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->core_brate;
}
- else
+ else /* ism_dtx_flag == 1 */
{
- if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = -1;
- st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = -1;
-
- /* since ch0 is detected as inactive frame and we are setting it as active frame,
- we need to reset bitstream pointer and write the ivas_format once more */
- ivas_write_format( st_ivas );
+ hSCE[ch]->hCoreCoder[0]->cng_type = FD_CNG;
}
- /* case 3 -> ch 1 is inactive, set it to active */
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ /* * update the global SID counter */
+ hISMDTX->cnt_SID_ISM++;
+ if ( hISMDTX->cnt_SID_ISM >= hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID )
{
- st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = -1;
+ /* adaptive SID update interval */
+ hSCE[0]->hCoreCoder[0]->hDtxEnc->max_SID = hSCE[0]->hCoreCoder[0]->hDtxEnc->interval_SID;
+ hISMDTX->cnt_SID_ISM = 0;
}
- /* case 2 -> ch 0 is inactive, set it to active */
- if ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) )
+ /* encode SID in one channel only */
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = -1;
-
- /* since ch0 is detected as inactive frame and we are setting it as active frame,
- we need to reset bitstream pointer and write the ivas_format once more */
- ivas_write_format( st_ivas );
+ hSCE[ch]->hCoreCoder[0]->core_brate = FRAME_NO_DATA;
}
- }
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 )
- {
- *sid_flag = 1;
- dtx_flag = 1;
+ if ( hISMDTX->cnt_SID_ISM == 0 )
+ {
+ hSCE[hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate = SID_2k40;
+ *sid_flag = 1;
+ }
}
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA )
+ if ( dtx_flag == 1 && *sid_flag == 0 )
{
- dtx_flag = 1;
+ set_s( md_diff_flag, 0, nchan_transport );
}
return dtx_flag;
}
-
/*-------------------------------------------------------------------*
* ivas_ism_get_sce_id_dtx()
*
@@ -288,7 +376,7 @@ void ivas_ism_coh_estim_dtx_enc(
{
Encoder_State *st, *st_id0;
int16_t sce_id, i;
- float acorr_ene[PARAM_ISM_MAX_DMX], xcorr_ene;
+ float acorr_ene[MAX_NUM_OBJECTS], xcorr_ene;
if ( nchan_transport == 1 )
{
diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c
index ead873af0c148e40a814a06861c9133b3f6fec1c..6c6a0c8837a378e879f6ac180d4291a546f7a51c 100644
--- a/lib_enc/ivas_ism_enc.c
+++ b/lib_enc/ivas_ism_enc.c
@@ -85,8 +85,11 @@ ivas_error ivas_ism_enc(
float Etot_LR[1]; /* total energy; correlation shift */
float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */
int16_t localVAD_HE_SAD[1]; /* local HE VAD */
- int16_t i, nBits;
- int16_t dtx_flag, sid_flag;
+ int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech;
+ int16_t md_diff_flag[MAX_NUM_OBJECTS];
+#ifdef IND_LIST_DYN
+ Encoder_State *prev_st = NULL;
+#endif
ivas_error error;
push_wmops( "ivas_ism_enc" );
@@ -99,6 +102,10 @@ ivas_error ivas_ism_enc(
dtx_flag = 0;
sid_flag = 0;
+ flag_noisy_speech = 0;
+
+ nchan_ism = st_ivas->hEncoderConfig->nchan_ism;
+ set_s( md_diff_flag, 1, nchan_ism );
/*------------------------------------------------------------------*
* Preprocesing
@@ -164,20 +171,27 @@ ivas_error ivas_ism_enc(
return error;
}
- vad_flag[sce_id] = st->vad_flag;
+ if ( st_ivas->hEncoderConfig->Opt_DTX_ON )
+ {
+ vad_flag[sce_id] = vad_flag_dtx[sce_id][0];
+ }
+ else
+ {
+ vad_flag[sce_id] = st->vad_flag;
+ }
}
/*------------------------------------------------------------------*
* DTX analysis
*-----------------------------------------------------------------*/
- if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM )
+ if ( st_ivas->hEncoderConfig->Opt_DTX_ON )
{
/* compute the dominant sce_id using long term energy */
ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame );
/* analysis and decision about DTX */
- dtx_flag = ivas_ism_dtx_enc( st_ivas, &sid_flag );
+ dtx_flag = ivas_ism_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag );
if ( sid_flag )
{
@@ -186,8 +200,11 @@ ivas_error ivas_ism_enc(
}
#ifdef DEBUG_MODE_PARAM_ISM
- dbgwrite( &( st_ivas->hISMDTX->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" );
+ if ( st_ivas->hDirAC != NULL )
+ dbgwrite( &( st_ivas->hDirAC->hParamIsm->flag_noisy_speech ), sizeof( int16_t ), 1, 1, "./res/ParamISM_noisy_speech_flag_enc.dat" );
dbgwrite( &( st_ivas->hISMDTX->dtx_flag ), sizeof( int16_t ), 1, 1, "./res/ParamISM_DTX_CNG_flag_enc.dat" );
+ dbgwrite( &( st_ivas->hISMDTX->sce_id_dtx ), sizeof( int16_t ), 1, input_frame, "./res/sce_id_dtx" );
+ dbgwrite( &( dtx_flag ), sizeof( int16_t ), 1, input_frame, "./res/dtx_flag" );
#endif
}
@@ -199,53 +216,33 @@ ivas_error ivas_ism_enc(
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
ivas_param_ism_compute_noisy_speech_flag( st_ivas );
+ flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech;
}
if ( dtx_flag )
{
- if ( sid_flag )
- {
- ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm );
- }
+ ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata );
}
else if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
-#ifdef TD5
- ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag );
-#else
- ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm );
-#endif
+ ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag );
}
else /* ISM_MODE_DISC */
{
-#ifdef TD5
- ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag );
-#else
- ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL );
-#endif
+ ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag );
}
+ update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag );
+
/*----------------------------------------------------------------*
* Write IVAS format signaling in SID frames
*----------------------------------------------------------------*/
st = st_ivas->hSCE[0]->hCoreCoder[0];
- if ( st->core_brate == SID_2k40 )
+ if ( sid_flag )
{
ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr );
-
- if ( st_ivas->ism_mode != ISM_MODE_PARAM )
- {
- /* write unused bits */
- nBits = ( IVAS_SID_5k2 - SID_2k40 ) / 50 - SID_FORMAT_NBITS;
- while ( nBits > 0 )
- {
- i = min( nBits, 16 );
- push_indice( st->hBstr, IND_UNUSED, 0, i );
- nBits -= i;
- }
- }
}
/*------------------------------------------------------------------*
@@ -257,6 +254,14 @@ ivas_error ivas_ism_enc(
hSCE = st_ivas->hSCE[sce_id];
st = hSCE->hCoreCoder[0];
+#ifdef IND_LIST_DYN
+ /* update pointer to the buffer of indices of the next channel */
+ if ( sce_id > 0 )
+ {
+ st->hBstr->ind_list = prev_st->hBstr->ind_list + prev_st->hBstr->nb_ind_tot;
+ }
+#endif
+
if ( st->low_rate_mode )
{
st->bwidth = WB;
@@ -304,6 +309,10 @@ ivas_error ivas_ism_enc(
/* Store previous attack detection flag */
st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent;
+
+#ifdef IND_LIST_DYN
+ prev_st = st;
+#endif
}
if ( dtx_flag )
@@ -314,10 +323,45 @@ ivas_error ivas_ism_enc(
{
st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_core;
st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_core_brate = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->core_brate;
+ st_ivas->hSCE[sce_id]->hCoreCoder[0]->last_L_frame = st_ivas->hSCE[st_ivas->hISMDTX->sce_id_dtx]->hCoreCoder[0]->last_L_frame;
}
}
}
+#ifdef DEBUG_MODE_INFO
+ if ( dtx_flag )
+ {
+ float tmpF;
+ int16_t id, n;
+
+ n = 0;
+ for ( sce_id = 0; sce_id < st_ivas->nchan_transport; sce_id++ )
+ {
+ if ( sce_id != st_ivas->hISMDTX->sce_id_dtx )
+ {
+ st = st_ivas->hSCE[sce_id]->hCoreCoder[0];
+ id = st->id_element;
+
+ dbgwrite( &st->core, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "core", n, id, ENC ) );
+ dbgwrite( &st->extl, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "extl", n, id, ENC ) );
+ dbgwrite( &st->bwidth, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "bwidth", n, id, ENC ) );
+ tmpF = st->total_brate / 1000.0f;
+ dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "total_brate", n, id, ENC ) );
+ tmpF = st->core_brate / 1000.0f;
+ dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "core_brate", n, id, ENC ) );
+ tmpF = st->extl_brate / 1000.0f;
+ dbgwrite( &tmpF, sizeof( float ), 1, input_frame, fname( debug_dir, "extl_brate", n, id, ENC ) );
+
+ dbgwrite( &st->coder_type, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type", n, id, ENC ) );
+ dbgwrite( &st->coder_type_raw, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "coder_type_raw", n, id, ENC ) );
+ dbgwrite( &st->vad_flag, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "vad_flag", n, id, ENC ) );
+ dbgwrite( &st->localVAD, sizeof( int16_t ), 1, input_frame, fname( debug_dir, "localVAD", n, id, ENC ) );
+
+ dbgwrite( &st->lp_noise, sizeof( float ), 1, input_frame, fname( debug_dir, "lp_noise", n, id, ENC ) );
+ }
+ }
+ }
+#endif
pop_wmops();
return error;
@@ -356,7 +400,7 @@ ivas_error ivas_ism_enc_config(
/* Reset and Initialize */
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- st_ivas->nchan_transport = 2;
+ st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE;
}
else
{
@@ -368,7 +412,7 @@ ivas_error ivas_ism_enc_config(
st_ivas->nSCE = st_ivas->nchan_transport;
st_ivas->nCPE = 0;
- if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
{
return error;
}
diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c
index 7ce4132321f991659830c4b41358ec65146bac57..a8c4982e4b39bb22a706951690e3d69be4caef77 100644
--- a/lib_enc/ivas_ism_metadata_enc.c
+++ b/lib_enc/ivas_ism_metadata_enc.c
@@ -49,33 +49,28 @@
* Local constants
*-----------------------------------------------------------------------*/
-#ifdef TD5
#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */
-#else
-#define ISM_NUM_PARAM 2 /* number of coded metadata parameters */
-#endif
#define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ )
#define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ )
-#ifdef TD5
-#define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ )
-#endif
-
-#define ISM_FEC_MAX 10
+#define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ )
+#define ISM_FEC_MAX 10
+#define ISM_MD_FEC_DIFF 10
+#define ISM_MD_INC_DIFF_CNT_MAX 6
+#define ISM_MD_FEC_CNT_MAX 25
+#define ISM_MD_RAD_FEC_DIFF 1
#define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */
-#ifdef TD5
/*-----------------------------------------------------------------------*
* Local function declarations
*-----------------------------------------------------------------------*/
-static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_azimuth_abs, const int16_t idx_elevation_abs, int16_t *flag_abs_azimuth, int16_t *flag_abs_elevation );
+static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 );
static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius );
-#endif
/*-------------------------------------------------------------------------*
* ivas_set_ism_metadata()
@@ -84,16 +79,13 @@ static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int1
*-------------------------------------------------------------------------*/
ivas_error ivas_set_ism_metadata(
- ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */
- const float azimuth, /* i : azimuth value */
-#ifdef TD5
- const float elevation, /* i : elevation */
- const float radius_meta, /* i : radius */
- const float yaw, /* i : yaw */
- const float pitch /* i : pitch */
-#else
- const float elevation /* i : elevation value */
-#endif
+ ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */
+ const float azimuth, /* i : azimuth value */
+ const float elevation, /* i : elevation */
+ const float radius_meta, /* i : radius */
+ const float yaw, /* i : yaw */
+ const float pitch, /* i : pitch */
+ const int16_t non_diegetic_flag /* i : non-diegetic object flag*/
)
{
if ( hIsmMeta == NULL )
@@ -106,11 +98,10 @@ ivas_error ivas_set_ism_metadata(
/* save read metadata parameters to the internal codec structure */
hIsmMeta->azimuth = azimuth;
hIsmMeta->elevation = elevation;
-#ifdef TD5
hIsmMeta->radius = radius_meta;
hIsmMeta->yaw = yaw;
hIsmMeta->pitch = pitch;
-#endif
+ hIsmMeta->non_diegetic_flag = non_diegetic_flag;
return IVAS_ERR_OK;
}
@@ -176,85 +167,55 @@ static void rate_ism_importance(
*-------------------------------------------------------------------------*/
ivas_error ivas_ism_metadata_enc(
- const int32_t ism_total_brate, /* i : ISM total bitrate */
- const int16_t nchan_transport, /* i : number of transport channels */
- ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
- SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- int16_t nb_bits_metadata[], /* o : number of metadata bits */
- const int16_t localVAD[], /* i : VAD flag */
- const int16_t ism_mode, /* i : ISM mode */
-#ifdef TD5
+ const int32_t ism_total_brate, /* i : ISM total bitrate */
+ const int16_t nchan_ism, /* i : number of ISM channels */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ int16_t nb_bits_metadata[], /* o : number of metadata bits */
+ const int16_t localVAD[], /* i : VAD flag */
+ const int16_t ism_mode, /* i : ISM mode */
const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */
const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */
-#else
- const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */
-#endif
)
{
-#ifdef TD5
-#ifdef TUNE_360_OBJECT_WITH_NOISE
int16_t i, ch, nb_bits_start = 0;
-#else
- int16_t i, ch, nb_bits_start = 0, diff;
-#endif
- int16_t idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS];
- int16_t idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS];
- int16_t flag_abs_azimuth_orientation[MAX_NUM_OBJECTS];
+ int16_t flag_abs_azimuth[MAX_NUM_OBJECTS];
+ int16_t flag_abs_elevation[MAX_NUM_OBJECTS];
+ int16_t idx_angle1_abs = 0;
+ int16_t idx_angle2_abs = 0;
+ int16_t flag_abs_yaw[MAX_NUM_OBJECTS];
+ int16_t flag_abs_pitch[MAX_NUM_OBJECTS];
int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS];
-#else
- int16_t i, ch, nb_bits_start = 0, diff;
- int16_t idx_azimuth, idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS], nbits_diff_azimuth;
- int16_t idx_elevation, idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS], nbits_diff_elevation;
-#endif
float valQ;
ISM_METADATA_HANDLE hIsmMetaData;
int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS];
int16_t ism_metadata_flag_global;
+ int16_t non_diegetic_flag_global;
int16_t ism_imp[MAX_NUM_OBJECTS];
- int16_t num_obj, nbands, nblocks;
+ int16_t nbands, nblocks;
ivas_error error;
error = IVAS_ERR_OK;
push_wmops( "ism_meta_enc" );
- if ( ism_mode == ISM_MODE_PARAM )
- {
- num_obj = hParamIsm->num_obj;
- }
- else if ( ism_mode == ISM_MODE_DISC )
- {
- num_obj = nchan_transport;
- }
- else
- {
- return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: incorrect ISM mode" );
- }
-
- if ( num_obj == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC )
- {
- /* no metadata encoding in CNG */
- pop_wmops();
-
- return error;
- }
-
/* initialization */
ism_metadata_flag_global = 0;
+ non_diegetic_flag_global = 0;
set_s( nb_bits_metadata, 0, nchan_transport );
- set_s( flag_abs_azimuth, 0, num_obj );
- set_s( flag_abs_elevation, 0, num_obj );
-#ifdef TD5
- set_s( flag_abs_azimuth_orientation, 0, num_obj );
- set_s( flag_abs_radius, 0, num_obj );
-#endif
+ set_s( flag_abs_azimuth, 0, nchan_ism );
+ set_s( flag_abs_elevation, 0, nchan_ism );
+ set_s( flag_abs_yaw, 0, nchan_ism );
+ set_s( flag_abs_pitch, 0, nchan_ism );
+ set_s( flag_abs_radius, 0, nchan_ism );
/*----------------------------------------------------------------*
* Set Metadata presence / importance flag
*----------------------------------------------------------------*/
- for ( ch = 0; ch < num_obj; ch++ )
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
if ( ism_mode == ISM_MODE_PARAM )
{
@@ -262,59 +223,39 @@ ivas_error ivas_ism_metadata_enc(
}
else if ( ism_mode == ISM_MODE_DISC )
{
-#ifdef TD5
-#ifdef TUNE_360_OBJECT_WITH_NOISE
- /* In case of low level noise for low bitrate inactive frames, do not sent metadata */
- if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) && ( hSCE[ch]->hCoreCoder[0]->lp_noise <= 10 ) )
- {
- hIsmMeta[ch]->ism_metadata_flag = 0;
- }
-#else
- if ( hIsmMeta[ch]->ism_metadata_flag )
+ if ( hIsmMeta[ch]->ism_metadata_flag == 1 )
{
- /* at highest bitrates (with TCX core only) metadata are sent also for inactive frames */
- if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) )
+ /* In case of low level noise for low bitrate inactive frames, do not sent metadata */
+ hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly;
+ /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */
+ if ( hIsmMeta[ch]->ism_metadata_flag == 0 )
{
- /* send metadata even in inactive segments when noise is audible and metadata are changing */
- diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_azimuth_idx, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ) );
- diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->angle[0].last_elevation_idx, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ) ) );
- if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE && ism_extended_metadata_flag )
+ if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) ||
+ ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) )
{
- diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->yaw - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_azimuth_idx, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ) ) );
- diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->pitch - ism_dequant_meta( hIsmMeta[ch]->angle[1].last_elevation_idx, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ) ) );
+ hIsmMeta[ch]->ism_metadata_flag = 1;
+ hIsmMeta[ch]->ism_md_inc_diff_cnt = 0;
}
- if ( !( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 ) )
+ else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX )
{
- hIsmMeta[ch]->ism_metadata_flag = 0;
- }
- }
- }
-#endif
-#else
-#ifdef TUNE_360_OBJECT_WITH_NOISE
- hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10;
-#else
- hIsmMeta[ch]->ism_metadata_flag = localVAD[ch];
+ hIsmMeta[ch]->ism_metadata_flag = 1;
- if ( hIsmMeta[ch]->ism_metadata_flag == 0 )
- {
- /* send metadata even in inactive segments when noise is audible and metadata are changing */
- diff = (int16_t) fabsf( hIsmMeta[ch]->azimuth - ism_dequant_meta( hIsmMeta[ch]->last_azimuth_idx, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS ) );
- diff = max( diff, (int16_t) fabsf( hIsmMeta[ch]->elevation - ism_dequant_meta( hIsmMeta[ch]->last_elevation_idx, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS ) ) );
-
- if ( hSCE[ch]->hCoreCoder[0]->lp_noise > 15 && diff >= 10 )
- {
- hIsmMeta[ch]->ism_metadata_flag = 1;
+ if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 )
+ {
+ hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX;
+ }
+ else
+ {
+ hIsmMeta[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX;
+ }
+ }
+ else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX )
+ {
+ hIsmMeta[ch]->ism_metadata_flag = 1;
+ hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX;
+ }
}
}
-#endif
-
- if ( hSCE[ch]->hCoreCoder[0]->tcxonly )
- {
- /* at highest bitrates (with TCX core only) metadata are sent in every frame */
- hIsmMeta[ch]->ism_metadata_flag = 1;
- }
-#endif
}
}
@@ -324,45 +265,35 @@ ivas_error ivas_ism_metadata_enc(
rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp );
-#ifndef TUNE_360_OBJECT_WITH_NOISE
- /* relax the importance decision in "stereo" coding for noisy audio */
- if ( ism_mode == ISM_MODE_DISC && num_obj == 2 )
- {
- float diff_F;
-
- if ( hIsmMeta[0]->ism_metadata_flag ^ hIsmMeta[1]->ism_metadata_flag )
- {
- for ( ch = 0; ch < num_obj; ch++ )
- {
- diff_F = hSCE[ch]->hCoreCoder[0]->lp_speech - hSCE[ch]->hCoreCoder[0]->lp_noise;
- if ( hIsmMeta[ch]->ism_metadata_flag == 0 && diff_F < 25.0f )
- {
- hIsmMeta[ch]->ism_metadata_flag = 1;
- ism_imp[ch] = ISM_LOW_IMP;
- }
- }
- }
- }
-#endif
/*----------------------------------------------------------------*
* Write ISM common signaling
*----------------------------------------------------------------*/
/* write number of objects - unary coding */
- for ( ch = 1; ch < num_obj; ch++ )
+ for ( ch = 1; ch < nchan_ism; ch++ )
{
push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 );
}
push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 );
-#ifdef TD5
+ for ( ch = 0; ch < nchan_ism; ch++ )
+ {
+ ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
+ non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag;
+ }
+
/* write extended metadata presence flag */
if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
{
push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS );
+
+ /* Write global non-diegetic object flag */
+ if ( ism_extended_metadata_flag )
+ {
+ push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, non_diegetic_flag_global, ISM_EXTENDED_METADATA_BITS );
+ }
}
-#endif
/* write ISM metadata flag (one per object) */
for ( ch = 0; ch < nchan_transport; ch++ )
@@ -370,11 +301,6 @@ ivas_error ivas_ism_metadata_enc(
push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS );
}
- for ( ch = 0; ch < num_obj; ch++ )
- {
- ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
- }
-
if ( ism_mode == ISM_MODE_DISC )
{
/* write VAD flag */
@@ -402,7 +328,7 @@ ivas_error ivas_ism_metadata_enc(
nb_bits_start = hBstr->nb_bits_tot;
}
- for ( ch = 0; ch < num_obj; ch++ )
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
hIsmMetaData = hIsmMeta[ch];
if ( ism_mode == ISM_MODE_DISC )
@@ -412,288 +338,72 @@ ivas_error ivas_ism_metadata_enc(
if ( hIsmMeta[ch]->ism_metadata_flag )
{
-#ifdef TD5
/*----------------------------------------------------------------*
* Quantize and encode azimuth and elevation
*----------------------------------------------------------------*/
- if ( ism_mode == ISM_MODE_DISC )
- {
- idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
- }
- else /* ISM_MODE_PARAM */
- {
- idx_azimuth_abs = hParamIsm->azi_index[ch];
- idx_elevation_abs = hParamIsm->ele_index[ch];
- }
-
- encode_angle_indices( hBstr, &( hIsmMetaData->angle[0] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] );
-
- /*----------------------------------------------------------------*
- * Quantize and encode radius, yaw, and pitch
- *----------------------------------------------------------------*/
-
- if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag )
- {
- idx_azimuth_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
- idx_elevation_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
- idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS );
- encode_angle_indices( hBstr, &( hIsmMetaData->angle[1] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth_orientation[ch], &flag_abs_elevation[ch] );
- encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] );
- }
-
- /* save number of metadata bits written */
- if ( ism_mode == ISM_MODE_DISC )
- {
- nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start;
- }
-#else
- /*----------------------------------------------------------------*
- * Azimuth quantization and encoding
- *----------------------------------------------------------------*/
-
- /* Azimuth quantization (quantize azimuth to the AZIMUTH_NBITS-bit index */
- if ( ism_mode == ISM_MODE_DISC )
+ if ( ism_extended_metadata_flag && non_diegetic_flag_global )
{
- idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
+ /* Write non-diegetic flag for each object */
+ push_indice( hBstr, IND_ISM_NDP_FLAG, hIsmMeta[ch]->non_diegetic_flag, ISM_METADATA_IS_NDP_BITS );
}
- else if ( ism_mode == ISM_MODE_PARAM )
- {
- idx_azimuth_abs = hParamIsm->azi_index[ch];
- }
- idx_azimuth = idx_azimuth_abs;
-
- nbits_diff_azimuth = 0;
- flag_abs_azimuth[ch] = 0; /* differential coding by default */
- if ( hIsmMetaData->azimuth_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
- || hIsmMetaData->last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
- )
+ if ( hIsmMeta[ch]->non_diegetic_flag )
{
- flag_abs_azimuth[ch] = 1;
- }
-
- /* try differential coding */
- if ( flag_abs_azimuth[ch] == 0 )
- {
- diff = idx_azimuth_abs - hIsmMetaData->last_azimuth_idx;
-
- /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */
- if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX )
- {
- if ( diff > 0 )
- {
- diff -= ( 1 << ISM_AZIMUTH_NBITS ) - 1;
- }
- else
- {
- diff += ( 1 << ISM_AZIMUTH_NBITS ) - 1;
- }
- }
-
- if ( diff == 0 )
+ /* Map azimuth to panning range [-90:90] */
+ if ( hIsmMetaData->azimuth > 90.0f )
{
- idx_azimuth = 0;
- nbits_diff_azimuth = 1;
+ hIsmMetaData->azimuth = 180.0f - hIsmMetaData->azimuth;
}
- else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */
- {
- idx_azimuth = 1 << 1;
- nbits_diff_azimuth = 1;
-
- if ( diff < 0 )
- {
- idx_azimuth += 1; /* negative sign */
- diff *= -1;
- }
- else
- {
- idx_azimuth += 0; /* positive sign */
- }
- idx_azimuth = idx_azimuth << diff;
- nbits_diff_azimuth++;
-
- /* unary coding of "diff */
- idx_azimuth += ( ( 1 << diff ) - 1 );
- nbits_diff_azimuth += diff;
-
- if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 )
- {
- /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */
- idx_azimuth = idx_azimuth << 1;
- nbits_diff_azimuth++;
- }
- }
- else
+ if ( hIsmMetaData->azimuth < -90.0f )
{
- flag_abs_azimuth[ch] = 1;
+ hIsmMetaData->azimuth = -180.0f - hIsmMetaData->azimuth;
}
- }
-
- /* update counter */
- if ( flag_abs_azimuth[ch] == 0 )
- {
- hIsmMetaData->azimuth_diff_cnt++;
- hIsmMetaData->elevation_diff_cnt = min( hIsmMetaData->elevation_diff_cnt, ISM_FEC_MAX );
- }
- else
- {
- hIsmMetaData->azimuth_diff_cnt = 0;
- }
-
- /* Write azimuth */
- push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, flag_abs_azimuth[ch], 1 );
- if ( flag_abs_azimuth[ch] )
- {
- push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, ISM_AZIMUTH_NBITS );
+ idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL );
}
else
{
- push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nbits_diff_azimuth );
- }
-
- /*----------------------------------------------------------------*
- * Elevation quantization and encoding
- *----------------------------------------------------------------*/
-
- /* Elevation quantization (quantize azimuth to the ELEVATION_NBITS-bit index */
- if ( ism_mode == ISM_MODE_DISC )
- {
- idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
- }
- else /* ISM_MODE_PARAM */
- {
- idx_elevation_abs = hParamIsm->ele_index[ch];
- }
- idx_elevation = idx_elevation_abs;
-
- nbits_diff_elevation = 0;
-
- flag_abs_elevation[ch] = 0; /* differential coding by default */
- if ( hIsmMetaData->elevation_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
- || hIsmMetaData->last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
- )
- {
- flag_abs_elevation[ch] = 1;
- }
-
- /* note: elevation is coded starting from the second frame only (it is meaningless in the init_frame) */
- if ( hSCE[0]->hCoreCoder[0]->ini_frame == 0 )
- {
- flag_abs_elevation[ch] = 1;
- hIsmMetaData->last_elevation_idx = idx_elevation_abs;
- }
-
- diff = idx_elevation_abs - hIsmMetaData->last_elevation_idx;
-
- /* avoid absolute coding of elevation if absolute coding was already used for azimuth */
- if ( flag_abs_azimuth[ch] == 1 )
- {
- int16_t diff_orig = diff;
-
- flag_abs_elevation[ch] = 0;
-
-
- if ( diff >= 0 )
- {
- diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX );
- }
- else
- {
- diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX );
- }
-
- if ( hIsmMetaData->last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX )
+ if ( ism_mode == ISM_MODE_DISC )
{
- hIsmMetaData->elevation_diff_cnt = ISM_FEC_MAX - 1;
+ idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
}
- }
-
- /* try differential coding */
- if ( flag_abs_elevation[ch] == 0 )
- {
- if ( diff == 0 )
+ else /* ISM_MODE_PARAM */
{
- idx_elevation = 0;
- nbits_diff_elevation = 1;
+ idx_angle1_abs = hParamIsm->azi_index[ch];
+ idx_angle2_abs = hParamIsm->ele_index[ch];
}
- else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX )
- {
- idx_elevation = 1 << 1;
- nbits_diff_elevation = 1;
- if ( diff < 0 )
- {
- idx_elevation += 1; /* negative sign */
- diff *= -1;
- }
- else
- {
- idx_elevation += 0; /* positive sign */
- }
+ encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] );
- idx_elevation = idx_elevation << diff;
- nbits_diff_elevation++;
+ /*----------------------------------------------------------------*
+ * Quantize and encode radius, yaw, and pitch
+ *----------------------------------------------------------------*/
- /* unary coding of "diff */
- idx_elevation += ( ( 1 << diff ) - 1 );
- nbits_diff_elevation += diff;
-
- if ( nbits_diff_elevation < ISM_ELEVATION_NBITS )
- {
- /* add stop bit */
- idx_elevation = idx_elevation << 1;
- nbits_diff_elevation++;
- }
- }
- else
+ if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag )
{
- flag_abs_elevation[ch] = 1;
- }
- }
-
- /* update counter */
- if ( flag_abs_elevation[ch] == 0 )
- {
- hIsmMetaData->elevation_diff_cnt++;
- hIsmMetaData->elevation_diff_cnt = min( hIsmMetaData->elevation_diff_cnt, ISM_FEC_MAX );
- }
- else
- {
- hIsmMetaData->elevation_diff_cnt = 0;
- }
-
- /* Write elevation */
- if ( flag_abs_azimuth[ch] == 0 ) /* do not write "flag_abs_elevation" if "flag_abs_azimuth == 1" */
- {
- push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, flag_abs_elevation[ch], 1 );
- }
+ idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
+ idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
+ idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS );
- if ( flag_abs_elevation[ch] )
- {
- push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, ISM_ELEVATION_NBITS );
- }
- else
- {
- push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nbits_diff_elevation );
+ encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] );
+ encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] );
+ }
}
- /*----------------------------------------------------------------*
- * Updates
- *----------------------------------------------------------------*/
-
- hIsmMetaData->last_azimuth_idx = idx_azimuth_abs;
- hIsmMetaData->last_elevation_idx = idx_elevation_abs;
-
/* save number of metadata bits written */
if ( ism_mode == ISM_MODE_DISC )
{
nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start;
}
-#endif
+
+ /* Updates */
+ hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth;
+ hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation;
+ hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius;
}
}
@@ -703,16 +413,12 @@ ivas_error ivas_ism_metadata_enc(
*----------------------------------------------------------------*/
i = 0;
- while ( i == 0 || i < num_obj / INTER_OBJECT_PARAM_CHECK )
+ while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK )
{
int16_t num, abs_num, abs_first, abs_next, pos_zero;
-#ifdef TD5
int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM];
-#else
- int16_t abs_matrice[INTER_OBJECT_PARAM_CHECK * 2];
-#endif
- num = min( INTER_OBJECT_PARAM_CHECK, num_obj - i * INTER_OBJECT_PARAM_CHECK );
+ num = min( INTER_OBJECT_PARAM_CHECK, nchan_ism - i * INTER_OBJECT_PARAM_CHECK );
i++;
set_s( abs_matrice, 0, INTER_OBJECT_PARAM_CHECK * ISM_NUM_PARAM );
@@ -758,20 +464,12 @@ ivas_error ivas_ism_metadata_enc(
if ( abs_next % ISM_NUM_PARAM == 0 )
{
-#ifdef TD5
- hIsmMeta[ch]->angle[0].azimuth_diff_cnt = abs_num - 1;
-#else
- hIsmMeta[ch]->azimuth_diff_cnt = abs_num - 1;
-#endif
+ hIsmMeta[ch]->position_angle.angle1_diff_cnt = abs_num - 1;
}
if ( abs_next % ISM_NUM_PARAM == 1 )
{
-#ifdef TD5
- hIsmMeta[ch]->angle[0].elevation_diff_cnt = abs_num - 1;
-#else
- hIsmMeta[ch]->elevation_diff_cnt = abs_num - 1;
-#endif
+ hIsmMeta[ch]->position_angle.angle2_diff_cnt = abs_num - 1;
/*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/
}
@@ -834,21 +532,32 @@ ivas_error ivas_ism_metadata_enc(
* Configuration and decision about bitrates per channel
*----------------------------------------------------------------*/
- if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, num_obj, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK )
{
return error;
}
- for ( ch = 0; ch < num_obj; ch++ )
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag;
+
+ if ( hIsmMeta[ch]->ism_metadata_flag == 0 )
+ {
+ hIsmMeta[ch]->ism_md_fec_cnt_enc++;
+ }
+ else
+ {
+ hIsmMeta[ch]->ism_md_fec_cnt_enc = 0;
+ }
+ hIsmMeta[ch]->ism_md_inc_diff_cnt++;
+ hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX );
}
for ( ch = 0; ch < nchan_transport; ch++ )
{
+ hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
if ( ism_mode == ISM_MODE_DISC )
{
- hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0;
if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global )
{
hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1;
@@ -861,7 +570,11 @@ ivas_error ivas_ism_metadata_enc(
/* write metadata only in active frames */
if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 )
{
+#ifdef IND_LIST_DYN
+ reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->nb_ind_tot );
+#else
reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA );
+#endif
}
}
@@ -888,7 +601,7 @@ ivas_error ivas_ism_metadata_enc_create(
if ( st_ivas->ism_mode == ISM_MODE_PARAM )
{
- nchan_transport = 2;
+ nchan_transport = MAX_PARAM_ISM_WAVE;
}
else
{
@@ -906,30 +619,31 @@ ivas_error ivas_ism_metadata_enc_create(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) );
}
-
-#ifdef TD5
- st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[0].azimuth_diff_cnt = ISM_FEC_MAX;
- st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[0].elevation_diff_cnt = ISM_FEC_MAX - 1;
+ st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0;
+ st_ivas->hIsmMetaData[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX;
+ st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 0;
+ st_ivas->hIsmMetaData[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX - 1;
+ st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0;
+ st_ivas->hIsmMetaData[ch]->orientation_angle.angle1_diff_cnt = ISM_FEC_MAX - 2;
+ st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 0;
+ st_ivas->hIsmMetaData[ch]->orientation_angle.angle2_diff_cnt = ISM_FEC_MAX - 2;
st_ivas->hIsmMetaData[ch]->last_radius_idx = 0;
st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2;
- st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[1].azimuth_diff_cnt = ISM_FEC_MAX - 2;
- st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 0;
- st_ivas->hIsmMetaData[ch]->angle[1].elevation_diff_cnt = ISM_FEC_MAX - 2;
-#else
- st_ivas->hIsmMetaData[ch]->last_azimuth_idx = 0;
- st_ivas->hIsmMetaData[ch]->azimuth_diff_cnt = ISM_FEC_MAX;
- st_ivas->hIsmMetaData[ch]->last_elevation_idx = 0;
- st_ivas->hIsmMetaData[ch]->elevation_diff_cnt = ISM_FEC_MAX - 1;
-#endif
st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0;
ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] );
+
+ st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f;
+ st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f;
+
+ st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f;
+ st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f;
+ st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0;
+ st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX;
+ st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f;
}
- if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -938,7 +652,6 @@ ivas_error ivas_ism_metadata_enc_create(
}
-#ifdef TD5
/*-------------------------------------------------------------------------
* encode_radius()
*
@@ -1047,41 +760,40 @@ static void encode_radius(
*
* Encoding of an angle
*----------------------------------------------------------------*/
-
static void encode_angle_indices(
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */
- const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */
- const int16_t ini_frame, /* i : initialization frames counter */
- const int16_t idx_azimuth_abs, /* i : Azimuth index */
- const int16_t idx_elevation_abs, /* i : Elevation index */
- int16_t *flag_abs_azimuth, /* o : Azimuth encoding mode */
- int16_t *flag_abs_elevation /* o : Elevation encoding mode */
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */
+ const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */
+ const int16_t ini_frame, /* i : initialization frames counter */
+ const int16_t idx_angle1_abs, /* i : Azimuth index */
+ const int16_t idx_angle2_abs, /* i : Elevation index */
+ int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */
+ int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */
)
{
- int16_t idx_azimuth, nbits_diff_azimuth, diff;
- int16_t idx_elevation, nbits_diff_elevation;
+ int16_t idx_angle1, nbits_diff_angle1, diff;
+ int16_t idx_angle2, nbits_diff_angle2;
/*----------------------------------------------------------------*
- * Azimuth index encoding
+ * Azimuth/yaw index encoding
*----------------------------------------------------------------*/
- idx_azimuth = idx_azimuth_abs;
+ idx_angle1 = idx_angle1_abs;
- nbits_diff_azimuth = 0;
+ nbits_diff_angle1 = 0;
- *flag_abs_azimuth = 0; /* differential coding by default */
- if ( angle->azimuth_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
- || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
+ *flag_abs_angle1 = 0; /* differential coding by default */
+ if ( angle->angle1_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
+ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
)
{
- *flag_abs_azimuth = 1;
+ *flag_abs_angle1 = 1;
}
/* try differential coding */
- if ( *flag_abs_azimuth == 0 )
+ if ( *flag_abs_angle1 == 0 )
{
- diff = idx_azimuth_abs - angle->last_azimuth_idx;
+ diff = idx_angle1_abs - angle->last_angle1_idx;
/* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */
if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX )
@@ -1098,189 +810,338 @@ static void encode_angle_indices(
if ( diff == 0 )
{
- idx_azimuth = 0;
- nbits_diff_azimuth = 1;
+ idx_angle1 = 0;
+ nbits_diff_angle1 = 1;
}
else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */
{
- idx_azimuth = 1 << 1;
- nbits_diff_azimuth = 1;
+ idx_angle1 = 1 << 1;
+ nbits_diff_angle1 = 1;
if ( diff < 0 )
{
- idx_azimuth += 1; /* negative sign */
+ idx_angle1 += 1; /* negative sign */
diff *= -1;
}
else
{
- idx_azimuth += 0; /* positive sign */
+ idx_angle1 += 0; /* positive sign */
}
- idx_azimuth = idx_azimuth << diff;
- nbits_diff_azimuth++;
+ idx_angle1 = idx_angle1 << diff;
+ nbits_diff_angle1++;
/* unary coding of "diff */
- idx_azimuth += ( ( 1 << diff ) - 1 );
- nbits_diff_azimuth += diff;
+ idx_angle1 += ( ( 1 << diff ) - 1 );
+ nbits_diff_angle1 += diff;
- if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 )
+ if ( nbits_diff_angle1 < ISM_AZIMUTH_NBITS - 1 )
{
/* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */
- idx_azimuth = idx_azimuth << 1;
- nbits_diff_azimuth++;
+ idx_angle1 = idx_angle1 << 1;
+ nbits_diff_angle1++;
}
}
else
{
- *flag_abs_azimuth = 1;
+ *flag_abs_angle1 = 1;
}
}
/* update counter */
- if ( *flag_abs_azimuth == 0 )
+ if ( *flag_abs_angle1 == 0 )
{
- angle->azimuth_diff_cnt++;
- angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX );
+ angle->angle1_diff_cnt++;
+ angle->angle1_diff_cnt = min( angle->angle1_diff_cnt, ISM_FEC_MAX );
}
else
{
- angle->azimuth_diff_cnt = 0;
+ angle->angle1_diff_cnt = 0;
}
- /* Write azimuth */
- push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_azimuth, 1 );
+ /* Write azimuth/yaw */
+ push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_angle1, 1 );
- if ( *flag_abs_azimuth )
+ if ( *flag_abs_angle1 )
{
- push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, ISM_AZIMUTH_NBITS );
+ push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, ISM_AZIMUTH_NBITS );
}
else
{
- push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nbits_diff_azimuth );
+ push_indice( hBstr, IND_ISM_AZIMUTH, idx_angle1, nbits_diff_angle1 );
}
/*----------------------------------------------------------------*
- * Elevation index encoding
+ * Elevation/pitch index encoding
*----------------------------------------------------------------*/
- idx_elevation = idx_elevation_abs;
- nbits_diff_elevation = 0;
- *flag_abs_elevation = 0; /* differential coding by default */
- if ( angle->elevation_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
- || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
- )
+ if ( flag_abs_angle2 )
{
- *flag_abs_elevation = 1;
- }
+ idx_angle2 = idx_angle2_abs;
+ nbits_diff_angle2 = 0;
+ *flag_abs_angle2 = 0; /* differential coding by default */
+ if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */
+ || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */
+ )
+ {
+ *flag_abs_angle2 = 1;
+ }
- /* note: elevation is coded starting from the second frame only (it is meaningless in the init_frame) */
- if ( ini_frame == 0 )
- {
- *flag_abs_elevation = 1;
- angle->last_elevation_idx = idx_elevation_abs;
- }
+ /* note: elevation/pitch is coded starting from the second frame only (it is meaningless in the init_frame) */
+ if ( ini_frame == 0 )
+ {
+ *flag_abs_angle2 = 1;
+ angle->last_angle2_idx = idx_angle2_abs;
+ }
- diff = idx_elevation_abs - angle->last_elevation_idx;
+ diff = idx_angle2_abs - angle->last_angle2_idx;
- /* avoid absolute coding of elevation if absolute coding was already used for azimuth */
- if ( *flag_abs_azimuth == 1 )
- {
- int16_t diff_orig = diff;
+ /* avoid absolute coding of elevation/pitch if absolute coding was already used for azimuth/yaw */
+ if ( *flag_abs_angle1 == 1 )
+ {
+ int16_t diff_orig = diff;
+
+ *flag_abs_angle2 = 0;
+
+
+ if ( diff >= 0 )
+ {
+ diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX );
+ }
+ else
+ {
+ diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX );
+ }
+
+ if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX )
+ {
+ angle->angle2_diff_cnt = ISM_FEC_MAX - 1;
+ }
+ }
+
+ /* try differential coding */
+ if ( *flag_abs_angle2 == 0 )
+ {
+ if ( diff == 0 )
+ {
+ idx_angle2 = 0;
+ nbits_diff_angle2 = 1;
+ }
+ else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX )
+ {
+ idx_angle2 = 1 << 1;
+ nbits_diff_angle2 = 1;
+
+ if ( diff < 0 )
+ {
+ idx_angle2 += 1; /* negative sign */
+ diff *= -1;
+ }
+ else
+ {
+ idx_angle2 += 0; /* positive sign */
+ }
- *flag_abs_elevation = 0;
+ idx_angle2 = idx_angle2 << diff;
+ nbits_diff_angle2++;
+ /* unary coding of "diff */
+ idx_angle2 += ( ( 1 << diff ) - 1 );
+ nbits_diff_angle2 += diff;
+
+ if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS )
+ {
+ /* add stop bit */
+ idx_angle2 = idx_angle2 << 1;
+ nbits_diff_angle2++;
+ }
+ }
+ else
+ {
+ *flag_abs_angle2 = 1;
+ }
+ }
- if ( diff >= 0 )
+ /* update counter */
+ if ( *flag_abs_angle2 == 0 )
{
- diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX );
+ angle->angle2_diff_cnt++;
+ angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX );
}
else
{
- diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX );
+ angle->angle2_diff_cnt = 0;
}
- if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX )
+ /* Write elevation */
+ if ( *flag_abs_angle1 == 0 ) /* do not write "flag_abs_elevation/pitch" if "flag_abs_azimuth/yaw == 1" */
{
- angle->elevation_diff_cnt = ISM_FEC_MAX - 1;
+ push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_angle2, 1 );
+ }
+
+ if ( *flag_abs_angle2 )
+ {
+ push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, ISM_ELEVATION_NBITS );
+ }
+ else
+ {
+ push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 );
}
}
- /* try differential coding */
- if ( *flag_abs_elevation == 0 )
+ /*----------------------------------------------------------------*
+ * Updates
+ *----------------------------------------------------------------*/
+
+ angle->last_angle1_idx = idx_angle1_abs;
+ angle->last_angle2_idx = idx_angle2_abs;
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * ivas_ism_metadata_sid_enc()
+ *
+ * Quantize and encode ISM metadata in SID frame
+ *-------------------------------------------------------------------*/
+
+void ivas_ism_metadata_sid_enc(
+ ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
+ const int16_t flag_noisy_speech, /* i : noisy speech flag */
+ const int16_t nchan_ism, /* i : number of objects */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ const ISM_MODE ism_mode, /* i : ISM mode */
+ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */
+ const int16_t sid_flag, /* i : indication of SID frame */
+ const int16_t md_diff_flag[], /* i : metadata differental flag */
+ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
+ int16_t nb_bits_metadata[] /* o : number of metadata bits */
+)
+{
+ int16_t i, ch, nBits, nBits_start, nBits_unused;
+ float q_step, q_step_border;
+ int16_t idx, idx_azimuth, idx_elevation;
+ int16_t nBits_azimuth, nBits_elevation, nBits_coh, nBits_sce_id;
+ float valQ;
+ ISM_METADATA_HANDLE hIsmMetaData;
+
+ if ( sid_flag )
{
- if ( diff == 0 )
+ nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
+ nBits -= SID_FORMAT_NBITS;
+ nBits_start = hBstr->nb_bits_tot;
+
+ /*----------------------------------------------------------------*
+ * Write ISm common signaling
+ *----------------------------------------------------------------*/
+
+ /* write number of objects - unary coding */
+ for ( ch = 1; ch < nchan_ism; ch++ )
{
- idx_elevation = 0;
- nbits_diff_elevation = 1;
+ push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 );
}
- else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX )
+ push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 );
+
+ /* write SID metadata flag (one per object) */
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
- idx_elevation = 1 << 1;
- nbits_diff_elevation = 1;
+ push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 );
+ }
- if ( diff < 0 )
+ /*----------------------------------------------------------------*
+ * Set quantization bits based on the number of coded objects
+ *----------------------------------------------------------------*/
+
+ ivas_get_ism_sid_quan_bitbudget( nchan_ism, &nBits_azimuth, &nBits_elevation, &q_step, &q_step_border, &nBits_coh, &nBits_sce_id );
+
+ /*----------------------------------------------------------------*
+ * Spatial parameters, loop over TCs - 1
+ *----------------------------------------------------------------*/
+
+ /* write ISM mode flag to explicitly signal number of spatial parameters */
+ if ( nchan_ism > 2 )
+ {
+ if ( ism_mode == ISM_MODE_DISC )
{
- idx_elevation += 1; /* negative sign */
- diff *= -1;
+ push_indice( hBstr, IND_ISM_VAD_FLAG, 0, 1 );
}
else
{
- idx_elevation += 0; /* positive sign */
+ push_indice( hBstr, IND_ISM_VAD_FLAG, 1, 1 );
}
- idx_elevation = idx_elevation << diff;
- nbits_diff_elevation++;
+ if ( ism_mode == ISM_MODE_PARAM )
+ {
+ /* write noisy speech flag */
+ push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, flag_noisy_speech, 1 );
+ nBits_sce_id = 1;
+ }
+ }
- /* unary coding of "diff */
- idx_elevation += ( ( 1 << diff ) - 1 );
- nbits_diff_elevation += diff;
+ if ( nchan_transport > 1 )
+ {
+ /* write sce id */
+ push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, nBits_sce_id );
- if ( nbits_diff_elevation < ISM_ELEVATION_NBITS )
+ /* quantize and write coherence */
+ for ( ch = 0; ch < nchan_transport; ch++ )
{
- /* add stop bit */
- idx_elevation = idx_elevation << 1;
- nbits_diff_elevation++;
+ if ( ch == hISMDTX->sce_id_dtx )
+ {
+ continue;
+ }
+
+ idx = (int16_t) ( hISMDTX->coh[ch] * ( ( 1 << nBits_coh ) - 1 ) + 0.5f );
+ assert( ( idx >= 0 ) && ( idx <= ( ( 1 << nBits_coh ) - 1 ) ) );
+ push_indice( hBstr, IND_ISM_DTX_COH_SCA, idx, nBits_coh );
}
}
- else
+
+ /*----------------------------------------------------------------*
+ * Metadata quantization and coding, loop over all objects
+ *----------------------------------------------------------------*/
+
+ for ( ch = 0; ch < nchan_ism; ch++ )
{
- *flag_abs_elevation = 1;
- }
- }
+ if ( md_diff_flag[ch] == 1 )
+ {
+ hIsmMetaData = hIsmMeta[ch];
- /* update counter */
- if ( *flag_abs_elevation == 0 )
- {
- angle->elevation_diff_cnt++;
- angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX );
- }
- else
- {
- angle->elevation_diff_cnt = 0;
- }
+ idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth );
+ idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation );
- /* Write elevation */
- if ( *flag_abs_azimuth == 0 ) /* do not write "flag_abs_elevation" if "flag_abs_azimuth == 1" */
- {
- push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_elevation, 1 );
- }
+ push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth );
+ push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nBits_elevation );
- if ( *flag_abs_elevation )
- {
- push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, ISM_ELEVATION_NBITS );
- }
- else
- {
- push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nbits_diff_elevation );
- }
+ /* update last indexes to correspond to active frames coding */
+ if ( nBits_azimuth > ISM_AZIMUTH_NBITS )
+ {
+ hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS );
+ hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS );
+ }
+ else
+ {
+ hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth );
+ hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation );
+ }
- /*----------------------------------------------------------------*
- * Updates
- *----------------------------------------------------------------*/
+ hIsmMetaData->ism_md_fec_cnt_enc = 0;
+ hIsmMeta[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX;
+ }
+ }
- angle->last_azimuth_idx = idx_azimuth_abs;
- angle->last_elevation_idx = idx_elevation_abs;
+ /* Write unused (padding) bits */
+ nBits_unused = nBits - hBstr->nb_bits_tot;
+ while ( nBits_unused > 0 )
+ {
+ i = min( nBits_unused, 16 );
+ push_indice( hBstr, IND_UNUSED, 0, i );
+ nBits_unused -= i;
+ }
+
+ nb_bits_metadata[0] = hBstr->nb_bits_tot - nBits_start;
+ }
return;
}
-#endif
diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c
index cde2327968bf85a5dc7869b96db8fb261317cbc9..24038448d9e0b77b595bdb283619d0ac1f1c9cb5 100644
--- a/lib_enc/ivas_ism_param_enc.c
+++ b/lib_enc/ivas_ism_param_enc.c
@@ -47,16 +47,20 @@
static void ivas_param_ism_compute_obj_parameters(
+ const int16_t nchan_ism, /* i : number of ISM channels */
float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX], /* i : Reference power */
PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM Enc Handle */
)
{
- int16_t i, b, m, br, mr, num_obj;
+ int16_t i, b, m, br, mr;
int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac;
float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS];
+ float ref_power_local_frame[MAX_NUM_OBJECTS];
+ float tmp_ratio;
- num_obj = hParamIsm->num_obj;
- assert( num_obj == 3 || num_obj == 4 );
+ set_f( ref_power_local_frame, 0, MAX_NUM_OBJECTS );
+
+ assert( nchan_ism == 3 || nchan_ism == 4 );
for ( b = 0; b < hParamIsm->nbands; b++ )
{
@@ -81,7 +85,7 @@ static void ivas_param_ism_compute_obj_parameters(
/* for each object, sum up reference power within current T/F tile */
- for ( i = 0; i < num_obj; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
for ( mr = mrange_start; mr < mrange_end; mr++ )
{
@@ -90,6 +94,8 @@ static void ivas_param_ism_compute_obj_parameters(
ref_power_local[i] += reference_power_obj[i][mr][br];
}
}
+ /* Sum up T/F tiles per object */
+ ref_power_local_frame[i] += ref_power_local[i];
}
/* find two dominant objects and derive object indices for current T/F tile */
@@ -103,7 +109,8 @@ static void ivas_param_ism_compute_obj_parameters(
index_1 = 1;
index_2 = 0;
}
- for ( i = 2; i < num_obj; i++ )
+
+ for ( i = MAX_PARAM_ISM_WAVE; i < nchan_ism; i++ )
{
if ( ref_power_local[i] > ref_power_local[index_1] )
{
@@ -144,28 +151,48 @@ static void ivas_param_ism_compute_obj_parameters(
}
}
+ /* Check if objects have roughly equal power by comparing reference power of first object against all others*/
+ hParamIsm->flag_equal_energy = 1;
+ for ( i = 1; i < nchan_ism; i++ )
+ {
+ if ( ref_power_local_frame[i] != 0.0f )
+ {
+ tmp_ratio = ref_power_local_frame[0] / ref_power_local_frame[i];
+
+ if ( ( tmp_ratio > 0.975f ) && ( tmp_ratio < 1.025f ) )
+ {
+ hParamIsm->flag_equal_energy &= 1;
+ }
+ else
+ {
+ hParamIsm->flag_equal_energy &= 0;
+ break;
+ }
+ }
+ }
+
return;
}
static void ivas_param_ism_enc_quantize_DOA(
+ const int16_t nchan_ism, /* i : number of ISM channels */
ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata */
PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM encoder handle */
)
{
- int16_t i, azi_idx, ele_idx, num_obj;
+ int16_t i, azi_idx, ele_idx;
float valQ;
- num_obj = hParamIsm->num_obj;
/* Loop over objects */
- for ( i = 0; i < num_obj; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
/* Quantize the elevation and obtain quantized elevation value and index */
- ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, 1 << ISM_ELEVATION_NBITS );
+ ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS );
/* Obtain the index of quantized azimuth values */
- azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, 1 << ISM_AZIMUTH_NBITS );
+ azi_idx = ism_quant_meta( hIsmMetaData[i]->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS );
/*Replace azimuth with quantized values */
hIsmMetaData[i]->azimuth = valQ;
@@ -191,7 +218,7 @@ void ivas_param_ism_stereo_dmx(
const int16_t input_frame /* i : Length of input frame */
)
{
- int16_t i, j, num_obj;
+ int16_t i, j;
float alpha, azi_shift, tmp, tmp_1;
float cardioid_left[MAX_NUM_OBJECTS], cardioid_right[MAX_NUM_OBJECTS];
float stereo_dmx[2][L_FRAME48k];
@@ -202,14 +229,13 @@ void ivas_param_ism_stereo_dmx(
/*Initialization*/
alpha = 0.5;
azi_shift = 0;
- num_obj = st_ivas->hDirAC->hParamIsm->num_obj;
/* Set the stereo dmx to zero */
set_zero( stereo_dmx[0], L_FRAME48k );
set_zero( stereo_dmx[1], L_FRAME48k );
/* Loop over all objects */
- for ( i = 0; i < num_obj; i++ )
+ for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ )
{
hIsmMetaData = st_ivas->hIsmMetaData[i];
@@ -271,11 +297,15 @@ ivas_error ivas_param_ism_enc_open(
input_Fs = st_ivas->hEncoderConfig->input_Fs;
- /* Assign the number of objects */
- hDirAC->hParamIsm->num_obj = st_ivas->hEncoderConfig->nchan_inp;
/* set FB config. */
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -286,7 +316,7 @@ ivas_error ivas_param_ism_enc_open(
return error;
}
- ivas_param_ism_config( hDirAC->hParamIsm );
+ ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->hEncoderConfig->nchan_inp );
/* Assign memories for Band and Block grouping */
hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS;
@@ -353,6 +383,7 @@ void ivas_param_ism_enc(
)
{
int16_t i, j, ts, l_ts;
+ int16_t nchan_ism;
int16_t num_time_slots;
float *pcm_in[MAX_NUM_OBJECTS];
float fb_RealBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX];
@@ -363,6 +394,7 @@ void ivas_param_ism_enc(
DIRAC_ENC_HANDLE hDirAC;
PARAM_ISM_CONFIG_HANDLE hParamIsm;
+ nchan_ism = st_ivas->hEncoderConfig->nchan_ism;
hDirAC = st_ivas->hDirAC;
hParamIsm = hDirAC->hParamIsm;
@@ -371,7 +403,7 @@ void ivas_param_ism_enc(
l_ts = input_frame / PARAM_ISM_MDFT_NO_SLOTS;
num_time_slots = PARAM_ISM_MDFT_NO_SLOTS;
- for ( i = 0; i < hParamIsm->num_obj; i++ )
+ for ( i = 0; i < nchan_ism; i++ )
{
pcm_in[i] = &data[i][0];
@@ -380,12 +412,16 @@ void ivas_param_ism_enc(
p_fb_RealBuffer[i] = &fb_RealBuffer[i][0];
p_fb_ImagBuffer[i] = &fb_ImagBuffer[i][0];
}
+
for ( ts = 0; ts < num_time_slots; ts++ )
{
- ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts );
- ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts,
+ hDirAC->hFbMixer->fb_cfg->num_in_chans );
- for ( i = 0; i < hParamIsm->num_obj; i++ )
+ ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts,
+ hDirAC->hFbMixer->fb_cfg->num_in_chans );
+
+ for ( i = 0; i < nchan_ism; i++ )
{
pcm_in[i] += l_ts;
for ( j = 0; j < DIRAC_NO_FB_BANDS_MAX; j++ )
@@ -396,142 +432,16 @@ void ivas_param_ism_enc(
}
/* Quantize DOAs */
- ivas_param_ism_enc_quantize_DOA( st_ivas->hIsmMetaData, hParamIsm );
+ ivas_param_ism_enc_quantize_DOA( nchan_ism, st_ivas->hIsmMetaData, hParamIsm );
/* Compute object indices and power ratios */
- ivas_param_ism_compute_obj_parameters( reference_power_obj, hParamIsm );
+ ivas_param_ism_compute_obj_parameters( nchan_ism, reference_power_obj, hParamIsm );
pop_wmops();
return;
}
-static void ivas_param_ism_enc_quantize_DOA_dtx(
- float azimuth,
- float elevation,
- int16_t azi_bits,
- int16_t ele_bits,
- int16_t *azi_idx,
- int16_t *ele_idx )
-{
- int16_t nbits, npoints, angle_spacing, az_alpha, ele_alpha;
- float azi_val;
-
- /* Step 1: Determine angle spacing/n_points based on minimum value among elevation/azimuth bits */
- nbits = min( azi_bits, ele_bits );
-
- if ( nbits == ISM_ELEVATION_NBITS )
- {
- angle_spacing = 5;
- }
- else
- {
- angle_spacing = (int16_t) ( ( 180.f / (float) ( 1 << nbits ) ) + 0.5f );
- }
-
- npoints = (int16_t) ( ( 90 / angle_spacing ) + 0.5f );
-
- /* Step 2: Quantize Elevation */
- ele_alpha = 2 * npoints - 1;
- *ele_idx = (int16_t) ( ( elevation / angle_spacing ) + 0.5f ) + npoints;
- if ( *ele_idx >= ele_alpha )
- {
- *ele_idx = ele_alpha - 1;
- }
- assert( ( 0 <= *ele_idx ) && ( *ele_idx < ele_alpha ) );
-
- /* Step 3: Quantize Azimuth */
- az_alpha = 4 * npoints - 1;
-
- /* Convert azimuth in {-180,180} into {0,360} before quantization */
- if ( azimuth >= 0 )
- {
- azi_val = azimuth;
- }
- else
- {
- azi_val = azimuth + 360.f;
- }
-
- /* Obtain the index of quantized azimuth values */
- *azi_idx = (int16_t) ( ( ( azi_val / 360.f ) * az_alpha ) + 0.5f );
- if ( *azi_idx == az_alpha )
- {
- /*wrap around the azimuth angle*/
- *azi_idx = 0;
- }
- assert( ( 0 <= *azi_idx ) && ( *azi_idx < az_alpha ) );
-
- return;
-}
-
-
-/*-------------------------------------------------------------------------
- * ivas_param_ism_metadata_dtx_enc()
- *
- *-------------------------------------------------------------------------*/
-
-void ivas_param_ism_metadata_dtx_enc(
- BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
- ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */
- ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */
- PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */
-)
-{
- int16_t i, nBits, nBits_unused;
- int16_t azi_idx, ele_idx;
- int16_t coh_idx;
-
- nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC;
- nBits -= SID_FORMAT_NBITS;
-
- /* Transmit the metadata */
- /* write number of objects - unary coding */
- for ( i = 1; i < hParamIsm->num_obj; i++ )
- {
- push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 );
- }
- push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 );
-
- /* write sce id */
- push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, 1 );
-
- /* write noisy speech flag */
- push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, hParamIsm->flag_noisy_speech, 1 );
-
- /* quantize and write coherence */
- coh_idx = (int16_t) ( hISMDTX->coh[0] * ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) + 0.5f );
- assert( ( coh_idx >= 0 ) && ( coh_idx <= ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) ) );
- push_indice( hBstr, IND_ISM_DTX_COH_SCA, coh_idx, PARAM_ISM_DTX_COH_SCA_BITS );
-
- for ( i = 0; i < hParamIsm->num_obj; i++ )
- {
- ivas_param_ism_enc_quantize_DOA_dtx( hIsmMeta[i]->azimuth, hIsmMeta[i]->elevation, PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, &azi_idx, &ele_idx );
- push_indice( hBstr, IND_ISM_AZIMUTH, azi_idx, PARAM_ISM_DTX_AZI_BITS );
- push_indice( hBstr, IND_ISM_ELEVATION, ele_idx, PARAM_ISM_DTX_ELE_BITS );
- }
-
-#ifdef DEBUG_MODE_PARAM_ISM
- dbgwrite( &( hParamIsm->coh ), sizeof( float ), 1, 1, "./res/ParamISM_coh_enc.dat" );
-#endif
-
- /* Write unused (padding) bits */
- nBits_unused = nBits - hBstr->nb_bits_tot;
- while ( nBits_unused > 0 )
- {
- i = min( nBits_unused, 16 );
- push_indice( hBstr, IND_UNUSED, 0, i );
- nBits_unused -= i;
- }
-
-#ifdef DEBUGGING
- assert( hBstr->nb_bits_tot == nBits );
-#endif
-
- return;
-}
-
-
/*-------------------------------------------------------------------*
* ivas_param_ism_compute_noisy_speech_flag()
*
@@ -550,31 +460,38 @@ void ivas_param_ism_compute_noisy_speech_flag(
st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i + 1];
}
- /* For the current frame, make a decision based on some core-coder flags */
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr )
+ /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */
+ if ( !st_ivas->hDirAC->hParamIsm->flag_equal_energy )
+ {
+ st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0;
+ st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 0;
+ }
+ else
{
- if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag && st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag )
+ /* For the current frame, make a decision based on some core-coder flags */
+ if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr )
{
- st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0;
+ if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag )
+ {
+ st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0;
+ }
+ else
+ {
+ st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1;
+ }
}
else
{
- st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1;
+ st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0;
}
- }
- else
- {
- st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0;
- }
-
- /* Do a decision based on hysterisis */
- st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1;
- for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ )
- {
- st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i];
+ /* Do a decision based on hysteresis */
+ st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1;
+ for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ )
+ {
+ st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i];
+ }
}
-
return;
}
diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c
index a14424774ffec7ed5270d26f8d46926c9568e53e..a76c31cdc5fd96f9542547cf45d25dd17c15e8fc 100644
--- a/lib_enc/ivas_lfe_enc.c
+++ b/lib_enc/ivas_lfe_enc.c
@@ -98,7 +98,11 @@ static void ivas_lfe_enc_quant(
BSTR_ENC_HANDLE hBstr )
{
int16_t bits_written;
+#ifdef IND_LIST_DYN
+ int16_t nb_ind_tot;
+#else
int16_t next_ind_pos;
+#endif
uint16_t quant_strategy, write_bit;
int16_t num_quant_strategies;
int16_t shift_bits;
@@ -117,7 +121,11 @@ static void ivas_lfe_enc_quant(
num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS;
shift_bits = IVAS_LFE_SHIFT_BITS;
bits_written = hBstr->nb_bits_tot;
+#ifdef IND_LIST_DYN
+ nb_ind_tot = hBstr->nb_ind_tot;
+#else
next_ind_pos = hBstr->next_ind;
+#endif
for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ )
@@ -243,7 +251,11 @@ static void ivas_lfe_enc_quant(
}
bits_written_arith_enc = hBstr->nb_bits_tot;
+#ifdef IND_LIST_DYN
+ next_ind_pos_arith_enc = hBstr->nb_ind_tot;
+#else
next_ind_pos_arith_enc = hBstr->next_ind;
+#endif
push_next_indice( hBstr, coding_strategy, 1 );
base2_num_bits_tot = hBstr->nb_bits_tot - bits_written;
@@ -259,13 +271,24 @@ static void ivas_lfe_enc_quant(
{
if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) )
{
+#ifdef IND_LIST_DYN
+ /* reset bits buffer and code the indices with base 2 coding */
+ for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- )
+ {
+ hBstr->ind_list[j].nb_bits = -1;
+ }
+ hBstr->nb_ind_tot = next_ind_pos_arith_enc;
+#else
/* reset bits buffer and code the indices with base 2 coding */
for ( j = hBstr->next_ind - 1; j >= next_ind_pos_arith_enc; j-- )
{
hBstr->ind_list[j].nb_bits = -1;
}
+#endif
hBstr->nb_bits_tot = bits_written_arith_enc;
+#ifndef IND_LIST_DYN
hBstr->next_ind = next_ind_pos_arith_enc;
+#endif
coding_strategy = 1;
push_next_indice( hBstr, coding_strategy, 1 );
@@ -297,14 +320,21 @@ static void ivas_lfe_enc_quant(
{
if ( quant_strategy < ( num_quant_strategies - 1 ) )
{
- /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */
+#ifdef IND_LIST_DYN
+ for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- )
+#else
for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- )
+#endif
{
hBstr->ind_list[j].nb_bits = -1;
}
hBstr->nb_bits_tot = bits_written;
+#ifdef IND_LIST_DYN
+ hBstr->nb_ind_tot = nb_ind_tot;
+#else
hBstr->next_ind = next_ind_pos;
+#endif
}
}
}
diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c
index 337753925c24dcab21c99a66b36b8adb8c762544..707e1b3397656913137b85d9a92f6c7041937509 100644
--- a/lib_enc/ivas_masa_enc.c
+++ b/lib_enc/ivas_masa_enc.c
@@ -31,8 +31,8 @@
*******************************************************************************************************/
#include
-#include "options.h"
#include
+#include "options.h"
#include "ivas_cnst.h"
#include "ivas_prot.h"
#include "ivas_rom_com.h"
@@ -40,6 +40,7 @@
#include "wmc_auto.h"
#include "prot.h"
+
/*-----------------------------------------------------------------------*
* Local function prototypes
*-----------------------------------------------------------------------*/
@@ -50,9 +51,9 @@ static void combine_directions( MASA_ENCODER_HANDLE hMasa );
static void find_n_largest( const float *input, int16_t *largestIndices, const int16_t numElements, const int16_t numLargest );
-static void move_metadata_to_qmetadata( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMeta );
+static void move_metadata_to_qmetadata( const MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMeta );
-static void detect_metadata_composition( MASA_ENCODER_HANDLE hMasa, uint8_t *joinedSubframes, uint8_t *coherencePresent, uint8_t *isTwoDir );
+static void detect_metadata_composition( const MASA_ENCODER_HANDLE hMasa, uint8_t *joinedSubframes, uint8_t *coherencePresent, uint8_t *isTwoDir );
static void compensate_energy_ratios( MASA_ENCODER_HANDLE hMasa );
@@ -60,6 +61,26 @@ static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR
static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format );
+static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]
+#ifdef HR_METADATA
+ ,
+ const SPHERICAL_GRID_DATA *sphGrid
+#ifdef FIX_505_MASA_SPHGRID_REUSE
+ ,
+ const uint8_t useSphGrid
+#endif
+#endif
+);
+
+static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo );
+
+static void copy_masa_metadata( const MASA_METADATA_HANDLE hMetaFrom, MASA_METADATA_HANDLE hMetaTo );
+
+static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, const uint8_t sf1_idx, const MASA_METADATA_HANDLE frame2, const uint8_t sf2_idx );
+
+static void detect_framing_async( MASA_ENCODER_HANDLE hMasa );
+
+static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa );
/*-----------------------------------------------------------------------*
* Local constants
@@ -119,16 +140,6 @@ ivas_error ivas_masa_enc_open(
mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 );
mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 );
-#ifndef FIX_350_MASA_DELAY_COMP
- if ( hEncoderConfig->ivas_format == MASA_FORMAT )
- {
- for ( i = 0; i < st_ivas->nchan_transport; i++ )
- {
- hMasa->data.delay_buffer[i] = (float *) malloc( MASA_ENC_DELAY_SLOTS * CLDFB_NO_CHANNELS_MAX * sizeof( float ) );
- set_f( hMasa->data.delay_buffer[i], 0.0f, MASA_ENC_DELAY_SLOTS * CLDFB_NO_CHANNELS_MAX );
- }
- }
-#endif
hMasa->data.onset_detector_1 = 0.0f;
hMasa->data.onset_detector_2 = 0.0f;
@@ -136,6 +147,16 @@ ivas_error ivas_masa_enc_open(
set_zero( hMasa->data.lfeToTotalEnergyRatio, MAX_PARAM_SPATIAL_SUBFRAMES );
hMasa->data.prevq_lfeToTotalEnergyRatio = 0.0f;
hMasa->data.prevq_lfeIndex = 0;
+
+ hMasa->data.sync_state.prev_sim_stop = 0;
+ hMasa->data.sync_state.prev_offset = 0;
+ hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF;
+
+ set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS );
+ set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS );
+ set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS );
+ set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS );
+
st_ivas->hMasa = hMasa;
return error;
@@ -150,11 +171,6 @@ ivas_error ivas_masa_enc_open(
void ivas_masa_enc_close(
MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */
-#ifndef FIX_350_MASA_DELAY_COMP
- ,
- const int16_t nchan_transport, /* i : Number of transport channels */
- const IVAS_FORMAT ivas_format /* i : IVAS format */
-#endif
)
{
int16_t i;
@@ -169,16 +185,6 @@ void ivas_masa_enc_close(
deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) );
}
-#ifndef FIX_350_MASA_DELAY_COMP
- if ( ivas_format == MASA_FORMAT )
- {
- for ( i = 0; i < nchan_transport; i++ )
- {
- free( ( *hMasa )->data.delay_buffer[i] );
- ( *hMasa )->data.delay_buffer[i] = NULL;
- }
- }
-#endif
free( ( *hMasa ) );
( *hMasa ) = NULL;
@@ -244,10 +250,20 @@ ivas_error ivas_masa_encode(
mvr2r( hMasa->masaMetadata.directional_meta[i].azimuth[j], h_orig_metadata[i].azimuth[j], MASA_FREQUENCY_BANDS );
mvr2r( hMasa->masaMetadata.directional_meta[i].elevation[j], h_orig_metadata[i].elevation[j], MASA_FREQUENCY_BANDS );
mvr2r( hMasa->masaMetadata.directional_meta[i].energy_ratio[j], h_orig_metadata[i].energy_ratio[j], MASA_FREQUENCY_BANDS );
+#ifdef HR_METADATA
+ mvs2s( (int16_t *) ( hMasa->masaMetadata.directional_meta[i].spherical_index[j] ), (int16_t *) ( h_orig_metadata[i].spherical_index[j] ), MASA_FREQUENCY_BANDS );
+#endif
}
}
}
+#ifdef HR_METADATA
+ if ( ivas_format == MASA_FORMAT && ivas_total_brate >= IVAS_384k )
+ {
+ hMasa->config.mergeRatiosOverSubframes = 0;
+ }
+#endif
+
/* Combine frequency bands and sub-frames */
combine_freqbands_and_subframes( hMasa );
}
@@ -311,7 +327,26 @@ ivas_error ivas_masa_encode(
}
/* Encode metadata */
- ivas_qmetadata_enc_encode( hMetaData, hQMetaData );
+#ifdef HR_METADATA
+ if ( ivas_total_brate >= IVAS_384k )
+ {
+ if ( ivas_total_brate >= IVAS_512k )
+ {
+ ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 16, 4 );
+ }
+ else
+ {
+ ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 11, 3 );
+ }
+ }
+ else
+ {
+#endif
+ ivas_qmetadata_enc_encode( hMetaData, hQMetaData,
+ 0 );
+#ifdef HR_METADATA
+ }
+#endif
*nb_bits_metadata = hMetaData->nb_bits_tot;
@@ -367,7 +402,11 @@ ivas_error ivas_masa_encode(
free( h_orig_metadata );
+#ifndef SBA_MODE_CLEAN_UP
ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format, SBA_MODE_NONE );
+#else
+ ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format );
+#endif
/* restore old values */
hMasa->config.numCodingBands = numCodingBands;
@@ -414,27 +453,10 @@ void ivas_masa_estimate_energy(
for ( ts = mrange[0]; ts < mrange[1]; ts++ )
{
-#ifdef FIX_350_MASA_DELAY_COMP
for ( i = 0; i < nchan_transport; i++ )
{
cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] );
}
-#else
- if ( ts < MASA_ENC_DELAY_SLOTS )
- {
- for ( i = 0; i < nchan_transport; i++ )
- {
- cldfbAnalysis_ts( &( hMasa->data.delay_buffer[i][l_ts * ts] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] );
- }
- }
- else
- {
- for ( i = 0; i < nchan_transport; i++ )
- {
- cldfbAnalysis_ts( &( data_f[i][l_ts * ( ts - MASA_ENC_DELAY_SLOTS )] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] );
- }
- }
-#endif
for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ )
{
@@ -462,12 +484,6 @@ void ivas_masa_estimate_energy(
}
}
-#ifndef FIX_350_MASA_DELAY_COMP
- for ( i = 0; i < nchan_transport; i++ )
- {
- mvr2r( &data_f[i][input_frame - MASA_ENC_DELAY_SLOTS * maxBin], &( hMasa->data.delay_buffer[i][0] ), MASA_ENC_DELAY_SLOTS * maxBin );
- }
-#endif
return;
}
@@ -491,7 +507,16 @@ ivas_error ivas_masa_enc_config(
uint8_t coherencePresent;
uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */
int32_t ivas_total_brate;
+#ifdef FIX_HBR_MASAMETA
+ uint8_t maxBand;
+ int16_t maxBin, sf;
+#endif
ivas_error error;
+#ifdef HR_METADATA
+#ifndef FIX_505_MASA_SPHGRID_REUSE
+ SPHERICAL_GRID_DATA *sphGrid;
+#endif
+#endif
error = IVAS_ERR_OK;
@@ -506,6 +531,44 @@ ivas_error ivas_masa_enc_config(
if ( ivas_format == MASA_FORMAT )
{
+ masa_metadata_direction_alignment( hMasa );
+
+ detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */
+
+ if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 )
+ {
+#ifdef HR_METADATA
+#ifndef FIX_505_MASA_SPHGRID_REUSE
+ if ( ( sphGrid = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA spherical grid\n" ) );
+ }
+
+ if ( ivas_total_brate == IVAS_512k )
+ {
+ generate_gridEq( sphGrid );
+ }
+ else
+ {
+ sphGrid->no_theta = 0;
+ }
+#endif
+#endif
+
+ /* average over sub-frames */
+ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy
+#ifdef HR_METADATA
+ ,
+#ifdef FIX_505_MASA_SPHGRID_REUSE
+ &( hMasa->data.Sph_Grid16 ),
+ ivas_total_brate == IVAS_512k ? TRUE : FALSE
+#else
+ sphGrid
+#endif
+#endif
+ );
+ }
+
/* Inspect metadata for parameter changes that affect coding. */
detect_metadata_composition( hMasa, &joinedSubframes, &coherencePresent, &isActualTwoDir );
hMasa->config.joinedSubframes = joinedSubframes;
@@ -514,7 +577,7 @@ ivas_error ivas_masa_enc_config(
}
else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA )
{
- /* For mcMASA, these are set only once as this function is called only once. */
+ /* For McMASA, these are set only once as this function is called only once. */
hMasa->config.joinedSubframes = 0;
hMasa->config.numberOfDirections = 1;
}
@@ -595,10 +658,56 @@ ivas_error ivas_masa_enc_config(
ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format );
-#ifdef FIX_373_MASA_DELAY_COMP_MSAN
- masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL );
+#ifdef FIX_HBR_MASAMETA
+ /* Find maximum band usable */
+ maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH );
+ maxBand = 0;
+ while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin )
+ {
+ maxBand++;
+ }
+ maxBand--;
+
+ if ( ivas_total_brate > IVAS_256k )
+ {
+ int16_t continueLoop;
+ continueLoop = 1;
+ while ( maxBand > 5 && continueLoop )
+ {
+ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
+ {
+ if ( hMasa->data.energy[sf][maxBand - 1] > 100000 )
+ {
+ continueLoop = 0;
+ break;
+ }
+ }
+ if ( continueLoop )
+ {
+ maxBand--;
+ }
+ }
+
+ if ( maxBand < MASA_MAXIMUM_CODING_SUBBANDS )
+ {
+ st_ivas->hQMetaData->q_direction->cfg.inactiveBands = MASA_MAXIMUM_CODING_SUBBANDS - maxBand;
+ }
+ else
+ {
+ st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0;
+ }
+ }
+
+ masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ivas_total_brate > IVAS_256k, NULL );
+
+ if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands )
+ {
+ hMasa->config.numTwoDirBands = hMasa->config.numCodingBands;
+ set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands );
+ }
+
#else
- masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs );
+ masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL );
#endif
/* Transmit stereo signals using a mono downmix at lowest bitrates */
@@ -706,12 +815,16 @@ static void combine_freqbands_and_subframes(
}
}
}
-
+#ifdef FIX_HBR_MASAMETA
+ if ( numCodingBands <= MAX_REDUCED_NBANDS )
+#else
if ( numCodingBands < MASA_FREQUENCY_BANDS )
+#endif
{
+ /* reduce metadata *frequency* resolution. time resolution is not touched */
for ( i = 0; i < numDirections; i++ )
{
- for ( j = 0; j < numSf; j++ )
+ for ( j = 0; j < numSf; j++ ) /* NB: for numSf==1, operates only on first sub-frame */
{
for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ )
{
@@ -785,7 +898,7 @@ static void combine_freqbands_and_subframes(
}
}
}
- else if ( mergeRatiosOverSubframes )
+ else if ( mergeRatiosOverSubframes ) /* keep frequency resolution */
{
for ( j = 0; j < numSf; j++ )
{
@@ -1013,7 +1126,7 @@ static void find_n_largest(
static void move_metadata_to_qmetadata(
- MASA_ENCODER_HANDLE hMasa,
+ const MASA_ENCODER_HANDLE hMasa,
IVAS_QMETADATA_HANDLE hQMeta )
{
int16_t dir, sf, band;
@@ -1036,6 +1149,9 @@ static void move_metadata_to_qmetadata(
hQMeta->q_direction[dir].band_data[band].azimuth[sf] = hMeta->directional_meta[dir].azimuth[sf][band];
hQMeta->q_direction[dir].band_data[band].elevation[sf] = hMeta->directional_meta[dir].elevation[sf][band];
hQMeta->q_direction[dir].band_data[band].energy_ratio[sf] = hMeta->directional_meta[dir].energy_ratio[sf][band];
+#ifdef HR_METADATA
+ hQMeta->q_direction[dir].band_data[band].spherical_index[sf] = hMeta->directional_meta[dir].spherical_index[sf][band];
+#endif
if ( hQMeta->q_direction[dir].coherence_band_data != NULL )
{
hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = (uint8_t) roundf( hMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX );
@@ -1085,18 +1201,19 @@ static void move_metadata_to_qmetadata(
/* This function studies parametric MASA metadata to provide information for codec configuration */
static void detect_metadata_composition(
- MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder data */
- uint8_t *joinedSubframes, /* o : Result of subframe composition */
- uint8_t *coherencePresent, /* o : Result of coherence presence */
- uint8_t *isTwoDir /* o : Result of two direction check */
+ const MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder data */
+ uint8_t *joinedSubframes, /* o : Result of subframe composition */
+ uint8_t *coherencePresent, /* o : Result of coherence presence */
+ uint8_t *isTwoDir /* o : Result of two direction check */
)
{
MASA_METADATA_FRAME *hMeta;
- int16_t sf, band, dir, numDir;
+ int8_t sf, band, dir, numDir;
int16_t nSubFrames;
uint8_t dirValid[2] = { FALSE };
uint8_t cohPresent = FALSE;
uint8_t sfDiffer = FALSE;
+ uint8_t sfSimilar;
hMeta = &( hMasa->masaMetadata );
numDir = hMeta->descriptive_meta.numberOfDirections + 1;
@@ -1161,52 +1278,14 @@ static void detect_metadata_composition(
}
/* Check if data over subframes is identical. Check is done by comparing to first subframe. */
- dir = 0;
- while ( sfDiffer == FALSE && dir < numDir )
+ sfSimilar = TRUE;
+ sf = 1;
+ while ( ( sfSimilar == TRUE ) && ( sf < MAX_PARAM_SPATIAL_SUBFRAMES ) )
{
- sf = 1;
- while ( sfDiffer == FALSE && sf < MAX_PARAM_SPATIAL_SUBFRAMES )
- {
- band = 0;
- while ( sfDiffer == FALSE && band < MASA_FREQUENCY_BANDS )
- {
- float aziDif;
- aziDif = fabsf( hMeta->directional_meta[dir].azimuth[sf][band] - hMeta->directional_meta[dir].azimuth[0][band] );
- aziDif = aziDif > 180.0f ? aziDif - 360.0f : aziDif;
- if ( aziDif > MASA_ANGLE_TOLERANCE )
- {
- sfDiffer = TRUE;
- break;
- }
-
- if ( fabsf( hMeta->directional_meta[dir].elevation[sf][band] - hMeta->directional_meta[dir].elevation[0][band] ) > MASA_ANGLE_TOLERANCE )
- {
- sfDiffer = TRUE;
- break;
- }
-
- if ( fabsf( hMeta->directional_meta[dir].energy_ratio[sf][band] - hMeta->directional_meta[dir].energy_ratio[0][band] ) > MASA_RATIO_TOLERANCE )
- {
- sfDiffer = TRUE;
- break;
- }
-
- if ( fabsf( hMeta->directional_meta[dir].spread_coherence[sf][band] - hMeta->directional_meta[dir].spread_coherence[0][band] ) > MASA_COHERENCE_TOLERANCE )
- {
- sfDiffer = TRUE;
- break;
- }
-
- if ( dir == 0 && fabsf( hMeta->common_meta.surround_coherence[sf][band] - hMeta->common_meta.surround_coherence[0][band] ) > MASA_COHERENCE_TOLERANCE )
- {
- sfDiffer = TRUE;
- }
- band++;
- }
- sf++;
- }
- dir++;
+ sfSimilar = are_masa_subframes_similar( hMeta, 0, hMeta, sf );
+ sf++;
}
+ sfDiffer = sfSimilar == TRUE ? FALSE : TRUE;
/* Further checks can be done with just one subframe if they are identical */
nSubFrames = sfDiffer == TRUE ? MAX_PARAM_SPATIAL_SUBFRAMES : 1;
@@ -1750,3 +1829,590 @@ void ivas_masa_enc_reconfigure(
return;
}
+
+
+/*-------------------------------------------------------------------*
+ * average_masa_metadata()
+ *
+ * Average MASA metadata frame subframe contents: applies aggregation over time
+ *-------------------------------------------------------------------*/
+
+static void average_masa_metadata(
+ MASA_METADATA_FRAME *hMeta,
+ float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]
+#ifdef HR_METADATA
+ ,
+ const SPHERICAL_GRID_DATA *Sph_Grid16
+#ifdef FIX_505_MASA_SPHGRID_REUSE
+ ,
+ const uint8_t useSphGrid
+#endif
+#endif
+)
+{
+ int16_t i, j, k;
+ float azi_rad, ele_rad;
+ uint8_t numDirections;
+
+ /* use the nominal values without data-adaptivity */
+ numDirections = hMeta->descriptive_meta.numberOfDirections + 1;
+
+ /* azi/ele/nrg into vectors for each sub-frame and band */
+ for ( i = 0; i < numDirections; i++ )
+ {
+ for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ )
+ {
+ float x_sum, y_sum, z_sum, energy_sum, vec_len, spread_coh_sum, surr_coh_sum;
+
+ x_sum = 0.0f;
+ y_sum = 0.0f;
+ z_sum = 0.0f;
+ energy_sum = 0.0f;
+ spread_coh_sum = 0.0f;
+ surr_coh_sum = 0.0f;
+ for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ )
+ {
+ azi_rad = hMeta->directional_meta[i].azimuth[j][k] / 180.0f * EVS_PI;
+ ele_rad = hMeta->directional_meta[i].elevation[j][k] / 180.0f * EVS_PI;
+ vec_len = hMeta->directional_meta[i].energy_ratio[j][k] * energy[j][k];
+
+ /* energy-weighted sum over subframes */
+ x_sum += cosf( azi_rad ) * cosf( ele_rad ) * vec_len;
+ y_sum += sinf( azi_rad ) * cosf( ele_rad ) * vec_len;
+ z_sum += sinf( ele_rad ) * vec_len;
+
+ energy_sum += energy[j][k];
+
+ spread_coh_sum += hMeta->directional_meta[i].spread_coherence[j][k] * energy[j][k];
+ if ( i == 0 )
+ {
+ /* this is in common metadata and not in each direction */
+ surr_coh_sum += hMeta->common_meta.surround_coherence[j][k] * energy[j][k];
+ }
+ }
+
+ /* the data from the combined sub-frames is written into the first sub-frame band */
+ j = 0;
+ hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f;
+ hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f;
+#ifdef HR_METADATA
+#ifdef FIX_505_MASA_SPHGRID_REUSE
+ if ( useSphGrid == TRUE )
+#else
+ if ( Sph_Grid16->no_theta > 0 )
+#endif
+ {
+ hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ),
+ &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 );
+ }
+#endif
+ vec_len = sqrtf( x_sum * x_sum + y_sum * y_sum + z_sum * z_sum );
+ hMeta->directional_meta[i].energy_ratio[j][k] = vec_len / ( energy_sum + EPSILON );
+
+ hMeta->directional_meta[i].spread_coherence[j][k] = spread_coh_sum / ( energy_sum + EPSILON );
+ if ( i == 0 )
+ {
+ hMeta->common_meta.surround_coherence[j][k] = surr_coh_sum / ( energy_sum + EPSILON );
+ }
+
+ /* copy the same value to all subframes */
+ for ( j = 1; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ )
+ {
+ hMeta->directional_meta[i].azimuth[j][k] = hMeta->directional_meta[i].azimuth[0][k];
+ hMeta->directional_meta[i].elevation[j][k] = hMeta->directional_meta[i].elevation[0][k];
+ hMeta->directional_meta[i].energy_ratio[j][k] = hMeta->directional_meta[i].energy_ratio[0][k];
+ hMeta->directional_meta[i].spread_coherence[j][k] = hMeta->directional_meta[i].spread_coherence[0][k];
+ if ( i == 0 )
+ {
+ hMeta->common_meta.surround_coherence[j][k] = hMeta->common_meta.surround_coherence[0][k];
+ }
+ }
+ }
+ }
+
+ for ( k = 0; k < MASA_FREQUENCY_BANDS; k++ )
+ {
+ for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ )
+ {
+ if ( numDirections == 2 )
+ {
+ hMeta->common_meta.diffuse_to_total_ratio[j][k] = max( 0.0f, 1.0f - hMeta->directional_meta[1].energy_ratio[j][k] - hMeta->directional_meta[0].energy_ratio[j][k] );
+ }
+ else
+ {
+ hMeta->common_meta.diffuse_to_total_ratio[j][k] = max( 0.0f, 1.0f - hMeta->directional_meta[0].energy_ratio[j][k] );
+ }
+ hMeta->common_meta.remainder_to_total_ratio[j][k] = 0.0f;
+ }
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * copy_masa_metadata_subframe()
+ *
+ * Copy MASA metadata frame subframe contents
+ *-------------------------------------------------------------------*/
+
+static void copy_masa_metadata_subframe(
+ const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metdata to be copied */
+ const uint8_t sfFrom, /* i : subframe index of the copy source */
+ MASA_METADATA_HANDLE hMetaTo, /* o : MASA frame metadata copy destination */
+ const uint8_t sfTo /* i : subframe index of the copy target */
+)
+{
+ uint8_t dir;
+
+ /* directional metadata */
+ for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ )
+ {
+ mvr2r( hMetaFrom->directional_meta[dir].azimuth[sfFrom], hMetaTo->directional_meta[dir].azimuth[sfTo], MASA_FREQUENCY_BANDS );
+ mvr2r( hMetaFrom->directional_meta[dir].elevation[sfFrom], hMetaTo->directional_meta[dir].elevation[sfTo], MASA_FREQUENCY_BANDS );
+ mvr2r( hMetaFrom->directional_meta[dir].energy_ratio[sfFrom], hMetaTo->directional_meta[dir].energy_ratio[sfTo], MASA_FREQUENCY_BANDS );
+ mvr2r( hMetaFrom->directional_meta[dir].spread_coherence[sfFrom], hMetaTo->directional_meta[dir].spread_coherence[sfTo], MASA_FREQUENCY_BANDS );
+ }
+
+ /* common metadata */
+ mvr2r( hMetaFrom->common_meta.diffuse_to_total_ratio[sfFrom], hMetaTo->common_meta.diffuse_to_total_ratio[sfTo], MASA_FREQUENCY_BANDS );
+ mvr2r( hMetaFrom->common_meta.surround_coherence[sfFrom], hMetaTo->common_meta.surround_coherence[sfTo], MASA_FREQUENCY_BANDS );
+ mvr2r( hMetaFrom->common_meta.remainder_to_total_ratio[sfFrom], hMetaTo->common_meta.remainder_to_total_ratio[sfTo], MASA_FREQUENCY_BANDS );
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * copy_masa_metadata()
+ *
+ * Copy MASA metada frame contents
+ *-------------------------------------------------------------------*/
+
+static void copy_masa_metadata(
+ const MASA_METADATA_HANDLE hMetaFrom, /* i : MASA frame metadata to be copied */
+ MASA_METADATA_HANDLE hMetaTo /* o : MASA frame metadata copy destination */
+)
+{
+ uint8_t sf, byte_idx;
+
+ /* descriptive metadata */
+ for ( byte_idx = 0; byte_idx < 8; byte_idx++ )
+ {
+ hMetaTo->descriptive_meta.formatDescriptor[byte_idx] = hMetaFrom->descriptive_meta.formatDescriptor[byte_idx];
+ }
+
+ hMetaTo->descriptive_meta.numberOfDirections = hMetaFrom->descriptive_meta.numberOfDirections;
+ hMetaTo->descriptive_meta.numberOfChannels = hMetaFrom->descriptive_meta.numberOfChannels;
+ hMetaTo->descriptive_meta.sourceFormat = hMetaFrom->descriptive_meta.sourceFormat;
+ hMetaTo->descriptive_meta.transportDefinition = hMetaFrom->descriptive_meta.transportDefinition;
+ hMetaTo->descriptive_meta.channelAngle = hMetaFrom->descriptive_meta.channelAngle;
+ hMetaTo->descriptive_meta.channelDistance = hMetaFrom->descriptive_meta.channelDistance;
+ hMetaTo->descriptive_meta.channelLayout = hMetaFrom->descriptive_meta.channelLayout;
+
+ /* directional and common metadata */
+ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
+ {
+ copy_masa_metadata_subframe( hMetaFrom, sf, hMetaTo, sf );
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * are_masa_subframes_similar()
+ *
+ * Compare the similarity of MASA metadata in two sub-frames
+ *-------------------------------------------------------------------*/
+
+static uint8_t are_masa_subframes_similar(
+ const MASA_METADATA_HANDLE frame1, /* i : MASA metadata frame 1 */
+ const uint8_t sf1_idx, /* i : index of the subframe of frame1 to inspect */
+ const MASA_METADATA_HANDLE frame2, /* i : MASA metadata frame 2 */
+ const uint8_t sf2_idx /* o : index of the subframe of frame2 to inspect */
+)
+{
+ uint8_t num_dir;
+ uint8_t dir;
+ uint8_t band_idx;
+ uint8_t sf_differ;
+
+ num_dir = frame1->descriptive_meta.numberOfDirections;
+ dir = 0;
+ band_idx = 0;
+ sf_differ = FALSE;
+
+ if ( num_dir != frame2->descriptive_meta.numberOfDirections )
+ {
+ sf_differ = TRUE;
+ }
+ else
+ {
+ /* check per-direction metadata */
+ dir = 0;
+ band_idx = 0;
+
+ while ( ( sf_differ == FALSE ) && ( dir <= num_dir ) )
+ {
+ band_idx = 0;
+ while ( ( sf_differ == FALSE ) && ( band_idx < MASA_FREQUENCY_BANDS ) )
+ {
+ float azi_dif;
+ azi_dif = fabsf( frame1->directional_meta[dir].azimuth[sf1_idx][band_idx] - frame2->directional_meta[dir].azimuth[sf2_idx][band_idx] );
+ azi_dif = azi_dif > 180.0f ? 360.0f - azi_dif : azi_dif;
+
+ if ( azi_dif > MASA_ANGLE_TOLERANCE )
+ {
+ sf_differ = TRUE;
+ break;
+ }
+
+ if ( fabsf( frame1->directional_meta[dir].elevation[sf1_idx][band_idx] - frame2->directional_meta[dir].elevation[sf2_idx][band_idx] ) > MASA_ANGLE_TOLERANCE )
+ {
+ sf_differ = TRUE;
+ break;
+ }
+
+ if ( fabsf( frame1->directional_meta[dir].energy_ratio[sf1_idx][band_idx] - frame2->directional_meta[dir].energy_ratio[sf2_idx][band_idx] ) > MASA_RATIO_TOLERANCE )
+ {
+ sf_differ = TRUE;
+ break;
+ }
+
+ if ( fabsf( frame1->directional_meta[dir].spread_coherence[sf1_idx][band_idx] - frame2->directional_meta[dir].spread_coherence[sf2_idx][band_idx] ) > MASA_COHERENCE_TOLERANCE )
+ {
+ sf_differ = TRUE;
+ break;
+ }
+
+ band_idx++;
+ }
+ dir++;
+ }
+
+ /* check the common metadata */
+ while ( ( sf_differ == FALSE ) && ( band_idx < MASA_FREQUENCY_BANDS ) )
+ {
+ if ( fabsf( frame1->common_meta.surround_coherence[sf1_idx][band_idx] - frame2->common_meta.surround_coherence[sf2_idx][band_idx] ) > MASA_COHERENCE_TOLERANCE )
+ {
+ sf_differ = TRUE;
+ break;
+ }
+
+ band_idx++;
+ }
+ }
+
+ if ( sf_differ )
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+
+/*-------------------------------------------------------------------*
+ * detect_framing_async()
+ *
+ * Compare the similarity of MASA metadata in two sub-frames
+ * Analysis result is stored in hMasa->data.sync_state, and
+ * potentially hMasa->masaMetadata is modified
+ *-------------------------------------------------------------------*/
+
+static void detect_framing_async(
+ MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder structure */
+)
+{
+ MASA_METADATA_HANDLE current_meta;
+ MASA_METADATA_HANDLE previous_meta;
+ MASA_SYNC_HANDLE sync_state;
+ MASA_FRAME_MODE frame_mode;
+ uint8_t n_sim_start, n_sim_stop, sf_idx;
+ uint8_t found_offset;
+
+ current_meta = &( hMasa->masaMetadata ); /* metadata from current frame */
+ sync_state = &( hMasa->data.sync_state ); /* synchronization structure */
+ previous_meta = &( sync_state->previous_metadata );
+
+ /* check current frame, how many are similar from the start and from the end */
+ n_sim_start = 1;
+ for ( sf_idx = n_sim_start; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
+ {
+ if ( are_masa_subframes_similar( current_meta, 0, current_meta, sf_idx ) == TRUE )
+ {
+ n_sim_start = sf_idx + 1;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /* number of similar sub-frames starting from the end of the frame */
+ if ( n_sim_start == MAX_PARAM_SPATIAL_SUBFRAMES ) /* shortcut */
+ {
+ n_sim_stop = n_sim_start;
+ }
+ else
+ {
+ n_sim_stop = 1;
+ for ( sf_idx = 2; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ )
+ {
+ /* we need to check only the two middle sub-frames, as all being the same would have taken the shortcut above */
+ if ( are_masa_subframes_similar( current_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1, current_meta, MAX_PARAM_SPATIAL_SUBFRAMES - sf_idx ) == TRUE )
+ {
+ n_sim_stop = sf_idx;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ frame_mode = MASA_FRAME_4SF; /* default mode: 4sf */
+ if ( sync_state->prev_offset > MAX_PARAM_SPATIAL_SUBFRAMES - 2 )
+ {
+ /* earlier offset was large => reset the offset */
+ found_offset = 0;
+ }
+ else
+ {
+ /* keep previous offset unless something else is found. alternatively, we could reset always */
+ found_offset = sync_state->prev_offset;
+ }
+
+ if ( ( n_sim_start == MAX_PARAM_SPATIAL_SUBFRAMES ) && ( n_sim_stop == MAX_PARAM_SPATIAL_SUBFRAMES ) )
+ {
+ /* full frame consists of similar sub-frames */
+ frame_mode = MASA_FRAME_1SF;
+ if ( ( sync_state->prev_sim_stop != 0 ) && ( are_masa_subframes_similar( current_meta, 0, previous_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1 ) == TRUE ) )
+ {
+ /* > 4 sub-frames of similar data */
+ if ( sync_state->prev_sim_stop < 3 )
+ {
+ /* can nicely align the framing with the earlier data and a small offset */
+ found_offset = sync_state->prev_sim_stop;
+ }
+ else
+ {
+ /* too many similar sub-frames to determine the offset accurately => keep earlier value */
+ found_offset = sync_state->prev_offset;
+ }
+ }
+ else
+ {
+ /* earlier window was different => reset the offset */
+ found_offset = 0;
+ }
+ }
+ else if ( n_sim_stop == 3 )
+ {
+ /* first sub-frame different that the rest 3
+ => make a risky guess that the future sf would be the same too and we're in an offset case */
+ frame_mode = MASA_FRAME_1SF;
+ found_offset = 3;
+ }
+ else if ( ( sync_state->prev_sim_stop > 0 ) && ( are_masa_subframes_similar( current_meta, 0, previous_meta, MAX_PARAM_SPATIAL_SUBFRAMES - 1 ) == TRUE ) )
+ {
+ /* seeing data similar to past */
+ if ( ( n_sim_start > 1 ) && ( n_sim_start + sync_state->prev_sim_stop >= MAX_PARAM_SPATIAL_SUBFRAMES ) )
+ {
+ /* with the past, would have at least one long frame similar subframes */
+ frame_mode = MASA_FRAME_1SF;
+
+ if ( sync_state->prev_offset == 0 )
+ {
+ found_offset = min( 2, sync_state->prev_sim_stop );
+ }
+ else
+ {
+ found_offset = sync_state->prev_offset;
+ }
+ }
+ }
+
+ /* keep the original contents of the frame, but then perform interpolation later */
+ /* just copy current frame to storage */
+ copy_masa_metadata( current_meta, previous_meta );
+
+ sync_state->prev_sim_stop = n_sim_stop;
+ sync_state->prev_offset = found_offset;
+ sync_state->frame_mode = frame_mode;
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * masa_metadata_direction_alignment()
+ *
+ * In 2dir MASA metadata, determine the ordering of the directional
+ * fields such that the azi/ele change across time is minimized.
+ *-------------------------------------------------------------------*/
+
+static void masa_metadata_direction_alignment(
+ MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */
+)
+{
+ uint8_t band, n_dirs;
+
+ MASA_DIR_ALIGN_HANDLE hAlignState;
+ MASA_METADATA_HANDLE hMeta;
+
+ hAlignState = &( hMasa->data.dir_align_state );
+ hMeta = &( hMasa->masaMetadata );
+
+ n_dirs = hMeta->descriptive_meta.numberOfDirections + 1; /* 1-based */
+ for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ )
+ {
+ uint8_t sf;
+ float diff_swap, diff_no_swap;
+
+ /* trade 2*(cos+sin) against storing the values between frames */
+ float prev_ele_dir1_sin, prev_ele_dir2_sin;
+ float prev_ele_dir1_cos, prev_ele_dir2_cos;
+
+ prev_ele_dir1_sin = sinf( hAlignState->previous_ele_dir1[band] );
+ prev_ele_dir2_sin = sinf( hAlignState->previous_ele_dir2[band] );
+
+ prev_ele_dir1_cos = cosf( hAlignState->previous_ele_dir1[band] );
+ prev_ele_dir2_cos = cosf( hAlignState->previous_ele_dir2[band] );
+
+ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
+ {
+ float azi_rad1, ele_rad1;
+ float azi_rad2, ele_rad2;
+ float cos_ele1, cos_ele2;
+ float sin_ele1, sin_ele2;
+
+ azi_rad1 = hMeta->directional_meta[0].azimuth[sf][band] * PI_OVER_180;
+ ele_rad1 = hMeta->directional_meta[0].elevation[sf][band] * PI_OVER_180;
+
+ if ( n_dirs > 1 )
+ {
+ azi_rad2 = hMeta->directional_meta[1].azimuth[sf][band] * PI_OVER_180;
+ ele_rad2 = hMeta->directional_meta[1].elevation[sf][band] * PI_OVER_180;
+
+ /* quick checks to detect constant data and earlier flip */
+ if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) < EPSILON &&
+ fabsf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) < EPSILON &&
+ fabsf( ele_rad1 - hAlignState->previous_ele_dir1[band] ) < EPSILON &&
+ fabsf( ele_rad2 - hAlignState->previous_ele_dir2[band] ) < EPSILON )
+ {
+ diff_swap = 1.0f;
+ diff_no_swap = 0.0f;
+ /* cached values that will be used for the short-cuts and over-written by the real computations, if done */
+ sin_ele1 = prev_ele_dir1_sin;
+ sin_ele2 = prev_ele_dir2_sin;
+ cos_ele1 = prev_ele_dir1_cos;
+ cos_ele2 = prev_ele_dir2_cos;
+ }
+ else if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) < EPSILON &&
+ fabsf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) < EPSILON &&
+ fabsf( ele_rad1 - hAlignState->previous_ele_dir2[band] ) < EPSILON &&
+ fabsf( ele_rad2 - hAlignState->previous_ele_dir1[band] ) < EPSILON )
+ {
+ diff_swap = 0.0f;
+ diff_no_swap = 1.0f;
+ /* cached values that will be used for the short-cuts and over-written by the real computations, if done */
+ sin_ele1 = prev_ele_dir2_sin;
+ sin_ele2 = prev_ele_dir1_sin;
+ cos_ele1 = prev_ele_dir2_cos;
+ cos_ele2 = prev_ele_dir1_cos;
+ }
+ else
+ {
+ /* angular distance of the two vectors */
+ /* pre-compute values for re-use */
+ sin_ele1 = sinf( ele_rad1 );
+ sin_ele2 = sinf( ele_rad2 );
+
+ cos_ele1 = cosf( ele_rad1 );
+ cos_ele2 = cosf( ele_rad2 );
+
+ diff_no_swap = acosf( cos_ele1 * prev_ele_dir1_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) + sin_ele1 * prev_ele_dir1_sin ) +
+ acosf( cos_ele2 * prev_ele_dir2_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) + sin_ele2 * prev_ele_dir2_sin );
+
+ diff_swap = acosf( cos_ele1 * prev_ele_dir2_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) + sin_ele1 * prev_ele_dir2_sin ) +
+ acosf( cos_ele2 * prev_ele_dir1_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) + sin_ele2 * prev_ele_dir1_sin );
+ }
+ }
+ else
+ {
+ /* 1dir */
+ sin_ele1 = sinf( ele_rad1 );
+ cos_ele1 = cosf( ele_rad1 );
+
+ azi_rad2 = 0.0f;
+ ele_rad2 = 0.0f;
+
+ sin_ele2 = 0.0f; /* sin(0) */
+ cos_ele2 = 1.0f; /* cos(0) */
+
+ diff_swap = 1.0f;
+ diff_no_swap = 0.0f;
+ }
+
+ if ( n_dirs > 1 && diff_no_swap > diff_swap )
+ {
+ /* swap the metadata of the two directions in this TF-tile */
+ float tmp_val;
+#ifdef FIX_HBR_MASAMETA
+ uint16_t tmp_int_val;
+#endif
+ tmp_val = hMeta->directional_meta[0].azimuth[sf][band];
+ hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band];
+ hMeta->directional_meta[1].azimuth[sf][band] = tmp_val;
+
+ tmp_val = hMeta->directional_meta[0].elevation[sf][band];
+ hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band];
+ hMeta->directional_meta[1].elevation[sf][band] = tmp_val;
+#ifdef FIX_HBR_MASAMETA
+ tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band];
+ hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band];
+ hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val;
+#endif
+ tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band];
+ hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band];
+ hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val;
+
+ tmp_val = hMeta->directional_meta[0].spread_coherence[sf][band];
+ hMeta->directional_meta[0].spread_coherence[sf][band] = hMeta->directional_meta[1].spread_coherence[sf][band];
+ hMeta->directional_meta[1].spread_coherence[sf][band] = tmp_val;
+
+ hAlignState->previous_azi_dir1[band] = azi_rad2;
+ hAlignState->previous_ele_dir1[band] = ele_rad2;
+
+ hAlignState->previous_azi_dir2[band] = azi_rad1;
+ hAlignState->previous_ele_dir2[band] = ele_rad1;
+
+ prev_ele_dir1_cos = cos_ele2;
+ prev_ele_dir1_sin = sin_ele2;
+
+ prev_ele_dir2_cos = cos_ele1;
+ prev_ele_dir2_sin = sin_ele1;
+ }
+ else
+ {
+ hAlignState->previous_azi_dir1[band] = azi_rad1;
+ hAlignState->previous_ele_dir1[band] = ele_rad1;
+
+ hAlignState->previous_azi_dir2[band] = azi_rad2;
+ hAlignState->previous_ele_dir2[band] = ele_rad2;
+
+ prev_ele_dir1_cos = cos_ele1;
+ prev_ele_dir1_sin = sin_ele1;
+
+ prev_ele_dir2_cos = cos_ele2;
+ prev_ele_dir2_sin = sin_ele2;
+ }
+ } /* sf */
+ } /* band */
+
+ return;
+}
diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c
index db9945d0cec3cc358dcec3be5c7ddd917e750ad7..ba746ff442f53d31a2d2a7e5f0797bae0f6b3fdf 100644
--- a/lib_enc/ivas_mc_param_enc.c
+++ b/lib_enc/ivas_mc_param_enc.c
@@ -140,7 +140,13 @@ ivas_error ivas_param_mc_enc_open(
hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac;
/* set FB config. */
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -199,7 +205,7 @@ ivas_error ivas_param_mc_enc_open(
/* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */
for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ )
{
- hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC;
+ hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC;
}
/* set correct coded band width */
@@ -335,7 +341,7 @@ ivas_error ivas_param_mc_enc_reconfig(
/* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */
for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ )
{
- hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC;
+ hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC;
}
/* set correct coded band width */
@@ -673,7 +679,8 @@ static void ivas_param_mc_param_est_enc(
for ( ts = 0; ts < start_ts; ts++ )
{
- ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts );
+ ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts,
+ hParamMC->hFbMixer->fb_cfg->num_in_chans );
for ( i = 0; i < nchan_input; i++ )
{
pcm_in[i] += l_ts;
@@ -682,8 +689,11 @@ static void ivas_param_mc_param_est_enc(
for ( ts = start_ts; ts < num_time_slots; ts++ )
{
- ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts );
- ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts,
+ hParamMC->hFbMixer->fb_cfg->num_in_chans );
+ ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts,
+ hParamMC->hFbMixer->fb_cfg->num_in_chans );
+
for ( i = 0; i < nchan_input; i++ )
{
pcm_in[i] += l_ts;
diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5ee2950db6c75d9665825b1cce6103e5dc9a0e9
--- /dev/null
+++ b/lib_enc/ivas_mc_paramupmix_enc.c
@@ -0,0 +1,858 @@
+/******************************************************************************************************
+
+ (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository. All Rights Reserved.
+
+ This software is protected by copyright law and by international treaties.
+ The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository retain full ownership rights in their respective contributions in
+ the software. This notice grants no license of any kind, including but not limited to patent
+ license, nor is any license granted by implication, estoppel or otherwise.
+
+ Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
+ contributions.
+
+ This software is provided "AS IS", without any express or implied warranties. The software is in the
+ development stage. It is intended exclusively for experts who have experience with such software and
+ solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
+ and fitness for a particular purpose are hereby disclaimed and excluded.
+
+ Any dispute, controversy or claim arising under or in relation to providing this software shall be
+ submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
+ accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
+ the United Nations Convention on Contracts on the International Sales of Goods.
+
+*******************************************************************************************************/
+
+#include
+#include
+#include "options.h"
+#include "cnst.h"
+#include "rom_enc.h"
+#include "rom_com.h"
+#include "prot.h"
+#include "ivas_prot.h"
+#include "ivas_cnst.h"
+#include "ivas_rom_com.h"
+#include "ivas_rom_enc.h"
+#ifdef DEBUGGING
+#include "debug.h"
+#endif
+#ifdef DEBUG_PLOT
+#include "deb_out.h"
+#endif
+#include "wmc_auto.h"
+
+/*-------------------------------------------------------------------------
+ * Local function prototypes
+ *------------------------------------------------------------------------*/
+
+static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float data_f[][L_FRAME48k], const int16_t input_frame );
+
+static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float input_frame_t[][L_FRAME48k], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] );
+
+static void get_huff_table( PAR_TYPE par_type, QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt );
+
+static void write_huff_bits( int32_t value, uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos );
+
+static void huffman_encode( int16_t bdfOnly, int16_t bdtAllowed, int16_t nv, int16_t ivStart, int32_t *vqPrev, int32_t *vq, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos );
+
+static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, int16_t ch, float pars[IVAS_MAX_NUM_BANDS], float alphas[IVAS_MAX_NUM_BANDS], PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos );
+
+static void quantize_alpha( int16_t nv, const float *alpha, QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq );
+
+static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq );
+
+static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq );
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_enc()
+ *
+ * MC ParamUpmix Encoder main encoding function
+ *------------------------------------------------------------------------*/
+
+void ivas_mc_paramupmix_enc(
+ Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */
+ BSTR_ENC_HANDLE hBStr, /* i/o: IVAS Metadata bitstream handle */
+ float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */
+ const int16_t input_frame /* i : input frame length */
+)
+{
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix;
+ int16_t i;
+ float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS];
+ int16_t bit_pos;
+
+ push_wmops( "mc_paramupmix_enc" );
+
+ hMCParamUpmix = st_ivas->hMCParamUpmix;
+ bit_pos = 0;
+
+ /* Parameter estimation */
+ ivas_mc_paramupmix_param_est_enc( hMCParamUpmix, data_f, input_frame, alphas, betas );
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ put_ec_data( hMCParamUpmix, i, alphas[i], NULL, ALPHA, bit_buffer, &bit_pos );
+ put_ec_data( hMCParamUpmix, i, betas[i], alphas[i], BETA, bit_buffer, &bit_pos );
+ }
+
+ /* push the PARAM UPMIX MC side info from the temporary buffer into the medatdata bitstream*/
+ push_next_bits( hBStr, bit_buffer, bit_pos );
+
+ /* DMX generation*/
+ ivas_mc_paramupmix_dmx( hMCParamUpmix, data_f, input_frame );
+
+ pop_wmops();
+
+ return;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_enc_open()
+ *
+ * Initialize MC ParamUpmix encoder handle
+ *------------------------------------------------------------------------*/
+
+ivas_error ivas_mc_paramupmix_enc_open(
+ Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */
+)
+{
+ IVAS_FB_CFG *fb_cfg;
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix;
+ int32_t input_Fs;
+ int32_t input_frame;
+ int16_t i, k, b, j;
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+ input_Fs = st_ivas->hEncoderConfig->input_Fs;
+ input_frame = (int32_t) st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC;
+
+ /* Sanity Checks */
+ if ( ( hMCParamUpmix = (MC_PARAMUPMIX_ENC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_ENC_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) );
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ )
+ {
+ if ( ( hMCParamUpmix->midside[i][k] = (float *) malloc( sizeof( float ) * input_frame ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) );
+ }
+ set_zero( hMCParamUpmix->midside[i][k], (int16_t) input_frame );
+ }
+ }
+ hMCParamUpmix->first_frame = 1;
+
+ /* MC_LS_SETUP_5_1_2 is the only current configuration */
+ st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
+
+ /* set core coder dependent on the number of transport channels */
+ switch ( st_ivas->nchan_transport )
+ {
+ case 8:
+ st_ivas->nCPE = 4;
+ st_ivas->nSCE = 0;
+ st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
+ break;
+#ifdef DEBUGGING
+ default:
+ assert( 0 && "Number of transport channels not supported by MC PARAM UPMIX MODE!\n" );
+#endif
+ }
+
+
+ /* Transient Detector handle */
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ )
+ {
+ if ( ( error = ivas_transient_det_open( &( hMCParamUpmix->hTranDet[i] ), input_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ /* set FB config. */
+ /* need to set num output channels to a value > 0 to get pFb != NULL */
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
+ {
+ return error;
+ }
+ fb_cfg->remix_order = mc_paramupmix_fb_remix_order;
+ /* override latency, could be moved to ivas_fb_set_cfg */
+ /* assuming parameters are calculated at end of frame, compensate for MCT delay and half of decoder fb */
+ /* still 1.5ms off, since MCT delay is not large enough */
+ /* param at end of frame */
+ fb_cfg->prior_input_length = (int16_t) ( NS2SA( input_Fs, 12000000L ) + NS2SA( input_Fs, DELAY_FB_4_NS / 2 ) - input_frame / 2 - NS2SA( input_Fs, DELAY_FB_1_NS / 2 ) );
+ fb_cfg->prior_input_length = (int16_t) max( fb_cfg->prior_input_length, input_frame / MAX_PARAM_SPATIAL_SUBFRAMES );
+
+ /* Allocate and initialize FB mixer handle */
+ if ( ( error = ivas_FB_mixer_open( &( hMCParamUpmix->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ /* Covariance handle */
+#ifdef FIX_489_COV_SMOOTHING
+ if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK )
+#endif
+ {
+ return error;
+ }
+ }
+
+
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ if ( ( hMCParamUpmix->cov_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" );
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ )
+ {
+ if ( ( hMCParamUpmix->cov_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" );
+ }
+ for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ )
+ {
+ if ( ( hMCParamUpmix->cov_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" );
+ }
+ }
+ }
+
+ if ( ( hMCParamUpmix->cov_dtx_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" );
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ )
+ {
+ if ( ( hMCParamUpmix->cov_dtx_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" );
+ }
+ for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ )
+ {
+ if ( ( hMCParamUpmix->cov_dtx_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL )
+ {
+ return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" );
+ }
+ }
+ }
+ }
+
+ st_ivas->hMCParamUpmix = hMCParamUpmix;
+
+ return error;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_enc_close()
+ *
+ * Close MC Param-Upmix encoder handle
+ *------------------------------------------------------------------------*/
+
+void ivas_mc_paramupmix_enc_close(
+ MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */
+ const int32_t sampling_rate )
+{
+ int16_t i, k;
+ int16_t b, j;
+
+ if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL )
+ {
+ return;
+ }
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ if ( ( *hMCParamUpmix )->cov_real[b] != NULL )
+ {
+ for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ )
+ {
+ if ( ( *hMCParamUpmix )->cov_real[b][i] != NULL )
+ {
+ for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ )
+ {
+ if ( ( *hMCParamUpmix )->cov_real[b][i][j] != NULL )
+ {
+ free( ( *hMCParamUpmix )->cov_real[b][i][j] );
+ }
+ }
+ free( ( *hMCParamUpmix )->cov_real[b][i] );
+ }
+ }
+ free( ( *hMCParamUpmix )->cov_real[b] );
+ }
+ if ( ( *hMCParamUpmix )->cov_dtx_real[b] != NULL )
+ {
+ for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ )
+ {
+ if ( ( *hMCParamUpmix )->cov_dtx_real[b][i] != NULL )
+ {
+ for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ )
+ {
+ if ( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] != NULL )
+ {
+ free( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] );
+ }
+ }
+ free( ( *hMCParamUpmix )->cov_dtx_real[b][i] );
+ }
+ }
+ free( ( *hMCParamUpmix )->cov_dtx_real[b] );
+ }
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ )
+ {
+ free( ( *hMCParamUpmix )->midside[i][k] );
+ }
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ )
+ {
+ ivas_transient_det_close( &( *hMCParamUpmix )->hTranDet[i] );
+ }
+
+ if ( ( *hMCParamUpmix )->hFbMixer != NULL )
+ {
+ ivas_FB_mixer_close( &( *hMCParamUpmix )->hFbMixer, sampling_rate, 0 );
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ /* Covariance handle */
+ if ( ( *hMCParamUpmix )->hCovEnc[i] != NULL )
+ {
+ ivas_spar_covar_enc_close( &( *hMCParamUpmix )->hCovEnc[i], ( MC_PARAMUPMIX_NCH + 1 ) );
+ }
+ }
+
+ free( *hMCParamUpmix );
+ *hMCParamUpmix = NULL;
+ return;
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_getNumTransportChannels()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+/* r : number of IVAS transport channels */
+int16_t ivas_mc_paramupmix_getNumTransportChannels()
+{
+ int16_t nchan_transport;
+
+ /* LFE not included */
+ nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; /*5_1_2*/
+
+ return nchan_transport;
+}
+
+
+/*****************************************************************************************/
+/* local functions */
+/*****************************************************************************************/
+static void get_huff_table(
+ PAR_TYPE par_type,
+ QUANT_TYPE quant_type,
+ HUFF_TAB *df0,
+ HUFF_TAB *df,
+ HUFF_TAB *dt )
+{
+ switch ( par_type )
+ {
+ case ALPHA:
+ df0->value = huff_alpha_table[quant_type].df0.value;
+ df0->length = huff_alpha_table[quant_type].df0.length;
+ df->value = huff_alpha_table[quant_type].df.value;
+ df->length = huff_alpha_table[quant_type].df.length;
+ dt->value = huff_alpha_table[quant_type].dt.value;
+ dt->length = huff_alpha_table[quant_type].dt.length;
+ break;
+ case BETA:
+ df0->value = huff_beta_table[quant_type].df0.value;
+ df0->length = huff_beta_table[quant_type].df0.length;
+ df->value = huff_beta_table[quant_type].df.value;
+ df->length = huff_beta_table[quant_type].df.length;
+ dt->value = huff_beta_table[quant_type].dt.value;
+ dt->length = huff_beta_table[quant_type].dt.length;
+ break;
+ }
+}
+
+static void write_huff_bits(
+ int32_t value,
+ uint16_t length,
+ uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS],
+ int16_t *bit_pos )
+{
+ int16_t k;
+ for ( k = length - 1; k >= 0; k-- )
+ {
+ bit_buffer[( *bit_pos )++] = (uint16_t) ( ( value >> k ) & 1 );
+ }
+}
+
+static void huffman_encode(
+ int16_t bdfOnly,
+ int16_t bdtAllowed,
+ int16_t nv,
+ int16_t ivStart,
+ int32_t *vqPrev,
+ int32_t *vq,
+ PAR_TYPE parType,
+ QUANT_TYPE quant_type,
+ int16_t nq,
+ uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS],
+ int16_t *bit_pos )
+{
+ int16_t iv, ndf, ndt;
+ int32_t icode;
+ int16_t offset;
+ HUFF_TAB df0, df, dt;
+
+ get_huff_table( parType, quant_type, &df0, &df, &dt );
+
+ offset = nq - 1; /* range [-(nquant - 1), nquant - 1] */
+
+ /* Get code length for time and freq diff coding */
+ ndf = 0;
+ ndt = 0;
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ if ( iv == ivStart )
+ {
+ icode = vq[iv];
+ ndf += df0.length[icode];
+ }
+ else
+ {
+ icode = vq[iv] - vq[iv - 1] + offset;
+ ndf += df.length[icode];
+ }
+
+ icode = vq[iv] - vqPrev[iv] + offset;
+ ndt += dt.length[icode];
+ }
+
+ if ( !bdtAllowed ) /* Time diff not allowed due to conformance or other reason even if bdfOnly = 0 */
+ {
+ ndt = ndf + 1;
+ }
+
+ /* Write the bitstream */
+ if ( bdfOnly || ndf < ndt )
+ {
+ bit_buffer[( *bit_pos )++] = (uint16_t) 0 & 1;
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ if ( iv == ivStart )
+ {
+ icode = vq[iv];
+ write_huff_bits( df0.value[icode], df0.length[icode], bit_buffer, bit_pos );
+ }
+ else
+ {
+ icode = vq[iv] - vq[iv - 1] + offset;
+ write_huff_bits( df.value[icode], df.length[icode], bit_buffer, bit_pos );
+ }
+ }
+ }
+ else
+ {
+ bit_buffer[( *bit_pos )++] = (uint16_t) 1 & 1;
+ for ( iv = ivStart; iv < nv; iv++ )
+ {
+ icode = vq[iv] - vqPrev[iv] + offset;
+ if ( icode < 0 || icode >= 2 * nq - 1 )
+ {
+ assert( 0 );
+ }
+ write_huff_bits( dt.value[icode], dt.length[icode], bit_buffer, bit_pos );
+ }
+ }
+}
+
+static void quantize_pars(
+ int16_t nv,
+ const float *v,
+ int16_t nq,
+ const float *data,
+ int32_t vq[IVAS_MAX_NUM_BANDS],
+ float *vdeq )
+{
+ int16_t iv, iq, iq0, iq1;
+
+ for ( iv = 0; iv < nv; iv++ )
+ {
+ iq0 = 0;
+ iq1 = nq - 1;
+
+ while ( iq1 - iq0 > 1 )
+ {
+ iq = ( iq0 + iq1 ) / 2;
+ if ( v[iv] < data[iq] )
+ {
+ iq1 = iq;
+ }
+ else
+ {
+ iq0 = iq;
+ }
+ }
+
+ if ( fabs( v[iv] - data[iq0] ) < fabs( v[iv] - data[iq1] ) )
+ {
+ vq[iv] = iq0;
+ vdeq[iv] = data[iq0];
+ }
+ else
+ {
+ vq[iv] = iq1;
+ vdeq[iv] = data[iq1];
+ }
+ }
+}
+
+static void quantize_alpha(
+ int16_t nv,
+ const float *alpha,
+ QUANT_TYPE quant_type,
+ int16_t *pnq,
+ int32_t aq[IVAS_MAX_NUM_BANDS],
+ float *adeq )
+{
+ int16_t nq;
+ const float *data;
+
+ nq = alpha_quant_table[quant_type].nquant;
+ data = alpha_quant_table[quant_type].data;
+
+ quantize_pars( nv, alpha, nq, data, aq, adeq );
+
+ *pnq = nq;
+}
+
+static void quantize_beta(
+ int16_t nv,
+ const float *beta,
+ const int32_t aq[IVAS_MAX_NUM_BANDS],
+ QUANT_TYPE quant_type,
+ int16_t *pnq,
+ int32_t bq[IVAS_MAX_NUM_BANDS],
+ float *bdeq )
+{
+ int16_t iv, iq, iq0, iq1;
+ ACPL_QUANT_TABLE *tables = beta_quant_table[quant_type];
+ ACPL_QUANT_TABLE quant_table;
+ const int16_t qmap[2][33] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } };
+ for ( iv = 0; iv < nv; iv++ )
+ {
+ quant_table = tables[qmap[quant_type][aq[iv]]];
+
+ iq0 = 0;
+ iq1 = quant_table.nquant - 1;
+
+ while ( iq1 - iq0 > 1 )
+ {
+ iq = ( iq0 + iq1 ) / 2;
+ if ( beta[iv] < quant_table.data[iq] )
+ {
+ iq1 = iq;
+ }
+ else
+ {
+ iq0 = iq;
+ }
+ }
+
+ if ( fabs( beta[iv] - quant_table.data[iq0] ) < fabs( beta[iv] - quant_table.data[iq1] ) )
+ {
+ bq[iv] = iq0;
+ bdeq[iv] = quant_table.data[iq0];
+ }
+ else
+ {
+ bq[iv] = iq1;
+ bdeq[iv] = quant_table.data[iq1];
+ }
+ }
+
+ *pnq = beta_quant_table[quant_type][0].nquant;
+}
+
+static void put_ec_data(
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix,
+ int16_t ch,
+ float pars[IVAS_MAX_NUM_BANDS],
+ float alphas[IVAS_MAX_NUM_BANDS],
+ PAR_TYPE parType,
+ uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS],
+ int16_t *bit_pos )
+{
+ int16_t npar = IVAS_MAX_NUM_BANDS;
+ int16_t onlyFreq = 1;
+ int16_t nq;
+ QUANT_TYPE quant_type = FINE;
+ int32_t alphaQuant[IVAS_MAX_NUM_BANDS];
+ int32_t betaQuant[IVAS_MAX_NUM_BANDS];
+ float alphaDequant[IVAS_MAX_NUM_BANDS];
+ float betaDequant[IVAS_MAX_NUM_BANDS];
+
+ if ( parType == ALPHA )
+ {
+ quantize_alpha( npar, pars, quant_type, &nq, alphaQuant, alphaDequant );
+ }
+ else
+ {
+ quantize_alpha( npar, alphas, quant_type, &nq, alphaQuant, alphaDequant );
+ quantize_beta( npar, pars, alphaQuant, quant_type, &nq, betaQuant, betaDequant );
+ }
+ if ( hMCParamUpmix->first_frame )
+ {
+ mvl2l( &( alphaQuant[0] ), &( hMCParamUpmix->alpha_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS );
+ if ( parType == BETA )
+ {
+ mvl2l( &( betaQuant[0] ), &( hMCParamUpmix->beta_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS );
+ if ( ch == ( MC_PARAMUPMIX_COMBINATIONS - 1 ) )
+ {
+ hMCParamUpmix->first_frame = 0;
+ }
+ }
+ }
+
+ /* Always one parameter set per frame for transient frames. Original PS framing is used internally. */
+ if ( parType == ALPHA )
+ {
+ huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->alpha_quant_prev[ch], alphaQuant, ALPHA, quant_type, nq, bit_buffer, bit_pos );
+ }
+ else
+ {
+ huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->beta_quant_prev[ch], betaQuant, BETA, quant_type, nq, bit_buffer, bit_pos );
+ }
+
+ if ( parType == ALPHA )
+ {
+ mvl2l( alphaQuant, hMCParamUpmix->alpha_quant_prev[ch], IVAS_MAX_NUM_BANDS );
+ }
+ else
+ {
+ mvl2l( betaQuant, hMCParamUpmix->beta_quant_prev[ch], IVAS_MAX_NUM_BANDS );
+ }
+}
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_dmx()
+ *
+ * Computes the time domain down mix signal
+ *------------------------------------------------------------------------*/
+
+static void ivas_mc_paramupmix_dmx(
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC ParamUpmix encoder handle */
+ float data_f[][L_FRAME48k], /* i/o : Input, downmix out */
+ const int16_t input_frame /* i : Input frame length */
+)
+{
+ int16_t i, l;
+ int16_t chan1s[4] = { 4, 5, 8, 9 };
+ int16_t chan2s[4] = { 6, 7, 10, 11 };
+ int16_t chanOut[4] = { 4, 5, 6, 7 };
+ int16_t chanZero[4] = { 8, 9, 10, 11 };
+
+ /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */
+ /* 9+11 -> 7 */
+ /* 8+10 -> 6 */
+ /* 5+7 -> 5 */
+ /* 4+6 -> 4 */
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ for ( l = 0; l < input_frame; l++ )
+ {
+ /* mid */
+ hMCParamUpmix->midside[i][0][l] = ( data_f[chan1s[i]][l] + data_f[chan2s[i]][l] ) * (float) 0.5;
+ /* side */
+ hMCParamUpmix->midside[i][1][l] = ( data_f[chan1s[i]][l] - data_f[chan2s[i]][l] ) * (float) 0.5;
+ data_f[chanOut[i]][l] = hMCParamUpmix->midside[i][0][l];
+ }
+ }
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ set_zero( data_f[chanZero[i]], input_frame );
+ }
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_mc_paramupmix_param_est_enc()
+ *
+ * run the CLDFB analysis on the input signal
+ * estimate the input and down mix covariances
+ *------------------------------------------------------------------------*/
+
+static void ivas_mc_paramupmix_param_est_enc(
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */
+ float input_frame_t[][L_FRAME48k], /* i : Input frame in the time domain */
+ const int16_t input_frame, /* i : Input frame length */
+ float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS],
+ float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] )
+{
+ float *pcm_in[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ float fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k];
+ float fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k];
+ float FR_Real_Mid[L_FRAME48k], FR_Imag_Mid[L_FRAME48k];
+ float *p_fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ float *p_fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ float *pp_in_fr_real[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ float *pp_in_fr_imag[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
+ float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
+ float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux;
+
+ int16_t l_ts;
+ int16_t b, i, j, ts, bnd;
+#ifdef FIX_468_16KHZ_PUPMIX
+ int16_t maxbands;
+#endif
+
+ int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2];
+ int16_t transient_det_l[2], transient_det_r[2];
+ int16_t chan1s[4] = { 4, 5, 8, 9 };
+ int16_t chan2s[4] = { 6, 7, 10, 11 };
+
+ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ pcm_in[2 * i] = input_frame_t[chan1s[i]];
+ pcm_in[2 * i + 1] = input_frame_t[chan2s[i]];
+ }
+
+ /*-----------------------------------------------------------------------------------------*
+ * Transient detector
+ *-----------------------------------------------------------------------------------------*/
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ )
+ {
+ ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i], pcm_in[2 * i], input_frame, transient_det_l );
+ ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i + 1], pcm_in[2 * i + 1], input_frame, transient_det_r );
+ transient_det[i][0] = transient_det_l[0] || transient_det_r[0];
+ transient_det[i][1] = transient_det_l[0] || transient_det_r[0];
+ /* should probably be transient_det_l[1] || transient_det_r[1] , but choosing 0 reproduces the before merge state */
+ }
+
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ )
+ {
+ p_fr_realbuffer[i] = fr_realbuffer[i];
+ p_fr_imagbuffer[i] = fr_imagbuffer[i];
+ }
+
+ /* prepare Parameter MDFT analysis */
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ )
+ {
+ pp_in_fr_real[i] = p_fr_realbuffer[i];
+ pp_in_fr_imag[i] = p_fr_imagbuffer[i];
+ }
+
+ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES;
+ for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
+ {
+ ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts,
+ hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans );
+ ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts,
+ hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans );
+ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ )
+ {
+ pcm_in[i] += l_ts;
+ pp_in_fr_real[i] += l_ts;
+ pp_in_fr_imag[i] += l_ts;
+ }
+ }
+
+ /*-----------------------------------------------------------------------------------------*
+ * Covariance process
+ *-----------------------------------------------------------------------------------------*/
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ pp_in_fr_real[0] = p_fr_realbuffer[2 * b];
+ pp_in_fr_imag[0] = p_fr_imagbuffer[2 * b];
+ pp_in_fr_real[1] = FR_Real_Mid;
+ pp_in_fr_imag[1] = FR_Imag_Mid;
+ v_add( pp_in_fr_real[0], p_fr_realbuffer[2 * b + 1], pp_in_fr_real[1], L_FRAME48k );
+ v_add( pp_in_fr_imag[0], p_fr_imagbuffer[2 * b + 1], pp_in_fr_imag[1], L_FRAME48k );
+ for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ )
+ {
+ for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ )
+ {
+ cov_real[i][j] = hMCParamUpmix->cov_real[b][i][j];
+ cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j];
+ }
+ }
+ ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind );
+ }
+#ifdef FIX_468_16KHZ_PUPMIX
+ maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands;
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ for ( bnd = 0; bnd < maxbands; bnd++ )
+ {
+#else
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ for ( bnd = 0; bnd < IVAS_MAX_NUM_BANDS; bnd++ )
+ {
+#endif
+ rxy = hMCParamUpmix->cov_real[b][1][0][bnd];
+ ryy = hMCParamUpmix->cov_real[b][1][1][bnd];
+ cmat = rxy / ( ryy + EPSILON );
+ alphas[b][bnd] = (float) 2.0 * cmat - (float) 1.0;
+
+ rxx = hMCParamUpmix->cov_real[b][0][0][bnd];
+ rxxest = cmat * cmat * ryy;
+ drxx = rxx - rxxest;
+ drxx = (float) max( drxx, 0.0 );
+ wetaux = (float) sqrt( drxx / ( ryy + EPSILON ) );
+ betas[b][bnd] = (float) 2.0 * wetaux;
+ }
+ }
+#ifdef FIX_468_16KHZ_PUPMIX
+ if ( maxbands < IVAS_MAX_NUM_BANDS )
+ {
+ for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ )
+ {
+ for ( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ )
+ {
+ alphas[b][bnd] = 0.0;
+ betas[b][bnd] = 0.0;
+ }
+ }
+ }
+#endif
+ return;
+}
diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c
index 866e4e176c9b0f915d58f87ff6d993486652c258..09fe5e3f402fa864e908524cfa47c86c9bcdd574 100644
--- a/lib_enc/ivas_mcmasa_enc.c
+++ b/lib_enc/ivas_mcmasa_enc.c
@@ -188,7 +188,13 @@ ivas_error ivas_mcmasa_enc_open(
}
/* set FB config. */
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs ) ) != IVAS_ERR_OK )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, numAnalysisChannels, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -219,7 +225,13 @@ ivas_error ivas_mcmasa_enc_open(
else
{
/* Allocate and initialize FB mixer handle for LFE channel */
- if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs ) ) != IVAS_ERR_OK )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, 1, 0, 0, input_Fs,
+ 0 ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -450,11 +462,7 @@ ivas_error ivas_mcmasa_enc_reconfig(
/* bitrate changed, may need to do something */
/* brute-force solution: close McMASA and re-instantiate with new settings */
-#ifdef FIX_350_MASA_DELAY_COMP
ivas_masa_enc_close( &( st_ivas->hMasa ) );
-#else
- ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format );
-#endif
ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs );
/* Determine if to separate some channels from the analysis */
@@ -749,10 +757,10 @@ void ivas_mcmasa_param_est_enc(
float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX];
float *p_Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS];
float *p_Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS];
- float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX];
- float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX];
- float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX];
- float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX];
+ float Foa_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX];
+ float Foa_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX];
+ float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX];
+ float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX];
float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS];
@@ -835,8 +843,10 @@ void ivas_mcmasa_param_est_enc(
for ( ts = mrange[0]; ts < mrange[1]; ts++ )
{
- ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts );
- ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts,
+ hMcMasa->hFbMixer->fb_cfg->num_in_chans );
+ ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts,
+ hMcMasa->hFbMixer->fb_cfg->num_in_chans );
for ( i = 0; i < numAnalysisChannels; i++ )
{
pcm_in[i] += l_ts;
@@ -977,7 +987,13 @@ void ivas_mcmasa_param_est_enc(
reference_power[ts],
0,
num_freq_bands,
- SBA_MODE_NONE );
+#ifndef SBA_MODE_CLEAN_UP
+ SBA_MODE_NONE,
+#else
+ MC_FORMAT,
+ 0,
+#endif
+ FOA_CHANNELS );
/* Fill buffers of length "averaging_length" time slots for intensity and energy */
hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */
@@ -1239,10 +1255,10 @@ void ivas_mcmasa_param_est_enc(
*--------------------------------------------------------------------------*/
void ivas_mcmasa_dmx_modify(
- const int16_t n_samples, /* i : input frame length in samples */
- float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format. TODO: buffer size into define? */
- const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */
- const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */
+ const int16_t n_samples, /* i : input frame length in samples */
+ float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format */
+ const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */
+ const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */
{
/* assumed data ordering in **dmx: [sce][cpe_chnl0][cpe_chnl1], i.e., [c][l][r] */
int16_t i;
@@ -1706,8 +1722,10 @@ static void computeLfeEnergy(
for ( ts = mrange[0]; ts < mrange[1]; ts++ )
{
- ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts );
- ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts,
+ hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans );
+ ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts,
+ hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans );
pcm_in[0] += l_ts;
/* Compute low frequency energy for LFE, for other channels it is computed in ivas_chnl_param_est_enc() */
diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c
old mode 100644
new mode 100755
index 5cbcb57daf4e789f8f308808c5c26b9875083d34..48a7abc42f48ce40c9d1804b2551036cd98474a0
--- a/lib_enc/ivas_mct_core_enc.c
+++ b/lib_enc/ivas_mct_core_enc.c
@@ -51,7 +51,6 @@
*----------------------------------------------------------*/
static void FindChannelRatio(
- MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */
Encoder_State **sts, /* i/o: encoder state structure */
int16_t chBitRatios[MCT_MAX_CHANNELS], /* o : bit-disctribution channel ratios */
const int16_t nChannels /* i : number of channels to be coded */
@@ -69,7 +68,7 @@ static void FindChannelRatio(
sum_nrg = 0;
for ( i = 0; i < nChannels; i++ )
{
- if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[i]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
sum_nrg += nrg[i];
}
@@ -78,7 +77,7 @@ static void FindChannelRatio(
for ( i = 0; i < nChannels; i++ )
{
- if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[i]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
chRatio = nrg[i] * sum_nrg;
chBitRatios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, max( 1, (uint16_t) ( BITRATE_MCT_RATIO_RANGE * chRatio + 0.5f ) ) );
@@ -87,15 +86,10 @@ static void FindChannelRatio(
{
chBitRatios[i] = 0;
}
- else if ( hMCT->num_lfe )
- {
- assert( sts[i]->mct_chan_mode == MCT_CHAN_MODE_LFE );
- chBitRatios[i] = !hMCT->LFE_off;
- }
}
#ifdef DEBUG_MODE_MDCT
- for ( i = 0; i < nchan; i++ )
+ for ( i = 0; i < nChannels; i++ )
{
dbgwrite( &chBitRatios[i], sizeof( int16_t ), 1, 1, "./res/chBitRatio" );
/* dbgwrite(&chRatio[i], sizeof(float),1,1,"./res/chRatio");*/
@@ -237,6 +231,8 @@ void ivas_mct_core_enc(
total_side_bits = 0;
nCPE = nChannels / CPE_CHANNELS;
+
+ /*in case of odd number of channels*/
if ( ( nCPE * CPE_CHANNELS ) != nChannels )
{
nCPE++;
@@ -255,7 +251,7 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
sts[i] = hCPE[cpe_id]->hCoreCoder[ch];
- if ( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE || hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
i++;
continue;
@@ -268,6 +264,11 @@ void ivas_mct_core_enc(
sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0;
+#ifdef FIX_483b
+ sts[i]->hTcxEnc->tns_ms_flag[0] = 0;
+ sts[i]->hTcxEnc->tns_ms_flag[1] = 0;
+#endif
+
i++;
}
}
@@ -304,7 +305,8 @@ void ivas_mct_core_enc(
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && hMCT->LFE_off ) || st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -332,7 +334,8 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < nChannels; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -341,7 +344,11 @@ void ivas_mct_core_enc(
for ( n = 0; n < nSubframes; n++ )
{
+#ifdef FIX_483b
+ if ( sts[ch]->hTcxEnc->tns_ms_flag[n] )
+#else
if ( !sts[ch]->hTcxEnc->fUseTns[n] /*!sts[0]->fUseTns[n] && !sts[1]->fUseTns[n]*/ )
+#endif
{
/* power spectrum: MDCT^2 + MDST^2 */
for ( i = 0; i < L_subframeTCX; i++ )
@@ -379,7 +386,8 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < nChannels; ch++ )
{
st = sts[ch];
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -411,7 +419,16 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < nChannels; ch++ )
{
st = sts[ch];
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+
+#ifdef IND_LIST_DYN
+ /* update the pointer to the buffer of indices of the second channel */
+ if ( ch > 0 )
+ {
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -432,7 +449,8 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < nChannels; ch++ )
{
st = sts[ch];
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -445,7 +463,8 @@ void ivas_mct_core_enc(
{
st = sts[ch];
- if ( ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -460,7 +479,8 @@ void ivas_mct_core_enc(
write_mct_bitstream( sts, hMCT, nChannels );
- FindChannelRatio( hMCT, sts, chBitRatios, nChannels );
+ FindChannelRatio(
+ sts, chBitRatios, nChannels );
nAvailBits = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - NBITS_BWIDTH - hMCT->nBitsMCT - lfe_bits );
@@ -473,7 +493,7 @@ void ivas_mct_core_enc(
}
else if ( ivas_format == SBA_FORMAT )
{
- nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_SBA;
+ nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_EXTENDED;
nAvailBits -= SBA_ORDER_BITS + SBA_PLANAR_BITS;
}
@@ -488,13 +508,14 @@ void ivas_mct_core_enc(
/*substract bits needed for the bitrate ratios */
for ( ch = 0; ch < nChannels; ch++ )
{
- if ( ( ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
nAvailBits -= NBBITS_MCT_RATIO;
}
- nAvailBits -= total_side_bits + ( hMCT->num_lfe ? 1 : 0 ) + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */
+ nAvailBits -= total_side_bits + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */
#ifdef DEBUG_MODE_MDCT
dbgwrite( &nAvailBits, sizeof( int16_t ), 1, 1, "./res/availBits" );
@@ -508,7 +529,8 @@ void ivas_mct_core_enc(
for ( ch = 0; ch < nChannels; ch++ )
{
- if ( ( ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -531,15 +553,11 @@ void ivas_mct_core_enc(
{
continue;
}
-
- if ( !( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) ) /* indicates LFE with no content */
- {
- st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC;
+ st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC;
#ifdef DEBUGGING
- total_brate += st->total_brate;
+ total_brate += st->total_brate;
#endif
- }
}
#ifdef DEBUGGING
if ( hCPE[cpe_id]->hMetaData != NULL )
@@ -550,8 +568,8 @@ void ivas_mct_core_enc(
}
#ifdef DEBUGGING
- format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS );
- mct_bits += hMCT->nBitsMCT + ( hMCT->num_lfe ? 1 : 0 ) + hMCT->nchan_out_woLFE;
+ format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + SBA_ORDER_BITS + SBA_PLANAR_BITS );
+ mct_bits += hMCT->nBitsMCT + hMCT->nchan_out_woLFE;
assert( ( total_brate + ( NBITS_BWIDTH + format_bits + mct_bits + sba_meta + lfe_bits ) * FRAMES_PER_SEC ) == ivas_total_brate );
#endif
diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c
index a9ce8e3abadf881568199f415d8a55ea28fb7909..55da6495f8d68e75c141e590367e23d392341962 100644
--- a/lib_enc/ivas_mct_enc.c
+++ b/lib_enc/ivas_mct_enc.c
@@ -60,8 +60,12 @@ static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t l
static void set_mct_enc_params(
MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */
const int32_t ivas_total_brate, /* i : IVAS total bitrate */
- const SBA_MODE sba_mode, /* i : SBA mode */
- const uint16_t b_nchan_change /* i : flag indicating different channel count */
+#ifndef SBA_MODE_CLEAN_UP
+ const SBA_MODE sba_mode, /* i : SBA mode */
+#else
+ const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */
+#endif
+ const uint16_t b_nchan_change /* i : flag indicating different channel count */
)
{
int16_t n;
@@ -82,7 +86,11 @@ static void set_mct_enc_params(
}
hMCT->hbr_mct = 0;
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR && ivas_total_brate >= IVAS_256k )
+#else
+ if ( ivas_format == SBA_FORMAT && ivas_total_brate >= IVAS_256k )
+#endif
{
hMCT->hbr_mct = 1;
}
@@ -90,7 +98,58 @@ static void set_mct_enc_params(
return;
}
+/*-------------------------------------------------------------------*
+ * map_input_to_cpe_channels()
+ *
+ * for MC_MODE map input channels to cpe channels
+ * mid channel (ch==2) is mapped to last odd-channel CPE
+ * all channels after LFE are mapped to cpe_id=1 and onwards
+ * E.g. for 5_1 and for 3 CPEs:
+ * cpe_id 0: L=data[0] R=data[1]
+ * cpe_id 1: L=data[4] R=data[5]
+ * cpe_id 2: L=data[2] (mid) R=NULL
+ *-------------------------------------------------------------------*/
+static void map_input_to_cpe_channels(
+ const Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
+ float *pdata[MAX_INPUT_CHANNELS], /* o: mapped input pointers */
+ float data[MCT_MAX_CHANNELS][L_FRAME48k] /* i: input channel data */
+)
+{
+ int16_t i, n;
+
+ i = 0;
+
+ for ( n = 0; n < LFE_CHANNEL - 1; n++ )
+ {
+ pdata[i] = data[n];
+ i++;
+ }
+ if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) )
+ {
+ for ( n = LFE_CHANNEL + 1; n < st_ivas->nchan_transport; n++ )
+ {
+ pdata[i] = data[n];
+ i++;
+ }
+ pdata[i] = data[LFE_CHANNEL - 1];
+ }
+ else
+ {
+ for ( ; n < st_ivas->nchan_transport; n++ )
+ {
+ pdata[i] = data[n];
+ i++;
+ }
+ }
+
+ /* odd channel CPE*/
+ if ( ( st_ivas->nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) )
+ {
+ pdata[st_ivas->nCPE * CPE_CHANNELS - 1] = NULL;
+ }
+ return;
+}
/*-------------------------------------------------------------------*
* ivas_mct_enc()
*
@@ -114,6 +173,7 @@ ivas_error ivas_mct_enc(
int16_t max_bwidth;
int32_t ivas_total_brate;
ivas_error error;
+ float *pdata[MAX_INPUT_CHANNELS];
error = IVAS_ERR_OK;
@@ -143,11 +203,17 @@ ivas_error ivas_mct_enc(
hMCT->p_orig_spectrum_long[cpe_id][n] = orig_spectrum_long[cpe_id][n];
hCPE->hCoreCoder[n]->input_bwidth = hCPE->hCoreCoder[n]->last_input_bwidth; /* updated in BWD */
hCPE->hCoreCoder[n]->bwidth = hCPE->hCoreCoder[n]->last_bwidth; /* updated in BWD */
+ /* reset channel mode from previous state*/
+ if ( ( hCPE->cpe_id * CPE_CHANNELS + n ) >= hMCT->nchan_out_woLFE )
+ {
+ hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
+ }
+ else
+ {
+ hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
+ }
}
}
-
- hMCT->LFE_off = 1; /* disable LFE coding by default for the moment */
-
/* reconfiguration in case of bitrate switching */
if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate )
{
@@ -163,25 +229,37 @@ ivas_error ivas_mct_enc(
/* set coded audio band-width */
switch_bw = set_bw_mct( st_ivas->hCPE, st_ivas->nCPE );
+ /*for MC and MCT remove pointer to LFE input that has been processed seperately */
+ map_input_to_cpe_channels( st_ivas, pdata, data );
/* pre-processing */
for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
{
- if ( ( error = ivas_cpe_enc( st_ivas, cpe_id, data[cpe_id * CPE_CHANNELS], data[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_cpe_enc( st_ivas, cpe_id, pdata[cpe_id * CPE_CHANNELS], pdata[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK )
{
return error;
}
}
/* joint MCT encoding */
- ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE + hMCT->num_lfe, ivas_total_brate, switch_bw,
- ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order );
+ ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE,
+ hMCT->nchan_out_woLFE,
+ ivas_total_brate, switch_bw,
+ ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0,
+ st_ivas->hEncoderConfig->sba_order );
/* Spectrum quantization and coding */
for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
{
hCPE = st_ivas->hCPE[cpe_id];
- ivas_mdct_quant_coder( hCPE, hMCT->LFE_off, hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 );
+#ifdef IND_LIST_DYN
+ if ( cpe_id > 0 )
+ {
+ hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot;
+ }
+#endif
+ ivas_mdct_quant_coder( hCPE,
+ hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 );
/* update input samples buffer (as done in ivas_cpe_enc() for other than MCT coding) */
for ( n = 0; n < CPE_CHANNELS; n++ )
@@ -236,23 +314,22 @@ ivas_error create_mct_enc(
if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT )
{
hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */
- hMCT->num_lfe = TRUE;
}
else if ( ivas_format == SBA_FORMAT )
{
hMCT->nchan_out_woLFE = ivas_get_sba_num_TCs( ivas_total_brate, st_ivas->sba_analysis_order );
-
- hMCT->num_lfe = FALSE;
}
else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC )
{
hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup );
- hMCT->num_lfe = FALSE;
+ }
+ else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels();
}
else if ( ivas_format == SBA_FORMAT )
{
hMCT->nchan_out_woLFE = ivas_sba_get_nchan( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar );
- hMCT->num_lfe = FALSE;
}
else
{
@@ -261,21 +338,17 @@ ivas_error create_mct_enc(
cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
- /* indicate LFE for appropriate core-coder channel */
for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
{
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) )
- {
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
}
}
/* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
- if ( ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) % 2 )
+ if ( ( hMCT->nchan_out_woLFE ) %
+ 2 )
{
st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
}
@@ -322,7 +395,11 @@ ivas_error create_mct_enc(
* Initializations
*-----------------------------------------------------------------*/
+#ifndef SBA_MODE_CLEAN_UP
set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, 1 );
+#else
+ set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, 1 );
+#endif
st_ivas->hMCT = hMCT;
@@ -361,17 +438,18 @@ ivas_error mct_enc_reconfigure(
if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT )
{
hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */
- hMCT->num_lfe = TRUE;
+ }
+ else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels();
}
else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC )
{
hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup );
- hMCT->num_lfe = FALSE;
}
else if ( ivas_format == SBA_FORMAT )
{
hMCT->nchan_out_woLFE = st_ivas->nchan_transport;
- hMCT->num_lfe = FALSE;
}
else
{
@@ -381,22 +459,18 @@ ivas_error mct_enc_reconfigure(
cp_bitrate = ivas_total_brate / hMCT->nchan_out_woLFE * CPE_CHANNELS;
- /* indicate LFE for appropriate core-coder channel */
for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ )
{
st_ivas->hCPE[cpe_id]->element_brate = cp_bitrate;
for ( n = 0; n < CPE_CHANNELS; n++ )
{
st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) )
- {
- st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
}
}
/* in case we have an uneven number of transport channels, indicate last channel ID as inactive */
- if ( ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) % 2 )
+ if ( ( hMCT->nchan_out_woLFE ) %
+ 2 )
{
st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
}
@@ -413,10 +487,11 @@ ivas_error mct_enc_reconfigure(
st->total_brate = st_ivas->hCPE[cpe_id]->element_brate;
- if ( !( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) )
+ if ( !(
+ ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) )
{
st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC );
- st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode );
if ( st->igf )
{
IGFEncSetMode( st->hIGFEnc, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, st->rf_mode );
@@ -486,8 +561,11 @@ ivas_error mct_enc_reconfigure(
* Initializations
*-----------------------------------------------------------------*/
+#ifndef SBA_MODE_CLEAN_UP
set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, b_nchan_change );
-
+#else
+ set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, b_nchan_change );
+#endif
return IVAS_ERR_OK;
}
@@ -607,6 +685,11 @@ static ivas_error ivas_mc_enc_reconfig(
if ( last_mc_mode != MC_MODE_MCT )
{
+ if ( st_ivas->hLFE != NULL )
+ {
+ /* LFE handle */
+ ivas_lfe_enc_close( &( st_ivas->hLFE ) );
+ }
/* create LFE handle */
if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK )
{
@@ -616,18 +699,59 @@ static ivas_error ivas_mc_enc_reconfig(
/*De-allocate handles for other MC modes*/
ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs );
+ ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs );
/* De-allocate McMasa-related handles */
ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs );
-#ifdef FIX_350_MASA_DELAY_COMP
ivas_masa_enc_close( &( st_ivas->hMasa ) );
-#else
- ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT );
-#endif
ivas_qmetadata_close( &st_ivas->hQMetaData );
}
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ st_ivas->nSCE = 0;
+ st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2;
+ st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS;
+
+ if ( last_mc_mode != MC_MODE_PARAMUPMIX )
+ {
+ if ( st_ivas->hLFE != NULL )
+ {
+ /* LFE handle */
+ ivas_lfe_enc_close( &( st_ivas->hLFE ) );
+ }
+
+ /* create LFE handle */
+ if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+
+ if ( last_mc_mode != MC_MODE_PARAMUPMIX )
+ /* This should always be the case, only supporting one bitrate currently */
+ {
+ if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ else
+ {
+ assert( 0 );
+ }
+
+ /*De-allocate handles for other MC modes*/
+ ivas_param_mc_enc_close( &st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs );
+
+ /* De-allocate McMasa-related handles */
+ ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs );
+
+ ivas_masa_enc_close( &( st_ivas->hMasa ) );
+
+ ivas_qmetadata_close( &st_ivas->hQMetaData );
+ }
else if ( st_ivas->mc_mode == MC_MODE_PARAMMC )
{
if ( last_mc_mode != MC_MODE_PARAMMC )
@@ -650,13 +774,15 @@ static ivas_error ivas_mc_enc_reconfig(
if ( st_ivas->hMasa != NULL )
{
-#ifdef FIX_350_MASA_DELAY_COMP
ivas_masa_enc_close( &( st_ivas->hMasa ) );
-#else
- ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT );
-#endif
st_ivas->hMasa = NULL;
}
+ ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs );
+ if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL )
+ {
+ /* LFE handle */
+ ivas_lfe_enc_close( &( st_ivas->hLFE ) );
+ }
ivas_qmetadata_close( &st_ivas->hQMetaData );
@@ -703,6 +829,12 @@ static ivas_error ivas_mc_enc_reconfig(
}
ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs );
+ ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs );
+ if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL )
+ {
+ /* LFE handle */
+ ivas_lfe_enc_close( &( st_ivas->hLFE ) );
+ }
if ( last_mc_mode == MC_MODE_MCT )
{
@@ -764,18 +896,10 @@ static ivas_error ivas_mc_enc_reconfig(
}
}
- st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
/* set last core to TCX20 */
st->last_core = TCX_20_CORE;
}
- else if ( last_mc_mode == MC_MODE_PARAMMC && st_ivas->mc_mode == MC_MODE_MCT && nchan_transport_old > 2 )
- {
-#ifdef DEBUGGING
- assert( st_ivas->hCPE[1] != NULL );
-#endif
- st_ivas->hCPE[1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_LFE;
- }
-
if ( st_ivas->mc_mode == MC_MODE_MCMASA )
{
ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE );
@@ -785,6 +909,11 @@ static ivas_error ivas_mc_enc_reconfig(
new_brate_SCE = 0;
new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
}
+ else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX )
+ {
+ new_brate_SCE = 0;
+ new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS;
+ }
else
{
new_brate_SCE = 0; /*st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport;*/
diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c
index ee0c529b8bab2758c7f97463529bc6ee1db12e90..228f48b305453884a1c4a8fef64abc9b2a22190b 100644
--- a/lib_enc/ivas_mct_enc_mct.c
+++ b/lib_enc/ivas_mct_enc_mct.c
@@ -62,7 +62,7 @@ void getChannelEnergies(
for ( ch = 0; ch < nchan; ch++ )
{
st = sts[ch];
- if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
L_subframe = st->hTcxEnc->L_frameTCX / nSubframes;
@@ -156,7 +156,7 @@ static void getCorrelationMatrix(
int16_t ch1, ch2, n, nchan;
float tmp;
- nchan = hMCT->nchan_out_woLFE + hMCT->num_lfe;
+ nchan = hMCT->nchan_out_woLFE;
/* correlation */
for ( ch1 = 0; ch1 < nchan; ch1++ )
@@ -166,8 +166,7 @@ static void getCorrelationMatrix(
xCorrMatrix[ch1][ch2] = 0;
if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV );
int16_t L_subframe = sts[ch1]->hTcxEnc->L_frameTCX / nSubframes;
@@ -225,9 +224,11 @@ static void getBestCorrelation(
*_ch2 = -1;
*max_corr = 0.f;
- for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch1++ )
+ for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE );
+ ch1++ )
{
- for ( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch2++ )
+ for ( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE );
+ ch2++ )
{
if ( fabsf( *max_corr ) < fabsf( xCorrMatrix[ch1][ch2] ) )
{
@@ -308,13 +309,14 @@ static void updateCorrelationMatrix(
int16_t ch1, ch2, n;
/* correlation: */
- for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch1++ )
+ for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE );
+ ch1++ )
{
- for ( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch2++ )
+ for ( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE );
+ ch2++ )
{
if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV );
@@ -341,9 +343,7 @@ static void updateCorrelationMatrix(
static int16_t channelPairToIndex(
const int16_t chIdx1,
const int16_t chIdx2,
- const int16_t nChannels,
- Encoder_State **sts /* i/o: encoder state structure */
-)
+ const int16_t nChannels )
{
int16_t ch1, ch2;
int16_t pairIdx;
@@ -354,11 +354,6 @@ static int16_t channelPairToIndex(
{
for ( ch1 = 0; ch1 < ch2; ch1++ )
{
- if ( sts[ch1]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch2]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- continue;
- }
-
if ( ch1 == chIdx1 && ch2 == chIdx2 )
{
return pairIdx;
@@ -398,7 +393,7 @@ static void getGlobalILD(
/*calculate total energy without LFE*/
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
meanE += nrg[ch];
cnt++;
@@ -410,7 +405,7 @@ static void getGlobalILD(
meanE = max( meanE / cnt, EPSILON );
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
L_subframe = sts[ch]->hTcxEnc->L_frameTCX / nSubframes;
@@ -483,11 +478,11 @@ void apply_MCT_enc(
/*Determine active channels*/
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
count_active_ch++;
}
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ else
{
hMCT->mc_global_ild[ch] = 0;
}
@@ -508,8 +503,8 @@ void apply_MCT_enc(
{
for ( ch1 = 0; ch1 < ch2; ch1++ )
{
- if ( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE &&
+ sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
sumCorrDiff += fabsf( hMCT->lastxCorrMatrix[ch1][ch2] - xCorrMatrix[ch1][ch2] );
}
@@ -600,8 +595,7 @@ void apply_MCT_enc(
}
/* calculate all related values: */
- assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE &&
- sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE );
+ assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE );
getBlockValues( sts, ch1, ch2, hMCT->hBlockData[currBlockDataCnt], mdst_spectrum, inv_spectrum, inv_mdst_spectrum );
@@ -686,7 +680,7 @@ void apply_MCT_enc(
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
if ( ( !cpEle[ch] ) || hMCT->currBlockDataCnt == 0 )
{
@@ -771,7 +765,8 @@ void write_mct_bitstream(
/* first write core info and overlap mode for all channels */
for ( ch = 0; ch < nchan; ch++ )
{
- if ( ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE ) && hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if (
+ hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
push_next_indice( hBstr, hMCT->mc_global_ild[ch], SMDCT_GLOBAL_ILD_BITS );
}
@@ -781,7 +776,8 @@ void write_mct_bitstream(
{
for ( ch = 0; ch < nchan; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
+ if (
+ sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE )
{
push_next_indice( hBstr, hMCT->lowE_ch[ch], 1 );
}
@@ -794,7 +790,7 @@ void write_mct_bitstream(
hBlock = hMCT->hBlockData[pair];
/*calculate channel pair index and write it to BS*/
- channelPairIndex = channelPairToIndex( hBlock->ch1, hBlock->ch2, nchan, sts );
+ channelPairIndex = channelPairToIndex( hBlock->ch1, hBlock->ch2, nchan );
push_next_indice( hBstr, channelPairIndex, hMCT->bitsChannelPairIndex );
/*point to encoder states of actual channels to write block pair bits*/
@@ -838,7 +834,7 @@ void mctStereoIGF_enc(
int16_t singleChEle[MCT_MAX_CHANNELS];
L_subframeTCX = 0; /* to avoid compilation warning */
- set_s( singleChEle, 1, hMCT->nchan_out_woLFE + hMCT->num_lfe );
+ set_s( singleChEle, 1, hMCT->nchan_out_woLFE );
for ( b = 0; b < hMCT->currBlockDataCnt; b++ )
{
@@ -855,6 +851,18 @@ void mctStereoIGF_enc(
p_st[0] = sts[ch1];
p_st[1] = sts[ch2];
+#ifdef IND_LIST_DYN
+ if ( ch1 > 0 )
+ {
+ sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+
+ if ( ch2 > 0 )
+ {
+ sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
+
p_powerSpec[0] = powerSpec[ch1];
p_powerSpec[1] = powerSpec[ch2];
@@ -889,19 +897,28 @@ void mctStereoIGF_enc(
}
/* channel elements that are coded separately detected */
- if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE + hMCT->num_lfe ) ) != 0 )
+ if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 )
{
- for ( ch = 0; ch < ( hMCT->nchan_out_woLFE + hMCT->num_lfe ); ch++ )
+ for ( ch = 0; ch < ( hMCT->nchan_out_woLFE );
+ ch++ )
{
if ( singleChEle[ch] )
{
st = sts[ch];
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE || st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if (
+ st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
+#ifdef IND_LIST_DYN
+ if ( ch > 0 )
+ {
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
+
nSubframes = st->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV;
for ( n = 0; n < nSubframes; n++ )
{
diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c
index 626dcf2631cee1f65518558caaa04e9a58a22919..edc9ea1e504b954a8bffd936633c307a2fa0b0d8 100644
--- a/lib_enc/ivas_mdct_core_enc.c
+++ b/lib_enc/ivas_mdct_core_enc.c
@@ -30,6 +30,7 @@
*******************************************************************************************************/
+#include "ivas_cnst.h"
#include
#include
#include "options.h"
@@ -38,6 +39,7 @@
#include "prot.h"
#include "ivas_prot.h"
#include "rom_com.h"
+#include "ivas_rom_com.h"
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -88,15 +90,11 @@ static void enc_prm_pre_mdct(
{
writeTCXWindowing( hBstr, st->hTcxCfg->tcx_last_overlap_mode );
}
-
- if ( st->element_mode == IVAS_CPE_MDCT && st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ push_next_indice( hBstr, st->hTcxEnc->kernel_type[0], st->last_core != ACELP_CORE ? 2 : 1 );
+ if ( st->core == TCX_10_CORE )
{
- push_next_indice( hBstr, st->hTcxEnc->kernel_type[0], st->last_core != ACELP_CORE ? 2 : 1 );
- if ( st->core == TCX_10_CORE )
- {
- assert( ( st->hTcxEnc->kernel_type[0] & 1 ) == ( st->hTcxEnc->kernel_type[1] >> 1 ) );
- push_next_indice( hBstr, st->hTcxEnc->kernel_type[1] & 1, 1 );
- }
+ assert( ( st->hTcxEnc->kernel_type[0] & 1 ) == ( st->hTcxEnc->kernel_type[1] >> 1 ) );
+ push_next_indice( hBstr, st->hTcxEnc->kernel_type[1] & 1, 1 );
}
st->glr_reset = 0;
@@ -288,7 +286,7 @@ static void kernel_switch_update_transforms(
int16_t i, leftOverlap = 0, rightOverlap = 0;
const float *left_win, *right_win;
- tcx_get_windows( hTcxCfg, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1, 0 );
+ tcx_get_windows( hTcxCfg, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 );
if ( speech_TCX != NULL && tcxTransType != TCX_20 && (int16_t) windowedTimeSignal[0] == FULL_OVERLAP && s - leftOverlap > minWindowLen )
{
for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */
@@ -311,7 +309,7 @@ static void kernel_switch_update_transforms(
s = hTcxCfg->tcx5SizeFB; /* obtain 1st TCX5 again */
nSubframes *= 2;
- WindowSignal( hTcxCfg, leftOverlap / 2, RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal + 2, &s, tcx5Win, 0, 1, 0 );
+ WindowSignal( hTcxCfg, leftOverlap / 2, RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal + 2, &s, tcx5Win, 0, 1 );
kernel_switch_trafo( tcx5Win, sigR, leftOverlap, s /* L_subfr. */ - ( leftOverlap + rightOverlap ) / 2, rightOverlap, kernelType );
if ( kernelType & 1 ) /* 2nd TCX5 is kernelType 3 */
@@ -576,13 +574,16 @@ void ivas_mdct_core_whitening_enc(
int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : number of tns parameters put into prm */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to the parameter table */
BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
- int16_t *LFE_off, /* o : flag if LFE has zero content */
const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */
const int16_t nChannels /* i : total number of coded channels */
)
{
int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines;
float A_q[CPE_CHANNELS][NB_DIV][M + 1];
+ int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10];
+ int16_t nbits_sns;
+ int16_t sns_stereo_mode[NB_DIV];
+ int16_t idx;
int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW];
int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV];
int16_t ltpBits[CPE_CHANNELS];
@@ -598,9 +599,10 @@ void ivas_mdct_core_whitening_enc(
float scf_q[CPE_CHANNELS][NB_DIV][M];
float chE[2], chE_tot;
int8_t sns_low_br_mode;
- int8_t skipped_first_channel;
int16_t nbits_start_sns;
int16_t num_sns;
+ int8_t skipped_first_channel;
+ int16_t zero_side_flag[NB_DIV];
push_wmops( "mdct_core_whitening" );
@@ -612,10 +614,7 @@ void ivas_mdct_core_whitening_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- stereo_tcx_init_enc( sts[ch] );
- }
+ stereo_tcx_init_enc( sts[ch] );
set_s( tnsSize[ch], 0, 2 );
set_s( tnsBits[ch], 0, 2 );
@@ -655,10 +654,7 @@ void ivas_mdct_core_whitening_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
- {
- SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode );
- }
+ SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode );
}
}
@@ -672,12 +668,10 @@ void ivas_mdct_core_whitening_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels )
{
continue;
}
-
SetCurrentPsychParams( st->core, 0, st->hTcxCfg );
/* tcx ltp analysis on the 12.8kHz weighted speech, saves preproc resampling to sr_core */
@@ -686,11 +680,18 @@ void ivas_mdct_core_whitening_enc(
core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 );
/* BWD in MDCT domain */
- if ( st->hTcxEnc->transform_type[0] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
+ if ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP )
{
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
+
+ for ( n = 0; n < nSubframes; n++ )
{
- bw_detect( st, NULL, st->hTcxEnc->spectrum[0], NULL );
+ bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, mct_on );
+
+ if ( nSubframes == NB_DIV && n == 0 )
+ {
+ st->last_input_bwidth = st->input_bwidth;
+ }
}
}
@@ -803,7 +804,7 @@ void ivas_mdct_core_whitening_enc(
{
TCX_ENC_HANDLE hTcxEncCh = sts[ch]->hTcxEnc;
- if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels )
{
hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[0] = 0;
@@ -830,9 +831,10 @@ void ivas_mdct_core_whitening_enc(
* Envelope Quantization and FDNS
*---------------------------------------------------------------*/
+
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels )
{
continue;
}
@@ -873,11 +875,12 @@ void ivas_mdct_core_whitening_enc(
chE[n] = sum_f( powerSpec, L_subframeTCX );
}
- sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->last_core == ACELP_CORE ? L_subframe : st->L_frame, scf[ch][n] );
+ sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf[ch][n] );
}
/* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE && mct_on )
+ if (
+ mct_on )
{
chE_tot = sum_f( chE, NB_DIV );
@@ -894,7 +897,7 @@ void ivas_mdct_core_whitening_enc(
}
/* set low br mode, if possible. Can later be discarded, depending on the stereo mode used for SNS parameter decoding */
- if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE ) )
+ if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) )
{
sns_low_br_mode = !sts[0]->sp_aud_decision0;
}
@@ -903,48 +906,51 @@ void ivas_mdct_core_whitening_enc(
sns_low_br_mode = 0;
}
- if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 &&
- sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR )
+ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) )
{
- sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] );
+ nbits_sns = quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode );
}
else
{
-#ifdef DEBUG_MODE_MDCT
+ if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 &&
+ sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR )
{
- float ener_side = 0;
- float ener_mid = 0;
- dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" );
- dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" );
+ sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] );
}
-#endif
- for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ else
{
- param_lpc[ch][0] = ch;
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- continue;
- }
- st = sts[ch];
-
- if ( st->hTcxEnc->tcxMode == TCX_20 )
+#ifdef DEBUG_MODE_MDCT
{
- sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode );
+ float ener_side = 0;
+ float ener_mid = 0;
+ dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" );
+ dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" );
}
- else
- {
-#ifdef SNS_LOW_BR_MODE
- sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode );
-#else
- sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, ( hCPE->element_brate == IVAS_48k && !hCPE->hCoreCoder[0]->sp_aud_decision0 ) );
#endif
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ param_lpc[ch][0] = ch;
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ {
+ continue;
+ }
+ st = sts[ch];
+
+ if ( st->hTcxEnc->tcxMode == TCX_20 )
+ {
+ sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode );
+ }
+ else
+ {
+ sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode );
+ }
}
}
}
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -965,6 +971,7 @@ void ivas_mdct_core_whitening_enc(
}
}
+
/*--------------------------------------------------------------*
* TNS
*---------------------------------------------------------------*/
@@ -972,7 +979,7 @@ void ivas_mdct_core_whitening_enc(
/* first deinterleave once more */
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -993,7 +1000,7 @@ void ivas_mdct_core_whitening_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
- if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -1015,8 +1022,6 @@ void ivas_mdct_core_whitening_enc(
}
}
}
-
- /*check whether LFE channel is active*/
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
/*no need to write last channel bit in case of odd channels*/
@@ -1029,12 +1034,7 @@ void ivas_mdct_core_whitening_enc(
if ( mct_on ) /* signal bits should be written only for MCT*/
{
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
- {
- assert( *LFE_off == 1 );
- push_next_indice( hBstr, *LFE_off, 1 );
- }
- else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
push_next_indice( hBstr, 1, 1 );
}
@@ -1051,7 +1051,7 @@ void ivas_mdct_core_whitening_enc(
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( *LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
st->side_bits_frame_channel = 0;
/*dummy initialization to prevent range coder crashing in case all channels are silent and bits are distributed to channel 0 */
@@ -1089,43 +1089,103 @@ void ivas_mdct_core_whitening_enc(
/*--------------------------------------------------------------------------------*
* SNS parameters
*--------------------------------------------------------------------------------*/
-
- /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */
- skipped_first_channel = 0;
- for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) )
{
- st = sts[ch];
+ nbits_sns = 0;
+ idx = 0;
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( *LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( sts[0]->core == sts[1]->core )
{
- skipped_first_channel = 1;
- continue;
- }
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
- nbits_start_sns = hBstr->nb_bits_tot;
+ /* push all stereo mode bits first */
+ for ( n = 0; n < nSubframes; ++n )
+ {
+ push_next_indice( hBstr, sns_stereo_mode[n], 1 );
+ nbits_sns++;
+ sts[0]->side_bits_frame_channel++;
+ }
- num_sns = ( st->core == TCX_20_CORE ) ? 1 : 2;
+ /* zero side flags only get transmitted if needed */
+ for ( n = 0; n < nSubframes; ++n )
+ {
+ if ( sns_stereo_mode[n] == SNS_STEREO_MODE_MS )
+ {
+ push_next_indice( hBstr, zero_side_flag[n], 1 );
+ nbits_sns++;
+ sts[0]->side_bits_frame_channel++;
+ }
+ }
+ }
- if ( ch == 0 || skipped_first_channel )
+ for ( ch = 0; ch < CPE_CHANNELS; ++ch )
{
- push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 );
-
- if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE ) )
+ st = sts[ch];
+ nbits_start_sns = hBstr->nb_bits_tot;
+ nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
+ for ( n = 0; n < nSubframes; ++n )
{
- /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */
- push_next_indice( hBstr, sns_low_br_mode, 1 );
+ const int16_t is_side = ch == 1 && sns_stereo_mode[n] == SNS_STEREO_MODE_MS;
+ const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits;
+ int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 );
+
+ if ( is_side )
+ {
+ if ( zero_side_flag[n] )
+ {
+ continue;
+ }
+ nStages = SNS_MSVQ_NSTAGES_SIDE;
+ bits = ( sts[ch]->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits;
+ }
+ for ( int16_t j = 0; j < nStages; ++j, ++idx )
+ {
+ push_next_indice( hBstr, sns_vq_indices[idx], bits[j] );
+ }
}
+ st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns;
}
- encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode );
+ }
+ else
+ {
+ /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */
+ skipped_first_channel = 0;
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ st = sts[ch];
- st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns;
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
+ {
+ skipped_first_channel = 1;
+ continue;
+ }
+
+ nbits_start_sns = hBstr->nb_bits_tot;
+
+ num_sns = ( st->core == TCX_20_CORE ) ? 1 : 2;
+
+ if ( ch == 0 || skipped_first_channel )
+ {
+ push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 );
+
+ if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) )
+ {
+ /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */
+ push_next_indice( hBstr, sns_low_br_mode, 1 );
+ }
+ }
+ encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode );
+
+ st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns;
+ }
}
+
/*update pitch buffer*/
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( *LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
@@ -1152,7 +1212,6 @@ void ivas_mdct_core_whitening_enc(
void ivas_mdct_quant_coder(
CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */
- const int16_t LFE_off, /* i : flag if LFE is inactive */
int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */
int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */
int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */
@@ -1198,7 +1257,7 @@ void ivas_mdct_quant_coder(
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
ignore_chan[ch] = 1;
continue;
@@ -1258,7 +1317,14 @@ void ivas_mdct_quant_coder(
{
st = sts[ch];
- if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+#ifdef IND_LIST_DYN
+ /* update the pointer to the buffer of indices of the second channel */
+ if ( ch > 0 )
+ {
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
/*Enable appropriate upadte of tcx_curr_overlap_mode even for uncoded channel index 1*/
L_frameTCX[ch][0] = ( st->core == TCX_10_CORE ) ? st->hTcxEnc->L_frameTCX >> 1 : st->hTcxEnc->L_frameTCX;
@@ -1285,7 +1351,7 @@ void ivas_mdct_quant_coder(
* Generate Bitstream
*---------------------------------------------------------------*/
- if ( ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) )
+ if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE )
{
continue;
}
diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c
index ac4f83a65794d7bbcdc2104e7b858d5bc8319ff7..213c0ce7563047d24e60cf4e22cd565cb53fb588 100644
--- a/lib_enc/ivas_qmetadata_enc.c
+++ b/lib_enc/ivas_qmetadata_enc.c
@@ -52,7 +52,7 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA
#endif
-static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits );
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t hodirac_flag );
static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame );
@@ -60,7 +60,12 @@ static void ivas_qmetadata_reorder_2dir_bands( IVAS_QMETADATA_HANDLE hQMetaData
static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, int16_t *df_ratio_bits );
-static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits );
+static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
static int16_t ivas_qmetadata_raw_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t nbands, const int16_t start_band );
@@ -88,13 +93,23 @@ static ivas_error write_ec_direction( int16_t *num_bits_written, BSTR_ENC_HANDLE
static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len );
-static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence );
+static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
static void dct4_transform( uint8_t *v, float *dct_v );
-static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb );
+static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+);
-static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 );
+static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 );
static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, const int16_t len, BSTR_ENC_HANDLE hMetaData );
@@ -118,6 +133,21 @@ static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *d
static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t diffuseness_index_max_ec_frame, const float avg_azimuth, float *avg_azimuth_out );
+#ifdef HR_METADATA
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t bits_dir_hr );
+
+static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame );
+
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, const int16_t bits_dir_hr, BSTR_ENC_HANDLE hMetaData );
+
+static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, BSTR_ENC_HANDLE hMetaData );
+
+static void ivas_qmetadata_reorder_2dir_bands_hr( IVAS_QMETADATA_HANDLE hQMetaData );
+
+static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t bits_coh );
+#endif
+
+
/*-----------------------------------------------------------------------*
* ivas_qmetadata_enc_encode()
*
@@ -125,12 +155,17 @@ static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t d
*-----------------------------------------------------------------------*/
ivas_error ivas_qmetadata_enc_encode(
- BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
- IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */
+ BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
+ IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */
+ ,
+ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/
)
{
int16_t i, bit_pos_start, bit_pos_start_coh;
- int16_t next_ind_start, last_ind_start;
+ int16_t next_ind_start;
+#ifndef IND_LIST_DYN
+ int16_t last_ind_start;
+#endif
uint16_t diffuseness_index_max_ec_frame;
uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS];
int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS];
@@ -185,6 +220,7 @@ ivas_error ivas_qmetadata_enc_encode(
pF_surcoh = fopen( "./res/qmetadata_surcoh_enc.txt", "w" );
#endif
+
/* Save initial position in bitstream */
bit_pos_0 = hMetaData->nb_bits_tot;
bit_pos_start = bit_pos_0;
@@ -210,7 +246,10 @@ ivas_error ivas_qmetadata_enc_encode(
assert( ndirections == 2 );
#endif
/* Reorder 2dir bands for more efficient encoding. */
- ivas_qmetadata_reorder_2dir_bands( hQMetaData );
+ if ( !hodirac_flag )
+ {
+ ivas_qmetadata_reorder_2dir_bands( hQMetaData );
+ }
d = 0;
for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ )
{
@@ -244,7 +283,8 @@ ivas_error ivas_qmetadata_enc_encode(
}
/*Quantization of the Diffuseness */
- ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits );
+ ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits,
+ hodirac_flag );
bits_diff_sum = 0;
bits_diff[0] = ivas_qmetadata_entropy_encode_diffuseness( hMetaData, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] );
@@ -380,9 +420,15 @@ ivas_error ivas_qmetadata_enc_encode(
/*Coherence */
bits_coherence[d] = 0;
bit_pos_start_coh = hMetaData->nb_bits_tot;
+
if ( all_coherence_zero == 0 )
{
- bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence );
+ bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
if ( q_direction->cfg.mc_ls_setup == MC_LS_SETUP_5_1 || q_direction->cfg.mc_ls_setup == MC_LS_SETUP_7_1 )
@@ -394,7 +440,12 @@ ivas_error ivas_qmetadata_enc_encode(
else
{
/* Quantize directions*/
- quantize_direction_frame( q_direction, azimuth_orig, elevation_orig );
+ quantize_direction_frame( q_direction, azimuth_orig, elevation_orig
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
}
/* Signalling 2D*/
@@ -403,8 +454,12 @@ ivas_error ivas_qmetadata_enc_encode(
/* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/
bit_pos_start = hMetaData->nb_bits_tot;
+#ifdef IND_LIST_DYN
+ next_ind_start = hMetaData->nb_ind_tot;
+#else
next_ind_start = hMetaData->next_ind;
last_ind_start = hMetaData->last_ind;
+#endif
/* Encode quantized directions with EC frame-wise*/
if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req )
@@ -413,14 +468,23 @@ ivas_error ivas_qmetadata_enc_encode(
bits_signaling[d]++;
}
+#ifdef IND_LIST_DYN
+ next_ind_raw_flag = hMetaData->nb_ind_tot;
+#else
next_ind_raw_flag = hMetaData->next_ind;
+#endif
push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/
bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band );
reduce_bits = hQMetaData->is_masa_ivas_format ? ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) - 1 ) : MASA_MAX_BITS;
bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame,
- q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits );
+ q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
if ( bits_ec < 0 )
{
@@ -445,7 +509,11 @@ ivas_error ivas_qmetadata_enc_encode(
/* Encode quantized directions with EC band-wise */
if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 )
{
- restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start );
+ restore_metadata_buffer( hMetaData, next_ind_start,
+#ifndef IND_LIST_DYN
+ last_ind_start,
+#endif
+ bit_pos_start );
/* Write signaling */
push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/
@@ -453,7 +521,11 @@ ivas_error ivas_qmetadata_enc_encode(
bits_signaling[d] = 3;
/* Write raw flags */
+#ifdef IND_LIST_DYN
+ next_ind_raw_flag = hMetaData->nb_ind_tot;
+#else
next_ind_raw_flag = hMetaData->next_ind;
+#endif
for ( i = start_band; i < nbands; i++ )
{
push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/
@@ -466,7 +538,12 @@ ivas_error ivas_qmetadata_enc_encode(
bits_dir_bands[i] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, i + 1, i );
/* Write ec bits */
- bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS );
+ bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
if ( bits_ec >= 0 )
{
@@ -522,7 +599,11 @@ ivas_error ivas_qmetadata_enc_encode(
/*Bit budget exceeded, bit reduction strategy?*/
extra_bits = 0;
- restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start );
+ restore_metadata_buffer( hMetaData, next_ind_start,
+#ifndef IND_LIST_DYN
+ last_ind_start,
+#endif
+ bit_pos_start );
push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/
if ( nblocks > 1 )
@@ -565,7 +646,12 @@ ivas_error ivas_qmetadata_enc_encode(
{
bit_pos_start = hMetaData->nb_bits_tot;
hMetaData->nb_bits_tot = bit_pos_start_coh;
- ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence );
+ ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence
+#ifdef HR_METADATA
+ ,
+ 0
+#endif
+ );
hMetaData->nb_bits_tot = bit_pos_start;
}
@@ -654,6 +740,284 @@ ivas_error ivas_qmetadata_enc_encode(
}
+#ifdef HR_METADATA
+/*-----------------------------------------------------------------------*
+ * ivas_qmetadata_enc_encode_hr_384_512()
+ *
+ * Main function for quantizing and coding Spatial Metadata at HRs
+ *-----------------------------------------------------------------------*/
+
+ivas_error ivas_qmetadata_enc_encode_hr_384_512(
+ BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
+ IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */
+ const int16_t bits_sph_idx,
+ const int16_t bits_sp_coh )
+{
+ int16_t i, j;
+ int16_t bits_diff[QMETADATA_MAX_NO_DIRECTIONS];
+ IVAS_QDIRECTION *q_direction;
+ int16_t nbands, nblocks, start_band;
+ int16_t ndirections, d;
+ int16_t all_coherence_zero;
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ int16_t bits_no_dirs_coh;
+#endif
+#else
+ int16_t bits_no_dirs_coh;
+#endif
+ int16_t bits_ec;
+ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
+ ivas_error error;
+
+ error = IVAS_ERR_OK;
+
+#ifdef DEBUG_MODE_QMETADATA
+
+ static FILE *pF = NULL;
+ static FILE *pF_azi = NULL;
+ static FILE *pF_ele = NULL;
+ static FILE *pF_ratio = NULL;
+ static FILE *pF_spcoh = NULL;
+ static FILE *pF_spcoh_orig = NULL;
+ static FILE *pF_surcoh = NULL;
+
+ if ( pF == NULL )
+ pF = fopen( "./res/qmetadata_enc.txt", "w" );
+ if ( pF_azi == NULL )
+ pF_azi = fopen( "./res/qmetadata_azi_enc.txt", "w" );
+ if ( pF_ele == NULL )
+ pF_ele = fopen( "./res/qmetadata_ele_enc.txt", "w" );
+ if ( pF_ratio == NULL )
+ pF_ratio = fopen( "./res/qmetadata_ratio_enc.txt", "w" );
+ if ( pF_spcoh == NULL )
+ pF_spcoh = fopen( "./res/qmetadata_spcoh_enc.txt", "w" );
+ if ( pF_spcoh_orig == NULL )
+ pF_spcoh_orig = fopen( "./res/qmetadata_spcoh_orig.txt", "w" );
+ if ( pF_surcoh == NULL )
+ pF_surcoh = fopen( "./res/qmetadata_surcoh_enc.txt", "w" );
+#endif
+
+ ndirections = hQMetaData->no_directions;
+
+ /* Check if coherence should be encoded */
+ all_coherence_zero = 1;
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh = 0;
+#endif
+#else
+ bits_no_dirs_coh = 0;
+#endif
+#ifdef FIX_HBR_MASAMETA
+ if ( hQMetaData->q_direction->cfg.inactiveBands > 0 )
+ {
+ push_next_indice( hMetaData, 1, 1 );
+ /* write the number of inactive higher bands */
+ ivas_qmetadata_encode_extended_gr( hMetaData, hQMetaData->q_direction->cfg.inactiveBands - 1, MASA_MAXIMUM_CODING_SUBBANDS, 1 );
+ }
+ else
+ {
+ /* no change */
+ push_next_indice( hMetaData, 0, 1 );
+ }
+#endif
+ if ( hQMetaData->coherence_flag )
+ {
+ all_coherence_zero = hQMetaData->all_coherence_zero;
+ push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh += 1;
+#endif
+#else
+ bits_no_dirs_coh += 1;
+#endif
+ }
+
+ /* encode 2 direction subbands position */
+ if ( ndirections == 2 && bits_sph_idx == 11 )
+ {
+#ifdef FIX_481_UNUSED_VARIABLES
+#ifdef DEBUG_MODE_QMETADATA
+ bits_no_dirs_coh +=
+#endif
+#else
+ bits_no_dirs_coh +=
+#endif
+ write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands );
+
+ for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ )
+ {
+ set_f( hQMetaData->q_direction[1].band_data[i].energy_ratio, 0.0f, hQMetaData->q_direction[1].cfg.nblocks );
+ }
+
+ hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands;
+ }
+
+ /*Quantization and encoding of the Diffuseness */
+ ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData, bits_diff, bits_sph_idx, hMetaData );
+
+ /* Encode surround coherence */
+ if ( all_coherence_zero == 0 )
+ {
+ encode_surround_coherence_hr( hQMetaData, hMetaData );
+ }
+ else
+ {
+ for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ )
+ {
+ if ( hQMetaData->surcoh_band_data != NULL )
+ {
+ set_c( (int8_t *) hQMetaData->surcoh_band_data[i].surround_coherence, 0, hQMetaData->q_direction[0].cfg.nblocks );
+ }
+ }
+ }
+
+ /* Loop over number of directions*/
+ for ( d = 0; d < ndirections; d++ )
+ {
+ q_direction = &( hQMetaData->q_direction[d] );
+
+ nbands = q_direction->cfg.nbands;
+ nblocks = q_direction->cfg.nblocks;
+ start_band = q_direction->cfg.start_band;
+
+#ifdef DEBUG_MODE_QMETADATA
+ {
+ int16_t k;
+ k = 0;
+ fprintf( pF_spcoh_orig, "%d %d ", frame, k );
+
+ for ( i = start_band; i < nbands; i++ )
+ {
+ for ( j = 0; j < nblocks; j++ )
+ {
+ if ( q_direction->coherence_band_data != NULL )
+ {
+ fprintf( pF_spcoh_orig, " %d ", q_direction->coherence_band_data[i].spread_coherence[j] );
+ }
+ }
+ }
+ fprintf( pF_spcoh_orig, "\n" );
+ }
+#endif
+
+ /*Coherence */
+ if ( all_coherence_zero == 0 )
+ {
+ ivas_qmetadata_quantize_coherence_hr_512( hQMetaData, d, all_coherence_zero, hMetaData, bits_sp_coh );
+ }
+
+ /* write the spherical indexes */
+ bits_ec = hMetaData->nb_bits_tot;
+ if ( bits_sph_idx == 11 )
+ {
+ /* do the quantization */
+ quantize_direction_frame( q_direction, azimuth_orig, elevation_orig, 1 );
+ }
+ for ( i = start_band; i < nbands; i++ )
+ {
+ for ( j = 0; j < nblocks; j++ )
+ {
+ push_next_indice( hMetaData, q_direction->band_data[i].spherical_index[j], bits_sph_idx );
+ }
+ }
+ bits_ec = hMetaData->nb_bits_tot - bits_ec;
+
+#ifdef DEBUG_MODE_QMETADATA
+ {
+ float tmp_f;
+ fprintf( pF, "frame %d: diff %d ", frame, bits_diff[d] );
+ fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d );
+ fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d );
+ fprintf( pF_ratio, "frame %d/dir %d: ", frame, d );
+ /*fprintf( pF_spcoh, "frame %d/dir %d: ", frame, d ); */
+ fprintf( pF_spcoh, " %d %d ", frame, d );
+
+ if ( d == 0 )
+ {
+ fprintf( pF_surcoh, "frame %d/dir %d: ", frame, d );
+ }
+
+ /* direction_distance( elevation_orig, azimuth_orig, q_direction, nbands, nblocks, mat_dist );*/
+ for ( i = start_band; i < nbands; i++ )
+ {
+ for ( j = 0; j < nblocks; j++ )
+ {
+ fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f );
+ fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f );
+ fprintf( pF_ratio, " %1.3f ", q_direction->band_data[i].energy_ratio[j] );
+ if ( q_direction->coherence_band_data != NULL )
+ {
+ fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[i].spread_coherence[j] );
+ }
+ if ( d == 0 && hQMetaData->surcoh_band_data != NULL )
+ {
+ fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[i].surround_coherence[j] );
+ }
+ }
+ }
+ fprintf( pF, "\n" );
+ fprintf( pF_azi, "\n" );
+ fprintf( pF_ele, "\n" );
+ fprintf( pF_ratio, "\n" );
+ fprintf( pF_spcoh, "\n" );
+ if ( d == 0 )
+ {
+ fprintf( pF_surcoh, "\n" );
+ }
+
+ for ( i = 0; i < nblocks; i++ )
+ {
+ for ( j = 0; j < nbands; j++ )
+ {
+ dbgwrite( &( q_direction->band_data[j].azimuth[i] ), sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_azi.bin" );
+ dbgwrite( &( q_direction->band_data[j].elevation[i] ), sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_ele.bin" );
+ dbgwrite( &( q_direction->band_data[j].energy_ratio_index[i] ), sizeof( uint16_t ), 1, 1, "./res/IVAS_QMETADATA_diffuseness_index.bin" );
+ tmp_f = 1.f - q_direction->band_data[j].energy_ratio[i];
+ dbgwrite( &tmp_f, sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_diffuseness.bin" );
+ }
+ }
+
+ j = (int16_t) ( hMetaData->nb_bits_tot );
+ dbgwrite( &j, sizeof( int16_t ), 1, 1, "./res/IVAS_QMETADATA_bits.bin" );
+ }
+#endif
+
+ /* Save quantized DOAs */
+ if ( bits_sph_idx == 11 )
+ {
+ for ( i = start_band; i < nbands; i++ )
+ {
+ mvr2r( azimuth_orig[i], q_direction->band_data[i].azimuth, nblocks );
+ mvr2r( elevation_orig[i], q_direction->band_data[i].elevation, nblocks );
+ }
+ }
+ else
+ {
+ for ( i = start_band; i < nbands; i++ )
+ {
+ mvr2r( q_direction->band_data[i].azimuth, q_direction->band_data[i].q_azimuth, nblocks );
+ mvr2r( q_direction->band_data[i].elevation, q_direction->band_data[i].q_elevation, nblocks );
+ }
+ }
+ }
+#ifdef FIX_HBR_MASAMETA
+ if ( hQMetaData->q_direction->cfg.inactiveBands > 0 )
+ {
+ hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands;
+ if ( ndirections > 1 )
+ {
+ hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands;
+ }
+ }
+#endif
+ return error;
+}
+#endif
+
+
/*-----------------------------------------------------------------------*
* ivas_qmetadata_enc_sid_encode()
*
@@ -665,8 +1029,11 @@ void ivas_qmetadata_enc_sid_encode(
BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */
const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure */
- const int16_t ivas_format, /* i : IVAS format */
- const SBA_MODE sba_mode /* i : SBA mode */
+ const int16_t ivas_format /* i : IVAS format */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
+ const SBA_MODE sba_mode /* i : SBA mode */
+#endif
)
{
int16_t b, m;
@@ -682,10 +1049,13 @@ void ivas_qmetadata_enc_sid_encode(
if ( ivas_format == SBA_FORMAT )
{
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
{
+#endif
/* TODO: still use old sid frame size to keep bitexactness */
metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/
+#ifndef SBA_MODE_CLEAN_UP
}
else
{
@@ -693,6 +1063,7 @@ void ivas_qmetadata_enc_sid_encode(
/* TODO: still use old sid frame size to keep bitexactness */
metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
}
+#endif
}
else
{
@@ -731,7 +1102,11 @@ void ivas_qmetadata_enc_sid_encode(
/* sanity checks*/
assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" );
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
assert( ( q_direction->cfg.nbands == DIRAC_DTX_BANDS ) && "Qmetadata SID: only 2 bands supported!" );
}
@@ -740,7 +1115,11 @@ void ivas_qmetadata_enc_sid_encode(
assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" );
}
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode != SBA_MODE_SPAR )
+#else
+ if ( ivas_format != SBA_FORMAT )
+#endif
{
/* Signalling 2D*/
push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/
@@ -877,6 +1256,7 @@ void ivas_qmetadata_enc_sid_encode(
#endif
/* TODO: temporary to keep BE */
+#ifndef SBA_MODE_CLEAN_UP
if ( ivas_format == SBA_FORMAT )
{
if ( sba_mode != SBA_MODE_SPAR )
@@ -886,6 +1266,9 @@ void ivas_qmetadata_enc_sid_encode(
}
}
else
+#else
+ if ( ivas_format != SBA_FORMAT )
+#endif
{
metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
}
@@ -907,25 +1290,38 @@ void ivas_qmetadata_enc_sid_encode(
*------------------------------------------------------------------------*/
void reset_metadata_spatial(
- const IVAS_FORMAT ivas_format, /* i : IVAS format */
- BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */
- const int32_t element_brate, /* i : element bitrate */
- int32_t *total_brate, /* o : total bitrate */
- const int32_t core_brate, /* i : core bitrate */
- const int16_t nb_bits_metadata, /* i : number of meatdata bits */
- const SBA_MODE sba_mode /* i : SBA mode */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */
+ const int32_t element_brate, /* i : element bitrate */
+ int32_t *total_brate, /* o : total bitrate */
+ const int32_t core_brate, /* i : core bitrate */
+ const int16_t nb_bits_metadata /* i : number of meatdata bits */
+#ifndef SBA_MODE_CLEAN_UP
+ ,
+ const SBA_MODE sba_mode /* i : SBA mode */
+#endif
)
{
int16_t i, next_ind_sid, last_ind_sid;
+#ifdef IND_LIST_DYN
+ int16_t j;
+#endif
+
int16_t metadata_sid_bits;
if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA )
{
if ( ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) && core_brate != FRAME_NO_DATA )
{
+#ifndef SBA_MODE_CLEAN_UP
if ( sba_mode == SBA_MODE_SPAR )
+#else
+ if ( ivas_format == SBA_FORMAT )
+#endif
{
+#ifdef DEBUGGING
assert( hMetaData->ind_list[0].nb_bits == 1 );
+#endif
hMetaData->ind_list[0].value = 1;
metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
while ( hMetaData->nb_bits_tot < metadata_sid_bits )
@@ -936,15 +1332,22 @@ void reset_metadata_spatial(
else
{
/* Reset metadata and keep only SID metadata*/
+#ifdef IND_LIST_DYN
+ last_ind_sid = hMetaData->nb_ind_tot;
+ next_ind_sid = hMetaData->nb_ind_tot;
+#else
last_ind_sid = hMetaData->next_ind;
next_ind_sid = hMetaData->next_ind;
+#endif
while ( hMetaData->nb_bits_tot > nb_bits_metadata )
{
next_ind_sid--;
hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits;
}
+#ifndef IND_LIST_DYN
hMetaData->next_ind = 0;
+#endif
hMetaData->nb_bits_tot = 0;
for ( i = 0; i < next_ind_sid; i++ )
@@ -952,6 +1355,17 @@ void reset_metadata_spatial(
hMetaData->ind_list[i].nb_bits = -1;
}
+#ifdef IND_LIST_DYN
+ for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ )
+ {
+ hMetaData->ind_list[j].value = hMetaData->ind_list[i].value;
+ hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits;
+ hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits;
+ hMetaData->ind_list[i].nb_bits = -1;
+ }
+
+ hMetaData->nb_ind_tot = j;
+#else
for ( i = next_ind_sid; i < last_ind_sid; i++ )
{
hMetaData->ind_list[hMetaData->next_ind].value = hMetaData->ind_list[i].value;
@@ -960,13 +1374,20 @@ void reset_metadata_spatial(
hMetaData->next_ind++;
hMetaData->ind_list[i].nb_bits = -1;
}
+
hMetaData->last_ind = hMetaData->next_ind;
+#endif
+#ifdef DEBUGGING
assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" );
+#endif
}
}
else
{
/*Reset metadata*/
+#ifdef IND_LIST_DYN
+ reset_indices_enc( hMetaData, hMetaData->nb_ind_tot );
+#else
for ( i = 0; i < hMetaData->next_ind; i++ )
{
hMetaData->ind_list[i].nb_bits = -1;
@@ -974,21 +1395,36 @@ void reset_metadata_spatial(
hMetaData->nb_bits_tot = 0;
hMetaData->next_ind = 0;
hMetaData->last_ind = 0;
+#endif
}
*total_brate = element_brate;
}
+#ifndef SBA_MODE_CLEAN_UP
else if ( sba_mode != SBA_MODE_SPAR )
+#else
+ else if ( ivas_format != SBA_FORMAT )
+#endif
{
/* Reset SID metadata bits*/
while ( hMetaData->nb_bits_tot > nb_bits_metadata )
{
+#ifdef IND_LIST_DYN
+ hMetaData->nb_ind_tot--;
+ hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits;
+ hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1;
+#else
hMetaData->next_ind--;
hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->next_ind].nb_bits;
hMetaData->ind_list[hMetaData->next_ind].nb_bits = -1;
+#endif
}
+#ifdef DEBUGGING
assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" );
+#endif
+#ifndef IND_LIST_DYN
hMetaData->last_ind = hMetaData->next_ind;
+#endif
}
return;
@@ -1001,13 +1437,13 @@ void reset_metadata_spatial(
*
*------------------------------------------------------------------------*/
-/* !r: quantized spherical index */
+/*! r: quantized spherical index */
int16_t quantize_direction2D(
- float phi, /* i : input azimuth value */
- const int16_t no_cw, /* i : number of bits */
- float *phi_q, /* o : quantized azimuth value */
- uint16_t *index_phi, /* o : quantized azimuth index */
- const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
+ float phi, /* i : input azimuth value */
+ const int16_t no_cw, /* i : number of bits */
+ float *phi_q, /* o : quantized azimuth value */
+ uint16_t *index_phi, /* o : quantized azimuth index */
+ const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
)
{
int16_t idx_sph;
@@ -1019,7 +1455,6 @@ int16_t quantize_direction2D(
return 0;
}
-
if ( mc_format != MC_LS_SETUP_INVALID )
{
id_phi = quantize_phi_chan_compand( phi + 180, phi_q, no_cw, 0, mc_format );
@@ -1037,17 +1472,19 @@ int16_t quantize_direction2D(
}
+#ifdef HR_METADATA
/*-------------------------------------------------------------------------
* ivas_qmetadata_quantize_diffuseness_nrg_ratios()
*
* Quantize diffuseness
*------------------------------------------------------------------------*/
-static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr(
IVAS_QMETADATA_HANDLE hQMetaData,
int16_t *needed_bits,
int16_t *nbits_diff,
- int16_t *dfRatioBits )
+ int16_t *dfRatioBits,
+ const int16_t bits_dir_hr )
{
int16_t j, k, dir2band;
int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod;
@@ -1076,10 +1513,10 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
diffRatio = 1.0f - sumRatio;
dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio;
- index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
- diffRatioQ = diffuseness_reconstructions[index_diff];
+ index_diff = masa_sq( diffRatio, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+ diffRatioQ = diffuseness_reconstructions_hr[index_diff];
- dfRatio_bits = ivas_get_df_ratio_bits( index_diff );
+ dfRatio_bits = ivas_get_df_ratio_bits( index_diff >> 1 );
dfRatioBits[dir2band] = dfRatio_bits;
@@ -1090,6 +1527,327 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ );
dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q;
+ index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+
+ /* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction
+ * energy ratio index variables until they have been encoded. index_dirRatio1Inv and index_dirRatio2Inv are
+ * then later retrieved for further use in encoding. */
+ for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ )
+ {
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_diff;
+ hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = dirRatio1Q;
+ }
+ nbits_diff[0] += MASA_BITS_ER_HR;
+
+ index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+ for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ )
+ {
+ hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index;
+ hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[k] = dirRatio2Q;
+ }
+ nbits_diff[1] += dfRatio_bits;
+
+ /* Obtain compensated direct-to-total ratios for direction quantization. This compensates for the
+ * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values
+ * which are assumed by the direction quantization system. In practice, this improves direction
+ * accuracy when it is perceptual meaningful. */
+ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod,
+ 0 );
+
+ for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ )
+ {
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv_mod;
+
+ if ( bits_dir_hr > 0 )
+ {
+ hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr;
+ }
+ else
+ {
+
+ hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv_mod];
+ }
+ }
+ needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv_mod];
+
+ for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ )
+ {
+ hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index_mod[k] = index_dirRatio2Inv_mod;
+
+ if ( bits_dir_hr > 0 )
+ {
+ hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[k] = bits_dir_hr;
+ }
+ else
+ {
+
+ hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[k] = bits_direction_masa[index_dirRatio2Inv_mod];
+ }
+ }
+ needed_bits[1] += hQMetaData->q_direction[1].cfg.nblocks * bits_direction_masa[index_dirRatio2Inv_mod];
+
+ dir2band++;
+ }
+ else
+ {
+ index_dirRatio1Inv = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+
+ for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ )
+ {
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_dirRatio1Inv;
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv;
+ hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index_dirRatio1Inv];
+
+ if ( bits_dir_hr > 0 )
+ {
+ hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr;
+ }
+ else
+ {
+
+ hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv];
+ }
+ }
+
+ nbits_diff[0] += MASA_BITS_ER_HR;
+
+ needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_dir_hr;
+ }
+ }
+
+ return;
+}
+
+
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512(
+ IVAS_QMETADATA_HANDLE hQMetaData,
+ int16_t *needed_bits,
+ const int16_t bits_dir_hr,
+ BSTR_ENC_HANDLE hMetaData )
+{
+ int16_t j, k;
+ int16_t index;
+
+ needed_bits[0] = 0;
+ needed_bits[1] = 0;
+
+ for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j )
+ {
+ for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ )
+ {
+ index = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+ push_next_indice( hMetaData, index, MASA_BITS_ER_HR );
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index;
+ hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index;
+ hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index];
+ needed_bits[0] += MASA_BITS_ER_HR;
+ hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr;
+ }
+ }
+
+ if ( hQMetaData->no_directions == 2 )
+ {
+ for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j )
+ {
+ for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ )
+ {
+ index = masa_sq( 1.0f - hQMetaData->q_direction[1].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS );
+ push_next_indice( hMetaData, index, MASA_BITS_ER_HR );
+ hQMetaData->q_direction[1].band_data[j].energy_ratio_index[k] = index;
+ hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index];
+ if ( hQMetaData->q_direction[1].band_data[j].energy_ratio[k] > 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k] )
+ {
+ hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k];
+ }
+ needed_bits[1] += MASA_BITS_ER_HR;
+ hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr;
+ }
+ }
+ }
+
+ return;
+}
+
+
+/*-------------------------------------------------------------------------
+ * ivas_qmetadata_entropy_encode_diffuseness()
+ *
+ * encode diffuseness
+ *------------------------------------------------------------------------*/
+
+static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr(
+ BSTR_ENC_HANDLE hMetaData,
+ IVAS_QDIRECTION *q_direction,
+ uint16_t *diffuseness_index_max_ec_frame )
+{
+ int16_t start_bit_pos;
+ int16_t diffuseness_bits_raw;
+ int16_t b;
+ int16_t min_diffuseness_m_index, max_diffuseness_m_index;
+ int16_t nbands;
+ int16_t start_band;
+
+ nbands = q_direction->cfg.nbands;
+ start_band = q_direction->cfg.start_band;
+
+ start_bit_pos = hMetaData->nb_bits_tot;
+
+ if ( nbands == 1 )
+ {
+ /* If there is only one band, diffuseness should be coded directly as raw with no signaling. */
+ push_next_indice( hMetaData, q_direction->band_data[0].energy_ratio_index[0], MASA_BITS_ER_HR );
+ *diffuseness_index_max_ec_frame = 10;
+ return ( hMetaData->nb_bits_tot - start_bit_pos );
+ }
+
+ /* compute the number of raw coding bits */
+ diffuseness_bits_raw = 0;
+ for ( b = start_band; b < nbands; b++ )
+ {
+ diffuseness_bits_raw += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS );
+ }
+
+ min_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0];
+ max_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0];
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ if ( q_direction->band_data[b].energy_ratio_index[0] < min_diffuseness_m_index )
+ {
+ min_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0];
+ }
+
+ if ( q_direction->band_data[b].energy_ratio_index[0] > max_diffuseness_m_index )
+ {
+ max_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0];
+ }
+ }
+
+ /* Use similarity coding approach or raw coding when there is a low number of bands. */
+ /* one bit is used to indicate whether diffuseness values are entropy coded or coded raw */
+ if ( min_diffuseness_m_index == max_diffuseness_m_index ) /* all values are equal */
+ {
+ push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */
+ push_next_indice( hMetaData, 1, 1 ); /* dif_have_unique_value */
+ ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS ); /* dif_unique_value */
+ }
+ else if ( min_diffuseness_m_index + 1 == max_diffuseness_m_index ) /* only two consecutive values are present */
+ {
+ push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */
+ push_next_indice( hMetaData, 0, 1 ); /* dif_have_unique_value */
+ ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS - 1 ); /* dif_min_value */
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ push_next_indice( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - min_diffuseness_m_index, 1 ); /* dif_bit_offset_values */
+ }
+ }
+ else /* raw coding */
+ {
+ push_next_indice( hMetaData, 1, 1 ); /* dif_use_raw_coding */
+
+ for ( b = start_band; b < nbands; b++ )
+ {
+ ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS ); /* dif_values */
+ }
+ }
+
+ *diffuseness_index_max_ec_frame = 10;
+ /* adaptively select the diffuseness_index_max_ec threshold */
+ if ( min_diffuseness_m_index > 10 )
+ {
+ *diffuseness_index_max_ec_frame = HR_MASA_ER_LEVELS - 1;
+ }
+
+#ifdef DEBUGGING
+ assert( ( hMetaData->nb_bits_tot - start_bit_pos ) <= 1 + diffuseness_bits_raw );
+#endif
+ return ( hMetaData->nb_bits_tot - start_bit_pos );
+}
+
+#endif
+
+/*-------------------------------------------------------------------------
+ * ivas_qmetadata_quantize_diffuseness_nrg_ratios()
+ *
+ * Quantize diffuseness
+ *------------------------------------------------------------------------*/
+
+static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
+ IVAS_QMETADATA_HANDLE hQMetaData,
+ int16_t *needed_bits,
+ int16_t *nbits_diff,
+ int16_t *dfRatioBits,
+ const int16_t hodirac_flag )
+{
+ int16_t j, k, dir2band;
+ int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod;
+ int16_t index_diff;
+
+ nbits_diff[0] = 0;
+ nbits_diff[1] = 0;
+ needed_bits[0] = 0;
+ needed_bits[1] = 0;
+ dir2band = 0;
+
+ for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j )
+ {
+ if ( hQMetaData->no_directions == 2 && hQMetaData->twoDirBands[j] == 1 )
+ {
+ float diffRatio, dfRatio, dfRatioQ, diffRatioQ, dirRatio1Q, dirRatio2Q;
+ float dirRatio1, dirRatio2, sumRatio;
+ int16_t dfRatio_index, dfRatio_qsteps, dfRatio_bits;
+
+ /* With 2dir metadata, we quantize and transmit diffuse-to-total ratio (diffRatio) and
+ * distribution factor of direct-to-total ratios (dFRatio). This is more efficient and
+ * accurate than simple separate quantization of each direct-to-total ratio or their
+ * separate inverses. */
+ if ( hodirac_flag )
+ {
+ /* already encoded as total and ratios in HO-DirAC */
+ diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0];
+ dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0];
+ }
+ else
+ {
+ dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0];
+ dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0];
+ sumRatio = dirRatio1 + dirRatio2;
+ diffRatio = 1.0f - sumRatio;
+ dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio;
+ }
+
+
+ index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ diffRatioQ = diffuseness_reconstructions[index_diff];
+
+ if ( hodirac_flag )
+ {
+ dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff );
+ }
+ else
+ {
+ dfRatio_bits = ivas_get_df_ratio_bits( index_diff );
+ }
+
+ dfRatioBits[dir2band] = dfRatio_bits;
+
+ dfRatio_qsteps = ( 1 << dfRatio_bits );
+ if ( hodirac_flag )
+ {
+ dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps );
+ dirRatio1Q = 1.f - diffRatioQ;
+ dirRatio2Q = dfRatioQ;
+ }
+ else
+ {
+ dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps );
+
+ /* Direction quantization requires also separately quantized direct-to-total ratios. Thus, we calculate them. */
+ dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ );
+ dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q;
+ }
+
index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
/* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction
@@ -1102,7 +1860,16 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
}
nbits_diff[0] += MASA_BITS_ER;
- index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ if ( hodirac_flag )
+ {
+ float tmp;
+ index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS );
+ }
+ else
+ {
+ index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
+ }
+
for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ )
{
hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index;
@@ -1114,7 +1881,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
* fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values
* which are assumed by the direction quantization system. In practice, this improves direction
* accuracy when it is perceptual meaningful. */
- masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod );
+ masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod,
+ hodirac_flag );
for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ )
{
@@ -1145,6 +1913,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios(
}
nbits_diff[0] += MASA_BITS_ER;
+
needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv];
}
}
@@ -1494,24 +2263,38 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio(
/*-------------------------------------------------------------------------
* restore_metadata_buffer()
*
- * Reset metadata buffer
+ * Restore metadata buffer
*------------------------------------------------------------------------*/
void restore_metadata_buffer(
BSTR_ENC_HANDLE hMetaData,
const int16_t next_ind_start,
+#ifndef IND_LIST_DYN
const int16_t last_ind_start,
+#endif
const int16_t bit_pos_start )
{
int16_t i;
+#ifdef IND_LIST_DYN
+#ifdef FIX_I503_ASAN_ERROR_IND_LIST
+ for ( i = next_ind_start; i < hMetaData->nb_ind_tot; i++ )
+#else
+ for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ )
+#endif
+#else
for ( i = next_ind_start; i <= hMetaData->next_ind; i++ )
+#endif
{
hMetaData->ind_list[i].nb_bits = -1;
}
hMetaData->nb_bits_tot = bit_pos_start;
+#ifdef IND_LIST_DYN
+ hMetaData->nb_ind_tot = next_ind_start;
+#else
hMetaData->next_ind = next_ind_start;
hMetaData->last_ind = last_ind_start;
+#endif
return;
}
@@ -1531,7 +2314,7 @@ static void ivas_qmetadata_encode_quasi_uniform(
int16_t bits;
uint16_t tresh;
#ifdef DEBUGGING
- assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
+ assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
assert( value < alphabet_size );
#endif
@@ -1560,7 +2343,7 @@ static void ivas_qmetadata_encode_quasi_uniform(
*
*------------------------------------------------------------------------*/
-/* !r: number of bits using Golomb Rice code */
+/*! r: number of bits using Golomb Rice code */
static int16_t GR_bits_new(
uint16_t *data, /* i : data to encode with GR */
int16_t *no_symb, /* i : number of symbols for each component*/
@@ -1614,7 +2397,7 @@ static int16_t GR_bits_new(
* Encoding azimuth indexes with GR code using context
*------------------------------------------------------------------------*/
-/* !r: numer of bits used for coding */
+/*! r: numer of bits used for coding */
static int16_t GR_bits_azimuth_context(
uint16_t *data_in, /* i : data to be encoded */
int16_t *no_symb, /* i : number of symbols for each component */
@@ -1712,7 +2495,7 @@ static int16_t GR_bits_azimuth_context(
* Golomb Rice encoding with mean removing
*------------------------------------------------------------------------*/
-/* !r: number of bits used */
+/*! r: number of bits used */
static int16_t mean_removed_GR_new(
const uint16_t *idx, /* i : data to encode */
const int16_t max_no_symb,
@@ -1770,7 +2553,7 @@ static int16_t ivas_qmetadata_encode_quasi_uniform_length(
int16_t bits;
uint16_t tresh;
#ifdef DEBUGGING
- assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
+ assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/
assert( value < alphabet_size );
#endif
@@ -1799,7 +2582,12 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
const int16_t nbands,
const int16_t start_band,
const int16_t direction_bits_raw,
- int16_t max_bits )
+ int16_t max_bits
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag
+#endif
+)
{
uint16_t diff_idx_min;
int16_t i, j;
@@ -1843,9 +2631,21 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
idx = 0;
dist_count = 0;
set_zero( avg_direction_vector, 3 );
+
for ( i = start_band; i < nbands; i++ )
{
- diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min );
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ diff_idx_min = 0; // min( q_direction->band_data[i].energy_ratio_index_mod[0]>>1, diff_idx_min );
+ }
+ else
+ {
+#endif
+ diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min );
+#ifdef HR_METADATA
+ }
+#endif
if ( q_direction->band_data[i].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame )
{
@@ -2046,6 +2846,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
}
}
}
+
direction_bits_ec += elevation_bits_ec_best;
}
@@ -2218,6 +3019,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
}
}
}
+
/* encode the ExtendedGR part for azimuth */
ivas_qmetadata_encode_quasi_uniform( hMetaData, ivas_qmetadata_reorder_generic( avg_azimuth_index_best - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet );
@@ -2251,6 +3053,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best );
}
}
+
if ( dist_count > nblocks )
{
if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) )
@@ -2285,6 +3088,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
}
}
}
+
direction_bits_ec -= bits_gained;
}
else
@@ -3438,7 +4242,7 @@ static ivas_error requantize_direction_EC_3(
* writing of the spherical indexes
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static int16_t write_fixed_rate_direction(
BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */
IVAS_QDIRECTION *qdirection, /* i/o: quantized directional parameters */
@@ -3700,7 +4504,7 @@ static void calculate_two_distances(
* write metadata using entropy encoding
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static ivas_error write_ec_direction(
int16_t *num_bits_written, /* o : Number of bits written */
BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */
@@ -3874,7 +4678,7 @@ static ivas_error write_ec_direction(
* Local functions (coherence Q and coding)
*-----------------------------------------------------------------------*/
-/* !r: index */
+/*! r: index */
static uint64_t create_combined_index(
uint16_t *idx_dct, /* i : indexes to combine */
const int16_t len, /* i : number of indexes */
@@ -3900,13 +4704,13 @@ static uint64_t create_combined_index(
* encoding DCT0 coeffs with joint index
*-----------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static int16_t encode_coherence_indexesDCT0(
uint16_t *idx_dct, /* i : indexes to be encoded */
const int16_t len, /* i : number of indexes */
int16_t *no_cb_vec, /* i : number of codewords for each position */
BSTR_ENC_HANDLE hMetaData,
- int16_t indice_coherence,
+ const int16_t indice_coherence,
const int16_t nbits,
const int16_t nbits1 )
{
@@ -4001,9 +4805,7 @@ static int16_t coherence_coding_length(
if ( sum_s( no_cv, coding_subbands ) > MASA_COH_LIMIT_2IDX )
{
-#ifdef DEBUGGING
- assert( coding_subbands % 2 == 0 );
-#endif
+
no_cb = 1;
half_coding_subbands = coding_subbands / 2;
for ( j = 0; j < half_coding_subbands; j++ )
@@ -4049,11 +4851,15 @@ static int16_t coherence_coding_length(
* Encoding spread coherence for 1 subframe bands
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static int16_t encode_spread_coherence_1sf(
- IVAS_QMETADATA *q_metadata, /* i : quantized metadata */
- const int16_t idx_d, /* i : current direction index */
- BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */
+ IVAS_QMETADATA *q_metadata, /* i : quantized metadata */
+ const int16_t idx_d, /* i : current direction index */
+ BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */
+#endif
)
{
int16_t i, j, k;
@@ -4079,11 +4885,24 @@ static int16_t encode_spread_coherence_1sf(
GR_ord = 1;
idx_shift = 0;
+
/* number of codevectors added dependent on number of subbands */
extra_cv = coding_subbands / MASA_FACTOR_CV_COH;
for ( j = 0; j < coding_subbands; j++ )
{
- idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv;
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv;
+ }
+ else
+ {
+#endif
+ idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv;
+#ifdef HR_METADATA
+ }
+#endif
+
if ( idx_ER > 0 )
{
idx_sp_coh[j] = (uint16_t) roundf( q_direction->coherence_band_data[j].spread_coherence[0] / ( 255.0f / (float) idx_ER ) );
@@ -4228,7 +5047,7 @@ static int16_t encode_spread_coherence_1sf(
* encoding surround coherence
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static int16_t encode_surround_coherence(
IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */
BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */
@@ -4366,72 +5185,276 @@ static int16_t encode_surround_coherence(
push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */
}
- push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k );
-
- if ( nbits_fr1 > 0 )
+ push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k );
+
+ if ( nbits_fr1 > 0 )
+ {
+ if ( nbits_fr1 % 16 == 0 )
+ {
+ no_idx16 = nbits_fr1 / 16;
+ }
+ else
+ {
+ no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) );
+ }
+
+ assert( no_idx16 <= 4 );
+
+ k = nbits_fr1;
+ for ( i = 0; i < no_idx16 - 1; i++ )
+ {
+ k -= 16;
+ push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */
+ }
+
+ push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k );
+ }
+ }
+ else
+ {
+ /* write flag */
+ nbits = 1;
+
+ /* write flag*/
+ push_next_indice( hMetaData, 1, 1 );
+
+ /* write GR_ord */
+ push_next_indice( hMetaData, GR_ord, 1 );
+ nbits += 1;
+
+ /* write the min */
+ bits_GR = hMetaData->nb_bits_tot;
+ ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 );
+ nbits += hMetaData->nb_bits_tot - bits_GR;
+
+ /* write GR data */
+ for ( j = 0; j < idx_shift; j++ )
+ {
+ bits_GR = hMetaData->nb_bits_tot;
+
+ ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord );
+
+ nbits += hMetaData->nb_bits_tot - bits_GR;
+ }
+ }
+ }
+#ifdef DEBUGGING
+ for ( i = 0; i < coding_subbands; i++ )
+ {
+ for ( j = 1; j < q_direction->cfg.nblocks; j++ )
+ {
+ hQMetaData->surcoh_band_data[i].surround_coherence[j] = hQMetaData->surcoh_band_data[i].surround_coherence[0];
+ }
+ }
+#endif
+
+ return nbits;
+}
+
+
+#ifdef HR_METADATA
+static int16_t encode_surround_coherence_hr(
+ IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */
+ BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */
+)
+{
+ int16_t i, j, k, sf;
+ int16_t nbits, nbits_fr, nbits_sf;
+ uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS];
+ uint16_t mr_idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS];
+ int16_t GR_ord, bits_GR;
+ uint64_t idx, idx1;
+ int16_t no_idx16;
+ int16_t no_cv[MASA_MAXIMUM_CODING_SUBBANDS];
+ float error_ratio_surr;
+ IVAS_QDIRECTION *q_direction;
+ int16_t half_coding_subbands, nbits_fr1, coding_subbands;
+ int16_t all_coherence_zero;
+ uint16_t idx_sur_coh_shift[MASA_MAXIMUM_CODING_SUBBANDS];
+ uint8_t idx_shift;
+ int16_t max_val = 0, nbits_max;
+ int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx;
+ int16_t idx16;
+
+ coding_subbands = hQMetaData->q_direction[0].cfg.nbands;
+ all_coherence_zero = hQMetaData->all_coherence_zero;
+ q_direction = &( hQMetaData->q_direction[0] );
+ nbits = 0;
+
+ if ( all_coherence_zero == 1 )
+ {
+ nbits = 0;
+ }
+ else
+ {
+ for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ )
+ {
+ GR_ord = 1;
+ k = 0;
+ idx_shift = 0;
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ if ( hQMetaData->no_directions == 2 )
+ {
+ k += hQMetaData->twoDirBands[j];
+ idx16 = max( k - 1, 0 );
+ error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx16].energy_ratio[sf] * hQMetaData->twoDirBands[j];
+ }
+ else
+ {
+ error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf];
+ }
+
+
+ if ( error_ratio_surr <= 0 )
+ {
+ error_ratio_surr = 0;
+ idx_sur_coh[j] = 0;
+ no_cv[j] = 1;
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; /* sur_coherence_cb_masa[idx_cb_sur_coh_masa[DIRAC_DIFFUSE_LEVELS - 1] * MASA_MAX_NO_CV_SUR_COH]; */
+ }
+ else
+ {
+ idx_sur_coh[j] = squant_int( hQMetaData->surcoh_band_data[j].surround_coherence[sf], &hQMetaData->surcoh_band_data[j].surround_coherence[sf],
+ &sur_coherence_cb_masa[idx_cb_sur_coh_masa[7] * MASA_MAX_NO_CV_SUR_COH], idx_cb_sur_coh_masa[7] + 2 );
+ no_cv[j] = idx_cb_sur_coh_masa[7] + 2;
+ no_cv_shift[idx_shift] = no_cv[j];
+ idx_sur_coh_shift[idx_shift++] = idx_sur_coh[j];
+ }
+ }
+
+ if ( sum_s( no_cv, coding_subbands ) != coding_subbands )
{
- if ( nbits_fr1 % 16 == 0 )
+ nbits_max = 0;
+ if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH )
{
- no_idx16 = nbits_fr1 / 16;
+ j = maximum_s( (int16_t *) idx_sur_coh, coding_subbands, &max_val );
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ if ( no_cv[j] > max_val + 1 )
+ {
+ no_cv[j] = max_val + 1;
+ }
+ }
+ nbits_max = MASA_MAX_NO_CV_SUR_COH - max_val; /* encoded with GR0 as max_no_vals - no_vals*/
}
- else
+ if ( max_val == 0 )
{
- no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) );
+ for ( j = 0; j < coding_subbands; j++ )
+ {
+ hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0;
+ }
}
+ nbits_sf = coherence_coding_length( idx_sur_coh_shift, idx_shift, coding_subbands, no_cv,
+ mr_idx_sur_coh, no_cv_shift, &min_idx, &GR_ord, &nbits_fr, &nbits_fr1 );
+ half_coding_subbands = coding_subbands / 2;
+ idx1 = 0;
- assert( no_idx16 <= 4 );
-
- k = nbits_fr1;
- for ( i = 0; i < no_idx16 - 1; i++ )
+ /* should check how to encode the average - check distribution */
+ if ( nbits_fr + nbits_fr1 + nbits_max < nbits_sf )
{
- k -= 16;
- push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */
- }
+ /* write flag*/
+ push_next_indice( hMetaData, 0, 1 );
- push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k );
- }
- }
- else
- {
- /* write flag */
- nbits = 1;
+ /* create combined index */
+ nbits += nbits_fr + nbits_fr1 + 1;
+ if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH )
+ {
+ /* write max value*/
+ bits_GR = hMetaData->nb_bits_tot;
+ ivas_qmetadata_encode_extended_gr( hMetaData, MASA_MAX_NO_CV_SUR_COH - max_val - 1, MASA_MAX_NO_CV_SUR_COH, 0 );
+ nbits += hMetaData->nb_bits_tot - bits_GR;
+ }
- /* write flag*/
- push_next_indice( hMetaData, 1, 1 );
+ if ( nbits_fr1 > 0 )
+ {
+ idx = create_combined_index( idx_sur_coh, half_coding_subbands, no_cv );
+ idx1 = create_combined_index( &idx_sur_coh[half_coding_subbands], half_coding_subbands, &no_cv[half_coding_subbands] );
+ }
+ else
+ {
+ idx = create_combined_index( idx_sur_coh, coding_subbands, no_cv );
+ }
- /* write GR_ord */
- push_next_indice( hMetaData, GR_ord, 1 );
- nbits += 1;
+ if ( nbits_fr % 16 == 0 )
+ {
+ no_idx16 = nbits_fr / 16;
+ }
+ else
+ {
+ no_idx16 = (int16_t) round_f( ( nbits_fr / 16.0f + 0.5f ) );
+ }
- /* write the min */
- bits_GR = hMetaData->nb_bits_tot;
- ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 );
- nbits += hMetaData->nb_bits_tot - bits_GR;
+ /* write combined index */
+ k = nbits_fr;
+ for ( i = 0; i < no_idx16 - 1; i++ )
+ {
+ k -= 16;
+ push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */
+ }
- /* write GR data */
- for ( j = 0; j < idx_shift; j++ )
- {
- bits_GR = hMetaData->nb_bits_tot;
+ push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k );
- ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord );
+ if ( nbits_fr1 > 0 )
+ {
+ if ( nbits_fr1 % 16 == 0 )
+ {
+ no_idx16 = nbits_fr1 / 16;
+ }
+ else
+ {
+ no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) );
+ }
- nbits += hMetaData->nb_bits_tot - bits_GR;
+ assert( no_idx16 <= 4 );
+
+ k = nbits_fr1;
+ for ( i = 0; i < no_idx16 - 1; i++ )
+ {
+ k -= 16;
+ push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */
+ }
+
+ push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k );
+ }
+ }
+ else
+ {
+ /* write flag */
+ nbits += 1;
+
+ /* write flag*/
+ push_next_indice( hMetaData, 1, 1 );
+
+ /* write GR_ord */
+ push_next_indice( hMetaData, GR_ord, 1 );
+ nbits += 1;
+
+ /* write the min */
+ bits_GR = hMetaData->nb_bits_tot;
+ ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 );
+ nbits += hMetaData->nb_bits_tot - bits_GR;
+
+ /* write GR data */
+ for ( j = 0; j < idx_shift; j++ )
+ {
+ bits_GR = hMetaData->nb_bits_tot;
+
+ ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord );
+
+ nbits += hMetaData->nb_bits_tot - bits_GR;
+ }
+ }
}
}
}
-#ifdef DEBUGGING
- for ( i = 0; i < coding_subbands; i++ )
- {
- for ( j = 1; j < q_direction->cfg.nblocks; j++ )
- {
- hQMetaData->surcoh_band_data[i].surround_coherence[j] = hQMetaData->surcoh_band_data[i].surround_coherence[0];
- }
- }
-#endif
+
return nbits;
}
+#endif
+
/*-------------------------------------------------------------------*
* quantize_DCT_0_coh()
@@ -4439,7 +5462,7 @@ static int16_t encode_surround_coherence(
* quanization of DCT component of order zero for transformed coherence vector
*-------------------------------------------------------------------*/
-/* !r: quantized value */
+/*! r: quantized value */
static float quantize_DCT_0_coh(
const float x, /* i : input value */
const int16_t j, /* i : subband index */
@@ -4449,14 +5472,44 @@ static float quantize_DCT_0_coh(
IVAS_QDIRECTION *q_direction, /* i : quantized metadata */
uint16_t *idx_x, /* o : codewords index */
int16_t *p_no_cb /* o : actual number of codewords dependent on energy ratio value */
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */
+#endif
)
{
float var_azi, xhat;
int16_t idx_sub_cb, idx;
-
+#ifdef HR_METADATA
+ int16_t min_index;
+#endif
/* quantize first DCT component */
var_azi = var( q_direction->band_data[j].azimuth, q_direction->cfg.nblocks );
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index );
+ min_index = min_index >> 1;
+ }
+ else
+ {
+ min_index = q_direction->band_data[j].energy_ratio_index[0];
+ }
+
+ if ( var_azi < delta_var )
+ {
+ idx_sub_cb = no_cb * min_index;
+ }
+ else
+ {
+ idx_sub_cb = no_cb * ( min_index + DIRAC_DIFFUSE_LEVELS );
+ }
+
+ idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[min_index] );
+
+ *p_no_cb = len_cb_dct0_masa[min_index];
+#else
if ( var_azi < delta_var )
{
idx_sub_cb = no_cb * q_direction->band_data[j].energy_ratio_index[0];
@@ -4469,7 +5522,7 @@ static float quantize_DCT_0_coh(
idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]] );
*p_no_cb = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]];
-
+#endif
*idx_x = idx;
return xhat;
@@ -4482,7 +5535,7 @@ static float quantize_DCT_0_coh(
* Encoding DCT1 coeffs with joint index or EC
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
+/*! r: number of bits written */
static int16_t encode_coherence_indexesDCT1(
uint16_t *idx_dct, /* i : data to be encoded */
const int16_t len, /* i : number of data */
@@ -4538,20 +5591,134 @@ static void dct4_transform(
}
+#ifdef HR_METADATA
/*-------------------------------------------------------------------*
- * ivas_qmetadata_quantize_coherence()
+ * ivas_qmetadata_quantize_coherence_hr_512()
*
*
*-------------------------------------------------------------------*/
-/* !r: number of bits written */
-static int16_t ivas_qmetadata_quantize_coherence(
+static int16_t ivas_qmetadata_quantize_coherence_hr_512(
IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */
const int16_t idx_d, /* i : current direction index */
const int16_t all_coherence_zero, /* i : all coherence is zero - flag */
BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */
- const int16_t write_flag, /* i : flag to actually write the data or not */
- int16_t *indice_coherence )
+ const int16_t bits_coh )
+{
+ int16_t j, k;
+ int16_t nbands, nblocks;
+ int16_t nbits;
+ int16_t nbits1, nbits0, nbits_av;
+ uint16_t idx_coh[MASA_MAXIMUM_CODING_SUBBANDS];
+ IVAS_QDIRECTION *q_direction;
+ int16_t cbsize;
+ float delta, tmp;
+ int16_t min_idx, GR_param, GR_param_av;
+ uint16_t av, mr_idx[MASA_MAXIMUM_CODING_SUBBANDS];
+
+ q_direction = &( hQMetaData->q_direction[idx_d] );
+ nbands = q_direction->cfg.nbands;
+ nblocks = q_direction->cfg.nblocks;
+ nbits = 0;
+
+ if ( all_coherence_zero == 1 )
+ {
+ return nbits;
+ }
+ nbits = hMetaData->nb_bits_tot;
+
+ cbsize = 1 << bits_coh;
+ delta = 256.0f / cbsize;
+
+ for ( k = 0; k < nblocks; k++ )
+ {
+ min_idx = 0;
+ for ( j = 0; j < nbands; j++ )
+ {
+ idx_coh[j] = usquant( (float) ( q_direction->coherence_band_data[j].spread_coherence[k] ), &tmp, delta / 2.0f, delta, cbsize );
+ q_direction->coherence_band_data[j].spread_coherence[k] = (uint8_t) ( idx_coh[j] * delta + delta / 2.0f );
+ if ( idx_coh[j] < min_idx )
+ {
+ min_idx = idx_coh[j];
+ }
+ }
+
+
+ nbits0 = 0;
+ nbits1 = 0;
+ for ( j = 0; j < nbands; j++ )
+ {
+ idx_coh[j] = idx_coh[j] - min_idx;
+ nbits0 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 0 );
+ nbits1 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 1 );
+ }
+ if ( nbits0 < nbits1 )
+ {
+ GR_param = 0;
+ nbits1 = nbits0;
+ }
+ else
+ {
+ GR_param = 1;
+ }
+ GR_param_av = 1;
+ nbits_av = mean_removed_GR_new( idx_coh, cbsize, nbands, 1, &GR_param_av, &av, mr_idx );
+
+ if ( nbits_av < nbits1 )
+ {
+ nbits1 = nbits_av;
+ GR_param = GR_param_av;
+ /* use average removed */
+ push_next_indice( hMetaData, 1, 1 );
+ /* write average */
+ push_next_indice( hMetaData, av, bits_coh );
+ /* write GR param */
+ push_next_indice( hMetaData, GR_param, 1 );
+ for ( j = 0; j < nbands; j++ )
+ {
+ ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx[j], 2 * cbsize, GR_param );
+ }
+ }
+ else
+ {
+ /* use min removed */
+ push_next_indice( hMetaData, 0, 1 );
+ /* write min index */
+ push_next_indice( hMetaData, min_idx, bits_coh );
+ /* write GR param */
+ push_next_indice( hMetaData, GR_param, 1 );
+ for ( j = 0; j < nbands; j++ )
+ {
+ ivas_qmetadata_encode_extended_gr( hMetaData, idx_coh[j], cbsize - min_idx, GR_param );
+ }
+ }
+ }
+
+ nbits = hMetaData->nb_bits_tot - nbits;
+ return nbits;
+}
+#endif
+
+
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_quantize_coherence()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+/*! r: number of bits written */
+static int16_t ivas_qmetadata_quantize_coherence(
+ IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */
+ const int16_t idx_d, /* i : current direction index */
+ const int16_t all_coherence_zero, /* i : all coherence is zero - flag */
+ BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */
+ const int16_t write_flag, /* i : flag to actually write the data or not */
+ int16_t *indice_coherence
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */
+#endif
+)
{
int16_t j, k;
float dct_coh[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -4565,7 +5732,10 @@ static int16_t ivas_qmetadata_quantize_coherence(
int16_t two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS];
int16_t no_cb_vec[MASA_MAXIMUM_CODING_SUBBANDS];
IVAS_QDIRECTION *q_direction;
-
+#ifdef HR_METADATA
+ int16_t min_index;
+ min_index = 0;
+#endif
q_direction = &( hQMetaData->q_direction[idx_d] );
coding_subbands = q_direction->cfg.nbands;
nbits = 0;
@@ -4577,7 +5747,12 @@ static int16_t ivas_qmetadata_quantize_coherence(
if ( hQMetaData->q_direction[idx_d].cfg.nblocks == 1 )
{
- nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData );
+ nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData
+#ifdef HR_METADATA
+ ,
+ hrmasa_flag
+#endif
+ );
return nbits;
}
@@ -4632,13 +5807,32 @@ static int16_t ivas_qmetadata_quantize_coherence(
{
/* DCT transform */
dct4_transform( hQMetaData->q_direction[idx_d].coherence_band_data[j].spread_coherence, dct_coh[j] );
- no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]];
+
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
+ {
+ minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index );
+ no_cb_vec[j] = len_cb_dct0_masa[min_index >> 1];
+ }
+ else
+ {
+#endif
+ no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]];
+#ifdef HR_METADATA
+ }
+#endif
if ( write_flag )
{
/* quantize first DCT parameter */
- dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] );
+ dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j]
+#ifdef HR_METADATA
+ ,
+ hrmasa_flag
+#endif
+ );
}
+
if ( coding_subbands < coding_subbands_0 )
{
idx_dct[k + coding_subbands] = squant( dct_coh[j][1], &dct_coh[j][1], &coherence_cb1_masa[MASA_grouping[two_dir_band[j]] * MASA_NO_CV_COH1], MASA_NO_CV_COH1 );
@@ -4701,7 +5895,11 @@ static int16_t ivas_qmetadata_quantize_coherence(
else
{
/* write dummy data now and save the position */
+#ifdef IND_LIST_DYN
+ *indice_coherence = hMetaData->nb_ind_tot;
+#else
*indice_coherence = hMetaData->next_ind;
+#endif
k = nbits;
while ( k > 0 )
{
@@ -4775,20 +5973,86 @@ static void ivas_qmetadata_reorder_2dir_bands(
hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf];
hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp;
+ if ( hQMetaData->coherence_flag )
+ {
+ uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf];
+ hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf];
+ hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp;
+ }
+ }
+ if ( hQMetaData->coherence_flag )
+ {
+ flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
+ hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0];
+ hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp;
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+
+#ifdef HR_METADATA
+/*-------------------------------------------------------------------*
+ * ivas_qmetadata_reorder_2dir_bands_hr()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
+static void ivas_qmetadata_reorder_2dir_bands_hr(
+ IVAS_QMETADATA_HANDLE hQMetaData )
+{
+ int16_t nbands, nsubframes;
+ int16_t band, sf;
+ uint16_t uint16_tmp;
+ float flt_tmp;
+ uint8_t uint8_tmp;
+
+ nbands = hQMetaData->q_direction[0].cfg.nbands;
+ nsubframes = hQMetaData->q_direction[0].cfg.nblocks;
+
+ for ( band = 0; band < nbands; band++ )
+ {
+ if ( hQMetaData->twoDirBands[band] == 1 )
+ {
+ for ( sf = 0; sf < nsubframes; sf++ )
+ {
+ if ( hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] < hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] )
+ {
+ uint16_tmp = hQMetaData->q_direction[0].band_data[band].spherical_index[sf];
+ hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[1].band_data[band].spherical_index[sf];
+ hQMetaData->q_direction[1].band_data[band].spherical_index[sf] = uint16_tmp;
+
+ flt_tmp = hQMetaData->q_direction[0].band_data[band].azimuth[sf];
+ hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[1].band_data[band].azimuth[sf];
+ hQMetaData->q_direction[1].band_data[band].azimuth[sf] = flt_tmp;
+
+ flt_tmp = hQMetaData->q_direction[0].band_data[band].elevation[sf];
+ hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[1].band_data[band].elevation[sf];
+ hQMetaData->q_direction[1].band_data[band].elevation[sf] = flt_tmp;
+
+ uint8_tmp = hQMetaData->q_direction[0].band_data[band].distance[sf];
+ hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf];
+ hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp;
+
uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf];
hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf];
hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp;
- }
- flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0];
- hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0];
- hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp;
+
+ flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[sf];
+ hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[1].band_data[band].energy_ratio[sf];
+ hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] = flt_tmp;
+ }
}
}
}
return;
}
+#endif
/*-------------------------------------------------------------------*
@@ -4807,7 +6071,9 @@ static int16_t write_2dir_info(
int16_t p[MASA_MAXIMUM_CODING_SUBBANDS];
uint16_t dif_p[MASA_MAXIMUM_CODING_SUBBANDS];
int16_t i, j;
+
j = 0;
+ p[0] = 0;
for ( i = 0; i < n; i++ )
{
if ( twoDirBands[i] == 1 )
@@ -4816,6 +6082,7 @@ static int16_t write_2dir_info(
j++;
}
}
+
dif_p[0] = p[0];
for ( i = 1; i < j; i++ )
{
@@ -4836,6 +6103,12 @@ static int16_t write_2dir_info(
}
+/*-------------------------------------------------------------------*
+ * transform_azimuth_dir2()
+ *
+ *
+ *-------------------------------------------------------------------*/
+
static void transform_azimuth_dir2(
IVAS_QMETADATA_HANDLE hQMetaData,
int16_t *dir2_bands )
@@ -4858,6 +6131,14 @@ static void transform_azimuth_dir2(
{
hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360;
}
+ if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 )
+ {
+ hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360;
+ }
+ if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] < -180 )
+ {
+ hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360;
+ }
#ifdef DEBUGGING
assert( hQMetaData->q_direction[1].band_data[i].azimuth[b] < 180 && hQMetaData->q_direction[1].band_data[i].azimuth[b] >= -180 );
#endif
diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c
index 80a9d0064f2dcfb23dbeb91ed3719dd74e0a526c..4c79b875b7b1dfbc53971c0aec0e400cbabea077 100644
--- a/lib_enc/ivas_qspherical_enc.c
+++ b/lib_enc/ivas_qspherical_enc.c
@@ -59,7 +59,12 @@ static float direction_distance_cp( float theta, float theta_hat, float theta_ha
void quantize_direction_frame(
IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */
float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES],
- float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] )
+ float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]
+#ifdef HR_METADATA
+ ,
+ const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/
+#endif
+)
{
int16_t i, j;
int16_t idx;
@@ -92,16 +97,36 @@ void quantize_direction_frame(
q_direction->not_in_2D += q_direction->band_data[i].elevation_index[j];
- if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
+#ifdef HR_METADATA
+ if ( hrmasa_flag )
{
- q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3];
- q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][q_direction->band_data[i].elevation_index[j]];
+ if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
+ {
+ q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3];
+ q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][q_direction->band_data[i].elevation_index[j]];
+ }
+ else
+ {
+ q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3] * 2 - 1;
+ q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1];
+ }
}
else
{
- q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1;
- q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1];
+#endif
+ if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
+ {
+ q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3];
+ q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][q_direction->band_data[i].elevation_index[j]];
+ }
+ else
+ {
+ q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1;
+ q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1];
+ }
+#ifdef HR_METADATA
}
+#endif
if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX )
{
@@ -138,6 +163,7 @@ void quantize_direction_frame(
return;
}
+
/*-------------------------------------------------------------------*
* quantize_direction_frame2D()
*
@@ -246,6 +272,7 @@ void small_requantize_direction_frame(
return;
}
+
/*-------------------------------------------------------------------*
* quantize_direction()
*
@@ -327,7 +354,6 @@ uint16_t quantize_direction(
return idx_sph;
}
-
no_th = no_theta_masa[no_bits - 3];
for ( i = 0; i < no_th; i++ )
@@ -473,20 +499,21 @@ uint16_t quantize_direction(
return idx_sph;
}
+
/*-------------------------------------------------------------------*
* direction_distance_cp()
*
* quantization distortion calculated on the sphere
*----------------------------------------------------------------------*/
-/* !r: distortion value */
+/*! r: distortion value */
static float direction_distance_cp(
- float theta, /* i : elevation absolute value */
- float theta_hat, /* i : quantized elevation value in absolute value */
- float theta_hat1, /* i : quantized elevation value in absolute value */
- const float phi, /* i : azimuth value */
- const float phi_hat, /* i : quantized azimuth value */
- const float phi_hat1, /* i : quantized azimuth value */
+ float theta, /* i : elevation absolute value */
+ float theta_hat, /* i : quantized elevation value in absolute value */
+ float theta_hat1, /* i : quantized elevation value in absolute value */
+ const float phi, /* i : azimuth value */
+ const float phi_hat, /* i : quantized azimuth value */
+ const float phi_hat1, /* i : quantized azimuth value */
float *d1 )
{
float d, ct, st, st1, st2;
@@ -512,28 +539,27 @@ static float direction_distance_cp(
* joint quantization of elevation and azimuth
*----------------------------------------------------------------------*/
-/* !r: quantized elevation value */
+/*! r: quantized elevation value */
static float quantize_theta_phi(
- float *theta_cb, /* i : elevation codebook */
- const int16_t no_th, /* i : elevation codebook size */
- const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword */
- const float abs_theta, /* i : absolute value of elevation to be quantized */
- int16_t *id_phi, /* o : azimuth index */
- int16_t *id_phi_remap, /* o : remapped azimuth index */
- float *phi_hat, /* o : quantized azimuth value */
- const float phi, /* i : input azimuth value; to be quantized */
- const int16_t no_bits, /* i : number of bits used for quantization */
- int16_t *id_theta, /* o : elevation index */
- float *phi_q, /* o : rotated quantized azimuth */
- const int16_t remap, /* i : flag for remapping */
- const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
+ float *theta_cb, /* i : elevation codebook */
+ const int16_t no_th, /* i : elevation codebook size */
+ const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword*/
+ const float abs_theta, /* i : absolute value of elevation to be quantized */
+ int16_t *id_phi, /* o : azimuth index */
+ int16_t *id_phi_remap, /* o : remapped azimuth index */
+ float *phi_hat, /* o : quantized azimuth value */
+ const float phi, /* i : input azimuth value; to be quantized */
+ const int16_t no_bits, /* i : number of bits used for quantization */
+ int16_t *id_theta, /* o : elevation index */
+ float *phi_q, /* o : rotated quantized azimuth */
+ const int16_t remap, /* i : flag for remapping */
+ const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */
)
{
float theta_hat, theta_hat1, phi_hat1;
int16_t id_th, id_th1, id_th2, id_ph, id_ph1;
float d, d1;
-
id_th = (int16_t) ( abs_theta / delta_theta_masa[no_bits - 3] );
if ( id_th >= no_th )
{
@@ -549,7 +575,6 @@ static float quantize_theta_phi(
{
if ( ( no_th < 6 ) && mc_format == MC_LS_SETUP_INVALID )
{
-
if ( id_th == 0 )
{
id_th1 = 1;
diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c
index ae7cd2ee1a6c29c3f1fdcb2ae51b93bf31803ce1..45651008836d2e2f33a52992d2cb3e9b77da220b 100644
--- a/lib_enc/ivas_rom_enc.c
+++ b/lib_enc/ivas_rom_enc.c
@@ -723,4 +723,119 @@ const float Stereo_dmx_wnd_coef_48k[L_FRAME48k] = {
};
+const HUFF_TABLE huff_alpha_table[2] =
+{
+ { /* Alfa Fine */
+ { /* df0 */
+ { 0x0002ce, 0x000b5e, 0x0004fe, 0x0005ae, 0x00027e, 0x0002de, 0x00016a, 0x0000b2, 0x00004a, 0x00004b,
+ 0x0000b6, 0x00004e, 0x000024, 0x00002e, 0x00000a, 0x000006, 0x000000, 0x000007, 0x000008, 0x00002f,
+ 0x000026, 0x000058, 0x0000b4, 0x00009e, 0x00016e, 0x000166, 0x0002df, 0x0002cf, 0x00027c, 0x00027d,
+ 0x0004ff, 0x000b5f, 0x0002d6 },
+ { 10, 12, 11, 11, 10, 10, 9, 8, 7, 7,
+ 8, 7, 6, 6, 4, 3, 1, 3, 4, 6,
+ 6, 7, 8, 8, 9, 9, 10, 10, 10, 10,
+ 11, 12, 10 }
+ },
+ { /* df */
+ { 0x0011de, 0x011ffe, 0x013dea, 0x013df6, 0x008eea, 0x013df7, 0x013dee, 0x013deb, 0x013dec, 0x008eee,
+ 0x008ffe, 0x009efe, 0x0047fe, 0x004f7c, 0x0023fe, 0x0011fe, 0x0013fe, 0x0008f6, 0x0009ee, 0x000476,
+ 0x00047a, 0x0004f6, 0x00023a, 0x00027a, 0x00027e, 0x00013e, 0x00009a, 0x00004c, 0x00004e, 0x000012,
+ 0x00000a, 0x000006, 0x000000, 0x000007, 0x00000b, 0x000010, 0x000022, 0x000046, 0x00009b, 0x00013c,
+ 0x00011c, 0x00023e, 0x00023c, 0x0004fe, 0x00047e, 0x0009fe, 0x0008fe, 0x0008f7, 0x0013ff, 0x0011df,
+ 0x0027bc, 0x004f7e, 0x004776, 0x009efa, 0x009ef4, 0x013dfe, 0x008eeb, 0x008ee8, 0x013dff, 0x008ee9,
+ 0x008eef, 0x011fff, 0x013ded, 0x013def, 0x0011dc },
+ { 13, 17, 17, 17, 16, 17, 17, 17, 17, 16,
+ 16, 16, 15, 15, 14, 13, 13, 12, 12, 11,
+ 11, 11, 10, 10, 10, 9, 8, 7, 7, 5,
+ 4, 3, 1, 3, 4, 5, 6, 7, 8, 9,
+ 9, 10, 10, 11, 11, 12, 12, 12, 13, 13,
+ 14, 15, 15, 16, 16, 17, 16, 16, 17, 16,
+ 16, 17, 17, 17, 13 }
+ },
+ { /* dt */
+ { 0x00eeee, 0x03b3ee, 0x03b3f6, 0x03b3fc, 0x01d9bc, 0x01d9bd, 0x01d9b2, 0x03b3fe, 0x01d9be, 0x01d9f6,
+ 0x01d9fc, 0x00ecda, 0x00ecfa, 0x00eeef, 0x00766e, 0x007776, 0x003b3a, 0x003bba, 0x001d9a, 0x001ddc,
+ 0x001dde, 0x000eec, 0x000764, 0x000772, 0x0003b0, 0x0003b8, 0x0001da, 0x0001de, 0x000072, 0x000038,
+ 0x00001e, 0x000006, 0x000000, 0x000002, 0x00001f, 0x00003a, 0x000073, 0x0001df, 0x0001db, 0x0003ba,
+ 0x0003b1, 0x000773, 0x000765, 0x000eed, 0x000ecc, 0x001d9e, 0x001d9c, 0x003bbe, 0x003b3b, 0x00777e,
+ 0x00767c, 0x00eefe, 0x00ecfc, 0x00ecd8, 0x01d9fd, 0x01d9fa, 0x01d9bf, 0x01d9b6, 0x01d9b3, 0x03b3fd,
+ 0x01d9b7, 0x03b3ff, 0x03b3ef, 0x03b3f7, 0x00eeff },
+ { 16, 18, 18, 18, 17, 17, 17, 18, 17, 17,
+ 17, 16, 16, 16, 15, 15, 14, 14, 13, 13,
+ 13, 12, 11, 11, 10, 10, 9, 9, 7, 6,
+ 5, 3, 1, 2, 5, 6, 7, 9, 9, 10,
+ 10, 11, 11, 12, 12, 13, 13, 14, 14, 15,
+ 15, 16, 16, 16, 17, 17, 17, 17, 17, 18,
+ 17, 18, 18, 18, 16 }
+ }
+ }, /* End Alfa Fine */
+ { /* Alfa Coarse */
+ { /* df0 */
+ { 0x0003be, 0x0003fe, 0x0001fe, 0x0000fe, 0x00003e, 0x00003a, 0x00001e, 0x000002, 0x000000, 0x000006,
+ 0x00001c, 0x00007e, 0x000076, 0x0000ee, 0x0001de, 0x0003ff, 0x0003bf },
+ { 10, 10, 9, 8, 6, 6, 5, 2, 1, 3,
+ 5, 7, 7, 8, 9, 10, 10 }
+ },
+ { /* df */
+ { 0x007c76, 0x03e3fe, 0x01f1f6, 0x01f1f7, 0x00f8ea, 0x007c74, 0x007c7c, 0x001f1c, 0x000f9e, 0x0007ce,
+ 0x0003e2, 0x0001f0, 0x0000fa, 0x00007e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007f,
+ 0x0000fb, 0x0001f2, 0x0003e6, 0x0007c6, 0x000f9f, 0x001f1e, 0x007c7e, 0x00f8fe, 0x00f8fa, 0x01f1fe,
+ 0x00f8eb, 0x03e3ff, 0x007c77 },
+ { 15, 18, 17, 17, 16, 15, 15, 13, 12, 11,
+ 10, 9, 8, 7, 4, 3, 1, 2, 5, 7,
+ 8, 9, 10, 11, 12, 13, 15, 16, 16, 17,
+ 16, 18, 15 }
+ },
+ { /* dt */
+ { 0x003efc, 0x00fbfa, 0x007ddc, 0x00fbfe, 0x007dde, 0x007dfc, 0x003ef6, 0x001f76, 0x000fba, 0x000fbe,
+ 0x0003ec, 0x0001f2, 0x0000f8, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00007f,
+ 0x0000fa, 0x0001f3, 0x0003ed, 0x0007dc, 0x000fbc, 0x001f7a, 0x003ef7, 0x007dfe, 0x007ddf, 0x00fbff,
+ 0x007ddd, 0x00fbfb, 0x003efd },
+ { 14, 16, 15, 16, 15, 15, 14, 13, 12, 12,
+ 10, 9, 8, 7, 5, 3, 1, 2, 4, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 15, 16,
+ 15, 16, 14 }
+ }
+ } /* End Alfa Coarse */
+};
+
+const HUFF_TABLE huff_beta_table[2] =
+{
+ { /* Beta Fine */
+ { /* df0 */
+ { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00001e, 0x00003e, 0x00007e, 0x0000fe, 0x0000ff },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 8 }
+ },
+ { /* df */
+ { 0x001f1e, 0x000f8e, 0x0003e2, 0x0001f2, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002,
+ 0x00000e, 0x00007f, 0x0000fb, 0x0001f3, 0x0001f0, 0x0007c6, 0x001f1f },
+ { 13, 12, 10, 9, 8, 7, 5, 3, 1, 2,
+ 4, 7, 8, 9, 9, 11, 13 }
+ },
+ { /* dt */
+ { 0x007dfe, 0x003efe, 0x000fbe, 0x0003ee, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002,
+ 0x00000e, 0x00007f, 0x00007c, 0x0001f6, 0x0007de, 0x001f7e, 0x007dff },
+ { 15, 14, 12, 10, 8, 7, 5, 3, 1, 2,
+ 4, 7, 7, 9, 11, 13, 15 }
+ }
+ }, /* End Beta Fine */
+ { /* Beta Coarse */
+ { /* df0 */
+ { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00000f },
+ { 1, 2, 3, 4, 4 }
+ },
+ { /* df */
+ { 0x0000fe, 0x00003e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007e, 0x0000ff },
+ { 8, 6, 4, 3, 1, 2, 5, 7, 8 }
+ },
+ { /* dt */
+ { 0x0000fe, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00003e, 0x0000ff },
+ { 8, 7, 5, 3, 1, 2, 4, 6, 8 }
+ }
+ } /* End Beta Coarse */
+};
+
+const int16_t mc_paramupmix_fb_remix_order[4] = {0, 1, 2, 3};
+
+
/* clang-format on */
diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h
index d240fb69187fded50b89d4c3ae5056002b238f30..c208259ed6052b15f17bc946754c8fa311b5e395 100644
--- a/lib_enc/ivas_rom_enc.h
+++ b/lib_enc/ivas_rom_enc.h
@@ -126,5 +126,8 @@ extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4];
extern const float Stereo_dmx_wnd_coef_32k[L_FRAME32k];
extern const float Stereo_dmx_wnd_coef_48k[L_FRAME48k];
+extern const HUFF_TABLE huff_alpha_table[2];
+extern const HUFF_TABLE huff_beta_table[2];
+extern const int16_t mc_paramupmix_fb_remix_order[4];
#endif
diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c
index d3aab0a6e88b631f34c515061a8d9050da7d3345..e01de987412d4667582674ab0054f49260bacca8 100644
--- a/lib_enc/ivas_sba_enc.c
+++ b/lib_enc/ivas_sba_enc.c
@@ -119,28 +119,31 @@ ivas_error ivas_sba_enc_reconfigure(
{
DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC;
SPAR_ENC_HANDLE hSpar;
- SBA_MODE sba_mode_old;
int16_t analysis_order_old;
int16_t spar_reconfig_flag;
+#ifdef FIX_DTX_428
+ int16_t nbands_old;
+ int16_t ndir_old;
+#endif
spar_reconfig_flag = 0;
nchan_transport_old = st_ivas->nchan_transport;
nCPE_old = st_ivas->nCPE;
nSCE_old = st_ivas->nSCE;
- sba_mode_old = st_ivas->sba_mode;
-
st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order );
- st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate );
-
analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order );
+#ifdef FIX_DTX_428
+ nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands;
+ ndir_old = st_ivas->hQMetaData->no_directions;
+#endif
if ( analysis_order_old != st_ivas->sba_analysis_order )
{
int16_t i, n_old;
float **old_mem_hp20_in;
- n_old = ivas_sba_get_nchan_metadata( analysis_order_old );
- n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order );
+ n_old = ( analysis_order_old + 1 ) * ( analysis_order_old + 1 );
+ n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 );
if ( n > n_old )
{
@@ -199,35 +202,19 @@ ivas_error ivas_sba_enc_reconfigure(
old_mem_hp20_in = NULL;
}
}
-
- if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+ ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ),
+ &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 );
+#ifndef SBA_MODE_CLEAN_UP
+ for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ )
{
- if ( st_ivas->hSpar == NULL )
- {
- if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
-
- ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ),
- &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 );
-
- for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ )
+ if ( hDirAC->sba_synchro_buffer[n] != NULL )
{
- if ( hDirAC->sba_synchro_buffer[n] != NULL )
- {
- free( hDirAC->sba_synchro_buffer[n] );
- hDirAC->sba_synchro_buffer[n] = NULL;
- }
+ free( hDirAC->sba_synchro_buffer[n] );
+ hDirAC->sba_synchro_buffer[n] = NULL;
}
- hDirAC->num_samples_synchro_delay = 0;
}
- else
- {
- ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag );
- }
-
+ hDirAC->num_samples_synchro_delay = 0;
+#endif
hSpar = st_ivas->hSpar;
if ( st_ivas->nchan_transport == 1 )
@@ -238,78 +225,53 @@ ivas_error ivas_sba_enc_reconfigure(
{
hEncoderConfig->element_mode_init = IVAS_CPE_MDCT;
}
-
- if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) )
+ if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) )
{
/* FB mixer handle */
- if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+ if ( hDirAC->hFbMixer != NULL )
{
- if ( hDirAC->hFbMixer != NULL )
- {
- ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 );
- hDirAC->hFbMixer = NULL;
- }
-
- if ( sba_mode_old == SBA_MODE_SPAR )
- {
- spar_reconfig_flag = 1;
- ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag );
-
- if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
+ ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 );
+ hDirAC->hFbMixer = NULL;
}
- else
- {
- if ( hDirAC->hFbMixer == NULL )
- {
- IVAS_FB_CFG *fb_cfg;
-
- if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK )
- {
- return error;
- }
-
- /* Allocate and initialize FB mixer handle */
- if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
-
- if ( hDirAC->num_samples_synchro_delay == 0 )
- {
- hDirAC->num_samples_synchro_delay = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS );
+ spar_reconfig_flag = 1;
+ ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag );
- for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ )
- {
- if ( ( hDirAC->sba_synchro_buffer[n] = (float *) malloc( hDirAC->num_samples_synchro_delay * sizeof( float ) ) ) == NULL )
- {
- return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hDirAC synchro buffer\n" ) );
- }
- set_zero( hDirAC->sba_synchro_buffer[n], hDirAC->num_samples_synchro_delay );
- }
- for ( ; n < DIRAC_MAX_ANA_CHANS; n++ )
- {
- hDirAC->sba_synchro_buffer[n] = NULL;
- }
- }
+ if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK )
+ {
+ return error;
}
}
-
+#ifndef SBA_MODE_CLEAN_UP
+ hEncoderConfig->spar_reconfig_flag = spar_reconfig_flag;
+#else
+ st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag;
+#endif
if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK )
{
return error;
}
-
- if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#ifdef FIX_DTX_428
+ if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old )
{
- mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS );
- hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band;
+ int16_t dir, j, i;
+ IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction;
+ for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ )
+ {
+ for ( j = 0; j < q_direction[dir].cfg.nbands; j++ )
+ {
+ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ q_direction[dir].band_data[j].energy_ratio_index[i] = 0;
+ q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0;
+ }
+ }
+ }
}
-
+#endif
+#ifndef SBA_MODE_CLEAN_UP
+ mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS );
+#endif
+ hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band;
/*-----------------------------------------------------------------*
* Allocate, initialize, and configure SCE/CPE/MCT handles
*-----------------------------------------------------------------*/
@@ -322,3 +284,30 @@ ivas_error ivas_sba_enc_reconfigure(
return error;
}
+
+#ifdef ARITH_HUFF_CODER_CHANGES
+int16_t ivas_sba_get_max_md_bits(
+ Encoder_Struct *st_ivas )
+{
+ int16_t max_md_bits;
+ int16_t max_bits;
+ if ( ivas_get_hodirac_flag( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) )
+ {
+ max_bits = 2000;
+ }
+ else
+ {
+ max_bits = 500;
+ }
+ max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT )
+#endif
+ {
+ max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar;
+ }
+ return max_md_bits;
+}
+#endif
diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c
index c8577a85bae41f124907bdd60809cca4d529b7d6..87c0e8e9d333481f8d0afcf8998bd64c9b836149 100644
--- a/lib_enc/ivas_sce_enc.c
+++ b/lib_enc/ivas_sce_enc.c
@@ -205,8 +205,12 @@ ivas_error ivas_sce_enc(
* Reset metadata
*----------------------------------------------------------------*/
+#ifndef SBA_MODE_CLEAN_UP
reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode );
+#else
+ reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata );
+#endif
/*----------------------------------------------------------------*
* Write IVAS format signaling in SID frames
*----------------------------------------------------------------*/
@@ -312,6 +316,14 @@ ivas_error create_sce_enc(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) );
}
+
+#ifdef IND_LIST_DYN
+ /* set pointer to the buffer of metadata indices */
+ hSCE->hMetaData->ind_list = st_ivas->ind_list_metadata;
+ hSCE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata;
+ hSCE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata;
+ reset_indices_enc( hSCE->hMetaData, st_ivas->ivas_max_num_indices_metadata );
+#endif
}
else
{
@@ -332,7 +344,11 @@ ivas_error create_sce_enc(
st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
st->mct_chan_mode = MCT_CHAN_MODE_REGULAR;
- if ( ( error = init_encoder( st, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
+ if ( ( error = init_encoder( st,
+#ifdef IND_LIST_DYN
+ st_ivas,
+#endif
+ 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
{
return error;
}
diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c
index 9eeb4d87605cc97362ea2ffbb5bcc34f96512fd1..5197a260b9ab0ad830176956a6c33a550cb8e522 100644
--- a/lib_enc/ivas_sns_enc.c
+++ b/lib_enc/ivas_sns_enc.c
@@ -38,6 +38,8 @@
#include "prot.h"
#include "ivas_prot.h"
#include "rom_com.h"
+#include "ivas_rom_com.h"
+#include "ivas_cnst.h"
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -53,84 +55,95 @@
/* r : codebook index */
static int16_t sns_1st_cod(
const float *sns, /* i : vector to quantize */
- float *snsq /* i/o: i:prediction o:quantized sns */
+ const int16_t L_frame,
+ const int16_t core,
+ float *snsq /* o : quantized sns */
)
{
- int16_t i, j, index;
- int16_t j0, j1, index0, index1;
- float dist_min, dist, temp;
- const float *p_dico;
-
- j0 = 0;
- j1 = M / 2;
- dist_min = 1.0e30f;
- p_dico = sns_vq_cdk1;
- index0 = 0;
-
- for ( i = 0; i < 32; i++ )
+ int16_t index;
+ const int16_t split_len = M / 2;
+ const int16_t *means;
+ const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC );
+
+ /* remove means */
+ means = NULL;
+ switch ( L_frame )
{
- dist = 0.0;
-
- for ( j = j0; j < j1; j++ )
- {
- temp = sns[j] - *p_dico++;
- dist += temp * temp;
- }
-
- if ( dist < dist_min )
- {
- dist_min = dist;
- index0 = i;
- }
+ case L_FRAME16k:
+ means = &sns_1st_means_16k[core - 1][0];
+ break;
+ case L_FRAME25_6k:
+ means = &sns_1st_means_25k6[core - 1][0];
+ break;
+ case L_FRAME32k:
+ means = &sns_1st_means_32k[core - 1][0];
+ break;
+ default:
+ assert( !"illegal frame length in sns_1st_cod" );
}
- /* quantized vector */
- p_dico = &sns_vq_cdk1[index0 * ( M / 2 )];
-
- for ( j = j0; j < j1; j++ )
+ for ( int16_t i = 0; i < M; ++i )
{
- snsq[j] = *p_dico++; /* += cause it's differential */
+ snsq[i] = sns[i] - means[i] * means_fix2float;
}
- j0 = M / 2;
- j1 = M;
- dist_min = 1.0e30f;
- p_dico = sns_vq_cdk2;
- index1 = 0;
-
- for ( i = 0; i < 32; i++ )
+ index = 0;
+ for ( int16_t split = 0; split < 2; ++split )
{
- dist = 0.0;
-
- for ( j = j0; j < j1; j++ )
+ const int16_t *cdbk_ptr;
+ int16_t j0, j1, index_split;
+ float dist_min;
+ const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC );
+ const int16_t *const cdbk = &sns_1st_cdbk[split][core - 1][0];
+
+ j0 = split * split_len;
+ j1 = j0 + split_len;
+
+ cdbk_ptr = cdbk;
+ dist_min = 1.0e30f;
+ index_split = 0;
+ for ( int16_t i = 0; i < 32; ++i )
{
- temp = sns[j] - *p_dico++;
- dist += temp * temp;
+ float dist;
+
+ dist = 0.f;
+ for ( int16_t j = j0; j < j1; ++j )
+ {
+ float tmp;
+
+ tmp = snsq[j] - ( *cdbk_ptr++ ) * cdbk_fix2float;
+ dist += tmp * tmp;
+ }
+
+ if ( dist < dist_min )
+ {
+ dist_min = dist;
+ index_split = i;
+ }
}
- if ( dist < dist_min )
+ /* set quantized vector */
+ cdbk_ptr = &cdbk[index_split * split_len];
+ for ( int16_t j = j0; j < j1; ++j )
{
- dist_min = dist;
- index1 = i;
+ snsq[j] = ( *cdbk_ptr++ ) * cdbk_fix2float + means[j] * means_fix2float;
}
- }
- /* quantized vector */
- p_dico = &sns_vq_cdk2[index1 * ( M / 2 )];
+ /* for second split shift by five bits to store both indices as one 10 bit value */
+ if ( split == 1 )
+ {
+ index_split <<= 5;
+ }
- for ( j = j0; j < j1; j++ )
- {
- snsq[j] = *p_dico++; /* += cause it's differential */
+ index += index_split;
}
- index = index0 + ( index1 << 5 );
-
return index;
}
/*-------------------------------------------------------------------
- * sns_1st_cod()
+ * sns_2st_cod()
*
*
*-------------------------------------------------------------------*/
@@ -193,12 +206,13 @@ static int16_t sns_2st_cod(
*-------------------------------------------------------------------*/
void sns_avq_cod(
- const float *sns, /* i : Input sns vectors */
- const float *snsmid, /* i : Input mid-sns vectors */
- float *sns_q, /* o : Quantized LFS vectors */
- float *snsmid_q, /* o : Quantized mid-LFS vectors */
- int16_t *index, /* o : Quantization indices */
- const int16_t core, /* i : core */
+ const float *sns, /* i : Input sns vectors */
+ const float *snsmid, /* i : Input mid-sns vectors */
+ float *sns_q, /* o : Quantized LFS vectors */
+ float *snsmid_q, /* o : Quantized mid-LFS vectors */
+ int16_t *index, /* o : Quantization indices */
+ const int16_t core, /* i : core */
+ const int16_t L_frame,
const int16_t low_brate_mode /* i : flag low bit operating mode */
)
{
@@ -206,7 +220,7 @@ void sns_avq_cod(
float snsmid_q0[M];
int16_t indxt[256], nbits, nbt, nit;
- index[0] = sns_1st_cod( sns, sns_q );
+ index[0] = sns_1st_cod( sns, L_frame, core, sns_q );
nit = 1 + 2;
if ( !low_brate_mode )
{
@@ -227,7 +241,7 @@ void sns_avq_cod(
{
index++;
- index[0] = sns_1st_cod( snsmid, snsmid_q );
+ index[0] = sns_1st_cod( snsmid, L_frame, core, snsmid_q );
nit = 1 + 2;
if ( !low_brate_mode )
{
@@ -282,12 +296,13 @@ void sns_avq_cod(
*-------------------------------------------------------------------*/
void sns_avq_cod_stereo(
- const float *snsl, /* i : Input sns vector (left channel) */
- const float *snsr, /* i : Input sns vector (right channel) */
- float *snsl_q, /* o : Quantized sns vector (left channel) */
- float *snsr_q, /* o : Quantized sns vector (right channel) */
- int16_t *indexl, /* o : Quantization indices (left channel) */
- int16_t *indexr /* o : Quantization indices (right channel) */
+ const float *snsl, /* i : Input sns vector (left channel) */
+ const float *snsr, /* i : Input sns vector (right channel) */
+ const int16_t L_frame,
+ float *snsl_q, /* o : Quantized sns vector (left channel) */
+ float *snsr_q, /* o : Quantized sns vector (right channel) */
+ int16_t *indexl, /* o : Quantization indices (left channel) */
+ int16_t *indexr /* o : Quantization indices (right channel) */
)
{
int16_t i, flag_zero;
@@ -327,7 +342,7 @@ void sns_avq_cod_stereo(
}
/* Quantize mid */
- indexl[0] = sns_1st_cod( mid, mid_q );
+ indexl[0] = sns_1st_cod( mid, L_frame, TCX_20_CORE, mid_q );
sns_2st_cod( mid, mid_q, &indexl[1] );
/* Quantize side */
@@ -367,13 +382,143 @@ void sns_avq_cod_stereo(
*indexr++ = 1;
/* Quantize left */
- indexl[0] = sns_1st_cod( snsl, snsl_q );
+ indexl[0] = sns_1st_cod( snsl, L_frame, TCX_20_CORE, snsl_q );
sns_2st_cod( snsl, snsl_q, &indexl[1] );
/* Quantize right */
- indexr[0] = sns_1st_cod( snsr, snsr_q );
+ indexr[0] = sns_1st_cod( snsr, L_frame, TCX_20_CORE, snsr_q );
sns_2st_cod( snsr, snsr_q, &indexr[1] );
}
return;
}
+
+int16_t quantize_sns(
+ float sns_in[CPE_CHANNELS][NB_DIV][M],
+ float snsQ_out[CPE_CHANNELS][NB_DIV][M],
+ Encoder_State **sts,
+ int16_t *indices,
+ int16_t *zero_side_flag,
+ int16_t *sns_stereo_mode )
+{
+ int16_t nSubframes, k, ch, i;
+ int16_t nbits, idxIndices;
+ Encoder_State *st;
+ float weights[M];
+
+ nbits = 0;
+ idxIndices = 0;
+ set_f( weights, 1.0f, M );
+
+ /* stereo mode decision */
+ sns_stereo_mode[0] = SNS_STEREO_MODE_LR;
+ sns_stereo_mode[1] = SNS_STEREO_MODE_LR;
+ zero_side_flag[0] = 0;
+ zero_side_flag[1] = 0;
+
+ /* use snsQ_out as buffer, move input vectors */
+ for ( ch = 0; ch < CPE_CHANNELS; ++ch )
+ {
+ nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ mvr2r( sns_in[ch][k], snsQ_out[ch][k], M );
+ }
+ }
+
+ if ( sts[0]->core == sts[1]->core )
+ {
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
+
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ float side[M];
+ float ener_side;
+
+ v_sub( snsQ_out[0][k], snsQ_out[1][k], side, M );
+ ener_side = dotp( side, side, M );
+
+ sns_stereo_mode[k] = ener_side < 12.f;
+ zero_side_flag[k] = ener_side < 1.f;
+
+ if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
+ {
+ convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f );
+ }
+ }
+ }
+
+ /* prepare buffers depending on the chosen stereo mode */
+
+
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ mvr2r( sns_in[0][k], snsQ_out[0][k], M );
+ mvr2r( sns_in[1][k], snsQ_out[1][k], M );
+ if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
+ {
+ convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f );
+ }
+ }
+
+ for ( ch = 0; ch < CPE_CHANNELS; ++ch )
+ {
+ st = sts[ch];
+ nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV;
+
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS;
+ const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10;
+ const int16_t *levels = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_levels : ivas_sns_cdbks_tcx10_levels;
+ const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits;
+ int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 );
+ float *snsQ = snsQ_out[ch][k];
+ const float *sns_ptr = snsQ_out[ch][k];
+
+ if ( is_side )
+ {
+ const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10;
+ const int16_t *side_levels = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_levels : ivas_sns_cdbks_side_tcx10_levels;
+
+ if ( zero_side_flag[k] )
+ {
+ set_zero( snsQ, M );
+ continue;
+ }
+
+ nStages = SNS_MSVQ_NSTAGES_SIDE;
+ bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits;
+ msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] );
+ msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL );
+ }
+ else
+ {
+ msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] );
+ msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL );
+ }
+ idxIndices += nStages;
+
+ for ( i = 0; i < nStages; ++i )
+ {
+ nbits += bits[i];
+ }
+ }
+ }
+
+ if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS )
+ {
+ nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV;
+ for ( k = 0; k < nSubframes; ++k )
+ {
+ if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS )
+ {
+ convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f );
+ }
+ }
+ }
+
+
+ return nbits;
+}
diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c
index c659979d2b7be0b589bd697fe91870134f9bd355..5956ef03dd28b76e89be3f2830d6c0354f5807bb 100644
--- a/lib_enc/ivas_spar_encoder.c
+++ b/lib_enc/ivas_spar_encoder.c
@@ -66,6 +66,7 @@ ivas_error ivas_spar_enc_open(
ENCODER_CONFIG_HANDLE hEncoderConfig;
IVAS_FB_CFG *fb_cfg;
int16_t nchan_inp, nchan_transport, sba_order_internal;
+ int16_t nchan_fb_in;
int16_t table_idx, active_w_mixing;
int32_t input_Fs, ivas_total_brate;
ivas_error error;
@@ -83,12 +84,34 @@ ivas_error ivas_spar_enc_open(
}
}
+#ifdef SBA_MODE_CLEAN_UP
+ hSpar->spar_reconfig_flag = 0;
+#endif
input_Fs = hEncoderConfig->input_Fs;
sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
- nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal );
+ nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal,
+ hEncoderConfig->ivas_total_brate );
assert( nchan_inp <= hEncoderConfig->nchan_inp );
ivas_total_brate = hEncoderConfig->ivas_total_brate;
+ nchan_fb_in = 0;
+ if ( st_ivas->sba_analysis_order == 1 )
+ {
+ nchan_fb_in = FOA_CHANNELS;
+ }
+ else if ( st_ivas->sba_analysis_order == 2 )
+ {
+ nchan_fb_in = 9;
+ }
+ else if ( st_ivas->sba_analysis_order == 3 )
+ {
+ nchan_fb_in = 11;
+ }
+ else
+ {
+ assert( 0 && "sba_order must be 1,2, or 3!" );
+ }
+
nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal );
// bw = ivas_get_bw_idx_from_sample_rate(pCfg->input_Fs);
@@ -103,7 +126,13 @@ ivas_error ivas_spar_enc_open(
/* set FB config. */
active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w;
- ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs );
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs,
+ nchan_fb_in );
+#else
+ ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, nchan_inp, nchan_transport, active_w_mixing, input_Fs,
+ nchan_fb_in );
+#endif
fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order];
/* FB mixer handle */
@@ -113,7 +142,11 @@ ivas_error ivas_spar_enc_open(
}
/* Covariance handle */
- if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp ) ) != IVAS_ERR_OK )
+#ifdef FIX_489_COV_SMOOTHING
+ if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -202,7 +235,11 @@ ivas_error ivas_spar_enc_open(
hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */
hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE;
- if ( ( error = init_encoder( hSpar->hCoreCoderVAD, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
+ if ( ( error = init_encoder( hSpar->hCoreCoderVAD,
+#ifdef IND_LIST_DYN
+ st_ivas,
+#endif
+ 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -316,10 +353,9 @@ ivas_error ivas_spar_enc(
error = IVAS_ERR_OK;
hEncoderConfig = st_ivas->hEncoderConfig;
- // VE2DB: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ?
-
/* check last sba_mode */
- if ( ivas_sba_mode_select( st_ivas->hEncoderConfig->last_ivas_total_brate ) == SBA_MODE_DIRAC )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ivas_sba_mode_select() == SBA_MODE_DIRAC )
{
Encoder_State *sts[MCT_MAX_BLOCKS];
@@ -339,13 +375,13 @@ ivas_error ivas_spar_enc(
}
/* update FB prior input */
- // VE: last 1ms of 'ppFilterbank_prior_input' is not correct
for ( int16_t i = 0; i < st_ivas->nchan_transport; i++ )
{
mvr2r( ( sts[i]->input_buff + NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ) ),
( st_ivas->hSpar->hFbMixer->ppFilterbank_prior_input[i] + st_ivas->hSpar->hFbMixer->fb_cfg->prior_input_length - input_frame ), input_frame );
}
}
+#endif
/* front VAD */
if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK )
@@ -389,10 +425,11 @@ static ivas_error ivas_spar_enc_process(
float data_f[][L_FRAME48k] /* i/o: input/transport audio channels */
)
{
- float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2];
- float *p_pcm_tmp[IVAS_SPAR_MAX_CH];
+ float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2];
+ float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS];
int16_t i, j, b, i_ts, input_frame, dtx_vad;
int16_t transient_det[2];
+ int16_t hodirac_flag;
int32_t ivas_total_brate, input_Fs;
float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
@@ -403,14 +440,32 @@ static ivas_error ivas_spar_enc_process(
const int16_t *order;
SPAR_ENC_HANDLE hSpar = st_ivas->hSpar;
IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData;
+#ifndef SBA_MODE_CLEAN_UP
int16_t ts, l_ts, orig_dirac_bands, num_del_samples;
+#else
+ int16_t ts, l_ts, num_del_samples;
+#endif
+
float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH];
- float w_del_buf[IVAS_FB_1MS_48K_SAMP];
+ float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP];
+#ifndef SBA_MODE_CLEAN_UP
float dir[3], avg_dir[3];
float energySum, vecLen;
+#endif
+ int16_t nchan_fb_in;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*Commented for now*/
+ /*int16_t start_nb_bits;
+ int16_t total_md_bits, total_sba_bits;*/
+#endif
push_wmops( "ivas_spar_enc_process" );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*Commented for now*/
+ // start_nb_bits = hMetaData->nb_bits_tot;
+#endif
+
/*-----------------------------------------------------------------------------------------*
* Initialization
*-----------------------------------------------------------------------------------------*/
@@ -423,10 +478,17 @@ static ivas_error ivas_spar_enc_process(
input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER );
- nchan_inp = ivas_sba_get_nchan_metadata( sba_order );
+ nchan_inp = ivas_sba_get_nchan_metadata( sba_order,
+ hEncoderConfig->ivas_total_brate );
assert( nchan_inp <= hEncoderConfig->nchan_inp );
- for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ )
+ int16_t active_w_vlbr;
+ active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
+
+ nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in;
+ nchan_transport = st_ivas->nchan_transport;
+
+ for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ )
{
mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame );
}
@@ -436,29 +498,37 @@ static ivas_error ivas_spar_enc_process(
*-----------------------------------------------------------------------------------------*/
ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det );
- if ( sba_order == 1 )
+ if ( ivas_total_brate < IVAS_24k4 )
{
- transient_det[1] = transient_det[0];
+ transient_det[1] = 0;
}
-
/* store previous input samples for W in local buffer */
assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP );
- mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[0][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], w_del_buf, num_del_samples );
+ if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 )
+ {
+ /* fill delay (1 ms) buffer for all Transport channels */
+ for ( i = 0; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ )
+ {
+ int idx = hSpar->hFbMixer->fb_cfg->remix_order[i];
+ mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[idx][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], wyzx_del_buf[idx], num_del_samples );
+ }
+ }
/*-----------------------------------------------------------------------------------------*
* FB mixer ingest
*-----------------------------------------------------------------------------------------*/
- for ( i = 0; i < nchan_inp; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
p_pcm_tmp[i] = pcm_tmp[i];
}
/* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/
- ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame );
+ ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame,
+ hSpar->hMdEnc->HOA_md_ind );
/* prepare Parameter MDFT analysis */
- for ( i = 0; i < nchan_inp; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
ppIn_FR_real[i] = p_pcm_tmp[i];
ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame;
@@ -469,10 +539,13 @@ static ivas_error ivas_spar_enc_process(
for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ )
{
- ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts );
- ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts );
+ ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts,
+ nchan_fb_in );
+
+ ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts,
+ nchan_fb_in );
- for ( i = 0; i < nchan_inp; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
p_pcm_tmp[i] += l_ts;
ppIn_FR_real[i] += l_ts;
@@ -481,7 +554,7 @@ static ivas_error ivas_spar_enc_process(
}
/* turn pointers back to the local buffer, needed for the following processing */
- for ( i = 0; i < nchan_inp; i++ )
+ for ( i = 0; i < nchan_fb_in; i++ )
{
ppIn_FR_real[i] = pcm_tmp[i];
ppIn_FR_imag[i] = pcm_tmp[i] + input_frame;
@@ -494,7 +567,10 @@ static ivas_error ivas_spar_enc_process(
* DirAC encoding
*-----------------------------------------------------------------------------------------*/
- ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode );
+ hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order );
+
+#ifndef SBA_MODE_CLEAN_UP
+ ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS );
if ( hQMetaData->q_direction->cfg.nbands > 0 )
{
@@ -504,14 +580,15 @@ static ivas_error ivas_spar_enc_process(
{
/* WB 4TC mode bit : disable for now*/
push_next_indice( hMetaData, 0, 1 );
- ivas_qmetadata_enc_encode( hMetaData, hQMetaData );
+
+ ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag );
}
else
{
hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS;
/* compute directions */
- for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ )
{
set_zero( dir, 3 );
set_zero( avg_dir, 3 );
@@ -577,6 +654,9 @@ static ivas_error ivas_spar_enc_process(
hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
}
}
+#else
+ ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag );
+#endif
/*-----------------------------------------------------------------------------------------*
* Set SPAR bitrates
*-----------------------------------------------------------------------------------------*/
@@ -586,7 +666,11 @@ static ivas_error ivas_spar_enc_process(
if ( hSpar->hMdEnc->table_idx != table_idx )
{
hSpar->hMdEnc->table_idx = table_idx;
- if ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hEncoderConfig->spar_reconfig_flag ) )
+#else
+ if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag ) )
+#endif
{
if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK )
{
@@ -595,7 +679,15 @@ static ivas_error ivas_spar_enc_process(
}
else
{
- ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND );
+ ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx,
+ ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag,
+ 1, hEncoderConfig->Opt_PCA_ON,
+ hSpar->AGC_Enable
+#endif
+ );
}
}
/*-----------------------------------------------------------------------------------------*
@@ -611,7 +703,19 @@ static ivas_error ivas_spar_enc_process(
}
}
- ivas_enc_cov_handler_process( hSpar->hCovEnc, ppIn_FR_real, ppIn_FR_imag, cov_real, cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det );
+ ivas_enc_cov_handler_process(
+ hSpar->hCovEnc,
+ ppIn_FR_real,
+ ppIn_FR_imag,
+ cov_real,
+ cov_dtx_real,
+ hSpar->hFbMixer->pFb,
+ 0,
+ hSpar->hFbMixer->pFb->filterbank_num_bands,
+ nchan_inp,
+ dtx_vad,
+ transient_det,
+ hSpar->hMdEnc->HOA_md_ind );
nchan_transport = st_ivas->nchan_transport;
/*-----------------------------------------------------------------------------------------*
@@ -620,9 +724,10 @@ static ivas_error ivas_spar_enc_process(
if ( hSpar->hMdEnc->spar_hoa_md_flag == 0 )
{
- ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order );
+ ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order,
+ hSpar->hFbMixer->prior_mixer );
}
-
+ if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag )
{
float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -639,8 +744,8 @@ static ivas_error ivas_spar_enc_process(
dirac_band_idx = hSpar->dirac_to_spar_md_bands[b] - d_start_band;
for ( i_ts = 0; i_ts < hQMetaData->q_direction->cfg.nblocks; i_ts++ )
{
- azi_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[i_ts];
- ele_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].elevation[i_ts];
+ azi_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts];
+ ele_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].elevation[i_ts];
}
diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0];
}
@@ -662,14 +767,80 @@ static ivas_error ivas_spar_enc_process(
Wscale_d[b] = min( 2.0f, max( Wscale_d[b], 1.0f ) );
}
- ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d );
+ ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d,
+ hQMetaData->useLowerRes, active_w_vlbr );
}
if ( hSpar->hMdEnc->spar_hoa_md_flag )
{
- ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order );
+ ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order,
+ hSpar->hFbMixer->prior_mixer );
}
-
+#ifdef DEBUG_LBR_SBA
+ /* Dumping SPAR Coefficients */
+ char f_name[100];
+ int16_t nbands = 6;
+ int16_t num_subframes = 1;
+ int16_t num_elements = 6;
+ int16_t num_block_group = 1;
+ int16_t byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+#endif
+#ifdef DEBUG_LBR_SBA
+ /* Dumping SPAR Coefficients */
+ nbands = 6;
+ num_subframes = 1;
+ num_elements = 6;
+ num_block_group = 1;
+ byte_size = sizeof( float );
+
+ sprintf( f_name, "SBA_MD_values_quant.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[2], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[0], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[1], byte_size, 1, 1, f_name );
+ dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[2], byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+#endif
/*-----------------------------------------------------------------------------------------*
* FB mixer
*-----------------------------------------------------------------------------------------*/
@@ -718,14 +889,44 @@ static ivas_error ivas_spar_enc_process(
#ifdef DEBUG_SBA_AUDIO_DUMP
ivas_spar_dump_signal_wav( input_frame, p_pcm_tmp, NULL, nchan_transport, spar_foa_enc_wav[1], "ivas_fb_mixer_process()" );
#endif
-
- /* move delayed W into output buffer unless activeW operation*/
if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 )
{
- mvr2r( w_del_buf, p_pcm_tmp[0], num_del_samples );
+ /* delayed W */
+ mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples );
mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples );
- }
+ for ( i = 1; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ )
+ {
+ int idx = hSpar->hFbMixer->fb_cfg->remix_order[i];
+
+ /* delayed, reorderd and accumulated with (negative) prediction from W */
+ v_add( wyzx_del_buf[idx], p_pcm_tmp[i], p_pcm_tmp[i], num_del_samples );
+ v_add( data_f[idx], p_pcm_tmp[i] + num_del_samples, p_pcm_tmp[i] + num_del_samples, input_frame - num_del_samples );
+ }
+ }
+#if 0 /* SBA_TD_RESIDUAL */
+ {
+ static FILE *fid = 0;
+ static int samplesWritten = 0;
+ int s;
+ if (!fid)
+ {
+ fid = fopen("enc_pcm.txt", "wt");
+ }
+ if (samplesWritten < 8 * 48000)
+ {
+ for (s = 0; s < input_frame; s++)
+ {
+ for (i = 0; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++)
+ {
+ fprintf(fid, "%.8f ", p_pcm_tmp[i][s]);
+ }
+ fprintf(fid, "\n");
+ }
+ samplesWritten += input_frame;
+ }
+ }
+#endif
/*-----------------------------------------------------------------------------------------*
* PCA encoder
*-----------------------------------------------------------------------------------------*/
@@ -742,7 +943,16 @@ static ivas_error ivas_spar_enc_process(
push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 );
}
}
-
+#ifdef DEBUG_LBR_SBA
+ for ( int t = 0; t < 960; t++ )
+ {
+ for ( int c = 0; c < hSpar->hFbMixer->fb_cfg->num_out_chans; c++ )
+ {
+ float val = p_pcm_tmp[c][t]; // / MAX16B_FLT;
+ dbgwrite( &val, sizeof( float ), 1, 1, "int_enc_dmx.raw" );
+ }
+ }
+#endif
#ifdef DEBUG_SBA_AUDIO_DUMP
ivas_spar_dump_signal_wav( input_frame, p_pcm_tmp, NULL, nchan_transport, spar_foa_enc_wav[0], "ivas_pca_enc()" );
#endif
@@ -838,5 +1048,12 @@ static ivas_error ivas_spar_enc_process(
pop_wmops();
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*Commented for now*/
+ /*total_md_bits = hMetaData->nb_bits_tot - start_nb_bits;
+ total_sba_bits = ivas_sba_get_max_md_bits( st_ivas );
+ assert( total_md_bits <= total_sba_bits );*/
+#endif
+
return error;
}
diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c
index 645f690ac0f8561aaccc1ea1fc050f03616d7aa7..50ef2f03487406478d0b825ac15bd3f2b7f7fae4 100644
--- a/lib_enc/ivas_spar_md_enc.c
+++ b/lib_enc/ivas_spar_md_enc.c
@@ -42,7 +42,6 @@
#include
#include "wmc_auto.h"
-
/*------------------------------------------------------------------------------------------*
* PreProcessor
*------------------------------------------------------------------------------------------*/
@@ -72,15 +71,22 @@ static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type );
-static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP );
-
-static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP );
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw );
+#else
+static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw );
+#endif
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate );
+#else
+static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate );
+#endif
static ivas_error ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp );
static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad );
-static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t bands_bw, const int16_t strat, const int16_t dtx_vad, const int16_t qsi );
+static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi );
static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi, const int16_t planarCP );
static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant );
@@ -111,7 +117,6 @@ ivas_error ivas_spar_md_enc_open(
ivas_spar_md_enc_state_t *hMdEnc;
ivas_error error;
int16_t num_channels, i, j;
-
error = IVAS_ERR_OK;
if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL )
@@ -119,7 +124,8 @@ ivas_error ivas_spar_md_enc_open(
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" );
}
- num_channels = ivas_sba_get_nchan_metadata( sba_order );
+ num_channels = ivas_sba_get_nchan_metadata( sba_order,
+ hEncoderConfig->ivas_total_brate );
if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL )
{
@@ -314,12 +320,26 @@ ivas_error ivas_spar_md_enc_init(
float PR_minmax[2];
int16_t num_channels, i, j, k;
- hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate );
- num_channels = ivas_sba_get_nchan_metadata( sba_order );
-
+ ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag );
+ num_channels = ivas_sba_get_nchan_metadata( sba_order,
+ hEncoderConfig->ivas_total_brate );
+ ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind );
table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
- ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND );
+ ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx,
+ ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND
+#ifdef ARITH_HUFF_CODER_CHANGES
+ ,
+ hMdEnc->spar_hoa_dirac2spar_md_flag,
+ 1, hEncoderConfig->Opt_PCA_ON,
+#ifndef DEBUG_AGC_ENCODER_CMD_OPTION
+ ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport )
+#else
+ ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport )
+#endif
+
+#endif
+ );
/* get FB coefficients */
for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ )
@@ -510,17 +530,29 @@ static void write_metadata_buffer(
BSTR_ENC_HANDLE hMetaData_tmp,
BSTR_ENC_HANDLE hMetaData,
const int16_t bit_pos_start,
- const int16_t next_ind_start,
- const int16_t last_ind_start )
+ const int16_t next_ind_start
+#ifndef IND_LIST_DYN
+ ,
+ const int16_t last_ind_start
+#endif
+)
{
int16_t i;
if ( hMetaData->nb_bits_tot > 0 )
{
- restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start );
+ restore_metadata_buffer( hMetaData, next_ind_start,
+#ifndef IND_LIST_DYN
+ last_ind_start,
+#endif
+ bit_pos_start );
}
+#ifdef IND_LIST_DYN
+ for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ )
+#else
for ( i = 0; i < hMetaData_tmp->next_ind; i++ )
+#endif
{
push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits );
}
@@ -544,31 +576,52 @@ ivas_error ivas_spar_md_enc_process(
const int16_t dtx_vad,
const int16_t nchan_inp,
const int16_t sba_order /* i : Ambisonic (SBA) order */
+ ,
+ float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */
)
{
float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
+ int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats;
+ int16_t planarCP;
float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
- int16_t i, b, qsi, ndm, ndec, num_ch, num_quant_strats;
- int16_t j, planarCP;
int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw;
int16_t active_w, nchan_transport, dmx_switch, strat;
int16_t nB, bands_bw, packed_ok = 0;
ivas_strats_t cs[MAX_CODING_STRATS];
int16_t code_strat;
- int16_t bit_pos_start, next_ind_start, last_ind_start;
+ int16_t bit_pos_start, next_ind_start;
+#ifndef IND_LIST_DYN
+ int16_t last_ind_start;
+#endif
BSTR_ENC_DATA hMetaData_tmp;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ Indice *ind_list_tmp;
+ int16_t md_indices_allocated;
+#else
Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized
+#endif
+#ifdef IND_LIST_DYN
+ int16_t max_num_indices_tmp;
+#endif
float Wscale[IVAS_MAX_NUM_BANDS];
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/
+ md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS;
+ ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated );
+#endif
+
num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats;
- num_ch = ivas_sba_get_nchan_metadata( sba_order );
+ num_ch = ivas_sba_get_nchan_metadata( sba_order,
+ hEncoderConfig->ivas_total_brate );
active_w = hMdEnc->spar_md_cfg.active_w;
nchan_transport = hMdEnc->spar_md_cfg.nchan_transport;
bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs );
bwidth = min( bwidth, hEncoderConfig->max_bwidth );
-
+ int16_t active_w_vlbr;
+ active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0;
num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW );
if ( hMdEnc->spar_hoa_md_flag == 0 )
{
@@ -606,11 +659,21 @@ ivas_error ivas_spar_md_enc_process(
}
hMetaData_tmp.ind_list = ind_list_tmp;
+ hMetaData_tmp.nb_bits_tot = 0;
+#ifdef IND_LIST_DYN
+ max_num_indices_tmp = MAX_BITS_METADATA;
+ hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp;
+ hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list );
+#endif
/* Save state of metadata bitstream buffer */
bit_pos_start = hMetaData->nb_bits_tot;
+#ifdef IND_LIST_DYN
+ next_ind_start = hMetaData->nb_ind_tot;
+#else
next_ind_start = hMetaData->next_ind;
last_ind_start = hMetaData->last_ind;
+#endif
dmx_switch = 0;
@@ -621,17 +684,23 @@ ivas_error ivas_spar_md_enc_process(
ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
}
+ else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 )
+ {
+ bands_bw = 2;
+ nB = num_bands / bands_bw;
+
+ ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw );
+ }
else
{
nB = num_bands;
bands_bw = 1;
}
-
- if ( hMdEnc->spar_hoa_md_flag )
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
{
- for ( i = 0; i < FOA_CHANNELS - 1; i++ )
+ for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
{
pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
}
@@ -639,7 +708,9 @@ ivas_error ivas_spar_md_enc_process(
}
ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch,
- bands_bw, active_w, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0 );
+ bands_bw, active_w,
+ active_w_vlbr,
+ &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0 );
for ( i = 0; i < num_ch; i++ )
{
@@ -651,7 +722,9 @@ ivas_error ivas_spar_md_enc_process(
}
}
}
-
+#ifdef DEBUG_LBR_SBA
+ float dirac_md_kbps = (float) ( hMetaData->nb_bits_tot ) * 50 / 1000;
+#endif
planarCP = 0;
code_strat = 0;
#ifdef DEBUG_SBA_MD_DUMP
@@ -736,11 +809,46 @@ ivas_error ivas_spar_md_enc_process(
fprintf(stderr, "\n\n"); */
#endif
}
-
ivas_quant_p_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
}
-
ivas_quant_pred_coeffs_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch );
+ if ( active_w_vlbr )
+ {
+ for ( i = 0; i < 3; i++ )
+ {
+ int16_t i2;
+ i2 = 0;
+ switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */
+ {
+ case 0:
+ i2 = 0;
+ break;
+ case 1:
+ i2 = 2;
+ break;
+ case 2:
+ i2 = 1;
+ break;
+ }
+ if ( ( hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) && ( hMdEnc->spar_md.band_coeffs[b].pred_re[i] != 0.0f ) && ( cov_real[i + 1][i + 1][b] != 0.0f ) )
+ {
+ /* bump up the Pred coeff */
+ float PR_uq, PR_step;
+ ivas_quant_strat_t qs;
+ qs = hMdEnc->spar_md_cfg.quant_strat[qsi];
+ PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re[i];
+ PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 );
+
+ int16_t PR_sign;
+ PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 );
+
+ hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign;
+
+ /* deindex the modified coefficient */
+ hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step;
+ }
+ }
+ }
}
else
{
@@ -753,7 +861,6 @@ ivas_error ivas_spar_md_enc_process(
{
hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0;
}
-
ivas_spar_quant_pred_coeffs_dtx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, num_ch - 1, hMdEnc->spar_md.band_coeffs[b].pred_quant_re );
}
}
@@ -766,11 +873,11 @@ ivas_error ivas_spar_md_enc_process(
}
}
- if ( hMdEnc->spar_hoa_md_flag )
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ )
{
- for ( i = 0; i < FOA_CHANNELS - 1; i++ )
+ for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ )
{
/* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */
pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b];
@@ -871,19 +978,35 @@ ivas_error ivas_spar_md_enc_process(
strat = cs[i];
if ( strat != NO_STRAT )
{
+#ifdef ARITH_HUFF_CODER_CHANGES
+ reset_indices_enc( &hMetaData_tmp, md_indices_allocated );
+#else
reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA );
-
+#endif
ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP );
-
- if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) )
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*write to main buffer if its a valid bitstream*/
+ if ( hMetaData_tmp.nb_bits_tot > 0 )
{
- write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start );
- code_strat = strat;
- }
- if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk )
- {
- packed_ok = 1;
- break;
+#endif
+ if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) )
+ {
+ write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start
+#ifndef IND_LIST_DYN
+ ,
+ last_ind_start
+#endif
+ );
+ code_strat = strat;
+ }
+ if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk )
+ {
+
+ {
+ packed_ok = 1;
+ break;
+ }
+ }
}
}
}
@@ -893,16 +1016,89 @@ ivas_error ivas_spar_md_enc_process(
break;
}
- if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk )
+#ifdef ARITH_HUFF_CODER_CHANGES
+ /*only if valid bitstream was written to main buffer*/
+ if ( hMetaData->nb_bits_tot > bit_pos_start )
+#endif
{
- break;
+ if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+#ifdef ARITH_HUFF_CODER_CHANGES
+ packed_ok = 1;
+#endif
+ break;
+ }
}
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( dtx_vad == 1 )
+ {
+ assert( packed_ok == 1 );
+ }
+#endif
if ( hEncoderConfig->ivas_total_brate >= IVAS_256k )
{
assert( qsi == 0 );
}
+ /* Reuse mixer matrix values for unsent bands */
+ if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) )
+ {
+ for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw )
+ {
+ if ( ( b == 0 ) && ( code_strat % 2 == 0 ) )
+ {
+ b += 2;
+ }
+ for ( i = 0; i < 1; i++ )
+ {
+ for ( j = 0; j < 4; j++ )
+ {
+ hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b];
+ hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1];
+ }
+ }
+ }
+ }
+#ifdef DEBUG_LBR_SBA
+ char f_name[100];
+ int16_t nbands = 1;
+ int16_t num_subframes = 1;
+ int16_t num_elements = 6;
+ int16_t num_block_group = 1;
+ int16_t byte_size = sizeof( float );
+
+ float sba_md_kbps = (float) hMetaData->nb_bits_tot * 50 / 1000;
+ float spar_md_kbps = sba_md_kbps - dirac_md_kbps;
+ float corebr_kbps = (float) hEncoderConfig->ivas_total_brate / 1000 - sba_md_kbps;
+
+ sprintf( f_name, "SBA_MD_bitrate.bin" );
+ ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false;
+ ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false;
+
+ for ( b = 0; b < nbands; b++ )
+ {
+ for ( int16_t sf = 0; sf < num_subframes; sf++ )
+ {
+ for ( int16_t bl = 0; bl < num_block_group; bl++ )
+ {
+ float fqsi = (float) qsi;
+ float fcode = (float) code_strat;
+
+ dbgwrite( &dirac_md_kbps, byte_size, 1, 1, f_name );
+ dbgwrite( &spar_md_kbps, byte_size, 1, 1, f_name );
+ dbgwrite( &sba_md_kbps, byte_size, 1, 1, f_name );
+ dbgwrite( &fqsi, byte_size, 1, 1, f_name );
+ dbgwrite( &fcode, byte_size, 1, 1, f_name );
+ dbgwrite( &corebr_kbps, byte_size, 1, 1, f_name );
+ // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat );
+ }
+ }
+ }
+#endif
#ifdef SPAR_HOA_DBG
/*if ( strat >= 4 )
{
@@ -1078,11 +1274,15 @@ ivas_error ivas_spar_md_enc_process(
fclose( fp );
#endif
- ivas_store_prior_coeffs( hMdEnc, num_bands, bands_bw, code_strat, dtx_vad, qsi );
+ ivas_store_prior_coeffs( hMdEnc, num_bands, code_strat, dtx_vad, qsi );
hMdEnc->spar_md.dtx_vad = dtx_vad;
hMdEnc->spar_md.num_bands = num_bands;
+#ifdef ARITH_HUFF_CODER_CHANGES
+ free( ind_list_tmp );
+#endif
+
return IVAS_ERR_OK;
}
@@ -1152,6 +1352,9 @@ static void ivas_write_spar_md_bitstream(
{
int16_t no_ec, i;
int16_t do_diff[IVAS_MAX_NUM_BANDS];
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t entropy_coding_result;
+#endif
if ( strat == NO_STRAT )
{
@@ -1170,55 +1373,82 @@ static void ivas_write_spar_md_bitstream(
no_ec = 0;
- switch ( strat )
+ if ( ivas_total_brate < IVAS_24k4 )
{
- case BASE:
- push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = 0;
- }
- break;
- case BASE_NOEC:
- push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = 0;
- }
- no_ec = 1;
- break;
- case FOUR_A:
- push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 );
- }
- ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
- break;
- case FOUR_B:
- push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 );
- }
- ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
- break;
- case FOUR_C:
- push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 );
- }
- ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
- break;
- case FOUR_D:
- push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS );
- for ( i = 0; i < nB; i++ )
- {
- do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 );
- }
- ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
- break;
+ switch ( strat )
+ {
+ case BASE:
+ push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
+ break;
+ case BASE_NOEC:
+ push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
+ no_ec = 1;
+ break;
+ case FOUR_A:
+ case FOUR_C:
+ case FOUR_B:
+ case FOUR_D:
+ push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS );
+ break;
+ }
+ /* for LBR SBA 40MS MD never do time diff */
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = 0;
+ }
+ }
+ else
+ {
+ switch ( strat )
+ {
+ case BASE:
+ push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = 0;
+ }
+ break;
+ case BASE_NOEC:
+ push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = 0;
+ }
+ no_ec = 1;
+ break;
+ case FOUR_A:
+ push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 );
+ }
+ ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
+ break;
+ case FOUR_B:
+ push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 );
+ }
+ ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
+ break;
+ case FOUR_C:
+ push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 );
+ }
+ ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
+ break;
+ case FOUR_D:
+ push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS );
+ for ( i = 0; i < nB; i++ )
+ {
+ do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 );
+ }
+ ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB );
+ break;
+ }
}
#ifdef SPAR_HOA_DBG
@@ -1229,13 +1459,29 @@ static void ivas_write_spar_md_bitstream(
#endif
if ( no_ec == 1 )
{
- ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ entropy_coding_result =
+#endif
+ ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP,
+ bands_bw );
}
else
{
- ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ entropy_coding_result =
+#endif
+ ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP,
+ strat,
+ ivas_total_brate );
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( entropy_coding_result < 0 )
+ {
+ hMetaData->nb_bits_tot = 0;
+ }
+#endif
+
return;
}
@@ -1245,13 +1491,17 @@ static void ivas_write_spar_md_bitstream(
*
* Generate huffman coded bitstream
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_get_huffman_coded_bs(
+#else
static void ivas_get_huffman_coded_bs(
+#endif
ivas_spar_md_enc_state_t *hMdEnc,
BSTR_ENC_HANDLE hMetaData,
const int16_t nB,
const int16_t qsi,
- const int16_t planarCP )
+ const int16_t planarCP,
+ const int16_t bands_bw )
{
int16_t i, j;
int16_t pred_coeff_dim, pred_offset;
@@ -1259,16 +1509,17 @@ static void ivas_get_huffman_coded_bs(
for ( i = 0; i < nB; i++ )
{
int16_t code, len;
- int16_t ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i];
- int16_t ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i];
+ int16_t ndm, ndec;
+ ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw];
+ ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw];
pred_coeff_dim = ndm + ndec - 1;
pred_offset = 0;
- if ( hMdEnc->spar_hoa_md_flag )
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
{
- pred_offset = FOA_CHANNELS - 1;
+ pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS;
}
}
@@ -1277,6 +1528,12 @@ static void ivas_get_huffman_coded_bs(
for ( j = pred_offset; j < pred_coeff_dim; j++ )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
@@ -1285,6 +1542,12 @@ static void ivas_get_huffman_coded_bs(
if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
}
@@ -1294,6 +1557,12 @@ static void ivas_get_huffman_coded_bs(
if ( keep_planar[j] )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
}
@@ -1303,24 +1572,46 @@ static void ivas_get_huffman_coded_bs(
for ( j = pred_offset; j < pred_coeff_dim; j++ )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
for ( j = 0; j < ndec * ( ndm - 1 ); j++ )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
for ( j = 0; j < ndec; j++ )
{
ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len );
+#ifdef ARITH_HUFF_CODER_CHANGES
+ if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk )
+ {
+ return -1;
+ }
+#endif
push_next_indice( hMetaData, code, len );
}
}
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -1329,44 +1620,68 @@ static void ivas_get_huffman_coded_bs(
*
* Generate arithmetic coded bitstream
*-----------------------------------------------------------------------------------------*/
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+static int16_t ivas_get_arith_coded_bs(
+#else
static void ivas_get_arith_coded_bs(
+#endif
ivas_spar_md_enc_state_t *hMdEnc,
BSTR_ENC_HANDLE hMetaData,
const int16_t *pDo_diff,
const int16_t bands_bw,
const int16_t nB,
const int16_t qsi,
- const int16_t planarCP )
+ const int16_t planarCP,
+ const int16_t strat,
+ const int32_t ivas_total_brate )
{
- int16_t i, j, any_diff;
+ int16_t i, any_diff;
+ int16_t j;
ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS];
ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS];
ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS];
ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS];
int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN];
int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN];
+#ifdef ARITH_HUFF_CODER_CHANGES
+ int16_t arith_result;
+#endif
for ( i = 0; i < nB; i++ )
{
int16_t ndm, ndec;
ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i];
ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i];
- pred_cell_dims[i].dim1 = ndm + ndec - 1;
- if ( hMdEnc->spar_hoa_md_flag )
+
+ if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) )
{
- if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
+ pred_cell_dims[i].dim1 = 0;
+ pred_cell_dims[i].dim2 = 0;
+ drct_cell_dims[i].dim1 = 0;
+ drct_cell_dims[i].dim2 = 0;
+ decd_cell_dims[i].dim1 = 0;
+ decd_cell_dims[i].dim2 = 0;
+ decx_cell_dims[i].dim1 = 0;
+ decx_cell_dims[i].dim2 = 0;
+ }
+ else
+ {
+ pred_cell_dims[i].dim1 = ndm + ndec - 1;
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
- pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
+ if ( i >= SPAR_DIRAC_SPLIT_START_BAND )
+ {
+ pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 );
+ }
}
+ pred_cell_dims[i].dim2 = 1;
+ drct_cell_dims[i].dim1 = ndec;
+ drct_cell_dims[i].dim2 = ndm - 1;
+ decd_cell_dims[i].dim1 = ndec;
+ decd_cell_dims[i].dim2 = 1;
+ decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
+ decx_cell_dims[i].dim2 = 1;
}
- pred_cell_dims[i].dim2 = 1;
- drct_cell_dims[i].dim1 = ndec;
- drct_cell_dims[i].dim2 = ndm - 1;
- decd_cell_dims[i].dim1 = ndec;
- decd_cell_dims[i].dim2 = 1;
- decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1;
- decx_cell_dims[i].dim2 = 1;
}
any_diff = 0;
@@ -1378,7 +1693,7 @@ static void ivas_get_arith_coded_bs(
break;
}
}
- if ( hMdEnc->spar_hoa_md_flag )
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
for ( i = 0; i < nB; i++ )
{
@@ -1387,12 +1702,12 @@ static void ivas_get_arith_coded_bs(
for ( j = 0; j < pred_cell_dims[i].dim1; j++ )
{
hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] =
- hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )];
+ hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
if ( any_diff == 1 )
{
hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] =
- hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )];
+ hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS];
}
}
}
@@ -1405,10 +1720,20 @@ static void ivas_get_arith_coded_bs(
ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF, planarCP );
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB,
+ symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff,
+ hMdEnc->spar_md_cfg.max_bits_per_blk );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB,
symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff );
+#endif
- if ( hMdEnc->spar_hoa_md_flag )
+ if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag )
{
for ( i = 0; i < nB; i++ )
{
@@ -1416,10 +1741,10 @@ static void ivas_get_arith_coded_bs(
{
for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- )
{
- hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] =
+ hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] =
hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j];
}
- for ( j = 0; j < FOA_CHANNELS - 1; j++ )
+ for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ )
{
hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0;
}
@@ -1448,8 +1773,19 @@ static void ivas_get_arith_coded_bs(
}
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB,
+ symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff,
+ hMdEnc->spar_md_cfg.max_bits_per_blk );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB,
symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff );
+#endif
+
ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP );
@@ -1465,9 +1801,19 @@ static void ivas_get_arith_coded_bs(
decd_cell_dims[i].dim1 = decd_cell_dims[i].dim1 - IVAS_SPAR_HOA3_NP_CHS;
}
}
-
+#ifdef ARITH_HUFF_CODER_CHANGES
+ arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB,
+ symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff,
+ hMdEnc->spar_md_cfg.max_bits_per_blk );
+ if ( arith_result < 0 )
+ {
+ return -1;
+ }
+#else
ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB,
symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff );
+#endif
+
ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP );
@@ -1476,7 +1822,11 @@ static void ivas_get_arith_coded_bs(
ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF, planarCP );
}
+#ifdef ARITH_HUFF_CODER_CHANGES
+ return 0;
+#else
return;
+#endif
}
@@ -1540,15 +1890,11 @@ static void ivas_select_next_strat(
static void ivas_store_prior_coeffs(
ivas_spar_md_enc_state_t *hMdEnc,
const int16_t num_bands,
- const int16_t bands_bw,
const int16_t strat,
const int16_t dtx_vad,
const int16_t qsi )
{
int16_t i, j, b;
-
- float one_by_bands_bw = ( 1.0f / bands_bw );
-
if ( dtx_vad == 0 )
{
hMdEnc->spar_md_cfg.prior_strat = START;
@@ -1562,7 +1908,7 @@ static void ivas_store_prior_coeffs(
for ( i = 0; i < num_bands; i++ )
{
- b = (int16_t) floor( i * one_by_bands_bw );
+ b = i;
for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ )
{
diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h
index 1256955e87bb74866c910fdd4ec1d73ec08df9e4..a4bd36207db192df2b52e3c769ecfa5880631342 100644
--- a/lib_enc/ivas_stat_enc.h
+++ b/lib_enc/ivas_stat_enc.h
@@ -81,6 +81,10 @@ typedef struct stereo_itd_data_struct
int16_t prev_itd1;
int16_t prev_itd2;
+#ifdef HYBRID_ITD_MAX
+ /*flag for hybrid ITD for very large ITDs*/
+ int16_t hybrid_itd_max;
+#endif
} ITD_DATA, *ITD_DATA_HANDLE;
typedef struct dft_ana_struct
@@ -219,22 +223,6 @@ typedef struct stereo_dft_enc_data_struct
float voicing_lt;
-#ifdef ITD_WINNER_GAIN_MODIFY
- float noise_coherence;
- int16_t local_vad;
- int16_t mus_flag;
- float spd_L_noise[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of spectral power density of noise in the left channel*/
- float spd_R_noise[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of spectral power density of noise in the right channel*/
- float spd_L_noise_min[STEREO_DFT_N_32k_ENC / 2];
- float spd_R_noise_min[STEREO_DFT_N_32k_ENC / 2];
- float spd_L_noise_max[STEREO_DFT_N_32k_ENC / 2];
- float spd_R_noise_max[STEREO_DFT_N_32k_ENC / 2];
- float winner_gain_L[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of the Winner gain of the left channel*/
- float winner_gain_R[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of the Winner gain of the right channel*/
- float spd_L_smooth_new[STEREO_DFT_N_32k_ENC / 2];
- float spd_R_smooth_new[STEREO_DFT_N_32k_ENC / 2];
-
-#endif
int16_t currentNumUpdates;
int16_t expectedNumUpdates; /* Expected number of frames before use of ITD estimate */
@@ -331,6 +319,12 @@ typedef struct stereo_mdct_enc_data_structure
typedef struct stereo_td_enc_data_structure
{
+#ifdef IND_LIST_DYN
+ BSTR_ENC_DATA tdm_hBstr_tmp; /* temporary bitstream structure holding TD stereo spatial parameters */
+ Indice tdm_ind_list_tmp[MAX_IND_TDM_TMP]; /* temporary list of indices holding TD stereo spatial parameters */
+ int16_t max_ind_tdm_tmp; /* maximum number of indices in the temporary list of indices holding TD stereo spatial parameters */
+#endif
+
int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */
int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */
float tdm_Pri_pitch_buf[NB_SUBFR];
@@ -559,7 +553,7 @@ typedef struct
int16_t dtx_flag;
int16_t sce_id_dtx;
- int16_t dtx_speech_buffer_enc[PARAM_ISM_HYS_BUF_SIZE];
+ int16_t cnt_SID_ISM;
float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE];
float coh[MAX_NUM_OBJECTS];
@@ -597,8 +591,10 @@ typedef struct ivas_dirac_enc_data_structure
PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */
IVAS_FB_MIXER_HANDLE hFbMixer;
+#ifndef SBA_MODE_CLEAN_UP
float *sba_synchro_buffer[DIRAC_MAX_ANA_CHANS];
int16_t num_samples_synchro_delay;
+#endif
/* DirAC parameter estimation */
float **direction_vector[DIRAC_NUM_DIMS];
@@ -606,8 +602,21 @@ typedef struct ivas_dirac_enc_data_structure
float diffuseness_m[DIRAC_MAX_NBANDS];
int16_t band_grouping[DIRAC_MAX_NBANDS + 1];
int16_t block_grouping[5];
+#ifdef FIX_485_STATIC_BUFFERS
+ int16_t firstrun_sector_params;
+ float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+
+ float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
+ float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
+ float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
+#endif
+
+#ifndef SBA_MODE_CLEAN_UP
int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS];
+#endif
/* diffuseness */
int16_t index_buffer_intensity;
@@ -615,6 +624,7 @@ typedef struct ivas_dirac_enc_data_structure
float **buffer_intensity_real[DIRAC_NUM_DIMS];
float *buffer_energy;
+
} DIRAC_ENC_DATA, *DIRAC_ENC_HANDLE;
/*----------------------------------------------------------------------------------*
@@ -672,6 +682,8 @@ typedef struct ivas_spar_md_enc_state_t
ivas_huff_coeffs_t huff_coeffs;
int16_t table_idx;
int16_t spar_hoa_md_flag;
+ int16_t spar_hoa_dirac2spar_md_flag;
+ int16_t HOA_md_ind[IVAS_SPAR_MAX_CH];
} ivas_spar_md_enc_state_t;
/* PCA structure */
@@ -703,6 +715,9 @@ typedef struct ivas_spar_enc_lib_t
FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */
ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */
+#ifdef SBA_MODE_CLEAN_UP
+ int16_t spar_reconfig_flag;
+#endif
int16_t front_vad_flag;
int16_t front_vad_dtx_flag;
int16_t force_front_vad;
@@ -731,19 +746,51 @@ typedef struct ivas_param_mc_enc_data_structure
} PARAM_MC_ENC_DATA, *PARAM_MC_ENC_HANDLE;
+/*----------------------------------------------------------------------------------*
+ * MC ParamUpmix Mode encoder structures
+ *----------------------------------------------------------------------------------*/
+typedef struct ivas_mc_paramupmix_enc_data_structure
+{
+ ivas_trans_det_state_t *hTranDet[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH];
+ IVAS_FB_MIXER_HANDLE hFbMixer;
+ ivas_enc_cov_handler_state_t *hCovEnc[MC_PARAMUPMIX_COMBINATIONS];
+ float ***cov_real[MC_PARAMUPMIX_COMBINATIONS];
+ float ***cov_dtx_real[MC_PARAMUPMIX_COMBINATIONS];
+ float *midside[MC_PARAMUPMIX_COMBINATIONS][MC_PARAMUPMIX_NCH]; /* hold PCM of mid-side data */
+ int32_t alpha_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ int32_t beta_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS];
+ bool first_frame;
+} MC_PARAMUPMIX_ENC_DATA, *MC_PARAMUPMIX_ENC_HANDLE;
/*----------------------------------------------------------------------------------*
* MASA encoder structures
*----------------------------------------------------------------------------------*/
+typedef struct ivas_masa_dir_align_struct
+{
+ float previous_azi_dir1[MASA_FREQUENCY_BANDS];
+ float previous_ele_dir1[MASA_FREQUENCY_BANDS];
+
+ float previous_azi_dir2[MASA_FREQUENCY_BANDS];
+ float previous_ele_dir2[MASA_FREQUENCY_BANDS];
+
+} MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE;
+
+/* structure storing MASA framing sync detection and compensation data */
+typedef struct ivas_masa_sync_struct
+{
+ MASA_METADATA_FRAME previous_metadata;
+ uint8_t prev_sim_stop;
+ uint8_t prev_offset;
+ MASA_FRAME_MODE frame_mode;
+
+} MASA_SYNC_STATE, *MASA_SYNC_HANDLE;
+
typedef struct ivas_masa_encoder_data_struct
{
float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];
int16_t num_Cldfb_instances;
HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_ENC_CLDFB_INSTANCES];
-#ifndef FIX_350_MASA_DELAY_COMP
- float *delay_buffer[MASA_MAX_TRANSPORT_CHANNELS];
-#endif
int16_t band_mapping[MASA_FREQUENCY_BANDS + 1];
uint8_t twoDirBands[MASA_FREQUENCY_BANDS];
float importanceWeight[MASA_FREQUENCY_BANDS];
@@ -755,6 +802,10 @@ typedef struct ivas_masa_encoder_data_struct
float onset_detector_1;
float onset_detector_2;
+ MASA_SYNC_STATE sync_state;
+
+ MASA_DIR_ALIGN_STATE dir_align_state;
+
} MASA_ENCODER_DATA;
typedef struct ivas_masa_encoder_struct
@@ -797,8 +848,8 @@ typedef struct ivas_mcmasa_enc_data_structure
float **buffer_intensity_real_vert;
float *buffer_energy;
- float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS];
- float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS];
+ float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS];
+ float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS];
float ls_azimuth[MCMASA_MAX_ANA_CHANS];
int16_t leftNearest[MCMASA_MAX_ANA_CHANS];
int16_t rightNearest[MCMASA_MAX_ANA_CHANS];
@@ -923,11 +974,8 @@ typedef struct mct_enc_data_structure
float lastxCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS];
int16_t lowE_ch[MCT_MAX_CHANNELS];
- int16_t LFE_off;
uint16_t mc_global_ild[MCT_MAX_CHANNELS];
int16_t nBitsMCT; /* number of bits spent on mct side info */
- int16_t num_lfe;
-
/* pointers to local buffers */
float *p_mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS];
float *p_orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS];
@@ -961,9 +1009,50 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure
} STEREO_DMX_EVS_POC_DATA, *STEREO_DMX_EVS_POC_HANDLE;
+#ifdef ENHANCED_STEREO_DMX
+typedef struct stereo_dmx_evs_correlation_filter_structure
+{
+ int16_t init_frmCntr;
+ float isd_rate_s;
+ float iccr_s;
+ float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX];
+ float Pr[STEREO_DMX_EVS_NB_SUBBAND_MAX];
+ float Pi[STEREO_DMX_EVS_NB_SUBBAND_MAX];
+ float rfft_ipd_coef[L_FRAME48k / 2 + 1];
+
+ int16_t pha_len;
+ int16_t fad_len;
+
+ float win[STEREO_DMX_EVS_PHA_LEN_MAX];
+ float fad_g[STEREO_DMX_EVS_FAD_LEN_MAX];
+ float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX];
+ float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX];
+
+ float data_mem[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX];
+
+ STEREO_DMX_EVS_PHA curr_pha;
+ STEREO_DMX_EVS_PHA prev_pha;
+ int16_t pha_hys_cnt;
+
+ int16_t prc_thres;
+ STEREO_DMX_EVS_PRC curr_prc;
+ STEREO_DMX_EVS_PRC prev_prc;
+ int16_t prc_hys_cnt;
+ float fad_g_prc[L_FRAME48k];
+ int16_t fad_len_prc;
+
+ float trns_aux_energy[CPE_CHANNELS];
+ float crst_fctr;
+
+} STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE;
+
+#endif
typedef struct stereo_dmx_evs_enc_data_structure
{
STEREO_DMX_EVS_POC_HANDLE hPOC;
+#ifdef ENHANCED_STEREO_DMX
+ STEREO_DMX_EVS_PHA_HANDLE hPHA;
+#endif
float itd;
@@ -1007,15 +1096,17 @@ typedef struct encoder_config_structure
int16_t nchan_inp; /* number of input audio channels */
int16_t max_bwidth; /* maximum encoded bandwidth */
IVAS_FORMAT ivas_format; /* IVAS format */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ bool is_binaural; /* flag indicating if input is binaural audio */
+#endif
int16_t element_mode_init; /* element mode used at initialization */
int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */
+ int16_t nchan_ism; /* number of ISM channels */
int16_t sba_order; /* Ambisonic (SBA) order */
int16_t sba_planar; /* Ambisonic (SBA) planar flag */
MC_LS_SETUP mc_input_setup; /* multichannel input ls setup */
-#ifdef TD5
int16_t ism_extended_metadata_flag; /* flag indicating extended metadata encoding, including radius and orientation (yaw, pitch) in ISM format */
-#endif
int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */
@@ -1032,7 +1123,9 @@ typedef struct encoder_config_structure
/* temp. development parameters */
int16_t Opt_PCA_ON; /* flag indicating PCA operation in SBA */
-
+#ifndef SBA_MODE_CLEAN_UP
+ int16_t spar_reconfig_flag;
+ #endif
#ifdef DEBUGGING
/* debugging options */
int16_t stereo_mode_cmdl; /* stereo mode forced from the command-line */
@@ -1057,6 +1150,13 @@ typedef struct
{
ENCODER_CONFIG_HANDLE hEncoderConfig; /* Encoder configuration structure */
+#ifdef IND_LIST_DYN
+ Indice *ind_list; /* List of indices */
+ int16_t ivas_max_num_indices; /* Maximum allowed number of indices in the list */
+ Indice *ind_list_metadata; /* List of indices for metadata */
+ int16_t ivas_max_num_indices_metadata; /* Maximum allowed number of indices in the list of metadata */
+#endif
+
/* high-level encoder parameters */
int16_t nchan_transport; /* number of transport channels */
int16_t sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */
@@ -1079,11 +1179,14 @@ typedef struct
IVAS_QMETADATA_HANDLE hQMetaData; /* Metadata handle for q_metadata parametric spatial coding DirAC/MASA*/
MCT_ENC_HANDLE hMCT; /* MCT handle */
PARAM_MC_ENC_HANDLE hParamMC; /* Parametric MC handle */
+ MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */
MCMASA_ENC_HANDLE hMcMasa; /* Multi-channel MASA data handle */
LFE_ENC_HANDLE hLFE; /* LFE data handle */
ISM_MODE ism_mode; /* ISM format mode */
+#ifndef SBA_MODE_CLEAN_UP
SBA_MODE sba_mode; /* SBA format mode */
+#endif
MC_MODE mc_mode; /* MC format mode */
/* Stereo downmix for EVS module */
diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c
index 784ec10807aa6a92c0eb8a6d64c0afde1f342805..76f56532dc7a9f9917c228eefb9efc9524431d13 100644
--- a/lib_enc/ivas_stereo_cng_enc.c
+++ b/lib_enc/ivas_stereo_cng_enc.c
@@ -173,8 +173,7 @@ void stereo_dft_enc_sid_coh(
int16_t alpha_level;
int16_t n;
- /* TODO: still use old number of bits to keep bitexactness in output */
- nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
+ nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
zeropad = 0;
/* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector.
@@ -329,7 +328,6 @@ void stereo_dft_enc_sid_coh(
( *nb_bits )++;
}
- push_next_indice( hBstr, zeropad, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC );
return;
}
diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c
index ab4844ab944067f4a519135e05b06574f6d460f5..36e577b48248c0e15903729fcc39097a17f6704e 100644
--- a/lib_enc/ivas_stereo_dft_enc.c
+++ b/lib_enc/ivas_stereo_dft_enc.c
@@ -294,9 +294,16 @@ ivas_error stereo_dft_enc_create(
hStereoDft_loc->hConfig->force_mono_transmission = 0;
stereo_dft_config( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS );
- stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs );
+
stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth );
+ stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs
+#ifdef HYBRID_ITD_MAX
+ ,
+ hStereoDft_loc->hItd->hybrid_itd_max
+#endif
+ );
+
*hStereoDft = hStereoDft_loc;
return IVAS_ERR_OK;
@@ -416,21 +423,6 @@ void stereo_dft_enc_reset(
)
{
int16_t i;
-#ifdef ITD_WINNER_GAIN_MODIFY
- hStereoDft->noise_coherence = 0.0f;
- hStereoDft->local_vad = 0;
- hStereoDft->mus_flag = 2;
- set_zero( hStereoDft->spd_L_noise, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->spd_R_noise, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->spd_L_noise_min, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->spd_R_noise_min, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->spd_L_noise_max, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->spd_R_noise_max, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->winner_gain_L, STEREO_DFT_N_32k_ENC / 2 );
- set_zero( hStereoDft->winner_gain_R, STEREO_DFT_N_32k_ENC / 2 );
- set_f( hStereoDft->spd_L_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
- set_f( hStereoDft->spd_R_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 );
-#endif
/*reset parameters*/
set_zero( hStereoDft->side_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
set_s( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX );
@@ -575,6 +567,9 @@ void stereo_enc_itd_init(
hItd->prev_itd1 = 0;
hItd->prev_itd2 = 0;
+#ifdef HYBRID_ITD_MAX
+ hItd->hybrid_itd_max = 0;
+#endif
return;
}
@@ -772,7 +767,7 @@ void stereo_dft_enc_analyze(
{
int16_t tmp[1024];
- /*fcs: stereo side info is only simulated */
+ /* stereo side info is only simulated */
for ( i = 0; i < input_frame; i++ )
{
tmp[i] = (int16_t) ( input[0][i] + 0.5f );
diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c
index f52d67a47a328fe47fcdc6ccf4d2c167dc7564f4..025729e0cdc3832e6487d73f76e1f8781f275130 100644
--- a/lib_enc/ivas_stereo_dft_enc_itd.c
+++ b/lib_enc/ivas_stereo_dft_enc_itd.c
@@ -82,135 +82,6 @@
#define ITD_MAX_MDCT 80
-#ifdef ITD_WINNER_GAIN_MODIFY
-/*-------------------------------------------------------------------------
- * stereo_dft_frame_coherence()
- * Calculate the frame coherence of the stereo signal
- *
- *-------------------------------------------------------------------------*/
-
-static void stereo_dft_frame_coherence(
- STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
- float *xcorr,
- float *Spd_L,
- float *Spd_R,
- float *frame_coherence )
-{
- float spd_xcorr_real, spd_xcorr_imag, spd_LR;
- int16_t i, NFFT;
-
- NFFT = min( STEREO_DFT_N_32k_ENC, hStereoDft->NFFT );
- spd_xcorr_real = 0.0f;
- spd_xcorr_imag = 0.0f;
- spd_LR = 0.0f;
- *frame_coherence = 0.0f;
-
- for ( i = 1; i < NFFT / 2; i++ )
- {
- spd_xcorr_real += (float) xcorr[i * 2];
- spd_xcorr_imag += (float) xcorr[i * 2 + 1];
- spd_LR += (float) sqrt( Spd_L[i] ) * sqrt( Spd_R[i] );
- }
-
- *frame_coherence = (float) ( sqrt( spd_xcorr_real * spd_xcorr_real + spd_xcorr_imag * spd_xcorr_imag ) / spd_LR );
-
- return;
-}
-
-
-/*-------------------------------------------------------------------------
- * stereo_dft_itd_winner_gain()
- * Estimate the spectral power density of noise in the stereo signal and
- * calculate the winner gain for the ITD estimation
- *-------------------------------------------------------------------------*/
-
-static void stereo_dft_itd_winner_gain(
- STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
- float *Spd_L,
- float *Spd_R )
-{
- int16_t i;
- float alpha1 = 0.05f;
- float alpha2 = 0.95f;
- float trackingfactor = 0.5f;
- float ratio = 2.75f;
-
- for ( i = 0; i < STEREO_DFT_N_16k_ENC / 2; i++ )
- {
- if ( hStereoDft->spd_L_noise_min[i] > Spd_L[i] )
- {
- hStereoDft->spd_L_noise_min[i] = ( 1 - 0.15 ) * hStereoDft->spd_L_noise_min[i] + 0.15 * Spd_L[i];
- }
- else
- {
- hStereoDft->spd_L_noise_min[i] = hStereoDft->spd_L_noise_min[i] + alpha1 * ( Spd_L[i] - hStereoDft->spd_L_noise_min[i] );
- }
- if ( hStereoDft->spd_R_noise[i] > Spd_R[i] )
- {
- hStereoDft->spd_R_noise_min[i] = ( 1 - 0.15 ) * hStereoDft->spd_R_noise_min[i] + 0.15 * Spd_R[i];
- }
- else
- {
- hStereoDft->spd_R_noise_min[i] = hStereoDft->spd_R_noise_min[i] + alpha1 * ( Spd_R[i] - hStereoDft->spd_R_noise_min[i] );
- }
- if ( hStereoDft->spd_L_noise_max[i] < Spd_L[i] )
- {
- hStereoDft->spd_L_noise_max[i] = Spd_L[i];
- }
- else
- {
- hStereoDft->spd_L_noise_max[i] = hStereoDft->spd_L_noise_max[i] + alpha2 * ( Spd_L[i] - hStereoDft->spd_L_noise_max[i] );
- }
- if ( hStereoDft->spd_R_noise_max[i] < Spd_R[i] )
- {
- hStereoDft->spd_R_noise_max[i] = Spd_R[i];
- }
- else
- {
- hStereoDft->spd_R_noise_max[i] = hStereoDft->spd_R_noise_max[i] + alpha2 * ( Spd_R[i] - hStereoDft->spd_R_noise_max[i] );
- }
- if ( hStereoDft->spd_L_noise_max[i] > ratio * hStereoDft->spd_L_noise_min[i] )
- {
- hStereoDft->spd_L_noise[i] = hStereoDft->spd_L_noise[i];
- hStereoDft->winner_gain_L[i] = ( Spd_L[i] - hStereoDft->spd_L_noise[i] ) / Spd_L[i];
- }
- else
- {
- hStereoDft->spd_L_noise[i] = hStereoDft->spd_L_noise[i] + trackingfactor * ( Spd_L[i] - hStereoDft->spd_L_noise[i] );
- hStereoDft->winner_gain_L[i] = ( Spd_L[i] - hStereoDft->spd_L_noise[i] ) / Spd_L[i];
- }
- if ( hStereoDft->spd_R_noise_max[i] > ratio * hStereoDft->spd_R_noise_min[i] )
- {
- hStereoDft->spd_R_noise[i] = hStereoDft->spd_R_noise[i];
- hStereoDft->winner_gain_R[i] = ( Spd_R[i] - hStereoDft->spd_R_noise[i] ) / Spd_R[i];
- }
- else
- {
- hStereoDft->spd_R_noise[i] = hStereoDft->spd_R_noise[i] + trackingfactor * ( Spd_R[i] - hStereoDft->spd_R_noise[i] );
- hStereoDft->winner_gain_R[i] = ( Spd_R[i] - hStereoDft->spd_R_noise[i] ) / Spd_R[i];
- }
- }
-
- for ( i = 0; i < STEREO_DFT_N_16k_ENC / 2; i++ )
- {
- hStereoDft->winner_gain_L[i] = max( hStereoDft->winner_gain_L[i], 0.01f );
- hStereoDft->winner_gain_R[i] = max( hStereoDft->winner_gain_R[i], 0.01f );
- hStereoDft->winner_gain_L[i] = min( hStereoDft->winner_gain_L[i], 1.0f );
- hStereoDft->winner_gain_R[i] = min( hStereoDft->winner_gain_R[i], 1.0f );
- if ( hStereoDft->winner_gain_L[i] >= 0.80f )
- hStereoDft->winner_gain_L[i] = 1.0f;
- else
- hStereoDft->winner_gain_L[i] = 0.01f;
- if ( hStereoDft->winner_gain_R[i] >= 0.80f )
- hStereoDft->winner_gain_R[i] = 1.0f;
- else
- hStereoDft->winner_gain_R[i] = 0.01f;
- }
-
- return;
-}
-#endif
-
/*-------------------------------------------------------------------------
* set_band_limits()
*
@@ -244,11 +115,19 @@ static void set_band_limits(
void stereo_dft_hybrid_ITD_flag(
STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */
const int32_t input_Fs /* i : CPE element sampling rate */
+#ifdef HYBRID_ITD_MAX
+ ,
+ const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */
+#endif
)
{
if ( hConfig != NULL )
{
- if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) )
+ if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 )
+#ifdef HYBRID_ITD_MAX
+ || ( hybrid_itd_max == 1 )
+#endif
+ )
{
hConfig->hybrid_itd_flag = 1;
}
@@ -741,9 +620,6 @@ void stereo_dft_enc_compute_itd(
int16_t itd, itd_td;
float xcorr_itd[STEREO_DFT_N_32k_ENC];
float tmpf1, tmpf2, tmpf3;
-#ifdef ITD_WINNER_GAIN_MODIFY
- float frame_coherence, tmpf4;
-#endif
float thres, alpha;
int16_t index;
float xcorr_max, sum_nrg_L_lb, par_L[XCORR_LB_NUM_BANDS], par_L_avrg, sum_nrg_L_tmp;
@@ -774,6 +650,11 @@ void stereo_dft_enc_compute_itd(
float cng_xcorr_filt;
+#ifdef HYBRID_ITD_MAX
+ int16_t prev_itd_max;
+ int16_t itd_max_flip;
+#endif
+
if ( hCPE->element_mode == IVAS_CPE_DFT )
{
hStereoDft = hCPE->hStereoDft;
@@ -984,32 +865,6 @@ void stereo_dft_enc_compute_itd(
xcorr[0] = sign( hItd->xcorr_smooth[0] );
xcorr[1] = sign( hItd->xcorr_smooth[1] );
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- stereo_dft_frame_coherence( hStereoDft, xcorr, Spd_L, Spd_R, &frame_coherence );
- if ( hStereoDft->local_vad == 0 )
- {
- hStereoDft->noise_coherence = 0.9f * hStereoDft->noise_coherence + ( 1.0 - 0.9f ) * frame_coherence;
- }
- else
- {
- hStereoDft->noise_coherence = hStereoDft->noise_coherence;
- }
- stereo_dft_itd_winner_gain( hStereoDft, Spd_L, Spd_R );
-
- if ( hStereoDft->noise_coherence > 0.25f )
- {
- for ( i = 1; i < NFFT / 2; i++ )
- {
- xcorr[2 * i] = ( hStereoDft->winner_gain_L[i] * hStereoDft->winner_gain_R[i] ) * xcorr[2 * i];
- xcorr[2 * i + 1] = ( hStereoDft->winner_gain_L[i] * hStereoDft->winner_gain_R[i] ) * xcorr[2 * i + 1];
- Spd_L[i] = hStereoDft->winner_gain_L[i] * Spd_L[i];
- Spd_R[i] = hStereoDft->winner_gain_R[i] * Spd_R[i];
- }
- }
- }
-#endif
if ( hCPE->element_mode == IVAS_CPE_DFT && ( hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) )
{
@@ -1032,23 +887,6 @@ void stereo_dft_enc_compute_itd(
}
tmpf3 = 2.f;
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- alpha = -0.8f;
- }
- else
- {
- if ( flag_noisy_speech_snr )
- {
- alpha = -0.8f;
- }
- else
- {
- alpha = -1.0f;
- }
- }
-#else
if ( flag_noisy_speech_snr )
{
alpha = -0.8f;
@@ -1057,7 +895,6 @@ void stereo_dft_enc_compute_itd(
{
alpha = -1.0f;
}
-#endif
if ( hCPE->hCoreCoder[0]->Opt_DTX_ON && hCPE->element_mode == IVAS_CPE_DFT )
{
@@ -1140,42 +977,9 @@ void stereo_dft_enc_compute_itd(
tmpf1 += EPSILON;
tmpf2 = tmpf1;
tmpf1 = powf( tmpf1, alpha );
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- tmpf4 = 1.0f;
- /* Calculate smoothed spectral power density for the L/R channel */
- hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i];
- hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i];
- /* Calculate cross spectral power density using the smoothed spectral power density*/
- tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] );
- /* Calculate the value of weighted function for each frequency bin */
- tmpf4 += EPSILON;
- if ( hStereoDft->noise_coherence > 0.25f )
- {
- tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f );
- tmpf3 += tmpf2 * tmpf1;
- tmpf3 -= tmpf2 * tmpf4;
- }
- else
- {
- tmpf4 = tmpf2 * pow( tmpf4, -2.0f );
- }
- /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4;
- }
- else
- {
- tmpf3 += tmpf2 * tmpf1;
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
- }
-#else
tmpf3 += tmpf2 * tmpf1;
xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
-#endif
/* Low pass filter L/R power spectrum */
/* Calculate coherence as cross spectral density divided by L*R power spectrum */
@@ -1193,42 +997,9 @@ void stereo_dft_enc_compute_itd(
tmpf1 += EPSILON;
tmpf2 = tmpf1;
tmpf1 = powf( tmpf1, alpha );
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- tmpf4 = 1.0f;
- /* Calculate smoothed spectral power density for the L/R channel */
- hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i];
- hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i];
- /* Calculate cross spectral power density using the smoothed spectral power density*/
- tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] );
- /* Calculate the value of weighted function for each frequency bin */
- tmpf4 += EPSILON;
- if ( hStereoDft->noise_coherence > 0.25f )
- {
- tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f );
- tmpf3 += tmpf2 * tmpf1;
- tmpf3 -= tmpf2 * tmpf4;
- }
- else
- {
- tmpf4 = tmpf2 * pow( tmpf4, -2.0f );
- }
- /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4;
- }
- else
- {
- tmpf3 += tmpf2 * tmpf1;
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
- }
-#else
tmpf3 += tmpf2 * tmpf1;
xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
-#endif
}
}
}
@@ -1242,70 +1013,16 @@ void stereo_dft_enc_compute_itd(
tmpf1 += EPSILON;
tmpf2 = tmpf1;
tmpf1 = powf( tmpf1, alpha );
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- tmpf4 = 1.0f;
- /* Calculate smoothed spectral power density for the L/R channel */
- hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i];
- hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i];
- /* Calculate cross spectral power density using the smoothed spectral power density*/
- tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] );
- /* Calculate the value of weighted function for each frequency bin */
- tmpf4 += EPSILON;
- if ( hStereoDft->noise_coherence > 0.25f )
- {
- tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f );
- tmpf3 += tmpf2 * tmpf1;
- tmpf3 -= tmpf2 * tmpf4;
- }
- else
- {
- tmpf4 = tmpf2 * pow( tmpf4, -2.0f );
- }
- /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4;
- }
- else
- {
- tmpf3 += tmpf2 * tmpf1;
- xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
- xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
- }
-#else
tmpf3 += tmpf2 * tmpf1;
xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1;
xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1;
-#endif
- }
- }
-#ifdef ITD_WINNER_GAIN_MODIFY
- if ( hStereoDft->mus_flag == 0 )
- {
- if ( hStereoDft->noise_coherence > 0.25f )
- {
- tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3;
- for ( i = 0; i < NFFT; i++ )
- {
- xcorr[i] *= tmpf1;
- }
- }
- else
- {
- for ( i = NFFT / 2; i < NFFT; i++ )
- {
- xcorr[i] = 0.0f;
- }
}
}
-#else
tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3;
for ( i = 0; i < NFFT; i++ )
{
xcorr[i] *= tmpf1;
}
-#endif
/*calculate mean E ratio of main to background signal for cohSNR*/
if ( hCPE->element_mode == IVAS_CPE_DFT )
{
@@ -1624,7 +1341,12 @@ void stereo_dft_enc_compute_itd(
hItd->prev_sum_nrg_L_lb = sum_nrg_L_lb;
mvr2r( xcorr_lb, hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX );
}
-
+#ifdef HYBRID_ITD_MAX
+ /*save previous flag*/
+ prev_itd_max = hItd->hybrid_itd_max;
+ /* enable hybrid ITD handling for very large ITDs*/
+ hItd->hybrid_itd_max = ( abs( itd ) > STEREO_DFT_ITD_MAX && abs( itd ) < STEREO_DFT_ITD_MAX_ANA && !hCPE->hCoreCoder[0]->sp_aud_decision0 && hCPE->element_brate < IVAS_32k );
+#endif
/* Update memory */
hItd->prev_itd = itd;
@@ -1639,7 +1361,7 @@ void stereo_dft_enc_compute_itd(
#ifdef DEBUG_STEREO_CLF
dbgwrite( &hItd->itd[k_offset], sizeof( float ), 1, 1, "res/ITD.x" );
#endif
-
+ /* limit ITD range for MDCT stereo even more */
if ( hCPE->element_mode == IVAS_CPE_MDCT && fabsf( hItd->itd[k_offset] ) > ITD_MAX_MDCT )
{
itd = 0;
@@ -1649,7 +1371,25 @@ void stereo_dft_enc_compute_itd(
hItd->deltaItd[k_offset] = hItd->itd[k_offset] - hItd->td_itd[k_offset];
- /* limit ITD range for MDCT stereo even more */
+#ifdef HYBRID_ITD_MAX
+ if ( hItd->hybrid_itd_max )
+ {
+ /*check if there is an ITD flip*/
+ itd_max_flip = ( hItd->itd[k_offset] * hItd->itd[k_offset - 1] < 0 );
+
+ if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 )
+ {
+ int16_t tmp_itd = (int16_t) floor( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f );
+ hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset];
+ }
+ }
+ /*signal change for next frame*/
+ if ( prev_itd_max == 1 && hItd->hybrid_itd_max == 0 )
+ {
+ hItd->hybrid_itd_max = -1;
+ }
+#endif
+
#ifdef DEBUG_MODE_DFT
{
int16_t tmp;
diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c
index b7fb95422f3136080892b0df097b65719ef747c6..27a71dfae477f0d3702d266163887e9204d73f00 100644
--- a/lib_enc/ivas_stereo_dft_td_itd.c
+++ b/lib_enc/ivas_stereo_dft_td_itd.c
@@ -271,11 +271,18 @@ void stereo_td_itd(
hITD->td_itd_32k[i] = hITD->td_itd_32k[i + 1];
}
}
+#ifdef HYBRID_ITD_MAX
+ /*reset TD ITDs in case of hybrid itd_max change - turn hybrid ITD off*/
+ if ( hITD->hybrid_itd_max == -1 && hybrid_itd_flag == 0 )
+ {
+ hITD->td_itd[k_offset] = 0;
+ hITD->td_itd_32k[k_offset] = 0;
+ }
+#endif
if ( hybrid_itd_flag == 0 )
{
return;
}
-
stereo_td_get_td_itd( &( hITD->td_itd[k_offset] ), &( hITD->td_itd_32k[k_offset] ), hITD->itd[k_offset], sts[0]->input_Fs );
/* initializations*/
diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c
index a5c0fe147f0055724024771e5133507e08ccab36..e479e28cdbb87882e1510447c1ae0ab5617d8939 100644
--- a/lib_enc/ivas_stereo_dmx_evs.c
+++ b/lib_enc/ivas_stereo_dmx_evs.c
@@ -65,13 +65,54 @@
#define Q_BAND 0.25f
+#ifdef ENHANCED_STEREO_DMX
+
+#define STEREO_DMX_EVS_ISD_FORGETTING 0.95f
+#define STEREO_DMX_EVS_ISD_THRES_H 1.69f
+#define STEREO_DMX_EVS_ISD_THRES_L 0.9f
+#define STEREO_DMX_EVS_ISD_DIST_THRES_IPD 0.5f
+
+#define STEREO_DMX_EVS_ISD_DIST_HYST_L 0.36f
+#define STEREO_DMX_EVS_ISD_DIST_HYST_H 0.43f
+
+#define STEREO_DMX_EVS_ICCR_FORGETTING 0.7f
+#define STEREO_DMX_EVS_ICCR_HYST_L 0.75f
+#define STEREO_DMX_EVS_ICCR_HYST_H 0.85f
+
+#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1
+#define STEREO_DMX_EVS_LR_EGY 15.0f
+#define STEREO_DMX_EVS_ILDS_EGY 10000.0f
+#define STEREO_DMX_EVS_ILD_PRC 0.1f
+
+#define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55
+#define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19
+#define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29
+
+#define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1
+#define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f
+
+#define STEREO_DMX_EVS_NB_SBFRM 5
+#define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f
+#define STEREO_DMX_EVS_CRST_FCTR_16 80.0f
+#define STEREO_DMX_EVS_CRST_FCTR_32 40.0f
+#define STEREO_DMX_EVS_CRST_FCTR_48 35.0f
+
+#define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f
+
+#endif
+
/*-----------------------------------------------------------------------*
* Local function prototypes
*-----------------------------------------------------------------------*/
static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci, const float *rfft_coef, const float *wnd, const int16_t input_frame );
+#ifdef ENHANCED_STEREO_DMX
+static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame );
+static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame );
+#else
static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame );
static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, const float srcL[], const float srcR[], float itd[], const int16_t input_frame );
+#endif
static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] );
static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] );
static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy );
@@ -141,13 +182,16 @@ void estimate_itd_wnd_fft(
static void calc_poc(
STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */
- const float wnd[], /* i : window coef */
- const float rfft_coef[], /* i : RFFT coef */
- const float specLr[], /* i : Lch real-part spectra */
- const float specLi[], /* i : Lch imaginary-part input signal */
- const float specRr[], /* i : Rch real-part spectra */
- const float specRi[], /* i : Rch imaginary-part input signal */
- const int16_t input_frame /* i : input frame length per channel */
+#ifdef ENHANCED_STEREO_DMX
+ STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */
+#endif
+ const float wnd[], /* i : window coef */
+ const float rfft_coef[], /* i : RFFT coef */
+ const float specLr[], /* i : Lch real-part spectra */
+ const float specLi[], /* i : Lch imaginary-part input signal */
+ const float specRr[], /* i : Rch real-part spectra */
+ const float specRi[], /* i : Rch imaginary-part input signal */
+ const int16_t input_frame /* i : input frame length per channel */
)
{
int16_t i, n1, n2;
@@ -167,18 +211,31 @@ static void calc_poc(
int16_t cos_step, cos_max;
float eps_cos, eps_sin, EPS;
+#ifdef ENHANCED_STEREO_DMX
+ int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha;
+ float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate;
+ float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr;
+ float *Pr, *Pi, *ipd_ff, *p_curr_taps;
+ float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX];
+#endif
+
/* Initialization */
iN = 1.0f / (float) input_frame;
-
s = hPOC->sin;
P = hPOC->P;
n0 = input_frame / 2;
itdLR = hPOC->itdLR;
+#ifdef ENHANCED_STEREO_DMX
+ Pr = hPHA->Pr;
+ Pi = hPHA->Pi;
+ nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE;
+ input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE;
+#endif
+
igamma = STEREO_DMX_EVS_POC_GAMMA * iN;
gamma = 1.0f - igamma;
-
step = 1;
bias = 0;
cos_step = 2;
@@ -337,6 +394,291 @@ static void calc_poc(
}
specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma;
+#ifdef ENHANCED_STEREO_DMX
+
+ hPHA->init_frmCntr--;
+ if ( hPHA->init_frmCntr < 0 )
+ {
+ hPHA->init_frmCntr = 0;
+ }
+ freq_8k = L_FRAME16k / 2;
+ freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) );
+
+ // Memorize the filters N-1
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ if ( hPHA->p_curr_taps[n] )
+ {
+ hPHA->p_prev_taps[n] = hPHA->prev_taps[n];
+ mvr2r( hPHA->p_curr_taps[n], hPHA->p_prev_taps[n], hPHA->pha_len );
+ }
+ else
+ {
+ hPHA->p_prev_taps[n] = NULL;
+ }
+ }
+
+ // ISD
+ isd_cnt_l = 0;
+ isd_cnt_h = 0;
+ for ( i = 1; i <= freq_8k; i++ )
+ {
+ Nr = ( specLr[i] - specRr[i] );
+ Ni = ( specLi[i] - specRi[i] );
+ Dr = ( specLr[i] + specRr[i] );
+ Di = ( specLi[i] + specRi[i] );
+ if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) )
+ {
+ isd_cnt_h++;
+ }
+ if ( ( Nr * Nr + Ni * Ni ) < STEREO_DMX_EVS_ISD_THRES_L * ( Dr * Dr + Di * Di ) )
+ {
+ isd_cnt_l++;
+ }
+ }
+
+ isd_rate = (float) isd_cnt_h / (float) freq_8k;
+ hPHA->isd_rate_s = STEREO_DMX_EVS_ISD_FORGETTING * hPHA->isd_rate_s + ( 1.0f - STEREO_DMX_EVS_ISD_FORGETTING ) * isd_rate;
+
+ if ( hPHA->isd_rate_s > STEREO_DMX_EVS_ISD_DIST_HYST_H )
+ {
+ if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD )
+ {
+ if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD )
+ {
+ hPHA->pha_hys_cnt += 1;
+ }
+ else
+ {
+ hPHA->pha_hys_cnt = 0;
+ }
+
+ if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES )
+ {
+ hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD;
+ }
+ }
+
+ hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD;
+ }
+ else if ( hPHA->isd_rate_s < STEREO_DMX_EVS_ISD_DIST_HYST_L )
+ {
+ if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2 )
+ {
+ if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2 )
+ {
+ hPHA->pha_hys_cnt += 1;
+ }
+ else
+ {
+ hPHA->pha_hys_cnt = 0;
+ }
+
+ if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES )
+ {
+ hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2;
+ }
+ }
+ hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2;
+ }
+
+ ipd_ff = hPHA->ipd_ff;
+
+ Nr = 0;
+ Ni = 0;
+ eneL = 0;
+ eneR = 0;
+
+ for ( n = 1, i = 1; n < nsbd; n++ )
+ {
+ tPr = 0.0f;
+ tPi = 0.0f;
+ tEr[n] = 0.0f;
+ tEl[n] = 0.0f;
+
+ for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ )
+ {
+ // Energy
+ tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i];
+ tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i];
+
+ // IPD
+ IPDr = specLr[i] * specRr[i] + specLi[i] * specRi[i];
+ IPDi = specLi[i] * specRr[i] - specLr[i] * specRi[i];
+ tPr += IPDr;
+ tPi += IPDi;
+
+ // ICCr
+ Pn = (float) inv_sqrt( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON );
+ IPDr *= Pn;
+ IPDi *= Pn;
+
+ tIPDr = ( specRr[i] * IPDr - specRi[i] * IPDi );
+ tIPDi = ( specRr[i] * IPDi + specRi[i] * IPDr );
+
+ Nr += ( specLr[i] * tIPDr + specLi[i] * tIPDi );
+ Ni += ( specLi[i] * tIPDr - specLr[i] * tIPDi );
+
+ eneL += ( specLr[i] * specLr[i] + specLi[i] * specLi[i] );
+ eneR += ( specRr[i] * specRr[i] + specRi[i] * specRi[i] );
+ }
+
+ Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON );
+ tPr *= Pn;
+ tPi *= Pn;
+
+ if ( hPHA->init_frmCntr == 0 )
+ {
+ Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr;
+ Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi;
+ Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON );
+ Pr[n] *= Pn;
+ Pi[n] *= Pn;
+ }
+ else
+ {
+ Pr[n] = tPr;
+ Pi[n] = tPi;
+ }
+
+ Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n];
+ Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n];
+ }
+ ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) );
+ hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr;
+
+ if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD )
+ {
+ hPHA->p_curr_taps[0] = NULL;
+ hPHA->p_curr_taps[1] = hPHA->curr_taps[1];
+
+ rfft_pha_buf[0] = 1.;
+ rfft_pha_buf[1] = 1.;
+
+ ild_cnt = 0;
+ for ( i = 1; i < nsbd; i++ )
+ {
+ rfft_pha_buf[i * 2] = Pr[i];
+ rfft_pha_buf[i * 2 + 1] = Pi[i];
+ if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) )
+ {
+ ild_cnt++;
+ tEr[i] = 1;
+ }
+ else
+ {
+ tEr[i] = -1;
+ }
+ }
+ if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC )
+ {
+ for ( i = 1; i < nsbd; i++ )
+ {
+ if ( tEr[i] > 0 )
+ {
+ rfft_pha_buf[i * 2] = 1.;
+ rfft_pha_buf[i * 2 + 1] = 0.;
+ }
+ }
+ }
+
+ rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 );
+ mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len );
+ }
+ else
+ {
+ if ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_L ) || ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_H ) && ( hPHA->p_curr_taps[0] != NULL ) ) )
+ {
+ // IPDn
+
+ set_f( &( Pr[freq_ipd_max] ), 1.0f, ( nsbd - freq_ipd_max ) );
+ set_f( &( Pi[freq_ipd_max] ), 0.0f, ( nsbd - freq_ipd_max ) );
+
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ hPHA->p_curr_taps[n] = hPHA->curr_taps[n];
+ }
+
+ rfft_pha_buf[0] = 1.;
+ rfft_pha_buf[1] = 1.;
+
+ ild_cnt = 0;
+ isd_rate = (float) isd_cnt_l / freq_8k;
+ for ( i = 1; i < nsbd; i++ )
+ {
+ rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f );
+ rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] );
+ if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD )
+ {
+ rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] );
+ rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f );
+ }
+
+ if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) )
+ {
+ ild_cnt++;
+ tEr[i] = 1;
+ }
+ else
+ {
+ tEr[i] = -1;
+ }
+ }
+ if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC )
+ {
+ for ( i = 1; i < nsbd; i++ )
+ {
+ if ( tEr[i] > 0 )
+ {
+ rfft_pha_buf[i * 2] = 1.;
+ rfft_pha_buf[i * 2 + 1] = 0.;
+ }
+ }
+ }
+
+ rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 );
+ mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len );
+
+ // PHA L2R
+ p_curr_taps = hPHA->p_curr_taps[0];
+ p_curr_taps[0] = rfft_pha_buf[0];
+ for ( i = 1; i < hPHA->pha_len; i++ )
+ {
+ p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i];
+ }
+ }
+ else
+ {
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ hPHA->p_curr_taps[n] = NULL;
+ }
+ }
+ }
+
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ if ( hPHA->p_curr_taps[n] )
+ {
+ for ( i = 0; i < hPHA->pha_len; i++ )
+ {
+ hPHA->p_curr_taps[n][i] *= hPHA->win[i];
+ }
+
+ energy = 0.;
+ for ( i = 0; i < hPHA->pha_len; i++ )
+ {
+ energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i];
+ }
+ energy = (float) inv_sqrt( energy + EPSILON );
+ for ( i = 0; i < hPHA->pha_len; i++ )
+ {
+ hPHA->p_curr_taps[n][i] *= energy;
+ }
+ }
+ }
+
+#endif
rfft_buf[0] = specPOr[0];
rfft_buf[1] = specPOr[n0];
@@ -550,10 +892,13 @@ static float find_poc_peak(
static ivas_error estimate_itd(
float *corr, /* o : correlation */
STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */
- const float srcL[], /* i : Lch input signal */
- const float srcR[], /* i : Rch input signal */
- float itd[], /* o : estimated itd */
- const int16_t input_frame /* i : input frame length per channel */
+#ifdef ENHANCED_STEREO_DMX
+ STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */
+#endif
+ const float srcL[], /* i : Lch input signal */
+ const float srcR[], /* i : Rch input signal */
+ float itd[], /* o : estimated itd */
+ const int16_t input_frame /* i : input frame length per channel */
)
{
float specLr[L_FRAME48k / 2 + 1], specLi[L_FRAME48k / 2 + 1], specRr[L_FRAME48k / 2 + 1], specRi[L_FRAME48k / 2 + 1];
@@ -598,7 +943,11 @@ static ivas_error estimate_itd(
estimate_itd_wnd_fft( srcL, specLr, specLi, rfft_coef, hPOC->wnd, input_frame );
estimate_itd_wnd_fft( srcR, specRr, specRi, rfft_coef, hPOC->wnd, input_frame );
+#ifdef ENHANCED_STEREO_DMX
+ calc_poc( hPOC, hPHA, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame );
+#else
calc_poc( hPOC, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame );
+#endif
*corr = find_poc_peak( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING );
return error;
@@ -788,15 +1137,39 @@ void stereo_dmx_evs_enc(
STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */
const int32_t input_Fs, /* i : input sampling rate */
int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */
- const int16_t n_samples /* i : number of input samples */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const int16_t n_samples, /* i : number of input samples */
+ const bool is_binaural /* i : indication that input is binaural audio */
+#else
+ const int16_t n_samples /* i : number of input samples */
+#endif
)
{
int16_t n;
float dmx_weight, corr;
float data_f[CPE_CHANNELS][L_FRAME48k];
+
+#ifdef ENHANCED_STEREO_DMX
+ int16_t k, m, pha_len, fad_len;
+ float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX];
+ float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data;
+ float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, ftmp;
+ STEREO_DMX_EVS_PRC curr_prc;
+ int16_t input_subframe, is_transient;
+ float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM];
+#else
float dmx_data[L_FRAME48k];
+#endif
+
int16_t input_frame;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ if ( is_binaural )
+ {
+ /* use of is_binaural flag is to be considered */
+ }
+#endif
+
input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
for ( n = 0; n < input_frame; n++ )
@@ -810,6 +1183,215 @@ void stereo_dmx_evs_enc(
set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples );
}
+#ifdef ENHANCED_STEREO_DMX
+
+ input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM;
+ is_transient = 0;
+ for ( k = 0; k < CPE_CHANNELS; k++ )
+ {
+ ftmp = 0;
+ for ( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ )
+ {
+ p_sub_frame = &( data_f[k][m * input_subframe] );
+ subframe_energy[m] = 0;
+ for ( n = 0; n < input_subframe; n++ )
+ {
+ subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n];
+ }
+
+ if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr )
+ {
+ is_transient = 1;
+ }
+
+ if ( hStereoDmxEVS->hPHA->init_frmCntr == 0 )
+ {
+ hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m];
+ }
+ else
+ {
+ hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m];
+ }
+
+ ftmp += subframe_energy[m];
+ }
+
+ for ( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ )
+ {
+ if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST )
+ {
+ is_transient = 1;
+ }
+ }
+ }
+
+ estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame );
+
+ // poc
+
+ if ( hStereoDmxEVS->itd )
+ {
+ dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f;
+ }
+ else
+ {
+ dmx_weight = 0.5f;
+ }
+
+ create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd,
+ hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy );
+
+ // pha
+
+ pha_len = hStereoDmxEVS->hPHA->pha_len;
+ fad_len = hStereoDmxEVS->hPHA->fad_len;
+ fad_g = hStereoDmxEVS->hPHA->fad_g;
+
+ set_zero( dmx_pha_data, n_samples );
+ set_zero( mem_prev, fad_len );
+
+ for ( k = 0; k < CPE_CHANNELS; k++ )
+ {
+ p_data = data_f[k];
+ mvr2r( hStereoDmxEVS->hPHA->data_mem[k], data_mem, pha_len );
+ mvr2r( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem[k], pha_len );
+ p_data_mem = &( data_mem[pha_len] );
+ mvr2r( p_data, p_data_mem, n_samples );
+
+ p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k];
+ if ( p_prev_taps )
+ {
+ for ( n = 0; n < fad_len; n++ )
+ {
+ for ( ftmp = 0, m = 0; m < pha_len; m++ )
+ {
+ ftmp += p_data_mem[n - m] * p_prev_taps[m];
+ }
+ mem_prev[n] += ftmp * INV_SQRT_2;
+ }
+ }
+ else
+ {
+ for ( n = 0; n < fad_len; n++ )
+ {
+ mem_prev[n] += p_data[n] * INV_SQRT_2;
+ }
+ }
+
+ p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k];
+ if ( p_curr_taps )
+ {
+ for ( n = 0; n < n_samples; n++ )
+ {
+ for ( ftmp = 0, m = 0; m < pha_len; m++ )
+ {
+ ftmp += p_data_mem[n - m] * p_curr_taps[m];
+ }
+ dmx_pha_data[n] += ftmp * INV_SQRT_2;
+ }
+ }
+ else
+ {
+ for ( n = 0; n < n_samples; n++ )
+ {
+ dmx_pha_data[n] += p_data[n] * INV_SQRT_2;
+ }
+ }
+ }
+
+ for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- )
+ {
+ dmx_pha_data[n] *= fad_g[n];
+ dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m];
+ }
+
+ // prc switch
+
+ curr_prc = hStereoDmxEVS->hPHA->curr_prc;
+ if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres )
+ {
+ if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_POC )
+ {
+ if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC )
+ {
+ hStereoDmxEVS->hPHA->prc_hys_cnt += 1;
+ }
+ else
+ {
+ hStereoDmxEVS->hPHA->prc_hys_cnt = 0;
+ }
+
+ if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES )
+ {
+ hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC;
+ }
+ }
+ hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC;
+ }
+ else
+ {
+ if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_PHA )
+ {
+ if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA )
+ {
+ hStereoDmxEVS->hPHA->prc_hys_cnt += 1;
+ }
+ else
+ {
+ hStereoDmxEVS->hPHA->prc_hys_cnt = 0;
+ }
+
+ if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES )
+ {
+ hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA;
+ }
+ }
+ hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA;
+ }
+
+ if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) )
+ {
+ hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC;
+ hStereoDmxEVS->hPHA->prc_hys_cnt = 0;
+ }
+
+ if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC )
+ {
+ p_dmx_data = dmx_poc_data;
+
+ if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc )
+ {
+ fad_len = hStereoDmxEVS->hPHA->fad_len_prc;
+ fad_g = hStereoDmxEVS->hPHA->fad_g_prc;
+
+ for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- )
+ {
+ p_dmx_data[n] *= fad_g[n];
+ p_dmx_data[n] += fad_g[m] * dmx_pha_data[n];
+ }
+ }
+ }
+ else
+ {
+ p_dmx_data = dmx_pha_data;
+
+ if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc )
+ {
+ fad_len = hStereoDmxEVS->hPHA->fad_len_prc;
+ fad_g = hStereoDmxEVS->hPHA->fad_g_prc;
+
+ for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- )
+ {
+ p_dmx_data[n] *= fad_g[n];
+ p_dmx_data[n] += fad_g[m] * dmx_poc_data[n];
+ }
+ }
+ }
+
+ mvr2s( p_dmx_data, data, n_samples );
+
+#else
+
estimate_itd( &corr, hStereoDmxEVS->hPOC, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame );
if ( hStereoDmxEVS->itd )
@@ -826,6 +1408,8 @@ void stereo_dmx_evs_enc(
mvr2s( dmx_data, data, n_samples );
+#endif
+
return;
}
@@ -844,6 +1428,12 @@ ivas_error stereo_dmx_evs_init_encoder(
STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS;
int16_t n, input_frame;
+#ifdef ENHANCED_STEREO_DMX
+ int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha;
+ float *win, *fad_g, fad_r, tmp_r, a_min, a_max, a_step, *ipd_ff;
+ const float *p_ipd_w;
+#endif
+
input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC );
hStereoDmxEVS = NULL;
@@ -933,6 +1523,156 @@ ivas_error stereo_dmx_evs_init_encoder(
hStereoDmxEVS->hPOC->confidence = 0.0f;
+#ifdef ENHANCED_STEREO_DMX
+
+ hStereoDmxEVS->hPHA = NULL;
+ if ( ( hStereoDmxEVS->hPHA = (STEREO_DMX_EVS_PHA_HANDLE) malloc( sizeof( STEREO_DMX_EVS_PHA_DATA ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_CORFILT_DATA\n" ) );
+ }
+
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ hStereoDmxEVS->hPHA->p_curr_taps[n] = NULL;
+ hStereoDmxEVS->hPHA->p_prev_taps[n] = NULL;
+
+ set_zero( hStereoDmxEVS->hPHA->data_mem[n], STEREO_DMX_EVS_PHA_LEN_MAX );
+ set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX );
+ }
+
+ if ( input_Fs == 16000 )
+ {
+ len = STEREO_DMX_EVS_PHA_LEN_16;
+ hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16;
+ hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_16;
+ hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_16;
+ }
+ else if ( input_Fs == 32000 )
+ {
+ len = STEREO_DMX_EVS_PHA_LEN_32;
+ hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32;
+ hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32;
+ hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32;
+ }
+ else if ( input_Fs == 48000 )
+ {
+ len = STEREO_DMX_EVS_PHA_LEN_48;
+ hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48;
+ hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48;
+ hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48;
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" );
+ }
+
+ hStereoDmxEVS->hPHA->pha_len = len / 2;
+ hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f );
+ hStereoDmxEVS->hPHA->isd_rate_s = 0.0f;
+ hStereoDmxEVS->hPHA->iccr_s = 0.0f;
+
+ pha_len = hStereoDmxEVS->hPHA->pha_len;
+ fad_len = hStereoDmxEVS->hPHA->fad_len;
+
+ trans_len = (int16_t) ( (float) pha_len / 20.0f );
+ set_f( hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len );
+ hStereoDmxEVS->hPHA->win[0] = 1.0f;
+ tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 );
+ win = &( hStereoDmxEVS->hPHA->win[pha_len - trans_len] );
+ for ( n = 0; n < trans_len; n++ )
+ {
+ win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * 1.8f;
+ }
+
+ fad_g = hStereoDmxEVS->hPHA->fad_g;
+ fad_r = 1.0f / (float) ( fad_len + 1 );
+ fad_len2 = fad_len / 2;
+ for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- )
+ {
+ fad_g[n] = (float) ( n + 1 ) * fad_r;
+ fad_g[m] = 1.0f - fad_g[n];
+ }
+
+ hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD;
+ hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD;
+ hStereoDmxEVS->hPHA->pha_hys_cnt = 0;
+
+ // Compute the forgetting factor
+ a_min = 0.8576958985908941f;
+ a_max = 0.9440608762859234f;
+ itrh = (int16_t) ( ( 3000 * input_frame ) / ( input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE ) ); // 3kHz
+ n0 = L_FRAME16k / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE );
+ a_step = ( a_min - a_max ) / ( n0 + 1 - itrh );
+ ipd_ff = hStereoDmxEVS->hPHA->ipd_ff;
+ for ( n = 0; n < itrh; n++ )
+ {
+ ipd_ff[n] = a_max;
+ }
+ for ( ; n < ( n0 + 1 ); n++ ) // 8kHz
+ {
+ ipd_ff[n] = a_max + ( n - itrh ) * a_step;
+ }
+ for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ )
+ {
+ ipd_ff[n] = a_min;
+ }
+ set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX );
+ set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX );
+
+ n0 = input_frame / ( 4 * STEREO_DMX_EVS_SUBBAND_SIZE );
+ input_frame_pha = input_frame / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE );
+
+ if ( input_frame == L_FRAME16k )
+ {
+ p_ipd_w = dft_trigo_32k;
+ rfft_ipd_coef_step = 4;
+ }
+ else if ( input_frame == L_FRAME32k )
+ {
+ p_ipd_w = dft_trigo_32k;
+ rfft_ipd_coef_step = 2;
+ }
+ else if ( input_frame == L_FRAME48k )
+ {
+ p_ipd_w = dft_trigo_48k;
+ rfft_ipd_coef_step = 2;
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" );
+ }
+
+ win = hStereoDmxEVS->hPHA->rfft_ipd_coef;
+ len = rfft_ipd_coef_step * STEREO_DMX_EVS_SUBBAND_SIZE;
+ for ( n = 0; n < n0; n++ )
+ {
+ win[n] = p_ipd_w[n * len];
+ win[input_frame_pha - n] = p_ipd_w[n * len];
+ }
+ win[n0] = p_ipd_w[n0 * len];
+
+ hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC;
+ hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC;
+ hStereoDmxEVS->hPHA->prc_hys_cnt = 0;
+
+ hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f );
+ fad_len = hStereoDmxEVS->hPHA->fad_len_prc;
+ fad_g = hStereoDmxEVS->hPHA->fad_g_prc;
+ fad_r = 1.0f / (float) ( fad_len + 1 );
+ fad_len2 = fad_len / 2;
+ for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- )
+ {
+ fad_g[n] = (float) ( n + 1 ) * fad_r;
+ fad_g[m] = 1.0f - fad_g[n];
+ }
+
+ for ( n = 0; n < CPE_CHANNELS; n++ )
+ {
+ hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f;
+ }
+
+#endif
+
*hStereoDmxEVS_out = hStereoDmxEVS;
return IVAS_ERR_OK;
@@ -960,6 +1700,14 @@ void stereo_dmx_evs_close_encoder(
( *hStereoDmxEVS )->hPOC = NULL;
}
+#ifdef ENHANCED_STEREO_DMX
+ if ( ( *hStereoDmxEVS )->hPHA != NULL )
+ {
+ free( ( *hStereoDmxEVS )->hPHA );
+ ( *hStereoDmxEVS )->hPHA = NULL;
+ }
+#endif
+
free( ( *hStereoDmxEVS ) );
( *hStereoDmxEVS ) = NULL;
diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c
index 9500da4fb9d21b5e7181d2349306a66fc5e46774..03fcad485a8493450e60aa5f673c257d11a2444c 100644
--- a/lib_enc/ivas_stereo_mdct_core_enc.c
+++ b/lib_enc/ivas_stereo_mdct_core_enc.c
@@ -235,7 +235,8 @@ void stereo_mdct_core_enc(
*---------------------------------------------------------------*/
ivas_mdct_core_whitening_enc( hCPE, new_samples, old_wsp, pitch_buf, p_mdst_spectrum_long,
- tnsBits, p_orig_spectrum_long, tnsSize, p_param, hBstr, NULL, 0, CPE_CHANNELS );
+ tnsBits, p_orig_spectrum_long, tnsSize, p_param, hBstr,
+ 0, CPE_CHANNELS );
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
@@ -361,7 +362,13 @@ void stereo_mdct_core_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
-
+#ifdef IND_LIST_DYN
+ /* update the pointer to the buffer of indices of the second channel */
+ if ( ch == 1 )
+ {
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 );
}
}
@@ -372,6 +379,13 @@ void stereo_mdct_core_enc(
for ( ch = 0; ch < CPE_CHANNELS; ch++ )
{
st = sts[ch];
+#ifdef IND_LIST_DYN
+ /* update the pointer to the buffer of indices of the second channel */
+ if ( ch == 1 )
+ {
+ st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV;
if ( st->igf )
{
@@ -449,7 +463,8 @@ void stereo_mdct_core_enc(
}
#endif
- ivas_mdct_quant_coder( hCPE, 0, tnsBits, tnsSize, p_param, 0 );
+ ivas_mdct_quant_coder( hCPE,
+ tnsBits, tnsSize, p_param, 0 );
pop_wmops();
diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c
old mode 100644
new mode 100755
index 4ef24de8a191368165a8406f556121d047f5be93..138c9436d6664a3c16dce55a5761fcd866156e0e
--- a/lib_enc/ivas_stereo_mdct_stereo_enc.c
+++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c
@@ -430,6 +430,10 @@ void stereo_coder_tcx(
if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] )
{
+#ifdef FIX_483b
+ sts[0]->hTcxEnc->tns_ms_flag[k] = 1;
+ sts[1]->hTcxEnc->tns_ms_flag[k] = 1;
+#endif
ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], inv_mdst_spectrum[0][k], inv_mdst_spectrum[1][k], -1 );
ms_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], sfbConf->sfbCnt );
}
diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c
index 1be9af224e8341d63fbfbfd1763d3d8820fd2519..fca3c7785eab9e833c538536f7f61fc9fb99ebf3 100644
--- a/lib_enc/ivas_stereo_switching_enc.c
+++ b/lib_enc/ivas_stereo_switching_enc.c
@@ -526,7 +526,7 @@ ivas_error stereo_memory_enc(
{
return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) );
}
- st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode );
/* allocate and initialize MDCT stereo structure */
if ( ( hCPE->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL )
diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c
index 3857795dceadc5a1f43a07939971f77ac20dcd90..2357e307c56bb49cd1b862f7dd57ee15b8220433 100644
--- a/lib_enc/ivas_stereo_td_enc.c
+++ b/lib_enc/ivas_stereo_td_enc.c
@@ -124,6 +124,14 @@ void stereo_td_init_enc(
hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_LEFT_IS_PRIM;
}
+#ifdef IND_LIST_DYN
+ hStereoTD->tdm_hBstr_tmp.ind_list = hStereoTD->tdm_ind_list_tmp;
+ hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = (Indice **) ( &hStereoTD->tdm_hBstr_tmp.ind_list );
+ hStereoTD->max_ind_tdm_tmp = MAX_IND_TDM_TMP;
+ hStereoTD->tdm_hBstr_tmp.ivas_max_num_indices = &hStereoTD->max_ind_tdm_tmp;
+ reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP );
+#endif
+
return;
}
@@ -314,12 +322,16 @@ void tdm_configure_enc(
int16_t tdm_ratio_bit_alloc_idx, mod_ct;
STEREO_TD_ENC_DATA_HANDLE hStereoTD;
Encoder_State **sts;
+#ifndef IND_LIST_DYN
BSTR_ENC_HANDLE hBstr;
+#endif
int16_t loc_coder_tyape_raw0;
hStereoTD = hCPE->hStereoTD;
sts = hCPE->hCoreCoder;
+#ifndef IND_LIST_DYN
hBstr = sts[1]->hBstr;
+#endif
loc_coder_tyape_raw0 = sts[0]->coder_type_raw;
/*----------------------------------------------------------------*
@@ -475,6 +487,46 @@ void tdm_configure_enc(
* Bitstream writing
*----------------------------------------------------------------*/
+#ifdef IND_LIST_DYN
+ /* transmit the ratio index */
+ if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 )
+ {
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx_SM, TDM_RATIO_BITS );
+ }
+ else
+ {
+ if ( hStereoTD->tdm_LRTD_flag == 1 )
+ {
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, hStereoTD->tdm_inst_ratio_idx, TDM_RATIO_BITS );
+ }
+ else
+ {
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx, TDM_RATIO_BITS );
+ }
+ }
+
+ /* LPC reuse flag */
+ if ( sts[1]->coder_type == INACTIVE && tdm_ratio_idx < 29 && tdm_ratio_idx > 1 )
+ {
+ /* normal TD, tdm_lp_reuse_flag always on, tdm_use_IAWB_Ave_lpc varies tdm_ratio_idx<29 && tdm_ratio_idx> 1*/
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_use_IAWB_Ave_lpc, TDM_LP_REUSE_BITS );
+ }
+ else
+ {
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_lp_reuse_flag, TDM_LP_REUSE_BITS );
+ }
+
+ /* LRTD flag */
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LRTD_FLAG, hStereoTD->tdm_LRTD_flag, TDM_LR_CONTENT_BITS );
+
+ /* Stereo ICA parameters */
+ if ( hStereoTD->tdm_LRTD_flag == 0 )
+ {
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_REFCHAN, hCPE->hStereoTCA->refChanIndx, STEREO_BITS_TCA_CHAN );
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS );
+ push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD );
+ }
+#else
/* transmit the ratio index */
if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 )
{
@@ -513,12 +565,14 @@ void tdm_configure_enc(
push_indice( hBstr, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS );
push_indice( hBstr, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD );
}
+#endif
#ifdef DEBUG_MODE_TD
dbgwrite( &hStereoTD->tdm_low_rate_mode, 2, 1, 320, "res/tdm_low_rate_mode" );
dbgwrite( &hStereoTD->tdm_lp_reuse_flag, 2, 1, 320, "res/tdm_lp_reuse_flag" );
dbgwrite( &mod_ct, 2, 1, 320, "res/mod_ct.enx" );
#endif
+
/*----------------------------------------------------------------*
* Updates
*----------------------------------------------------------------*/
diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c
index 40a97cc33e712c50fed8ea33204153e82bd57c03..e334f4d0298b6fc9d00f108b3531f59028e0bacf 100644
--- a/lib_enc/ivas_tcx_core_enc.c
+++ b/lib_enc/ivas_tcx_core_enc.c
@@ -99,10 +99,10 @@ void stereo_tcx_init_enc(
st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode );
st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC );
st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode, st->element_mode );
- st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode, st->mct_chan_mode );
+ st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode );
if ( st->element_mode != EVS_MONO )
{
- st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode, st->mct_chan_mode );
+ st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode );
}
st->core_brate = st->total_brate;
diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c
index a7b252c9d8f4e40d23823492b240afb2d2f80216..28b954c841901eff829b1682ec74aeced1d65fae 100755
--- a/lib_enc/lib_enc.c
+++ b/lib_enc/lib_enc.c
@@ -35,11 +35,13 @@
#include "prot.h"
#include
#include
+#include
#include
#ifdef DEBUGGING
#include "debug.h"
#endif
#include "wmc_auto.h"
+#include "options.h"
/*---------------------------------------------------------------------*
* Local struct
@@ -48,8 +50,12 @@
struct IVAS_ENC
{
Encoder_Struct *st_ivas;
- Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */
+#ifndef IND_LIST_DYN
+ Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */
+#endif
+#ifndef IND_LIST_DYN
Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */
+#endif
ENC_CORE_HANDLE hCoreCoder;
bool isConfigured;
#ifdef DEBUGGING
@@ -61,6 +67,7 @@ struct IVAS_ENC
bool ismMetadataProvided[MAX_NUM_OBJECTS];
bool maxBandwidthUser; /* Was a specific max bandwith selected by the user? */
IVAS_ENC_BANDWIDTH newBandwidthApi; /* maximum encoded bandwidth, as set on API level */
+ bool extMetadataApi; /* External metadata requested, to be checked against current bit rate */
};
/*---------------------------------------------------------------------*
@@ -75,7 +82,7 @@ static int16_t getInputBufferSize( const Encoder_Struct *st_ivas );
static ivas_error doCommonConfigureChecks( IVAS_ENC_HANDLE hIvasEnc );
static ivas_error doCommonSetterChecks( IVAS_ENC_HANDLE hIvasEnc );
static ivas_error sanitizeBandwidth( const IVAS_ENC_HANDLE hIvasEnc );
-static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig );
+static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig, const IVAS_ENC_HANDLE hIvasEnc );
static void init_encoder_config( ENCODER_CONFIG_HANDLE hEncoderConfig );
static void resetIsmMetadataProvidedFlags( IVAS_ENC_HANDLE hIvasEnc );
static ivas_error bandwidthApiToInternal( const IVAS_ENC_BANDWIDTH maxBandwidth, int16_t *internalMaxBandwidth );
@@ -99,7 +106,9 @@ ivas_error IVAS_ENC_Open(
)
{
Encoder_Struct *st_ivas;
+#ifndef IND_LIST_DYN
int16_t i, j;
+#endif
if ( phIvasEnc == NULL )
{
@@ -134,6 +143,7 @@ ivas_error IVAS_ENC_Open(
* Initialize indices
*-----------------------------------------------------------------*/
+#ifndef IND_LIST_DYN
for ( i = 0; i < MAX_NUM_DATA; ++i )
{
for ( j = 0; j < MAX_NUM_INDICES; ++j )
@@ -142,7 +152,9 @@ ivas_error IVAS_ENC_Open(
( *phIvasEnc )->ind_list[i][j].value = 0;
}
}
+#endif
+#ifndef IND_LIST_DYN
for ( i = 0; i < MAX_NUM_METADATA; ++i )
{
for ( j = 0; j < MAX_BITS_METADATA; ++j )
@@ -151,6 +163,7 @@ ivas_error IVAS_ENC_Open(
( *phIvasEnc )->ind_list_metadata[i][j].value = 0;
}
}
+#endif
/*-----------------------------------------------------------------*
* Allocate IVAS-codec encoder state
@@ -178,10 +191,17 @@ ivas_error IVAS_ENC_Open(
/* initialize pointers to handles to NULL */
ivas_initialize_handles_enc( st_ivas );
+#ifdef IND_LIST_DYN
+ st_ivas->ind_list = NULL;
+ st_ivas->ind_list_metadata = NULL;
+#endif
+
/* set high-level parameters */
st_ivas->mc_mode = MC_MODE_NONE;
st_ivas->ism_mode = ISM_MODE_NONE;
+#ifndef SBA_MODE_CLEAN_UP
st_ivas->sba_mode = SBA_MODE_NONE;
+#endif
st_ivas->sba_analysis_order = 0;
return IVAS_ERR_OK;
@@ -249,7 +269,12 @@ ivas_error IVAS_ENC_ConfigureForMono(
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */
- const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */
+ const bool is_binaural /* i : if true, the input is binaural audio */
+#else
+ const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */
+#endif
)
{
ivas_error error;
@@ -262,6 +287,9 @@ ivas_error IVAS_ENC_ConfigureForMono(
}
hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ hIvasEnc->st_ivas->hEncoderConfig->is_binaural = is_binaural;
+#endif
if ( downmixFromStereo )
{
@@ -287,7 +315,12 @@ ivas_error IVAS_ENC_ConfigureForStereo(
const int32_t bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
- const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
+ const bool is_binaural /* i : flag indicating if input is binaural audio */
+#else
+ const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
+#endif
#ifdef DEBUGGING
,
const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */
@@ -308,6 +341,9 @@ ivas_error IVAS_ENC_ConfigureForStereo(
hEncoderConfig = st_ivas->hEncoderConfig;
hEncoderConfig->nchan_inp = 2;
hEncoderConfig->ivas_format = STEREO_FORMAT;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ hEncoderConfig->is_binaural = is_binaural;
+#endif
#ifdef DEBUGGING
switch ( stereoMode )
@@ -366,12 +402,8 @@ ivas_error IVAS_ENC_ConfigureForObjects(
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
-#ifdef TD5
- const uint16_t numObjects, /* i : number of objects to be encoded */
- const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */
-#else
- const uint16_t numObjects /* i : number of objects to be encoded */
-#endif
+ const uint16_t numObjects, /* i : number of objects to be encoded */
+ const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */
)
{
Encoder_Struct *st_ivas;
@@ -391,9 +423,9 @@ ivas_error IVAS_ENC_ConfigureForObjects(
st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT;
st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE;
st_ivas->hEncoderConfig->nchan_inp = numObjects;
-#ifdef TD5
+ st_ivas->hEncoderConfig->nchan_ism = numObjects;
st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata;
-#endif
+ hIvasEnc->extMetadataApi = ( ism_extended_metadata == 1 );
hIvasEnc->maxBandwidthUser = max_bwidth_user;
error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() );
@@ -433,11 +465,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata(
return IVAS_ERR_INDEX_OUT_OF_BOUNDS;
}
-#ifdef TD5
- error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch );
-#else
- error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation );
-#endif
+ error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag );
if ( error != IVAS_ERR_OK )
{
@@ -788,7 +816,7 @@ static ivas_error configureEncoder(
}
else if ( hEncoderConfig->ivas_format == ISM_FORMAT )
{
- if ( ( error = sanitizeBitrateISM( hEncoderConfig ) ) != IVAS_ERR_OK )
+ if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -885,19 +913,27 @@ static ivas_error configureEncoder(
return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." );
}
+#ifdef FIX_170_DTX_MASA
if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT &&
- ( ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113
- ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM
- ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation
- ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done
- hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD
+ ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done
+ hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD
) )
+#else
+ if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT &&
+ ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation
+ ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) ||
+ hEncoderConfig->ivas_format == MC_FORMAT ) )
+#endif
{
return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." );
}
#ifdef DEBUG_AGC_ENCODER_CMD_OPTION
- if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select( hEncoderConfig->ivas_total_brate ) == SBA_MODE_SPAR ) )
+#ifndef SBA_MODE_CLEAN_UP
+ if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select() == SBA_MODE_SPAR ) )
+#else
+ if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT ) )
+#endif
{
return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "AGC supported in SBA format at bitrates >= 24.4 kbps only." );
}
@@ -917,15 +953,20 @@ static ivas_error configureEncoder(
* Finalize initialization
*-----------------------------------------------------------------*/
- if ( ( error = ivas_init_encoder( st_ivas, hIvasEnc->ind_list, hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_init_encoder( st_ivas
+#ifndef IND_LIST_DYN
+ ,
+ hIvasEnc->ind_list
+#endif
+#ifndef IND_LIST_DYN
+ ,
+ hIvasEnc->ind_list_metadata
+#endif
+ ) ) != IVAS_ERR_OK )
{
return error;
}
- if ( hEncoderConfig->Opt_DTX_ON && ( hEncoderConfig->ivas_format == ISM_FORMAT ) && !( st_ivas->ism_mode == ISM_MODE_DISC && hEncoderConfig->nchan_inp == 1 ) && !( st_ivas->ism_mode == ISM_MODE_PARAM && ( hEncoderConfig->nchan_inp == 3 || hEncoderConfig->nchan_inp == 4 ) ) )
- {
- return IVAS_ERROR( IVAS_ERR_UNKNOWN, "DTX is not supported in this IVAS format and element mode." );
- }
if ( hEncoderConfig->ivas_format == MONO_FORMAT )
{
@@ -970,11 +1011,7 @@ ivas_error IVAS_ENC_GetDelay(
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
-#ifdef BINAURALIZATION_DELAY_REPORT
*delay = NS2SA( hEncoderConfig->input_Fs, get_delay( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) );
-#else
- *delay = NS2SA( hEncoderConfig->input_Fs, get_delay( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL, 0 ) );
-#endif
*delay *= hEncoderConfig->nchan_inp;
@@ -1066,6 +1103,9 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
ENCODER_CONFIG_HANDLE hEncoderConfig;
ENC_CORE_HANDLE hCoreCoder;
int16_t i;
+#ifdef IND_LIST_DYN
+ int16_t n, ch;
+#endif
ivas_error error;
error = IVAS_ERR_OK;
@@ -1133,6 +1173,89 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
hIvasEnc->switchingActive = true;
}
+#ifdef IND_LIST_DYN
+ /*-----------------------------------------------------------------*
+ * Re-allocate and re-initialize buffer of indices if IVAS total bitrate has changed
+ *-----------------------------------------------------------------*/
+
+ if ( hEncoderConfig->ivas_total_brate != hEncoderConfig->last_ivas_total_brate )
+ {
+ /* de-allocate old buffer of indices */
+ free( st_ivas->ind_list );
+
+ /* set the maximum allowed number of indices in the list */
+ st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate );
+
+ /* allocate new buffer of indices */
+ if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) );
+ }
+
+ /* reset the list of indices */
+ for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ )
+ {
+ st_ivas->ind_list[i].nb_bits = -1;
+ }
+
+ /* de-allocate old buffer of metadata indices */
+ if ( st_ivas->ind_list_metadata != NULL )
+ {
+ free( st_ivas->ind_list_metadata );
+ }
+
+ /* set the maximum allowed number of metadata indices in the list */
+ st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate );
+
+ if ( st_ivas->ivas_max_num_indices_metadata > 0 )
+ {
+ /* allocate new buffer of metadata indices */
+ if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL )
+ {
+ return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) );
+ }
+
+ /* reset the list of metadata indices */
+ for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ )
+ {
+ st_ivas->ind_list_metadata[i].nb_bits = -1;
+ }
+ }
+ else
+ {
+ st_ivas->ind_list_metadata = NULL;
+ }
+
+ /* set pointers to the new buffers of indices in each element */
+ for ( n = 0; n < st_ivas->nSCE; n++ )
+ {
+ st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list;
+ st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list;
+
+ if ( st_ivas->hSCE[n]->hMetaData != NULL )
+ {
+ st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata;
+ st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata;
+ }
+ }
+
+ for ( n = 0; n < st_ivas->nCPE; n++ )
+ {
+ for ( ch = 0; ch < CPE_CHANNELS; ch++ )
+ {
+ st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ind_list = st_ivas->ind_list;
+ st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list;
+ }
+
+ if ( st_ivas->hCPE[n]->hMetaData != NULL )
+ {
+ st_ivas->hCPE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata;
+ st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata;
+ }
+ }
+ }
+#endif
+
if ( hIvasEnc->switchingActive && hEncoderConfig->ivas_format == MONO_FORMAT )
{
copy_encoder_config( st_ivas, hCoreCoder, 0 );
@@ -1150,7 +1273,11 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
if ( hEncoderConfig->stereo_dmx_evs == 1 )
{
inputBufferSize /= 2;
+#ifdef BINAURAL_AUDIO_CMDLINE
+ stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural );
+#else
stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize );
+#endif
}
if ( hEncoderConfig->Opt_AMR_WB )
@@ -1189,7 +1316,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
* Main function to encode one frame to a compact bitstream (bytestream)
*---------------------------------------------------------------------*/
-/* IVAS_fmToDo: Currently unused and untested */
ivas_error IVAS_ENC_EncodeFrameToCompact(
IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */
int16_t *inputBuffer, /* i : PCM input */
@@ -1385,71 +1511,7 @@ const char *IVAS_ENC_GetErrorMessage(
ivas_error error /* i : encoder error code enum */
)
{
- switch ( error )
- {
- case IVAS_ERR_OK:
- return "no error";
- case IVAS_ERR_FAILED_ALLOC:
- return "Failed allocation error";
- case IVAS_ERR_WRONG_PARAMS:
- return "wrong parameters";
- case IVAS_ERR_INVALID_BANDWIDTH:
- return "invalid bandwidth";
- case IVAS_ERR_INVALID_DTX_UPDATE_RATE:
- return "invalid DTX update rate";
- case IVAS_ERR_INVALID_SAMPLING_RATE:
- return "invalid sampling rate";
- case IVAS_ERR_NOT_CONFIGURED:
- return "encoder has not been configured";
- case IVAS_ERR_INVALID_STEREO_MODE:
- return "invalid stereo mode";
- case IVAS_ERR_INVALID_CICP_INDEX:
- return "invalid CICP index";
- case IVAS_ERR_INVALID_BITRATE:
- return "invalid bitrate";
- case IVAS_ERR_INVALID_MASA_CONFIG:
- return "invalid MASA config";
- case IVAS_ERR_TOO_MANY_INPUTS:
- return "too many object inputs provided";
- case IVAS_ERR_INDEX_OUT_OF_BOUNDS:
- return "index out of bounds";
- case IVAS_ERR_INTERNAL:
- case IVAS_ERR_INTERNAL_FATAL:
- return "internal error";
- case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED:
- return "reconfigure not supported";
- case IVAS_ERR_INVALID_FEC_OFFSET:
- return "invalid FEC offset";
- case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE:
- return "invalid input buffer size";
- case IVAS_ERR_DTX_NOT_SUPPORTED:
- return "DTX is not supported in this IVAS format and element mode";
- case IVAS_ERR_UNEXPECTED_NULL_POINTER:
- return "unexpected NULL pointer";
- case IVAS_ERR_METADATA_NOT_EXPECTED:
- return "metadata input not expected for current configuration";
-#ifdef DEBUGGING
- case IVAS_ERR_INVALID_FORCE_MODE:
- return "invalid force mode";
-#endif
- case IVAS_ERR_NOT_IMPLEMENTED:
- return "not implemented";
- case IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH:
- return "mismatched timestamp";
- case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT:
- return "invalid metadata format";
- case IVAS_ERR_ISM_INVALID_METADATA_VALUE:
- return "invalid metadata value provided";
- case IVAS_ERR_FAILED_FILE_READ:
- return "could not read from file";
- case IVAS_ERR_NOT_SUPPORTED_OPTION:
- return "option not supported in this set-up";
- case IVAS_ERR_UNKNOWN:
- default:
- break;
- }
-
- return "unknown error";
+ return ivas_error_to_string( error );
}
@@ -1497,6 +1559,12 @@ static ivas_error printConfigInfo_enc(
if ( hEncoderConfig->stereo_dmx_evs )
{
fprintf( stdout, "IVAS format: stereo downmix to bit-exact EVS mono\n" );
+#ifdef BINAURAL_AUDIO_CMDLINE
+ if ( hEncoderConfig->is_binaural )
+ {
+ fprintf( stdout, "Optional indication: binaural audio\n" );
+ }
+#endif
}
else
{
@@ -1531,6 +1599,12 @@ static ivas_error printConfigInfo_enc(
{
fprintf( stdout, "IVAS format: stereo - MDCT stereo\n" );
}
+#endif
+#ifdef BINAURAL_AUDIO_CMDLINE
+ if ( hEncoderConfig->is_binaural )
+ {
+ fprintf( stdout, "Optional indication: binaural audio\n" );
+ }
#endif
}
else if ( hEncoderConfig->ivas_format == ISM_FORMAT )
@@ -1743,7 +1817,7 @@ static ivas_error setBitrate(
if ( hEncoderConfig->ivas_format == ISM_FORMAT )
{
- if ( ( error = sanitizeBitrateISM( hEncoderConfig ) ) != IVAS_ERR_OK )
+ if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -1982,7 +2056,8 @@ static ivas_error sanitizeBandwidth(
*---------------------------------------------------------------------*/
static ivas_error sanitizeBitrateISM(
- const ENCODER_CONFIG_HANDLE hEncoderConfig )
+ const ENCODER_CONFIG_HANDLE hEncoderConfig,
+ const IVAS_ENC_HANDLE hIvasEnc )
{
if ( hEncoderConfig->ivas_total_brate > IVAS_128k && hEncoderConfig->nchan_inp == 1 )
{
@@ -2014,12 +2089,14 @@ static ivas_error sanitizeBitrateISM(
return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
}
-#ifdef TD5
- if ( hEncoderConfig->ivas_total_brate < ISM_EXTENDED_METADATA_BRATE && hEncoderConfig->ism_extended_metadata_flag == 1 )
+ if ( hIvasEnc->extMetadataApi )
{
- return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for extended metadata format specified in IVAS: %d", hEncoderConfig->ivas_total_brate );
+ hEncoderConfig->ism_extended_metadata_flag = ( hEncoderConfig->ivas_total_brate >= ISM_EXTENDED_METADATA_BRATE );
+ }
+ else
+ {
+ hEncoderConfig->ism_extended_metadata_flag = 0;
}
-#endif
return IVAS_ERR_OK;
}
@@ -2276,11 +2353,10 @@ static void init_encoder_config(
hEncoderConfig->var_SID_rate_flag = 1;
hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID;
hEncoderConfig->stereo_dmx_evs = 0;
+ hEncoderConfig->nchan_ism = 0;
hEncoderConfig->sba_order = 0;
hEncoderConfig->sba_planar = 0;
-#ifdef TD5
hEncoderConfig->ism_extended_metadata_flag = 0;
-#endif
#ifdef DEBUGGING
hEncoderConfig->stereo_mode_cmdl = 0;
hEncoderConfig->force = -1;
diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h
index 37fd4b4deeeffe927a899fc08900998e221cb8f8..8d8ede4d77a534370aed3835b9b965d6de86f683 100644
--- a/lib_enc/lib_enc.h
+++ b/lib_enc/lib_enc.h
@@ -94,6 +94,13 @@ typedef enum _IVAS_ENC_MASA_VARIANT
IVAS_ENC_MASA_UNDEFINED = 0xffff
} IVAS_ENC_MASA_VARIANT;
+typedef enum _IVAS_ENC_COMPLEXITY_LEVEL
+{
+ IVAS_ENC_COMPLEXITY_LEVEL_ONE = 1,
+ IVAS_ENC_COMPLEXITY_LEVEL_TWO = 2,
+ IVAS_ENC_COMPLEXITY_LEVEL_THREE = 3
+} IVAS_ENC_COMPLEXITY_LEVEL;
+
#ifdef DEBUGGING
typedef enum _IVAS_ENC_STEREO_MODE
{
@@ -154,8 +161,13 @@ ivas_error IVAS_ENC_ConfigureForMono(
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
- const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */
+ const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */
+ const bool is_binaural /* i : if true, the input is binaural audio */
+#else
const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */
+#endif
);
/*! r: error code */
@@ -165,10 +177,15 @@ ivas_error IVAS_ENC_ConfigureForStereo(
const int32_t bitrate, /* i : requested bitrate of the output bitstream */
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
+#ifdef BINAURAL_AUDIO_CMDLINE
+ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
+ const bool is_binaural /* i : flag indicating if input is binaural audio */
+#else
const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
+#endif
#ifdef DEBUGGING
,
- const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */
+ const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */
#endif
);
@@ -180,12 +197,8 @@ ivas_error IVAS_ENC_ConfigureForObjects(
const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */
const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */
const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */
-#ifdef TD5
const uint16_t numObjects, /* i : number of objects to be encoded */
const bool ism_extended_metadata /* i : Extended metadata used (true/false), where extended metadata includes radius and orientation */
-#else
- const uint16_t numObjects /* i : number of objects to be encoded */
-#endif
);
/*! r: error code */
diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c
index 052bfbe96e5756518e94fe0c634fa9fb3fb9aa2e..66f8847608b989e47ec7068d02972d36203383db 100644
--- a/lib_enc/lsf_enc.c
+++ b/lib_enc/lsf_enc.c
@@ -45,10 +45,8 @@
#include "rom_com.h"
#include "prot.h"
#include "basop_proto_func.h"
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
#include "ivas_prot.h"
#include "ivas_rom_com.h"
-#endif
#include "wmc_auto.h"
/*-----------------------------------------------------------------*
@@ -85,10 +83,8 @@ void lsf_enc(
float *Aq, /* o : quantized A(z) for 4 subframes */
const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */
const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
)
{
int16_t i, nBits, force_sf, no_param_lpc;
@@ -184,12 +180,7 @@ void lsf_enc(
* LSF quantization
*-------------------------------------------------------------------------------------*/
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw,
- tdm_lsfQ_PCh );
-#else
- lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw );
-#endif
+ lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, tdm_lsfQ_PCh );
/* convert quantized LSFs back to LSPs */
lsf2lsp( lsf_new, lsp_new, M, st->sr_core );
@@ -450,11 +441,8 @@ void lsf_end_enc(
int16_t *lpc_param,
int16_t *no_indices,
int16_t *bits_param_lpc,
- const int16_t coder_type_raw
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
+ const int16_t coder_type_raw,
const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */
-#endif
)
{
int16_t i;
@@ -486,18 +474,13 @@ void lsf_end_enc(
int16_t *TCQIdx;
int16_t flag_1bit_gran;
BSTR_ENC_HANDLE hBstr = st->hBstr;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
float pred3[M];
int16_t dummy, dummy_v[5];
-#endif
flag_1bit_gran = ( st->element_mode > EVS_MONO );
nBits = nBits_in;
- if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */
-#endif
+ if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */
)
{
if ( coder_type_raw == VOICED )
@@ -571,7 +554,6 @@ void lsf_end_enc(
pred1[i] = ModeMeans[mode_lvq][i] + MU_MA * st->mem_MA[i];
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
/* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */
if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL )
{
@@ -580,7 +562,6 @@ void lsf_end_enc(
tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 );
}
-#endif
if ( predmode == 0 ) /* Safety-net only */
{
@@ -601,10 +582,8 @@ void lsf_end_enc(
safety_net = 0;
}
else /* Switched Safety-Net/AR prediction */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
{
if ( predmode == 2 )
-#endif
{
/* Subtract mean and AR prediction */
mvr2r( ModeMeans[mode_lvq], pred0, M );
@@ -684,7 +663,6 @@ void lsf_end_enc(
}
}
}
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
else /* of "if (predmode==2)" */
{
mvr2r( ModeMeans[mode_lvq], pred0, M );
@@ -734,7 +712,6 @@ void lsf_end_enc(
/* AR inter-frame prediction */
lsf_allocate( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 );
-
Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq );
if ( Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] )
@@ -750,7 +727,7 @@ void lsf_end_enc(
}
}
}
-#endif
+
/*--------------------------------------------------------------------------*
* Write indices to array
*--------------------------------------------------------------------------*/
@@ -758,10 +735,8 @@ void lsf_end_enc(
if ( st->codec_mode == MODE1 && st->core == ACELP_CORE )
{
/* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */
- if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- && ( st->idchan == 0 )
-#endif
+ if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->idchan == 0
+
)
{
/* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/
@@ -769,11 +744,7 @@ void lsf_end_enc(
}
/* write predictor selection bit */
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( predmode >= 2 )
-#else
- if ( predmode == 2 )
-#endif
{
push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 );
}
@@ -791,11 +762,7 @@ void lsf_end_enc(
else
{
cumleft = nBits;
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( predmode >= 2 )
-#else
- if ( predmode == 2 )
-#endif
{
/* subtract predictor selection bit */
cumleft = nBits - 1;
@@ -924,7 +891,6 @@ void lsf_end_enc(
}
else
{
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL )
{
/* intra mode*/
@@ -934,14 +900,11 @@ void lsf_end_enc(
}
else
{
-#endif
vq_dec_lvq( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1] );
v_add( qlsf, pred0, qlsf, M );
v_sub( qlsf, pred1, st->mem_MA, M );
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
}
-#endif
}
}
else
diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c
index a620dfac384f499c5d779d0048fc1ac5d0b89ece..9c7bed762948c8b29da305cca7bd148f4f5adad1 100644
--- a/lib_enc/lsf_msvq_ma_enc.c
+++ b/lib_enc/lsf_msvq_ma_enc.c
@@ -48,25 +48,282 @@
#define kMaxC 8
+
+#include "ivas_prot.h"
+
+// void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype );
+
+
+int16_t msvq_stage1_dct_search(
+ /* o : (p_max , best candidate sofar ) */
+ const float *u, /* i : target */
+ const int16_t N, /* i : target length and IDCT synthesis length */
+
+ /* parameterization of segmented DCT domain storage */
+ const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */
+
+ const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */
+ const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */
+ float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */
+
+ const float *midQ_truncQ, /* i: midQ vector */
+ const float *dct_invScaleF, /* i: global inv scale factors*/
+ const float *dct_scaleF, /* i: global scale factors*/
+ const Word16 n_segm, /* i: number of segments */
+ const Word16 *cols_per_segment, /* i: remaining length per segment */
+ const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */
+ const Word16 *entries_per_segment, /* i: number of rows per segment */
+ const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */
+
+ const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */
+ const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */
+ const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */
+ const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */
+ const Word16 npost_check, /*i: number of neigbours to check , should be even */
+
+ float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */
+ int16_t *indices_st1_local, /*o: selected cand indices */
+ float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */
+ float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */
+)
+{ /* stage1 search in a segmentwise truncated dct N domain without weights */
+
+ float dct_target[FDCNG_VQ_DCT_MAXTRUNC];
+ float u_mr[FDCNG_VQ_MAX_LEN];
+ float u_mr_scaled[FDCNG_VQ_MAX_LEN];
+ float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM];
+ float tmp, check_mse;
+ float mse; /* Word32 in BASOP */
+
+ int16_t p_max, c, c2, segm, j_full, j, i;
+ int16_t n_ana, p_mins[2], idx_min[2];
+
+ const Word8 *cbpW8;
+ const Word16 *dct_col_shift_tab;
+
+ float *st1_mse_pair;
+ int16_t *st1_idx_pair;
+
+ float tmp2;
+ int16_t check_ind[FDCNG_VQ_DCT_NPOST];
+ assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) );
+
+ assert( n_segm <= FDCNG_VQ_DCT_NSEGM );
+
+ n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */
+ assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */
+
+ /* remove mid stage#1 vector, in original input domain */
+ v_sub( u, midQ_truncQ, u_mr, n_ana );
+
+ v_multc( u_mr, dct_invScaleF[1], u_mr_scaled, n_ana ); /* scale up target to upscaled W8x storage domain */
+ /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */
+
+ dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix, max_dct_trunc, dcttype );
+
+ /* init search state ptr's at the top */
+ set_f( dist1_ptr, FLT_MAX, maxC_st1 );
+ st1_mse_pair = &( dist1_ptr[0] ); /* req. ptr post upd +=2 */
+ st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */
+ set_f( mse_trunc_segm, 0.0f, n_segm );
+
+ for ( segm = 0; segm < n_segm; segm++ )
+ { /* point to a new paired location for each segment */
+ p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */
+
+ /* compute segment common trunction error in dctN domain */
+ mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cols_per_segment[segm]] ) ), trunc_dct_cols_per_segment[segm] );
+
+ cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */
+
+ for ( j = 0; j < entries_per_segment[segm]; j++ )
+ {
+ /* unweighted segmented search DCT domain loop */
+ j_full = j + cum_entries_per_segment[segm]; /* or simply use j_full++ */
+
+ mse = mse_trunc_segm[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */
+
+ dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */
+
+ for ( c2 = 0; c2 < cols_per_segment[segm]; c2++ )
+ {
+#define WMC_TOOL_SKIP
+ tmp = dct_target[c2] - (float) ( ( (Word16) cbpW8[c2] ) << dct_col_shift_tab[c2] ); /* Word8 storage MSE inner loop */
+ LOGIC( 1 );
+ SHIFT( 1 );
+ ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/
+#undef WMC_TOOL_SKIP
+ mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/
+ }
+ st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic RAM, move32() in BASOP */
+
+#define WMC_TOOL_SKIP
+ cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */
+#undef WMC_TOOL_SKIP
+
+ /* overwrite with a new worst index at p_max */
+
+ /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */
+ if ( mse < st1_mse_pair[p_max] ) /* L_sub */
+ {
+ st1_idx_pair[p_max] = j_full; /* move16, single BASOP */
+ } /* BASOP 2 ops */
+
+ if ( st1_idx_pair[p_max] == j_full )
+ { /* idx updated --> also update mse */
+ st1_mse_pair[p_max] = mse; /* move32(), single BASOP */
+ } /* BASOP 3 ops */
+
+ /* avoid WC costly candidate list management by always updating p_max,
+ as we have only a pair in each segment to maintain */
+ p_max = 0; /* move16() */
+ if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/
+ {
+ p_max = 1; /* move16() */
+ } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */
+
+ /* Note: logical shift right not available in ANSI-C */
+ /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */
+ /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */
+
+ /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */
+ } /* j in section */
+
+ st1_mse_pair += 2; /* req. ptr init */
+ st1_idx_pair += 2; /* req. ptr init */
+
+ } /* next segment */
+
+ for ( j = 0; j < maxC_st1; j++ )
+ {
+ /* compute_full mse using stored DCT24 domain MSE's */
+ /* calculate MSE from stage1 inner using existing inner DCT domain variables */
+ dist1_ptr[j] *= dct_scaleF[2]; /* multiplication to get the DCT inner MSE scale to the correct input domain */
+ }
+
+ assert( ( maxC_st1 >= 3 ) );
+ assert( ( maxC_st1 <= 8 ) );
+
+ p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */
+
+ p_mins[0] = minimum( dist1_ptr, maxC_st1, NULL ); /* find best entry among all maxC_pre */
+ tmp = dist1_ptr[p_mins[0]];
+ dist1_ptr[p_mins[0]] = FLT_MAX; /* exclude 1st */
+
+ p_mins[1] = minimum( dist1_ptr, maxC_st1, NULL ); /* find 2nd best entry */
+ tmp2 = dist1_ptr[p_mins[1]];
+ dist1_ptr[p_mins[1]] = FLT_MAX; /* exclude 2nd */
+
+ dist1_ptr[p_mins[0]] = tmp; /* restore 1st */
+ dist1_ptr[p_mins[1]] = tmp2; /* restore 2nd */
+
+ idx_min[0] = indices_st1_local[p_mins[0]];
+ idx_min[1] = indices_st1_local[p_mins[1]];
+
+
+ /* use global exclusion list to never reselect the two (best) global MSE values sofar */
+ st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */
+ st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */
+
+ /* circular MSE-neigbour list in use to potentially replace some segment search candidates */
+ /* using both 1st and 2nd best neighbours in fwd and rev directions */
+ check_ind[0] = segm_neighbour_fwd[idx_min[0]];
+ check_ind[1] = segm_neighbour_rev[idx_min[0]];
+
+ check_ind[2] = segm_neighbour_fwd[idx_min[1]];
+ check_ind[3] = segm_neighbour_rev[idx_min[1]];
+
+ check_ind[4] = segm_neighbour_fwd[check_ind[0]];
+ check_ind[5] = segm_neighbour_rev[check_ind[1]];
+
+ check_ind[6] = segm_neighbour_fwd[check_ind[2]];
+ check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]];
+
+ for ( i = 0; i < npost_check; i++ )
+ {
+ /* move MSE from DCT-inner loop search to input synthesis domain */
+ /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */
+ check_mse = st1_mse_ptr[check_ind[i]] * dct_scaleF[2];
+
+ if ( check_mse < dist1_ptr[p_max] )
+ { /* new winner , replace worst */
+ dist1_ptr[p_max] = check_mse;
+ indices_st1_local[p_max] = check_ind[i];
+ st1_mse_ptr[check_ind[i]] = FLT_MAX; /* exclude, BASOP: move32() */
+ p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */
+ }
+ }
+
+ /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */
+ /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */
+ /* in the case that only a part of the IDCT N vector is in final use */
+
+ /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */
+ assert( N == 24 );
+ {
+ for ( c = 0; c < maxC_st1; c++ )
+ {
+ dec_FDCNG_MSVQ_stage1( indices_st1_local[c], N, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * N] ), NULL );
+ }
+ }
+
+ return p_max; /*ptr to worst performing candidate */
+}
+
+
+/* recalc MSE for fdcng WB(0..20) coeffs ,
+ essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search,
+ excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages
+*/
+int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( /* o : (updated p_max) */
+ const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */
+ const float *u, /* i : target signal */
+ const int16_t maxC_st1, /* i : number of candidates in stage1 */
+ float *dist_ptr /* i/o: updated MSE vector for stage1 */
+)
+{
+ int16_t p_max_local, c;
+ const float *p2;
+ float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB];
+
+ for ( c = 0; c < maxC_st1; c++ )
+ { /* point to extended synthesis part */
+ p2 = (const float *) &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */
+ /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */
+ v_sub( p2, &( u[FDCNG_VQ_MAX_LEN_WB] ), high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB );
+ res24 = dotp( high_diff, high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); /* sum squared over top env. values above WB coeffs */
+
+ dist_ptr[c] -= res24; /* remove DCT24 high band error contribution */
+ }
+
+ /* finally update p_max, as it may potentially change,
+ due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */
+ p_max_local = maximum( dist_ptr, maxC_st1, NULL );
+
+ return p_max_local;
+}
+
+
/*--------------------------------------------------------------------------*
* msvq_enc()
*
* MSVQ encoder
*--------------------------------------------------------------------------*/
-
void msvq_enc(
- const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
- const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
- const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
- const float u[], /* i : Vector to be encoded (prediction and mean removed) */
- const int16_t *levels, /* i : Number of levels in each stage */
- const int16_t maxC, /* i : Tree search size (number of candidates kept from */
- /* one stage to the next == M-best) */
- const int16_t stages, /* i : Number of stages */
- const float w[], /* i : Weights */
- const int16_t N, /* i : Vector dimension */
- const int16_t maxN, /* i : Codebook dimension */
- int16_t Idx[] /* o : Indices */
+ const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */
+ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */
+ const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */
+ const float u[], /* i : Vector to be encoded (prediction and mean removed) */
+ const int16_t *levels, /* i : Number of levels in each stage */
+ const int16_t maxC, /* i : Tree search size (number of candidates kept from */
+ /* one stage to the next == M-best) */
+ const int16_t stages, /* i : Number of stages */
+ const float w[], /* i : Weights */
+ const int16_t N, /* i : Vector dimension */
+ const int16_t maxN, /* i : Codebook dimension */
+ const int16_t applyDCT_flag, /* i : applyDCT flag */
+ float *invTrfMatrix, /*i/o : synthesis matrix */
+ int16_t Idx[] /* o : Indices */
)
{
float *resid[2], *dist[2];
@@ -77,9 +334,20 @@ void msvq_enc(
float resid_buf[2 * LSFMBEST_MAX * M_MAX], dist_buf[2 * LSFMBEST_MAX], Tmp[M_MAX];
int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX];
int16_t n, maxn, start;
+ float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */
+ float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */
+ int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */
+ assert( maxC <= LSFMBEST_MAX );
+ assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) );
+ /* top of resid_buf is resid[1] and used for stage#1 residuals (input target u),
+ we here reuse resid[0] part of the buffer for stage#1 DCT dynamic RAM needs */
+ st1_mse_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); /* reuse top of residual resid[0] scratch RAM for stage1 MSEs */
+
+ st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */
+
/*----------------------------------------------------------------*
- * Allocate memory for previous (parent) and current nodes.
+ * Allocate memory for previous (parent) and current nodes.
* Parent node is indexed [0], current node is indexed [1].
*----------------------------------------------------------------*/
@@ -159,84 +427,73 @@ void msvq_enc(
{
dist[1][j] = FLT_MAX;
}
- if ( !s ) /* means: m==1 */
+
+ if ( !s && applyDCT_flag != 0 ) /* means: m==1 */
{
- /* This loop is identical to the one below, except, that the inner
- loop over c=0..m is hardcoded to c=0, since m=1. */
- /* dist[0][0] */
- for ( j = 0; j < levels[s]; j++ )
+ /* stage 1 candidates search in truncated dct24 domain without any weights */
+ assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */
+ assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM );
+
+ p_max = msvq_stage1_dct_search( u, FDCNG_VQ_MAX_LEN, maxC,
+ DCT_T2_24_XX,
+ FDCNG_VQ_DCT_MAXTRUNC,
+ invTrfMatrix, /* i : IDCT synthesis matrix for dim N */
+ cdk1r_tr_midQ_truncQ, /* i: midQ vector */
+ fdcng_dct_invScaleF, /* i: global inv scale factors*/
+ fdcng_dct_scaleF, /* i: global scale factors*/
+ FDCNG_VQ_DCT_NSEGM, /* i: number of segments */
+ cdk1_ivas_cols_per_segment, /* i: remaining length per segment */
+ cdk1_ivas_trunc_dct_cols_per_segment, /* i: trunc length per segment */
+ cdk1_ivas_entries_per_segment, /* i: number of rows per segment */
+ cdk1_ivas_cum_entries_per_segment, /* i: number of cumulative entries */
+ cdk_37bits_ivas_stage1_W8Qx_dct_sections, /*i: Word8(byte) segment table ptrs */
+ stage1_dct_col_syn_shift, /*i: columnwise syn shift tables */
+ cdk1_ivas_segm_neighbour_fwd, /*i: circular neighbour list fwd */
+ cdk1_ivas_segm_neighbour_rev, /*i: circular neighbour list reverse */
+ FDCNG_VQ_DCT_NPOST, /*i: number of circ. neigbours to post check */
+ st1_mse_ptr, indices_st1_local, st1_syn_vec_ptr, dist[1] );
+
+
+ /* move established stage#1 indices to the global MSVQ list structure */
+ for ( c = 0; c < maxC; c++ )
{
- en = 0.0f;
- /* w,Tmp */
- /* Compute weighted codebook element and its energy */
- for ( c2 = 0; c2 < n; c2++ )
- {
- Tmp[start + c2] = w[start + c2] * cbp[c2];
- en += cbp[c2] * Tmp[start + c2];
- }
- cbp += maxn; /* pointer is incremented */
-
- pTmp = &resid[0][0];
- /* Tmp */
- tmp = ( *pTmp++ ) * Tmp[0];
- for ( c2 = 1; c2 < N; c2++ )
- {
- tmp += ( *pTmp++ ) * Tmp[c2];
- }
- tmp = en - 2.0f * tmp;
- tmp += dist[0][0];
- if ( tmp < dist[1][p_max] )
- {
- /* Replace worst */
- dist[1][p_max] = tmp;
- indices[1][p_max * stages] = j;
- parents[p_max] = 0;
-
- p_max = 0;
- for ( c2 = 1; c2 < maxC; c2++ )
- {
- if ( dist[1][c2] > dist[1][p_max] )
- {
- p_max = c2;
- }
- }
- } /* if (tmp <= dist[1][p_max]) */
- } /* for (j=0; j dist[1][p_max] )
+ {
+ p_max = c2;
+ }
+ }
+ } /* if (tmp <= dist[1][p_max]) */
+ } /* for(c=0; chSpMusClas != NULL )
{
+#ifdef FIX_483
+ float E;
+
+ E = mean( lf_E, 8 );
+ if ( E < 1.0f )
+ {
+ st->hSpMusClas->ener_RAT = 0.f;
+ }
+ else
+ {
+ st->hSpMusClas->ener_RAT = 10.0f * (float) log10( E );
+ st->hSpMusClas->ener_RAT /= ( Etot + 0.01f );
+ }
+#else
st->hSpMusClas->ener_RAT = 10.0f * (float) log10( mean( lf_E, 8 ) );
st->hSpMusClas->ener_RAT /= ( Etot + 0.01f );
@@ -385,6 +399,7 @@ void noise_est(
{
st->hSpMusClas->ener_RAT = 0.0f;
}
+#endif
if ( st->hSpMusClas->ener_RAT > 1.0 )
{
diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c
index 300cb79787d08451ccd6734198d38938badce4ed..82436a7dfccfe66ee5927de25526545248d559bd 100644
--- a/lib_enc/pre_proc.c
+++ b/lib_enc/pre_proc.c
@@ -219,7 +219,8 @@ void pre_proc(
* NB/WB/SWB/FB bandwidth detector
*----------------------------------------------------------------*/
- bw_detect( st, st->input, NULL, enerBuffer );
+ bw_detect( st, st->input, NULL, enerBuffer,
+ 0 );
/*----------------------------------------------------------------*
* Noise energy down-ward update and total noise energy estimation
@@ -253,7 +254,6 @@ void pre_proc(
* Select SID or FRAME_NO_DATA frame if DTX enabled
*-----------------------------------------------------------------*/
dtx( st, -1, vad_flag_dtx, inp_12k8 );
-
/*----------------------------------------------------------------*
* Adjust FD-CNG Noise Estimator
*----------------------------------------------------------------*/
@@ -616,7 +616,7 @@ void pre_proc(
st->gamma = GAMMA16k;
}
- st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode, MCT_CHAN_MODE_REGULAR ); /* TBV: needs checking */
+ st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode );
}
st->coder_type = st->coder_type_raw;
diff --git a/lib_enc/qlpc_stoch.c b/lib_enc/qlpc_stoch.c
index 8defb07034305ca3298c61478317cd05da8952fa..31021aee7fc20761b2438e3c2aa68e853979ddaf 100644
--- a/lib_enc/qlpc_stoch.c
+++ b/lib_enc/qlpc_stoch.c
@@ -103,7 +103,6 @@ void lpc_quantization(
/****** Low-rate LPC quantizer *******/
else if ( st->lpcQuantization == 1 )
{
-
lsp2lsf( lsp, lsf, M, st->sr_core );
force_sf = 0;
@@ -122,23 +121,13 @@ void lpc_quantization(
if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED )
{
- lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC, NULL );
nb_indices = *no_param_lpc;
}
else
{
- lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type
-#ifdef LSF_RE_USE_SECONDARY_CHANNEL
- ,
- NULL
-#endif
- );
+ lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type, NULL );
nb_indices = *no_param_lpc;
}
diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c
index cf8568e649db982127b0cd978a935d7f28b97b2f..fac0f01e4fd0e2b142534236ffba478e37a86c54 100644
--- a/lib_enc/speech_music_classif.c
+++ b/lib_enc/speech_music_classif.c
@@ -1828,6 +1828,7 @@ void ivas_smc_mode_selection(
float ton;
int16_t i;
float S_p2a, S_max, S_ave;
+ float thr_sp2a;
SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas;
@@ -1858,8 +1859,17 @@ void ivas_smc_mode_selection(
S_ave = sum_f( st->hSpMusClas->tod_lt_Bin_E, TOD_NSPEC ) / TOD_NSPEC;
S_p2a = S_max - S_ave;
+ if ( element_brate <= IVAS_16k4 )
+ {
+ thr_sp2a = THR_P2A_HIGH;
+ }
+ else
+ {
+ thr_sp2a = THR_P2A;
+ }
+
/* initial 3-way selection of coding modes (ACELP/GSC/TCX) */
- if ( relE > -10.0f && ( S_p2a > THR_P2A || ton > hSpMusClas->tod_thr_lt ) )
+ if ( relE > -10.0f && ( S_p2a > thr_sp2a || ton > hSpMusClas->tod_thr_lt ) )
{
/* select TCX to encode extremely peaky signals or strongly tonal signals */
st->sp_aud_decision1 = 1;
diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h
old mode 100644
new mode 100755
index ec7fb594d1a9d6c326de1f3964f895fd1c7ba01b..1a5c893dbd9816aa0c903d9bf64c86a0656ac730
--- a/lib_enc/stat_enc.h
+++ b/lib_enc/stat_enc.h
@@ -51,11 +51,20 @@
* Indice
*------------------------------------------------------------------------------------------*/
+#ifdef IND_LIST_DYN
+typedef struct
+{
+ int16_t id; /* id of the indice */
+ uint16_t value; /* value of the quantized indice */
+ int16_t nb_bits; /* number of bits used for the quantization of the indice */
+} Indice, *INDICE_HANDLE;
+#else
typedef struct
{
uint16_t value; /* value of the quantized indice */
int16_t nb_bits; /* number of bits used for the quantization of the indice */
} Indice;
+#endif
/*----------------------------------------------------------------------------------*
* Bitstream structure
@@ -63,11 +72,19 @@ typedef struct
typedef struct bitstream_enc_data_structure
{
+#ifdef IND_LIST_DYN
+ int16_t nb_ind_tot; /* total number of indices already written */
+#endif
int16_t nb_bits_tot; /* total number of bits already written */
Indice *ind_list; /* list of indices */
- int16_t next_ind; /* pointer to the next empty slot in the list of indices */
- int16_t last_ind; /* last written indice */
-
+#ifndef IND_LIST_DYN
+ int16_t next_ind; /* pointer to the next empty slot in the list of indices */
+ int16_t last_ind; /* last written indice */
+#endif
+#ifdef IND_LIST_DYN
+ int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */
+ Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */
+#endif
} BSTR_ENC_DATA, *BSTR_ENC_HANDLE;
/*----------------------------------------------------------------------------------*
@@ -1104,6 +1121,10 @@ typedef struct tcx_enc_structure
float *acelp_zir;
float tcx_target_bits_fac;
+#ifdef FIX_483b
+ int16_t tns_ms_flag[2];
+#endif
+
} TCX_ENC_DATA, *TCX_ENC_HANDLE;
/*----------------------------------------------------------------------------------*
*
diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c
index ba709f0158fee7c34847204f8e5984c5a50b61c9..8099b8cb073c000dc45f5458f172bde8db18e26b 100644
--- a/lib_enc/tcx_utils_enc.c
+++ b/lib_enc/tcx_utils_enc.c
@@ -1486,11 +1486,19 @@ void ProcessIGF(
}
else
{
+#ifdef IND_LIST_DYN
+ pBsStart = hBstr->nb_ind_tot;
+#else
pBsStart = hBstr->next_ind;
+#endif
IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag );
+#ifdef IND_LIST_DYN
+ bsBits = hBstr->nb_ind_tot - pBsStart;
+#else
bsBits = hBstr->next_ind - pBsStart;
+#endif
IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr );
}
@@ -1570,11 +1578,24 @@ void ProcessStereoIGF(
else
{
hBstr = sts[ch]->hBstr;
+#ifdef IND_LIST_DYN
+ pBsStart = hBstr->nb_ind_tot;
+#else
pBsStart = hBstr->next_ind;
-
+#endif
+#ifdef IND_LIST_DYN
+ if ( ch > 0 )
+ {
+ hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot;
+ }
+#endif
IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag );
+#ifdef IND_LIST_DYN
+ bsBits = hBstr->nb_ind_tot - pBsStart;
+#else
bsBits = hBstr->next_ind - pBsStart;
+#endif
IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr );
}
}
diff --git a/lib_enc/transient_detection.c b/lib_enc/transient_detection.c
index 91106686c091fe908b9fd9955a479335c6a42963..1f8b36819f22bfa028814c617b723c4f0760a872 100644
--- a/lib_enc/transient_detection.c
+++ b/lib_enc/transient_detection.c
@@ -324,86 +324,74 @@ void SetTCXModeInfo(
hTcxEnc->tcxMode = NO_TCX;
}
}
-
- if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE )
+ /* set the left window overlap */
+ if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE )
+ {
+ st->hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP;
+ }
+ else if ( ( hTcxEnc->tcxMode == TCX_10 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) )
+ {
+ st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP;
+ }
+ else
{
- hTcxEnc->tcxMode = TCX_20;
- *tcxModeOverlap = FULL_OVERLAP;
st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode;
}
-
- if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE )
+ /* determine the right window overlap */
+ if ( hTcxEnc->tcxMode == TCX_10 )
{
- /* set the left window overlap */
- if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE )
+ if ( hTranDet->transientDetector.attackIndex < 0 )
{
- st->hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP;
- }
- else if ( ( hTcxEnc->tcxMode == TCX_10 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) )
- {
- st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP;
+ *tcxModeOverlap = HALF_OVERLAP;
}
else
{
- st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode;
- }
-
- /* determine the right window overlap */
- if ( hTcxEnc->tcxMode == TCX_10 )
- {
- if ( hTranDet->transientDetector.attackIndex < 0 )
- {
- *tcxModeOverlap = HALF_OVERLAP;
- }
- else
+ *tcxModeOverlap = hTranDet->transientDetector.attackIndex % 4;
+ if ( *tcxModeOverlap == 1 )
{
- *tcxModeOverlap = hTranDet->transientDetector.attackIndex % 4;
- if ( *tcxModeOverlap == 1 )
- {
- *tcxModeOverlap = FULL_OVERLAP;
- }
- }
- if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT )
- {
- if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) )
- {
- *tcxModeOverlap = HALF_OVERLAP;
- }
+ *tcxModeOverlap = FULL_OVERLAP;
}
}
- else if ( hTcxEnc->tcxMode == TCX_20 )
+ if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT )
{
- if ( hTranDet->transientDetector.attackIndex == 7 )
+ if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) )
{
*tcxModeOverlap = HALF_OVERLAP;
}
- else if ( hTranDet->transientDetector.attackIndex == 6 )
- {
- *tcxModeOverlap = MIN_OVERLAP;
- }
- else
- {
- *tcxModeOverlap = ALDO_WINDOW;
- }
- if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT )
- {
- if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) )
- {
- *tcxModeOverlap = HALF_OVERLAP;
- }
- }
+ }
+ }
+ else if ( hTcxEnc->tcxMode == TCX_20 )
+ {
+ if ( hTranDet->transientDetector.attackIndex == 7 )
+ {
+ *tcxModeOverlap = HALF_OVERLAP;
+ }
+ else if ( hTranDet->transientDetector.attackIndex == 6 )
+ {
+ *tcxModeOverlap = MIN_OVERLAP;
}
else
{
- /* NO_TCX */
- *tcxModeOverlap = TRANSITION_OVERLAP;
- if ( st->element_mode == IVAS_CPE_MDCT )
+ *tcxModeOverlap = ALDO_WINDOW;
+ }
+ if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT )
+ {
+ if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) )
{
- hTcxEnc->tfm_mem = 0.75f;
+ *tcxModeOverlap = HALF_OVERLAP;
}
}
}
+ else
+ {
+ /* NO_TCX */
+ *tcxModeOverlap = TRANSITION_OVERLAP;
+ if ( st->element_mode == IVAS_CPE_MDCT )
+ {
+ hTcxEnc->tfm_mem = 0.75f;
+ }
+ }
/* for the ACELP -> TCX transition frames use full right window overlap */
if ( ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) && ( *tcxModeOverlap == ALDO_WINDOW ) )
diff --git a/lib_enc/transition_enc.c b/lib_enc/transition_enc.c
index ce13d7fa36ecf6e44293c41ba52b8c9f49efd7bf..925a6f1c322e2582ab7e214c0eade34cfbbdf055 100644
--- a/lib_enc/transition_enc.c
+++ b/lib_enc/transition_enc.c
@@ -178,7 +178,7 @@ void transition_enc(
if ( *tc_subfr == TC_0_0 )
{
/* this is called only to compute unused bits */
- config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ );
+ config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ );
}
*clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl );
@@ -274,7 +274,7 @@ void transition_enc(
if ( i_subfr - *tc_subfr <= L_SUBFR )
{
- config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ );
+ config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ );
}
/*-----------------------------------------------------------------*
diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c
index cc2d5fce36637a9b754806d76706c54bb838f73f..6b8c595f5e1ca9b36c3c728a48a6c8711b78772b 100644
--- a/lib_enc/updt_enc.c
+++ b/lib_enc/updt_enc.c
@@ -408,7 +408,7 @@ void updt_enc_common(
st->gamma = GAMMA16k;
}
- st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode, MCT_CHAN_MODE_REGULAR );
+ st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode );
}
/* update FER clas */
diff --git a/lib_enc/voiced_enc.c b/lib_enc/voiced_enc.c
index b32692b983a426cdd3b8435fcdd666e943612901..18a3305902680b9bea1ea5952820d76310fbae1f 100644
--- a/lib_enc/voiced_enc.c
+++ b/lib_enc/voiced_enc.c
@@ -498,7 +498,6 @@ ivas_error ppp_voiced_encoder(
error = IVAS_ERR_OK;
- /* TODO: deallocation missing */
if ( ( error = DTFS_new( &CURRP_NQ ) ) != IVAS_ERR_OK )
{
IVAS_ERROR( error, "Error creating DTFS structure" );
diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c
index ed0868b2ae50d76dde87013e0b8e1498305a60f5..3a993d08a1f853f1427ff381b857722b7ef25699 100644
--- a/lib_rend/ivas_crend.c
+++ b/lib_rend/ivas_crend.c
@@ -447,6 +447,273 @@ static ivas_error ivas_rend_initCrend(
}
else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
{
+#ifdef UPDATE_SBA_FILTER
+ if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 )
+ {
+ if ( output_Fs == 48000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j];
+ }
+ }
+ else if ( output_Fs == 32000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j];
+ }
+ }
+ else if ( output_Fs == 16000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j];
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
+ }
+ }
+ else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 )
+ {
+ if ( output_Fs == 48000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j];
+ }
+ }
+ else if ( output_Fs == 32000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j];
+ }
+ }
+ else if ( output_Fs == 16000 )
+ {
+ hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j];
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
+ }
+ }
+ else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA )
+ {
+ if ( output_Fs == 48000 )
+ {
+ hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j];
+ }
+ }
+ else if ( output_Fs == 32000 )
+ {
+ hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j];
+ }
+ }
+ else if ( output_Fs == 16000 )
+ {
+ hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s;
+ hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz;
+ hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j];
+ }
+ }
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j];
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" );
+ }
+#else
if ( output_Fs == 48000 )
{
hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s;
@@ -531,6 +798,7 @@ static ivas_error ivas_rend_initCrend(
{
return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" );
}
+#endif
}
else
{
@@ -632,6 +900,91 @@ static ivas_error ivas_rend_initCrend(
}
else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS )
{
+#ifdef UPDATE_SBA_FILTER
+ if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 )
+ {
+ hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s;
+ hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations;
+ hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j];
+ }
+ }
+ else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 )
+ {
+ hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s;
+ hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations;
+ hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im[j];
+ }
+ }
+ else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA )
+ {
+ hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_foa->latency_s;
+ hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations;
+ hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse;
+
+ for ( i = 0; i < hHrtf->max_num_ir; i++ )
+ {
+ hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight[i];
+
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j];
+ hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j];
+ hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re[i][j];
+ hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im[i][j];
+ }
+ }
+ for ( j = 0; j < BINAURAL_CHANNELS; j++ )
+ {
+ hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j];
+ hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j];
+ hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re[j];
+ hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im[j];
+ }
+ }
+ else
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" );
+ }
+ }
+#else
hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s;
hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations;
hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse;
@@ -660,6 +1013,7 @@ static ivas_error ivas_rend_initCrend(
{
return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" );
}
+#endif
}
pCrend->hHrtfCrend = hHrtf;
@@ -733,13 +1087,9 @@ ivas_error ivas_rend_openCrend(
const AUDIO_CONFIG inConfig,
const AUDIO_CONFIG outConfig,
RENDER_CONFIG_DATA *hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- int16_t Opt_Headrotation,
-#endif
HRTFS_CREND_HANDLE hSetOfHRTF,
const int32_t output_Fs )
{
- /* TODO tmu : Based on ivas_crend_open() - could be harmonized / refactored */
int16_t i, subframe_length;
int16_t max_total_ir_len;
HRTFS_HANDLE hHrtf;
@@ -942,8 +1292,13 @@ static ivas_error ivas_rend_crendConvolver(
const CREND_WRAPPER *pCrend,
IVAS_REND_AudioConfig inConfig,
IVAS_REND_AudioConfig outConfig,
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[],
+ float *pcm_out[],
+#else
float pcm_in[][L_FRAME48k],
float pcm_out[][L_FRAME48k],
+#endif
const int32_t output_Fs,
const int16_t i_ts )
{
@@ -952,9 +1307,17 @@ static ivas_error ivas_rend_crendConvolver(
int16_t lfe_idx_in;
int16_t offset, offset_in, offset_diffuse;
int16_t nchan_in, nchan_out;
+#ifdef UPDATE_SBA_FILTER
+ const float *pIn;
+#else
float *pIn;
+#endif
float *pFreq_buf_re, *pFreq_buf_im;
+#ifdef UPDATE_SBA_FILTER
+ const float *pFreq_filt_re, *pFreq_filt_im;
+#else
float *pFreq_filt_re, *pFreq_filt_im;
+#endif
float pOut[L_FRAME48k * 2];
float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k];
ivas_error error;
@@ -1112,12 +1475,19 @@ ivas_error ivas_rend_crendProcess(
#endif
IVAS_OUTPUT_SETUP_HANDLE hIntSetup,
EFAP_HANDLE hEFAPdata,
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: input/output audio channels */
+#else
float output[][L_FRAME48k], /* i/o: input/output audio channels */
+#endif
const int32_t output_Fs )
{
int16_t i, subframe_idx, output_frame, subframe_len;
int16_t nchan_out;
float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k];
+#ifdef JBM_TSM_ON_TCS
+ float *p_pcm_tmp[BINAURAL_CHANNELS];
+#endif
AUDIO_CONFIG in_config;
IVAS_REND_AudioConfigType inConfigType;
ivas_error error;
@@ -1156,6 +1526,14 @@ ivas_error ivas_rend_crendProcess(
output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC );
subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES;
+
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < BINAURAL_CHANNELS; i++ )
+ {
+ p_pcm_tmp[i] = pcm_tmp[i];
+ }
+#endif
+
for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ )
{
#ifdef EXTERNAL_ORIENTATIONS
@@ -1165,34 +1543,6 @@ ivas_error ivas_rend_crendProcess(
#endif
{
/* Orientation tracking */
-#ifndef FIX_I109_ORIENTATION_TRACKING
- if ( pCrend->hCrend->hTrack != NULL )
- {
- if ( hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG )
- {
- ivas_orient_trk_SetTrackingType( pCrend->hCrend->hTrack, OTR_TRACKING_AVG_ORIENT );
- }
- else
- {
- ivas_orient_trk_SetTrackingType( pCrend->hCrend->hTrack, OTR_TRACKING_REF_ORIENT );
- }
-
- /* get current subframe quaternion and convert to euler angles */
-#ifdef EXTERNAL_ORIENTATIONS
- Quat2Euler( hCombinedOrientationData->Quaternions[subframe_idx], &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) );
-#else
- Quat2Euler( hHeadTrackData->Quaternions[subframe_idx], &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) );
-#endif
- ivas_orient_trk_SetAbsoluteOrientation( pCrend->hCrend->hTrack, pCrend->hCrend->m_fYaw, pCrend->hCrend->m_fPitch, pCrend->hCrend->m_fRoll );
-
- if ( ( error = ivas_orient_trk_Process( pCrend->hCrend->hTrack ) ) != IVAS_ERR_OK )
- {
- return error;
- }
-
- ivas_orient_trk_GetTrackedOrientation( pCrend->hCrend->hTrack, &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) );
- }
-#endif
/* Rotation in SHD for:
MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL
@@ -1219,14 +1569,22 @@ ivas_error ivas_rend_crendProcess(
if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, p_pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
if ( pCrend->hCrend->hReverb != NULL )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, p_pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -1248,3 +1606,142 @@ ivas_error ivas_rend_crendProcess(
return IVAS_ERR_OK;
}
+
+
+#ifdef JBM_TSM_ON_TCS
+/*-----------------------------------------------------------------------------------------*
+ * Function ivas_rend_crendProcessSubframe()
+ *
+ *
+ *-----------------------------------------------------------------------------------------*/
+
+ivas_error ivas_rend_crendProcessSubframe(
+ const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */
+ const AUDIO_CONFIG inConfig, /* i : input audio configuration */
+ const AUDIO_CONFIG outConfig, /* i : output audio configuration */
+ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */
+ const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */
+ const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */
+ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */
+ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */
+ float *input_f[], /* i : transport channels */
+ float *output[], /* i/o: input/output audio channels */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ const int32_t output_Fs /* i : output sampling rate */
+)
+{
+ int16_t subframe_idx, subframe_len;
+ int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render;
+ float *tc_local[MAX_TRANSPORT_CHANNELS];
+ float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k];
+ float *p_pcm_tmp[BINAURAL_CHANNELS];
+ AUDIO_CONFIG in_config;
+ IVAS_REND_AudioConfigType inConfigType;
+ ivas_error error;
+ IVAS_REND_AudioConfig inRendConfig;
+ IVAS_REND_AudioConfig outRendConfig;
+
+ push_wmops( "ivas_rend_crendProcessSubframe" );
+
+ inRendConfig = getRendAudioConfigFromIvasAudioConfig( inConfig );
+ outRendConfig = getRendAudioConfigFromIvasAudioConfig( outConfig );
+
+ in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig );
+ inConfigType = getAudioConfigType( inRendConfig );
+
+ if ( ( error = getAudioConfigNumChannels( outRendConfig, &nchan_out ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ if ( ( error = getAudioConfigNumChannels( inRendConfig, &nchan_in ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ for ( ch = 0; ch < nchan_in; ch++ )
+ {
+ tc_local[ch] = input_f[ch];
+ }
+
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ p_pcm_tmp[ch] = pcm_tmp[ch];
+ }
+
+ slot_size = hTcBuffer->n_samples_granularity;
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size );
+ first_sf = hTcBuffer->subframes_rendered;
+ last_sf = first_sf;
+ hTcBuffer->slots_rendered += slots_to_render;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hTcBuffer->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity;
+
+ if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 )
+ {
+ /* Rotation in SHD for:
+ MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL
+ SBA SPAR -> BINAURAL or BINAURAL_ROOM
+ */
+ if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 )
+ {
+ rotateFrame_shd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, 0 );
+ }
+ /* Rotation in SD for MC -> BINAURAL_ROOM */
+ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup )
+ {
+ rotateFrame_sd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 );
+ }
+ }
+
+ if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) )
+ {
+ if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, tc_local, p_pcm_tmp, output_Fs, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+
+ if ( pCrend->hCrend->hReverb != NULL )
+ {
+ if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, tc_local, p_pcm_tmp, 0 ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+ for ( ch = 0; ch < nchan_in; ch++ )
+ {
+ tc_local[ch] += subframe_len;
+ }
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ p_pcm_tmp[ch] += subframe_len;
+ }
+ }
+ else
+ {
+ return IVAS_ERR_INVALID_INPUT_FORMAT;
+ }
+ }
+
+ /* move to output */
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render );
+ }
+
+ hTcBuffer->subframes_rendered = last_sf;
+ pop_wmops();
+
+ return IVAS_ERR_OK;
+}
+#endif
diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c
index cdd88c1937c659c491ba4c2915601f4100cb996d..2c84f5c4fa900e0cb2da330efba0964a8d40e567 100644
--- a/lib_rend/ivas_dirac_dec_binaural_functions.c
+++ b/lib_rend/ivas_dirac_dec_binaural_functions.c
@@ -40,6 +40,8 @@
#include "ivas_cnst.h"
#include "ivas_rom_binauralRenderer.h"
#include "ivas_rom_rend.h"
+#include "ivas_rom_com.h"
+
#ifdef DEBUGGING
#include "debug.h"
#endif
@@ -54,31 +56,62 @@
#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f )
#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f )
+/* powf(0.95f, 4.0f) for sub-frame smoothing instead of CLDFB slot */
+#define ADAPT_HTPROTO_IIR_FAC 0.81450625f
+
+#define ADAPT_HTPROTO_ILD_LIM_DB0 1.0f
+#define ADAPT_HTPROTO_ILD_LIM_DB1 4.0f
+#define ADAPT_HTPROTO_ROT_LIM_0 0.4f
+#define ADAPT_HTPROTO_ROT_LIM_1 0.8f
+
/*-------------------------------------------------------------------------
* Local function prototypes
*------------------------------------------------------------------------*/
+#ifdef JBM_TSM_ON_TCS
static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas,
#ifdef EXTERNAL_ORIENTATIONS
COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,
#endif
- float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, const uint8_t nSubframes );
-
-static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] );
+ float *output_f[], const int16_t nchan_transport, const int16_t subframe );
+#else
+static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas,
+#ifdef EXTERNAL_ORIENTATIONS
+ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,
+#endif
+ float output_f[][L_FRAME48k], const int16_t nchan_transport, const int16_t subframe );
+#endif
+static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] );
-static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const uint8_t firstSubframe, const uint8_t nSubFrames );
+static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe );
static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] );
-static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd );
+#ifdef JBM_TSM_ON_TCS
+static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe );
+
+static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] );
static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(
#ifdef EXTERNAL_ORIENTATIONS
- COMBINED_ORIENTATION_HANDLE hHeadTrackData,
+ COMBINED_ORIENTATION_HANDLE hHeadTrackData,
#else
- HEAD_TRACK_DATA_HANDLE hHeadTrackData,
+ HEAD_TRACK_DATA_HANDLE hHeadTrackData,
+#endif
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] );
+#else
+static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe );
+
+static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] );
+
+static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(
+#ifdef EXTERNAL_ORIENTATIONS
+ COMBINED_ORIENTATION_HANDLE hHeadTrackData,
+#else
+ HEAD_TRACK_DATA_HANDLE hHeadTrackData,
+#endif
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] );
#endif
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] );
static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor );
@@ -149,30 +182,6 @@ ivas_error ivas_dirac_dec_init_binaural_data(
set_zero( hBinaural->ChCrossImOutPrev, nBins );
hBinaural->renderStereoOutputInsteadOfBinaural = 0;
- hBinaural->useSubframeMode = 1;
-
- hBinaural->useTdDecorr = 0;
- if ( st_ivas->ivas_format == SBA_FORMAT )
- {
- if ( st_ivas->nchan_transport == 1 )
- {
- hBinaural->useTdDecorr = 1;
- }
- }
- else if ( st_ivas->ivas_format == MASA_FORMAT )
- {
- if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) || st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE )
- {
- hBinaural->useTdDecorr = 1;
- }
- }
- else if ( st_ivas->ivas_format == MC_FORMAT )
- {
- if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) )
- {
- hBinaural->useTdDecorr = 1;
- }
- }
for ( bin = 0; bin < nBins; bin++ )
{
@@ -200,42 +209,23 @@ ivas_error ivas_dirac_dec_init_binaural_data(
/* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */
if ( hBinaural->hReverb != NULL && ( ( hBinaural->hReverb->numBins != nBins ) ||
- ( hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) ||
- ( !hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX ) ) )
+ ( hBinaural->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) )
{
ivas_binaural_reverb_close( &( hBinaural->hReverb ) );
}
if ( hBinaural->hReverb == NULL )
{
- if ( hBinaural->useSubframeMode )
+ if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb,
+ nBins,
+ CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL,
+ st_ivas->hIntSetup.output_config,
+ output_Fs,
+ RENDERER_BINAURAL_PARAMETRIC_ROOM,
+ st_ivas->hHrtfFastConv,
+ st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
{
- if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb,
- nBins,
- CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL,
- st_ivas->hIntSetup.output_config,
- output_Fs,
- RENDERER_BINAURAL_PARAMETRIC_ROOM,
- st_ivas->hHrtfFastConv,
- st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
- {
- return error;
- }
- }
- else
- {
- if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb,
- nBins,
- CLDFB_NO_COL_MAX,
- NULL,
- st_ivas->hIntSetup.output_config,
- output_Fs,
- RENDERER_BINAURAL_PARAMETRIC_ROOM,
- st_ivas->hHrtfFastConv,
- st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK )
- {
- return error;
- }
+ return error;
}
}
}
@@ -250,36 +240,34 @@ ivas_error ivas_dirac_dec_init_binaural_data(
assert( false );
}
- if ( hBinaural->useTdDecorr )
+ if ( hBinaural->hTdDecorr == NULL )
{
- if ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_13k2 && st_ivas->ivas_format == SBA_FORMAT )
- {
- if ( hBinaural->hTdDecorr == NULL )
- {
- ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 1 );
- }
-
- if ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 )
- {
- hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR;
- }
- else
- {
- hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN;
- }
- }
- else
- {
- ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 0 );
- }
+ hBinaural->useTdDecorr = 0;
}
- else
+
+ if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) ) ) != IVAS_ERR_OK )
{
- ivas_td_decorr_dec_close( &( hBinaural->hTdDecorr ) );
+ return error;
}
+ hBinaural->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate );
+
st_ivas->hDiracDecBin = hBinaural;
+#ifdef JBM_TSM_ON_TCS
+ /* allocate transport channels*/
+ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL )
+ {
+ int16_t nchan_to_allocate;
+
+ nchan_to_allocate = 2 * BINAURAL_CHANNELS;
+ if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK )
+ {
+ return error;
+ }
+ }
+#endif
+
return IVAS_ERR_OK;
}
@@ -358,6 +346,77 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs(
return IVAS_ERR_OK;
}
+
+#ifdef JBM_TSM_ON_TCS
+/*-------------------------------------------------------------------------
+ * void ivas_dirac_dec_binaural_render()
+ *
+ *
+ *------------------------------------------------------------------------*/
+
+void ivas_dirac_dec_binaural_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ float *output_f[] /* o : rendered time signal */
+)
+{
+ int16_t slots_to_render, first_sf, last_sf, subframe_idx;
+ uint16_t slot_size, ch;
+ uint16_t nchan_out;
+ DIRAC_DEC_HANDLE hDirAC;
+ float *output_f_local[MAX_OUTPUT_CHANNELS];
+
+ hDirAC = st_ivas->hDirAC;
+ nchan_out = BINAURAL_CHANNELS;
+#ifdef DEBUGGING
+ assert( hDirAC );
+#endif
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] = output_f[ch];
+ }
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+
+ /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */
+ slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size );
+ *nSamplesRendered = slots_to_render * slot_size;
+ first_sf = hDirAC->subframes_rendered;
+ last_sf = first_sf;
+
+ while ( slots_to_render > 0 )
+ {
+ slots_to_render -= hDirAC->subframe_nbslots[last_sf];
+ last_sf++;
+ }
+
+#ifdef DEBUGGING
+ assert( slots_to_render == 0 );
+#endif
+ for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
+ {
+ int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx];
+ ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx );
+ for ( ch = 0; ch < nchan_out; ch++ )
+ {
+ output_f_local[ch] += n_samples_sf;
+ }
+ }
+
+ if ( hDirAC->slots_rendered == hDirAC->num_slots )
+ {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length;
+ }
+
+ *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size;
+
+ return;
+}
+#endif
+
+
/*-------------------------------------------------------------------------
* ivas_dirac_dec_binaural()
*
@@ -373,42 +432,106 @@ void ivas_dirac_dec_binaural(
const int16_t nchan_transport /* i : number of transport channels */
)
{
+ int16_t subframe;
+#ifdef JBM_TSM_ON_TCS
+ float cng_td_buffer[L_FRAME16k];
+ float *p_output[MAX_OUTPUT_CHANNELS];
+ int16_t ch;
+ int16_t slot_size;
+ int16_t numInChannels;
+
+ slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS );
+ for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ )
+ {
+ p_output[ch] = &output_f[ch][0];
+ }
+ numInChannels = nchan_transport;
+ if ( st_ivas->hOutSetup.separateChannelEnabled )
+ {
+ numInChannels++;
+ }
+ for ( ch = 0; ch < numInChannels; ch++ )
+ {
+ st_ivas->hTcBuffer->tc[ch] = &output_f[ch][0];
+ }
+
+ ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS );
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
+ {
+ ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS );
+ }
+#endif
+
if ( st_ivas->hDiracDecBin->useTdDecorr )
{
float *decorr_signal[BINAURAL_CHANNELS];
+#ifndef JBM_TSM_ON_TCS
int16_t ch;
+#endif
int16_t output_frame;
for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
{
decorr_signal[ch] = (float *) &( output_f[ch + BINAURAL_CHANNELS][0] );
+#ifdef JBM_TSM_ON_TCS
+ st_ivas->hTcBuffer->tc[ch + BINAURAL_CHANNELS] = decorr_signal[ch];
+#endif
}
output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );
+#ifdef JBM_TSM_ON_TCS
+ ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame );
+
+#else
ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame );
+#endif
}
- if ( st_ivas->hDiracDecBin->useSubframeMode )
+#ifdef JBM_TSM_ON_TCS
+ if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag )
{
- uint8_t subframe;
- for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ )
- {
+ Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0];
+ st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0];
+ generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna );
+ }
+#endif
+
+ for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ )
+ {
+#ifdef JBM_TSM_ON_TCS
+ int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe];
+
#ifdef EXTERNAL_ORIENTATIONS
- ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, output_f, nchan_transport, subframe, 1u );
+ ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, p_output, nchan_transport, subframe );
#else
- ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u );
+ ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe );
#endif
+
+ for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ )
+ {
+ p_output[ch] += n_samples_sf;
}
- }
- else
- {
+ st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + 1 ) % st_ivas->hDirAC->dirac_md_buffer_length;
+#else
#ifdef EXTERNAL_ORIENTATIONS
- ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES );
+ ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, output_f, nchan_transport, subframe );
#else
- ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES );
+ ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe );
+#endif
#endif
}
+#ifdef JBM_TSM_ON_TCS
+ for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ )
+ {
+ st_ivas->hTcBuffer->tc[ch] = NULL;
+ }
+#endif
+
return;
}
@@ -417,33 +540,39 @@ void ivas_dirac_dec_binaural(
* Local functions
*------------------------------------------------------------------------*/
+
static void ivas_dirac_dec_binaural_internal(
Decoder_Struct *st_ivas,
#ifdef EXTERNAL_ORIENTATIONS
COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,
#endif
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[],
+#else
float output_f[][L_FRAME48k],
+#endif
const int16_t nchan_transport,
- const uint8_t firstSubframe,
- const uint8_t nSubframes )
+ const int16_t subframe )
{
DIRAC_DEC_HANDLE hDirAC;
- uint8_t slot, ch, nBins, numInChannels;
- float Cldfb_RealBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- float Cldfb_ImagBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
+ int16_t slot, ch, numInChannels;
+ float Cldfb_RealBuffer_in[4][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float Cldfb_ImagBuffer_in[4][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
float Rmat[3][3];
- uint8_t firstSlot, slotEnd;
int16_t max_band_decorr;
DIFFUSE_DISTRIBUTION_DATA diffuseDistData;
+ int16_t nBins, offsetSamples;
#ifdef EXTERNAL_ORIENTATIONS
int16_t i, j;
#endif
- firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES );
- slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES );
-
hDirAC = st_ivas->hDirAC;
- nBins = (uint8_t) hDirAC->num_freq_bands;
+ nBins = hDirAC->num_freq_bands;
+#ifdef JBM_TSM_ON_TCS
+ offsetSamples = hDirAC->slots_rendered * nBins;
+#else
+ offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins;
+#endif
/* The input channel number at this processing function (not nchan_transport) */
numInChannels = BINAURAL_CHANNELS;
@@ -465,16 +594,25 @@ static void ivas_dirac_dec_binaural_internal(
Rmat[2][2] = 1.0f;
/* CLDFB Analysis of input */
- for ( slot = firstSlot; slot < slotEnd; slot++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
{
for ( ch = 0; ch < numInChannels; ch++ )
{
if ( ch == 0 || nchan_transport == 2 )
{
- cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ),
- Cldfb_RealBuffer_in[ch][slot],
- Cldfb_ImagBuffer_in[ch][slot],
- nBins, st_ivas->cldfbAnaDec[ch] );
+ cldfbAnalysis_ts(
+#ifdef JBM_TSM_ON_TCS
+ &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ),
+#else
+ &( output_f[ch][nBins * slot + offsetSamples] ),
+#endif
+ Cldfb_RealBuffer_in[ch][slot],
+ Cldfb_ImagBuffer_in[ch][slot],
+ nBins, st_ivas->cldfbAnaDec[ch] );
}
else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */
{
@@ -488,14 +626,24 @@ static void ivas_dirac_dec_binaural_internal(
if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag )
{
int16_t numCoreBands, b;
+ int16_t slotInFrame;
numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands;
+#ifdef JBM_TSM_ON_TCS
+ slotInFrame = hDirAC->slots_rendered + slot;
+#else
+ slotInFrame = subframe * CLDFB_SLOTS_PER_SUBFRAME + slot;
+#endif
generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom,
st_ivas->cldfbAnaDec[1],
+#ifdef JBM_TSM_ON_TCS
+ st_ivas->hTcBuffer->tc[nchan_transport],
+#else
&( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/
+#endif
Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot],
- slot,
+ slotInFrame,
st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna,
( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag );
@@ -503,7 +651,7 @@ static void ivas_dirac_dec_binaural_internal(
st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/
NULL,
Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot],
- slot,
+ slotInFrame,
st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna,
( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag );
@@ -545,10 +693,15 @@ static void ivas_dirac_dec_binaural_internal(
{
for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ )
{
- cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ),
- Cldfb_RealBuffer_in[ch][slot],
- Cldfb_ImagBuffer_in[ch][slot],
- nBins, st_ivas->cldfbAnaDec[ch] );
+ cldfbAnalysis_ts(
+#ifdef JBM_TSM_ON_TCS
+ &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ),
+#else
+ &( output_f[ch][nBins * slot + offsetSamples] ),
+#endif
+ Cldfb_RealBuffer_in[ch][slot],
+ Cldfb_ImagBuffer_in[ch][slot],
+ nBins, st_ivas->cldfbAnaDec[ch] );
if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT )
{
@@ -559,13 +712,17 @@ static void ivas_dirac_dec_binaural_internal(
}
}
+#ifndef SBA_MODE_CLEAN_UP
if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT )
+#endif
{
st_ivas->hDirAC->hDiffuseDist = &diffuseDistData;
- ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes );
+ ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe );
- ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes );
+ ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe );
}
#ifdef EXTERNAL_ORIENTATIONS
@@ -586,16 +743,24 @@ static void ivas_dirac_dec_binaural_internal(
#else
if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 )
{
- QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[firstSubframe], Rmat );
+ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[subframe], Rmat );
if ( nchan_transport == 2 )
{
- ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat );
+#ifdef JBM_TSM_ON_TCS
+ adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat );
+
+ ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat );
+#else
+ adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat );
+
+ ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat );
+#endif
}
#endif
}
- ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, firstSubframe, nSubframes );
+ ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe );
if ( st_ivas->ivas_format == ISM_FORMAT )
{
@@ -612,19 +777,27 @@ static void ivas_dirac_dec_binaural_internal(
ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat );
- ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, firstSlot, slotEnd );
+ ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, subframe );
st_ivas->hDirAC->hDiffuseDist = NULL;
+
+#ifdef JBM_TSM_ON_TCS
+ hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe];
+ hDirAC->subframes_rendered++;
+#else
+ hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length;
+#endif
+
return;
}
static void ivas_dirac_dec_decorrelate_slot(
DIRAC_DEC_HANDLE hDirAC,
- const int8_t slot,
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
+ const int16_t slot,
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
float decRe[][CLDFB_NO_CHANNELS_MAX],
float decIm[][CLDFB_NO_CHANNELS_MAX] )
{
@@ -671,16 +844,18 @@ static void ivas_dirac_dec_decorrelate_slot(
return;
}
+#ifdef JBM_TSM_ON_TCS
+#endif
+
static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices(
Decoder_Struct *st_ivas,
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
float Rmat[3][3],
- const uint8_t firstSubframe,
- const uint8_t nSubframes )
+ const int16_t subframe )
{
- uint8_t ch, slot, bin, subframe;
+ int16_t ch, slot, bin;
uint8_t separateCenterChannelRendering;
int16_t nBins, idx;
float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX];
@@ -691,6 +866,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX];
uint8_t applyLowBitRateEQ;
int16_t dirac_read_idx;
+ float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX];
hDirAC = st_ivas->hDirAC;
h = st_ivas->hDiracDecBin;
@@ -731,282 +907,291 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
}
}
- /* Formulate input and target covariance matrices combining all subframes */
- for ( subframe = firstSubframe; subframe < ( firstSubframe + nSubframes ); subframe++ )
+ /* Formulate input and target covariance matrices for this subframe */
+ set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX );
+#ifdef JBM_TSM_ON_TCS
+ dirac_read_idx = hDirAC->render_to_md_map[subframe];
+#else
+ dirac_read_idx = hDirAC->dirac_read_idx;
+#endif
+
+ /* Calculate input covariance matrix */
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ )
+#else
+ for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ )
+#endif
{
- float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX];
+ for ( bin = 0; bin < nBins; bin++ )
+ {
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ float instEne;
- set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX );
- dirac_read_idx = hDirAC->dirac_read_idx;
+ instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] );
+ instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
+ h->ChEne[ch][bin] += instEne;
+ subFrameTotalEne[bin] += instEne;
+ }
+ h->ChCrossRe[bin] += inRe[0][slot][bin] * inRe[1][slot][bin];
+ h->ChCrossRe[bin] += inIm[0][slot][bin] * inIm[1][slot][bin];
+ h->ChCrossIm[bin] += inRe[0][slot][bin] * inIm[1][slot][bin];
+ h->ChCrossIm[bin] -= inIm[0][slot][bin] * inRe[1][slot][bin];
+ }
+ }
- /* Calculate input covariance matrix */
- for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ )
+ /* Apply EQ at low bit rates */
+ if ( applyLowBitRateEQ )
+ {
+ int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1;
+
+ for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ )
+ {
+ subFrameTotalEne[bin] *= lowBitRateEQ[bin];
+ }
+ for ( ; bin < nBins; bin++ )
{
- int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe );
+ subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin];
+ }
+ }
+
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 )
+ {
+ float tempRe, tempIm;
+
+ set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX );
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ )
+#else
+ for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ )
+#endif
+ {
for ( bin = 0; bin < nBins; bin++ )
{
- for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
- {
- float instEne;
-
- instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] );
- instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] );
- h->ChEne[ch][bin] += instEne;
- subFrameTotalEne[bin] += instEne;
- }
- h->ChCrossRe[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin];
- h->ChCrossRe[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin];
- h->ChCrossIm[bin] += inRe[0][slotThis][bin] * inIm[1][slotThis][bin];
- h->ChCrossIm[bin] -= inIm[0][slotThis][bin] * inRe[1][slotThis][bin];
+ tempRe = inRe[0][slot][bin] + inRe[1][slot][bin];
+ tempIm = inIm[0][slot][bin] + inIm[1][slot][bin];
+ subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm;
}
}
+ }
- /* Apply EQ at low bit rates */
- if ( applyLowBitRateEQ )
+ /* Determine target covariance matrix containing target binaural properties */
+ for ( bin = 0; bin < nBins; bin++ )
+ {
+ float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */
+ float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */
+ float diffEne, dirEne, meanEnePerCh;
+ int16_t dirIndex;
+
+ /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f.
+ * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the
+ * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match
+ * the early spectrum of the BRIR data, using the spectral correction data in
+ * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */
+ meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f;
+
+ /* Determine direct part target covariance matrix (for 1 or 2 directions) */
+ for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ )
{
- int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1;
+ int16_t aziDeg, eleDeg;
+ float lRealp, lImagp, rRealp, rImagp;
+ float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp;
+ float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio;
- for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ )
+ if ( dirIndex == 0 ) /* For first of the two simultaneous directions */
{
- subFrameTotalEne[bin] *= lowBitRateEQ[bin];
+ aziDeg = hDirAC->azimuth[dirac_read_idx][bin];
+ eleDeg = hDirAC->elevation[dirac_read_idx][bin];
+ ratio = hDirAC->energy_ratio1[dirac_read_idx][bin];
+ spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin];
}
- for ( ; bin < nBins; bin++ )
+ else /* For second of the two simultaneous directions */
{
- subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin];
+ aziDeg = hDirAC->azimuth2[dirac_read_idx][bin];
+ eleDeg = hDirAC->elevation2[dirac_read_idx][bin];
+ ratio = hDirAC->energy_ratio2[dirac_read_idx][bin];
+ spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin];
}
- }
-
- if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 )
- {
- float tempRe, tempIm;
+ diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */
- set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX );
-
- for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ )
+ if ( separateCenterChannelRendering )
{
- int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe );
-
- for ( bin = 0; bin < nBins; bin++ )
- {
- tempRe = inRe[0][slotThis][bin] + inRe[1][slotThis][bin];
- tempIm = inIm[0][slotThis][bin] + inIm[1][slotThis][bin];
- subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm;
- }
+ /* In masa + mono rendering mode, the center directions originate from phantom sources, so the
+ * spread coherence is increased */
+ float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh;
+
+ aziRad = (float) aziDeg * PI_OVER_180;
+ eleRad = (float) eleDeg * PI_OVER_180;
+ doaVectorX = cosf( aziRad ) * cosf( eleRad );
+ spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI;
+ altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f );
+ spreadCoh = max( spreadCoh, altSpreadCoh );
}
- }
- /* Determine target covariance matrix containing target binaural properties */
- for ( bin = 0; bin < nBins; bin++ )
- {
- float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */
- float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */
- float diffEne, dirEne, meanEnePerCh;
- uint16_t dirIndex;
-
- /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f.
- * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the
- * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match
- * the early spectrum of the BRIR data, using the spectral correction data in
- * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */
- meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f;
+ getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat );
- /* Determine direct part target covariance matrix (for 1 or 2 directions) */
- for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ )
+ if ( h->renderStereoOutputInsteadOfBinaural )
{
- int16_t aziDeg, eleDeg;
- float lRealp, lImagp, rRealp, rImagp;
- float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp;
- float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio;
+ /* Synthesizing spread coherence is not needed for stereo loudspeaker output,
+ * as directional sound is reproduced with two loudspeakers in any case */
+ spreadCoh = 0.0f;
+ }
- if ( dirIndex == 0 ) /* For first of the two simultaneous directions */
+ if ( spreadCoh > 0.0f )
+ {
+ float centerMul, sidesMul;
+ float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor;
+ float w1, w2, w3, eq;
+
+ hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp );
+
+ /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing.
+ * The following formulas determine the gains for these sources.
+ * spreadCoh = 0: Only panning
+ * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi)
+ * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */
+ if ( spreadCoh < 0.5f )
{
- aziDeg = hDirAC->azimuth[dirac_read_idx][bin];
- eleDeg = hDirAC->elevation[dirac_read_idx][bin];
- ratio = hDirAC->energy_ratio1[dirac_read_idx][bin];
- spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin];
+ /* 0.0f < spreadCoh < 0.5f */
+ sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */
+ centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul;
}
- else /* For second of the two simultaneous directions */
+ else
{
- aziDeg = hDirAC->azimuth2[dirac_read_idx][bin];
- eleDeg = hDirAC->elevation2[dirac_read_idx][bin];
- ratio = hDirAC->energy_ratio2[dirac_read_idx][bin];
- spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin];
+ /* 0.5f <= spreadCoh < 1.0f */
+ centerMul = 2.0f - ( 2.0f * spreadCoh );
+ sidesMul = inv_sqrt( centerMul + 2.0f );
+ centerMul *= sidesMul;
}
- diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */
- if ( separateCenterChannelRendering )
+ /* Apply the gain for the center source of the three coherent sources */
+ lRealp *= centerMul;
+ lImagp *= centerMul;
+ rRealp *= centerMul;
+ rImagp *= centerMul;
+
+ /* Apply the gain for the left source of the three coherent sources */
+ getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat );
+
+ hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
+ lRealp += sidesMul * lRealpTmp;
+ lImagp += sidesMul * lImagpTmp;
+ rRealp += sidesMul * rRealpTmp;
+ rImagp += sidesMul * rImagpTmp;
+
+ /* Apply the gain for the right source of the three coherent sources.
+ * -30 degrees to 330 wrapping due to internal functions. */
+ getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat );
+
+ hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
+ lRealp += sidesMul * lRealpTmp;
+ lImagp += sidesMul * lImagpTmp;
+ rRealp += sidesMul * rRealpTmp;
+ rImagp += sidesMul * rImagpTmp;
+
+ /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */
+ hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp );
+ eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) +
+ ( hrtfEneCenter * centerMul * centerMul ) ) /
+ max( 1e-12f, hrtfEneRealized );
+
+ /* Weighting factors to determine appropriate target spectrum for spread coherent sound */
+ if ( spreadCoh < 0.5 )
{
- /* In masa + mono rendering mode, the center directions originate from phantom sources, so the
- * spread coherence is increased */
- float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh;
-
- aziRad = (float) aziDeg * PI_OVER_180;
- eleRad = (float) eleDeg * PI_OVER_180;
- doaVectorX = cosf( aziRad ) * cosf( eleRad );
- spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI;
- altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f );
- spreadCoh = max( spreadCoh, altSpreadCoh );
+ w1 = 1.0f - 2.0f * spreadCoh;
+ w2 = 2.0f * spreadCoh;
+ w3 = 0.0f;
}
-
- getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat );
-
- if ( h->renderStereoOutputInsteadOfBinaural )
+ else
{
- /* Synthesizing spread coherence is not needed for stereo loudspeaker output,
- * as directional sound is reproduced with two loudspeakers in any case */
- spreadCoh = 0.0f;
+ w1 = 0.0f;
+ w2 = 2.0f - 2.0f * spreadCoh;
+ w3 = 2.0f * spreadCoh - 1.0f;
}
- if ( spreadCoh > 0.0f )
+ if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
{
- float centerMul, sidesMul;
- float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor;
- float w1, w2, w3, eq;
-
- hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp );
-
- /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing.
- * The following formulas determine the gains for these sources.
- * spreadCoh = 0: Only panning
- * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi)
- * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */
- if ( spreadCoh < 0.5f )
- {
- /* 0.0f < spreadCoh < 0.5f */
- sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */
- centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul;
- }
- else
- {
- /* 0.5f <= spreadCoh < 1.0f */
- centerMul = 2.0f - ( 2.0f * spreadCoh );
- sidesMul = inv_sqrt( centerMul + 2.0f );
- centerMul *= sidesMul;
- }
+ idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 );
- /* Apply the gain for the center source of the three coherent sources */
- lRealp *= centerMul;
- lImagp *= centerMul;
- rRealp *= centerMul;
- rImagp *= centerMul;
-
- /* Apply the gain for the left source of the three coherent sources */
- getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat );
-
- hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
- lRealp += sidesMul * lRealpTmp;
- lImagp += sidesMul * lImagpTmp;
- rRealp += sidesMul * rRealpTmp;
- rImagp += sidesMul * rImagpTmp;
-
- /* Apply the gain for the right source of the three coherent sources.
- * -30 degrees to 330 wrapping due to internal functions. */
- getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat );
-
- hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp );
- lRealp += sidesMul * lRealpTmp;
- lImagp += sidesMul * lImagpTmp;
- rRealp += sidesMul * rRealpTmp;
- rImagp += sidesMul * rImagpTmp;
-
- /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */
- hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp );
- eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) +
- ( hrtfEneCenter * centerMul * centerMul ) ) /
- max( 1e-12f, hrtfEneRealized );
-
- /* Weighting factors to determine appropriate target spectrum for spread coherent sound */
- if ( spreadCoh < 0.5 )
+ /* Apply the target spectrum to the eneCorrectionFactor */
+ if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */
{
- w1 = 1.0f - 2.0f * spreadCoh;
- w2 = 2.0f * spreadCoh;
- w3 = 0.0f;
+ eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx];
}
else
{
- w1 = 0.0f;
- w2 = 2.0f - 2.0f * spreadCoh;
- w3 = 2.0f * spreadCoh - 1.0f;
+ eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx];
}
-
- if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
- {
- idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 );
-
- /* Apply the target spectrum to the eneCorrectionFactor */
- if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */
- {
- eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx];
- }
- else
- {
- eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx];
- }
- }
-
- /* Equalize the spread coherent combined HRTFs */
- eq = min( 4.0f, sqrtf( eneCorrectionFactor ) );
- lRealp *= eq;
- lImagp *= eq;
- rRealp *= eq;
- rImagp *= eq;
}
- hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp );
- hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp );
- hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp );
- hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp );
-
- /* Add direct part (1 or 2) covariance matrix */
- dirEne = ratio * meanEnePerCh;
- h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/
- h->ChEneOut[1][bin] += dirEne * hrtfEne[1];
- h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */
- h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */
+ /* Equalize the spread coherent combined HRTFs */
+ eq = min( 4.0f, sqrtf( eneCorrectionFactor ) );
+ lRealp *= eq;
+ lImagp *= eq;
+ rRealp *= eq;
+ rImagp *= eq;
}
- /* Add diffuse / ambient part covariance matrix */
- diffuseness = max( 0.0f, diffuseness );
- diffEne = diffuseness * meanEnePerCh;
- surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin];
- if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
+ hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp );
+ hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp );
+ hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp );
+ hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp );
+
+ /* Add direct part (1 or 2) covariance matrix */
+ dirEne = ratio * meanEnePerCh;
+ h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/
+ h->ChEneOut[1][bin] += dirEne * hrtfEne[1];
+ h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */
+ h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */
+ }
+
+ /* Add diffuse / ambient part covariance matrix */
+ diffuseness = max( 0.0f, diffuseness );
+ diffEne = diffuseness * meanEnePerCh;
+ surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin];
+ if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) )
+ {
+ if ( !h->renderStereoOutputInsteadOfBinaural )
{
- if ( !h->renderStereoOutputInsteadOfBinaural )
- {
- idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 );
- /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */
- diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx];
- }
+ idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 );
+ /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */
+ diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx];
}
- h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/
- h->ChEneOut[1][bin] += diffEne;
+ }
+ h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/
+ h->ChEneOut[1][bin] += diffEne;
- if ( h->renderStereoOutputInsteadOfBinaural )
+ if ( h->renderStereoOutputInsteadOfBinaural )
+ {
+ /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */
+ h->ChCrossReOut[bin] += surCoh * diffEne;
+ }
+ else /* When rendering binaural, ambience has frequency dependent ICC. */
+ {
+#ifndef SBA_MODE_CLEAN_UP
+ if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS )
+#else
+ if ( st_ivas->ivas_format == SBA_FORMAT && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS )
+#endif
{
- /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */
- h->ChCrossReOut[bin] += surCoh * diffEne;
+ float diffuseFieldCoherence;
+#ifdef JBM_TSM_ON_TCS
+ diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin];
+#else
+ diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin];
+#endif
+ h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne;
}
- else /* When rendering binaural, ambience has frequency dependent ICC. */
+ else
{
- if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS )
- {
- float diffuseFieldCoherence;
- diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin];
- h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne;
- }
- else
- {
- h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne;
- }
+ h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne;
}
-
- /* Store parameters for formulating average diffuseness over frame */
- h->frameMeanDiffuseness[bin] += diffEne;
- frameMeanDiffusenessEneWeight[bin] += meanEnePerCh;
}
- hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length;
+ /* Store parameters for formulating average diffuseness over frame */
+ h->frameMeanDiffuseness[bin] += diffEne;
+ frameMeanDiffusenessEneWeight[bin] += meanEnePerCh;
}
/* Formulate average diffuseness over frame */
@@ -1026,11 +1211,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric
/* Temporal IIR-type smoothing of covariance matrices */
if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE )
{
- IIReneLimiterFactor = 16.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor );
+ IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor );
}
else
{
- IIReneLimiterFactor = 8.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor );
+ IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor );
}
for ( bin = 0; bin < nBins; bin++ )
{
@@ -1086,7 +1271,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
const int16_t max_band_decorr,
float Rmat[3][3] )
{
- uint8_t chA, chB, bin;
+ int16_t chA, chB, bin;
uint8_t separateCenterChannelRendering;
int16_t nBins;
DIRAC_DEC_BIN_HANDLE h;
@@ -1112,7 +1297,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
h->ChCrossRe[bin], h->ChCrossIm[bin],
h->ChEneOut[0][bin], h->ChEneOut[1][bin],
h->ChCrossReOut[bin], h->ChCrossImOut[bin],
- prototypeMtx, Mre, Mim, 1.0f );
+ prototypeMtx, Mre, Mim, h->reqularizationFactor );
/* Load estimated covariance matrix to the [2][2] matrix form */
CxRe[0][0] = h->ChEne[0][bin];
@@ -1251,40 +1436,63 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices(
static void ivas_dirac_dec_binaural_process_output(
Decoder_Struct *st_ivas,
+#ifdef JBM_TSM_ON_TCS
+ float *output_f[],
+#else
float output_f[][L_FRAME48k],
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
+#endif
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
const int16_t max_band_decorr,
- const uint8_t numInChannels,
- const uint8_t firstSlot,
- const uint8_t slotEnd )
+ const int16_t numInChannels,
+ const int16_t subframe )
{
- uint8_t slot, bin, chA, chB;
+ int16_t slot, bin, chA, chB;
int16_t nBins;
float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX];
float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX];
- float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
- uint8_t numSlots;
+ float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
+ float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
DIRAC_DEC_BIN_HANDLE h;
float interpVal;
float *decSlotRePointer;
float *decSlotImPointer;
+ int16_t offsetSamples;
+#ifdef JBM_TSM_ON_TCS
+ int16_t nSlots;
+#endif
- numSlots = slotEnd - firstSlot;
h = st_ivas->hDiracDecBin;
nBins = st_ivas->hDirAC->num_freq_bands;
+#ifdef JBM_TSM_ON_TCS
+ offsetSamples = 0;
+ nSlots = st_ivas->hDirAC->subframe_nbslots[subframe];
+#else
+ offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins;
+#endif
if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
{
/* Process second / room effect part of binaural output when needed */
- ivas_binaural_reverb_processFrame( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm, firstSlot );
+#ifdef JBM_TSM_ON_TCS
+ ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm );
+#else
+ ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm );
+#endif
}
interpVal = 0.0f;
- for ( slot = firstSlot; slot < ( firstSlot + numSlots ); slot++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
{
- interpVal += 1.0f / (float) numSlots;
+#ifdef JBM_TSM_ON_TCS
+ interpVal += 1.0f / (float) nSlots;
+#else
+ interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME );
+#endif
if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 )
{
ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm );
@@ -1353,7 +1561,7 @@ static void ivas_dirac_dec_binaural_process_output(
outSlotImPr = &( outSlotIm[0] );
/* Inverse filter bank */
- cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot] ), nBins, st_ivas->cldfbSynDec[chA] );
+ cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, st_ivas->cldfbSynDec[chA] );
}
}
@@ -1361,20 +1569,150 @@ static void ivas_dirac_dec_binaural_process_output(
}
+static void adaptTransportSignalsHeadtracked(
+ HEAD_TRACK_DATA_HANDLE hHeadTrackData,
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ const int16_t nBins,
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nSlots,
+#endif
+ float Rmat[3][3] )
+{
+ int16_t slot, ch, bin, louderCh;
+ float ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val, ene_proc, ene_target;
+ int16_t max_band;
+ float eqVal;
+ int16_t band_idx, bin_lo, bin_hi;
+
+ /* Determine head-orientation-based mono factor.
+ Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */
+ y_val = 1.0f - fabsf( Rmat[1][1] );
+ mono_factor_rotation = ( y_val - ADAPT_HTPROTO_ROT_LIM_0 ) / ( ADAPT_HTPROTO_ROT_LIM_1 - ADAPT_HTPROTO_ROT_LIM_0 );
+ mono_factor_rotation = fmaxf( 0.0f, fminf( 1.0f, mono_factor_rotation ) );
+
+ /* Adapt transport signals in frequency bands */
+ /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */
+
+ max_band = 0;
+ while ( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins )
+ {
+ max_band++;
+ }
+
+ for ( band_idx = 0; band_idx < max_band; band_idx++ )
+ {
+ float ch_nrg[2]; /* storage for input signal channel energies */
+ bin_lo = MASA_band_grouping_24[band_idx];
+ bin_hi = min( MASA_band_grouping_24[band_idx + 1], (int16_t) nBins );
+ for ( ch = 0; ch < 2; ch++ )
+ {
+ ch_nrg[ch] = 0.0f;
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
+ {
+ for ( bin = bin_lo; bin < bin_hi; bin++ )
+ {
+ ch_nrg[ch] += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
+ }
+ }
+ hHeadTrackData->chEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC;
+ hHeadTrackData->chEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch];
+ }
+
+ /* Determine ILD */
+ ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][band_idx] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][band_idx] ) ) );
+ if ( hHeadTrackData->chEneIIR[1][band_idx] > hHeadTrackData->chEneIIR[0][band_idx] )
+ {
+ louderCh = 1;
+ }
+ else
+ {
+ louderCh = 0;
+ }
+
+ /* Determine ILD-based mono factor */
+ mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 );
+ mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) );
+
+ /* Combine mono factors */
+ mono_factor = mono_factor_ILD * mono_factor_rotation;
+
+ /* Mix original audio and sum signal according to determined mono factor */
+ for ( ch = 0; ch < 2; ch++ )
+ {
+ if ( ch != louderCh )
+ {
+ float band_nrg = 0.0f;
+
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
+ {
+ for ( bin = bin_lo; bin < bin_hi; bin++ )
+ {
+ /* mono sum signal with the computed weight + rest from the original channel */
+ inRe[ch][slot][bin] = mono_factor * ( inRe[0][slot][bin] + inRe[1][slot][bin] ) + ( 1.0f - mono_factor ) * inRe[ch][slot][bin];
+ inIm[ch][slot][bin] = mono_factor * ( inIm[0][slot][bin] + inIm[1][slot][bin] ) + ( 1.0f - mono_factor ) * inIm[ch][slot][bin];
+ band_nrg += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] );
+ }
+ }
+ hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC;
+ hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * band_nrg;
+ }
+ else
+ {
+ /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */
+ hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC;
+ hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch];
+ }
+ }
+
+ /* Equalize */
+ ene_target = hHeadTrackData->chEneIIR[0][band_idx] + hHeadTrackData->chEneIIR[1][band_idx];
+ ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx];
+ eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) );
+
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
+ {
+ for ( ch = 0; ch < 2; ch++ )
+ {
+ for ( bin = bin_lo; bin < bin_hi; bin++ )
+ {
+ inRe[ch][slot][bin] *= eqVal;
+ inIm[ch][slot][bin] *= eqVal;
+ }
+ }
+ }
+ }
+
+ return;
+}
+
static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(
#ifdef EXTERNAL_ORIENTATIONS
COMBINED_ORIENTATION_HANDLE hHeadTrackData,
#else
HEAD_TRACK_DATA_HANDLE hHeadTrackData,
#endif
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
- const uint8_t firstSlot,
- const uint8_t slotEnd,
- const uint8_t nBins,
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
+ const int16_t nBins,
+#ifdef JBM_TSM_ON_TCS
+ const int16_t nSlots,
+#endif
float Rmat[3][3] )
{
- uint8_t slot, bin, ch;
+ int16_t slot, bin, ch;
float tmpVal;
/* When not currently in prototype signal left-right switching procedure, check if such switching is needed */
@@ -1394,7 +1732,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(
/* When currently in interpolation */
if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent )
{
- for ( slot = firstSlot; slot < slotEnd; slot++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
{
float switchOrderFactor, origOrderFactor;
@@ -1450,7 +1792,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked(
/* If not in interpolation, but in switched prototype situation, then switch left and right channels */
if ( hHeadTrackData->lrSwitchedCurrent == 1 )
{
- for ( slot = firstSlot; slot < slotEnd; slot++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( slot = 0; slot < nSlots; slot++ )
+#else
+ for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ )
+#endif
{
for ( bin = 0; bin < nBins; bin++ )
{
@@ -1902,3 +2248,73 @@ static void hrtfShGetHrtf(
return;
}
+
+
+/*-------------------------------------------------------------------------
+ * configure_reqularization_factor()
+ *
+ * Configure regularization factor for the mixing matrix generation of the
+ * parametric binauralizer using IVAS codec format and current bitrate.
+ *------------------------------------------------------------------------*/
+
+/*! r: Configured reqularization factor value */
+float configure_reqularization_factor(
+ const IVAS_FORMAT ivas_format, /* i : IVAS format */
+ const int32_t ivas_total_brate /* i : IVAS total bitrate */
+)
+{
+ float reqularizationFactor;
+ reqularizationFactor = 1.0f; /* Default value */
+
+ if ( ivas_format == MASA_FORMAT )
+ {
+ if ( ivas_total_brate >= IVAS_160k )
+ {
+ reqularizationFactor = 0.4f;
+ }
+ else if ( ivas_total_brate == IVAS_128k )
+ {
+ reqularizationFactor = 0.5f;
+ }
+ else if ( ivas_total_brate == IVAS_96k )
+ {
+ reqularizationFactor = 0.6f;
+ }
+ else if ( ivas_total_brate >= IVAS_64k )
+ {
+ reqularizationFactor = 0.8f;
+ }
+ else
+ {
+ reqularizationFactor = 1.0f;
+ }
+ }
+
+ if ( ivas_format == MC_FORMAT ) /* This is always McMASA for parametric binauralizer. */
+ {
+ if ( ivas_total_brate >= IVAS_96k )
+ {
+ reqularizationFactor = 0.4f;
+ }
+ else if ( ivas_total_brate >= IVAS_80k )
+ {
+ reqularizationFactor = 0.5f;
+ }
+ else if ( ivas_total_brate >= IVAS_64k )
+ {
+ reqularizationFactor = 0.7f;
+ }
+ else if ( ivas_total_brate >= IVAS_48k )
+ {
+ reqularizationFactor = 0.8f;
+ }
+ else
+ {
+ reqularizationFactor = 1.0f;
+ }
+ }
+
+ /* For SBA and parametric ISM, currently in default value of 1.0f. */
+
+ return reqularizationFactor;
+}
diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c
index 2b1f16d025cfb0c9166a5c5c80c6c5489e0ca305..3616bd6c93c86a524b55f180d138099426426fa9 100644
--- a/lib_rend/ivas_hrtf.c
+++ b/lib_rend/ivas_hrtf.c
@@ -96,6 +96,10 @@ ivas_error ivas_HRTF_CRend_binary_open(
( *hSetOfHRTF )->hHRTF_hrir_combined = NULL;
( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL;
+#ifdef UPDATE_SBA_FILTER
+ ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL;
+ ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL;
+#endif
( *hSetOfHRTF )->hHRTF_brir_combined = NULL;
return IVAS_ERR_OK;
diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c
index 28c272bc0c820c180908817035d9446a12d6b819..7875165e51d0ce47be819eba3bd6124fe92061be 100644
--- a/lib_rend/ivas_limiter.c
+++ b/lib_rend/ivas_limiter.c
@@ -171,11 +171,15 @@ void ivas_limiter_close(
*-------------------------------------------------------------------*/
void ivas_limiter_dec(
- IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */
+ IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */
+#ifdef JBM_TSM_ON_TCS
+ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */
+#else
float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */
- const int16_t num_channels, /* i : number of channels to be processed */
- const int16_t output_frame, /* i : number of samples per channel in the buffer */
- const int16_t BER_detect /* i : BER detect flag */
+#endif
+ const int16_t num_channels, /* i : number of channels to be processed */
+ const int16_t output_frame, /* i : number of samples per channel in the buffer */
+ const int16_t BER_detect /* i : BER detect flag */
)
{
int16_t c;
diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c
index 4e142437b640855da321e0a77d1dbf62d8a3f9d8..55f4f2f6bb8a3875a7ab504da50b65655c839cd8 100644
--- a/lib_rend/ivas_objectRenderer.c
+++ b/lib_rend/ivas_objectRenderer.c
@@ -34,6 +34,7 @@
#include
#include "options.h"
#include "prot.h"
+#include "ivas_prot.h"
#include "ivas_prot_rend.h"
#include
#include "ivas_rom_com.h"
@@ -47,10 +48,11 @@
* Local function prototypes
*---------------------------------------------------------------------*/
+
static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd );
-#ifdef TD5
+
static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec );
-#endif
+
/*---------------------------------------------------------------------*
* ivas_td_binaural_open_unwrap()
@@ -59,14 +61,12 @@ static void angles_to_vec( const float radius, const float azimuth, const float
*---------------------------------------------------------------------*/
ivas_error ivas_td_binaural_open_unwrap(
- TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */
- const int32_t output_Fs, /* i : Output sampling rate */
- const int16_t nchan_transport, /* i : Number of channels */
- const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */
- const AUDIO_CONFIG transport_config, /* i : Transport configuration */
-#ifdef TD5
- const float *directivity, /* i : Directivity pattern (used for ISM) */
-#endif
+ TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HR filter model (from file or NULL) */
+ const int32_t output_Fs, /* i : Output sampling rate */
+ const int16_t nchan_transport, /* i : Number of channels */
+ const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */
+ const AUDIO_CONFIG transport_config, /* i : Transport configuration */
+ const float *directivity, /* i : Directivity pattern (used for ISM) */
const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */
BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */
int32_t *binaural_latency_ns /* i : Binauralization delay */
@@ -175,13 +175,7 @@ ivas_error ivas_td_binaural_open_unwrap(
for ( nS = 0; nS < nchan_rend; nS++ )
{
/* Set source positions according to loudspeaker layout */
-#ifdef TD5
angles_to_vec( 1.0f, ls_azimuth[nS], ls_elevation[nS], Pos );
-#else
- Pos[0] = cosf( ls_elevation[nS] * PI_OVER_180 ) * cosf( ls_azimuth[nS] * PI_OVER_180 );
- Pos[1] = cosf( ls_elevation[nS] * PI_OVER_180 ) * sinf( ls_azimuth[nS] * PI_OVER_180 );
- Pos[2] = sinf( ls_elevation[nS] * PI_OVER_180 );
-#endif
Dir[0] = 1.0f;
Dir[1] = 0.0f;
Dir[2] = 0.0f;
@@ -197,11 +191,9 @@ ivas_error ivas_td_binaural_open_unwrap(
TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p );
}
}
-#ifdef TD5
if ( ivas_format == ISM_FORMAT )
{
DirAtten_p = pBinRendTd->DirAtten_p;
-#ifdef TD5_FIX_INVALID_MEMORY_ACCESS
if ( NULL == directivity )
{
DirAtten_p->ConeInnerAngle = 360.0f; /* Front cone */
@@ -214,18 +206,12 @@ ivas_error ivas_td_binaural_open_unwrap(
DirAtten_p->ConeOuterAngle = directivity[1];
DirAtten_p->ConeOuterGain = directivity[2];
}
-#else
- DirAtten_p->ConeInnerAngle = directivity[0];
- DirAtten_p->ConeOuterAngle = directivity[1];
- DirAtten_p->ConeOuterGain = directivity[2];
-#endif
for ( nS = 0; nS < nchan_rend; nS++ )
{
TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p );
}
}
-#endif
*hBinRendererTd = pBinRendTd;
*binaural_latency_ns = (int32_t) ( ( *hBinRendererTd )->HrFiltSet_p->latency_s * 1000000000.f );
@@ -280,56 +266,92 @@ ivas_error ivas_td_binaural_renderer_unwrap(
const int16_t Opt_Headrotation, /* i : Head rotation flag */
#endif
const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */
-#ifdef TD5
- const IVAS_POSITION *Pos, /* i : Listener position data per subframe */
+ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */
+#endif
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+#else
+ float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
#endif
- float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
- const int16_t output_frame /* i : output frame length */
+ const int16_t output_frame /* i : output frame length */
)
{
int16_t subframe_length;
int16_t subframe_idx;
float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k];
ivas_error error;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t c_indx, nS;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ float *p_reverb_signal[BINAURAL_CHANNELS];
+ int16_t ch;
+
+ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
+ {
+ p_reverb_signal[ch] = reverb_signal[ch];
+ }
+#endif
subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ c_indx = 0;
+ for ( nS = 0; nS < num_src; nS++ )
+ {
+ if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */
+ {
+ hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS];
+ hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE;
+ c_indx++;
+ }
+ }
+#else
/* Update object position(s) */
TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output );
+#endif
for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ )
{
+#ifdef FIX_356_ISM_METADATA_SYNC
+ if ( subframe_idx == ism_md_subframe_update )
+ {
+ /* Update object position(s) */
+ TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData );
+ }
+#endif
/* Update the listener's location/orientation */
-#ifdef TD5
#ifdef EXTERNAL_ORIENTATIONS
TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL ) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL );
#else
TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL );
-#endif
-#else
-#ifdef EXTERNAL_ORIENTATIONS
- TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL );
-#else
- TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL );
-#endif
#endif
if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on )
{
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
}
/* Render subframe */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK )
+#else
if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
}
-
if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on )
{
/* add reverb to rendered signals */
@@ -349,9 +371,18 @@ ivas_error ivas_td_binaural_renderer_unwrap(
ivas_error TDREND_GetMix(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */
- float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */
- const int16_t subframe_length, /* i/o: subframe length */
- const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: ISM object synth / rendered output in 0,1 */
+#else
+ float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */
+#endif
+ const int16_t subframe_length, /* i/o: subframe length */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */
+ const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */
+#else
+ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#endif
)
{
int16_t i;
@@ -363,6 +394,13 @@ ivas_error TDREND_GetMix(
float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
int16_t intp_count;
+ float pan_left, pan_right;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t subframe_update_flag;
+
+ subframe_update_flag = subframe_idx == ism_md_subframe_update;
+#endif
+
error = IVAS_ERR_OK;
/* Clear the output buffer to accumulate rendered sources */
@@ -383,10 +421,14 @@ ivas_error TDREND_GetMix(
SrcRend_p = Src_p->SrcRend_p;
/* Update rendering params if needed */
- if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated )
+ if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) )
{
TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev,
+#ifdef FIX_356_ISM_METADATA_SYNC
+ Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag );
+#else
Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx );
+#endif
}
/* Render source if needed */
@@ -394,6 +436,14 @@ ivas_error TDREND_GetMix(
{
error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length );
}
+
+ if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) )
+ {
+ pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f;
+ pan_right = 1.f - pan_left;
+ v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length );
+ v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length );
+ }
}
/* Populate output variable */
@@ -439,57 +489,75 @@ static void TDREND_Clear_Update_flags(
void TDREND_Update_object_positions(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */
const int16_t num_src, /* i : number of sources to render */
- const int16_t lfe_idx, /* i : Input LFE index */
- const IVAS_FORMAT in_format, /* i : Format of input sources */
- const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */
- float output[][L_FRAME48k] /* i/o: SCE/MC channels */
+#ifndef FIX_356_ISM_METADATA_SYNC
+ const int16_t lfe_idx, /* i : Input LFE index */
+#endif
+ const IVAS_FORMAT in_format, /* i : Format of input sources */
+ const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */
+#ifndef FIX_356_ISM_METADATA_SYNC
+ ,
+#ifdef JBM_TSM_ON_TCS
+ float *output[] /* i/o: SCE/MC channels */
+#else
+ float output[][L_FRAME48k] /* i/o: SCE/MC channels */
+#endif
+#endif
)
{
TDREND_DirAtten_t *DirAtten_p;
int16_t nS;
float Pos[3];
float Dir[3];
+#ifndef FIX_356_ISM_METADATA_SYNC
int16_t c_indx;
+#endif
DirAtten_p = hBinRendererTd->DirAtten_p;
/* For each source, write the frame data to the source object*/
+#ifndef FIX_356_ISM_METADATA_SYNC
c_indx = 0;
+#endif
for ( nS = 0; nS < num_src; nS++ )
{
+#ifndef FIX_356_ISM_METADATA_SYNC
if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */
{
hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS];
hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE;
c_indx++;
}
-
+#endif
if ( in_format == ISM_FORMAT )
{
-
/* Update the source positions */
/* Source position and direction */
-#ifdef TD5
angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos );
angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir );
-#else
- Pos[0] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * cosf( hIsmMetaData[nS]->azimuth * PI_OVER_180 );
- Pos[1] = cosf( hIsmMetaData[nS]->elevation * PI_OVER_180 ) * sinf( hIsmMetaData[nS]->azimuth * PI_OVER_180 );
- Pos[2] = sinf( hIsmMetaData[nS]->elevation * PI_OVER_180 );
- Dir[0] = 1.0f;
- Dir[1] = 0.0f;
- Dir[2] = 0.0f;
-#endif
+#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET
+
/* Source directivity info */
DirAtten_p->ConeInnerAngle = 360.0f;
DirAtten_p->ConeOuterAngle = 360.0f;
DirAtten_p->ConeOuterGain = 1.0f;
+#endif
TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos );
TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p );
- TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING );
+ if ( hIsmMetaData[nS]->non_diegetic_flag )
+ {
+ Pos[0] = 0;
+ Pos[1] = hIsmMetaData[nS]->azimuth / 90.f;
+ Pos[2] = 0;
+ TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos );
+ TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC );
+ }
+ else
+ {
+ TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING );
+ }
TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir );
}
}
@@ -507,29 +575,14 @@ void TDREND_Update_object_positions(
void TDREND_Update_listener_orientation(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */
const int16_t headRotEnabled, /* i : Headrotation flag */
-#ifdef TD5
- const IVAS_QUATERNION *headPosition, /* i : Listener orientation */
- const IVAS_POSITION *Pos /* i : Listener Position */
-#else
- const IVAS_QUATERNION *headPosition /* i : Head Position */
-#endif
+ const IVAS_QUATERNION *headPosition, /* i : Listener orientation */
+ const IVAS_VECTOR3 *Pos /* i : Listener Position */
)
{
-#ifndef TD5
- float Pos[3];
-#endif
float FrontVec[3];
float UpVec[3];
float Rmat[3][3];
-#ifdef TD5
float Pos_p[3];
-#else
- /* Update the listener's location/orientation */
- /* Listener at the origin */
- Pos[0] = 0.0f;
- Pos[1] = 0.0f;
- Pos[2] = 0.0f;
-#endif
if ( headRotEnabled )
{
@@ -543,7 +596,6 @@ void TDREND_Update_listener_orientation(
UpVec[0] = Rmat[2][0];
UpVec[1] = Rmat[2][1];
UpVec[2] = Rmat[2][2];
-#ifdef TD5
#ifdef EXTERNAL_ORIENTATIONS
if ( Pos != NULL )
{
@@ -564,7 +616,6 @@ void TDREND_Update_listener_orientation(
Pos_p[0] = ( *Pos ).x;
Pos_p[1] = ( *Pos ).y;
Pos_p[2] = ( *Pos ).z;
-#endif
#endif
}
else
@@ -577,20 +628,14 @@ void TDREND_Update_listener_orientation(
UpVec[0] = 0.0f;
UpVec[1] = 0.0f;
UpVec[2] = 1.0f;
-#ifdef TD5
/* Listener at the origin */
Pos_p[0] = 0.0f;
Pos_p[1] = 0.0f;
Pos_p[2] = 0.0f;
-#endif
}
/* Set the listener position and orientation:*/
-#ifdef TD5
TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos_p );
-#else
- TDREND_MIX_LIST_SetPos( hBinRendererTd, Pos );
-#endif
TDREND_MIX_LIST_SetOrient( hBinRendererTd, FrontVec, UpVec );
return;
@@ -606,9 +651,7 @@ void TDREND_Update_listener_orientation(
ivas_error ivas_td_binaural_open_ext(
TDREND_WRAPPER *pTDRend,
IVAS_REND_AudioConfig inConfig,
-#ifdef TD5
RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */
-#endif
LSSETUP_CUSTOM_STRUCT *customLsInput,
const int32_t outFs )
{
@@ -617,9 +660,7 @@ ivas_error ivas_td_binaural_open_ext(
IVAS_FORMAT ivas_format;
IVAS_OUTPUT_SETUP hTransSetup;
ivas_error error;
-#ifdef TD5_FIX_INVALID_MEMORY_ACCESS
float *directivity = NULL;
-#endif
if ( inConfig != IVAS_REND_AUDIO_CONFIG_LS_CUSTOM )
{
@@ -638,17 +679,12 @@ ivas_error ivas_td_binaural_open_ext(
hTransSetup.ls_azimuth = customLsInput->ls_azimuth;
hTransSetup.ls_elevation = customLsInput->ls_elevation;
-#ifdef TD5
-#ifdef TD5_FIX_INVALID_MEMORY_ACCESS
if ( NULL != hRendCfg )
+ {
directivity = hRendCfg->directivity;
+ }
+
return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns );
-#else
- return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hRendCfg->directivity, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns );
-#endif
-#else
- return ivas_td_binaural_open_unwrap( &pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns );
-#endif
}
@@ -681,12 +717,27 @@ ivas_error ivas_td_binaural_renderer_ext(
IVAS_REND_AudioConfigType inConfigType;
AUDIO_CONFIG transport_config;
ivas_error error;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ int16_t ism_md_subframe_update_ext;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ float *p_output[MAX_OUTPUT_CHANNELS];
+ int16_t ch;
+
+ for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ )
+ {
+ p_output[ch] = output[ch];
+ }
+#endif
push_wmops( "ivas_td_binaural_renderer_ext" );
inConfigType = getAudioConfigType( inConfig );
lfe_idx = LFE_CHANNEL;
hIsmMetaData[0] = NULL;
+#ifdef FIX_356_ISM_METADATA_SYNC
+ ism_md_subframe_update_ext = 0;
+#endif
if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED )
{
@@ -713,24 +764,60 @@ ivas_error ivas_td_binaural_renderer_ext(
hIsmMetaData[0] = &hIsmMetaDataFrame;
hIsmMetaData[0]->azimuth = currentPos->azimuth;
hIsmMetaData[0]->elevation = currentPos->elevation;
-#ifdef TD5
hIsmMetaData[0]->yaw = currentPos->yaw;
hIsmMetaData[0]->pitch = currentPos->pitch;
hIsmMetaData[0]->radius = currentPos->radius;
-#endif
+ hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag;
}
+#ifdef JBM_TSM_ON_TCS
+#ifdef FIX_356_ISM_METADATA_SYNC
+ if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData,
+#ifdef EXTERNAL_ORIENTATIONS
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL,
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL,
+#else
+ headRotData->headRotEnabled,
+ ( headRotData != NULL ) ? headRotData->headPositions : NULL,
+ ( headRotData != NULL ) ? headRotData->Pos : NULL,
+#endif
+ ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK )
+#else
+ if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData,
+#ifdef EXTERNAL_ORIENTATIONS
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL,
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL,
+#else
+ headRotData->headRotEnabled,
+ ( headRotData != NULL ) ? headRotData->headPositions : NULL,
+ ( headRotData != NULL ) ? headRotData->Pos : NULL,
+#endif
+ p_output, output_frame ) ) != IVAS_ERR_OK )
+#endif
+#else
+#ifdef FIX_356_ISM_METADATA_SYNC
if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData,
#ifdef EXTERNAL_ORIENTATIONS
(hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL,
(hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL,
#else
- headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL,
+ headRotData->headRotEnabled,
+ ( headRotData != NULL ) ? headRotData->headPositions : NULL,
+ ( headRotData != NULL ) ? headRotData->Pos : NULL,
#endif
-#ifdef TD5
- ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK )
+ ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK )
#else
+ if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData,
+#ifdef EXTERNAL_ORIENTATIONS
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL,
+ (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL,
+#else
+ headRotData->headRotEnabled,
+ ( headRotData != NULL ) ? headRotData->headPositions : NULL,
+ ( headRotData != NULL ) ? headRotData->Pos : NULL,
+#endif
output, output_frame ) ) != IVAS_ERR_OK )
+#endif
#endif
{
return error;
@@ -741,7 +828,6 @@ ivas_error ivas_td_binaural_renderer_ext(
return IVAS_ERR_OK;
}
-#ifdef TD5
/*---------------------------------------------------------------------*
* angles_to_vec()
*
@@ -761,4 +847,3 @@ static void angles_to_vec(
return;
}
-#endif
diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c
index d28abdba30626bed51d1485baf0899c67c08b264..6463261ec47145ba640e0bb77312f4afce673dc9 100644
--- a/lib_rend/ivas_objectRenderer_hrFilt.c
+++ b/lib_rend/ivas_objectRenderer_hrFilt.c
@@ -69,26 +69,17 @@ ivas_error TDREND_REND_RenderSourceHRFilt(
{
float LeftOutputFrame[L_SPATIAL_SUBFR_48k];
float RightOutputFrame[L_SPATIAL_SUBFR_48k];
-#ifdef TD5
- float Gain;
-
- Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p );
-#endif
TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length );
-#ifdef TD5
- TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain );
- TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain );
-#else
- TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength );
- TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength );
-#endif
+ TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain );
+ TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain );
+ Src_p->prevGain = Src_p->Gain;
/* Copy to accumulative output frame */
v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length );
v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length );
- Src_p->InputFrame_p += subframe_length; /* Increment input pointer -- todo: should we remove this and input the current subframe instead? */
+ Src_p->InputFrame_p += subframe_length; /* Increment input pointer */
return IVAS_ERR_OK;
diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c
index 72493b050117d115f653f1afe9c5b4c6d3770cb4..d988ad53d2ac65baf5a69da192b9261b6efe7d22 100644
--- a/lib_rend/ivas_objectRenderer_sfx.c
+++ b/lib_rend/ivas_objectRenderer_sfx.c
@@ -235,12 +235,9 @@ void TDREND_firfilt(
const int16_t intp_count, /* i : interpolation count */
float *mem, /* i/o: filter memory */
const int16_t subframe_length, /* i : Length of signal */
-#ifdef TD5
- const int16_t filterlength, /* i : Filter length */
- const float Gain /* i : Gain */
-#else
- const int16_t filterlength /* i : Filter length */
-#endif
+ const int16_t filterlength, /* i : Filter length */
+ const float Gain, /* i : Gain */
+ const float prevGain /* i : Previous gain */
)
{
float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k];
@@ -249,6 +246,11 @@ void TDREND_firfilt(
float *p_filter;
float tmp;
int16_t i, j;
+ float step, gain_tmp, gain_delta;
+
+ gain_delta = ( Gain - prevGain );
+ step = gain_delta / ( subframe_length );
+ gain_tmp = prevGain;
/* Handle memory */
p_signal = buffer + filterlength - 1;
@@ -266,11 +268,9 @@ void TDREND_firfilt(
{
tmp += ( *p_filter++ ) * ( *p_tmp-- );
}
-#ifdef TD5
- signal[i] = tmp * Gain;
-#else
- signal[i] = tmp;
-#endif
+ /* Apply linear gain interpolation in case of abrupt gain changes */
+ gain_tmp = gain_tmp + step;
+ signal[i] = tmp * gain_tmp;
if ( i < intp_count )
{
diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c
index 2a13efc24c219dec2e8d608a01e71498df33fee3..146827357200dd85373647ae21dc102bea6d5b6f 100644
--- a/lib_rend/ivas_objectRenderer_sources.c
+++ b/lib_rend/ivas_objectRenderer_sources.c
@@ -96,7 +96,7 @@ ivas_error TDREND_MIX_SRC_SetPos(
/*-------------------------------------------------------------------*
* TDREND_MIX_SRC_SetDir()
*
- * Set source direciton
+ * Set source direction
--------------------------------------------------------------------*/
ivas_error TDREND_MIX_SRC_SetDir(
@@ -219,7 +219,6 @@ static void TDREND_SRC_REND_Init(
/* Internal state */
SrcRend_p->InputAvailable = FALSE;
SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_INITIAL;
-
/* SrcGain */
for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ )
{
@@ -260,15 +259,17 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
int16_t *itd, /* o: ITD value */
float *Gain, /* o: Gain value */
TDREND_SRC_t *Src_p, /* i/o: Source pointer */
- const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t subframe_update_flag
+#else
+ const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#endif
)
{
TDREND_MIX_Listener_t *Listener_p;
TDREND_HRFILT_FiltSet_t *HrFiltSet_p;
float ListRelPos[3], ListRelDist;
-#ifdef TD5
float ListRelPosAbs[3]; /* Relative position, ignoring orientation of listener */
-#endif
float Azim, Elev;
float hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
float hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
@@ -290,22 +291,14 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
break;
case TDREND_POSTYPE_ABSOLUTE:
/* Absolute position */
-#ifdef TD5
TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs );
-#else
- TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos );
-#endif
break;
default: /* Illegal position type */
#ifdef DEBUGGING
printf( "Warning! TDREND_SRC_REND_UpdateFiltersFromSpatialParams: Invalid position type. Assuming absolute position!\n" );
#endif
/* Assume absolute position */
-#ifdef TD5
TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs );
-#else
- TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos );
-#endif
break;
}
@@ -331,11 +324,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
*SrcRend_p->DirGain_p = 1.0f;
if ( SrcSpatial_p->DirAttenEnabled )
{
-#ifdef TD5
*SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPosAbs );
-#else
- *SrcRend_p->DirGain_p = TDREND_SRC_SPATIAL_GetDirGain( &SrcSpatial_p->DirAtten, SrcSpatial_p->Front_p, ListRelPos );
-#endif
}
/* Distance gain */
@@ -368,7 +357,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */
*intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) );
+#ifdef FIX_356_ISM_METADATA_SYNC
+ if ( ( *intp_count > 0 ) && subframe_update_flag )
+#else
if ( ( *intp_count > 0 ) && subframe_idx == 0 )
+#endif
{
/* Set deltas for interpolation */
v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength );
@@ -474,7 +467,7 @@ static void TDREND_SRC_SPATIAL_Init(
SrcSpatial_p->DistAttenEnabled = FALSE;
SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED;
SrcSpatial_p->DistAtten.RefDist = 1.0f;
- SrcSpatial_p->DistAtten.MaxDist = 10.0f;
+ SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */
SrcSpatial_p->DistAtten.RollOffFactor = 1.0f;
return;
@@ -701,7 +694,7 @@ void TDREND_SRC_Init(
Src_p->hrf_right_prev[0] = 1;
Src_p->azim_prev = 0.0f;
Src_p->elev_prev = 0.0f;
-
+ Src_p->prevGain = 1.0f;
return;
}
diff --git a/lib_rend/ivas_objectRenderer_vec.c b/lib_rend/ivas_objectRenderer_vec.c
index f17d769821ab9e3abee43fed7b53d02829a14dfd..061b790e1b46e9010d14a0b0162b528bbd3768fb 100644
--- a/lib_rend/ivas_objectRenderer_vec.c
+++ b/lib_rend/ivas_objectRenderer_vec.c
@@ -111,33 +111,16 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem(
const float *DirVec_p, /* i : Direction vector */
const float *UpVec_p, /* i : Up vector */
const float *RightVec_p, /* i : Right vector */
-#ifdef TD5
- float *MappedVec_p, /* o : Transformed vector */
- float *LisRelPosAbs /* o : Transformed vector ignoring orientation */
-#else
- float *MappedVec_p /* o : Transformed vector */
-#endif
+ float *MappedVec_p, /* o : Transformed vector */
+ float *LisRelPosAbs /* o : Transformed vector ignoring orientation */
)
{
-#ifdef TD5
v_sub( Vec_p, TranslVec_p, LisRelPosAbs, 3 );
/* Evalute the relative Vec in the coordinates of the Orientation vectors, */
/* which form an orthonormal basis */
MappedVec_p[0] = dotp( LisRelPosAbs, DirVec_p, 3 );
MappedVec_p[1] = dotp( LisRelPosAbs, RightVec_p, 3 );
MappedVec_p[2] = dotp( LisRelPosAbs, UpVec_p, 3 );
-#else
- float RelVec[3];
-
- /* Evaluate Vec relative to the new origin given by TranslVec */
- v_sub( Vec_p, TranslVec_p, RelVec, 3 );
-
- /* Evalute the relative Vec in the coordinates of the Orientation vectors, */
- /* which form an orthonormal basis */
- MappedVec_p[0] = dotp( RelVec, DirVec_p, 3 );
- MappedVec_p[1] = dotp( RelVec, RightVec_p, 3 );
- MappedVec_p[2] = dotp( RelVec, UpVec_p, 3 );
-#endif
return;
}
diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c
index 0dc81f70d7c8c65baea66b9e6c266ee8401d0c6f..2937f2d0181e555267a5e36289051f9d1d533f31 100644
--- a/lib_rend/ivas_orient_trk.c
+++ b/lib_rend/ivas_orient_trk.c
@@ -57,7 +57,6 @@
* Local functions
*------------------------------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*------------------------------------------------------------------------------------------*
* IdentityQuaternion()
*
@@ -258,7 +257,6 @@ static void QuaternionInverse(
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/*------------------------------------------------------------------------------------------*
* VectorSubtract()
*
@@ -386,46 +384,6 @@ static void VectorRotationToQuaternion(
return;
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
-static float ClipAngle(
- const float angle,
- const float min_angle,
- const float max_angle )
-{
- float result = angle;
-
- /* wrap angle modulo 2*pi into range of [-pi, pi> radians */
- /* 'while' assumed to use comparison to 0 */
- while ( result > EVS_PI )
- {
- result -= PI2;
- }
- /* 'while' assumed to use comparison to 0 */
- while ( result <= -EVS_PI )
- {
- result += PI2;
- }
-
- /* Next, clip angle into range */
- /* 'if' assumed to use comparison to 0 */
- if ( result < min_angle )
- {
- result = min_angle;
- }
- else
- {
- /* 'if' assumed to use comparison to 0 */
- if ( result > max_angle )
- {
- result = max_angle;
- }
- }
-
- return result;
-}
-
-#endif
/*-------------------------------------------------------------------*
* ivas_orient_trk_Init()
@@ -433,14 +391,9 @@ static float ClipAngle(
*
*-------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_Init(
-#else
-void ivas_orient_trk_Init(
-#endif
ivas_orient_trk_state_t *pOTR ) /* i/o : orientation tracker handle */
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
IVAS_QUATERNION identity;
if ( pOTR == NULL )
@@ -450,10 +403,6 @@ void ivas_orient_trk_Init(
identity.w = 1.0f;
identity.x = identity.y = identity.z = 0.0f;
-#else
- /* Track relative to a reference orientation */
- pOTR->trackingType = OTR_TRACKING_REF_ORIENT;
-#endif
/* configuration parameters */
pOTR->centerAdaptationRate = 1.0f / 30.0f;
@@ -463,39 +412,19 @@ void ivas_orient_trk_Init(
/* initial adaptivity filter coefficient, will be auto-adapted */
pOTR->alpha = sinf( PI2 * pOTR->offCenterAdaptationRate / OTR_UPDATE_RATE ); /* start adaptation at off-center rate = fastest rate */
-#ifdef FIX_I109_ORIENTATION_TRACKING
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
pOTR->trkRot = identity;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
pOTR->absAvgRot = identity;
/* Use frontal and horiontal orientation as reference orientation, unless/until overridden */
pOTR->refRot = identity;
/* set safe default tracking mode */
+#ifdef FIX_439_OTR_PARAMS
+ pOTR->orientation_tracking = HEAD_ORIENT_TRK_NONE;
+#else
pOTR->trackingType = OTR_TRACKING_NONE;
+#endif
return IVAS_ERR_OK;
-#else
- pOTR->absYaw = 0.0f;
- pOTR->absPitch = 0.0f;
- pOTR->absRoll = 0.0f;
-
- pOTR->absAvgYaw = 0.0f;
- pOTR->absAvgPitch = 0.0f;
- pOTR->absAvgRoll = 0.0f;
-
- /* Use frontal and horiontal orientation as reference orientation,
- unless/until overridden by ivas_orient_trk_SetAbsoluteOrientation() */
- pOTR->refYaw = 0.0f;
- pOTR->refPitch = 0.0f;
- pOTR->refRoll = 0.0f;
-
- pOTR->trkYaw = 0.0f;
- pOTR->trkPitch = 0.0f;
- pOTR->trkRoll = 0.0f;
-
- return;
-#endif
}
@@ -505,30 +434,29 @@ void ivas_orient_trk_Init(
*
*-------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_SetTrackingType(
- ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
+ ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */
+#else
const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */
+#endif
)
{
if ( pOTR == NULL )
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
- pOTR->trackingType = trackingType;
- return IVAS_ERR_OK;
-}
+#ifdef FIX_439_OTR_PARAMS
+ pOTR->orientation_tracking = orientation_tracking;
#else
-void ivas_orient_trk_SetTrackingType(
- ivas_orient_trk_state_t *pOTR, /* i/o : orientation tracker handle */
- const OTR_TRACKING_T trackingType ) /* i/o : orientation tracking type */
-{
pOTR->trackingType = trackingType;
-}
#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
+ return IVAS_ERR_OK;
+}
+
/*-------------------------------------------------------------------*
* ivas_orient_trk_SetReferenceRotation()
*
@@ -574,19 +502,36 @@ ivas_error ivas_orient_trk_GetMainOrientation(
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
+
+#ifdef FIX_439_OTR_PARAMS
+ switch ( pOTR->orientation_tracking )
+#else
switch ( pOTR->trackingType )
+#endif
{
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_NONE:
+#else
case OTR_TRACKING_NONE:
+#endif
*pOrientation = IdentityQuaternion();
break;
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_REF_VEC:
+ case HEAD_ORIENT_TRK_REF_VEC_LEV:
+ case HEAD_ORIENT_TRK_REF:
+#else
case OTR_TRACKING_REF_VEC:
case OTR_TRACKING_REF_VEC_LEV:
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
case OTR_TRACKING_REF_ORIENT:
+#endif
*pOrientation = pOTR->refRot;
break;
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_AVG:
+#else
case OTR_TRACKING_AVG_ORIENT:
+#endif
*pOrientation = pOTR->absAvgRot;
break;
}
@@ -617,7 +562,6 @@ ivas_error ivas_orient_trk_GetTrackedRotation(
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/*-------------------------------------------------------------------*
* ivas_orient_trk_SetReferenceVector()
*
@@ -639,15 +583,30 @@ ivas_error ivas_orient_trk_SetReferenceVector(
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
+#ifdef FIX_439_OTR_PARAMS
+ switch ( pOTR->orientation_tracking )
+#else
switch ( pOTR->trackingType )
+#endif
{
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_NONE:
+ case HEAD_ORIENT_TRK_REF:
+ case HEAD_ORIENT_TRK_AVG:
+ case HEAD_ORIENT_TRK_REF_VEC:
+#else
case OTR_TRACKING_NONE:
case OTR_TRACKING_REF_ORIENT:
case OTR_TRACKING_AVG_ORIENT:
case OTR_TRACKING_REF_VEC:
+#endif
acousticFrontVector = VectorSubtract( listenerPos, refPos );
break;
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_REF_VEC_LEV:
+#else
case OTR_TRACKING_REF_VEC_LEV:
+#endif
/* ignore the height difference between listener position and reference position */
listenerPosLevel.z = refPosLevel.z = listenerPos.z;
listenerPosLevel.x = listenerPos.x;
@@ -675,28 +634,6 @@ ivas_error ivas_orient_trk_SetReferenceVector(
return IVAS_ERR_OK;
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#else
-/*-------------------------------------------------------------------*
- * ivas_orient_trk_SetAbsoluteOrientation()
- *
- *
- *-------------------------------------------------------------------*/
-
-void ivas_orient_trk_SetAbsoluteOrientation(
- ivas_orient_trk_state_t *pOTR,
- const float yaw,
- const float pitch,
- const float roll )
-{
- /* TODO implement condition checks */
- pOTR->absYaw = yaw;
- pOTR->absPitch = pitch;
- pOTR->absRoll = roll;
-
- return;
-}
-#endif
/*-------------------------------------------------------------------*
@@ -705,7 +642,6 @@ void ivas_orient_trk_SetAbsoluteOrientation(
*
*-------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_Process(
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
IVAS_QUATERNION absRot, /* i : absolute head rotation */
@@ -728,16 +664,28 @@ ivas_error ivas_orient_trk_Process(
result = IVAS_ERR_OK;
+#ifdef FIX_439_OTR_PARAMS
+ switch ( pOTR->orientation_tracking )
+#else
switch ( pOTR->trackingType )
+#endif
{
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_NONE:
+#else
case OTR_TRACKING_NONE:
+#endif
pOTR->trkRot = absRot;
break;
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_REF:
+ case HEAD_ORIENT_TRK_REF_VEC:
+ case HEAD_ORIENT_TRK_REF_VEC_LEV:
+#else
case OTR_TRACKING_REF_VEC:
case OTR_TRACKING_REF_VEC_LEV:
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
case OTR_TRACKING_REF_ORIENT:
+#endif
/* Reset average orientation */
pOTR->absAvgRot = absRot;
@@ -749,7 +697,11 @@ ivas_error ivas_orient_trk_Process(
QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot );
break;
+#ifdef FIX_439_OTR_PARAMS
+ case HEAD_ORIENT_TRK_AVG:
+#else
case OTR_TRACKING_AVG_ORIENT:
+#endif
/* Compute average (low-pass filtered) absolute orientation */
QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot );
@@ -797,138 +749,3 @@ ivas_error ivas_orient_trk_Process(
return result;
}
-#else
-ivas_error ivas_orient_trk_Process(
- ivas_orient_trk_state_t *pOTR )
-{
- float yaw;
- float pitch;
- float roll;
-
- if ( pOTR->trackingType == OTR_TRACKING_AVG_ORIENT )
- {
- float normalizedOrientation;
- float relativeOrientationRate;
- float rateRange;
- float cutoffFrequency;
- float alpha = pOTR->alpha;
-
- /* Copy absolute orientation as input to compute further on */
- yaw = pOTR->absYaw;
- pitch = pOTR->absPitch;
- roll = pOTR->absRoll;
-
- /* Compute average (low-pass filtered) absolute orientation */
- pOTR->absAvgYaw = ( 1.0f - alpha ) * pOTR->absAvgYaw + alpha * yaw;
- pOTR->absAvgPitch = ( 1.0f - alpha ) * pOTR->absAvgPitch + alpha * pitch;
- pOTR->absAvgRoll = ( 1.0f - alpha ) * pOTR->absAvgRoll + alpha * roll;
-
- /* Compute relative orientation = (absolute orientation) - (average absolute orientation) */
- yaw -= pOTR->absAvgYaw;
- pitch -= pOTR->absAvgPitch;
- roll -= pOTR->absAvgRoll;
-
- /* Clip tracked relative orientation to avoid wrap around */
- yaw = ClipAngle( yaw, -MAX_TRACKED_ANGLE_AVG_ORIENT, MAX_TRACKED_ANGLE_AVG_ORIENT );
- pitch = ClipAngle( pitch, -MAX_TRACKED_ANGLE_AVG_ORIENT, MAX_TRACKED_ANGLE_AVG_ORIENT );
- roll = ClipAngle( roll, -MAX_TRACKED_ANGLE_AVG_ORIENT, MAX_TRACKED_ANGLE_AVG_ORIENT );
-
- /* Store relative orientation result as output */
- pOTR->trkYaw = yaw;
- pOTR->trkPitch = pitch;
- pOTR->trkRoll = roll;
-
- /* Reconstruct the mean absolute orientation, compensating for non-linear computation of relative orientation:
- take absolute orientation and subtract the *clipped* mean relative orientation */
- pOTR->absAvgYaw = pOTR->absYaw - yaw;
- pOTR->absAvgPitch = pOTR->absPitch - pitch;
- pOTR->absAvgRoll = pOTR->absRoll - roll;
-
- /* Adapt LPF constant based on orientation excursion relative to current mean:
- - low cutoff (slow adaptation) for small excursions (around center)
- - high cutoff (fast adaptation) for large excursions (off-center)
- */
-
- normalizedOrientation = yaw * yaw;
- normalizedOrientation += pitch * pitch;
- normalizedOrientation += roll * roll;
-
- relativeOrientationRate = sqrtf( normalizedOrientation ) / pOTR->adaptationAngle;
- /* 'if' assumed to perform comparison to 0 */
- if ( relativeOrientationRate > 1.0f )
- {
- relativeOrientationRate = 1.0f;
- }
-
- /* Compute range of the adaptation rate between center = lower rate and off-center = higher rate */
- rateRange = pOTR->offCenterAdaptationRate - pOTR->centerAdaptationRate;
- /* 'if' assumed to perform comparison to 0 */
- if ( rateRange < 0.0f )
- {
- rateRange = 0.0f;
- }
-
- /* Compute adaptivity cutoff frequency: interpolate between minimum (center) and maximum (off-center) values */
- cutoffFrequency = pOTR->centerAdaptationRate + ( relativeOrientationRate * rateRange );
-
- /* Compute filter coefficient corresponding to desired cutoff frequency */
- pOTR->alpha = sinf( 2.0f * EVS_PI * cutoffFrequency / OTR_UPDATE_RATE );
- }
- else
- {
- /* 'if' assumed to perform comparison to 0 */
- if ( pOTR->trackingType == OTR_TRACKING_REF_ORIENT )
- {
- /* Reset average orientation */
- pOTR->absAvgYaw = pOTR->absYaw;
- pOTR->absAvgPitch = pOTR->absPitch;
- pOTR->absAvgRoll = pOTR->absRoll;
-
- /* Reset adaptation filter - start adaptation at center rate */
- pOTR->alpha = sinf( 2.0f * EVS_PI * pOTR->centerAdaptationRate / OTR_UPDATE_RATE );
-
- /* Copy absolute orientation as input to compute further on */
- yaw = pOTR->absYaw;
- pitch = pOTR->absPitch;
- roll = pOTR->absRoll;
-
- /* Compute relative orientation = (absolute orientation) - (reference orientation) */
- yaw -= pOTR->refYaw;
- pitch -= pOTR->refPitch;
- roll -= pOTR->refRoll;
-
- /* Clip computed relative orientation to avoid wrap around and store as output */
- pOTR->trkYaw = ClipAngle( yaw, -MAX_TRACKED_ANGLE_REF_ORIENT, MAX_TRACKED_ANGLE_REF_ORIENT );
- pOTR->trkPitch = ClipAngle( pitch, -MAX_TRACKED_ANGLE_REF_ORIENT, MAX_TRACKED_ANGLE_REF_ORIENT );
- pOTR->trkRoll = ClipAngle( roll, -MAX_TRACKED_ANGLE_REF_ORIENT, MAX_TRACKED_ANGLE_REF_ORIENT );
- }
-
- else
- {
- return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Non-supported orientation tracking adaptation type" );
- }
- }
-
- return IVAS_ERR_OK;
-}
-
-
-/*-------------------------------------------------------------------*
- * ivas_orient_trk_GetTrackedOrientation()
- *
- *
- *-------------------------------------------------------------------*/
-
-void ivas_orient_trk_GetTrackedOrientation(
- ivas_orient_trk_state_t *pOTR,
- float *yaw,
- float *pitch,
- float *roll )
-{
- *yaw = pOTR->trkYaw;
- *pitch = pOTR->trkPitch;
- *roll = pOTR->trkRoll;
-
- return;
-}
-#endif
diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h
index 4e78a18f11d146956d26a9e995d381026940782e..e540b3c083d131e5d94b3d2a6534a6d936223e24 100644
--- a/lib_rend/ivas_prot_rend.h
+++ b/lib_rend/ivas_prot_rend.h
@@ -92,7 +92,11 @@ void ivas_limiter_close(
void ivas_limiter_dec
(
IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */
+#ifdef JBM_TSM_ON_TCS
+ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */
+#else
float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */
+#endif
const int16_t num_channels, /* i : number of channels to be processed */
const int16_t output_frame, /* i : number of samples per channel in the buffer */
const int16_t BER_detect /* i : BER detect flag */
@@ -137,11 +141,10 @@ void efap_determine_gains(
*----------------------------------------------------------------------------------*/
void ivas_sba_prototype_renderer(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
- const int16_t firstSubframe, /* i : First subframe to map */
- const int16_t nSubframes /* i : Number of subframes to map */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
+ const int16_t subframe /* i : Subframe to render */
);
ivas_error ivas_sba_get_hoa_dec_matrix(
@@ -159,6 +162,17 @@ void ivas_dirac_dec_binaural(
const int16_t nchan_transport /* i : number of transport channels */
);
+#ifdef JBM_TSM_ON_TCS
+void ivas_dirac_dec_binaural_render(
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */
+ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */
+ uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */
+ uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */
+ const int16_t nchan_transport, /* i : number of transport channels */
+ float *output_f[] /* o : rendered time signal */
+);
+#endif
+
ivas_error ivas_dirac_dec_init_binaural_data(
Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */
HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */
@@ -228,10 +242,15 @@ ivas_error ivas_td_binaural_renderer_unwrap(
const int16_t Opt_Headrotation, /* i : Head rotation flag */
#endif
const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */
-#ifdef TD5
- const IVAS_POSITION *Pos, /* i : Listener position data per subframe */
+ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t ism_md_subframe_update,
+#endif
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: SCE channels / Binaural synthesis */
+#else
+ float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
#endif
- float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */
const int16_t output_frame /* i : output frame length */
);
@@ -255,9 +274,7 @@ ivas_error ivas_td_binaural_open_unwrap(
const int16_t nchan_transport, /* i : Number of channels */
const IVAS_FORMAT ivas_format, /* i : IVAS format (ISM/MC) */
const AUDIO_CONFIG transport_config, /* i : Transport configuration */
-#ifdef TD5
const float *directivity, /* i : Directivity pattern (used for ISM) */
-#endif
const IVAS_OUTPUT_SETUP hTransSetup, /* i : Loudspeaker layout */
BINAURAL_TD_OBJECT_RENDERER_HANDLE *hBinRendererTd, /* o : TD renderer handle */
int32_t *binaural_latency_ns /* i : Binauralization delay */
@@ -266,9 +283,7 @@ ivas_error ivas_td_binaural_open_unwrap(
ivas_error ivas_td_binaural_open_ext(
TDREND_WRAPPER *pTDRend,
const IVAS_REND_AudioConfig inConfig,
-#ifdef TD5
RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration */
-#endif
LSSETUP_CUSTOM_STRUCT *customLsInput,
const int32_t output_Fs
);
@@ -280,29 +295,43 @@ void ivas_td_binaural_close(
ivas_error TDREND_GetMix(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: ISM object synth / rendered output in 0,1 */
+#else
float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */
+#endif
const int16_t subframe_length, /* i/o: subframe length */
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */
+ const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */
+#else
const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#endif
);
void TDREND_Update_listener_orientation(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */
const int16_t headRotEnabled, /* i : Headrotation flag */
-#ifdef TD5
const IVAS_QUATERNION *headPosition, /* i : Listener orientation */
- const IVAS_POSITION *Pos /* i : Listener Position */
-#else
- const IVAS_QUATERNION *headPosition /* i : Head Position */
-#endif
+ const IVAS_VECTOR3 *Pos /* i : Listener Position */
);
void TDREND_Update_object_positions(
BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */
const int16_t num_src, /* i : number of sources to render */
+#ifndef FIX_356_ISM_METADATA_SYNC
const int16_t lfe_idx, /* i : Input LFE index */
+#endif
const IVAS_FORMAT in_format, /* i : Format of input sources */
- const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */
+ const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */
+#ifndef FIX_356_ISM_METADATA_SYNC
+ ,
+#ifdef JBM_TSM_ON_TCS
+ float *output[] /* i/o: SCE/MC channels */
+#else
float output[][L_FRAME48k] /* i/o: SCE/MC channels */
+#endif
+#endif
);
void BSplineModelEvalDealloc(
@@ -373,7 +402,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
int16_t *itd, /* o: ITD value */
float *Gain, /* o: Gain value */
TDREND_SRC_t *Src_p,
+#ifdef FIX_356_ISM_METADATA_SYNC
+ const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */
+#else
const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */
+#endif
);
ivas_error TDREND_SRC_Alloc(
@@ -414,12 +447,8 @@ void TDREND_SPATIAL_VecMapToNewCoordSystem(
const float *DirVec_p, /* i : Direction vector */
const float *UpVec_p, /* i : Up vector */
const float *RightVec_p, /* i : Right vector */
-#ifdef TD5
float *MappedVec_p, /* o : Transformed vector */
float *LisRelPosAbs /* o : Transformed vector ignoring orientation */
-#else
- float *MappedVec_p /* o : Transformed vector */
-#endif
);
/*! r: Flag if the orientation has been updated */
@@ -485,12 +514,9 @@ void TDREND_firfilt(
const int16_t intp_count, /* i : interpolation count */
float *mem, /* i/o: filter memory */
const int16_t subframe_length, /* i : Length of signal */
-#ifdef TD5
const int16_t filterlength, /* i : Filter length */
- const float Gain /* i : Gain */
-#else
- const int16_t filterlength /* i : Filter length */
-#endif
+ const float Gain, /* i : Gain */
+ const float prevGain /* i : Previous gain */
);
@@ -503,9 +529,6 @@ ivas_error ivas_rend_openCrend(
const AUDIO_CONFIG inConfig,
const AUDIO_CONFIG outConfig,
RENDER_CONFIG_DATA *hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- int16_t Opt_Headrotation,
-#endif
HRTFS_CREND_HANDLE hSetOfHRTF,
const int32_t output_Fs
);
@@ -514,7 +537,8 @@ void ivas_rend_closeCrend(
CREND_WRAPPER_HANDLE *pCrend );
ivas_error ivas_rend_initCrendWrapper(
- CREND_WRAPPER_HANDLE *pCrend );
+ CREND_WRAPPER_HANDLE *pCrend
+);
ivas_error ivas_rend_crendProcess(
const CREND_WRAPPER *pCrend,
@@ -528,11 +552,30 @@ ivas_error ivas_rend_crendProcess(
#endif
IVAS_OUTPUT_SETUP_HANDLE hIntSetup,
EFAP_HANDLE hEFAPdata,
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: input/output audio channels */
+#else
float output[][L_FRAME48k], /* i/o: input/output audio channels */
- const int32_t output_Fs
+#endif
+ const int32_t output_Fs
+);
+
+#ifdef JBM_TSM_ON_TCS
+ivas_error ivas_rend_crendProcessSubframe(
+ const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */
+ const AUDIO_CONFIG inConfig, /* i : input audio configuration */
+ const AUDIO_CONFIG outConfig, /* i : output audio configuration */
+ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */
+ const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */
+ const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */
+ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */
+ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */
+ float *input_f[], /* i : transport channels */
+ float *output[], /* i/o: input/output audio channels */
+ const int16_t n_samples_to_render, /* i : output frame length per channel */
+ const int32_t output_Fs /* i : output sampling rate */
);
-
-
+#endif
ivas_error ivas_crend_init_from_rom(
@@ -572,16 +615,21 @@ void ivas_binaural_reverb_close(
REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */
);
-void ivas_binaural_reverb_processFrame(
- REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */
- const int16_t numInChannels, /* i : num input channels to be processed */
- float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */
- float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */
- float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */
- float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */
- const uint8_t offsetSamplesIO /* i : number of offset samples */
+void ivas_binaural_reverb_processSubframe(
+ REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */
+ const int16_t numInChannels, /* i : num input channels to be processed */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numSlots, /* i : number of slots to be processed */
+#endif
+ float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */
+ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */
+ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */
+ float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */
);
+#ifdef JBM_TSM_ON_TCS
+#endif
+
ivas_error ivas_reverb_open(
REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */
const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */
@@ -598,8 +646,13 @@ ivas_error ivas_reverb_process(
const REVERB_HANDLE hReverb, /* i : Reverberator handle */
const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */
const int16_t mix_signals, /* i : add reverb to output signal */
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[], /* i : the PCM audio to apply reverb on */
+ float *pcm_out[], /* o : the PCM audio with reverb applied */
+#else
float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */
float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */
+#endif
const int16_t i_ts /* i : subframe index */
);
@@ -785,7 +838,6 @@ ivas_error ivas_headTrack_open(
HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* o : head track handle */
);
-#ifdef FIX_I109_ORIENTATION_TRACKING
void ivas_headTrack_close(
HEAD_TRACK_DATA_HANDLE *hHeadTrackData /* i/o: head track handle */
);
@@ -799,14 +851,6 @@ void Euler2Quat(
float deg2rad( float degrees );
-#else
-void Quat2Euler(
- const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */
- float *yaw, /* o : yaw (z) */
- float *pitch, /* o : pitch (y) */
- float *roll /* o : roll (x) */
-);
-#endif
void QuatToRotMat(
@@ -835,7 +879,11 @@ void rotateFrame_shd(
#else
HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */
#endif
- float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: unrotated HOA3 signal buffer in TD */
+#else
+ float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */
+#endif
const int16_t subframe_len, /* i : subframe length per channel */
const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
const int16_t subframe_idx /* i : subframe index */
@@ -847,7 +895,11 @@ void rotateFrame_sd(
#else
HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */
#endif
- float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: unrotated SD signal buffer in TD */
+#else
+ float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */
+#endif
const int16_t subframe_len, /* i : subframe length per channel */
const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */
@@ -859,6 +911,9 @@ void rotateFrame_shd_cldfb(
float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */
float Rmat[3][3], /* i : real-space rotation matrix */
const int16_t nInChannels, /* i : number of channels */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to process */
+#endif
const int16_t shd_rot_max_order /* i : split-order rotation method */
);
@@ -872,6 +927,9 @@ void rotateFrame_sd_cldfb(
float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */
const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */
const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to process */
+#endif
const int16_t nb_band /* i : number of CLDFB bands to process */
);
@@ -971,36 +1029,29 @@ void QuaternionSlerp(
* Orientation tracking
*----------------------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_Init(
-#else
-void ivas_orient_trk_Init(
-#endif
ivas_orient_trk_state_t *pOTR /* i/o: orientation tracker handle */
);
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_SetTrackingType(
-#else
-void ivas_orient_trk_SetTrackingType(
-#endif
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */
+#else
const OTR_TRACKING_T trackingType /* i : orientation tracking type */
+#endif
);
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_SetReferenceRotation(
ivas_orient_trk_state_t *pOTR, /* i/o: orientatoin trakcer handle */
const IVAS_QUATERNION refRot /* i : reference rotation */
);
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
ivas_error ivas_orient_trk_SetReferenceVector(
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
const IVAS_VECTOR3 listenerPos, /* i : Listener position */
const IVAS_VECTOR3 refPos /* i : Reference position */
);
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
ivas_error ivas_orient_trk_GetMainOrientation(
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
@@ -1011,9 +1062,7 @@ ivas_error ivas_orient_trk_GetTrackedRotation(
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
IVAS_QUATERNION *pRotation /* i/o: processed rotation */
);
-#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error ivas_orient_trk_Process(
ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */
IVAS_QUATERNION absRot, /* i : absolute head rotation */
@@ -1021,25 +1070,6 @@ ivas_error ivas_orient_trk_Process(
IVAS_QUATERNION *pTrkRot /* o : tracked rotation */
);
-#else
-void ivas_orient_trk_SetAbsoluteOrientation(
- ivas_orient_trk_state_t *pOTR,
- const float yaw,
- const float pitch,
- const float roll
-);
-
-ivas_error ivas_orient_trk_Process(
- ivas_orient_trk_state_t *pOTR
-);
-
-void ivas_orient_trk_GetTrackedOrientation(
- ivas_orient_trk_state_t *pOTR,
- float *yaw,
- float *pitch,
- float *roll
-);
-#endif
/* clang-format on */
#endif /* IVAS_PROT_REND_H */
diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c
index 2fdbeff0eb1840ecd60eb4d579c4baecb3097cfe..efd866ccec4139bb01801f6141e6b4451776bc51 100644
--- a/lib_rend/ivas_render_config.c
+++ b/lib_rend/ivas_render_config.c
@@ -126,11 +126,9 @@ ivas_error ivas_render_config_init_from_rom(
mvr2r( ivas_reverb_default_RT60, ( *hRenderConfig )->roomAcoustics.pAcoustic_rt60, IVAS_REVERB_DEFAULT_N_BANDS );
mvr2r( ivas_reverb_default_DSR, ( *hRenderConfig )->roomAcoustics.pAcoustic_dsr, IVAS_REVERB_DEFAULT_N_BANDS );
-#ifdef TD5
( *hRenderConfig )->directivity[0] = 360.0f; /* Front cone */
( *hRenderConfig )->directivity[1] = 360.0f; /* Back cone */
( *hRenderConfig )->directivity[2] = 1.0f; /* Back attenuation */
-#endif
return IVAS_ERR_OK;
}
diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c
index 7dc05cff09b25f29368ce5e69109feaef40e721a..baa83fad0e58d61fb16a3eb6ccee7f1e0f353728 100644
--- a/lib_rend/ivas_reverb.c
+++ b/lib_rend/ivas_reverb.c
@@ -1437,7 +1437,11 @@ static void reverb_block(
static ivas_error downmix_input_block(
const REVERB_HANDLE hReverb,
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[],
+#else
float pcm_in[][L_FRAME48k],
+#endif
const AUDIO_CONFIG input_audio_config,
float *pPcm_out,
const int16_t input_offset )
@@ -1579,9 +1583,14 @@ ivas_error ivas_reverb_process(
const REVERB_HANDLE hReverb, /* i : Reverberator handle */
const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */
const int16_t mix_signals, /* i : add reverb to output signal */
- float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */
- float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */
- const int16_t i_ts /* i : subframe index */
+#ifdef JBM_TSM_ON_TCS
+ float *pcm_in[], /* i : the PCM audio to apply reverb on */
+ float *pcm_out[], /* o : the PCM audio with reverb applied */
+#else
+ float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */
+ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */
+#endif
+ const int16_t i_ts /* i : subframe index */
)
{
float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES];
@@ -1616,25 +1625,39 @@ ivas_error ivas_reverb_process(
* Compute the reverberation - room effect
*------------------------------------------------------------------------*/
-void ivas_binaural_reverb_processFrame(
- REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */
- const int16_t numInChannels, /* i : num inputs to be processed */
- float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */
- float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */
- float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */
- float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */
- const uint8_t offsetSamplesIO /* i : number of offset samples */
+void ivas_binaural_reverb_processSubframe(
+ REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */
+ const int16_t numInChannels, /* i : num inputs to be processed */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numSlots, /* i : number of slots to be processed */
+#endif
+ float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */
+ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */
+ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */
+ float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */
)
{
/* Declare the required variables */
int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr;
float **tapRealPr, **tapImagPr;
+ push_wmops( "binaural_reverb" );
/* 1) Rotate the data in the loop buffer of the reverberator.
* Notice that the audio at the loop buffers is at time-inverted order
* for convolution purposes later on. */
for ( bin = 0; bin < hReverb->numBins; bin++ )
{
+#ifdef JBM_TSM_ON_TCS
+ /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */
+ mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + numSlots, hReverb->loopBufLength[bin] );
+ mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + numSlots, hReverb->loopBufLength[bin] );
+
+ /* Add the data from the end of the loop to the beginning, with an attenuation factor
+ * according to RT60. This procedure generates an IIR decaying response. The response
+ * is decorrelated later on. */
+ v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], numSlots );
+ v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], numSlots );
+#else
/* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */
mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] );
mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] );
@@ -1644,15 +1667,23 @@ void ivas_binaural_reverb_processFrame(
* is decorrelated later on. */
v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize );
v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize );
+#endif
}
/* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */
idx = hReverb->preDelayBufferIndex;
+#ifdef JBM_TSM_ON_TCS
+ for ( sample = 0; sample < numSlots; sample++ )
+#else
for ( sample = 0; sample < hReverb->blockSize; sample++ )
+#endif
{
- uint16_t sampleWithOffset;
- sampleWithOffset = sample + offsetSamplesIO;
+#ifdef JBM_TSM_ON_TCS
+ invertSampleIndex = numSlots - sample - 1;
+#else
invertSampleIndex = hReverb->blockSize - sample - 1;
+#endif
+
for ( bin = 0; bin < hReverb->numBins; bin++ )
{
/* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order.
@@ -1669,13 +1700,13 @@ void ivas_binaural_reverb_processFrame(
{
if ( ch % 2 )
{
- v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins );
- v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins );
+ v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins );
+ v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins );
}
else
{
- v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins );
- v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins );
+ v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins );
+ v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins );
}
}
idx = ( idx + 1 ) % hReverb->preDelayBufferLength;
@@ -1690,17 +1721,41 @@ void ivas_binaural_reverb_processFrame(
/* These tap pointers have been determined to point to the loop buffer at sparse locations */
tapRealPr = hReverb->tapPointersReal[bin][ch];
tapImagPr = hReverb->tapPointersImag[bin][ch];
+
phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch];
/* Flush output */
+#ifdef JBM_TSM_ON_TCS
+ set_f( hReverb->outputBufferReal[bin][ch], 0.0f, numSlots );
+ set_f( hReverb->outputBufferImag[bin][ch], 0.0f, numSlots );
+#else
set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize );
set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize );
+#endif
/* Add from temporally decaying sparse tap locations the audio to the output. */
for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ )
{
switch ( phaseShiftTypePr[tapIdx] )
{
+#ifdef JBM_TSM_ON_TCS
+ case 0: /* 0 degrees phase */
+ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots );
+ v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots );
+ break;
+ case 1: /* 90 degrees phase */
+ v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots );
+ v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots );
+ break;
+ case 2: /* 180 degrees phase */
+ v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots );
+ v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots );
+ break;
+ default: /* 270 degrees phase */
+ v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots );
+ v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots );
+ break;
+#else
case 0: /* 0 degrees phase */
v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize );
v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize );
@@ -1717,6 +1772,7 @@ void ivas_binaural_reverb_processFrame(
v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize );
v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize );
break;
+#endif
}
}
}
@@ -1726,7 +1782,11 @@ void ivas_binaural_reverb_processFrame(
{
if ( hReverb->useBinauralCoherence )
{
+#ifdef JBM_TSM_ON_TCS
+ for ( sample = 0; sample < numSlots; sample++ )
+#else
for ( sample = 0; sample < hReverb->blockSize; sample++ )
+#endif
{
float leftRe, rightRe, leftIm, rightIm;
@@ -1747,30 +1807,38 @@ void ivas_binaural_reverb_processFrame(
/* 4) Write data to output */
for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
{
+#ifdef JBM_TSM_ON_TCS
+ for ( sample = 0; sample < numSlots; sample++ )
+#else
for ( sample = 0; sample < hReverb->blockSize; sample++ )
+#endif
{
- uint16_t sampleWithOffset;
-
- sampleWithOffset = sample + offsetSamplesIO;
- /* Audio was in the temporally inverted order for convolution, re-invert audio to output */
+/* Audio was in the temporally inverted order for convolution, re-invert audio to output */
+#ifdef JBM_TSM_ON_TCS
+ invertSampleIndex = numSlots - sample - 1;
+#else
invertSampleIndex = hReverb->blockSize - sample - 1;
+#endif
for ( bin = 0; bin < hReverb->numBins; bin++ )
{
- outReal[ch][sampleWithOffset][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex];
- outImag[ch][sampleWithOffset][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex];
+ outReal[ch][sample][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex];
+ outImag[ch][sample][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex];
}
for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ )
{
- outReal[ch][sampleWithOffset][bin] = 0.0f;
- outImag[ch][sampleWithOffset][bin] = 0.0f;
+ outReal[ch][sample][bin] = 0.0f;
+ outImag[ch][sample][bin] = 0.0f;
}
}
}
+ pop_wmops();
return;
}
+#ifdef JBM_TSM_ON_TCS
+#endif
/*-------------------------------------------------------------------------
* ivas_binaural_reverb_open()
@@ -1894,26 +1962,26 @@ ivas_error ivas_binaural_reverb_open(
}
}
- if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+
+ if ( ( roomAcoustics ) && ( roomAcoustics->override ) )
{
- if ( !roomAcoustics->override )
+ ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene );
+ ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, t60, ene );
+ ivas_binaural_reverb_setPreDelay( hReverb, (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ) );
+ }
+ else
+ {
+ if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
{
ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, hHrtfFastConv->fastconvReverberationTimes, hHrtfFastConv->fastconvReverberationEneCorrections );
ivas_binaural_reverb_setPreDelay( hReverb, 10 );
}
else
{
- ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene );
- ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, t60, ene );
- ivas_binaural_reverb_setPreDelay( hReverb, (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ) );
+ ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections );
+ ivas_binaural_reverb_setPreDelay( hReverb, 10 );
}
}
- else
- {
- ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections );
- ivas_binaural_reverb_setPreDelay( hReverb, 10 );
- }
-
return IVAS_ERR_OK;
}
diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c
index 70daa6dff9ab5eafe41320317533c40ec1ed1ae2..4b56fb4883d7fb0b26d230409dd250cb75406f85 100644
--- a/lib_rend/ivas_rom_TdBinauralRenderer.c
+++ b/lib_rend/ivas_rom_TdBinauralRenderer.c
@@ -41,6 +41,7 @@
#include "ivas_cnst.h"
#include "wmc_auto.h"
+#define WMC_TOOL_SKIP
/*-------------------------------------------------------------------------
* TD Binaural rendering related ROM tables
@@ -12456,4 +12457,6 @@ const uint32_t orange53_rom_ITD_elevBsShape[28] = {
0x3ebda12f,0x3f12f685,0x3f2aaaab,
};
+#undef WMC_TOOL_SKIP
+
/* clang-format on */
diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c
index 763777ad288c2be764a3863d8439000c7d55b439..560a1382d4da5baa0b2f20df636b2f1c17a04bac 100644
--- a/lib_rend/ivas_rom_binauralRenderer.c
+++ b/lib_rend/ivas_rom_binauralRenderer.c
@@ -41,6 +41,8 @@
/* clang-format off */
+#define WMC_TOOL_SKIP
+
/*-------------------------------------------------------------------------
* Binaural rendering related ROM tables
*------------------------------------------------------------------------*/
@@ -51,6 +53,9 @@
/*
* Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256
*/
+
+#ifndef UPDATE_SBA_FILTER
+
const float FASTCONV_HOA3_latency_s = 0.001979167f;
const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]=
{
@@ -3668,6 +3673,7071 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT
}
};
+#endif
+
+#ifdef UPDATE_SBA_FILTER
+
+const float FASTCONV_HOA3_latency_s = 0.000666667f;
+const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]=
+{
+ {
+ {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f},
+ {+0.041076f, +0.081510f, -0.101574f, +0.012332f, +0.000133f},
+ {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f},
+ {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f},
+ {+0.008304f, +0.004854f, +0.003618f, -0.000840f, -0.000150f},
+ {+0.005344f, +0.010835f, +0.007864f, +0.004915f, -0.000112f},
+ {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f},
+ {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f},
+ {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f},
+ {+0.010068f, -0.052648f, +0.026763f, +0.010223f, +0.000366f},
+ {+0.000943f, +0.017480f, -0.020482f, -0.001034f, -0.000058f},
+ {+0.002377f, -0.034436f, -0.006489f, +0.012518f, +0.000220f},
+ {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f},
+ {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f},
+ {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f},
+ {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f}
+ },
+ {
+ {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f},
+ {-0.088569f, +0.331317f, +0.135589f, -0.009798f, -0.000139f},
+ {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f},
+ {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f},
+ {-0.013525f, -0.047393f, -0.001706f, +0.001388f, +0.000191f},
+ {-0.006413f, -0.030122f, -0.020701f, -0.011138f, +0.000148f},
+ {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f},
+ {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f},
+ {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f},
+ {-0.016939f, -0.106048f, -0.043760f, -0.005027f, -0.000470f},
+ {-0.000739f, -0.002371f, -0.021897f, -0.001907f, +0.000076f},
+ {-0.005038f, -0.073983f, -0.110448f, -0.018835f, -0.000283f},
+ {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f},
+ {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f},
+ {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f},
+ {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f}
+ },
+ {
+ {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f},
+ {+0.085624f, +0.535380f, -0.135686f, -0.024218f, -0.000137f},
+ {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f},
+ {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f},
+ {+0.004547f, -0.088202f, +0.042587f, -0.003924f, +0.000093f},
+ {-0.003101f, -0.099791f, +0.033209f, +0.007324f, +0.000060f},
+ {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f},
+ {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f},
+ {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f},
+ {+0.008367f, -0.030365f, -0.081942f, -0.019445f, -0.000222f},
+ {-0.002027f, -0.059247f, +0.024597f, +0.009143f, +0.000033f},
+ {+0.005485f, -0.016036f, -0.189920f, +0.005523f, -0.000134f},
+ {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f},
+ {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f},
+ {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f},
+ {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f}
+ },
+ {
+ {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f},
+ {-0.073631f, +0.563948f, +0.256507f, +0.030068f, +0.000165f},
+ {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f},
+ {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f},
+ {-0.000742f, +0.006564f, +0.155719f, +0.010210f, -0.000207f},
+ {+0.003772f, -0.011095f, +0.118202f, +0.002442f, -0.000158f},
+ {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f},
+ {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f},
+ {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f},
+ {-0.007216f, +0.258967f, +0.290441f, +0.007092f, +0.000519f},
+ {+0.003522f, -0.023316f, +0.032467f, -0.009674f, -0.000084f},
+ {-0.006507f, +0.177693f, +0.033997f, -0.006462f, +0.000311f},
+ {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f},
+ {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f},
+ {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f},
+ {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f}
+ },
+ {
+ {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f},
+ {+0.067605f, -0.097306f, +0.721167f, +0.014182f, +0.000134f},
+ {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f},
+ {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f},
+ {+0.009045f, +0.033260f, +0.131601f, -0.010659f, -0.000033f},
+ {+0.006391f, +0.001186f, +0.117010f, -0.003913f, -0.000007f},
+ {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f},
+ {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f},
+ {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f},
+ {+0.013866f, +0.056049f, +0.470046f, +0.033031f, +0.000066f},
+ {-0.002003f, +0.013997f, -0.006699f, +0.002838f, -0.000007f},
+ {+0.005432f, +0.012448f, +0.193385f, +0.021709f, +0.000041f},
+ {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f},
+ {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f},
+ {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f},
+ {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f}
+ },
+ {
+ {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f},
+ {-0.066811f, -0.547107f, +0.401585f, -0.049258f, -0.000209f},
+ {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f},
+ {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f},
+ {-0.020147f, -0.183472f, -0.029803f, +0.002654f, +0.000199f},
+ {-0.004470f, -0.071648f, +0.045482f, -0.003212f, +0.000142f},
+ {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f},
+ {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f},
+ {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f},
+ {-0.006262f, -0.197324f, +0.174496f, -0.041478f, -0.000509f},
+ {-0.000909f, +0.022088f, -0.010300f, +0.001930f, +0.000082f},
+ {+0.000576f, -0.053541f, +0.096593f, -0.021942f, -0.000302f},
+ {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f},
+ {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f},
+ {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f},
+ {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f}
+ },
+ {
+ {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f},
+ {+0.083119f, -0.442745f, -0.062014f, +0.030630f, -0.000109f},
+ {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f},
+ {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f},
+ {+0.025539f, -0.285695f, -0.030687f, +0.001281f, -0.000018f},
+ {-0.015563f, -0.014341f, -0.021407f, +0.004386f, -0.000034f},
+ {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f},
+ {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f},
+ {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f},
+ {-0.012587f, -0.147413f, -0.020658f, +0.013969f, +0.000077f},
+ {+0.003103f, +0.017462f, -0.008157f, -0.001803f, -0.000018f},
+ {-0.001965f, +0.006861f, -0.032042f, +0.005627f, +0.000042f},
+ {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f},
+ {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f},
+ {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f},
+ {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f}
+ },
+ {
+ {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f},
+ {-0.064730f, -0.498651f, -0.047336f, +0.004429f, +0.000255f},
+ {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f},
+ {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f},
+ {-0.008298f, -0.311166f, -0.004422f, +0.002306f, -0.000173f},
+ {+0.024372f, +0.077330f, -0.000442f, +0.001491f, -0.000110f},
+ {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f},
+ {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f},
+ {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f},
+ {+0.016067f, -0.071916f, -0.031764f, +0.005887f, +0.000449f},
+ {-0.001118f, +0.007300f, -0.004732f, +0.000912f, -0.000072f},
+ {-0.012764f, +0.015163f, -0.034285f, +0.004782f, +0.000265f},
+ {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f},
+ {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f},
+ {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f},
+ {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f}
+ },
+ {
+ {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f},
+ {-0.072210f, -0.453377f, -0.012668f, -0.009988f, +0.000056f},
+ {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f},
+ {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f},
+ {-0.048389f, -0.243348f, +0.011742f, -0.002577f, +0.000053f},
+ {-0.000883f, +0.129298f, +0.003415f, -0.002563f, +0.000054f},
+ {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f},
+ {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f},
+ {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f},
+ {-0.003882f, -0.022910f, +0.004172f, -0.004195f, -0.000185f},
+ {-0.007316f, +0.007332f, +0.005614f, -0.000479f, +0.000037f},
+ {+0.030651f, -0.049980f, +0.004306f, -0.003095f, -0.000103f},
+ {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f},
+ {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f},
+ {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f},
+ {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f}
+ },
+ {
+ {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f},
+ {+0.222358f, -0.019823f, +0.045919f, -0.001569f, -0.000284f},
+ {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f},
+ {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f},
+ {+0.104303f, -0.038679f, +0.004300f, -0.001876f, +0.000138f},
+ {-0.031107f, +0.090841f, +0.009802f, -0.001340f, +0.000075f},
+ {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f},
+ {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f},
+ {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f},
+ {+0.001966f, -0.020932f, +0.017205f, -0.001490f, -0.000358f},
+ {+0.013558f, +0.031486f, +0.001450f, -0.000305f, +0.000057f},
+ {-0.020576f, -0.126851f, +0.015311f, -0.000876f, -0.000211f},
+ {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f},
+ {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f},
+ {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f},
+ {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f}
+ },
+ {
+ {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f},
+ {-0.128697f, +0.502946f, -0.012208f, +0.003598f, +0.000018f},
+ {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f},
+ {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f},
+ {-0.072445f, +0.199735f, -0.008865f, +0.001996f, -0.000070f},
+ {+0.035970f, +0.000468f, -0.003327f, +0.001758f, -0.000054f},
+ {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f},
+ {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f},
+ {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f},
+ {-0.011400f, -0.010732f, -0.007406f, +0.002026f, +0.000250f},
+ {-0.002851f, +0.052737f, -0.000419f, +0.000375f, -0.000049f},
+ {-0.020950f, -0.124942f, -0.003929f, +0.001693f, +0.000137f},
+ {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f},
+ {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f},
+ {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f},
+ {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f}
+ },
+ {
+ {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f},
+ {-0.174716f, +0.431741f, -0.037189f, +0.000731f, +0.000283f},
+ {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f},
+ {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f},
+ {-0.046880f, +0.228632f, -0.012580f, +0.001764f, -0.000105f},
+ {-0.015443f, -0.068044f, -0.005570f, +0.000844f, -0.000048f},
+ {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f},
+ {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f},
+ {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f},
+ {+0.006601f, +0.021923f, -0.013349f, +0.000309f, +0.000258f},
+ {-0.019016f, +0.023410f, -0.005296f, +0.000367f, -0.000039f},
+ {+0.051437f, -0.010933f, -0.004546f, -0.000118f, +0.000155f},
+ {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f},
+ {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f},
+ {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f},
+ {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f}
+ },
+ {
+ {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f},
+ {+0.261169f, -0.235971f, +0.033757f, -0.001621f, -0.000093f},
+ {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f},
+ {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f},
+ {+0.111926f, -0.011250f, +0.016908f, -0.001748f, +0.000072f},
+ {-0.005469f, -0.082676f, +0.002169f, -0.001143f, +0.000043f},
+ {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f},
+ {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f},
+ {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f},
+ {+0.012620f, +0.018407f, +0.006593f, -0.002080f, -0.000273f},
+ {+0.020511f, -0.042167f, +0.004809f, -0.000322f, +0.000054f},
+ {-0.032247f, +0.119711f, -0.002446f, -0.001305f, -0.000148f},
+ {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f},
+ {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f},
+ {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f},
+ {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f}
+ },
+ {
+ {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f},
+ {+0.049598f, -0.562660f, +0.018307f, +0.000353f, -0.000250f},
+ {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f},
+ {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f},
+ {-0.023452f, -0.216602f, +0.003361f, -0.001302f, +0.000079f},
+ {+0.022798f, -0.048857f, +0.002028f, -0.000528f, +0.000034f},
+ {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f},
+ {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f},
+ {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f},
+ {-0.015824f, -0.032277f, +0.008777f, +0.000341f, -0.000168f},
+ {+0.010909f, -0.060681f, +0.000865f, -0.000330f, +0.000023f},
+ {-0.018513f, +0.140495f, +0.006788f, +0.000319f, -0.000106f},
+ {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f},
+ {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f},
+ {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f},
+ {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f}
+ },
+ {
+ {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f},
+ {-0.297362f, -0.028772f, -0.040257f, +0.001002f, +0.000153f},
+ {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f},
+ {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f},
+ {-0.100486f, -0.097500f, -0.017137f, +0.001413f, -0.000066f},
+ {-0.042930f, +0.041353f, -0.001818f, +0.000969f, -0.000030f},
+ {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f},
+ {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f},
+ {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f},
+ {-0.005351f, -0.056149f, -0.003091f, +0.002220f, +0.000265f},
+ {-0.035484f, +0.008203f, -0.004198f, +0.000217f, -0.000054f},
+ {+0.049383f, +0.039088f, +0.002024f, +0.001275f, +0.000143f},
+ {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f},
+ {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f},
+ {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f},
+ {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f}
+ },
+ {
+ {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f},
+ {+0.068322f, +0.534398f, -0.000794f, -0.001015f, +0.000195f},
+ {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f},
+ {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f},
+ {+0.074868f, +0.177414f, +0.007217f, +0.000977f, -0.000063f},
+ {+0.040080f, +0.169063f, +0.003424f, +0.000213f, -0.000031f},
+ {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f},
+ {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f},
+ {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f},
+ {+0.022634f, -0.009810f, -0.007400f, -0.000511f, +0.000099f},
+ {+0.010732f, +0.077733f, +0.000399f, +0.000274f, -0.000009f},
+ {-0.039390f, -0.089325f, -0.008313f, -0.000351f, +0.000070f},
+ {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f},
+ {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f},
+ {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f},
+ {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f}
+ },
+ {
+ {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f},
+ {+0.272424f, +0.216540f, +0.039997f, -0.001031f, -0.000186f},
+ {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f},
+ {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f},
+ {+0.067471f, +0.194793f, +0.010208f, -0.001216f, +0.000058f},
+ {+0.018637f, +0.214052f, -0.004837f, -0.000884f, +0.000020f},
+ {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f},
+ {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f},
+ {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f},
+ {-0.014798f, +0.052375f, +0.000623f, -0.002191f, -0.000241f},
+ {+0.034285f, +0.039743f, +0.005351f, -0.000109f, +0.000050f},
+ {+0.007201f, -0.159482f, +0.003886f, -0.001201f, -0.000130f},
+ {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f},
+ {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f},
+ {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f},
+ {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f}
+ },
+ {
+ {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f},
+ {-0.145635f, -0.430918f, -0.013134f, +0.001141f, -0.000134f},
+ {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f},
+ {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f},
+ {-0.114138f, -0.085208f, -0.011213f, -0.000798f, +0.000055f},
+ {-0.095938f, +0.054666f, -0.000697f, -0.000059f, +0.000033f},
+ {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f},
+ {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f},
+ {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f},
+ {-0.009119f, +0.057095f, +0.007675f, +0.000456f, -0.000052f},
+ {-0.027961f, -0.057568f, -0.003773f, -0.000262f, -0.000002f},
+ {+0.030433f, -0.136477f, +0.002756f, +0.000256f, -0.000046f},
+ {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f},
+ {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f},
+ {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f},
+ {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f}
+ },
+ {
+ {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f},
+ {-0.234234f, -0.291735f, -0.035875f, +0.001265f, +0.000192f},
+ {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f},
+ {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f},
+ {-0.003204f, -0.260777f, -0.001135f, +0.001218f, -0.000051f},
+ {+0.094495f, -0.222636f, +0.006686f, +0.000805f, -0.000016f},
+ {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f},
+ {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f},
+ {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f},
+ {+0.028004f, -0.004399f, +0.001485f, +0.002043f, +0.000214f},
+ {-0.030214f, -0.052517f, -0.005355f, +0.000063f, -0.000045f},
+ {-0.064016f, -0.008538f, -0.001790f, +0.001210f, +0.000117f},
+ {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f},
+ {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f},
+ {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f},
+ {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f}
+ },
+ {
+ {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f},
+ {+0.196112f, +0.377527f, +0.024063f, -0.000894f, +0.000082f},
+ {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f},
+ {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f},
+ {+0.109837f, -0.090094f, +0.008580f, +0.000595f, -0.000051f},
+ {+0.015004f, -0.336419f, -0.000747f, +0.000099f, -0.000037f},
+ {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f},
+ {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f},
+ {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f},
+ {-0.021795f, -0.078114f, -0.010687f, -0.000406f, +0.000022f},
+ {+0.048839f, +0.075397f, +0.009105f, +0.000275f, +0.000010f},
+ {+0.060558f, +0.174519f, +0.000133f, -0.000349f, +0.000030f},
+ {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f},
+ {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f},
+ {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f},
+ {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f}
+ },
+ {
+ {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f},
+ {+0.203183f, +0.369192f, +0.029570f, -0.001470f, -0.000179f},
+ {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f},
+ {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f},
+ {-0.062623f, +0.173224f, -0.004907f, -0.001276f, +0.000047f},
+ {-0.122967f, -0.126986f, -0.011441f, -0.000914f, +0.000015f},
+ {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f},
+ {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f},
+ {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f},
+ {-0.015861f, -0.086444f, +0.001699f, -0.001895f, -0.000191f},
+ {+0.021170f, +0.125446f, -0.000128f, -0.000133f, +0.000040f},
+ {+0.009541f, +0.253886f, -0.000901f, -0.000985f, -0.000105f},
+ {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f},
+ {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f},
+ {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f},
+ {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f}
+ },
+ {
+ {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f},
+ {-0.247632f, -0.326555f, -0.030602f, +0.000692f, -0.000048f},
+ {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f},
+ {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f},
+ {-0.050312f, +0.188989f, -0.003722f, -0.000209f, +0.000050f},
+ {+0.100154f, +0.206241f, +0.011197f, +0.000132f, +0.000040f},
+ {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f},
+ {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f},
+ {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f},
+ {+0.049708f, +0.006526f, +0.011594f, +0.000511f, -0.000001f},
+ {-0.089665f, -0.042291f, -0.010250f, -0.000131f, -0.000016f},
+ {-0.097341f, +0.094533f, -0.003394f, +0.000253f, -0.000020f},
+ {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f},
+ {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f},
+ {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f},
+ {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f}
+ },
+ {
+ {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f},
+ {-0.162130f, -0.457377f, -0.023723f, +0.001331f, +0.000162f},
+ {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f},
+ {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f},
+ {+0.074601f, -0.003099f, +0.007367f, +0.000899f, -0.000047f},
+ {+0.032786f, +0.305719f, +0.004336f, +0.000704f, -0.000017f},
+ {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f},
+ {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f},
+ {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f},
+ {-0.025959f, +0.115431f, -0.002496f, +0.001721f, +0.000173f},
+ {+0.041136f, -0.248497f, +0.009339f, +0.000010f, -0.000035f},
+ {+0.096543f, -0.197881f, +0.009153f, +0.000920f, +0.000096f},
+ {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f},
+ {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f},
+ {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f},
+ {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f}
+ },
+ {
+ {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f},
+ {+0.297115f, +0.254096f, +0.039956f, -0.000532f, +0.000029f},
+ {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f},
+ {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f},
+ {-0.011296f, -0.129516f, -0.000519f, +0.000384f, -0.000049f},
+ {-0.122480f, +0.073347f, -0.013051f, -0.000154f, -0.000043f},
+ {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f},
+ {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f},
+ {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f},
+ {-0.038364f, +0.096477f, -0.011620f, -0.000633f, -0.000016f},
+ {+0.083812f, -0.194659f, +0.004197f, +0.000207f, +0.000021f},
+ {+0.014333f, -0.322027f, -0.003857f, -0.000214f, +0.000012f},
+ {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f},
+ {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f},
+ {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f},
+ {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f}
+ },
+ {
+ {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f},
+ {+0.103203f, +0.556970f, +0.012926f, -0.001069f, -0.000150f},
+ {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f},
+ {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f},
+ {-0.036140f, -0.084377f, -0.005388f, -0.000960f, +0.000048f},
+ {+0.073377f, -0.218074f, +0.003890f, -0.000548f, +0.000019f},
+ {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f},
+ {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f},
+ {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f},
+ {+0.049659f, -0.036455f, +0.006360f, -0.001588f, -0.000158f},
+ {-0.120231f, +0.105131f, -0.009262f, -0.000134f, +0.000029f},
+ {-0.112765f, -0.136113f, -0.006454f, -0.000956f, -0.000090f},
+ {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f},
+ {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f},
+ {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f},
+ {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f}
+ },
+ {
+ {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f},
+ {-0.335782f, -0.115073f, -0.042124f, +0.000524f, -0.000017f},
+ {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f},
+ {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f},
+ {+0.029086f, +0.017821f, +0.006048f, -0.000346f, +0.000049f},
+ {+0.042390f, -0.261438f, +0.007011f, -0.000009f, +0.000045f},
+ {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f},
+ {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f},
+ {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f},
+ {+0.018408f, -0.085038f, +0.009119f, +0.000628f, +0.000033f},
+ {+0.008166f, +0.290055f, -0.001289f, -0.000009f, -0.000025f},
+ {+0.083446f, +0.145097f, +0.006817f, +0.000355f, -0.000005f},
+ {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f},
+ {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f},
+ {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f},
+ {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f}
+ },
+ {
+ {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f},
+ {-0.018754f, -0.598224f, -0.004168f, +0.000868f, +0.000145f},
+ {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f},
+ {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f},
+ {-0.000800f, +0.063354f, -0.000572f, +0.000962f, -0.000051f},
+ {-0.090619f, -0.057573f, -0.010215f, +0.000723f, -0.000024f},
+ {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f},
+ {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f},
+ {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f},
+ {-0.055793f, +0.030364f, -0.009245f, +0.001646f, +0.000143f},
+ {+0.108310f, +0.127663f, +0.016687f, -0.000038f, -0.000024f},
+ {+0.021618f, +0.220697f, +0.010039f, +0.000820f, +0.000085f},
+ {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f},
+ {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f},
+ {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f},
+ {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f}
+ },
+ {
+ {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f},
+ {+0.330415f, -0.056420f, +0.045563f, -0.000643f, +0.000004f},
+ {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f},
+ {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f},
+ {-0.023615f, +0.028111f, -0.005911f, +0.000294f, -0.000047f},
+ {+0.037741f, +0.135965f, -0.001385f, -0.000118f, -0.000047f},
+ {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f},
+ {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f},
+ {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f},
+ {-0.012169f, +0.103078f, -0.005526f, -0.000708f, -0.000048f},
+ {-0.074830f, -0.156990f, -0.009538f, +0.000116f, +0.000028f},
+ {-0.062857f, +0.082116f, -0.012816f, -0.000338f, -0.000001f},
+ {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f},
+ {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f},
+ {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f},
+ {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f}
+ },
+ {
+ {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f},
+ {-0.047047f, +0.524471f, -0.005924f, -0.000814f, -0.000145f},
+ {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f},
+ {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f},
+ {+0.026484f, -0.050686f, +0.004980f, -0.000903f, +0.000054f},
+ {+0.034959f, +0.130515f, +0.008100f, -0.000616f, +0.000030f},
+ {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f},
+ {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f},
+ {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f},
+ {+0.074905f, -0.029652f, +0.011288f, -0.001578f, -0.000126f},
+ {-0.054496f, -0.184572f, -0.009789f, -0.000066f, +0.000019f},
+ {+0.016479f, -0.037096f, -0.001911f, -0.000841f, -0.000081f},
+ {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f},
+ {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f},
+ {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f},
+ {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f}
+ },
+ {
+ {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f},
+ {-0.307994f, +0.118968f, -0.043852f, +0.000752f, +0.000013f},
+ {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f},
+ {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f},
+ {+0.010325f, -0.076779f, +0.004480f, -0.000277f, +0.000045f},
+ {-0.047884f, -0.004957f, -0.004446f, +0.000008f, +0.000047f},
+ {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f},
+ {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f},
+ {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f},
+ {-0.006631f, -0.159391f, +0.003115f, +0.000670f, +0.000060f},
+ {+0.094163f, +0.047695f, +0.013081f, -0.000014f, -0.000031f},
+ {+0.015662f, -0.033250f, +0.008826f, +0.000442f, +0.000008f},
+ {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f},
+ {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f},
+ {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f},
+ {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f}
+ },
+ {
+ {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f},
+ {+0.090327f, -0.495394f, +0.013216f, +0.000916f, +0.000142f},
+ {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f},
+ {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f},
+ {-0.048231f, +0.015397f, -0.007225f, +0.000847f, -0.000058f},
+ {+0.004788f, -0.088135f, +0.001735f, +0.000622f, -0.000036f},
+ {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f},
+ {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f},
+ {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f},
+ {-0.095197f, -0.024052f, -0.012511f, +0.001509f, +0.000110f},
+ {+0.005662f, +0.184911f, +0.000567f, +0.000000f, -0.000014f},
+ {+0.009469f, -0.021505f, +0.002081f, +0.000772f, +0.000077f},
+ {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f},
+ {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f},
+ {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f},
+ {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f}
+ },
+ {
+ {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f},
+ {+0.290883f, -0.185607f, +0.040080f, -0.000773f, -0.000032f},
+ {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f},
+ {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f},
+ {+0.015723f, +0.117462f, +0.000807f, +0.000218f, -0.000042f},
+ {+0.035133f, -0.040557f, +0.002714f, -0.000053f, -0.000045f},
+ {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f},
+ {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f},
+ {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f},
+ {+0.046438f, +0.197810f, +0.002809f, -0.000665f, -0.000069f},
+ {-0.091389f, +0.035774f, -0.012879f, +0.000048f, +0.000034f},
+ {-0.015830f, -0.061261f, -0.007852f, -0.000438f, -0.000014f},
+ {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f},
+ {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f},
+ {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f},
+ {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f}
+ },
+ {
+ {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f},
+ {-0.130636f, +0.461671f, -0.019013f, -0.001042f, -0.000135f},
+ {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f},
+ {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f},
+ {+0.057782f, +0.056244f, +0.005456f, -0.000765f, +0.000061f},
+ {-0.029537f, +0.058278f, -0.004239f, -0.000490f, +0.000041f},
+ {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f},
+ {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f},
+ {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f},
+ {+0.095269f, +0.125227f, +0.010570f, -0.001415f, -0.000094f},
+ {+0.036826f, -0.161036f, +0.004519f, -0.000009f, +0.000008f},
+ {-0.033206f, -0.037588f, -0.003181f, -0.000776f, -0.000072f},
+ {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f},
+ {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f},
+ {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f},
+ {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f}
+ },
+ {
+ {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f},
+ {-0.271075f, +0.243750f, -0.037165f, +0.000660f, +0.000051f},
+ {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f},
+ {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f},
+ {-0.051695f, -0.108630f, -0.002988f, -0.000126f, +0.000040f},
+ {-0.009503f, +0.085941f, -0.000815f, +0.000139f, +0.000044f},
+ {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f},
+ {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f},
+ {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f},
+ {-0.093434f, -0.165866f, -0.008284f, +0.000735f, +0.000077f},
+ {+0.070607f, -0.107384f, +0.011250f, -0.000036f, -0.000037f},
+ {+0.051205f, +0.088169f, +0.009120f, +0.000422f, +0.000021f},
+ {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f},
+ {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f},
+ {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f},
+ {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f}
+ },
+ {
+ {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f},
+ {+0.165837f, -0.426649f, +0.024449f, +0.001120f, +0.000123f},
+ {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f},
+ {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f},
+ {-0.039815f, -0.122590f, -0.005933f, +0.000681f, -0.000065f},
+ {+0.034180f, +0.017407f, +0.005868f, +0.000354f, -0.000044f},
+ {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f},
+ {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f},
+ {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f},
+ {-0.065165f, -0.208130f, -0.007649f, +0.001302f, +0.000078f},
+ {-0.065730f, +0.103768f, -0.008899f, -0.000008f, -0.000000f},
+ {+0.017223f, +0.140007f, +0.001227f, +0.000774f, +0.000066f},
+ {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f},
+ {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f},
+ {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f},
+ {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f}
+ },
+ {
+ {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f},
+ {+0.251749f, -0.291487f, +0.034882f, -0.000530f, -0.000064f},
+ {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f},
+ {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f},
+ {+0.065186f, +0.041803f, +0.007285f, +0.000055f, -0.000040f},
+ {-0.015347f, -0.057135f, -0.002287f, -0.000244f, -0.000046f},
+ {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f},
+ {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f},
+ {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f},
+ {+0.120059f, +0.080527f, +0.013286f, -0.000793f, -0.000086f},
+ {-0.042102f, +0.139525f, -0.007143f, -0.000010f, +0.000040f},
+ {-0.075712f, +0.002196f, -0.010631f, -0.000380f, -0.000025f},
+ {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f},
+ {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f},
+ {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f},
+ {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f}
+ },
+ {
+ {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f},
+ {-0.199395f, +0.402227f, -0.030381f, -0.001070f, -0.000111f},
+ {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f},
+ {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f},
+ {+0.028118f, +0.096712f, +0.004235f, -0.000661f, +0.000071f},
+ {-0.020670f, -0.048284f, -0.004447f, -0.000361f, +0.000049f},
+ {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f},
+ {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f},
+ {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f},
+ {+0.027250f, +0.222848f, +0.002393f, -0.001277f, -0.000059f},
+ {+0.083457f, -0.055583f, +0.011895f, +0.000049f, -0.000010f},
+ {+0.023912f, -0.145973f, +0.001523f, -0.000736f, -0.000060f},
+ {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f},
+ {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f},
+ {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f},
+ {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f}
+ },
+ {
+ {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f},
+ {-0.234739f, +0.346303f, -0.031613f, +0.000452f, +0.000075f},
+ {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f},
+ {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f},
+ {-0.074908f, -0.067483f, -0.011111f, -0.000037f, +0.000040f},
+ {+0.024868f, +0.020084f, +0.003583f, +0.000348f, +0.000052f},
+ {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f},
+ {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f},
+ {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f},
+ {-0.128529f, -0.021349f, -0.015609f, +0.000805f, +0.000095f},
+ {+0.009730f, -0.170684f, +0.001530f, +0.000070f, -0.000041f},
+ {+0.063989f, -0.082569f, +0.011861f, +0.000327f, +0.000027f},
+ {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f},
+ {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f},
+ {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f},
+ {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f}
+ },
+ {
+ {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f},
+ {+0.240846f, -0.383749f, +0.036120f, +0.000976f, +0.000103f},
+ {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f},
+ {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f},
+ {-0.026805f, -0.145169f, -0.000897f, +0.000699f, -0.000083f},
+ {+0.004898f, +0.050127f, +0.002984f, +0.000479f, -0.000062f},
+ {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f},
+ {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f},
+ {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f},
+ {+0.006723f, -0.230147f, +0.003197f, +0.001300f, +0.000034f},
+ {-0.095384f, -0.009012f, -0.012879f, -0.000031f, +0.000023f},
+ {-0.048765f, +0.092236f, -0.006693f, +0.000674f, +0.000056f},
+ {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f},
+ {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f},
+ {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f},
+ {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f}
+ },
+ {
+ {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f},
+ {+0.208289f, -0.431823f, +0.027399f, -0.000496f, -0.000086f},
+ {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f},
+ {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f},
+ {+0.107325f, +0.060873f, +0.013159f, +0.000090f, -0.000038f},
+ {-0.020607f, +0.012217f, -0.003265f, -0.000308f, -0.000058f},
+ {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f},
+ {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f},
+ {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f},
+ {+0.129678f, -0.037696f, +0.015815f, -0.000703f, -0.000099f},
+ {+0.037248f, +0.197082f, +0.005086f, -0.000193f, +0.000037f},
+ {-0.043816f, +0.101985f, -0.008254f, -0.000336f, -0.000028f},
+ {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f},
+ {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f},
+ {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f},
+ {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f}
+ },
+ {
+ {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f},
+ {-0.286340f, +0.326727f, -0.042071f, -0.000948f, -0.000098f},
+ {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f},
+ {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f},
+ {-0.004658f, +0.232611f, -0.002627f, -0.000673f, +0.000101f},
+ {+0.001246f, -0.020482f, -0.002726f, -0.000581f, +0.000087f},
+ {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f},
+ {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f},
+ {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f},
+ {-0.041445f, +0.225060f, -0.008066f, -0.001247f, -0.000002f},
+ {+0.082241f, +0.130716f, +0.009581f, -0.000052f, -0.000037f},
+ {+0.061982f, -0.060921f, +0.008434f, -0.000587f, -0.000055f},
+ {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f},
+ {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f},
+ {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f},
+ {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f}
+ },
+ {
+ {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f},
+ {-0.163451f, +0.512532f, -0.021259f, +0.000613f, +0.000105f},
+ {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f},
+ {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f},
+ {-0.125629f, +0.045496f, -0.015544f, -0.000259f, +0.000027f},
+ {+0.013056f, -0.002303f, +0.002874f, +0.000034f, +0.000053f},
+ {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f},
+ {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f},
+ {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f},
+ {-0.119869f, +0.100206f, -0.015399f, +0.000474f, +0.000091f},
+ {-0.083578f, -0.121580f, -0.008601f, +0.000327f, -0.000026f},
+ {+0.021962f, -0.124782f, +0.004983f, +0.000417f, +0.000031f},
+ {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f},
+ {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f},
+ {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f},
+ {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f}
+ },
+ {
+ {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f},
+ {+0.321458f, -0.231555f, +0.047137f, +0.001083f, +0.000091f},
+ {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f},
+ {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f},
+ {+0.053207f, -0.228176f, +0.008455f, +0.000505f, -0.000122f},
+ {+0.006068f, +0.008715f, +0.003223f, +0.000482f, -0.000122f},
+ {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f},
+ {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f},
+ {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f},
+ {+0.071428f, -0.194582f, +0.013164f, +0.000987f, -0.000034f},
+ {-0.035270f, -0.192622f, -0.005952f, +0.000220f, +0.000050f},
+ {-0.068773f, +0.014813f, -0.009109f, +0.000533f, +0.000056f},
+ {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f},
+ {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f},
+ {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f},
+ {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f}
+ },
+ {
+ {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f},
+ {+0.106819f, -0.558024f, +0.013421f, -0.000683f, -0.000132f},
+ {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f},
+ {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f},
+ {+0.114197f, -0.131784f, +0.014954f, +0.000412f, -0.000002f},
+ {-0.019246f, -0.031443f, -0.004356f, +0.000329f, -0.000027f},
+ {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f},
+ {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f},
+ {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f},
+ {+0.102756f, -0.143879f, +0.013003f, -0.000283f, -0.000065f},
+ {+0.095015f, +0.011155f, +0.012207f, -0.000367f, +0.000008f},
+ {+0.004913f, +0.131661f, -0.000343f, -0.000524f, -0.000039f},
+ {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f},
+ {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f},
+ {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f},
+ {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f}
+ },
+ {
+ {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f},
+ {-0.340199f, +0.128020f, -0.049926f, -0.001339f, -0.000072f},
+ {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f},
+ {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f},
+ {-0.092373f, +0.185204f, -0.014035f, -0.000067f, +0.000138f},
+ {-0.010912f, -0.048983f, -0.001816f, +0.000075f, +0.000154f},
+ {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f},
+ {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f},
+ {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f},
+ {-0.096213f, +0.160581f, -0.016571f, -0.000370f, +0.000063f},
+ {-0.010051f, +0.173763f, -0.000750f, -0.000501f, -0.000056f},
+ {+0.062657f, +0.045986f, +0.006800f, -0.000608f, -0.000057f},
+ {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f},
+ {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f},
+ {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f},
+ {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f}
+ },
+ {
+ {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f},
+ {-0.048357f, +0.572445f, -0.005311f, +0.000514f, +0.000163f},
+ {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f},
+ {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f},
+ {-0.086028f, +0.192206f, -0.012072f, -0.000418f, -0.000038f},
+ {+0.040227f, +0.025362f, +0.003912f, -0.000532f, -0.000024f},
+ {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f},
+ {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f},
+ {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f},
+ {-0.078983f, +0.183476f, -0.010913f, +0.000304f, +0.000020f},
+ {-0.083563f, +0.058421f, -0.010558f, +0.000255f, +0.000015f},
+ {-0.030882f, -0.097232f, -0.001515f, +0.000622f, +0.000053f},
+ {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f},
+ {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f},
+ {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f},
+ {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f}
+ },
+ {
+ {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f},
+ {+0.345899f, -0.033997f, +0.051595f, +0.001615f, +0.000035f},
+ {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f},
+ {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f},
+ {+0.115274f, -0.117327f, +0.017963f, -0.000487f, -0.000138f},
+ {-0.008614f, +0.100535f, +0.001469f, -0.001024f, -0.000165f},
+ {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f},
+ {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f},
+ {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f},
+ {+0.112953f, -0.110523f, +0.019836f, -0.000405f, -0.000071f},
+ {+0.043415f, -0.138944f, +0.005951f, +0.000778f, +0.000051f},
+ {-0.038181f, -0.085067f, -0.005138f, +0.000773f, +0.000051f},
+ {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f},
+ {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f},
+ {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f},
+ {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f}
+ },
+ {
+ {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f},
+ {-0.007859f, -0.574645f, -0.003243f, -0.000139f, -0.000188f},
+ {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f},
+ {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f},
+ {+0.052764f, -0.211602f, +0.007618f, -0.000144f, +0.000084f},
+ {-0.046479f, +0.043520f, -0.004619f, -0.000085f, +0.000093f},
+ {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f},
+ {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f},
+ {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f},
+ {+0.051960f, -0.201931f, +0.007334f, -0.001040f, +0.000035f},
+ {+0.061094f, -0.110021f, +0.007462f, +0.000103f, -0.000039f},
+ {+0.036876f, +0.032412f, +0.003266f, -0.000534f, -0.000070f},
+ {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f},
+ {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f},
+ {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f},
+ {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f}
+ },
+ {
+ {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f},
+ {-0.343985f, -0.057778f, -0.051999f, -0.001370f, +0.000021f},
+ {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f},
+ {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f},
+ {-0.122328f, +0.057169f, -0.020503f, +0.000916f, +0.000113f},
+ {+0.036115f, -0.084847f, -0.000437f, +0.002283f, +0.000139f},
+ {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f},
+ {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f},
+ {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f},
+ {-0.120605f, +0.060574f, -0.022209f, +0.000951f, +0.000049f},
+ {-0.065666f, +0.088077f, -0.009755f, -0.000580f, -0.000035f},
+ {+0.014536f, +0.066997f, +0.002290f, -0.001040f, -0.000035f},
+ {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f},
+ {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f},
+ {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f},
+ {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f}
+ },
+ {
+ {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f},
+ {+0.065401f, +0.568079f, +0.010528f, -0.000542f, +0.000194f},
+ {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f},
+ {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f},
+ {-0.023543f, +0.209166f, -0.002096f, +0.002246f, -0.000125f},
+ {+0.031298f, -0.092434f, +0.002541f, +0.002737f, -0.000158f},
+ {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f},
+ {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f},
+ {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f},
+ {-0.025683f, +0.205232f, -0.002533f, +0.003878f, -0.000082f},
+ {-0.031489f, +0.139294f, -0.004565f, -0.001598f, +0.000056f},
+ {-0.026207f, +0.002872f, -0.002107f, +0.000154f, +0.000084f},
+ {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f},
+ {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f},
+ {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f},
+ {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f}
+ }
+};
+
+const float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]=
+{
+ {
+ {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f},
+ {-0.159214f, +0.438495f, -0.131837f, -0.004567f, -0.000134f},
+ {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f},
+ {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f},
+ {-0.003524f, +0.002365f, -0.008243f, +0.002720f, +0.000173f},
+ {+0.001684f, -0.006593f, -0.024280f, +0.012226f, +0.000133f},
+ {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f},
+ {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f},
+ {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f},
+ {-0.012650f, +0.030376f, +0.022293f, -0.005058f, -0.000424f},
+ {+0.003808f, -0.011707f, -0.008010f, +0.002270f, +0.000068f},
+ {-0.003343f, +0.012704f, +0.014571f, -0.003409f, -0.000255f},
+ {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f},
+ {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f},
+ {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f},
+ {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f}
+ },
+ {
+ {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f},
+ {+0.061927f, +0.923113f, -0.018254f, -0.003553f, -0.000135f},
+ {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f},
+ {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f},
+ {+0.001425f, +0.021365f, -0.019206f, -0.005433f, +0.000123f},
+ {-0.004675f, -0.040742f, -0.087083f, -0.008021f, +0.000087f},
+ {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f},
+ {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f},
+ {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f},
+ {+0.006435f, +0.139253f, +0.070542f, -0.004148f, -0.000297f},
+ {-0.001842f, -0.052892f, -0.056325f, -0.005942f, +0.000046f},
+ {+0.004364f, +0.052115f, +0.019067f, -0.000398f, -0.000179f},
+ {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f},
+ {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f},
+ {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f},
+ {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f}
+ },
+ {
+ {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f},
+ {+0.017318f, +0.757708f, +0.032772f, +0.023486f, +0.000150f},
+ {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f},
+ {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f},
+ {+0.003861f, +0.074613f, -0.059871f, +0.001275f, -0.000202f},
+ {+0.004218f, -0.001879f, -0.134238f, -0.000831f, -0.000156f},
+ {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f},
+ {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f},
+ {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f},
+ {+0.003304f, +0.293531f, -0.162769f, +0.029563f, +0.000502f},
+ {-0.000187f, -0.025533f, -0.089914f, +0.003071f, -0.000081f},
+ {-0.001118f, +0.199397f, -0.178948f, +0.009074f, +0.000301f},
+ {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f},
+ {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f},
+ {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f},
+ {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f}
+ },
+ {
+ {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f},
+ {-0.019638f, +0.173586f, -0.454125f, -0.045073f, +0.000138f},
+ {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f},
+ {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f},
+ {-0.010927f, +0.114232f, +0.022410f, +0.002610f, -0.000063f},
+ {-0.001151f, +0.065308f, -0.047475f, +0.003953f, -0.000033f},
+ {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f},
+ {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f},
+ {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f},
+ {-0.012397f, +0.141388f, -0.368076f, -0.043941f, +0.000144f},
+ {+0.000613f, +0.027917f, -0.038807f, +0.005057f, -0.000020f},
+ {-0.005278f, +0.064856f, -0.339877f, -0.008614f, +0.000087f},
+ {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f},
+ {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f},
+ {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f},
+ {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f}
+ },
+ {
+ {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f},
+ {-0.008133f, -0.216891f, -0.173004f, +0.046339f, -0.000186f},
+ {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f},
+ {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f},
+ {+0.012719f, -0.054617f, +0.162135f, +0.005430f, +0.000206f},
+ {+0.004192f, -0.016864f, +0.049221f, +0.004060f, +0.000152f},
+ {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f},
+ {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f},
+ {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f},
+ {+0.015743f, -0.224869f, -0.116394f, +0.024045f, -0.000521f},
+ {-0.000520f, +0.017676f, -0.001703f, -0.007076f, +0.000085f},
+ {+0.005864f, -0.108940f, -0.176379f, -0.006190f, -0.000311f},
+ {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f},
+ {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f},
+ {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f},
+ {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f}
+ },
+ {
+ {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f},
+ {+0.009859f, +0.329919f, +0.267131f, -0.025972f, -0.000125f},
+ {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f},
+ {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f},
+ {-0.009694f, -0.066480f, +0.161387f, -0.014778f, +0.000006f},
+ {-0.011976f, -0.007185f, +0.079605f, -0.010521f, -0.000016f},
+ {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f},
+ {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f},
+ {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f},
+ {-0.011087f, -0.102790f, +0.079859f, -0.000351f, +0.000008f},
+ {+0.001584f, +0.009914f, +0.007779f, +0.002067f, -0.000006f},
+ {+0.003353f, -0.001777f, +0.008005f, +0.013355f, +0.000003f},
+ {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f},
+ {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f},
+ {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f},
+ {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f}
+ },
+ {
+ {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f},
+ {+0.044970f, +0.559290f, +0.057727f, +0.008886f, +0.000233f},
+ {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f},
+ {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f},
+ {+0.023556f, +0.052508f, -0.021029f, +0.010719f, -0.000188f},
+ {+0.008092f, -0.004951f, +0.027003f, +0.006766f, -0.000127f},
+ {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f},
+ {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f},
+ {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f},
+ {+0.004678f, -0.016958f, +0.018438f, +0.001910f, +0.000484f},
+ {-0.001327f, +0.004928f, +0.011742f, +0.001214f, -0.000078f},
+ {-0.013688f, +0.047967f, +0.031851f, -0.002524f, +0.000286f},
+ {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f},
+ {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f},
+ {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f},
+ {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f}
+ },
+ {
+ {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f},
+ {-0.151251f, +0.284723f, -0.015522f, -0.005073f, +0.000086f},
+ {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f},
+ {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f},
+ {-0.064701f, +0.012013f, -0.004462f, -0.000173f, +0.000038f},
+ {+0.014183f, -0.018557f, -0.019481f, -0.000708f, +0.000046f},
+ {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f},
+ {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f},
+ {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f},
+ {-0.005765f, +0.013682f, +0.000873f, -0.007110f, -0.000136f},
+ {-0.003019f, -0.012643f, -0.006120f, -0.000396f, +0.000028f},
+ {+0.011018f, +0.079111f, +0.001161f, -0.005334f, -0.000076f},
+ {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f},
+ {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f},
+ {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f},
+ {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f}
+ },
+ {
+ {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f},
+ {+0.192280f, -0.252895f, -0.010481f, +0.000333f, -0.000272f},
+ {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f},
+ {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f},
+ {+0.084125f, -0.181115f, -0.006598f, -0.003510f, +0.000156f},
+ {-0.033552f, +0.023473f, -0.003836f, -0.001049f, +0.000092f},
+ {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f},
+ {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f},
+ {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f},
+ {+0.011588f, -0.007485f, -0.021418f, -0.002195f, -0.000406f},
+ {+0.004828f, -0.034802f, +0.002483f, -0.000357f, +0.000065f},
+ {+0.010126f, +0.088145f, -0.024313f, -0.000561f, -0.000239f},
+ {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f},
+ {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f},
+ {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f},
+ {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f}
+ },
+ {
+ {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f},
+ {-0.025480f, -0.578744f, -0.004928f, +0.005728f, -0.000021f},
+ {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f},
+ {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f},
+ {-0.018947f, -0.326335f, +0.012624f, +0.000806f, -0.000063f},
+ {+0.025064f, +0.093936f, +0.002533f, +0.000591f, -0.000056f},
+ {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f},
+ {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f},
+ {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f},
+ {-0.008512f, -0.041967f, +0.005268f, +0.006560f, +0.000223f},
+ {+0.005601f, -0.039303f, +0.001728f, -0.000112f, -0.000044f},
+ {-0.035999f, +0.034895f, +0.002757f, +0.004270f, +0.000123f},
+ {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f},
+ {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f},
+ {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f},
+ {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f}
+ },
+ {
+ {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f},
+ {-0.225295f, -0.253817f, -0.010634f, -0.001216f, +0.000288f},
+ {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f},
+ {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f},
+ {-0.089464f, -0.200814f, -0.007558f, +0.001360f, -0.000121f},
+ {+0.004322f, +0.115904f, +0.010769f, +0.000324f, -0.000060f},
+ {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f},
+ {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f},
+ {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f},
+ {-0.005629f, -0.034211f, +0.013115f, +0.002185f, +0.000307f},
+ {-0.019520f, -0.005119f, +0.001636f, +0.000261f, -0.000048f},
+ {+0.038933f, -0.062477f, +0.011725f, +0.001017f, +0.000182f},
+ {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f},
+ {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f},
+ {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f},
+ {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f}
+ },
+ {
+ {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f},
+ {+0.206677f, +0.408421f, +0.026814f, -0.005082f, -0.000056f},
+ {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f},
+ {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f},
+ {+0.105083f, +0.109018f, +0.007715f, -0.000799f, +0.000072f},
+ {-0.025793f, +0.064751f, -0.005742f, -0.000924f, +0.000050f},
+ {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f},
+ {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f},
+ {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f},
+ {+0.013715f, +0.007050f, +0.000167f, -0.004932f, -0.000266f},
+ {+0.012412f, +0.040469f, -0.000036f, -0.000063f, +0.000052f},
+ {-0.005607f, -0.122490f, -0.001069f, -0.003166f, -0.000145f},
+ {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f},
+ {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f},
+ {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f},
+ {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f}
+ },
+ {
+ {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f},
+ {+0.120618f, +0.519623f, +0.008479f, +0.000432f, -0.000270f},
+ {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f},
+ {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f},
+ {+0.012267f, +0.246756f, -0.001889f, -0.000730f, +0.000091f},
+ {+0.028297f, -0.020937f, -0.002730f, -0.000026f, +0.000039f},
+ {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f},
+ {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f},
+ {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f},
+ {-0.003781f, +0.030870f, -0.013170f, -0.002144f, -0.000211f},
+ {+0.016747f, +0.033277f, +0.000186f, -0.000012f, +0.000031f},
+ {-0.038322f, -0.079239f, -0.009485f, -0.001067f, -0.000129f},
+ {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f},
+ {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f},
+ {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f},
+ {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f}
+ },
+ {
+ {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f},
+ {-0.288048f, -0.119309f, -0.040772f, +0.004167f, +0.000126f},
+ {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f},
+ {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f},
+ {-0.111155f, +0.046512f, -0.012782f, +0.000892f, -0.000069f},
+ {-0.020452f, -0.099912f, -0.003632f, +0.000896f, -0.000036f},
+ {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f},
+ {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f},
+ {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f},
+ {-0.012250f, +0.014195f, +0.001656f, +0.003568f, +0.000272f},
+ {-0.029260f, -0.036443f, -0.002521f, +0.000109f, -0.000054f},
+ {+0.049141f, +0.042766f, +0.002001f, +0.002307f, +0.000147f},
+ {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f},
+ {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f},
+ {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f},
+ {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f}
+ },
+ {
+ {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f},
+ {+0.008278f, -0.564708f, +0.007533f, +0.000534f, +0.000224f},
+ {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f},
+ {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f},
+ {+0.047919f, -0.200610f, +0.011974f, +0.000485f, -0.000070f},
+ {-0.001747f, -0.136529f, +0.008548f, -0.000030f, -0.000031f},
+ {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f},
+ {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f},
+ {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f},
+ {+0.015670f, -0.020509f, +0.010455f, +0.001886f, +0.000130f},
+ {-0.001269f, -0.078191f, +0.000719f, -0.000060f, -0.000015f},
+ {-0.015954f, +0.139586f, +0.005155f, +0.000966f, +0.000087f},
+ {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f},
+ {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f},
+ {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f},
+ {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f}
+ },
+ {
+ {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f},
+ {+0.289123f, -0.124032f, +0.042209f, -0.003292f, -0.000173f},
+ {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f},
+ {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f},
+ {+0.088516f, -0.135597f, +0.008911f, -0.000941f, +0.000062f},
+ {+0.046542f, -0.074771f, -0.001267f, -0.000681f, +0.000024f},
+ {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f},
+ {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f},
+ {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f},
+ {-0.003750f, -0.043297f, -0.001696f, -0.002710f, -0.000254f},
+ {+0.036881f, -0.019154f, +0.003756f, -0.000164f, +0.000052f},
+ {-0.028484f, +0.127049f, -0.000373f, -0.001785f, -0.000137f},
+ {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f},
+ {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f},
+ {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f},
+ {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f}
+ },
+ {
+ {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f},
+ {-0.108773f, +0.480556f, -0.020213f, -0.000915f, -0.000164f},
+ {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f},
+ {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f},
+ {-0.094935f, +0.145981f, -0.017427f, -0.000284f, +0.000058f},
+ {-0.078691f, +0.105220f, -0.009040f, -0.000009f, +0.000031f},
+ {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f},
+ {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f},
+ {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f},
+ {-0.013497f, -0.033838f, -0.009244f, -0.001447f, -0.000073f},
+ {-0.020163f, +0.066780f, -0.002771f, +0.000069f, +0.000003f},
+ {+0.051113f, +0.013125f, -0.004746f, -0.000733f, -0.000056f},
+ {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f},
+ {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f},
+ {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f},
+ {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f}
+ },
+ {
+ {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f},
+ {-0.251619f, +0.250783f, -0.039635f, +0.002380f, +0.000192f},
+ {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f},
+ {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f},
+ {-0.039868f, +0.230386f, -0.002246f, +0.000818f, -0.000054f},
+ {+0.036223f, +0.280336f, +0.007555f, +0.000539f, -0.000017f},
+ {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f},
+ {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f},
+ {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f},
+ {+0.022768f, +0.016336f, +0.003117f, +0.002216f, +0.000227f},
+ {-0.031511f, +0.045619f, -0.004901f, +0.000227f, -0.000048f},
+ {-0.045006f, -0.127523f, -0.002107f, +0.001382f, +0.000124f},
+ {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f},
+ {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f},
+ {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f},
+ {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f}
+ },
+ {
+ {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f},
+ {+0.168437f, -0.394610f, +0.030765f, +0.000832f, +0.000106f},
+ {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f},
+ {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f},
+ {+0.117845f, -0.006812f, +0.017402f, +0.000161f, -0.000052f},
+ {+0.070459f, +0.240877f, +0.004084f, -0.000089f, -0.000035f},
+ {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f},
+ {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f},
+ {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f},
+ {-0.008901f, +0.071218f, +0.004889f, +0.001056f, +0.000035f},
+ {+0.035581f, -0.061262f, +0.007127f, -0.000111f, +0.000006f},
+ {+0.009360f, -0.207644f, +0.007254f, +0.000645f, +0.000037f},
+ {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f},
+ {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f},
+ {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f},
+ {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f}
+ },
+ {
+ {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f},
+ {+0.218466f, -0.313607f, +0.033711f, -0.001650f, -0.000187f},
+ {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f},
+ {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f},
+ {-0.033058f, -0.233100f, -0.003881f, -0.000583f, +0.000049f},
+ {-0.128077f, -0.046310f, -0.008240f, -0.000349f, +0.000015f},
+ {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f},
+ {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f},
+ {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f},
+ {-0.026309f, +0.052058f, -0.001607f, -0.001982f, -0.000202f},
+ {+0.029154f, -0.072410f, +0.002905f, -0.000210f, +0.000043f},
+ {+0.051381f, -0.149021f, -0.000115f, -0.001232f, -0.000111f},
+ {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f},
+ {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f},
+ {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f},
+ {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f}
+ },
+ {
+ {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f},
+ {-0.218935f, +0.356480f, -0.037109f, -0.000536f, -0.000063f},
+ {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f},
+ {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f},
+ {-0.082669f, -0.157628f, -0.013419f, -0.000257f, +0.000050f},
+ {+0.051102f, -0.310690f, +0.001856f, +0.000105f, +0.000038f},
+ {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f},
+ {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f},
+ {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f},
+ {+0.042856f, -0.056448f, -0.001929f, -0.000741f, -0.000011f},
+ {-0.068206f, +0.080584f, -0.011613f, +0.000093f, -0.000013f},
+ {-0.091336f, +0.056612f, -0.010772f, -0.000543f, -0.000024f},
+ {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f},
+ {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f},
+ {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f},
+ {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f}
+ },
+ {
+ {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f},
+ {-0.183833f, +0.406966f, -0.027778f, +0.001207f, +0.000171f},
+ {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f},
+ {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f},
+ {+0.076464f, +0.083380f, +0.010071f, +0.000597f, -0.000047f},
+ {+0.086834f, -0.252931f, +0.010256f, +0.000250f, -0.000016f},
+ {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f},
+ {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f},
+ {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f},
+ {-0.003641f, -0.131818f, -0.001737f, +0.001737f, +0.000181f},
+ {+0.001297f, +0.195950f, +0.005713f, +0.000204f, -0.000037f},
+ {+0.045795f, +0.259231f, +0.005407f, +0.001178f, +0.000100f},
+ {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f},
+ {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f},
+ {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f},
+ {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f}
+ },
+ {
+ {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f},
+ {+0.270044f, -0.288912f, +0.044466f, +0.000374f, +0.000037f},
+ {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f},
+ {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f},
+ {+0.013959f, +0.178267f, +0.007930f, +0.000231f, -0.000050f},
+ {-0.126652f, +0.073753f, -0.010940f, -0.000032f, -0.000041f},
+ {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f},
+ {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f},
+ {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f},
+ {-0.052463f, -0.055986f, +0.001868f, +0.000682f, -0.000008f},
+ {+0.099011f, +0.055743f, +0.009504f, -0.000033f, +0.000019f},
+ {+0.066616f, +0.234328f, +0.006904f, +0.000399f, +0.000016f},
+ {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f},
+ {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f},
+ {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f},
+ {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f}
+ },
+ {
+ {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f},
+ {+0.135714f, -0.493797f, +0.019817f, -0.001205f, -0.000155f},
+ {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f},
+ {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f},
+ {-0.058361f, +0.066933f, -0.007899f, -0.000705f, +0.000047f},
+ {+0.024939f, +0.304082f, +0.002238f, -0.000320f, +0.000018f},
+ {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f},
+ {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f},
+ {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f},
+ {+0.042244f, +0.087154f, +0.004003f, -0.001651f, -0.000165f},
+ {-0.087421f, -0.223827f, -0.009440f, -0.000302f, +0.000032f},
+ {-0.123261f, -0.040927f, -0.008130f, -0.001094f, -0.000093f},
+ {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f},
+ {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f},
+ {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f},
+ {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f}
+ },
+ {
+ {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f},
+ {-0.317778f, +0.199223f, -0.049734f, -0.000202f, -0.000022f},
+ {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f},
+ {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f},
+ {+0.027311f, -0.065956f, -0.001130f, +0.000048f, +0.000049f},
+ {+0.092570f, +0.201332f, +0.007025f, +0.000092f, +0.000044f},
+ {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f},
+ {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f},
+ {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f},
+ {+0.029291f, +0.096155f, +0.000322f, -0.000490f, +0.000025f},
+ {-0.042190f, -0.292546f, -0.004474f, +0.000130f, -0.000023f},
+ {+0.047310f, -0.289378f, -0.003082f, -0.000264f, -0.000009f},
+ {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f},
+ {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f},
+ {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f},
+ {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f}
+ },
+ {
+ {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f},
+ {-0.061876f, +0.590080f, -0.009764f, +0.001166f, +0.000147f},
+ {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f},
+ {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f},
+ {+0.015185f, -0.082124f, +0.005184f, +0.000502f, -0.000049f},
+ {-0.096327f, -0.079550f, -0.006514f, +0.000328f, -0.000021f},
+ {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f},
+ {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f},
+ {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f},
+ {-0.051580f, -0.036720f, -0.010126f, +0.001380f, +0.000151f},
+ {+0.125504f, -0.039269f, +0.013578f, +0.000208f, -0.000027f},
+ {+0.070511f, -0.247836f, +0.009393f, +0.000912f, +0.000087f},
+ {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f},
+ {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f},
+ {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f},
+ {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f}
+ },
+ {
+ {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f},
+ {+0.336614f, -0.016258f, +0.050302f, +0.000297f, +0.000011f},
+ {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f},
+ {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f},
+ {-0.028633f, -0.007390f, -0.002007f, -0.000039f, -0.000048f},
+ {+0.005134f, -0.220494f, -0.003892f, -0.000252f, -0.000046f},
+ {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f},
+ {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f},
+ {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f},
+ {-0.018235f, -0.085003f, +0.002078f, +0.000390f, -0.000041f},
+ {-0.049559f, +0.222425f, -0.001760f, -0.000043f, +0.000027f},
+ {-0.087658f, -0.008493f, -0.002149f, +0.000327f, +0.000002f},
+ {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f},
+ {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f},
+ {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f},
+ {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f}
+ },
+ {
+ {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f},
+ {-0.019214f, -0.554319f, +0.001599f, -0.001129f, -0.000145f},
+ {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f},
+ {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f},
+ {+0.013982f, +0.062149f, +0.000689f, -0.000526f, +0.000053f},
+ {+0.064167f, -0.122065f, +0.007764f, -0.000174f, +0.000027f},
+ {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f},
+ {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f},
+ {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f},
+ {+0.063324f, +0.045704f, +0.011079f, -0.001189f, -0.000135f},
+ {-0.081653f, +0.167815f, -0.010699f, -0.000264f, +0.000021f},
+ {+0.009546f, +0.130825f, -0.003286f, -0.000952f, -0.000083f},
+ {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f},
+ {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f},
+ {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f},
+ {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f}
+ },
+ {
+ {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f},
+ {-0.316269f, -0.095647f, -0.050717f, -0.000419f, +0.000004f},
+ {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f},
+ {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f},
+ {+0.019808f, +0.051257f, -0.001165f, +0.000156f, +0.000046f},
+ {-0.048333f, +0.050030f, -0.007461f, +0.000269f, +0.000047f},
+ {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f},
+ {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f},
+ {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f},
+ {+0.008225f, +0.128802f, -0.005400f, -0.000223f, +0.000054f},
+ {+0.088609f, -0.096391f, +0.012066f, +0.000087f, -0.000030f},
+ {+0.036267f, +0.078389f, +0.005104f, -0.000176f, +0.000004f},
+ {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f},
+ {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f},
+ {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f},
+ {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f}
+ },
+ {
+ {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f},
+ {+0.069696f, +0.497403f, +0.009705f, +0.000945f, +0.000144f},
+ {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f},
+ {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f},
+ {-0.038012f, -0.038810f, -0.004148f, +0.000514f, -0.000056f},
+ {-0.010993f, +0.104517f, -0.004208f, +0.000219f, -0.000033f},
+ {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f},
+ {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f},
+ {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f},
+ {-0.085604f, -0.017452f, -0.013308f, +0.001048f, +0.000118f},
+ {+0.029028f, -0.187952f, +0.005021f, +0.000216f, -0.000016f},
+ {-0.006564f, +0.006493f, -0.001419f, +0.000780f, +0.000079f},
+ {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f},
+ {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f},
+ {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f},
+ {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f}
+ },
+ {
+ {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f},
+ {+0.297764f, +0.151816f, +0.046261f, +0.000499f, -0.000022f},
+ {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f},
+ {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f},
+ {-0.000542f, -0.094714f, +0.004019f, -0.000229f, -0.000043f},
+ {+0.041461f, +0.019853f, +0.008957f, -0.000418f, -0.000046f},
+ {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f},
+ {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f},
+ {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f},
+ {+0.021657f, -0.180451f, +0.009924f, +0.000053f, -0.000065f},
+ {-0.095197f, +0.006584f, -0.013724f, -0.000061f, +0.000032f},
+ {-0.011099f, +0.015338f, -0.000599f, +0.000168f, -0.000011f},
+ {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f},
+ {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f},
+ {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f},
+ {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f}
+ },
+ {
+ {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f},
+ {-0.111390f, -0.472799f, -0.015450f, -0.000704f, -0.000139f},
+ {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f},
+ {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f},
+ {+0.055650f, -0.007065f, +0.007223f, -0.000546f, +0.000060f},
+ {-0.018845f, -0.077039f, -0.001923f, -0.000256f, +0.000039f},
+ {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f},
+ {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f},
+ {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f},
+ {+0.098237f, -0.061993f, +0.014872f, -0.000974f, -0.000101f},
+ {+0.016600f, +0.180900f, +0.001935f, -0.000217f, +0.000011f},
+ {-0.024890f, -0.001895f, -0.000719f, -0.000667f, -0.000075f},
+ {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f},
+ {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f},
+ {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f},
+ {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f}
+ },
+ {
+ {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f},
+ {-0.279427f, -0.216928f, -0.044464f, -0.000461f, +0.000042f},
+ {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f},
+ {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f},
+ {-0.032929f, +0.127864f, -0.007891f, +0.000307f, +0.000041f},
+ {-0.023458f, -0.073855f, -0.003516f, +0.000521f, +0.000044f},
+ {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f},
+ {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f},
+ {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f},
+ {-0.068563f, +0.191058f, -0.014677f, +0.000094f, +0.000073f},
+ {+0.083271f, +0.077777f, +0.010978f, +0.000035f, -0.000035f},
+ {+0.032739f, -0.090968f, +0.003108f, -0.000130f, +0.000018f},
+ {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f},
+ {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f},
+ {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f},
+ {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f}
+ },
+ {
+ {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f},
+ {+0.149133f, +0.438088f, +0.020811f, +0.000535f, +0.000129f},
+ {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f},
+ {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f},
+ {-0.051157f, +0.099533f, -0.006353f, +0.000530f, -0.000063f},
+ {+0.036114f, +0.015276f, +0.002183f, +0.000257f, -0.000042f},
+ {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f},
+ {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f},
+ {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f},
+ {-0.082213f, +0.168162f, -0.013202f, +0.000891f, +0.000086f},
+ {-0.053436f, -0.133406f, -0.007060f, +0.000274f, -0.000004f},
+ {+0.031202f, -0.097339f, +0.000600f, +0.000565f, +0.000069f},
+ {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f},
+ {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f},
+ {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f},
+ {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f}
+ },
+ {
+ {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f},
+ {+0.259444f, +0.270037f, +0.041639f, +0.000297f, -0.000058f},
+ {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f},
+ {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f},
+ {+0.061013f, -0.068025f, +0.009284f, -0.000332f, -0.000040f},
+ {-0.005481f, +0.077635f, +0.001849f, -0.000481f, -0.000044f},
+ {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f},
+ {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f},
+ {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f},
+ {+0.107969f, -0.120398f, +0.018769f, -0.000181f, -0.000082f},
+ {-0.056786f, -0.126822f, -0.007959f, -0.000033f, +0.000039f},
+ {-0.069219f, +0.054400f, -0.005730f, +0.000053f, -0.000023f},
+ {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f},
+ {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f},
+ {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f},
+ {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f}
+ },
+ {
+ {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f},
+ {-0.182587f, -0.405974f, -0.025901f, -0.000462f, -0.000117f},
+ {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f},
+ {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f},
+ {+0.030324f, -0.107424f, +0.007446f, -0.000469f, +0.000068f},
+ {-0.029083f, +0.038828f, -0.003047f, -0.000232f, +0.000046f},
+ {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f},
+ {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f},
+ {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f},
+ {+0.044510f, -0.213643f, +0.009811f, -0.000749f, -0.000069f},
+ {+0.075343f, +0.079800f, +0.011596f, -0.000341f, -0.000004f},
+ {+0.002994f, +0.163592f, +0.001034f, -0.000473f, -0.000063f},
+ {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f},
+ {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f},
+ {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f},
+ {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f}
+ },
+ {
+ {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f},
+ {-0.241813f, -0.315693f, -0.038994f, -0.000147f, +0.000070f},
+ {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f},
+ {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f},
+ {-0.066143f, +0.046203f, -0.014148f, +0.000357f, +0.000040f},
+ {+0.022432f, -0.042335f, +0.001522f, +0.000437f, +0.000048f},
+ {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f},
+ {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f},
+ {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f},
+ {-0.123458f, +0.044963f, -0.022305f, +0.000260f, +0.000091f},
+ {+0.027259f, +0.155333f, +0.002873f, +0.000021f, -0.000041f},
+ {+0.074325f, +0.052152f, +0.007210f, +0.000007f, +0.000026f},
+ {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f},
+ {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f},
+ {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f},
+ {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f}
+ },
+ {
+ {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f},
+ {+0.219215f, +0.390772f, +0.031915f, +0.000487f, +0.000107f},
+ {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f},
+ {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f},
+ {-0.028737f, +0.105483f, -0.003866f, +0.000348f, -0.000076f},
+ {+0.013337f, -0.055289f, +0.001002f, +0.000053f, -0.000054f},
+ {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f},
+ {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f},
+ {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f},
+ {-0.008972f, +0.221115f, -0.003663f, +0.000531f, +0.000048f},
+ {-0.090641f, -0.028424f, -0.013918f, +0.000378f, +0.000016f},
+ {-0.038654f, -0.120101f, -0.004990f, +0.000461f, +0.000057f},
+ {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f},
+ {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f},
+ {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f},
+ {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f}
+ },
+ {
+ {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f},
+ {+0.222170f, +0.388402f, +0.034955f, +0.000099f, -0.000080f},
+ {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f},
+ {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f},
+ {+0.088774f, -0.075575f, +0.016123f, -0.000436f, -0.000040f},
+ {-0.024745f, +0.004479f, -0.001974f, -0.000454f, -0.000055f},
+ {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f},
+ {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f},
+ {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f},
+ {+0.128422f, +0.011753f, +0.022348f, -0.000409f, -0.000098f},
+ {+0.011288f, -0.189192f, +0.003841f, +0.000041f, +0.000039f},
+ {-0.054725f, -0.090752f, -0.006454f, -0.000058f, -0.000028f},
+ {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f},
+ {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f},
+ {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f},
+ {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f}
+ },
+ {
+ {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f},
+ {-0.264405f, -0.355877f, -0.037791f, -0.000515f, -0.000101f},
+ {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f},
+ {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f},
+ {+0.015137f, -0.192002f, -0.000035f, -0.000213f, +0.000092f},
+ {-0.000786f, +0.038825f, -0.000032f, +0.000190f, +0.000073f},
+ {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f},
+ {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f},
+ {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f},
+ {-0.025506f, -0.225558f, -0.001578f, -0.000313f, -0.000019f},
+ {+0.093865f, -0.065189f, +0.011642f, -0.000361f, -0.000030f},
+ {+0.055369f, +0.081537f, +0.009138f, -0.000492f, -0.000055f},
+ {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f},
+ {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f},
+ {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f},
+ {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f}
+ },
+ {
+ {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f},
+ {-0.186613f, -0.476552f, -0.029757f, -0.000163f, +0.000095f},
+ {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f},
+ {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f},
+ {-0.119879f, +0.010231f, -0.016974f, +0.000596f, +0.000034f},
+ {+0.016380f, +0.009027f, +0.002417f, +0.000683f, +0.000057f},
+ {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f},
+ {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f},
+ {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f},
+ {-0.124653f, -0.076460f, -0.020814f, +0.000683f, +0.000097f},
+ {-0.063103f, +0.174209f, -0.008521f, -0.000147f, -0.000032f},
+ {+0.034711f, +0.112933f, +0.002461f, +0.000059f, +0.000029f},
+ {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f},
+ {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f},
+ {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f},
+ {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f}
+ },
+ {
+ {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f},
+ {+0.306311f, +0.277325f, +0.043227f, +0.000433f, +0.000096f},
+ {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f},
+ {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f},
+ {+0.029899f, +0.236698f, +0.003149f, +0.000187f, -0.000112f},
+ {+0.002353f, -0.011865f, -0.000725f, -0.000346f, -0.000104f},
+ {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f},
+ {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f},
+ {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f},
+ {+0.058868f, +0.204995f, +0.005519f, +0.000216f, -0.000017f},
+ {-0.060797f, +0.176638f, -0.008488f, +0.000290f, +0.000044f},
+ {-0.066026f, -0.042360f, -0.010165f, +0.000503f, +0.000055f},
+ {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f},
+ {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f},
+ {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f},
+ {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f}
+ },
+ {
+ {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f},
+ {+0.134482f, +0.541069f, +0.022864f, +0.000250f, -0.000117f},
+ {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f},
+ {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f},
+ {+0.121827f, +0.094517f, +0.018717f, -0.000823f, -0.000016f},
+ {-0.013897f, +0.016128f, -0.002834f, -0.001121f, -0.000043f},
+ {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f},
+ {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f},
+ {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f},
+ {+0.110624f, +0.126988f, +0.019030f, -0.001012f, -0.000081f},
+ {+0.093230f, -0.059767f, +0.012720f, +0.000213f, +0.000018f},
+ {-0.010158f, -0.127393f, +0.000864f, +0.000011f, -0.000034f},
+ {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f},
+ {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f},
+ {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f},
+ {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f}
+ },
+ {
+ {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f},
+ {-0.333286f, -0.175696f, -0.047590f, -0.000222f, -0.000083f},
+ {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f},
+ {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f},
+ {-0.075028f, -0.208672f, -0.010268f, -0.000343f, +0.000132f},
+ {-0.011727f, +0.019516f, +0.000540f, +0.000212f, +0.000139f},
+ {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f},
+ {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f},
+ {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f},
+ {-0.086060f, -0.177107f, -0.010290f, -0.000364f, +0.000050f},
+ {+0.010787f, -0.184727f, +0.002953f, -0.000174f, -0.000054f},
+ {+0.067502f, -0.008050f, +0.010245f, -0.000436f, -0.000057f},
+ {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f},
+ {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f},
+ {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f},
+ {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f}
+ },
+ {
+ {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f},
+ {-0.075896f, -0.571385f, -0.014672f, -0.000160f, +0.000148f},
+ {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f},
+ {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f},
+ {-0.101027f, -0.169945f, -0.015494f, +0.000962f, -0.000016f},
+ {+0.029442f, -0.045651f, +0.004343f, +0.001546f, +0.000004f},
+ {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f},
+ {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f},
+ {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f},
+ {-0.090764f, -0.173219f, -0.015307f, +0.001207f, +0.000044f},
+ {-0.090276f, -0.027741f, -0.013865f, -0.000091f, +0.000003f},
+ {-0.018263f, +0.122358f, -0.003953f, -0.000094f, +0.000045f},
+ {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f},
+ {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f},
+ {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f},
+ {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f}
+ },
+ {
+ {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f},
+ {+0.344718f, +0.073613f, +0.049496f, -0.000072f, +0.000056f},
+ {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f},
+ {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f},
+ {+0.106866f, +0.149507f, +0.014360f, +0.000666f, -0.000140f},
+ {+0.005446f, -0.082692f, -0.002403f, +0.000314f, -0.000163f},
+ {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f},
+ {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f},
+ {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f},
+ {+0.107661f, +0.132716f, +0.012982f, +0.000706f, -0.000070f},
+ {+0.028176f, +0.155327f, +0.002943f, +0.000018f, +0.000055f},
+ {-0.051419f, +0.071483f, -0.007973f, +0.000234f, +0.000055f},
+ {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f},
+ {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f},
+ {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f},
+ {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f}
+ },
+ {
+ {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f},
+ {+0.018640f, +0.575973f, +0.005892f, -0.000203f, -0.000177f},
+ {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f},
+ {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f},
+ {+0.068852f, +0.208415f, +0.010824f, -0.000748f, +0.000061f},
+ {-0.046351f, -0.003708f, -0.005559f, -0.001546f, +0.000058f},
+ {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f},
+ {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f},
+ {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f},
+ {+0.065074f, +0.200619f, +0.010710f, -0.000928f, +0.000007f},
+ {+0.072568f, +0.087920f, +0.011704f, -0.000262f, -0.000027f},
+ {+0.035957f, -0.060576f, +0.005664f, +0.000112f, -0.000061f},
+ {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f},
+ {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f},
+ {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f},
+ {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f}
+ },
+ {
+ {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f},
+ {-0.346449f, +0.017003f, -0.049621f, +0.000139f, -0.000009f},
+ {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f},
+ {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f},
+ {-0.121162f, -0.084738f, -0.017259f, -0.000808f, +0.000129f},
+ {+0.021528f, +0.096693f, +0.003962f, -0.000943f, +0.000157f},
+ {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f},
+ {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f},
+ {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f},
+ {-0.119856f, -0.085575f, -0.015319f, -0.000749f, +0.000064f},
+ {-0.056191f, -0.109851f, -0.006441f, -0.000263f, -0.000045f},
+ {+0.024446f, -0.076942f, +0.005466f, +0.000057f, -0.000045f},
+ {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f},
+ {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f},
+ {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f},
+ {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f}
+ },
+ {
+ {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f},
+ {+0.037995f, -0.575156f, +0.001530f, +0.000956f, +0.000194f},
+ {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f},
+ {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f},
+ {-0.037852f, -0.213873f, -0.003692f, -0.000614f, -0.000107f},
+ {+0.039839f, +0.066118f, +0.007988f, +0.000076f, -0.000128f},
+ {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f},
+ {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f},
+ {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f},
+ {-0.039217f, -0.211900f, -0.002725f, -0.000921f, -0.000061f},
+ {-0.045306f, -0.127706f, -0.011256f, +0.001493f, +0.000048f},
+ {-0.032008f, +0.009436f, -0.005842f, +0.000094f, +0.000078f},
+ {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f},
+ {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f},
+ {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f},
+ {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f}
+ },
+ {
+ {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f},
+ {+0.340746f, -0.112091f, +0.048231f, +0.000694f, -0.000055f},
+ {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f},
+ {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f},
+ {+0.123071f, +0.035557f, +0.020641f, +0.000216f, -0.000092f},
+ {-0.043825f, -0.058128f, -0.002805f, +0.001548f, -0.000111f},
+ {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f},
+ {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f},
+ {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f},
+ {+0.123609f, +0.042304f, +0.020375f, -0.000225f, -0.000027f},
+ {+0.072663f, +0.052460f, +0.006157f, +0.001671f, +0.000023f},
+ {-0.007106f, +0.047603f, -0.003493f, -0.000487f, +0.000023f},
+ {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f},
+ {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f},
+ {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f},
+ {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f}
+ }
+};
+
+const float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]=
+{
+ {
+ {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f},
+ {-0.041076f, -0.081510f, +0.101574f, -0.012332f, -0.000133f},
+ {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f},
+ {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f},
+ {-0.008304f, -0.004854f, -0.003618f, +0.000840f, +0.000150f},
+ {-0.005344f, -0.010835f, -0.007864f, -0.004915f, +0.000112f},
+ {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f},
+ {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f},
+ {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f},
+ {-0.010068f, +0.052648f, -0.026763f, -0.010223f, -0.000366f},
+ {-0.000943f, -0.017480f, +0.020482f, +0.001034f, +0.000058f},
+ {-0.002377f, +0.034436f, +0.006489f, -0.012518f, -0.000220f},
+ {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f},
+ {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f},
+ {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f},
+ {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f}
+ },
+ {
+ {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f},
+ {+0.088569f, -0.331317f, -0.135589f, +0.009798f, +0.000139f},
+ {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f},
+ {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f},
+ {+0.013525f, +0.047393f, +0.001706f, -0.001388f, -0.000191f},
+ {+0.006413f, +0.030122f, +0.020701f, +0.011138f, -0.000148f},
+ {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f},
+ {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f},
+ {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f},
+ {+0.016939f, +0.106048f, +0.043760f, +0.005027f, +0.000470f},
+ {+0.000739f, +0.002371f, +0.021897f, +0.001907f, -0.000076f},
+ {+0.005038f, +0.073983f, +0.110448f, +0.018835f, +0.000283f},
+ {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f},
+ {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f},
+ {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f},
+ {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f}
+ },
+ {
+ {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f},
+ {-0.085624f, -0.535380f, +0.135686f, +0.024218f, +0.000137f},
+ {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f},
+ {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f},
+ {-0.004547f, +0.088202f, -0.042587f, +0.003924f, -0.000093f},
+ {+0.003101f, +0.099791f, -0.033209f, -0.007324f, -0.000060f},
+ {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f},
+ {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f},
+ {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f},
+ {-0.008367f, +0.030365f, +0.081942f, +0.019445f, +0.000222f},
+ {+0.002027f, +0.059247f, -0.024597f, -0.009143f, -0.000033f},
+ {-0.005485f, +0.016036f, +0.189920f, -0.005523f, +0.000134f},
+ {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f},
+ {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f},
+ {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f},
+ {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f}
+ },
+ {
+ {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f},
+ {+0.073631f, -0.563948f, -0.256507f, -0.030068f, -0.000165f},
+ {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f},
+ {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f},
+ {+0.000742f, -0.006564f, -0.155719f, -0.010210f, +0.000207f},
+ {-0.003772f, +0.011095f, -0.118202f, -0.002442f, +0.000158f},
+ {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f},
+ {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f},
+ {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f},
+ {+0.007216f, -0.258967f, -0.290441f, -0.007092f, -0.000519f},
+ {-0.003522f, +0.023316f, -0.032467f, +0.009674f, +0.000084f},
+ {+0.006507f, -0.177693f, -0.033997f, +0.006462f, -0.000311f},
+ {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f},
+ {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f},
+ {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f},
+ {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f}
+ },
+ {
+ {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f},
+ {-0.067605f, +0.097306f, -0.721167f, -0.014182f, -0.000134f},
+ {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f},
+ {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f},
+ {-0.009045f, -0.033260f, -0.131601f, +0.010659f, +0.000033f},
+ {-0.006391f, -0.001186f, -0.117010f, +0.003913f, +0.000007f},
+ {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f},
+ {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f},
+ {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f},
+ {-0.013866f, -0.056049f, -0.470046f, -0.033031f, -0.000066f},
+ {+0.002003f, -0.013997f, +0.006699f, -0.002838f, +0.000007f},
+ {-0.005432f, -0.012448f, -0.193385f, -0.021709f, -0.000041f},
+ {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f},
+ {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f},
+ {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f},
+ {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f}
+ },
+ {
+ {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f},
+ {+0.066811f, +0.547107f, -0.401585f, +0.049258f, +0.000209f},
+ {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f},
+ {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f},
+ {+0.020147f, +0.183472f, +0.029803f, -0.002654f, -0.000199f},
+ {+0.004470f, +0.071648f, -0.045482f, +0.003212f, -0.000142f},
+ {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f},
+ {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f},
+ {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f},
+ {+0.006262f, +0.197324f, -0.174496f, +0.041478f, +0.000509f},
+ {+0.000909f, -0.022088f, +0.010300f, -0.001930f, -0.000082f},
+ {-0.000576f, +0.053541f, -0.096593f, +0.021942f, +0.000302f},
+ {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f},
+ {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f},
+ {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f},
+ {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f}
+ },
+ {
+ {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f},
+ {-0.083119f, +0.442745f, +0.062014f, -0.030630f, +0.000109f},
+ {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f},
+ {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f},
+ {-0.025539f, +0.285695f, +0.030687f, -0.001281f, +0.000018f},
+ {+0.015563f, +0.014341f, +0.021407f, -0.004386f, +0.000034f},
+ {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f},
+ {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f},
+ {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f},
+ {+0.012587f, +0.147413f, +0.020658f, -0.013969f, -0.000077f},
+ {-0.003103f, -0.017462f, +0.008157f, +0.001803f, +0.000018f},
+ {+0.001965f, -0.006861f, +0.032042f, -0.005627f, -0.000042f},
+ {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f},
+ {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f},
+ {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f},
+ {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f}
+ },
+ {
+ {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f},
+ {+0.064730f, +0.498651f, +0.047336f, -0.004429f, -0.000255f},
+ {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f},
+ {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f},
+ {+0.008298f, +0.311166f, +0.004422f, -0.002306f, +0.000173f},
+ {-0.024372f, -0.077330f, +0.000442f, -0.001491f, +0.000110f},
+ {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f},
+ {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f},
+ {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f},
+ {-0.016067f, +0.071916f, +0.031764f, -0.005887f, -0.000449f},
+ {+0.001118f, -0.007300f, +0.004732f, -0.000912f, +0.000072f},
+ {+0.012764f, -0.015163f, +0.034285f, -0.004782f, -0.000265f},
+ {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f},
+ {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f},
+ {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f},
+ {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f}
+ },
+ {
+ {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f},
+ {+0.072210f, +0.453377f, +0.012668f, +0.009988f, -0.000056f},
+ {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f},
+ {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f},
+ {+0.048389f, +0.243348f, -0.011742f, +0.002577f, -0.000053f},
+ {+0.000883f, -0.129298f, -0.003415f, +0.002563f, -0.000054f},
+ {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f},
+ {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f},
+ {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f},
+ {+0.003882f, +0.022910f, -0.004172f, +0.004195f, +0.000185f},
+ {+0.007316f, -0.007332f, -0.005614f, +0.000479f, -0.000037f},
+ {-0.030651f, +0.049980f, -0.004306f, +0.003095f, +0.000103f},
+ {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f},
+ {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f},
+ {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f},
+ {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f}
+ },
+ {
+ {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f},
+ {-0.222358f, +0.019823f, -0.045919f, +0.001569f, +0.000284f},
+ {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f},
+ {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f},
+ {-0.104303f, +0.038679f, -0.004300f, +0.001876f, -0.000138f},
+ {+0.031107f, -0.090841f, -0.009802f, +0.001340f, -0.000075f},
+ {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f},
+ {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f},
+ {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f},
+ {-0.001966f, +0.020932f, -0.017205f, +0.001490f, +0.000358f},
+ {-0.013558f, -0.031486f, -0.001450f, +0.000305f, -0.000057f},
+ {+0.020576f, +0.126851f, -0.015311f, +0.000876f, +0.000211f},
+ {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f},
+ {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f},
+ {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f},
+ {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f}
+ },
+ {
+ {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f},
+ {+0.128697f, -0.502946f, +0.012208f, -0.003598f, -0.000018f},
+ {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f},
+ {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f},
+ {+0.072445f, -0.199735f, +0.008865f, -0.001996f, +0.000070f},
+ {-0.035970f, -0.000468f, +0.003327f, -0.001758f, +0.000054f},
+ {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f},
+ {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f},
+ {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f},
+ {+0.011400f, +0.010732f, +0.007406f, -0.002026f, -0.000250f},
+ {+0.002851f, -0.052737f, +0.000419f, -0.000375f, +0.000049f},
+ {+0.020950f, +0.124942f, +0.003929f, -0.001693f, -0.000137f},
+ {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f},
+ {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f},
+ {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f},
+ {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f}
+ },
+ {
+ {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f},
+ {+0.174716f, -0.431741f, +0.037189f, -0.000731f, -0.000283f},
+ {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f},
+ {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f},
+ {+0.046880f, -0.228632f, +0.012580f, -0.001764f, +0.000105f},
+ {+0.015443f, +0.068044f, +0.005570f, -0.000844f, +0.000048f},
+ {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f},
+ {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f},
+ {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f},
+ {-0.006601f, -0.021923f, +0.013349f, -0.000309f, -0.000258f},
+ {+0.019016f, -0.023410f, +0.005296f, -0.000367f, +0.000039f},
+ {-0.051437f, +0.010933f, +0.004546f, +0.000118f, -0.000155f},
+ {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f},
+ {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f},
+ {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f},
+ {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f}
+ },
+ {
+ {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f},
+ {-0.261169f, +0.235971f, -0.033757f, +0.001621f, +0.000093f},
+ {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f},
+ {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f},
+ {-0.111926f, +0.011250f, -0.016908f, +0.001748f, -0.000072f},
+ {+0.005469f, +0.082676f, -0.002169f, +0.001143f, -0.000043f},
+ {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f},
+ {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f},
+ {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f},
+ {-0.012620f, -0.018407f, -0.006593f, +0.002080f, +0.000273f},
+ {-0.020511f, +0.042167f, -0.004809f, +0.000322f, -0.000054f},
+ {+0.032247f, -0.119711f, +0.002446f, +0.001305f, +0.000148f},
+ {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f},
+ {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f},
+ {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f},
+ {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f}
+ },
+ {
+ {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f},
+ {-0.049598f, +0.562660f, -0.018307f, -0.000353f, +0.000250f},
+ {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f},
+ {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f},
+ {+0.023452f, +0.216602f, -0.003361f, +0.001302f, -0.000079f},
+ {-0.022798f, +0.048857f, -0.002028f, +0.000528f, -0.000034f},
+ {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f},
+ {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f},
+ {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f},
+ {+0.015824f, +0.032277f, -0.008777f, -0.000341f, +0.000168f},
+ {-0.010909f, +0.060681f, -0.000865f, +0.000330f, -0.000023f},
+ {+0.018513f, -0.140495f, -0.006788f, -0.000319f, +0.000106f},
+ {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f},
+ {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f},
+ {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f},
+ {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f}
+ },
+ {
+ {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f},
+ {+0.297362f, +0.028772f, +0.040257f, -0.001002f, -0.000153f},
+ {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f},
+ {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f},
+ {+0.100486f, +0.097500f, +0.017137f, -0.001413f, +0.000066f},
+ {+0.042930f, -0.041353f, +0.001818f, -0.000969f, +0.000030f},
+ {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f},
+ {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f},
+ {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f},
+ {+0.005351f, +0.056149f, +0.003091f, -0.002220f, -0.000265f},
+ {+0.035484f, -0.008203f, +0.004198f, -0.000217f, +0.000054f},
+ {-0.049383f, -0.039088f, -0.002024f, -0.001275f, -0.000143f},
+ {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f},
+ {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f},
+ {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f},
+ {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f}
+ },
+ {
+ {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f},
+ {-0.068322f, -0.534398f, +0.000794f, +0.001015f, -0.000195f},
+ {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f},
+ {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f},
+ {-0.074868f, -0.177414f, -0.007217f, -0.000977f, +0.000063f},
+ {-0.040080f, -0.169063f, -0.003424f, -0.000213f, +0.000031f},
+ {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f},
+ {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f},
+ {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f},
+ {-0.022634f, +0.009810f, +0.007400f, +0.000511f, -0.000099f},
+ {-0.010732f, -0.077733f, -0.000399f, -0.000274f, +0.000009f},
+ {+0.039390f, +0.089325f, +0.008313f, +0.000351f, -0.000070f},
+ {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f},
+ {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f},
+ {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f},
+ {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f}
+ },
+ {
+ {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f},
+ {-0.272424f, -0.216540f, -0.039997f, +0.001031f, +0.000186f},
+ {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f},
+ {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f},
+ {-0.067471f, -0.194793f, -0.010208f, +0.001216f, -0.000058f},
+ {-0.018637f, -0.214052f, +0.004837f, +0.000884f, -0.000020f},
+ {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f},
+ {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f},
+ {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f},
+ {+0.014798f, -0.052375f, -0.000623f, +0.002191f, +0.000241f},
+ {-0.034285f, -0.039743f, -0.005351f, +0.000109f, -0.000050f},
+ {-0.007201f, +0.159482f, -0.003886f, +0.001201f, +0.000130f},
+ {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f},
+ {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f},
+ {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f},
+ {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f}
+ },
+ {
+ {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f},
+ {+0.145635f, +0.430918f, +0.013134f, -0.001141f, +0.000134f},
+ {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f},
+ {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f},
+ {+0.114138f, +0.085208f, +0.011213f, +0.000798f, -0.000055f},
+ {+0.095938f, -0.054666f, +0.000697f, +0.000059f, -0.000033f},
+ {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f},
+ {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f},
+ {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f},
+ {+0.009119f, -0.057095f, -0.007675f, -0.000456f, +0.000052f},
+ {+0.027961f, +0.057568f, +0.003773f, +0.000262f, +0.000002f},
+ {-0.030433f, +0.136477f, -0.002756f, -0.000256f, +0.000046f},
+ {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f},
+ {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f},
+ {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f},
+ {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f}
+ },
+ {
+ {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f},
+ {+0.234234f, +0.291735f, +0.035875f, -0.001265f, -0.000192f},
+ {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f},
+ {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f},
+ {+0.003204f, +0.260777f, +0.001135f, -0.001218f, +0.000051f},
+ {-0.094495f, +0.222636f, -0.006686f, -0.000805f, +0.000016f},
+ {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f},
+ {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f},
+ {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f},
+ {-0.028004f, +0.004399f, -0.001485f, -0.002043f, -0.000214f},
+ {+0.030214f, +0.052517f, +0.005355f, -0.000063f, +0.000045f},
+ {+0.064016f, +0.008538f, +0.001790f, -0.001210f, -0.000117f},
+ {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f},
+ {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f},
+ {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f},
+ {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f}
+ },
+ {
+ {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f},
+ {-0.196112f, -0.377527f, -0.024063f, +0.000894f, -0.000082f},
+ {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f},
+ {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f},
+ {-0.109837f, +0.090094f, -0.008580f, -0.000595f, +0.000051f},
+ {-0.015004f, +0.336419f, +0.000747f, -0.000099f, +0.000037f},
+ {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f},
+ {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f},
+ {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f},
+ {+0.021795f, +0.078114f, +0.010687f, +0.000406f, -0.000022f},
+ {-0.048839f, -0.075397f, -0.009105f, -0.000275f, -0.000010f},
+ {-0.060558f, -0.174519f, -0.000133f, +0.000349f, -0.000030f},
+ {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f},
+ {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f},
+ {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f},
+ {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f}
+ },
+ {
+ {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f},
+ {-0.203183f, -0.369192f, -0.029570f, +0.001470f, +0.000179f},
+ {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f},
+ {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f},
+ {+0.062623f, -0.173224f, +0.004907f, +0.001276f, -0.000047f},
+ {+0.122967f, +0.126986f, +0.011441f, +0.000914f, -0.000015f},
+ {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f},
+ {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f},
+ {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f},
+ {+0.015861f, +0.086444f, -0.001699f, +0.001895f, +0.000191f},
+ {-0.021170f, -0.125446f, +0.000128f, +0.000133f, -0.000040f},
+ {-0.009541f, -0.253886f, +0.000901f, +0.000985f, +0.000105f},
+ {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f},
+ {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f},
+ {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f},
+ {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f}
+ },
+ {
+ {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f},
+ {+0.247632f, +0.326555f, +0.030602f, -0.000692f, +0.000048f},
+ {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f},
+ {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f},
+ {+0.050312f, -0.188989f, +0.003722f, +0.000209f, -0.000050f},
+ {-0.100154f, -0.206241f, -0.011197f, -0.000132f, -0.000040f},
+ {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f},
+ {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f},
+ {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f},
+ {-0.049708f, -0.006526f, -0.011594f, -0.000511f, +0.000001f},
+ {+0.089665f, +0.042291f, +0.010250f, +0.000131f, +0.000016f},
+ {+0.097341f, -0.094533f, +0.003394f, -0.000253f, +0.000020f},
+ {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f},
+ {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f},
+ {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f},
+ {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f}
+ },
+ {
+ {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f},
+ {+0.162130f, +0.457377f, +0.023723f, -0.001331f, -0.000162f},
+ {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f},
+ {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f},
+ {-0.074601f, +0.003099f, -0.007367f, -0.000899f, +0.000047f},
+ {-0.032786f, -0.305719f, -0.004336f, -0.000704f, +0.000017f},
+ {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f},
+ {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f},
+ {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f},
+ {+0.025959f, -0.115431f, +0.002496f, -0.001721f, -0.000173f},
+ {-0.041136f, +0.248497f, -0.009339f, -0.000010f, +0.000035f},
+ {-0.096543f, +0.197881f, -0.009153f, -0.000920f, -0.000096f},
+ {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f},
+ {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f},
+ {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f},
+ {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f}
+ },
+ {
+ {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f},
+ {-0.297115f, -0.254096f, -0.039956f, +0.000532f, -0.000029f},
+ {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f},
+ {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f},
+ {+0.011296f, +0.129516f, +0.000519f, -0.000384f, +0.000049f},
+ {+0.122480f, -0.073347f, +0.013051f, +0.000154f, +0.000043f},
+ {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f},
+ {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f},
+ {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f},
+ {+0.038364f, -0.096477f, +0.011620f, +0.000633f, +0.000016f},
+ {-0.083812f, +0.194659f, -0.004197f, -0.000207f, -0.000021f},
+ {-0.014333f, +0.322027f, +0.003857f, +0.000214f, -0.000012f},
+ {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f},
+ {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f},
+ {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f},
+ {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f}
+ },
+ {
+ {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f},
+ {-0.103203f, -0.556970f, -0.012926f, +0.001069f, +0.000150f},
+ {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f},
+ {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f},
+ {+0.036140f, +0.084377f, +0.005388f, +0.000960f, -0.000048f},
+ {-0.073377f, +0.218074f, -0.003890f, +0.000548f, -0.000019f},
+ {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f},
+ {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f},
+ {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f},
+ {-0.049659f, +0.036455f, -0.006360f, +0.001588f, +0.000158f},
+ {+0.120231f, -0.105131f, +0.009262f, +0.000134f, -0.000029f},
+ {+0.112765f, +0.136113f, +0.006454f, +0.000956f, +0.000090f},
+ {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f},
+ {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f},
+ {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f},
+ {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f}
+ },
+ {
+ {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f},
+ {+0.335782f, +0.115073f, +0.042124f, -0.000524f, +0.000017f},
+ {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f},
+ {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f},
+ {-0.029086f, -0.017821f, -0.006048f, +0.000346f, -0.000049f},
+ {-0.042390f, +0.261438f, -0.007011f, +0.000009f, -0.000045f},
+ {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f},
+ {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f},
+ {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f},
+ {-0.018408f, +0.085038f, -0.009119f, -0.000628f, -0.000033f},
+ {-0.008166f, -0.290055f, +0.001289f, +0.000009f, +0.000025f},
+ {-0.083446f, -0.145097f, -0.006817f, -0.000355f, +0.000005f},
+ {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f},
+ {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f},
+ {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f},
+ {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f}
+ },
+ {
+ {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f},
+ {+0.018754f, +0.598224f, +0.004168f, -0.000868f, -0.000145f},
+ {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f},
+ {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f},
+ {+0.000800f, -0.063354f, +0.000572f, -0.000962f, +0.000051f},
+ {+0.090619f, +0.057573f, +0.010215f, -0.000723f, +0.000024f},
+ {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f},
+ {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f},
+ {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f},
+ {+0.055793f, -0.030364f, +0.009245f, -0.001646f, -0.000143f},
+ {-0.108310f, -0.127663f, -0.016687f, +0.000038f, +0.000024f},
+ {-0.021618f, -0.220697f, -0.010039f, -0.000820f, -0.000085f},
+ {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f},
+ {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f},
+ {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f},
+ {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f}
+ },
+ {
+ {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f},
+ {-0.330415f, +0.056420f, -0.045563f, +0.000643f, -0.000004f},
+ {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f},
+ {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f},
+ {+0.023615f, -0.028111f, +0.005911f, -0.000294f, +0.000047f},
+ {-0.037741f, -0.135965f, +0.001385f, +0.000118f, +0.000047f},
+ {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f},
+ {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f},
+ {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f},
+ {+0.012169f, -0.103078f, +0.005526f, +0.000708f, +0.000048f},
+ {+0.074830f, +0.156990f, +0.009538f, -0.000116f, -0.000028f},
+ {+0.062857f, -0.082116f, +0.012816f, +0.000338f, +0.000001f},
+ {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f},
+ {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f},
+ {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f},
+ {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f}
+ },
+ {
+ {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f},
+ {+0.047047f, -0.524471f, +0.005924f, +0.000814f, +0.000145f},
+ {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f},
+ {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f},
+ {-0.026484f, +0.050686f, -0.004980f, +0.000903f, -0.000054f},
+ {-0.034959f, -0.130515f, -0.008100f, +0.000616f, -0.000030f},
+ {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f},
+ {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f},
+ {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f},
+ {-0.074905f, +0.029652f, -0.011288f, +0.001578f, +0.000126f},
+ {+0.054496f, +0.184572f, +0.009789f, +0.000066f, -0.000019f},
+ {-0.016479f, +0.037096f, +0.001911f, +0.000841f, +0.000081f},
+ {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f},
+ {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f},
+ {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f},
+ {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f}
+ },
+ {
+ {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f},
+ {+0.307994f, -0.118968f, +0.043852f, -0.000752f, -0.000013f},
+ {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f},
+ {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f},
+ {-0.010325f, +0.076779f, -0.004480f, +0.000277f, -0.000045f},
+ {+0.047884f, +0.004957f, +0.004446f, -0.000008f, -0.000047f},
+ {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f},
+ {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f},
+ {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f},
+ {+0.006631f, +0.159391f, -0.003115f, -0.000670f, -0.000060f},
+ {-0.094163f, -0.047695f, -0.013081f, +0.000014f, +0.000031f},
+ {-0.015662f, +0.033250f, -0.008826f, -0.000442f, -0.000008f},
+ {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f},
+ {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f},
+ {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f},
+ {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f}
+ },
+ {
+ {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f},
+ {-0.090327f, +0.495394f, -0.013216f, -0.000916f, -0.000142f},
+ {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f},
+ {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f},
+ {+0.048231f, -0.015397f, +0.007225f, -0.000847f, +0.000058f},
+ {-0.004788f, +0.088135f, -0.001735f, -0.000622f, +0.000036f},
+ {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f},
+ {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f},
+ {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f},
+ {+0.095197f, +0.024052f, +0.012511f, -0.001509f, -0.000110f},
+ {-0.005662f, -0.184911f, -0.000567f, -0.000000f, +0.000014f},
+ {-0.009469f, +0.021505f, -0.002081f, -0.000772f, -0.000077f},
+ {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f},
+ {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f},
+ {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f},
+ {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f}
+ },
+ {
+ {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f},
+ {-0.290883f, +0.185607f, -0.040080f, +0.000773f, +0.000032f},
+ {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f},
+ {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f},
+ {-0.015723f, -0.117462f, -0.000807f, -0.000218f, +0.000042f},
+ {-0.035133f, +0.040557f, -0.002714f, +0.000053f, +0.000045f},
+ {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f},
+ {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f},
+ {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f},
+ {-0.046438f, -0.197810f, -0.002809f, +0.000665f, +0.000069f},
+ {+0.091389f, -0.035774f, +0.012879f, -0.000048f, -0.000034f},
+ {+0.015830f, +0.061261f, +0.007852f, +0.000438f, +0.000014f},
+ {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f},
+ {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f},
+ {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f},
+ {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f}
+ },
+ {
+ {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f},
+ {+0.130636f, -0.461671f, +0.019013f, +0.001042f, +0.000135f},
+ {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f},
+ {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f},
+ {-0.057782f, -0.056244f, -0.005456f, +0.000765f, -0.000061f},
+ {+0.029537f, -0.058278f, +0.004239f, +0.000490f, -0.000041f},
+ {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f},
+ {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f},
+ {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f},
+ {-0.095269f, -0.125227f, -0.010570f, +0.001415f, +0.000094f},
+ {-0.036826f, +0.161036f, -0.004519f, +0.000009f, -0.000008f},
+ {+0.033206f, +0.037588f, +0.003181f, +0.000776f, +0.000072f},
+ {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f},
+ {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f},
+ {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f},
+ {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f}
+ },
+ {
+ {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f},
+ {+0.271075f, -0.243750f, +0.037165f, -0.000660f, -0.000051f},
+ {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f},
+ {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f},
+ {+0.051695f, +0.108630f, +0.002988f, +0.000126f, -0.000040f},
+ {+0.009503f, -0.085941f, +0.000815f, -0.000139f, -0.000044f},
+ {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f},
+ {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f},
+ {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f},
+ {+0.093434f, +0.165866f, +0.008284f, -0.000735f, -0.000077f},
+ {-0.070607f, +0.107384f, -0.011250f, +0.000036f, +0.000037f},
+ {-0.051205f, -0.088169f, -0.009120f, -0.000422f, -0.000021f},
+ {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f},
+ {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f},
+ {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f},
+ {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f}
+ },
+ {
+ {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f},
+ {-0.165837f, +0.426649f, -0.024449f, -0.001120f, -0.000123f},
+ {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f},
+ {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f},
+ {+0.039815f, +0.122590f, +0.005933f, -0.000681f, +0.000065f},
+ {-0.034180f, -0.017407f, -0.005868f, -0.000354f, +0.000044f},
+ {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f},
+ {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f},
+ {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f},
+ {+0.065165f, +0.208130f, +0.007649f, -0.001302f, -0.000078f},
+ {+0.065730f, -0.103768f, +0.008899f, +0.000008f, +0.000000f},
+ {-0.017223f, -0.140007f, -0.001227f, -0.000774f, -0.000066f},
+ {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f},
+ {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f},
+ {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f},
+ {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f}
+ },
+ {
+ {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f},
+ {-0.251749f, +0.291487f, -0.034882f, +0.000530f, +0.000064f},
+ {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f},
+ {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f},
+ {-0.065186f, -0.041803f, -0.007285f, -0.000055f, +0.000040f},
+ {+0.015347f, +0.057135f, +0.002287f, +0.000244f, +0.000046f},
+ {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f},
+ {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f},
+ {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f},
+ {-0.120059f, -0.080527f, -0.013286f, +0.000793f, +0.000086f},
+ {+0.042102f, -0.139525f, +0.007143f, +0.000010f, -0.000040f},
+ {+0.075712f, -0.002196f, +0.010631f, +0.000380f, +0.000025f},
+ {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f},
+ {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f},
+ {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f},
+ {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f}
+ },
+ {
+ {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f},
+ {+0.199395f, -0.402227f, +0.030381f, +0.001070f, +0.000111f},
+ {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f},
+ {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f},
+ {-0.028118f, -0.096712f, -0.004235f, +0.000661f, -0.000071f},
+ {+0.020670f, +0.048284f, +0.004447f, +0.000361f, -0.000049f},
+ {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f},
+ {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f},
+ {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f},
+ {-0.027250f, -0.222848f, -0.002393f, +0.001277f, +0.000059f},
+ {-0.083457f, +0.055583f, -0.011895f, -0.000049f, +0.000010f},
+ {-0.023912f, +0.145973f, -0.001523f, +0.000736f, +0.000060f},
+ {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f},
+ {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f},
+ {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f},
+ {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f}
+ },
+ {
+ {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f},
+ {+0.234739f, -0.346303f, +0.031613f, -0.000452f, -0.000075f},
+ {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f},
+ {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f},
+ {+0.074908f, +0.067483f, +0.011111f, +0.000037f, -0.000040f},
+ {-0.024868f, -0.020084f, -0.003583f, -0.000348f, -0.000052f},
+ {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f},
+ {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f},
+ {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f},
+ {+0.128529f, +0.021349f, +0.015609f, -0.000805f, -0.000095f},
+ {-0.009730f, +0.170684f, -0.001530f, -0.000070f, +0.000041f},
+ {-0.063989f, +0.082569f, -0.011861f, -0.000327f, -0.000027f},
+ {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f},
+ {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f},
+ {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f},
+ {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f}
+ },
+ {
+ {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f},
+ {-0.240846f, +0.383749f, -0.036120f, -0.000976f, -0.000103f},
+ {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f},
+ {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f},
+ {+0.026805f, +0.145169f, +0.000897f, -0.000699f, +0.000083f},
+ {-0.004898f, -0.050127f, -0.002984f, -0.000479f, +0.000062f},
+ {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f},
+ {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f},
+ {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f},
+ {-0.006723f, +0.230147f, -0.003197f, -0.001300f, -0.000034f},
+ {+0.095384f, +0.009012f, +0.012879f, +0.000031f, -0.000023f},
+ {+0.048765f, -0.092236f, +0.006693f, -0.000674f, -0.000056f},
+ {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f},
+ {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f},
+ {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f},
+ {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f}
+ },
+ {
+ {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f},
+ {-0.208289f, +0.431823f, -0.027399f, +0.000496f, +0.000086f},
+ {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f},
+ {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f},
+ {-0.107325f, -0.060873f, -0.013159f, -0.000090f, +0.000038f},
+ {+0.020607f, -0.012217f, +0.003265f, +0.000308f, +0.000058f},
+ {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f},
+ {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f},
+ {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f},
+ {-0.129678f, +0.037696f, -0.015815f, +0.000703f, +0.000099f},
+ {-0.037248f, -0.197082f, -0.005086f, +0.000193f, -0.000037f},
+ {+0.043816f, -0.101985f, +0.008254f, +0.000336f, +0.000028f},
+ {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f},
+ {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f},
+ {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f},
+ {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f}
+ },
+ {
+ {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f},
+ {+0.286340f, -0.326727f, +0.042071f, +0.000948f, +0.000098f},
+ {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f},
+ {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f},
+ {+0.004658f, -0.232611f, +0.002627f, +0.000673f, -0.000101f},
+ {-0.001246f, +0.020482f, +0.002726f, +0.000581f, -0.000087f},
+ {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f},
+ {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f},
+ {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f},
+ {+0.041445f, -0.225060f, +0.008066f, +0.001247f, +0.000002f},
+ {-0.082241f, -0.130716f, -0.009581f, +0.000052f, +0.000037f},
+ {-0.061982f, +0.060921f, -0.008434f, +0.000587f, +0.000055f},
+ {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f},
+ {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f},
+ {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f},
+ {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f}
+ },
+ {
+ {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f},
+ {+0.163451f, -0.512532f, +0.021259f, -0.000613f, -0.000105f},
+ {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f},
+ {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f},
+ {+0.125629f, -0.045496f, +0.015544f, +0.000259f, -0.000027f},
+ {-0.013056f, +0.002303f, -0.002874f, -0.000034f, -0.000053f},
+ {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f},
+ {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f},
+ {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f},
+ {+0.119869f, -0.100206f, +0.015399f, -0.000474f, -0.000091f},
+ {+0.083578f, +0.121580f, +0.008601f, -0.000327f, +0.000026f},
+ {-0.021962f, +0.124782f, -0.004983f, -0.000417f, -0.000031f},
+ {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f},
+ {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f},
+ {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f},
+ {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f}
+ },
+ {
+ {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f},
+ {-0.321458f, +0.231555f, -0.047137f, -0.001083f, -0.000091f},
+ {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f},
+ {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f},
+ {-0.053207f, +0.228176f, -0.008455f, -0.000505f, +0.000122f},
+ {-0.006068f, -0.008715f, -0.003223f, -0.000482f, +0.000122f},
+ {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f},
+ {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f},
+ {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f},
+ {-0.071428f, +0.194582f, -0.013164f, -0.000987f, +0.000034f},
+ {+0.035270f, +0.192622f, +0.005952f, -0.000220f, -0.000050f},
+ {+0.068773f, -0.014813f, +0.009109f, -0.000533f, -0.000056f},
+ {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f},
+ {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f},
+ {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f},
+ {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f}
+ },
+ {
+ {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f},
+ {-0.106819f, +0.558024f, -0.013421f, +0.000683f, +0.000132f},
+ {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f},
+ {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f},
+ {-0.114197f, +0.131784f, -0.014954f, -0.000412f, +0.000002f},
+ {+0.019246f, +0.031443f, +0.004356f, -0.000329f, +0.000027f},
+ {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f},
+ {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f},
+ {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f},
+ {-0.102756f, +0.143879f, -0.013003f, +0.000283f, +0.000065f},
+ {-0.095015f, -0.011155f, -0.012207f, +0.000367f, -0.000008f},
+ {-0.004913f, -0.131661f, +0.000343f, +0.000524f, +0.000039f},
+ {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f},
+ {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f},
+ {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f},
+ {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f}
+ },
+ {
+ {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f},
+ {+0.340199f, -0.128020f, +0.049926f, +0.001339f, +0.000072f},
+ {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f},
+ {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f},
+ {+0.092373f, -0.185204f, +0.014035f, +0.000067f, -0.000138f},
+ {+0.010912f, +0.048983f, +0.001816f, -0.000075f, -0.000154f},
+ {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f},
+ {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f},
+ {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f},
+ {+0.096213f, -0.160581f, +0.016571f, +0.000370f, -0.000063f},
+ {+0.010051f, -0.173763f, +0.000750f, +0.000501f, +0.000056f},
+ {-0.062657f, -0.045986f, -0.006800f, +0.000608f, +0.000057f},
+ {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f},
+ {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f},
+ {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f},
+ {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f}
+ },
+ {
+ {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f},
+ {+0.048357f, -0.572445f, +0.005311f, -0.000514f, -0.000163f},
+ {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f},
+ {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f},
+ {+0.086028f, -0.192206f, +0.012072f, +0.000418f, +0.000038f},
+ {-0.040227f, -0.025362f, -0.003912f, +0.000532f, +0.000024f},
+ {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f},
+ {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f},
+ {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f},
+ {+0.078983f, -0.183476f, +0.010913f, -0.000304f, -0.000020f},
+ {+0.083563f, -0.058421f, +0.010558f, -0.000255f, -0.000015f},
+ {+0.030882f, +0.097232f, +0.001515f, -0.000622f, -0.000053f},
+ {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f},
+ {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f},
+ {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f},
+ {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f}
+ },
+ {
+ {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f},
+ {-0.345899f, +0.033997f, -0.051595f, -0.001615f, -0.000035f},
+ {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f},
+ {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f},
+ {-0.115274f, +0.117327f, -0.017963f, +0.000487f, +0.000138f},
+ {+0.008614f, -0.100535f, -0.001469f, +0.001024f, +0.000165f},
+ {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f},
+ {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f},
+ {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f},
+ {-0.112953f, +0.110523f, -0.019836f, +0.000405f, +0.000071f},
+ {-0.043415f, +0.138944f, -0.005951f, -0.000778f, -0.000051f},
+ {+0.038181f, +0.085067f, +0.005138f, -0.000773f, -0.000051f},
+ {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f},
+ {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f},
+ {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f},
+ {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f}
+ },
+ {
+ {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f},
+ {+0.007859f, +0.574645f, +0.003243f, +0.000139f, +0.000188f},
+ {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f},
+ {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f},
+ {-0.052764f, +0.211602f, -0.007618f, +0.000144f, -0.000084f},
+ {+0.046479f, -0.043520f, +0.004619f, +0.000085f, -0.000093f},
+ {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f},
+ {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f},
+ {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f},
+ {-0.051960f, +0.201931f, -0.007334f, +0.001040f, -0.000035f},
+ {-0.061094f, +0.110021f, -0.007462f, -0.000103f, +0.000039f},
+ {-0.036876f, -0.032412f, -0.003266f, +0.000534f, +0.000070f},
+ {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f},
+ {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f},
+ {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f},
+ {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f}
+ },
+ {
+ {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f},
+ {+0.343985f, +0.057778f, +0.051999f, +0.001370f, -0.000021f},
+ {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f},
+ {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f},
+ {+0.122328f, -0.057169f, +0.020503f, -0.000916f, -0.000113f},
+ {-0.036115f, +0.084847f, +0.000437f, -0.002283f, -0.000139f},
+ {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f},
+ {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f},
+ {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f},
+ {+0.120605f, -0.060574f, +0.022209f, -0.000951f, -0.000049f},
+ {+0.065666f, -0.088077f, +0.009755f, +0.000580f, +0.000035f},
+ {-0.014536f, -0.066997f, -0.002290f, +0.001040f, +0.000035f},
+ {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f},
+ {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f},
+ {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f},
+ {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f}
+ },
+ {
+ {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f},
+ {-0.065401f, -0.568079f, -0.010528f, +0.000542f, -0.000194f},
+ {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f},
+ {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f},
+ {+0.023543f, -0.209166f, +0.002096f, -0.002246f, +0.000125f},
+ {-0.031298f, +0.092434f, -0.002541f, -0.002737f, +0.000158f},
+ {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f},
+ {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f},
+ {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f},
+ {+0.025683f, -0.205232f, +0.002533f, -0.003878f, +0.000082f},
+ {+0.031489f, -0.139294f, +0.004565f, +0.001598f, -0.000056f},
+ {+0.026207f, -0.002872f, +0.002107f, -0.000154f, -0.000084f},
+ {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f},
+ {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f},
+ {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f},
+ {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f}
+ }
+};
+
+const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]=
+{
+ {
+ {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f},
+ {+0.159214f, -0.438495f, +0.131837f, +0.004567f, +0.000134f},
+ {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f},
+ {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f},
+ {+0.003524f, -0.002365f, +0.008243f, -0.002720f, -0.000173f},
+ {-0.001684f, +0.006593f, +0.024280f, -0.012226f, -0.000133f},
+ {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f},
+ {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f},
+ {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f},
+ {+0.012650f, -0.030376f, -0.022293f, +0.005058f, +0.000424f},
+ {-0.003808f, +0.011707f, +0.008010f, -0.002270f, -0.000068f},
+ {+0.003343f, -0.012704f, -0.014571f, +0.003409f, +0.000255f},
+ {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f},
+ {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f},
+ {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f},
+ {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f}
+ },
+ {
+ {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f},
+ {-0.061927f, -0.923113f, +0.018254f, +0.003553f, +0.000135f},
+ {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f},
+ {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f},
+ {-0.001425f, -0.021365f, +0.019206f, +0.005433f, -0.000123f},
+ {+0.004675f, +0.040742f, +0.087083f, +0.008021f, -0.000087f},
+ {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f},
+ {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f},
+ {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f},
+ {-0.006435f, -0.139253f, -0.070542f, +0.004148f, +0.000297f},
+ {+0.001842f, +0.052892f, +0.056325f, +0.005942f, -0.000046f},
+ {-0.004364f, -0.052115f, -0.019067f, +0.000398f, +0.000179f},
+ {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f},
+ {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f},
+ {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f},
+ {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f}
+ },
+ {
+ {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f},
+ {-0.017318f, -0.757708f, -0.032772f, -0.023486f, -0.000150f},
+ {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f},
+ {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f},
+ {-0.003861f, -0.074613f, +0.059871f, -0.001275f, +0.000202f},
+ {-0.004218f, +0.001879f, +0.134238f, +0.000831f, +0.000156f},
+ {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f},
+ {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f},
+ {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f},
+ {-0.003304f, -0.293531f, +0.162769f, -0.029563f, -0.000502f},
+ {+0.000187f, +0.025533f, +0.089914f, -0.003071f, +0.000081f},
+ {+0.001118f, -0.199397f, +0.178948f, -0.009074f, -0.000301f},
+ {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f},
+ {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f},
+ {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f},
+ {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f}
+ },
+ {
+ {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f},
+ {+0.019638f, -0.173586f, +0.454125f, +0.045073f, -0.000138f},
+ {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f},
+ {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f},
+ {+0.010927f, -0.114232f, -0.022410f, -0.002610f, +0.000063f},
+ {+0.001151f, -0.065308f, +0.047475f, -0.003953f, +0.000033f},
+ {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f},
+ {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f},
+ {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f},
+ {+0.012397f, -0.141388f, +0.368076f, +0.043941f, -0.000144f},
+ {-0.000613f, -0.027917f, +0.038807f, -0.005057f, +0.000020f},
+ {+0.005278f, -0.064856f, +0.339877f, +0.008614f, -0.000087f},
+ {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f},
+ {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f},
+ {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f},
+ {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f}
+ },
+ {
+ {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f},
+ {+0.008133f, +0.216891f, +0.173004f, -0.046339f, +0.000186f},
+ {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f},
+ {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f},
+ {-0.012719f, +0.054617f, -0.162135f, -0.005430f, -0.000206f},
+ {-0.004192f, +0.016864f, -0.049221f, -0.004060f, -0.000152f},
+ {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f},
+ {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f},
+ {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f},
+ {-0.015743f, +0.224869f, +0.116394f, -0.024045f, +0.000521f},
+ {+0.000520f, -0.017676f, +0.001703f, +0.007076f, -0.000085f},
+ {-0.005864f, +0.108940f, +0.176379f, +0.006190f, +0.000311f},
+ {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f},
+ {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f},
+ {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f},
+ {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f}
+ },
+ {
+ {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f},
+ {-0.009859f, -0.329919f, -0.267131f, +0.025972f, +0.000125f},
+ {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f},
+ {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f},
+ {+0.009694f, +0.066480f, -0.161387f, +0.014778f, -0.000006f},
+ {+0.011976f, +0.007185f, -0.079605f, +0.010521f, +0.000016f},
+ {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f},
+ {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f},
+ {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f},
+ {+0.011087f, +0.102790f, -0.079859f, +0.000351f, -0.000008f},
+ {-0.001584f, -0.009914f, -0.007779f, -0.002067f, +0.000006f},
+ {-0.003353f, +0.001777f, -0.008005f, -0.013355f, -0.000003f},
+ {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f},
+ {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f},
+ {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f},
+ {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f}
+ },
+ {
+ {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f},
+ {-0.044970f, -0.559290f, -0.057727f, -0.008886f, -0.000233f},
+ {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f},
+ {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f},
+ {-0.023556f, -0.052508f, +0.021029f, -0.010719f, +0.000188f},
+ {-0.008092f, +0.004951f, -0.027003f, -0.006766f, +0.000127f},
+ {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f},
+ {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f},
+ {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f},
+ {-0.004678f, +0.016958f, -0.018438f, -0.001910f, -0.000484f},
+ {+0.001327f, -0.004928f, -0.011742f, -0.001214f, +0.000078f},
+ {+0.013688f, -0.047967f, -0.031851f, +0.002524f, -0.000286f},
+ {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f},
+ {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f},
+ {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f},
+ {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f}
+ },
+ {
+ {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f},
+ {+0.151251f, -0.284723f, +0.015522f, +0.005073f, -0.000086f},
+ {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f},
+ {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f},
+ {+0.064701f, -0.012013f, +0.004462f, +0.000173f, -0.000038f},
+ {-0.014183f, +0.018557f, +0.019481f, +0.000708f, -0.000046f},
+ {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f},
+ {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f},
+ {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f},
+ {+0.005765f, -0.013682f, -0.000873f, +0.007110f, +0.000136f},
+ {+0.003019f, +0.012643f, +0.006120f, +0.000396f, -0.000028f},
+ {-0.011018f, -0.079111f, -0.001161f, +0.005334f, +0.000076f},
+ {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f},
+ {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f},
+ {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f},
+ {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f}
+ },
+ {
+ {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f},
+ {-0.192280f, +0.252895f, +0.010481f, -0.000333f, +0.000272f},
+ {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f},
+ {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f},
+ {-0.084125f, +0.181115f, +0.006598f, +0.003510f, -0.000156f},
+ {+0.033552f, -0.023473f, +0.003836f, +0.001049f, -0.000092f},
+ {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f},
+ {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f},
+ {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f},
+ {-0.011588f, +0.007485f, +0.021418f, +0.002195f, +0.000406f},
+ {-0.004828f, +0.034802f, -0.002483f, +0.000357f, -0.000065f},
+ {-0.010126f, -0.088145f, +0.024313f, +0.000561f, +0.000239f},
+ {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f},
+ {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f},
+ {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f},
+ {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f}
+ },
+ {
+ {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f},
+ {+0.025480f, +0.578744f, +0.004928f, -0.005728f, +0.000021f},
+ {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f},
+ {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f},
+ {+0.018947f, +0.326335f, -0.012624f, -0.000806f, +0.000063f},
+ {-0.025064f, -0.093936f, -0.002533f, -0.000591f, +0.000056f},
+ {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f},
+ {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f},
+ {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f},
+ {+0.008512f, +0.041967f, -0.005268f, -0.006560f, -0.000223f},
+ {-0.005601f, +0.039303f, -0.001728f, +0.000112f, +0.000044f},
+ {+0.035999f, -0.034895f, -0.002757f, -0.004270f, -0.000123f},
+ {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f},
+ {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f},
+ {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f},
+ {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f}
+ },
+ {
+ {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f},
+ {+0.225295f, +0.253817f, +0.010634f, +0.001216f, -0.000288f},
+ {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f},
+ {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f},
+ {+0.089464f, +0.200814f, +0.007558f, -0.001360f, +0.000121f},
+ {-0.004322f, -0.115904f, -0.010769f, -0.000324f, +0.000060f},
+ {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f},
+ {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f},
+ {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f},
+ {+0.005629f, +0.034211f, -0.013115f, -0.002185f, -0.000307f},
+ {+0.019520f, +0.005119f, -0.001636f, -0.000261f, +0.000048f},
+ {-0.038933f, +0.062477f, -0.011725f, -0.001017f, -0.000182f},
+ {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f},
+ {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f},
+ {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f},
+ {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f}
+ },
+ {
+ {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f},
+ {-0.206677f, -0.408421f, -0.026814f, +0.005082f, +0.000056f},
+ {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f},
+ {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f},
+ {-0.105083f, -0.109018f, -0.007715f, +0.000799f, -0.000072f},
+ {+0.025793f, -0.064751f, +0.005742f, +0.000924f, -0.000050f},
+ {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f},
+ {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f},
+ {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f},
+ {-0.013715f, -0.007050f, -0.000167f, +0.004932f, +0.000266f},
+ {-0.012412f, -0.040469f, +0.000036f, +0.000063f, -0.000052f},
+ {+0.005607f, +0.122490f, +0.001069f, +0.003166f, +0.000145f},
+ {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f},
+ {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f},
+ {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f},
+ {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f}
+ },
+ {
+ {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f},
+ {-0.120618f, -0.519623f, -0.008479f, -0.000432f, +0.000270f},
+ {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f},
+ {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f},
+ {-0.012267f, -0.246756f, +0.001889f, +0.000730f, -0.000091f},
+ {-0.028297f, +0.020937f, +0.002730f, +0.000026f, -0.000039f},
+ {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f},
+ {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f},
+ {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f},
+ {+0.003781f, -0.030870f, +0.013170f, +0.002144f, +0.000211f},
+ {-0.016747f, -0.033277f, -0.000186f, +0.000012f, -0.000031f},
+ {+0.038322f, +0.079239f, +0.009485f, +0.001067f, +0.000129f},
+ {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f},
+ {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f},
+ {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f},
+ {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f}
+ },
+ {
+ {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f},
+ {+0.288048f, +0.119309f, +0.040772f, -0.004167f, -0.000126f},
+ {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f},
+ {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f},
+ {+0.111155f, -0.046512f, +0.012782f, -0.000892f, +0.000069f},
+ {+0.020452f, +0.099912f, +0.003632f, -0.000896f, +0.000036f},
+ {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f},
+ {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f},
+ {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f},
+ {+0.012250f, -0.014195f, -0.001656f, -0.003568f, -0.000272f},
+ {+0.029260f, +0.036443f, +0.002521f, -0.000109f, +0.000054f},
+ {-0.049141f, -0.042766f, -0.002001f, -0.002307f, -0.000147f},
+ {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f},
+ {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f},
+ {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f},
+ {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f}
+ },
+ {
+ {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f},
+ {-0.008278f, +0.564708f, -0.007533f, -0.000534f, -0.000224f},
+ {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f},
+ {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f},
+ {-0.047919f, +0.200610f, -0.011974f, -0.000485f, +0.000070f},
+ {+0.001747f, +0.136529f, -0.008548f, +0.000030f, +0.000031f},
+ {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f},
+ {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f},
+ {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f},
+ {-0.015670f, +0.020509f, -0.010455f, -0.001886f, -0.000130f},
+ {+0.001269f, +0.078191f, -0.000719f, +0.000060f, +0.000015f},
+ {+0.015954f, -0.139586f, -0.005155f, -0.000966f, -0.000087f},
+ {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f},
+ {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f},
+ {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f},
+ {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f}
+ },
+ {
+ {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f},
+ {-0.289123f, +0.124032f, -0.042209f, +0.003292f, +0.000173f},
+ {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f},
+ {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f},
+ {-0.088516f, +0.135597f, -0.008911f, +0.000941f, -0.000062f},
+ {-0.046542f, +0.074771f, +0.001267f, +0.000681f, -0.000024f},
+ {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f},
+ {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f},
+ {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f},
+ {+0.003750f, +0.043297f, +0.001696f, +0.002710f, +0.000254f},
+ {-0.036881f, +0.019154f, -0.003756f, +0.000164f, -0.000052f},
+ {+0.028484f, -0.127049f, +0.000373f, +0.001785f, +0.000137f},
+ {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f},
+ {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f},
+ {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f},
+ {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f}
+ },
+ {
+ {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f},
+ {+0.108773f, -0.480556f, +0.020213f, +0.000915f, +0.000164f},
+ {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f},
+ {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f},
+ {+0.094935f, -0.145981f, +0.017427f, +0.000284f, -0.000058f},
+ {+0.078691f, -0.105220f, +0.009040f, +0.000009f, -0.000031f},
+ {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f},
+ {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f},
+ {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f},
+ {+0.013497f, +0.033838f, +0.009244f, +0.001447f, +0.000073f},
+ {+0.020163f, -0.066780f, +0.002771f, -0.000069f, -0.000003f},
+ {-0.051113f, -0.013125f, +0.004746f, +0.000733f, +0.000056f},
+ {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f},
+ {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f},
+ {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f},
+ {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f}
+ },
+ {
+ {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f},
+ {+0.251619f, -0.250783f, +0.039635f, -0.002380f, -0.000192f},
+ {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f},
+ {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f},
+ {+0.039868f, -0.230386f, +0.002246f, -0.000818f, +0.000054f},
+ {-0.036223f, -0.280336f, -0.007555f, -0.000539f, +0.000017f},
+ {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f},
+ {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f},
+ {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f},
+ {-0.022768f, -0.016336f, -0.003117f, -0.002216f, -0.000227f},
+ {+0.031511f, -0.045619f, +0.004901f, -0.000227f, +0.000048f},
+ {+0.045006f, +0.127523f, +0.002107f, -0.001382f, -0.000124f},
+ {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f},
+ {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f},
+ {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f},
+ {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f}
+ },
+ {
+ {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f},
+ {-0.168437f, +0.394610f, -0.030765f, -0.000832f, -0.000106f},
+ {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f},
+ {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f},
+ {-0.117845f, +0.006812f, -0.017402f, -0.000161f, +0.000052f},
+ {-0.070459f, -0.240877f, -0.004084f, +0.000089f, +0.000035f},
+ {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f},
+ {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f},
+ {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f},
+ {+0.008901f, -0.071218f, -0.004889f, -0.001056f, -0.000035f},
+ {-0.035581f, +0.061262f, -0.007127f, +0.000111f, -0.000006f},
+ {-0.009360f, +0.207644f, -0.007254f, -0.000645f, -0.000037f},
+ {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f},
+ {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f},
+ {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f},
+ {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f}
+ },
+ {
+ {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f},
+ {-0.218466f, +0.313607f, -0.033711f, +0.001650f, +0.000187f},
+ {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f},
+ {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f},
+ {+0.033058f, +0.233100f, +0.003881f, +0.000583f, -0.000049f},
+ {+0.128077f, +0.046310f, +0.008240f, +0.000349f, -0.000015f},
+ {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f},
+ {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f},
+ {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f},
+ {+0.026309f, -0.052058f, +0.001607f, +0.001982f, +0.000202f},
+ {-0.029154f, +0.072410f, -0.002905f, +0.000210f, -0.000043f},
+ {-0.051381f, +0.149021f, +0.000115f, +0.001232f, +0.000111f},
+ {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f},
+ {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f},
+ {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f},
+ {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f}
+ },
+ {
+ {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f},
+ {+0.218935f, -0.356480f, +0.037109f, +0.000536f, +0.000063f},
+ {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f},
+ {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f},
+ {+0.082669f, +0.157628f, +0.013419f, +0.000257f, -0.000050f},
+ {-0.051102f, +0.310690f, -0.001856f, -0.000105f, -0.000038f},
+ {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f},
+ {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f},
+ {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f},
+ {-0.042856f, +0.056448f, +0.001929f, +0.000741f, +0.000011f},
+ {+0.068206f, -0.080584f, +0.011613f, -0.000093f, +0.000013f},
+ {+0.091336f, -0.056612f, +0.010772f, +0.000543f, +0.000024f},
+ {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f},
+ {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f},
+ {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f},
+ {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f}
+ },
+ {
+ {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f},
+ {+0.183833f, -0.406966f, +0.027778f, -0.001207f, -0.000171f},
+ {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f},
+ {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f},
+ {-0.076464f, -0.083380f, -0.010071f, -0.000597f, +0.000047f},
+ {-0.086834f, +0.252931f, -0.010256f, -0.000250f, +0.000016f},
+ {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f},
+ {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f},
+ {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f},
+ {+0.003641f, +0.131818f, +0.001737f, -0.001737f, -0.000181f},
+ {-0.001297f, -0.195950f, -0.005713f, -0.000204f, +0.000037f},
+ {-0.045795f, -0.259231f, -0.005407f, -0.001178f, -0.000100f},
+ {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f},
+ {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f},
+ {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f},
+ {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f}
+ },
+ {
+ {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f},
+ {-0.270044f, +0.288912f, -0.044466f, -0.000374f, -0.000037f},
+ {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f},
+ {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f},
+ {-0.013959f, -0.178267f, -0.007930f, -0.000231f, +0.000050f},
+ {+0.126652f, -0.073753f, +0.010940f, +0.000032f, +0.000041f},
+ {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f},
+ {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f},
+ {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f},
+ {+0.052463f, +0.055986f, -0.001868f, -0.000682f, +0.000008f},
+ {-0.099011f, -0.055743f, -0.009504f, +0.000033f, -0.000019f},
+ {-0.066616f, -0.234328f, -0.006904f, -0.000399f, -0.000016f},
+ {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f},
+ {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f},
+ {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f},
+ {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f}
+ },
+ {
+ {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f},
+ {-0.135714f, +0.493797f, -0.019817f, +0.001205f, +0.000155f},
+ {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f},
+ {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f},
+ {+0.058361f, -0.066933f, +0.007899f, +0.000705f, -0.000047f},
+ {-0.024939f, -0.304082f, -0.002238f, +0.000320f, -0.000018f},
+ {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f},
+ {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f},
+ {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f},
+ {-0.042244f, -0.087154f, -0.004003f, +0.001651f, +0.000165f},
+ {+0.087421f, +0.223827f, +0.009440f, +0.000302f, -0.000032f},
+ {+0.123261f, +0.040927f, +0.008130f, +0.001094f, +0.000093f},
+ {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f},
+ {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f},
+ {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f},
+ {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f}
+ },
+ {
+ {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f},
+ {+0.317778f, -0.199223f, +0.049734f, +0.000202f, +0.000022f},
+ {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f},
+ {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f},
+ {-0.027311f, +0.065956f, +0.001130f, -0.000048f, -0.000049f},
+ {-0.092570f, -0.201332f, -0.007025f, -0.000092f, -0.000044f},
+ {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f},
+ {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f},
+ {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f},
+ {-0.029291f, -0.096155f, -0.000322f, +0.000490f, -0.000025f},
+ {+0.042190f, +0.292546f, +0.004474f, -0.000130f, +0.000023f},
+ {-0.047310f, +0.289378f, +0.003082f, +0.000264f, +0.000009f},
+ {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f},
+ {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f},
+ {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f},
+ {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f}
+ },
+ {
+ {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f},
+ {+0.061876f, -0.590080f, +0.009764f, -0.001166f, -0.000147f},
+ {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f},
+ {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f},
+ {-0.015185f, +0.082124f, -0.005184f, -0.000502f, +0.000049f},
+ {+0.096327f, +0.079550f, +0.006514f, -0.000328f, +0.000021f},
+ {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f},
+ {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f},
+ {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f},
+ {+0.051580f, +0.036720f, +0.010126f, -0.001380f, -0.000151f},
+ {-0.125504f, +0.039269f, -0.013578f, -0.000208f, +0.000027f},
+ {-0.070511f, +0.247836f, -0.009393f, -0.000912f, -0.000087f},
+ {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f},
+ {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f},
+ {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f},
+ {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f}
+ },
+ {
+ {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f},
+ {-0.336614f, +0.016258f, -0.050302f, -0.000297f, -0.000011f},
+ {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f},
+ {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f},
+ {+0.028633f, +0.007390f, +0.002007f, +0.000039f, +0.000048f},
+ {-0.005134f, +0.220494f, +0.003892f, +0.000252f, +0.000046f},
+ {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f},
+ {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f},
+ {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f},
+ {+0.018235f, +0.085003f, -0.002078f, -0.000390f, +0.000041f},
+ {+0.049559f, -0.222425f, +0.001760f, +0.000043f, -0.000027f},
+ {+0.087658f, +0.008493f, +0.002149f, -0.000327f, -0.000002f},
+ {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f},
+ {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f},
+ {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f},
+ {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f}
+ },
+ {
+ {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f},
+ {+0.019214f, +0.554319f, -0.001599f, +0.001129f, +0.000145f},
+ {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f},
+ {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f},
+ {-0.013982f, -0.062149f, -0.000689f, +0.000526f, -0.000053f},
+ {-0.064167f, +0.122065f, -0.007764f, +0.000174f, -0.000027f},
+ {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f},
+ {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f},
+ {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f},
+ {-0.063324f, -0.045704f, -0.011079f, +0.001189f, +0.000135f},
+ {+0.081653f, -0.167815f, +0.010699f, +0.000264f, -0.000021f},
+ {-0.009546f, -0.130825f, +0.003286f, +0.000952f, +0.000083f},
+ {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f},
+ {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f},
+ {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f},
+ {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f}
+ },
+ {
+ {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f},
+ {+0.316269f, +0.095647f, +0.050717f, +0.000419f, -0.000004f},
+ {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f},
+ {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f},
+ {-0.019808f, -0.051257f, +0.001165f, -0.000156f, -0.000046f},
+ {+0.048333f, -0.050030f, +0.007461f, -0.000269f, -0.000047f},
+ {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f},
+ {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f},
+ {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f},
+ {-0.008225f, -0.128802f, +0.005400f, +0.000223f, -0.000054f},
+ {-0.088609f, +0.096391f, -0.012066f, -0.000087f, +0.000030f},
+ {-0.036267f, -0.078389f, -0.005104f, +0.000176f, -0.000004f},
+ {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f},
+ {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f},
+ {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f},
+ {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f}
+ },
+ {
+ {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f},
+ {-0.069696f, -0.497403f, -0.009705f, -0.000945f, -0.000144f},
+ {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f},
+ {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f},
+ {+0.038012f, +0.038810f, +0.004148f, -0.000514f, +0.000056f},
+ {+0.010993f, -0.104517f, +0.004208f, -0.000219f, +0.000033f},
+ {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f},
+ {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f},
+ {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f},
+ {+0.085604f, +0.017452f, +0.013308f, -0.001048f, -0.000118f},
+ {-0.029028f, +0.187952f, -0.005021f, -0.000216f, +0.000016f},
+ {+0.006564f, -0.006493f, +0.001419f, -0.000780f, -0.000079f},
+ {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f},
+ {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f},
+ {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f},
+ {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f}
+ },
+ {
+ {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f},
+ {-0.297764f, -0.151816f, -0.046261f, -0.000499f, +0.000022f},
+ {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f},
+ {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f},
+ {+0.000542f, +0.094714f, -0.004019f, +0.000229f, +0.000043f},
+ {-0.041461f, -0.019853f, -0.008957f, +0.000418f, +0.000046f},
+ {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f},
+ {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f},
+ {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f},
+ {-0.021657f, +0.180451f, -0.009924f, -0.000053f, +0.000065f},
+ {+0.095197f, -0.006584f, +0.013724f, +0.000061f, -0.000032f},
+ {+0.011099f, -0.015338f, +0.000599f, -0.000168f, +0.000011f},
+ {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f},
+ {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f},
+ {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f},
+ {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f}
+ },
+ {
+ {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f},
+ {+0.111390f, +0.472799f, +0.015450f, +0.000704f, +0.000139f},
+ {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f},
+ {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f},
+ {-0.055650f, +0.007065f, -0.007223f, +0.000546f, -0.000060f},
+ {+0.018845f, +0.077039f, +0.001923f, +0.000256f, -0.000039f},
+ {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f},
+ {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f},
+ {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f},
+ {-0.098237f, +0.061993f, -0.014872f, +0.000974f, +0.000101f},
+ {-0.016600f, -0.180900f, -0.001935f, +0.000217f, -0.000011f},
+ {+0.024890f, +0.001895f, +0.000719f, +0.000667f, +0.000075f},
+ {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f},
+ {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f},
+ {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f},
+ {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f}
+ },
+ {
+ {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f},
+ {+0.279427f, +0.216928f, +0.044464f, +0.000461f, -0.000042f},
+ {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f},
+ {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f},
+ {+0.032929f, -0.127864f, +0.007891f, -0.000307f, -0.000041f},
+ {+0.023458f, +0.073855f, +0.003516f, -0.000521f, -0.000044f},
+ {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f},
+ {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f},
+ {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f},
+ {+0.068563f, -0.191058f, +0.014677f, -0.000094f, -0.000073f},
+ {-0.083271f, -0.077777f, -0.010978f, -0.000035f, +0.000035f},
+ {-0.032739f, +0.090968f, -0.003108f, +0.000130f, -0.000018f},
+ {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f},
+ {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f},
+ {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f},
+ {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f}
+ },
+ {
+ {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f},
+ {-0.149133f, -0.438088f, -0.020811f, -0.000535f, -0.000129f},
+ {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f},
+ {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f},
+ {+0.051157f, -0.099533f, +0.006353f, -0.000530f, +0.000063f},
+ {-0.036114f, -0.015276f, -0.002183f, -0.000257f, +0.000042f},
+ {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f},
+ {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f},
+ {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f},
+ {+0.082213f, -0.168162f, +0.013202f, -0.000891f, -0.000086f},
+ {+0.053436f, +0.133406f, +0.007060f, -0.000274f, +0.000004f},
+ {-0.031202f, +0.097339f, -0.000600f, -0.000565f, -0.000069f},
+ {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f},
+ {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f},
+ {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f},
+ {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f}
+ },
+ {
+ {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f},
+ {-0.259444f, -0.270037f, -0.041639f, -0.000297f, +0.000058f},
+ {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f},
+ {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f},
+ {-0.061013f, +0.068025f, -0.009284f, +0.000332f, +0.000040f},
+ {+0.005481f, -0.077635f, -0.001849f, +0.000481f, +0.000044f},
+ {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f},
+ {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f},
+ {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f},
+ {-0.107969f, +0.120398f, -0.018769f, +0.000181f, +0.000082f},
+ {+0.056786f, +0.126822f, +0.007959f, +0.000033f, -0.000039f},
+ {+0.069219f, -0.054400f, +0.005730f, -0.000053f, +0.000023f},
+ {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f},
+ {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f},
+ {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f},
+ {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f}
+ },
+ {
+ {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f},
+ {+0.182587f, +0.405974f, +0.025901f, +0.000462f, +0.000117f},
+ {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f},
+ {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f},
+ {-0.030324f, +0.107424f, -0.007446f, +0.000469f, -0.000068f},
+ {+0.029083f, -0.038828f, +0.003047f, +0.000232f, -0.000046f},
+ {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f},
+ {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f},
+ {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f},
+ {-0.044510f, +0.213643f, -0.009811f, +0.000749f, +0.000069f},
+ {-0.075343f, -0.079800f, -0.011596f, +0.000341f, +0.000004f},
+ {-0.002994f, -0.163592f, -0.001034f, +0.000473f, +0.000063f},
+ {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f},
+ {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f},
+ {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f},
+ {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f}
+ },
+ {
+ {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f},
+ {+0.241813f, +0.315693f, +0.038994f, +0.000147f, -0.000070f},
+ {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f},
+ {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f},
+ {+0.066143f, -0.046203f, +0.014148f, -0.000357f, -0.000040f},
+ {-0.022432f, +0.042335f, -0.001522f, -0.000437f, -0.000048f},
+ {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f},
+ {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f},
+ {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f},
+ {+0.123458f, -0.044963f, +0.022305f, -0.000260f, -0.000091f},
+ {-0.027259f, -0.155333f, -0.002873f, -0.000021f, +0.000041f},
+ {-0.074325f, -0.052152f, -0.007210f, -0.000007f, -0.000026f},
+ {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f},
+ {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f},
+ {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f},
+ {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f}
+ },
+ {
+ {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f},
+ {-0.219215f, -0.390772f, -0.031915f, -0.000487f, -0.000107f},
+ {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f},
+ {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f},
+ {+0.028737f, -0.105483f, +0.003866f, -0.000348f, +0.000076f},
+ {-0.013337f, +0.055289f, -0.001002f, -0.000053f, +0.000054f},
+ {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f},
+ {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f},
+ {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f},
+ {+0.008972f, -0.221115f, +0.003663f, -0.000531f, -0.000048f},
+ {+0.090641f, +0.028424f, +0.013918f, -0.000378f, -0.000016f},
+ {+0.038654f, +0.120101f, +0.004990f, -0.000461f, -0.000057f},
+ {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f},
+ {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f},
+ {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f},
+ {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f}
+ },
+ {
+ {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f},
+ {-0.222170f, -0.388402f, -0.034955f, -0.000099f, +0.000080f},
+ {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f},
+ {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f},
+ {-0.088774f, +0.075575f, -0.016123f, +0.000436f, +0.000040f},
+ {+0.024745f, -0.004479f, +0.001974f, +0.000454f, +0.000055f},
+ {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f},
+ {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f},
+ {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f},
+ {-0.128422f, -0.011753f, -0.022348f, +0.000409f, +0.000098f},
+ {-0.011288f, +0.189192f, -0.003841f, -0.000041f, -0.000039f},
+ {+0.054725f, +0.090752f, +0.006454f, +0.000058f, +0.000028f},
+ {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f},
+ {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f},
+ {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f},
+ {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f}
+ },
+ {
+ {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f},
+ {+0.264405f, +0.355877f, +0.037791f, +0.000515f, +0.000101f},
+ {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f},
+ {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f},
+ {-0.015137f, +0.192002f, +0.000035f, +0.000213f, -0.000092f},
+ {+0.000786f, -0.038825f, +0.000032f, -0.000190f, -0.000073f},
+ {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f},
+ {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f},
+ {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f},
+ {+0.025506f, +0.225558f, +0.001578f, +0.000313f, +0.000019f},
+ {-0.093865f, +0.065189f, -0.011642f, +0.000361f, +0.000030f},
+ {-0.055369f, -0.081537f, -0.009138f, +0.000492f, +0.000055f},
+ {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f},
+ {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f},
+ {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f},
+ {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f}
+ },
+ {
+ {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f},
+ {+0.186613f, +0.476552f, +0.029757f, +0.000163f, -0.000095f},
+ {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f},
+ {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f},
+ {+0.119879f, -0.010231f, +0.016974f, -0.000596f, -0.000034f},
+ {-0.016380f, -0.009027f, -0.002417f, -0.000683f, -0.000057f},
+ {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f},
+ {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f},
+ {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f},
+ {+0.124653f, +0.076460f, +0.020814f, -0.000683f, -0.000097f},
+ {+0.063103f, -0.174209f, +0.008521f, +0.000147f, +0.000032f},
+ {-0.034711f, -0.112933f, -0.002461f, -0.000059f, -0.000029f},
+ {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f},
+ {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f},
+ {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f},
+ {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f}
+ },
+ {
+ {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f},
+ {-0.306311f, -0.277325f, -0.043227f, -0.000433f, -0.000096f},
+ {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f},
+ {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f},
+ {-0.029899f, -0.236698f, -0.003149f, -0.000187f, +0.000112f},
+ {-0.002353f, +0.011865f, +0.000725f, +0.000346f, +0.000104f},
+ {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f},
+ {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f},
+ {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f},
+ {-0.058868f, -0.204995f, -0.005519f, -0.000216f, +0.000017f},
+ {+0.060797f, -0.176638f, +0.008488f, -0.000290f, -0.000044f},
+ {+0.066026f, +0.042360f, +0.010165f, -0.000503f, -0.000055f},
+ {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f},
+ {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f},
+ {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f},
+ {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f}
+ },
+ {
+ {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f},
+ {-0.134482f, -0.541069f, -0.022864f, -0.000250f, +0.000117f},
+ {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f},
+ {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f},
+ {-0.121827f, -0.094517f, -0.018717f, +0.000823f, +0.000016f},
+ {+0.013897f, -0.016128f, +0.002834f, +0.001121f, +0.000043f},
+ {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f},
+ {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f},
+ {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f},
+ {-0.110624f, -0.126988f, -0.019030f, +0.001012f, +0.000081f},
+ {-0.093230f, +0.059767f, -0.012720f, -0.000213f, -0.000018f},
+ {+0.010158f, +0.127393f, -0.000864f, -0.000011f, +0.000034f},
+ {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f},
+ {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f},
+ {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f},
+ {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f}
+ },
+ {
+ {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f},
+ {+0.333286f, +0.175696f, +0.047590f, +0.000222f, +0.000083f},
+ {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f},
+ {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f},
+ {+0.075028f, +0.208672f, +0.010268f, +0.000343f, -0.000132f},
+ {+0.011727f, -0.019516f, -0.000540f, -0.000212f, -0.000139f},
+ {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f},
+ {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f},
+ {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f},
+ {+0.086060f, +0.177107f, +0.010290f, +0.000364f, -0.000050f},
+ {-0.010787f, +0.184727f, -0.002953f, +0.000174f, +0.000054f},
+ {-0.067502f, +0.008050f, -0.010245f, +0.000436f, +0.000057f},
+ {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f},
+ {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f},
+ {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f},
+ {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f}
+ },
+ {
+ {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f},
+ {+0.075896f, +0.571385f, +0.014672f, +0.000160f, -0.000148f},
+ {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f},
+ {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f},
+ {+0.101027f, +0.169945f, +0.015494f, -0.000962f, +0.000016f},
+ {-0.029442f, +0.045651f, -0.004343f, -0.001546f, -0.000004f},
+ {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f},
+ {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f},
+ {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f},
+ {+0.090764f, +0.173219f, +0.015307f, -0.001207f, -0.000044f},
+ {+0.090276f, +0.027741f, +0.013865f, +0.000091f, -0.000003f},
+ {+0.018263f, -0.122358f, +0.003953f, +0.000094f, -0.000045f},
+ {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f},
+ {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f},
+ {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f},
+ {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f}
+ },
+ {
+ {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f},
+ {-0.344718f, -0.073613f, -0.049496f, +0.000072f, -0.000056f},
+ {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f},
+ {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f},
+ {-0.106866f, -0.149507f, -0.014360f, -0.000666f, +0.000140f},
+ {-0.005446f, +0.082692f, +0.002403f, -0.000314f, +0.000163f},
+ {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f},
+ {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f},
+ {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f},
+ {-0.107661f, -0.132716f, -0.012982f, -0.000706f, +0.000070f},
+ {-0.028176f, -0.155327f, -0.002943f, -0.000018f, -0.000055f},
+ {+0.051419f, -0.071483f, +0.007973f, -0.000234f, -0.000055f},
+ {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f},
+ {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f},
+ {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f},
+ {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f}
+ },
+ {
+ {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f},
+ {-0.018640f, -0.575973f, -0.005892f, +0.000203f, +0.000177f},
+ {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f},
+ {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f},
+ {-0.068852f, -0.208415f, -0.010824f, +0.000748f, -0.000061f},
+ {+0.046351f, +0.003708f, +0.005559f, +0.001546f, -0.000058f},
+ {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f},
+ {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f},
+ {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f},
+ {-0.065074f, -0.200619f, -0.010710f, +0.000928f, -0.000007f},
+ {-0.072568f, -0.087920f, -0.011704f, +0.000262f, +0.000027f},
+ {-0.035957f, +0.060576f, -0.005664f, -0.000112f, +0.000061f},
+ {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f},
+ {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f},
+ {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f},
+ {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f}
+ },
+ {
+ {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f},
+ {+0.346449f, -0.017003f, +0.049621f, -0.000139f, +0.000009f},
+ {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f},
+ {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f},
+ {+0.121162f, +0.084738f, +0.017259f, +0.000808f, -0.000129f},
+ {-0.021528f, -0.096693f, -0.003962f, +0.000943f, -0.000157f},
+ {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f},
+ {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f},
+ {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f},
+ {+0.119856f, +0.085575f, +0.015319f, +0.000749f, -0.000064f},
+ {+0.056191f, +0.109851f, +0.006441f, +0.000263f, +0.000045f},
+ {-0.024446f, +0.076942f, -0.005466f, -0.000057f, +0.000045f},
+ {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f},
+ {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f},
+ {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f},
+ {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f}
+ },
+ {
+ {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f},
+ {-0.037995f, +0.575156f, -0.001530f, -0.000956f, -0.000194f},
+ {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f},
+ {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f},
+ {+0.037852f, +0.213873f, +0.003692f, +0.000614f, +0.000107f},
+ {-0.039839f, -0.066118f, -0.007988f, -0.000076f, +0.000128f},
+ {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f},
+ {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f},
+ {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f},
+ {+0.039217f, +0.211900f, +0.002725f, +0.000921f, +0.000061f},
+ {+0.045306f, +0.127706f, +0.011256f, -0.001493f, -0.000048f},
+ {+0.032008f, -0.009436f, +0.005842f, -0.000094f, -0.000078f},
+ {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f},
+ {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f},
+ {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f},
+ {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f}
+ },
+ {
+ {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f},
+ {-0.340746f, +0.112091f, -0.048231f, -0.000694f, +0.000055f},
+ {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f},
+ {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f},
+ {-0.123071f, -0.035557f, -0.020641f, -0.000216f, +0.000092f},
+ {+0.043825f, +0.058128f, +0.002805f, -0.001548f, +0.000111f},
+ {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f},
+ {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f},
+ {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f},
+ {-0.123609f, -0.042304f, -0.020375f, +0.000225f, +0.000027f},
+ {-0.072663f, -0.052460f, -0.006157f, -0.001671f, -0.000023f},
+ {+0.007106f, -0.047603f, +0.003493f, +0.000487f, -0.000023f},
+ {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f},
+ {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f},
+ {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f},
+ {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f}
+ }
+};
+
+#endif
+
+#ifdef UPDATE_SBA_FILTER
+
+const float FASTCONV_HOA2_latency_s = 0.000666667f;
+const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]=
+{
+ {
+ {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f},
+ {-0.013208f, +0.379140f, -0.322559f, -0.004978f, -0.000009f},
+ {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f},
+ {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f},
+ {+0.003471f, +0.011471f, +0.002826f, +0.001074f, -0.000026f},
+ {+0.003706f, -0.001098f, -0.005680f, +0.008863f, +0.000084f},
+ {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f},
+ {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f},
+ {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f}
+ },
+ {
+ {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f},
+ {+0.031621f, +0.813566f, +0.056755f, +0.007166f, +0.000006f},
+ {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f},
+ {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f},
+ {-0.007142f, -0.001751f, -0.001329f, -0.002743f, +0.000028f},
+ {-0.006527f, -0.051957f, -0.070578f, -0.014200f, -0.000113f},
+ {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f},
+ {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f},
+ {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f}
+ },
+ {
+ {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f},
+ {-0.026960f, +0.962971f, +0.087407f, +0.001953f, +0.000014f},
+ {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f},
+ {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f},
+ {+0.009864f, -0.005169f, -0.019159f, +0.003128f, +0.000025f},
+ {+0.004987f, -0.054770f, -0.099413f, +0.003316f, -0.000044f},
+ {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f},
+ {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f},
+ {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f}
+ },
+ {
+ {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f},
+ {-0.025122f, +0.922813f, +0.028063f, -0.008613f, -0.000006f},
+ {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f},
+ {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f},
+ {-0.024810f, +0.014152f, +0.030508f, -0.002185f, -0.000029f},
+ {-0.011648f, +0.040215f, +0.008697f, +0.003893f, +0.000125f},
+ {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f},
+ {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f},
+ {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f}
+ },
+ {
+ {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f},
+ {+0.143821f, +0.682007f, -0.029450f, +0.003481f, -0.000019f},
+ {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f},
+ {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f},
+ {+0.052905f, -0.051459f, -0.001250f, +0.000868f, -0.000023f},
+ {+0.029241f, +0.030800f, +0.000944f, -0.000488f, -0.000000f},
+ {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f},
+ {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f},
+ {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f}
+ },
+ {
+ {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f},
+ {-0.262828f, +0.127251f, -0.020151f, +0.004341f, +0.000009f},
+ {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f},
+ {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f},
+ {-0.064139f, -0.206373f, +0.000508f, -0.000138f, +0.000031f},
+ {-0.035857f, -0.035091f, +0.016850f, -0.002300f, -0.000120f},
+ {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f},
+ {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f},
+ {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f}
+ },
+ {
+ {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f},
+ {+0.217141f, -0.537828f, +0.015478f, -0.003353f, +0.000022f},
+ {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f},
+ {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f},
+ {+0.019714f, -0.330742f, +0.003692f, -0.000002f, +0.000022f},
+ {+0.010625f, -0.080582f, -0.010145f, +0.000258f, +0.000041f},
+ {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f},
+ {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f},
+ {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f}
+ },
+ {
+ {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f},
+ {+0.054243f, -0.757012f, +0.020850f, -0.002283f, -0.000013f},
+ {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f},
+ {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f},
+ {+0.071769f, -0.265803f, -0.002595f, +0.000097f, -0.000034f},
+ {+0.026489f, -0.035458f, +0.005585f, +0.001110f, +0.000100f},
+ {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f},
+ {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f},
+ {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f}
+ },
+ {
+ {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f},
+ {-0.307522f, -0.201411f, -0.041908f, +0.002386f, -0.000023f},
+ {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f},
+ {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f},
+ {-0.130667f, +0.017905f, -0.002862f, -0.000224f, -0.000021f},
+ {-0.026816f, +0.061563f, -0.002730f, -0.000500f, -0.000070f},
+ {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f},
+ {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f},
+ {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f}
+ },
+ {
+ {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f},
+ {+0.208158f, +0.589613f, +0.015424f, +0.001691f, +0.000018f},
+ {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f},
+ {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f},
+ {+0.077086f, +0.303705f, -0.003329f, +0.000036f, +0.000037f},
+ {-0.020310f, +0.080808f, +0.007043f, -0.000054f, -0.000070f},
+ {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f},
+ {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f},
+ {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f}
+ },
+ {
+ {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f},
+ {+0.174454f, +0.640794f, +0.027817f, -0.001980f, +0.000023f},
+ {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f},
+ {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f},
+ {+0.056596f, +0.310132f, +0.010567f, +0.000223f, +0.000018f},
+ {+0.057823f, -0.028077f, +0.000893f, +0.000451f, +0.000085f},
+ {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f},
+ {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f},
+ {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f}
+ },
+ {
+ {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f},
+ {-0.339082f, -0.153701f, -0.034923f, -0.001267f, -0.000022f},
+ {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f},
+ {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f},
+ {-0.127275f, +0.020840f, -0.015322f, +0.000034f, -0.000041f},
+ {-0.027665f, -0.152414f, -0.006975f, -0.000222f, +0.000038f},
+ {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f},
+ {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f},
+ {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f}
+ },
+ {
+ {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f},
+ {+0.026755f, -0.715695f, -0.002721f, +0.001713f, -0.000021f},
+ {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f},
+ {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f},
+ {+0.046673f, -0.240709f, +0.003039f, -0.000354f, -0.000014f},
+ {-0.046604f, -0.126235f, -0.001254f, -0.000637f, -0.000087f},
+ {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f},
+ {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f},
+ {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f}
+ },
+ {
+ {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f},
+ {+0.329416f, -0.240852f, +0.037687f, +0.000972f, +0.000025f},
+ {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f},
+ {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f},
+ {+0.085616f, -0.171409f, +0.015038f, -0.000016f, +0.000044f},
+ {+0.080584f, +0.060419f, +0.009795f, +0.000260f, -0.000011f},
+ {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f},
+ {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f},
+ {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f}
+ },
+ {
+ {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f},
+ {-0.191369f, +0.563524f, -0.020930f, -0.001563f, +0.000018f},
+ {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f},
+ {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f},
+ {-0.094869f, +0.113180f, -0.014106f, +0.000387f, +0.000009f},
+ {-0.032009f, +0.229593f, -0.004382f, +0.000814f, +0.000078f},
+ {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f},
+ {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f},
+ {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f}
+ },
+ {
+ {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f},
+ {-0.237324f, +0.482374f, -0.029199f, -0.000704f, -0.000027f},
+ {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f},
+ {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f},
+ {-0.029761f, +0.216925f, -0.003727f, +0.000037f, -0.000045f},
+ {-0.050908f, +0.208738f, -0.003838f, -0.000287f, -0.000007f},
+ {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f},
+ {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f},
+ {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f}
+ },
+ {
+ {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f},
+ {+0.281553f, -0.324420f, +0.036967f, +0.001412f, -0.000017f},
+ {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f},
+ {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f},
+ {+0.112292f, -0.000623f, +0.014750f, -0.000389f, -0.000004f},
+ {+0.090463f, +0.007129f, +0.003581f, -0.000747f, -0.000067f},
+ {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f},
+ {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f},
+ {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f}
+ },
+ {
+ {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f},
+ {+0.129889f, -0.550582f, +0.015713f, +0.000496f, +0.000029f},
+ {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f},
+ {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f},
+ {-0.037999f, -0.233960f, -0.005179f, -0.000063f, +0.000045f},
+ {-0.058157f, -0.208550f, -0.000279f, +0.000232f, +0.000018f},
+ {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f},
+ {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f},
+ {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f}
+ },
+ {
+ {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f},
+ {-0.316645f, +0.147998f, -0.045958f, -0.001265f, +0.000015f},
+ {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f},
+ {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f},
+ {-0.085408f, -0.166595f, -0.008605f, +0.000440f, +0.000000f},
+ {-0.015618f, -0.269874f, -0.001215f, +0.000625f, +0.000057f},
+ {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f},
+ {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f},
+ {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f}
+ },
+ {
+ {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f},
+ {-0.040209f, +0.573378f, -0.000615f, -0.000315f, -0.000031f},
+ {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f},
+ {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f},
+ {+0.092144f, +0.099172f, +0.007312f, -0.000077f, -0.000045f},
+ {+0.077363f, -0.132678f, +0.001733f, -0.000235f, -0.000023f},
+ {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f},
+ {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f},
+ {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f}
+ },
+ {
+ {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f},
+ {+0.338234f, -0.015114f, +0.048846f, +0.001053f, -0.000013f},
+ {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f},
+ {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f},
+ {+0.008393f, +0.222503f, +0.002681f, -0.000354f, +0.000003f},
+ {-0.081171f, +0.098496f, -0.004558f, -0.000585f, -0.000051f},
+ {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f},
+ {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f},
+ {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f}
+ },
+ {
+ {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f},
+ {-0.052902f, -0.616966f, -0.013055f, +0.000306f, +0.000032f},
+ {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f},
+ {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f},
+ {-0.073970f, +0.094701f, -0.008512f, +0.000228f, +0.000046f},
+ {+0.017462f, +0.238223f, +0.000790f, +0.000485f, +0.000029f},
+ {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f},
+ {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f},
+ {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f}
+ },
+ {
+ {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f},
+ {-0.344919f, -0.163301f, -0.048934f, -0.001021f, +0.000012f},
+ {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f},
+ {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f},
+ {+0.044437f, -0.083315f, +0.002185f, +0.000075f, -0.000005f},
+ {+0.063695f, +0.165969f, +0.005598f, +0.000350f, +0.000048f},
+ {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f},
+ {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f},
+ {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f}
+ },
+ {
+ {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f},
+ {+0.163645f, +0.620258f, +0.029442f, -0.000199f, -0.000034f},
+ {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f},
+ {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f},
+ {+0.011132f, -0.127973f, +0.004627f, +0.000028f, -0.000047f},
+ {-0.084325f, -0.052788f, -0.007351f, -0.000453f, -0.000037f},
+ {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f},
+ {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f},
+ {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f}
+ },
+ {
+ {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f},
+ {+0.309161f, +0.398764f, +0.040718f, +0.000943f, -0.000011f},
+ {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f},
+ {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f},
+ {-0.032063f, -0.056196f, -0.004324f, -0.000244f, +0.000009f},
+ {+0.022806f, -0.208884f, -0.000856f, -0.000371f, -0.000043f},
+ {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f},
+ {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f},
+ {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f}
+ },
+ {
+ {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f},
+ {-0.270280f, -0.483591f, -0.039528f, +0.000153f, +0.000036f},
+ {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f},
+ {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f},
+ {+0.026438f, +0.035500f, +0.002626f, -0.000034f, +0.000050f},
+ {+0.052495f, -0.162509f, +0.005782f, +0.000307f, +0.000047f},
+ {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f},
+ {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f},
+ {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f}
+ },
+ {
+ {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f},
+ {-0.216188f, -0.557670f, -0.033272f, -0.000921f, +0.000010f},
+ {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f},
+ {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f},
+ {-0.004155f, +0.082194f, -0.000724f, +0.000315f, -0.000015f},
+ {-0.061885f, +0.007918f, -0.004267f, +0.000661f, +0.000034f},
+ {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f},
+ {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f},
+ {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f}
+ },
+ {
+ {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f},
+ {+0.316113f, +0.262138f, +0.049307f, -0.000066f, -0.000038f},
+ {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f},
+ {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f},
+ {-0.033061f, +0.037487f, -0.003086f, +0.000057f, -0.000051f},
+ {+0.009161f, +0.111428f, -0.002750f, -0.000407f, -0.000055f},
+ {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f},
+ {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f},
+ {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f}
+ },
+ {
+ {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f},
+ {+0.128892f, +0.546911f, +0.020182f, +0.000837f, -0.000009f},
+ {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f},
+ {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f},
+ {+0.039700f, -0.075487f, +0.006824f, -0.000303f, +0.000022f},
+ {+0.033671f, +0.064807f, +0.008036f, -0.000540f, -0.000022f},
+ {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f},
+ {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f},
+ {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f}
+ },
+ {
+ {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f},
+ {-0.327815f, -0.157084f, -0.053522f, +0.000024f, +0.000042f},
+ {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f},
+ {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f},
+ {+0.018657f, -0.107686f, +0.002873f, -0.000136f, +0.000051f},
+ {-0.022629f, -0.029525f, -0.002254f, +0.000156f, +0.000058f},
+ {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f},
+ {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f},
+ {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f}
+ },
+ {
+ {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f},
+ {-0.063671f, -0.564794f, -0.009104f, -0.000762f, +0.000008f},
+ {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f},
+ {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f},
+ {-0.067397f, +0.027841f, -0.010395f, +0.000286f, -0.000029f},
+ {-0.014235f, -0.044128f, -0.001136f, +0.000560f, +0.000010f},
+ {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f},
+ {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f},
+ {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f}
+ },
+ {
+ {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f},
+ {+0.337900f, +0.049301f, +0.053004f, +0.000032f, -0.000046f},
+ {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f},
+ {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f},
+ {+0.012544f, +0.153200f, +0.002399f, +0.000157f, -0.000049f},
+ {+0.026935f, +0.020769f, +0.002517f, -0.000142f, -0.000057f},
+ {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f},
+ {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f},
+ {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f}
+ },
+ {
+ {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f},
+ {-0.002761f, +0.570850f, +0.000438f, +0.000698f, -0.000005f},
+ {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f},
+ {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f},
+ {+0.079593f, +0.051699f, +0.009265f, -0.000243f, +0.000035f},
+ {-0.004491f, +0.069814f, -0.001757f, -0.000412f, -0.000001f},
+ {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f},
+ {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f},
+ {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f}
+ },
+ {
+ {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f},
+ {-0.335616f, +0.061120f, -0.052587f, -0.000136f, +0.000050f},
+ {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f},
+ {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f},
+ {-0.055697f, -0.153136f, -0.006127f, -0.000099f, +0.000047f},
+ {-0.022758f, +0.040841f, -0.001974f, +0.000245f, +0.000056f},
+ {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f},
+ {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f},
+ {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f}
+ },
+ {
+ {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f},
+ {+0.064276f, -0.551492f, +0.008554f, -0.000611f, +0.000002f},
+ {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f},
+ {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f},
+ {-0.061405f, -0.140795f, -0.008634f, +0.000186f, -0.000040f},
+ {+0.022602f, -0.028596f, +0.003958f, +0.000252f, -0.000003f},
+ {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f},
+ {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f},
+ {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f}
+ },
+ {
+ {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f},
+ {+0.325666f, -0.150573f, +0.051593f, +0.000209f, -0.000054f},
+ {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f},
+ {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f},
+ {+0.080571f, +0.077938f, +0.010648f, +0.000040f, -0.000047f},
+ {+0.004481f, -0.054774f, +0.000402f, -0.000382f, -0.000060f},
+ {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f},
+ {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f},
+ {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f}
+ },
+ {
+ {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f},
+ {-0.121553f, +0.536831f, -0.017942f, +0.000578f, +0.000001f},
+ {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f},
+ {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f},
+ {+0.037110f, +0.141320f, +0.006102f, -0.000195f, +0.000048f},
+ {-0.024782f, -0.009783f, -0.004483f, -0.000288f, +0.000009f},
+ {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f},
+ {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f},
+ {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f}
+ },
+ {
+ {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f},
+ {-0.313748f, +0.244268f, -0.048706f, -0.000275f, +0.000058f},
+ {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f},
+ {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f},
+ {-0.090126f, -0.058592f, -0.014503f, -0.000035f, +0.000049f},
+ {+0.010917f, +0.042825f, +0.001085f, +0.000524f, +0.000070f},
+ {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f},
+ {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f},
+ {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f}
+ },
+ {
+ {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f},
+ {+0.186187f, -0.523327f, +0.027065f, -0.000548f, -0.000002f},
+ {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f},
+ {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f},
+ {-0.023241f, -0.163547f, -0.001737f, +0.000268f, -0.000061f},
+ {+0.017633f, +0.031273f, +0.004558f, +0.000453f, -0.000024f},
+ {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f},
+ {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f},
+ {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f}
+ },
+ {
+ {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f},
+ {+0.287194f, -0.371793f, +0.043606f, +0.000298f, -0.000065f},
+ {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f},
+ {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f},
+ {+0.110078f, +0.041091f, +0.015691f, +0.000117f, -0.000048f},
+ {-0.016824f, -0.020994f, -0.002433f, -0.000470f, -0.000080f},
+ {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f},
+ {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f},
+ {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f}
+ },
+ {
+ {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f},
+ {-0.254019f, +0.457019f, -0.035395f, +0.000472f, +0.000004f},
+ {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f},
+ {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f},
+ {-0.006588f, +0.220018f, -0.002089f, -0.000280f, +0.000081f},
+ {-0.012847f, -0.026665f, -0.004159f, -0.000613f, +0.000053f},
+ {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f},
+ {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f},
+ {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f}
+ },
+ {
+ {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f},
+ {-0.234856f, +0.487730f, -0.036693f, -0.000275f, +0.000076f},
+ {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f},
+ {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f},
+ {-0.120851f, +0.044023f, -0.017124f, -0.000326f, +0.000038f},
+ {+0.019744f, +0.023127f, +0.003003f, +0.000144f, +0.000080f},
+ {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f},
+ {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f},
+ {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f}
+ },
+ {
+ {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f},
+ {+0.305263f, -0.341002f, +0.042929f, -0.000320f, -0.000009f},
+ {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f},
+ {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f},
+ {+0.047909f, -0.214878f, +0.007490f, +0.000138f, -0.000104f},
+ {+0.013632f, +0.032324f, +0.004221f, +0.000548f, -0.000093f},
+ {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f},
+ {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f},
+ {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f}
+ },
+ {
+ {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f},
+ {+0.168461f, -0.553033f, +0.027068f, +0.000281f, -0.000094f},
+ {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f},
+ {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f},
+ {+0.110234f, -0.118824f, +0.015813f, +0.000528f, -0.000014f},
+ {-0.029948f, -0.036351f, -0.005263f, +0.000282f, -0.000056f},
+ {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f},
+ {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f},
+ {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f}
+ },
+ {
+ {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f},
+ {-0.335277f, +0.219226f, -0.046865f, +0.000105f, +0.000022f},
+ {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f},
+ {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f},
+ {-0.083868f, +0.178051f, -0.011964f, +0.000280f, +0.000122f},
+ {-0.010723f, -0.070555f, -0.001815f, +0.000022f, +0.000132f},
+ {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f},
+ {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f},
+ {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f}
+ },
+ {
+ {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f},
+ {-0.099306f, +0.582261f, -0.017486f, -0.000468f, +0.000116f},
+ {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f},
+ {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f},
+ {-0.082995f, +0.177822f, -0.013237f, -0.000567f, -0.000026f},
+ {+0.049222f, +0.017872f, +0.004795f, -0.000539f, +0.000005f},
+ {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f},
+ {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f},
+ {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f}
+ },
+ {
+ {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f},
+ {+0.347527f, -0.104803f, +0.049661f, +0.000162f, -0.000050f},
+ {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f},
+ {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f},
+ {+0.103480f, -0.108513f, +0.015479f, -0.000834f, -0.000124f},
+ {-0.013480f, +0.114650f, +0.000763f, -0.001025f, -0.000149f},
+ {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f},
+ {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f},
+ {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f}
+ },
+ {
+ {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f},
+ {+0.033731f, -0.589122f, +0.007210f, +0.000795f, -0.000134f},
+ {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f},
+ {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f},
+ {+0.052364f, -0.186418f, +0.009164f, +0.000026f, +0.000073f},
+ {-0.052053f, +0.056265f, -0.005015f, -0.000066f, +0.000065f},
+ {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f},
+ {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f},
+ {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f}
+ },
+ {
+ {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f},
+ {-0.349598f, -0.000051f, -0.050374f, -0.000038f, +0.000095f},
+ {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f},
+ {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f},
+ {-0.107473f, +0.058841f, -0.017699f, +0.001256f, +0.000101f},
+ {+0.043140f, -0.091871f, +0.000478f, +0.002412f, +0.000129f},
+ {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f},
+ {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f},
+ {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f}
+ },
+ {
+ {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f},
+ {+0.031629f, +0.587979f, +0.001886f, -0.001424f, +0.000137f},
+ {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f},
+ {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f},
+ {-0.029482f, +0.180110f, -0.004281f, +0.002087f, -0.000115f},
+ {+0.033134f, -0.107741f, +0.001943f, +0.002753f, -0.000132f},
+ {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f},
+ {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f},
+ {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f}
+ }
+};
+
+const float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]=
+{
+ {
+ {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f},
+ {-0.081675f, +0.202936f, -0.124120f, -0.000184f, +0.000007f},
+ {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f},
+ {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f},
+ {-0.006316f, +0.012132f, -0.006515f, +0.002119f, +0.000027f},
+ {+0.000794f, -0.004296f, -0.005127f, +0.004942f, -0.000100f},
+ {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f},
+ {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f},
+ {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f}
+ },
+ {
+ {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f},
+ {+0.078219f, +0.186706f, -0.335495f, +0.010505f, +0.000011f},
+ {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f},
+ {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f},
+ {+0.007422f, +0.043414f, -0.006982f, -0.001963f, +0.000025f},
+ {+0.003254f, +0.003751f, -0.013792f, +0.005415f, -0.000065f},
+ {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f},
+ {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f},
+ {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f}
+ },
+ {
+ {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f},
+ {-0.110139f, -0.008656f, +0.076872f, -0.013912f, -0.000006f},
+ {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f},
+ {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f},
+ {-0.012574f, +0.112476f, -0.042863f, +0.000548f, -0.000028f},
+ {-0.008554f, +0.117685f, -0.085746f, -0.010222f, +0.000121f},
+ {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f},
+ {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f},
+ {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f}
+ },
+ {
+ {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f},
+ {+0.179442f, +0.138305f, -0.024941f, +0.004193f, -0.000016f},
+ {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f},
+ {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f},
+ {+0.016881f, +0.188764f, -0.015179f, +0.001478f, -0.000024f},
+ {+0.011436f, +0.169671f, -0.055918f, +0.006134f, +0.000022f},
+ {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f},
+ {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f},
+ {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f}
+ },
+ {
+ {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f},
+ {-0.195669f, +0.557237f, +0.044782f, +0.005092f, +0.000007f},
+ {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f},
+ {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f},
+ {-0.002368f, +0.225780f, -0.012360f, -0.001921f, +0.000030f},
+ {-0.004974f, +0.160969f, -0.009969f, -0.002830f, -0.000125f},
+ {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f},
+ {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f},
+ {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f}
+ },
+ {
+ {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f},
+ {+0.051589f, +0.868735f, -0.017996f, -0.003263f, +0.000021f},
+ {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f},
+ {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f},
+ {-0.043767f, +0.191695f, +0.013679f, +0.000447f, +0.000023f},
+ {-0.015164f, +0.134423f, +0.000808f, +0.001816f, +0.000022f},
+ {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f},
+ {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f},
+ {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f}
+ },
+ {
+ {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f},
+ {+0.200078f, +0.617927f, +0.007665f, -0.002820f, -0.000011f},
+ {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f},
+ {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f},
+ {+0.096474f, +0.013567f, +0.000492f, +0.000745f, -0.000033f},
+ {+0.033027f, +0.054815f, +0.011873f, +0.000718f, +0.000112f},
+ {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f},
+ {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f},
+ {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f}
+ },
+ {
+ {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f},
+ {-0.305707f, -0.158732f, -0.020717f, +0.002646f, -0.000023f},
+ {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f},
+ {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f},
+ {-0.093448f, -0.250387f, -0.003900f, -0.000293f, -0.000021f},
+ {-0.019351f, -0.028793f, -0.005286f, -0.001746f, -0.000057f},
+ {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f},
+ {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f},
+ {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f}
+ },
+ {
+ {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f},
+ {+0.083028f, -0.735157f, +0.014942f, +0.001813f, +0.000016f},
+ {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f},
+ {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f},
+ {+0.001844f, -0.389834f, +0.002086f, -0.000484f, +0.000036f},
+ {-0.023047f, -0.027798f, -0.004234f, -0.000497f, -0.000086f},
+ {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f},
+ {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f},
+ {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f}
+ },
+ {
+ {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f},
+ {+0.260971f, -0.444113f, +0.025794f, -0.002256f, +0.000023f},
+ {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f},
+ {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f},
+ {+0.110994f, -0.232179f, +0.008226f, +0.000230f, +0.000019f},
+ {+0.042146f, +0.074633f, +0.011186f, +0.001034f, +0.000080f},
+ {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f},
+ {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f},
+ {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f}
+ },
+ {
+ {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f},
+ {-0.288608f, +0.395114f, -0.041290f, -0.001283f, -0.000020f},
+ {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f},
+ {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f},
+ {-0.121403f, +0.113923f, -0.010204f, +0.000233f, -0.000039f},
+ {-0.000083f, +0.147208f, +0.001729f, +0.000936f, +0.000054f},
+ {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f},
+ {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f},
+ {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f}
+ },
+ {
+ {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f},
+ {-0.075902f, +0.706014f, -0.007828f, +0.002003f, -0.000022f},
+ {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f},
+ {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f},
+ {+0.002036f, +0.295824f, -0.002824f, +0.000014f, -0.000016f},
+ {-0.060712f, +0.057606f, -0.008012f, -0.000958f, -0.000087f},
+ {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f},
+ {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f},
+ {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f}
+ },
+ {
+ {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f},
+ {+0.344646f, +0.053912f, +0.053141f, +0.000939f, +0.000024f},
+ {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f},
+ {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f},
+ {+0.111669f, +0.123210f, +0.013173f, -0.000233f, +0.000042f},
+ {+0.059758f, -0.131270f, +0.005702f, -0.000643f, -0.000024f},
+ {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f},
+ {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f},
+ {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f}
+ },
+ {
+ {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f},
+ {-0.115695f, -0.648554f, -0.017187f, -0.001787f, +0.000020f},
+ {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f},
+ {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f},
+ {-0.076830f, -0.166427f, -0.008366f, -0.000057f, +0.000012f},
+ {+0.014099f, -0.211406f, -0.003003f, +0.000568f, +0.000083f},
+ {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f},
+ {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f},
+ {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f}
+ },
+ {
+ {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f},
+ {-0.286060f, -0.383093f, -0.046192f, -0.000709f, -0.000026f},
+ {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f},
+ {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f},
+ {-0.058368f, -0.191934f, -0.007694f, +0.000156f, -0.000044f},
+ {-0.082552f, -0.075789f, -0.001514f, +0.000419f, +0.000001f},
+ {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f},
+ {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f},
+ {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f}
+ },
+ {
+ {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f},
+ {+0.244934f, +0.430481f, +0.034506f, +0.001609f, -0.000017f},
+ {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f},
+ {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f},
+ {+0.106876f, +0.065820f, +0.014688f, +0.000058f, -0.000007f},
+ {+0.074279f, +0.153828f, +0.004932f, -0.000344f, -0.000072f},
+ {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f},
+ {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f},
+ {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f}
+ },
+ {
+ {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f},
+ {+0.178742f, +0.528051f, +0.033152f, +0.000550f, +0.000028f},
+ {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f},
+ {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f},
+ {-0.002076f, +0.236562f, -0.002162f, -0.000025f, +0.000045f},
+ {-0.002032f, +0.267039f, -0.003164f, -0.000247f, +0.000013f},
+ {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f},
+ {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f},
+ {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f}
+ },
+ {
+ {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f},
+ {-0.302075f, -0.213979f, -0.045228f, -0.001475f, +0.000016f},
+ {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f},
+ {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f},
+ {-0.106693f, +0.078792f, -0.012412f, -0.000130f, +0.000002f},
+ {-0.068216f, +0.174315f, -0.001858f, +0.000344f, +0.000061f},
+ {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f},
+ {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f},
+ {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f}
+ },
+ {
+ {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f},
+ {-0.080587f, -0.555433f, -0.017854f, -0.000450f, -0.000030f},
+ {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f},
+ {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f},
+ {+0.071029f, -0.192007f, +0.008454f, +0.000011f, -0.000045f},
+ {+0.086510f, -0.044174f, +0.003825f, +0.000041f, -0.000021f},
+ {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f},
+ {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f},
+ {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f}
+ },
+ {
+ {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f},
+ {+0.327432f, +0.075214f, +0.050477f, +0.001428f, -0.000014f},
+ {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f},
+ {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f},
+ {+0.049580f, -0.225410f, +0.005863f, +0.000204f, +0.000001f},
+ {-0.043237f, -0.226727f, +0.000581f, -0.000235f, -0.000054f},
+ {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f},
+ {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f},
+ {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f}
+ },
+ {
+ {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f},
+ {-0.006912f, +0.595107f, +0.002722f, +0.000314f, +0.000031f},
+ {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f},
+ {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f},
+ {-0.092628f, -0.010795f, -0.009442f, -0.000210f, +0.000045f},
+ {-0.034470f, -0.235595f, -0.004153f, -0.000184f, +0.000026f},
+ {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f},
+ {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f},
+ {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f}
+ },
+ {
+ {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f},
+ {-0.344438f, +0.077598f, -0.050391f, -0.001368f, +0.000013f},
+ {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f},
+ {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f},
+ {+0.025938f, +0.166624f, +0.001223f, +0.000030f, -0.000004f},
+ {+0.087357f, -0.053855f, +0.006567f, +0.000375f, +0.000050f},
+ {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f},
+ {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f},
+ {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f}
+ },
+ {
+ {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f},
+ {+0.108559f, -0.623832f, +0.013156f, -0.000170f, -0.000033f},
+ {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f},
+ {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f},
+ {+0.042915f, +0.138441f, +0.007131f, +0.000079f, -0.000046f},
+ {-0.062416f, +0.169373f, -0.002459f, +0.000150f, -0.000033f},
+ {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f},
+ {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f},
+ {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f}
+ },
+ {
+ {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f},
+ {+0.334444f, -0.280705f, +0.047056f, +0.001250f, -0.000011f},
+ {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f},
+ {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f},
+ {-0.044996f, +0.004394f, -0.003024f, -0.000024f, +0.000007f},
+ {-0.022525f, +0.227369f, -0.001642f, -0.000313f, -0.000046f},
+ {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f},
+ {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f},
+ {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f}
+ },
+ {
+ {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f},
+ {-0.223672f, +0.578241f, -0.027233f, +0.000092f, +0.000035f},
+ {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f},
+ {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f},
+ {+0.013115f, -0.081785f, -0.000959f, +0.000079f, +0.000049f},
+ {+0.080738f, +0.072886f, +0.004201f, -0.000076f, +0.000042f},
+ {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f},
+ {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f},
+ {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f}
+ },
+ {
+ {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f},
+ {-0.267023f, +0.513414f, -0.037707f, -0.001150f, +0.000010f},
+ {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f},
+ {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f},
+ {+0.014195f, -0.075807f, +0.002631f, -0.000201f, -0.000012f},
+ {-0.053647f, -0.122427f, -0.002638f, +0.000093f, +0.000039f},
+ {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f},
+ {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f},
+ {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f}
+ },
+ {
+ {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f},
+ {+0.303693f, -0.362352f, +0.037014f, -0.000053f, -0.000037f},
+ {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f},
+ {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f},
+ {-0.032562f, +0.000305f, -0.004514f, +0.000019f, -0.000051f},
+ {-0.017941f, -0.163230f, -0.007036f, +0.000034f, -0.000051f},
+ {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f},
+ {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f},
+ {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f}
+ },
+ {
+ {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f},
+ {+0.168182f, -0.564851f, +0.028399f, +0.001136f, -0.000010f},
+ {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f},
+ {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f},
+ {+0.022063f, +0.085271f, +0.002211f, +0.000137f, +0.000019f},
+ {+0.049978f, -0.052230f, +0.005756f, +0.000013f, -0.000028f},
+ {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f},
+ {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f},
+ {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f}
+ },
+ {
+ {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f},
+ {-0.324241f, +0.201048f, -0.044886f, -0.000061f, +0.000040f},
+ {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f},
+ {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f},
+ {+0.028563f, +0.073381f, +0.002819f, +0.000106f, +0.000051f},
+ {-0.019828f, +0.052279f, -0.002320f, +0.000130f, +0.000057f},
+ {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f},
+ {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f},
+ {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f}
+ },
+ {
+ {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f},
+ {-0.096022f, +0.555951f, -0.014099f, -0.001080f, +0.000009f},
+ {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f},
+ {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f},
+ {-0.054876f, -0.054232f, -0.005942f, -0.000155f, -0.000026f},
+ {-0.020865f, +0.046834f, -0.005114f, -0.000034f, +0.000016f},
+ {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f},
+ {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f},
+ {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f}
+ },
+ {
+ {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f},
+ {+0.335689f, -0.108899f, +0.045170f, +0.000116f, -0.000044f},
+ {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f},
+ {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f},
+ {-0.005167f, -0.128785f, +0.000940f, -0.000138f, -0.000050f},
+ {+0.023264f, -0.025419f, +0.006527f, -0.000284f, -0.000058f},
+ {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f},
+ {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f},
+ {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f}
+ },
+ {
+ {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f},
+ {+0.030738f, -0.578245f, +0.004213f, +0.001069f, -0.000007f},
+ {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f},
+ {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f},
+ {+0.076224f, -0.003106f, +0.010057f, +0.000063f, +0.000032f},
+ {+0.005937f, -0.057510f, +0.000360f, -0.000077f, -0.000005f},
+ {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f},
+ {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f},
+ {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f}
+ },
+ {
+ {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f},
+ {-0.340086f, -0.006265f, -0.046602f, -0.000169f, +0.000048f},
+ {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f},
+ {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f},
+ {-0.033809f, +0.166438f, -0.006399f, +0.000195f, +0.000048f},
+ {-0.027146f, -0.011761f, -0.003177f, +0.000395f, +0.000056f},
+ {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f},
+ {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f},
+ {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f}
+ },
+ {
+ {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f},
+ {+0.034060f, +0.568731f, +0.004971f, -0.001035f, +0.000004f},
+ {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f},
+ {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f},
+ {-0.073934f, +0.106271f, -0.009079f, -0.000021f, -0.000038f},
+ {+0.016227f, +0.051899f, -0.000373f, +0.000148f, -0.000001f},
+ {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f},
+ {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f},
+ {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f}
+ },
+ {
+ {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f},
+ {+0.332610f, +0.106477f, +0.046382f, +0.000181f, -0.000052f},
+ {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f},
+ {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f},
+ {+0.071871f, -0.114351f, +0.009162f, -0.000197f, -0.000047f},
+ {+0.013433f, +0.054663f, +0.003535f, -0.000343f, -0.000057f},
+ {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f},
+ {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f},
+ {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f}
+ },
+ {
+ {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f},
+ {-0.092222f, -0.547291f, -0.014252f, +0.000986f, -0.000001f},
+ {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f},
+ {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f},
+ {+0.047272f, -0.147189f, +0.008626f, +0.000053f, +0.000044f},
+ {-0.026008f, -0.007599f, -0.001975f, -0.000132f, +0.000005f},
+ {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f},
+ {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f},
+ {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f}
+ },
+ {
+ {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f},
+ {-0.321912f, -0.191063f, -0.044992f, -0.000193f, +0.000056f},
+ {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f},
+ {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f},
+ {-0.084811f, +0.059741f, -0.013684f, +0.000183f, +0.000048f},
+ {+0.004452f, -0.055305f, -0.000514f, +0.000261f, +0.000064f},
+ {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f},
+ {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f},
+ {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f}
+ },
+ {
+ {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f},
+ {+0.151967f, +0.538951f, +0.023953f, -0.000917f, -0.000002f},
+ {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f},
+ {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f},
+ {-0.030147f, +0.144364f, -0.004637f, -0.000155f, -0.000054f},
+ {+0.022610f, -0.026139f, +0.001896f, -0.000081f, -0.000015f},
+ {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f},
+ {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f},
+ {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f}
+ },
+ {
+ {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f},
+ {+0.305017f, +0.302445f, +0.041503f, +0.000225f, -0.000061f},
+ {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f},
+ {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f},
+ {+0.099074f, -0.056676f, +0.015836f, -0.000238f, -0.000049f},
+ {-0.015365f, +0.033058f, -0.001023f, -0.000263f, -0.000075f},
+ {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f},
+ {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f},
+ {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f}
+ },
+ {
+ {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f},
+ {-0.220330f, -0.504684f, -0.033230f, +0.000874f, +0.000003f},
+ {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f},
+ {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f},
+ {+0.011044f, -0.195618f, -0.000221f, +0.000284f, +0.000070f},
+ {-0.015206f, +0.030774f, -0.001584f, +0.000377f, +0.000037f},
+ {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f},
+ {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f},
+ {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f}
+ },
+ {
+ {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f},
+ {-0.265346f, -0.433349f, -0.035911f, -0.000309f, +0.000070f},
+ {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f},
+ {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f},
+ {-0.118431f, +0.000422f, -0.015867f, +0.000387f, +0.000045f},
+ {+0.018068f, -0.023258f, +0.002724f, +0.000522f, +0.000082f},
+ {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f},
+ {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f},
+ {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f}
+ },
+ {
+ {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f},
+ {+0.281798f, +0.406628f, +0.041589f, -0.000891f, -0.000005f},
+ {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f},
+ {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f},
+ {+0.027666f, +0.223189f, +0.003521f, -0.000300f, -0.000093f},
+ {+0.013844f, -0.028875f, +0.000557f, -0.000575f, -0.000072f},
+ {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f},
+ {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f},
+ {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f}
+ },
+ {
+ {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f},
+ {+0.203795f, +0.522732f, +0.028158f, +0.000411f, -0.000085f},
+ {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f},
+ {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f},
+ {+0.117838f, +0.083303f, +0.016703f, -0.000616f, -0.000028f},
+ {-0.023412f, +0.030837f, -0.004021f, -0.001018f, -0.000071f},
+ {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f},
+ {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f},
+ {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f}
+ },
+ {
+ {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f},
+ {-0.322019f, -0.286370f, -0.048482f, +0.000959f, +0.000014f},
+ {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f},
+ {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f},
+ {-0.067347f, -0.202691f, -0.009894f, +0.000124f, +0.000115f},
+ {-0.015081f, +0.042971f, -0.000082f, +0.000445f, +0.000114f},
+ {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f},
+ {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f},
+ {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f}
+ },
+ {
+ {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f},
+ {-0.134884f, -0.571706f, -0.018454f, -0.000373f, +0.000105f},
+ {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f},
+ {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f},
+ {-0.098520f, -0.155744f, -0.013412f, +0.000754f, -0.000004f},
+ {+0.039536f, -0.043110f, +0.005899f, +0.001509f, +0.000034f},
+ {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f},
+ {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f},
+ {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f}
+ },
+ {
+ {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f},
+ {+0.342354f, +0.162255f, +0.051635f, -0.001110f, -0.000034f},
+ {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f},
+ {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f},
+ {+0.096594f, +0.143573f, +0.013193f, +0.000234f, -0.000126f},
+ {+0.002506f, -0.100103f, -0.002757f, +0.000120f, -0.000144f},
+ {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f},
+ {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f},
+ {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f}
+ },
+ {
+ {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f},
+ {+0.067107f, +0.583553f, +0.008494f, +0.000150f, -0.000126f},
+ {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f},
+ {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f},
+ {+0.067365f, +0.187138f, +0.009613f, -0.000522f, +0.000049f},
+ {-0.053548f, -0.014546f, -0.006738f, -0.001557f, +0.000028f},
+ {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f},
+ {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f},
+ {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f}
+ },
+ {
+ {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f},
+ {-0.348741f, -0.055377f, -0.052852f, +0.001109f, +0.000070f},
+ {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f},
+ {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f},
+ {-0.107002f, -0.082667f, -0.016074f, -0.000429f, +0.000116f},
+ {+0.027699f, +0.106463f, +0.004855f, -0.000830f, +0.000144f},
+ {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f},
+ {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f},
+ {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f}
+ },
+ {
+ {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f},
+ {-0.002104f, -0.586753f, +0.000310f, +0.000388f, +0.000138f},
+ {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f},
+ {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f},
+ {-0.041057f, -0.183900f, -0.003084f, -0.000869f, -0.000096f},
+ {+0.043480f, +0.079977f, +0.008525f, +0.000104f, -0.000100f},
+ {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f},
+ {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f},
+ {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f}
+ },
+ {
+ {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f},
+ {+0.346528f, -0.051746f, +0.052277f, -0.000401f, -0.000122f},
+ {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f},
+ {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f},
+ {+0.107847f, +0.047702f, +0.019644f, -0.000097f, -0.000079f},
+ {-0.051228f, -0.061068f, -0.003689f, +0.001630f, -0.000102f},
+ {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f},
+ {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f},
+ {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f}
+ }
+};
+
+const float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]=
+{
+ {
+ {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f},
+ {+0.013208f, -0.379140f, +0.322559f, +0.004978f, +0.000009f},
+ {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f},
+ {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f},
+ {-0.003471f, -0.011471f, -0.002826f, -0.001074f, +0.000026f},
+ {-0.003706f, +0.001098f, +0.005680f, -0.008863f, -0.000084f},
+ {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f},
+ {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f},
+ {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f}
+ },
+ {
+ {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f},
+ {-0.031621f, -0.813566f, -0.056755f, -0.007166f, -0.000006f},
+ {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f},
+ {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f},
+ {+0.007142f, +0.001751f, +0.001329f, +0.002743f, -0.000028f},
+ {+0.006527f, +0.051957f, +0.070578f, +0.014200f, +0.000113f},
+ {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f},
+ {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f},
+ {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f}
+ },
+ {
+ {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f},
+ {+0.026960f, -0.962971f, -0.087407f, -0.001953f, -0.000014f},
+ {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f},
+ {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f},
+ {-0.009864f, +0.005169f, +0.019159f, -0.003128f, -0.000025f},
+ {-0.004987f, +0.054770f, +0.099413f, -0.003316f, +0.000044f},
+ {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f},
+ {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f},
+ {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f}
+ },
+ {
+ {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f},
+ {+0.025122f, -0.922813f, -0.028063f, +0.008613f, +0.000006f},
+ {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f},
+ {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f},
+ {+0.024810f, -0.014152f, -0.030508f, +0.002185f, +0.000029f},
+ {+0.011648f, -0.040215f, -0.008697f, -0.003893f, -0.000125f},
+ {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f},
+ {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f},
+ {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f}
+ },
+ {
+ {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f},
+ {-0.143821f, -0.682007f, +0.029450f, -0.003481f, +0.000019f},
+ {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f},
+ {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f},
+ {-0.052905f, +0.051459f, +0.001250f, -0.000868f, +0.000023f},
+ {-0.029241f, -0.030800f, -0.000944f, +0.000488f, +0.000000f},
+ {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f},
+ {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f},
+ {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f}
+ },
+ {
+ {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f},
+ {+0.262828f, -0.127251f, +0.020151f, -0.004341f, -0.000009f},
+ {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f},
+ {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f},
+ {+0.064139f, +0.206373f, -0.000508f, +0.000138f, -0.000031f},
+ {+0.035857f, +0.035091f, -0.016850f, +0.002300f, +0.000120f},
+ {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f},
+ {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f},
+ {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f}
+ },
+ {
+ {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f},
+ {-0.217141f, +0.537828f, -0.015478f, +0.003353f, -0.000022f},
+ {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f},
+ {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f},
+ {-0.019714f, +0.330742f, -0.003692f, +0.000002f, -0.000022f},
+ {-0.010625f, +0.080582f, +0.010145f, -0.000258f, -0.000041f},
+ {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f},
+ {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f},
+ {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f}
+ },
+ {
+ {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f},
+ {-0.054243f, +0.757012f, -0.020850f, +0.002283f, +0.000013f},
+ {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f},
+ {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f},
+ {-0.071769f, +0.265803f, +0.002595f, -0.000097f, +0.000034f},
+ {-0.026489f, +0.035458f, -0.005585f, -0.001110f, -0.000100f},
+ {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f},
+ {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f},
+ {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f}
+ },
+ {
+ {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f},
+ {+0.307522f, +0.201411f, +0.041908f, -0.002386f, +0.000023f},
+ {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f},
+ {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f},
+ {+0.130667f, -0.017905f, +0.002862f, +0.000224f, +0.000021f},
+ {+0.026816f, -0.061563f, +0.002730f, +0.000500f, +0.000070f},
+ {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f},
+ {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f},
+ {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f}
+ },
+ {
+ {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f},
+ {-0.208158f, -0.589613f, -0.015424f, -0.001691f, -0.000018f},
+ {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f},
+ {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f},
+ {-0.077086f, -0.303705f, +0.003329f, -0.000036f, -0.000037f},
+ {+0.020310f, -0.080808f, -0.007043f, +0.000054f, +0.000070f},
+ {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f},
+ {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f},
+ {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f}
+ },
+ {
+ {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f},
+ {-0.174454f, -0.640794f, -0.027817f, +0.001980f, -0.000023f},
+ {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f},
+ {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f},
+ {-0.056596f, -0.310132f, -0.010567f, -0.000223f, -0.000018f},
+ {-0.057823f, +0.028077f, -0.000893f, -0.000451f, -0.000085f},
+ {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f},
+ {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f},
+ {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f}
+ },
+ {
+ {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f},
+ {+0.339082f, +0.153701f, +0.034923f, +0.001267f, +0.000022f},
+ {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f},
+ {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f},
+ {+0.127275f, -0.020840f, +0.015322f, -0.000034f, +0.000041f},
+ {+0.027665f, +0.152414f, +0.006975f, +0.000222f, -0.000038f},
+ {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f},
+ {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f},
+ {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f}
+ },
+ {
+ {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f},
+ {-0.026755f, +0.715695f, +0.002721f, -0.001713f, +0.000021f},
+ {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f},
+ {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f},
+ {-0.046673f, +0.240709f, -0.003039f, +0.000354f, +0.000014f},
+ {+0.046604f, +0.126235f, +0.001254f, +0.000637f, +0.000087f},
+ {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f},
+ {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f},
+ {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f}
+ },
+ {
+ {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f},
+ {-0.329416f, +0.240852f, -0.037687f, -0.000972f, -0.000025f},
+ {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f},
+ {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f},
+ {-0.085616f, +0.171409f, -0.015038f, +0.000016f, -0.000044f},
+ {-0.080584f, -0.060419f, -0.009795f, -0.000260f, +0.000011f},
+ {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f},
+ {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f},
+ {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f}
+ },
+ {
+ {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f},
+ {+0.191369f, -0.563524f, +0.020930f, +0.001563f, -0.000018f},
+ {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f},
+ {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f},
+ {+0.094869f, -0.113180f, +0.014106f, -0.000387f, -0.000009f},
+ {+0.032009f, -0.229593f, +0.004382f, -0.000814f, -0.000078f},
+ {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f},
+ {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f},
+ {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f}
+ },
+ {
+ {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f},
+ {+0.237324f, -0.482374f, +0.029199f, +0.000704f, +0.000027f},
+ {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f},
+ {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f},
+ {+0.029761f, -0.216925f, +0.003727f, -0.000037f, +0.000045f},
+ {+0.050908f, -0.208738f, +0.003838f, +0.000287f, +0.000007f},
+ {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f},
+ {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f},
+ {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f}
+ },
+ {
+ {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f},
+ {-0.281553f, +0.324420f, -0.036967f, -0.001412f, +0.000017f},
+ {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f},
+ {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f},
+ {-0.112292f, +0.000623f, -0.014750f, +0.000389f, +0.000004f},
+ {-0.090463f, -0.007129f, -0.003581f, +0.000747f, +0.000067f},
+ {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f},
+ {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f},
+ {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f}
+ },
+ {
+ {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f},
+ {-0.129889f, +0.550582f, -0.015713f, -0.000496f, -0.000029f},
+ {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f},
+ {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f},
+ {+0.037999f, +0.233960f, +0.005179f, +0.000063f, -0.000045f},
+ {+0.058157f, +0.208550f, +0.000279f, -0.000232f, -0.000018f},
+ {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f},
+ {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f},
+ {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f}
+ },
+ {
+ {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f},
+ {+0.316645f, -0.147998f, +0.045958f, +0.001265f, -0.000015f},
+ {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f},
+ {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f},
+ {+0.085408f, +0.166595f, +0.008605f, -0.000440f, -0.000000f},
+ {+0.015618f, +0.269874f, +0.001215f, -0.000625f, -0.000057f},
+ {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f},
+ {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f},
+ {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f}
+ },
+ {
+ {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f},
+ {+0.040209f, -0.573378f, +0.000615f, +0.000315f, +0.000031f},
+ {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f},
+ {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f},
+ {-0.092144f, -0.099172f, -0.007312f, +0.000077f, +0.000045f},
+ {-0.077363f, +0.132678f, -0.001733f, +0.000235f, +0.000023f},
+ {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f},
+ {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f},
+ {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f}
+ },
+ {
+ {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f},
+ {-0.338234f, +0.015114f, -0.048846f, -0.001053f, +0.000013f},
+ {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f},
+ {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f},
+ {-0.008393f, -0.222503f, -0.002681f, +0.000354f, -0.000003f},
+ {+0.081171f, -0.098496f, +0.004558f, +0.000585f, +0.000051f},
+ {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f},
+ {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f},
+ {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f}
+ },
+ {
+ {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f},
+ {+0.052902f, +0.616966f, +0.013055f, -0.000306f, -0.000032f},
+ {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f},
+ {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f},
+ {+0.073970f, -0.094701f, +0.008512f, -0.000228f, -0.000046f},
+ {-0.017462f, -0.238223f, -0.000790f, -0.000485f, -0.000029f},
+ {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f},
+ {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f},
+ {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f}
+ },
+ {
+ {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f},
+ {+0.344919f, +0.163301f, +0.048934f, +0.001021f, -0.000012f},
+ {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f},
+ {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f},
+ {-0.044437f, +0.083315f, -0.002185f, -0.000075f, +0.000005f},
+ {-0.063695f, -0.165969f, -0.005598f, -0.000350f, -0.000048f},
+ {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f},
+ {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f},
+ {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f}
+ },
+ {
+ {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f},
+ {-0.163645f, -0.620258f, -0.029442f, +0.000199f, +0.000034f},
+ {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f},
+ {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f},
+ {-0.011132f, +0.127973f, -0.004627f, -0.000028f, +0.000047f},
+ {+0.084325f, +0.052788f, +0.007351f, +0.000453f, +0.000037f},
+ {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f},
+ {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f},
+ {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f}
+ },
+ {
+ {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f},
+ {-0.309161f, -0.398764f, -0.040718f, -0.000943f, +0.000011f},
+ {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f},
+ {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f},
+ {+0.032063f, +0.056196f, +0.004324f, +0.000244f, -0.000009f},
+ {-0.022806f, +0.208884f, +0.000856f, +0.000371f, +0.000043f},
+ {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f},
+ {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f},
+ {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f}
+ },
+ {
+ {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f},
+ {+0.270280f, +0.483591f, +0.039528f, -0.000153f, -0.000036f},
+ {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f},
+ {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f},
+ {-0.026438f, -0.035500f, -0.002626f, +0.000034f, -0.000050f},
+ {-0.052495f, +0.162509f, -0.005782f, -0.000307f, -0.000047f},
+ {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f},
+ {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f},
+ {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f}
+ },
+ {
+ {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f},
+ {+0.216188f, +0.557670f, +0.033272f, +0.000921f, -0.000010f},
+ {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f},
+ {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f},
+ {+0.004155f, -0.082194f, +0.000724f, -0.000315f, +0.000015f},
+ {+0.061885f, -0.007918f, +0.004267f, -0.000661f, -0.000034f},
+ {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f},
+ {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f},
+ {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f}
+ },
+ {
+ {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f},
+ {-0.316113f, -0.262138f, -0.049307f, +0.000066f, +0.000038f},
+ {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f},
+ {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f},
+ {+0.033061f, -0.037487f, +0.003086f, -0.000057f, +0.000051f},
+ {-0.009161f, -0.111428f, +0.002750f, +0.000407f, +0.000055f},
+ {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f},
+ {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f},
+ {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f}
+ },
+ {
+ {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f},
+ {-0.128892f, -0.546911f, -0.020182f, -0.000837f, +0.000009f},
+ {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f},
+ {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f},
+ {-0.039700f, +0.075487f, -0.006824f, +0.000303f, -0.000022f},
+ {-0.033671f, -0.064807f, -0.008036f, +0.000540f, +0.000022f},
+ {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f},
+ {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f},
+ {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f}
+ },
+ {
+ {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f},
+ {+0.327815f, +0.157084f, +0.053522f, -0.000024f, -0.000042f},
+ {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f},
+ {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f},
+ {-0.018657f, +0.107686f, -0.002873f, +0.000136f, -0.000051f},
+ {+0.022629f, +0.029525f, +0.002254f, -0.000156f, -0.000058f},
+ {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f},
+ {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f},
+ {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f}
+ },
+ {
+ {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f},
+ {+0.063671f, +0.564794f, +0.009104f, +0.000762f, -0.000008f},
+ {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f},
+ {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f},
+ {+0.067397f, -0.027841f, +0.010395f, -0.000286f, +0.000029f},
+ {+0.014235f, +0.044128f, +0.001136f, -0.000560f, -0.000010f},
+ {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f},
+ {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f},
+ {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f}
+ },
+ {
+ {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f},
+ {-0.337900f, -0.049301f, -0.053004f, -0.000032f, +0.000046f},
+ {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f},
+ {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f},
+ {-0.012544f, -0.153200f, -0.002399f, -0.000157f, +0.000049f},
+ {-0.026935f, -0.020769f, -0.002517f, +0.000142f, +0.000057f},
+ {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f},
+ {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f},
+ {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f}
+ },
+ {
+ {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f},
+ {+0.002761f, -0.570850f, -0.000438f, -0.000698f, +0.000005f},
+ {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f},
+ {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f},
+ {-0.079593f, -0.051699f, -0.009265f, +0.000243f, -0.000035f},
+ {+0.004491f, -0.069814f, +0.001757f, +0.000412f, +0.000001f},
+ {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f},
+ {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f},
+ {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f}
+ },
+ {
+ {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f},
+ {+0.335616f, -0.061120f, +0.052587f, +0.000136f, -0.000050f},
+ {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f},
+ {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f},
+ {+0.055697f, +0.153136f, +0.006127f, +0.000099f, -0.000047f},
+ {+0.022758f, -0.040841f, +0.001974f, -0.000245f, -0.000056f},
+ {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f},
+ {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f},
+ {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f}
+ },
+ {
+ {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f},
+ {-0.064276f, +0.551492f, -0.008554f, +0.000611f, -0.000002f},
+ {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f},
+ {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f},
+ {+0.061405f, +0.140795f, +0.008634f, -0.000186f, +0.000040f},
+ {-0.022602f, +0.028596f, -0.003958f, -0.000252f, +0.000003f},
+ {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f},
+ {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f},
+ {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f}
+ },
+ {
+ {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f},
+ {-0.325666f, +0.150573f, -0.051593f, -0.000209f, +0.000054f},
+ {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f},
+ {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f},
+ {-0.080571f, -0.077938f, -0.010648f, -0.000040f, +0.000047f},
+ {-0.004481f, +0.054774f, -0.000402f, +0.000382f, +0.000060f},
+ {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f},
+ {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f},
+ {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f}
+ },
+ {
+ {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f},
+ {+0.121553f, -0.536831f, +0.017942f, -0.000578f, -0.000001f},
+ {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f},
+ {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f},
+ {-0.037110f, -0.141320f, -0.006102f, +0.000195f, -0.000048f},
+ {+0.024782f, +0.009783f, +0.004483f, +0.000288f, -0.000009f},
+ {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f},
+ {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f},
+ {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f}
+ },
+ {
+ {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f},
+ {+0.313748f, -0.244268f, +0.048706f, +0.000275f, -0.000058f},
+ {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f},
+ {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f},
+ {+0.090126f, +0.058592f, +0.014503f, +0.000035f, -0.000049f},
+ {-0.010917f, -0.042825f, -0.001085f, -0.000524f, -0.000070f},
+ {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f},
+ {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f},
+ {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f}
+ },
+ {
+ {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f},
+ {-0.186187f, +0.523327f, -0.027065f, +0.000548f, +0.000002f},
+ {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f},
+ {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f},
+ {+0.023241f, +0.163547f, +0.001737f, -0.000268f, +0.000061f},
+ {-0.017633f, -0.031273f, -0.004558f, -0.000453f, +0.000024f},
+ {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f},
+ {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f},
+ {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f}
+ },
+ {
+ {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f},
+ {-0.287194f, +0.371793f, -0.043606f, -0.000298f, +0.000065f},
+ {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f},
+ {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f},
+ {-0.110078f, -0.041091f, -0.015691f, -0.000117f, +0.000048f},
+ {+0.016824f, +0.020994f, +0.002433f, +0.000470f, +0.000080f},
+ {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f},
+ {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f},
+ {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f}
+ },
+ {
+ {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f},
+ {+0.254019f, -0.457019f, +0.035395f, -0.000472f, -0.000004f},
+ {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f},
+ {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f},
+ {+0.006588f, -0.220018f, +0.002089f, +0.000280f, -0.000081f},
+ {+0.012847f, +0.026665f, +0.004159f, +0.000613f, -0.000053f},
+ {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f},
+ {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f},
+ {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f}
+ },
+ {
+ {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f},
+ {+0.234856f, -0.487730f, +0.036693f, +0.000275f, -0.000076f},
+ {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f},
+ {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f},
+ {+0.120851f, -0.044023f, +0.017124f, +0.000326f, -0.000038f},
+ {-0.019744f, -0.023127f, -0.003003f, -0.000144f, -0.000080f},
+ {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f},
+ {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f},
+ {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f}
+ },
+ {
+ {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f},
+ {-0.305263f, +0.341002f, -0.042929f, +0.000320f, +0.000009f},
+ {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f},
+ {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f},
+ {-0.047909f, +0.214878f, -0.007490f, -0.000138f, +0.000104f},
+ {-0.013632f, -0.032324f, -0.004221f, -0.000548f, +0.000093f},
+ {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f},
+ {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f},
+ {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f}
+ },
+ {
+ {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f},
+ {-0.168461f, +0.553033f, -0.027068f, -0.000281f, +0.000094f},
+ {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f},
+ {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f},
+ {-0.110234f, +0.118824f, -0.015813f, -0.000528f, +0.000014f},
+ {+0.029948f, +0.036351f, +0.005263f, -0.000282f, +0.000056f},
+ {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f},
+ {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f},
+ {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f}
+ },
+ {
+ {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f},
+ {+0.335277f, -0.219226f, +0.046865f, -0.000105f, -0.000022f},
+ {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f},
+ {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f},
+ {+0.083868f, -0.178051f, +0.011964f, -0.000280f, -0.000122f},
+ {+0.010723f, +0.070555f, +0.001815f, -0.000022f, -0.000132f},
+ {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f},
+ {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f},
+ {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f}
+ },
+ {
+ {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f},
+ {+0.099306f, -0.582261f, +0.017486f, +0.000468f, -0.000116f},
+ {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f},
+ {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f},
+ {+0.082995f, -0.177822f, +0.013237f, +0.000567f, +0.000026f},
+ {-0.049222f, -0.017872f, -0.004795f, +0.000539f, -0.000005f},
+ {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f},
+ {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f},
+ {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f}
+ },
+ {
+ {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f},
+ {-0.347527f, +0.104803f, -0.049661f, -0.000162f, +0.000050f},
+ {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f},
+ {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f},
+ {-0.103480f, +0.108513f, -0.015479f, +0.000834f, +0.000124f},
+ {+0.013480f, -0.114650f, -0.000763f, +0.001025f, +0.000149f},
+ {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f},
+ {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f},
+ {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f}
+ },
+ {
+ {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f},
+ {-0.033731f, +0.589122f, -0.007210f, -0.000795f, +0.000134f},
+ {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f},
+ {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f},
+ {-0.052364f, +0.186418f, -0.009164f, -0.000026f, -0.000073f},
+ {+0.052053f, -0.056265f, +0.005015f, +0.000066f, -0.000065f},
+ {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f},
+ {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f},
+ {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f}
+ },
+ {
+ {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f},
+ {+0.349598f, +0.000051f, +0.050374f, +0.000038f, -0.000095f},
+ {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f},
+ {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f},
+ {+0.107473f, -0.058841f, +0.017699f, -0.001256f, -0.000101f},
+ {-0.043140f, +0.091871f, -0.000478f, -0.002412f, -0.000129f},
+ {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f},
+ {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f},
+ {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f}
+ },
+ {
+ {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f},
+ {-0.031629f, -0.587979f, -0.001886f, +0.001424f, -0.000137f},
+ {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f},
+ {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f},
+ {+0.029482f, -0.180110f, +0.004281f, -0.002087f, +0.000115f},
+ {-0.033134f, +0.107741f, -0.001943f, -0.002753f, +0.000132f},
+ {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f},
+ {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f},
+ {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f}
+ }
+};
+
+const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]=
+{
+ {
+ {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f},
+ {+0.081675f, -0.202936f, +0.124120f, +0.000184f, -0.000007f},
+ {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f},
+ {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f},
+ {+0.006316f, -0.012132f, +0.006515f, -0.002119f, -0.000027f},
+ {-0.000794f, +0.004296f, +0.005127f, -0.004942f, +0.000100f},
+ {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f},
+ {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f},
+ {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f}
+ },
+ {
+ {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f},
+ {-0.078219f, -0.186706f, +0.335495f, -0.010505f, -0.000011f},
+ {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f},
+ {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f},
+ {-0.007422f, -0.043414f, +0.006982f, +0.001963f, -0.000025f},
+ {-0.003254f, -0.003751f, +0.013792f, -0.005415f, +0.000065f},
+ {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f},
+ {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f},
+ {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f}
+ },
+ {
+ {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f},
+ {+0.110139f, +0.008656f, -0.076872f, +0.013912f, +0.000006f},
+ {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f},
+ {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f},
+ {+0.012574f, -0.112476f, +0.042863f, -0.000548f, +0.000028f},
+ {+0.008554f, -0.117685f, +0.085746f, +0.010222f, -0.000121f},
+ {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f},
+ {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f},
+ {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f}
+ },
+ {
+ {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f},
+ {-0.179442f, -0.138305f, +0.024941f, -0.004193f, +0.000016f},
+ {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f},
+ {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f},
+ {-0.016881f, -0.188764f, +0.015179f, -0.001478f, +0.000024f},
+ {-0.011436f, -0.169671f, +0.055918f, -0.006134f, -0.000022f},
+ {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f},
+ {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f},
+ {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f}
+ },
+ {
+ {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f},
+ {+0.195669f, -0.557237f, -0.044782f, -0.005092f, -0.000007f},
+ {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f},
+ {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f},
+ {+0.002368f, -0.225780f, +0.012360f, +0.001921f, -0.000030f},
+ {+0.004974f, -0.160969f, +0.009969f, +0.002830f, +0.000125f},
+ {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f},
+ {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f},
+ {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f}
+ },
+ {
+ {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f},
+ {-0.051589f, -0.868735f, +0.017996f, +0.003263f, -0.000021f},
+ {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f},
+ {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f},
+ {+0.043767f, -0.191695f, -0.013679f, -0.000447f, -0.000023f},
+ {+0.015164f, -0.134423f, -0.000808f, -0.001816f, -0.000022f},
+ {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f},
+ {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f},
+ {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f}
+ },
+ {
+ {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f},
+ {-0.200078f, -0.617927f, -0.007665f, +0.002820f, +0.000011f},
+ {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f},
+ {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f},
+ {-0.096474f, -0.013567f, -0.000492f, -0.000745f, +0.000033f},
+ {-0.033027f, -0.054815f, -0.011873f, -0.000718f, -0.000112f},
+ {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f},
+ {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f},
+ {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f}
+ },
+ {
+ {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f},
+ {+0.305707f, +0.158732f, +0.020717f, -0.002646f, +0.000023f},
+ {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f},
+ {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f},
+ {+0.093448f, +0.250387f, +0.003900f, +0.000293f, +0.000021f},
+ {+0.019351f, +0.028793f, +0.005286f, +0.001746f, +0.000057f},
+ {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f},
+ {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f},
+ {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f}
+ },
+ {
+ {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f},
+ {-0.083028f, +0.735157f, -0.014942f, -0.001813f, -0.000016f},
+ {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f},
+ {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f},
+ {-0.001844f, +0.389834f, -0.002086f, +0.000484f, -0.000036f},
+ {+0.023047f, +0.027798f, +0.004234f, +0.000497f, +0.000086f},
+ {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f},
+ {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f},
+ {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f}
+ },
+ {
+ {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f},
+ {-0.260971f, +0.444113f, -0.025794f, +0.002256f, -0.000023f},
+ {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f},
+ {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f},
+ {-0.110994f, +0.232179f, -0.008226f, -0.000230f, -0.000019f},
+ {-0.042146f, -0.074633f, -0.011186f, -0.001034f, -0.000080f},
+ {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f},
+ {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f},
+ {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f}
+ },
+ {
+ {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f},
+ {+0.288608f, -0.395114f, +0.041290f, +0.001283f, +0.000020f},
+ {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f},
+ {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f},
+ {+0.121403f, -0.113923f, +0.010204f, -0.000233f, +0.000039f},
+ {+0.000083f, -0.147208f, -0.001729f, -0.000936f, -0.000054f},
+ {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f},
+ {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f},
+ {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f}
+ },
+ {
+ {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f},
+ {+0.075902f, -0.706014f, +0.007828f, -0.002003f, +0.000022f},
+ {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f},
+ {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f},
+ {-0.002036f, -0.295824f, +0.002824f, -0.000014f, +0.000016f},
+ {+0.060712f, -0.057606f, +0.008012f, +0.000958f, +0.000087f},
+ {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f},
+ {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f},
+ {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f}
+ },
+ {
+ {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f},
+ {-0.344646f, -0.053912f, -0.053141f, -0.000939f, -0.000024f},
+ {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f},
+ {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f},
+ {-0.111669f, -0.123210f, -0.013173f, +0.000233f, -0.000042f},
+ {-0.059758f, +0.131270f, -0.005702f, +0.000643f, +0.000024f},
+ {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f},
+ {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f},
+ {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f}
+ },
+ {
+ {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f},
+ {+0.115695f, +0.648554f, +0.017187f, +0.001787f, -0.000020f},
+ {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f},
+ {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f},
+ {+0.076830f, +0.166427f, +0.008366f, +0.000057f, -0.000012f},
+ {-0.014099f, +0.211406f, +0.003003f, -0.000568f, -0.000083f},
+ {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f},
+ {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f},
+ {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f}
+ },
+ {
+ {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f},
+ {+0.286060f, +0.383093f, +0.046192f, +0.000709f, +0.000026f},
+ {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f},
+ {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f},
+ {+0.058368f, +0.191934f, +0.007694f, -0.000156f, +0.000044f},
+ {+0.082552f, +0.075789f, +0.001514f, -0.000419f, -0.000001f},
+ {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f},
+ {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f},
+ {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f}
+ },
+ {
+ {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f},
+ {-0.244934f, -0.430481f, -0.034506f, -0.001609f, +0.000017f},
+ {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f},
+ {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f},
+ {-0.106876f, -0.065820f, -0.014688f, -0.000058f, +0.000007f},
+ {-0.074279f, -0.153828f, -0.004932f, +0.000344f, +0.000072f},
+ {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f},
+ {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f},
+ {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f}
+ },
+ {
+ {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f},
+ {-0.178742f, -0.528051f, -0.033152f, -0.000550f, -0.000028f},
+ {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f},
+ {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f},
+ {+0.002076f, -0.236562f, +0.002162f, +0.000025f, -0.000045f},
+ {+0.002032f, -0.267039f, +0.003164f, +0.000247f, -0.000013f},
+ {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f},
+ {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f},
+ {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f}
+ },
+ {
+ {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f},
+ {+0.302075f, +0.213979f, +0.045228f, +0.001475f, -0.000016f},
+ {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f},
+ {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f},
+ {+0.106693f, -0.078792f, +0.012412f, +0.000130f, -0.000002f},
+ {+0.068216f, -0.174315f, +0.001858f, -0.000344f, -0.000061f},
+ {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f},
+ {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f},
+ {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f}
+ },
+ {
+ {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f},
+ {+0.080587f, +0.555433f, +0.017854f, +0.000450f, +0.000030f},
+ {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f},
+ {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f},
+ {-0.071029f, +0.192007f, -0.008454f, -0.000011f, +0.000045f},
+ {-0.086510f, +0.044174f, -0.003825f, -0.000041f, +0.000021f},
+ {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f},
+ {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f},
+ {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f}
+ },
+ {
+ {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f},
+ {-0.327432f, -0.075214f, -0.050477f, -0.001428f, +0.000014f},
+ {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f},
+ {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f},
+ {-0.049580f, +0.225410f, -0.005863f, -0.000204f, -0.000001f},
+ {+0.043237f, +0.226727f, -0.000581f, +0.000235f, +0.000054f},
+ {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f},
+ {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f},
+ {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f}
+ },
+ {
+ {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f},
+ {+0.006912f, -0.595107f, -0.002722f, -0.000314f, -0.000031f},
+ {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f},
+ {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f},
+ {+0.092628f, +0.010795f, +0.009442f, +0.000210f, -0.000045f},
+ {+0.034470f, +0.235595f, +0.004153f, +0.000184f, -0.000026f},
+ {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f},
+ {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f},
+ {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f}
+ },
+ {
+ {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f},
+ {+0.344438f, -0.077598f, +0.050391f, +0.001368f, -0.000013f},
+ {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f},
+ {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f},
+ {-0.025938f, -0.166624f, -0.001223f, -0.000030f, +0.000004f},
+ {-0.087357f, +0.053855f, -0.006567f, -0.000375f, -0.000050f},
+ {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f},
+ {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f},
+ {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f}
+ },
+ {
+ {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f},
+ {-0.108559f, +0.623832f, -0.013156f, +0.000170f, +0.000033f},
+ {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f},
+ {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f},
+ {-0.042915f, -0.138441f, -0.007131f, -0.000079f, +0.000046f},
+ {+0.062416f, -0.169373f, +0.002459f, -0.000150f, +0.000033f},
+ {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f},
+ {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f},
+ {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f}
+ },
+ {
+ {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f},
+ {-0.334444f, +0.280705f, -0.047056f, -0.001250f, +0.000011f},
+ {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f},
+ {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f},
+ {+0.044996f, -0.004394f, +0.003024f, +0.000024f, -0.000007f},
+ {+0.022525f, -0.227369f, +0.001642f, +0.000313f, +0.000046f},
+ {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f},
+ {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f},
+ {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f}
+ },
+ {
+ {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f},
+ {+0.223672f, -0.578241f, +0.027233f, -0.000092f, -0.000035f},
+ {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f},
+ {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f},
+ {-0.013115f, +0.081785f, +0.000959f, -0.000079f, -0.000049f},
+ {-0.080738f, -0.072886f, -0.004201f, +0.000076f, -0.000042f},
+ {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f},
+ {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f},
+ {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f}
+ },
+ {
+ {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f},
+ {+0.267023f, -0.513414f, +0.037707f, +0.001150f, -0.000010f},
+ {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f},
+ {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f},
+ {-0.014195f, +0.075807f, -0.002631f, +0.000201f, +0.000012f},
+ {+0.053647f, +0.122427f, +0.002638f, -0.000093f, -0.000039f},
+ {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f},
+ {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f},
+ {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f}
+ },
+ {
+ {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f},
+ {-0.303693f, +0.362352f, -0.037014f, +0.000053f, +0.000037f},
+ {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f},
+ {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f},
+ {+0.032562f, -0.000305f, +0.004514f, -0.000019f, +0.000051f},
+ {+0.017941f, +0.163230f, +0.007036f, -0.000034f, +0.000051f},
+ {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f},
+ {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f},
+ {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f}
+ },
+ {
+ {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f},
+ {-0.168182f, +0.564851f, -0.028399f, -0.001136f, +0.000010f},
+ {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f},
+ {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f},
+ {-0.022063f, -0.085271f, -0.002211f, -0.000137f, -0.000019f},
+ {-0.049978f, +0.052230f, -0.005756f, -0.000013f, +0.000028f},
+ {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f},
+ {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f},
+ {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f}
+ },
+ {
+ {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f},
+ {+0.324241f, -0.201048f, +0.044886f, +0.000061f, -0.000040f},
+ {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f},
+ {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f},
+ {-0.028563f, -0.073381f, -0.002819f, -0.000106f, -0.000051f},
+ {+0.019828f, -0.052279f, +0.002320f, -0.000130f, -0.000057f},
+ {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f},
+ {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f},
+ {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f}
+ },
+ {
+ {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f},
+ {+0.096022f, -0.555951f, +0.014099f, +0.001080f, -0.000009f},
+ {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f},
+ {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f},
+ {+0.054876f, +0.054232f, +0.005942f, +0.000155f, +0.000026f},
+ {+0.020865f, -0.046834f, +0.005114f, +0.000034f, -0.000016f},
+ {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f},
+ {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f},
+ {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f}
+ },
+ {
+ {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f},
+ {-0.335689f, +0.108899f, -0.045170f, -0.000116f, +0.000044f},
+ {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f},
+ {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f},
+ {+0.005167f, +0.128785f, -0.000940f, +0.000138f, +0.000050f},
+ {-0.023264f, +0.025419f, -0.006527f, +0.000284f, +0.000058f},
+ {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f},
+ {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f},
+ {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f}
+ },
+ {
+ {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f},
+ {-0.030738f, +0.578245f, -0.004213f, -0.001069f, +0.000007f},
+ {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f},
+ {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f},
+ {-0.076224f, +0.003106f, -0.010057f, -0.000063f, -0.000032f},
+ {-0.005937f, +0.057510f, -0.000360f, +0.000077f, +0.000005f},
+ {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f},
+ {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f},
+ {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f}
+ },
+ {
+ {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f},
+ {+0.340086f, +0.006265f, +0.046602f, +0.000169f, -0.000048f},
+ {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f},
+ {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f},
+ {+0.033809f, -0.166438f, +0.006399f, -0.000195f, -0.000048f},
+ {+0.027146f, +0.011761f, +0.003177f, -0.000395f, -0.000056f},
+ {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f},
+ {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f},
+ {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f}
+ },
+ {
+ {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f},
+ {-0.034060f, -0.568731f, -0.004971f, +0.001035f, -0.000004f},
+ {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f},
+ {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f},
+ {+0.073934f, -0.106271f, +0.009079f, +0.000021f, +0.000038f},
+ {-0.016227f, -0.051899f, +0.000373f, -0.000148f, +0.000001f},
+ {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f},
+ {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f},
+ {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f}
+ },
+ {
+ {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f},
+ {-0.332610f, -0.106477f, -0.046382f, -0.000181f, +0.000052f},
+ {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f},
+ {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f},
+ {-0.071871f, +0.114351f, -0.009162f, +0.000197f, +0.000047f},
+ {-0.013433f, -0.054663f, -0.003535f, +0.000343f, +0.000057f},
+ {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f},
+ {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f},
+ {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f}
+ },
+ {
+ {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f},
+ {+0.092222f, +0.547291f, +0.014252f, -0.000986f, +0.000001f},
+ {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f},
+ {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f},
+ {-0.047272f, +0.147189f, -0.008626f, -0.000053f, -0.000044f},
+ {+0.026008f, +0.007599f, +0.001975f, +0.000132f, -0.000005f},
+ {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f},
+ {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f},
+ {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f}
+ },
+ {
+ {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f},
+ {+0.321912f, +0.191063f, +0.044992f, +0.000193f, -0.000056f},
+ {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f},
+ {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f},
+ {+0.084811f, -0.059741f, +0.013684f, -0.000183f, -0.000048f},
+ {-0.004452f, +0.055305f, +0.000514f, -0.000261f, -0.000064f},
+ {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f},
+ {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f},
+ {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f}
+ },
+ {
+ {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f},
+ {-0.151967f, -0.538951f, -0.023953f, +0.000917f, +0.000002f},
+ {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f},
+ {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f},
+ {+0.030147f, -0.144364f, +0.004637f, +0.000155f, +0.000054f},
+ {-0.022610f, +0.026139f, -0.001896f, +0.000081f, +0.000015f},
+ {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f},
+ {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f},
+ {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f}
+ },
+ {
+ {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f},
+ {-0.305017f, -0.302445f, -0.041503f, -0.000225f, +0.000061f},
+ {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f},
+ {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f},
+ {-0.099074f, +0.056676f, -0.015836f, +0.000238f, +0.000049f},
+ {+0.015365f, -0.033058f, +0.001023f, +0.000263f, +0.000075f},
+ {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f},
+ {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f},
+ {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f}
+ },
+ {
+ {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f},
+ {+0.220330f, +0.504684f, +0.033230f, -0.000874f, -0.000003f},
+ {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f},
+ {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f},
+ {-0.011044f, +0.195618f, +0.000221f, -0.000284f, -0.000070f},
+ {+0.015206f, -0.030774f, +0.001584f, -0.000377f, -0.000037f},
+ {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f},
+ {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f},
+ {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f}
+ },
+ {
+ {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f},
+ {+0.265346f, +0.433349f, +0.035911f, +0.000309f, -0.000070f},
+ {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f},
+ {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f},
+ {+0.118431f, -0.000422f, +0.015867f, -0.000387f, -0.000045f},
+ {-0.018068f, +0.023258f, -0.002724f, -0.000522f, -0.000082f},
+ {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f},
+ {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f},
+ {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f}
+ },
+ {
+ {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f},
+ {-0.281798f, -0.406628f, -0.041589f, +0.000891f, +0.000005f},
+ {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f},
+ {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f},
+ {-0.027666f, -0.223189f, -0.003521f, +0.000300f, +0.000093f},
+ {-0.013844f, +0.028875f, -0.000557f, +0.000575f, +0.000072f},
+ {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f},
+ {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f},
+ {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f}
+ },
+ {
+ {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f},
+ {-0.203795f, -0.522732f, -0.028158f, -0.000411f, +0.000085f},
+ {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f},
+ {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f},
+ {-0.117838f, -0.083303f, -0.016703f, +0.000616f, +0.000028f},
+ {+0.023412f, -0.030837f, +0.004021f, +0.001018f, +0.000071f},
+ {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f},
+ {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f},
+ {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f}
+ },
+ {
+ {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f},
+ {+0.322019f, +0.286370f, +0.048482f, -0.000959f, -0.000014f},
+ {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f},
+ {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f},
+ {+0.067347f, +0.202691f, +0.009894f, -0.000124f, -0.000115f},
+ {+0.015081f, -0.042971f, +0.000082f, -0.000445f, -0.000114f},
+ {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f},
+ {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f},
+ {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f}
+ },
+ {
+ {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f},
+ {+0.134884f, +0.571706f, +0.018454f, +0.000373f, -0.000105f},
+ {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f},
+ {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f},
+ {+0.098520f, +0.155744f, +0.013412f, -0.000754f, +0.000004f},
+ {-0.039536f, +0.043110f, -0.005899f, -0.001509f, -0.000034f},
+ {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f},
+ {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f},
+ {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f}
+ },
+ {
+ {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f},
+ {-0.342354f, -0.162255f, -0.051635f, +0.001110f, +0.000034f},
+ {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f},
+ {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f},
+ {-0.096594f, -0.143573f, -0.013193f, -0.000234f, +0.000126f},
+ {-0.002506f, +0.100103f, +0.002757f, -0.000120f, +0.000144f},
+ {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f},
+ {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f},
+ {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f}
+ },
+ {
+ {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f},
+ {-0.067107f, -0.583553f, -0.008494f, -0.000150f, +0.000126f},
+ {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f},
+ {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f},
+ {-0.067365f, -0.187138f, -0.009613f, +0.000522f, -0.000049f},
+ {+0.053548f, +0.014546f, +0.006738f, +0.001557f, -0.000028f},
+ {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f},
+ {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f},
+ {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f}
+ },
+ {
+ {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f},
+ {+0.348741f, +0.055377f, +0.052852f, -0.001109f, -0.000070f},
+ {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f},
+ {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f},
+ {+0.107002f, +0.082667f, +0.016074f, +0.000429f, -0.000116f},
+ {-0.027699f, -0.106463f, -0.004855f, +0.000830f, -0.000144f},
+ {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f},
+ {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f},
+ {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f}
+ },
+ {
+ {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f},
+ {+0.002104f, +0.586753f, -0.000310f, -0.000388f, -0.000138f},
+ {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f},
+ {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f},
+ {+0.041057f, +0.183900f, +0.003084f, +0.000869f, +0.000096f},
+ {-0.043480f, -0.079977f, -0.008525f, -0.000104f, +0.000100f},
+ {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f},
+ {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f},
+ {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f}
+ },
+ {
+ {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f},
+ {-0.346528f, +0.051746f, -0.052277f, +0.000401f, +0.000122f},
+ {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f},
+ {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f},
+ {-0.107847f, -0.047702f, -0.019644f, +0.000097f, +0.000079f},
+ {+0.051228f, +0.061068f, +0.003689f, -0.001630f, +0.000102f},
+ {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f},
+ {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f},
+ {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f}
+ }
+};
+
+#endif
+
+#ifdef UPDATE_SBA_FILTER
+
+const float FASTCONV_FOA_latency_s = 0.000666667f;
+const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]=
+{
+ {
+ {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f},
+ {+0.000414f, +0.262095f, -0.237214f, -0.003224f, +0.000036f},
+ {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f},
+ {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f}
+ },
+ {
+ {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f},
+ {-0.018683f, +0.673324f, +0.155049f, +0.004529f, -0.000042f},
+ {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f},
+ {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f}
+ },
+ {
+ {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f},
+ {+0.098922f, +0.785742f, +0.002391f, +0.001725f, -0.000029f},
+ {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f},
+ {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f}
+ },
+ {
+ {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f},
+ {-0.238766f, +0.395418f, +0.032160f, -0.006283f, +0.000045f},
+ {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f},
+ {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f}
+ },
+ {
+ {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f},
+ {+0.294065f, -0.334693f, -0.019103f, +0.002511f, +0.000020f},
+ {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f},
+ {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f}
+ },
+ {
+ {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f},
+ {-0.095935f, -0.863498f, -0.010369f, +0.003299f, -0.000045f},
+ {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f},
+ {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f}
+ },
+ {
+ {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f},
+ {-0.244664f, -0.595158f, -0.023888f, -0.002491f, -0.000012f},
+ {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f},
+ {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f}
+ },
+ {
+ {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f},
+ {+0.330585f, +0.291160f, +0.047010f, -0.002016f, +0.000043f},
+ {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f},
+ {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f}
+ },
+ {
+ {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f},
+ {+0.007222f, +0.769639f, -0.001057f, +0.002043f, +0.000007f},
+ {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f},
+ {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f}
+ },
+ {
+ {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f},
+ {-0.349211f, +0.214703f, -0.051501f, +0.001478f, -0.000039f},
+ {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f},
+ {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f}
+ },
+ {
+ {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f},
+ {+0.196316f, -0.613847f, +0.027133f, -0.001726f, -0.000004f},
+ {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f},
+ {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f}
+ },
+ {
+ {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f},
+ {+0.248916f, -0.524024f, +0.041690f, -0.001135f, +0.000035f},
+ {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f},
+ {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f}
+ },
+ {
+ {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f},
+ {-0.308141f, +0.332951f, -0.045686f, +0.001496f, +0.000003f},
+ {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f},
+ {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f}
+ },
+ {
+ {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f},
+ {-0.118379f, +0.623008f, -0.023288f, +0.000858f, -0.000032f},
+ {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f},
+ {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f}
+ },
+ {
+ {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f},
+ {+0.342800f, -0.086499f, +0.051427f, -0.001312f, -0.000004f},
+ {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f},
+ {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f}
+ },
+ {
+ {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f},
+ {+0.005671f, -0.604318f, +0.007143f, -0.000660f, +0.000031f},
+ {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f},
+ {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f}
+ },
+ {
+ {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f},
+ {-0.337478f, -0.074281f, -0.052432f, +0.001197f, +0.000005f},
+ {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f},
+ {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f}
+ },
+ {
+ {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f},
+ {+0.079743f, +0.570802f, +0.007521f, +0.000528f, -0.000032f},
+ {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f},
+ {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f}
+ },
+ {
+ {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f},
+ {+0.324392f, +0.195009f, +0.049761f, -0.001141f, -0.000005f},
+ {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f},
+ {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f}
+ },
+ {
+ {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f},
+ {-0.158828f, -0.551737f, -0.020300f, -0.000447f, +0.000034f},
+ {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f},
+ {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f}
+ },
+ {
+ {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f},
+ {-0.301948f, -0.334020f, -0.045105f, +0.001128f, +0.000004f},
+ {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f},
+ {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f}
+ },
+ {
+ {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f},
+ {+0.241474f, +0.503493f, +0.031717f, +0.000352f, -0.000035f},
+ {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f},
+ {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f}
+ },
+ {
+ {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f},
+ {+0.256327f, +0.482583f, +0.037542f, -0.001057f, -0.000002f},
+ {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f},
+ {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f}
+ },
+ {
+ {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f},
+ {-0.319981f, -0.404727f, -0.042569f, -0.000317f, +0.000036f},
+ {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f},
+ {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f}
+ },
+ {
+ {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f},
+ {-0.177073f, -0.627220f, -0.025260f, +0.001022f, +0.000001f},
+ {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f},
+ {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f}
+ },
+ {
+ {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f},
+ {+0.369344f, +0.211212f, +0.048775f, +0.000225f, -0.000037f},
+ {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f},
+ {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f}
+ },
+ {
+ {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f},
+ {+0.077934f, +0.656141f, +0.014760f, -0.000940f, -0.000001f},
+ {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f},
+ {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f}
+ },
+ {
+ {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f},
+ {-0.369662f, -0.037217f, -0.051825f, -0.000167f, +0.000038f},
+ {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f},
+ {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f}
+ },
+ {
+ {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f},
+ {-0.003228f, -0.602938f, -0.001617f, +0.000911f, +0.000001f},
+ {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f},
+ {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f}
+ },
+ {
+ {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f},
+ {+0.357292f, -0.046143f, +0.050921f, +0.000098f, -0.000041f},
+ {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f},
+ {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f}
+ },
+ {
+ {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f},
+ {-0.054628f, +0.590170f, -0.008056f, -0.000909f, +0.000000f},
+ {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f},
+ {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f}
+ },
+ {
+ {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f},
+ {-0.346201f, +0.142031f, -0.048180f, -0.000046f, +0.000045f},
+ {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f},
+ {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f}
+ },
+ {
+ {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f},
+ {+0.112390f, -0.563014f, +0.016093f, +0.000905f, -0.000002f},
+ {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f},
+ {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f}
+ },
+ {
+ {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f},
+ {+0.325943f, -0.233378f, +0.045604f, +0.000052f, -0.000049f},
+ {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f},
+ {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f}
+ },
+ {
+ {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f},
+ {-0.163937f, +0.519986f, -0.024102f, -0.000910f, +0.000006f},
+ {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f},
+ {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f}
+ },
+ {
+ {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f},
+ {-0.301209f, +0.307267f, -0.042244f, -0.000061f, +0.000052f},
+ {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f},
+ {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f}
+ },
+ {
+ {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f},
+ {+0.211902f, -0.482439f, +0.031812f, +0.000875f, -0.000009f},
+ {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f},
+ {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f}
+ },
+ {
+ {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f},
+ {+0.273278f, -0.387323f, +0.037577f, +0.000065f, -0.000055f},
+ {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f},
+ {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f}
+ },
+ {
+ {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f},
+ {-0.262381f, +0.436199f, -0.039035f, -0.000825f, +0.000011f},
+ {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f},
+ {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f}
+ },
+ {
+ {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f},
+ {-0.233172f, +0.480676f, -0.031122f, -0.000031f, +0.000060f},
+ {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f},
+ {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f}
+ },
+ {
+ {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f},
+ {+0.309890f, -0.352443f, +0.045041f, +0.000820f, -0.000012f},
+ {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f},
+ {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f}
+ },
+ {
+ {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f},
+ {+0.176248f, -0.555316f, +0.023664f, -0.000054f, -0.000070f},
+ {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f},
+ {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f}
+ },
+ {
+ {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f},
+ {-0.341487f, +0.240296f, -0.050133f, -0.000895f, +0.000016f},
+ {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f},
+ {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f}
+ },
+ {
+ {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f},
+ {-0.112835f, +0.589997f, -0.014321f, +0.000122f, +0.000086f},
+ {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f},
+ {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f}
+ },
+ {
+ {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f},
+ {+0.356933f, -0.130812f, +0.052103f, +0.001044f, -0.000027f},
+ {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f},
+ {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f}
+ },
+ {
+ {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f},
+ {+0.049349f, -0.600329f, +0.005605f, -0.000022f, -0.000106f},
+ {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f},
+ {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f}
+ },
+ {
+ {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f},
+ {-0.358893f, +0.027640f, -0.053272f, -0.001258f, +0.000053f},
+ {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f},
+ {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f}
+ },
+ {
+ {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f},
+ {+0.010355f, +0.593074f, +0.003536f, -0.000223f, +0.000122f},
+ {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f},
+ {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f}
+ },
+ {
+ {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f},
+ {+0.352731f, +0.066640f, +0.052836f, +0.001159f, -0.000094f},
+ {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f},
+ {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f}
+ },
+ {
+ {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f},
+ {-0.069318f, -0.580051f, -0.011694f, +0.000718f, -0.000126f},
+ {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f},
+ {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f}
+ }
+};
+
+const float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]=
+{
+ {
+ {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f},
+ {-0.113351f, +0.312423f, -0.154809f, +0.003274f, -0.000040f},
+ {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f},
+ {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f}
+ },
+ {
+ {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f},
+ {+0.119871f, +0.624601f, -0.192908f, +0.005870f, -0.000033f},
+ {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f},
+ {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f}
+ },
+ {
+ {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f},
+ {-0.144265f, +0.722990f, +0.063761f, -0.009098f, +0.000044f},
+ {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f},
+ {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f}
+ },
+ {
+ {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f},
+ {+0.105041f, +0.913298f, +0.007994f, +0.001561f, +0.000024f},
+ {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f},
+ {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f}
+ },
+ {
+ {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f},
+ {+0.092604f, +0.883373f, +0.024383f, +0.004737f, -0.000046f},
+ {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f},
+ {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f}
+ },
+ {
+ {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f},
+ {-0.315234f, +0.274804f, -0.039014f, -0.001908f, -0.000016f},
+ {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f},
+ {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f}
+ },
+ {
+ {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f},
+ {+0.252202f, -0.571430f, +0.010069f, -0.002911f, +0.000045f},
+ {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f},
+ {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f}
+ },
+ {
+ {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f},
+ {+0.124742f, -0.753308f, +0.025384f, +0.001863f, +0.000009f},
+ {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f},
+ {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f}
+ },
+ {
+ {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f},
+ {-0.364681f, +0.008978f, -0.038744f, +0.001757f, -0.000041f},
+ {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f},
+ {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f}
+ },
+ {
+ {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f},
+ {+0.106790f, +0.737079f, +0.007371f, -0.001552f, -0.000005f},
+ {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f},
+ {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f}
+ },
+ {
+ {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f},
+ {+0.311637f, +0.412036f, +0.037367f, -0.001208f, +0.000037f},
+ {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f},
+ {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f}
+ },
+ {
+ {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f},
+ {-0.266046f, -0.483755f, -0.030591f, +0.001325f, +0.000003f},
+ {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f},
+ {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f}
+ },
+ {
+ {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f},
+ {-0.186453f, -0.597236f, -0.023398f, +0.000963f, -0.000033f},
+ {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f},
+ {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f}
+ },
+ {
+ {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f},
+ {+0.334574f, +0.214167f, +0.043236f, -0.001215f, -0.000003f},
+ {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f},
+ {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f}
+ },
+ {
+ {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f},
+ {+0.060956f, +0.629530f, +0.006506f, -0.000817f, +0.000032f},
+ {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f},
+ {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f}
+ },
+ {
+ {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f},
+ {-0.343709f, -0.003857f, -0.048079f, +0.001153f, +0.000004f},
+ {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f},
+ {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f}
+ },
+ {
+ {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f},
+ {+0.036841f, -0.588874f, +0.009139f, +0.000664f, -0.000032f},
+ {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f},
+ {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f}
+ },
+ {
+ {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f},
+ {+0.332318f, -0.127083f, +0.047424f, -0.001052f, -0.000005f},
+ {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f},
+ {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f}
+ },
+ {
+ {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f},
+ {-0.116623f, +0.564310f, -0.021854f, -0.000528f, +0.000033f},
+ {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f},
+ {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f}
+ },
+ {
+ {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f},
+ {-0.316139f, +0.253384f, -0.044455f, +0.000945f, +0.000004f},
+ {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f},
+ {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f}
+ },
+ {
+ {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f},
+ {+0.197969f, -0.536807f, +0.033309f, +0.000398f, -0.000034f},
+ {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f},
+ {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f}
+ },
+ {
+ {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f},
+ {+0.283217f, -0.402227f, +0.039413f, -0.000851f, -0.000003f},
+ {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f},
+ {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f}
+ },
+ {
+ {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f},
+ {-0.280104f, +0.464455f, -0.045587f, -0.000282f, +0.000035f},
+ {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f},
+ {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f}
+ },
+ {
+ {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f},
+ {-0.221871f, +0.553999f, -0.029769f, +0.000764f, +0.000002f},
+ {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f},
+ {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f}
+ },
+ {
+ {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f},
+ {+0.348987f, -0.318713f, +0.051856f, +0.000239f, -0.000036f},
+ {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f},
+ {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f}
+ },
+ {
+ {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f},
+ {+0.127167f, -0.654253f, +0.018462f, -0.000765f, -0.000001f},
+ {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f},
+ {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f}
+ },
+ {
+ {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f},
+ {-0.372361f, +0.111338f, -0.055931f, -0.000147f, +0.000037f},
+ {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f},
+ {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f}
+ },
+ {
+ {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f},
+ {-0.036763f, +0.621232f, -0.007074f, +0.000670f, +0.000001f},
+ {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f},
+ {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f}
+ },
+ {
+ {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f},
+ {+0.361014f, +0.007604f, +0.057275f, +0.000179f, -0.000039f},
+ {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f},
+ {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f}
+ },
+ {
+ {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f},
+ {-0.025615f, -0.586847f, -0.004514f, -0.000654f, -0.000000f},
+ {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f},
+ {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f}
+ },
+ {
+ {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f},
+ {-0.350970f, -0.090433f, -0.053929f, -0.000134f, +0.000043f},
+ {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f},
+ {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f}
+ },
+ {
+ {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f},
+ {+0.083743f, +0.574149f, +0.012466f, +0.000576f, -0.000001f},
+ {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f},
+ {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f}
+ },
+ {
+ {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f},
+ {+0.335556f, +0.189122f, +0.052026f, +0.000094f, -0.000047f},
+ {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f},
+ {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f}
+ },
+ {
+ {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f},
+ {-0.138949f, -0.536439f, -0.020095f, -0.000522f, +0.000004f},
+ {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f},
+ {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f}
+ },
+ {
+ {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f},
+ {-0.312281f, -0.270728f, -0.048992f, -0.000017f, +0.000050f},
+ {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f},
+ {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f}
+ },
+ {
+ {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f},
+ {+0.187767f, +0.495269f, +0.027755f, +0.000490f, -0.000007f},
+ {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f},
+ {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f}
+ },
+ {
+ {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f},
+ {+0.286682f, +0.344540f, +0.044785f, -0.000053f, -0.000053f},
+ {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f},
+ {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f}
+ },
+ {
+ {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f},
+ {-0.236813f, -0.457491f, -0.035054f, -0.000497f, +0.000010f},
+ {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f},
+ {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f}
+ },
+ {
+ {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f},
+ {-0.254039f, -0.432758f, -0.039405f, +0.000094f, +0.000057f},
+ {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f},
+ {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f}
+ },
+ {
+ {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f},
+ {+0.287453f, +0.396154f, +0.041796f, +0.000496f, -0.000012f},
+ {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f},
+ {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f}
+ },
+ {
+ {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f},
+ {+0.205090f, +0.523697f, +0.032347f, -0.000074f, -0.000064f},
+ {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f},
+ {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f}
+ },
+ {
+ {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f},
+ {-0.328142f, -0.292452f, -0.047271f, -0.000442f, +0.000014f},
+ {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f},
+ {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f}
+ },
+ {
+ {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f},
+ {-0.143455f, -0.576024f, -0.024058f, +0.000023f, +0.000077f},
+ {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f},
+ {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f}
+ },
+ {
+ {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f},
+ {+0.351200f, +0.182575f, +0.051390f, +0.000326f, -0.000020f},
+ {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f},
+ {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f}
+ },
+ {
+ {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f},
+ {+0.079531f, +0.601014f, +0.014699f, -0.000081f, -0.000095f},
+ {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f},
+ {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f}
+ },
+ {
+ {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f},
+ {-0.359514f, -0.071785f, -0.052488f, -0.000127f, +0.000038f},
+ {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f},
+ {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f}
+ },
+ {
+ {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f},
+ {-0.017715f, -0.598148f, -0.005426f, +0.000313f, +0.000115f},
+ {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f},
+ {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f}
+ },
+ {
+ {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f},
+ {+0.356902f, -0.024523f, +0.052188f, +0.000031f, -0.000071f},
+ {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f},
+ {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f}
+ },
+ {
+ {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f},
+ {-0.041065f, +0.588511f, -0.002930f, -0.000807f, -0.000127f},
+ {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f},
+ {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f}
+ },
+ {
+ {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f},
+ {-0.347235f, +0.120486f, -0.050411f, -0.000521f, +0.000120f},
+ {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f},
+ {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f}
+ }
+};
+
+const float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]=
+{
+ {
+ {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f},
+ {-0.000414f, -0.262095f, +0.237214f, +0.003224f, -0.000036f},
+ {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f},
+ {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f}
+ },
+ {
+ {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f},
+ {+0.018683f, -0.673324f, -0.155049f, -0.004529f, +0.000042f},
+ {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f},
+ {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f}
+ },
+ {
+ {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f},
+ {-0.098922f, -0.785742f, -0.002391f, -0.001725f, +0.000029f},
+ {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f},
+ {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f}
+ },
+ {
+ {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f},
+ {+0.238766f, -0.395418f, -0.032160f, +0.006283f, -0.000045f},
+ {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f},
+ {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f}
+ },
+ {
+ {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f},
+ {-0.294065f, +0.334693f, +0.019103f, -0.002511f, -0.000020f},
+ {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f},
+ {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f}
+ },
+ {
+ {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f},
+ {+0.095935f, +0.863498f, +0.010369f, -0.003299f, +0.000045f},
+ {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f},
+ {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f}
+ },
+ {
+ {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f},
+ {+0.244664f, +0.595158f, +0.023888f, +0.002491f, +0.000012f},
+ {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f},
+ {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f}
+ },
+ {
+ {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f},
+ {-0.330585f, -0.291160f, -0.047010f, +0.002016f, -0.000043f},
+ {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f},
+ {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f}
+ },
+ {
+ {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f},
+ {-0.007222f, -0.769639f, +0.001057f, -0.002043f, -0.000007f},
+ {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f},
+ {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f}
+ },
+ {
+ {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f},
+ {+0.349211f, -0.214703f, +0.051501f, -0.001478f, +0.000039f},
+ {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f},
+ {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f}
+ },
+ {
+ {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f},
+ {-0.196316f, +0.613847f, -0.027133f, +0.001726f, +0.000004f},
+ {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f},
+ {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f}
+ },
+ {
+ {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f},
+ {-0.248916f, +0.524024f, -0.041690f, +0.001135f, -0.000035f},
+ {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f},
+ {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f}
+ },
+ {
+ {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f},
+ {+0.308141f, -0.332951f, +0.045686f, -0.001496f, -0.000003f},
+ {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f},
+ {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f}
+ },
+ {
+ {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f},
+ {+0.118379f, -0.623008f, +0.023288f, -0.000858f, +0.000032f},
+ {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f},
+ {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f}
+ },
+ {
+ {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f},
+ {-0.342800f, +0.086499f, -0.051427f, +0.001312f, +0.000004f},
+ {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f},
+ {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f}
+ },
+ {
+ {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f},
+ {-0.005671f, +0.604318f, -0.007143f, +0.000660f, -0.000031f},
+ {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f},
+ {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f}
+ },
+ {
+ {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f},
+ {+0.337478f, +0.074281f, +0.052432f, -0.001197f, -0.000005f},
+ {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f},
+ {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f}
+ },
+ {
+ {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f},
+ {-0.079743f, -0.570802f, -0.007521f, -0.000528f, +0.000032f},
+ {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f},
+ {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f}
+ },
+ {
+ {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f},
+ {-0.324392f, -0.195009f, -0.049761f, +0.001141f, +0.000005f},
+ {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f},
+ {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f}
+ },
+ {
+ {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f},
+ {+0.158828f, +0.551737f, +0.020300f, +0.000447f, -0.000034f},
+ {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f},
+ {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f}
+ },
+ {
+ {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f},
+ {+0.301948f, +0.334020f, +0.045105f, -0.001128f, -0.000004f},
+ {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f},
+ {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f}
+ },
+ {
+ {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f},
+ {-0.241474f, -0.503493f, -0.031717f, -0.000352f, +0.000035f},
+ {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f},
+ {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f}
+ },
+ {
+ {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f},
+ {-0.256327f, -0.482583f, -0.037542f, +0.001057f, +0.000002f},
+ {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f},
+ {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f}
+ },
+ {
+ {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f},
+ {+0.319981f, +0.404727f, +0.042569f, +0.000317f, -0.000036f},
+ {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f},
+ {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f}
+ },
+ {
+ {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f},
+ {+0.177073f, +0.627220f, +0.025260f, -0.001022f, -0.000001f},
+ {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f},
+ {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f}
+ },
+ {
+ {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f},
+ {-0.369344f, -0.211212f, -0.048775f, -0.000225f, +0.000037f},
+ {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f},
+ {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f}
+ },
+ {
+ {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f},
+ {-0.077934f, -0.656141f, -0.014760f, +0.000940f, +0.000001f},
+ {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f},
+ {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f}
+ },
+ {
+ {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f},
+ {+0.369662f, +0.037217f, +0.051825f, +0.000167f, -0.000038f},
+ {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f},
+ {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f}
+ },
+ {
+ {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f},
+ {+0.003228f, +0.602938f, +0.001617f, -0.000911f, -0.000001f},
+ {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f},
+ {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f}
+ },
+ {
+ {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f},
+ {-0.357292f, +0.046143f, -0.050921f, -0.000098f, +0.000041f},
+ {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f},
+ {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f}
+ },
+ {
+ {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f},
+ {+0.054628f, -0.590170f, +0.008056f, +0.000909f, -0.000000f},
+ {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f},
+ {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f}
+ },
+ {
+ {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f},
+ {+0.346201f, -0.142031f, +0.048180f, +0.000046f, -0.000045f},
+ {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f},
+ {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f}
+ },
+ {
+ {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f},
+ {-0.112390f, +0.563014f, -0.016093f, -0.000905f, +0.000002f},
+ {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f},
+ {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f}
+ },
+ {
+ {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f},
+ {-0.325943f, +0.233378f, -0.045604f, -0.000052f, +0.000049f},
+ {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f},
+ {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f}
+ },
+ {
+ {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f},
+ {+0.163937f, -0.519986f, +0.024102f, +0.000910f, -0.000006f},
+ {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f},
+ {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f}
+ },
+ {
+ {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f},
+ {+0.301209f, -0.307267f, +0.042244f, +0.000061f, -0.000052f},
+ {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f},
+ {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f}
+ },
+ {
+ {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f},
+ {-0.211902f, +0.482439f, -0.031812f, -0.000875f, +0.000009f},
+ {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f},
+ {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f}
+ },
+ {
+ {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f},
+ {-0.273278f, +0.387323f, -0.037577f, -0.000065f, +0.000055f},
+ {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f},
+ {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f}
+ },
+ {
+ {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f},
+ {+0.262381f, -0.436199f, +0.039035f, +0.000825f, -0.000011f},
+ {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f},
+ {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f}
+ },
+ {
+ {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f},
+ {+0.233172f, -0.480676f, +0.031122f, +0.000031f, -0.000060f},
+ {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f},
+ {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f}
+ },
+ {
+ {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f},
+ {-0.309890f, +0.352443f, -0.045041f, -0.000820f, +0.000012f},
+ {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f},
+ {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f}
+ },
+ {
+ {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f},
+ {-0.176248f, +0.555316f, -0.023664f, +0.000054f, +0.000070f},
+ {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f},
+ {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f}
+ },
+ {
+ {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f},
+ {+0.341487f, -0.240296f, +0.050133f, +0.000895f, -0.000016f},
+ {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f},
+ {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f}
+ },
+ {
+ {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f},
+ {+0.112835f, -0.589997f, +0.014321f, -0.000122f, -0.000086f},
+ {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f},
+ {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f}
+ },
+ {
+ {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f},
+ {-0.356933f, +0.130812f, -0.052103f, -0.001044f, +0.000027f},
+ {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f},
+ {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f}
+ },
+ {
+ {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f},
+ {-0.049349f, +0.600329f, -0.005605f, +0.000022f, +0.000106f},
+ {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f},
+ {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f}
+ },
+ {
+ {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f},
+ {+0.358893f, -0.027640f, +0.053272f, +0.001258f, -0.000053f},
+ {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f},
+ {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f}
+ },
+ {
+ {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f},
+ {-0.010355f, -0.593074f, -0.003536f, +0.000223f, -0.000122f},
+ {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f},
+ {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f}
+ },
+ {
+ {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f},
+ {-0.352731f, -0.066640f, -0.052836f, -0.001159f, +0.000094f},
+ {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f},
+ {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f}
+ },
+ {
+ {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f},
+ {+0.069318f, +0.580051f, +0.011694f, -0.000718f, +0.000126f},
+ {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f},
+ {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f}
+ }
+};
+
+const float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]=
+{
+ {
+ {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f},
+ {+0.113351f, -0.312423f, +0.154809f, -0.003274f, +0.000040f},
+ {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f},
+ {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f}
+ },
+ {
+ {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f},
+ {-0.119871f, -0.624601f, +0.192908f, -0.005870f, +0.000033f},
+ {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f},
+ {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f}
+ },
+ {
+ {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f},
+ {+0.144265f, -0.722990f, -0.063761f, +0.009098f, -0.000044f},
+ {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f},
+ {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f}
+ },
+ {
+ {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f},
+ {-0.105041f, -0.913298f, -0.007994f, -0.001561f, -0.000024f},
+ {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f},
+ {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f}
+ },
+ {
+ {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f},
+ {-0.092604f, -0.883373f, -0.024383f, -0.004737f, +0.000046f},
+ {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f},
+ {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f}
+ },
+ {
+ {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f},
+ {+0.315234f, -0.274804f, +0.039014f, +0.001908f, +0.000016f},
+ {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f},
+ {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f}
+ },
+ {
+ {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f},
+ {-0.252202f, +0.571430f, -0.010069f, +0.002911f, -0.000045f},
+ {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f},
+ {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f}
+ },
+ {
+ {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f},
+ {-0.124742f, +0.753308f, -0.025384f, -0.001863f, -0.000009f},
+ {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f},
+ {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f}
+ },
+ {
+ {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f},
+ {+0.364681f, -0.008978f, +0.038744f, -0.001757f, +0.000041f},
+ {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f},
+ {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f}
+ },
+ {
+ {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f},
+ {-0.106790f, -0.737079f, -0.007371f, +0.001552f, +0.000005f},
+ {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f},
+ {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f}
+ },
+ {
+ {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f},
+ {-0.311637f, -0.412036f, -0.037367f, +0.001208f, -0.000037f},
+ {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f},
+ {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f}
+ },
+ {
+ {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f},
+ {+0.266046f, +0.483755f, +0.030591f, -0.001325f, -0.000003f},
+ {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f},
+ {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f}
+ },
+ {
+ {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f},
+ {+0.186453f, +0.597236f, +0.023398f, -0.000963f, +0.000033f},
+ {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f},
+ {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f}
+ },
+ {
+ {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f},
+ {-0.334574f, -0.214167f, -0.043236f, +0.001215f, +0.000003f},
+ {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f},
+ {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f}
+ },
+ {
+ {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f},
+ {-0.060956f, -0.629530f, -0.006506f, +0.000817f, -0.000032f},
+ {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f},
+ {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f}
+ },
+ {
+ {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f},
+ {+0.343709f, +0.003857f, +0.048079f, -0.001153f, -0.000004f},
+ {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f},
+ {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f}
+ },
+ {
+ {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f},
+ {-0.036841f, +0.588874f, -0.009139f, -0.000664f, +0.000032f},
+ {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f},
+ {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f}
+ },
+ {
+ {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f},
+ {-0.332318f, +0.127083f, -0.047424f, +0.001052f, +0.000005f},
+ {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f},
+ {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f}
+ },
+ {
+ {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f},
+ {+0.116623f, -0.564310f, +0.021854f, +0.000528f, -0.000033f},
+ {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f},
+ {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f}
+ },
+ {
+ {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f},
+ {+0.316139f, -0.253384f, +0.044455f, -0.000945f, -0.000004f},
+ {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f},
+ {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f}
+ },
+ {
+ {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f},
+ {-0.197969f, +0.536807f, -0.033309f, -0.000398f, +0.000034f},
+ {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f},
+ {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f}
+ },
+ {
+ {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f},
+ {-0.283217f, +0.402227f, -0.039413f, +0.000851f, +0.000003f},
+ {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f},
+ {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f}
+ },
+ {
+ {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f},
+ {+0.280104f, -0.464455f, +0.045587f, +0.000282f, -0.000035f},
+ {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f},
+ {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f}
+ },
+ {
+ {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f},
+ {+0.221871f, -0.553999f, +0.029769f, -0.000764f, -0.000002f},
+ {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f},
+ {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f}
+ },
+ {
+ {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f},
+ {-0.348987f, +0.318713f, -0.051856f, -0.000239f, +0.000036f},
+ {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f},
+ {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f}
+ },
+ {
+ {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f},
+ {-0.127167f, +0.654253f, -0.018462f, +0.000765f, +0.000001f},
+ {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f},
+ {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f}
+ },
+ {
+ {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f},
+ {+0.372361f, -0.111338f, +0.055931f, +0.000147f, -0.000037f},
+ {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f},
+ {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f}
+ },
+ {
+ {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f},
+ {+0.036763f, -0.621232f, +0.007074f, -0.000670f, -0.000001f},
+ {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f},
+ {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f}
+ },
+ {
+ {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f},
+ {-0.361014f, -0.007604f, -0.057275f, -0.000179f, +0.000039f},
+ {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f},
+ {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f}
+ },
+ {
+ {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f},
+ {+0.025615f, +0.586847f, +0.004514f, +0.000654f, +0.000000f},
+ {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f},
+ {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f}
+ },
+ {
+ {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f},
+ {+0.350970f, +0.090433f, +0.053929f, +0.000134f, -0.000043f},
+ {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f},
+ {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f}
+ },
+ {
+ {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f},
+ {-0.083743f, -0.574149f, -0.012466f, -0.000576f, +0.000001f},
+ {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f},
+ {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f}
+ },
+ {
+ {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f},
+ {-0.335556f, -0.189122f, -0.052026f, -0.000094f, +0.000047f},
+ {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f},
+ {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f}
+ },
+ {
+ {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f},
+ {+0.138949f, +0.536439f, +0.020095f, +0.000522f, -0.000004f},
+ {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f},
+ {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f}
+ },
+ {
+ {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f},
+ {+0.312281f, +0.270728f, +0.048992f, +0.000017f, -0.000050f},
+ {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f},
+ {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f}
+ },
+ {
+ {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f},
+ {-0.187767f, -0.495269f, -0.027755f, -0.000490f, +0.000007f},
+ {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f},
+ {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f}
+ },
+ {
+ {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f},
+ {-0.286682f, -0.344540f, -0.044785f, +0.000053f, +0.000053f},
+ {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f},
+ {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f}
+ },
+ {
+ {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f},
+ {+0.236813f, +0.457491f, +0.035054f, +0.000497f, -0.000010f},
+ {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f},
+ {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f}
+ },
+ {
+ {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f},
+ {+0.254039f, +0.432758f, +0.039405f, -0.000094f, -0.000057f},
+ {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f},
+ {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f}
+ },
+ {
+ {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f},
+ {-0.287453f, -0.396154f, -0.041796f, -0.000496f, +0.000012f},
+ {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f},
+ {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f}
+ },
+ {
+ {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f},
+ {-0.205090f, -0.523697f, -0.032347f, +0.000074f, +0.000064f},
+ {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f},
+ {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f}
+ },
+ {
+ {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f},
+ {+0.328142f, +0.292452f, +0.047271f, +0.000442f, -0.000014f},
+ {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f},
+ {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f}
+ },
+ {
+ {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f},
+ {+0.143455f, +0.576024f, +0.024058f, -0.000023f, -0.000077f},
+ {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f},
+ {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f}
+ },
+ {
+ {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f},
+ {-0.351200f, -0.182575f, -0.051390f, -0.000326f, +0.000020f},
+ {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f},
+ {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f}
+ },
+ {
+ {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f},
+ {-0.079531f, -0.601014f, -0.014699f, +0.000081f, +0.000095f},
+ {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f},
+ {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f}
+ },
+ {
+ {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f},
+ {+0.359514f, +0.071785f, +0.052488f, +0.000127f, -0.000038f},
+ {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f},
+ {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f}
+ },
+ {
+ {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f},
+ {+0.017715f, +0.598148f, +0.005426f, -0.000313f, -0.000115f},
+ {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f},
+ {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f}
+ },
+ {
+ {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f},
+ {-0.356902f, +0.024523f, -0.052188f, -0.000031f, +0.000071f},
+ {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f},
+ {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f}
+ },
+ {
+ {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f},
+ {+0.041065f, -0.588511f, +0.002930f, +0.000807f, +0.000127f},
+ {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f},
+ {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f}
+ },
+ {
+ {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f},
+ {+0.347235f, -0.120486f, +0.050411f, +0.000521f, -0.000120f},
+ {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f},
+ {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f}
+ }
+};
+
+#endif
+
const float FASTCONV_HRIR_latency_s = 0.000666667f;
const float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]=
{
@@ -44077,4 +51147,6 @@ const float parametricEarlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX] =
0.016350f, 0.042709f, 0.077337f, 0.066238f, 0.042046f, 0.020017f, 0.007896f, 0.002947f, 0.000932f, 0.000152f
};
+#undef WMC_TOOL_SKIP
+
/* clang-format on */
diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h
index 939f6ef78fa76c7b82a6755f985294490a26d1c8..26aae29319e9ee91544a1ef8c8724e036cf33243 100644
--- a/lib_rend/ivas_rom_binauralRenderer.h
+++ b/lib_rend/ivas_rom_binauralRenderer.h
@@ -48,6 +48,16 @@ extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT
extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
+#ifdef UPDATE_SBA_FILTER
+extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+extern float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+extern float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+extern float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+extern float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+extern float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+#endif
extern float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
extern float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
@@ -55,6 +65,10 @@ extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]
extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
extern float FASTCONV_HOA3_latency_s;
+#ifdef UPDATE_SBA_FILTER
+extern float FASTCONV_HOA2_latency_s;
+extern float FASTCONV_FOA_latency_s;
+#endif
extern float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS];
extern float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS];
diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c
index a57d7803783d776b3e8d3541622d72ec654092d5..16289a832e132106130d4705169743afce02fcbd 100644
--- a/lib_rend/ivas_rom_binaural_crend_head.c
+++ b/lib_rend/ivas_rom_binaural_crend_head.c
@@ -42,14 +42,25 @@
+#ifndef UPDATE_SBA_FILTER
#include
+#endif
#include
+#ifndef UPDATE_SBA_FILTER
#include "cnst.h"
+#endif
#include "ivas_cnst.h"
+/* clang-format off */
+
+#define WMC_TOOL_SKIP
+
+#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000
+
/********************** CRendBin_Combined_HRIR **********************/
-#ifdef FIX_BINAURAL_DELAY_PRECISION
+
+#ifdef UPDATE_SBA_FILTER
const float CRendBin_Combined_HRIR_latency_s = 0.000020834f;
#else
const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f;
@@ -642,10 +653,14 @@ const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={
};
const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */
+
+#ifndef UPDATE_SBA_FILTER
+
/********************** CRendBin_HOA3_HRIR **********************/
-#ifdef FIX_BINAURAL_DELAY_PRECISION
+#ifdef UPDATE_SBA_FILTER
const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f;
#else
const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f;
@@ -1594,10 +1609,1237 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]={
};
const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_FOA_HRIR **********************/
+
+#ifdef UPDATE_SBA_FILTER
+const float CRendBin_FOA_HRIR_latency_s = 0.000020834f;
+#else
+const float CRendBin_FOA_HRIR_latency_s = 0.000020833333110f;
+#endif
+
+/* Sample Rate = 48000 */
+
+const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1;
+const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}};
+const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0;
+const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]={
+ {
+ {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f,
+ -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f,
+ -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f},
+ {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f,
+ -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f,
+ -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f}
+ },
+ {
+ {0.069530f, 0.352738f, 0.714280f, 0.885288f, 0.713446f, 0.249298f, -0.318649f, -0.806052f, -1.124658f, -1.273893f, -1.286408f, -1.194906f, -1.028517f, -0.813598f, -0.570832f, -0.316123f, -0.064436f, 0.170206f, 0.377639f, 0.553010f, 0.696908f, 0.814493f, 0.911484f, 0.989435f, 1.046484f, 1.082848f, 1.103173f, 1.113184f, 1.116310f, 1.113920f, 1.106470f, 1.093611f, 1.074757f, 1.050402f, 1.022191f, 0.991595f, 0.959051f, 0.924074f, 0.885689f, 0.843261f, 0.797446f, 0.750023f, 0.702554f, 0.655685f, 0.609659f, 0.564706f, 0.520834f, 0.477976f, 0.436490f, 0.396954f, 0.359480f, 0.323618f, 0.288809f, 0.254673f, 0.221164f, 0.188708f, 0.157916f, 0.129070f, 0.102244f, 0.077759f, 0.055883f, 0.036223f, 0.018124f, 0.001473f, -0.013588f, -0.027502f, -0.041003f, -0.054210f, -0.066807f, -0.078910f, -0.090976f, -0.103076f, -0.114988f, -0.126900f, -0.139348f, -0.152546f, -0.166308f, -0.180589f, -0.195635f, -0.211564f, -0.228146f, -0.245089f, -0.262373f, -0.280192f, -0.298603f, -0.317350f, -0.336088f, -0.354672f, -0.373219f, -0.392122f, -0.412082f, -0.433737f, -0.456989f, -0.480976f, -0.504974f, -0.528975f,
+ -0.553152f, -0.577124f, -0.600047f, -0.621125f, -0.639881f, -0.656290f, -0.670723f, -0.683391f, -0.693803f, -0.701164f, -0.705315f, -0.706891f, -0.706661f, -0.705140f, -0.702740f, -0.699905f, -0.697104f, -0.694822f, -0.693380f, -0.692694f, -0.692541f, -0.693119f, -0.694952f, -0.698257f, -0.702754f, -0.707981f, -0.713393f, -0.718373f, -0.722645f, -0.726500f, -0.730288f, -0.733956f, -0.737383f, -0.740707f, -0.744006f, -0.747044f, -0.749626f, -0.751802f, -0.753644f, -0.755218f, -0.756809f, -0.758751f, -0.761058f, -0.763556f, -0.766202f, -0.768999f, -0.771906f, -0.775076f, -0.778852f, -0.783366f, -0.788481f, -0.794119f, -0.800196f, -0.806401f, -0.812542f, -0.818875f, -0.825636f, -0.832649f, -0.839808f, -0.847342f, -0.855190f, -0.862784f, -0.869788f, -0.876325f, -0.882332f, -0.887508f, -0.891946f, -0.895972f, -0.899482f, -0.902212f, -0.904315f, -0.905931f, -0.906830f, -0.907099f, -0.907371f, -0.907866f, -0.908254f, -0.908692f, -0.909708f, -0.910961f, -0.911524f, -0.911241f, -0.910472f, -0.909066f, -0.906977f, -0.904953f, -0.903361f, -0.901613f, -0.899703f, -0.898494f, -0.897842f, -0.896702f, -0.895299f, -0.894642f, -0.894316f, -0.893517f,
+ -0.893003f, -0.893248f, -0.893094f, -0.892684f, -0.893769f, -0.895229f, -0.894416f, -0.893811f, -0.897241f, -0.900009f, -0.896265f, -0.894143f, -0.903468f, -0.910502f, -0.893479f, -0.864358f, -0.859282f, -0.881749f, -0.897594f, -0.897013f, -0.910837f, -0.943680f, -0.945397f, -0.885614f, -0.810842f, -0.785450f, -0.810782f, -0.840026f, -0.841958f, -0.818240f, -0.787351f, -0.773027f, -0.771807f, -0.719767f, -0.550609f, -0.313730f, -0.167709f, -0.207926f, -0.353731f, -0.457636f, -0.477010f, -0.476826f, -0.500626f, -0.512220f, -0.460719f, -0.349140f, -0.228045f, -0.152067f},
+ {-0.069530f, -0.352738f, -0.714280f, -0.885288f, -0.713446f, -0.249298f, 0.318649f, 0.806052f, 1.124658f, 1.273893f, 1.286408f, 1.194906f, 1.028517f, 0.813598f, 0.570832f, 0.316123f, 0.064436f, -0.170206f, -0.377639f, -0.553010f, -0.696908f, -0.814493f, -0.911484f, -0.989435f, -1.046484f, -1.082848f, -1.103173f, -1.113184f, -1.116310f, -1.113920f, -1.106470f, -1.093611f, -1.074757f, -1.050402f, -1.022191f, -0.991595f, -0.959051f, -0.924074f, -0.885689f, -0.843261f, -0.797446f, -0.750023f, -0.702554f, -0.655685f, -0.609659f, -0.564706f, -0.520834f, -0.477976f, -0.436490f, -0.396954f, -0.359480f, -0.323618f, -0.288809f, -0.254673f, -0.221164f, -0.188708f, -0.157916f, -0.129070f, -0.102244f, -0.077759f, -0.055883f, -0.036223f, -0.018124f, -0.001473f, 0.013588f, 0.027502f, 0.041003f, 0.054210f, 0.066807f, 0.078910f, 0.090976f, 0.103076f, 0.114988f, 0.126900f, 0.139348f, 0.152546f, 0.166308f, 0.180589f, 0.195635f, 0.211564f, 0.228146f, 0.245089f, 0.262373f, 0.280192f, 0.298603f, 0.317350f, 0.336088f, 0.354672f, 0.373219f, 0.392122f, 0.412082f, 0.433737f, 0.456989f, 0.480976f, 0.504974f, 0.528975f,
+ 0.553152f, 0.577124f, 0.600047f, 0.621125f, 0.639881f, 0.656290f, 0.670723f, 0.683391f, 0.693803f, 0.701164f, 0.705315f, 0.706891f, 0.706661f, 0.705140f, 0.702740f, 0.699905f, 0.697104f, 0.694822f, 0.693380f, 0.692694f, 0.692541f, 0.693119f, 0.694952f, 0.698257f, 0.702754f, 0.707981f, 0.713393f, 0.718373f, 0.722645f, 0.726500f, 0.730288f, 0.733956f, 0.737383f, 0.740707f, 0.744006f, 0.747044f, 0.749626f, 0.751802f, 0.753644f, 0.755218f, 0.756809f, 0.758751f, 0.761058f, 0.763556f, 0.766202f, 0.768999f, 0.771906f, 0.775076f, 0.778852f, 0.783366f, 0.788481f, 0.794119f, 0.800196f, 0.806401f, 0.812542f, 0.818875f, 0.825636f, 0.832649f, 0.839808f, 0.847342f, 0.855190f, 0.862784f, 0.869788f, 0.876325f, 0.882332f, 0.887508f, 0.891946f, 0.895972f, 0.899482f, 0.902212f, 0.904315f, 0.905931f, 0.906830f, 0.907099f, 0.907371f, 0.907866f, 0.908254f, 0.908692f, 0.909708f, 0.910961f, 0.911524f, 0.911241f, 0.910472f, 0.909066f, 0.906977f, 0.904953f, 0.903361f, 0.901613f, 0.899703f, 0.898494f, 0.897842f, 0.896702f, 0.895299f, 0.894642f, 0.894316f, 0.893517f,
+ 0.893003f, 0.893248f, 0.893094f, 0.892684f, 0.893769f, 0.895229f, 0.894416f, 0.893811f, 0.897241f, 0.900009f, 0.896265f, 0.894143f, 0.903468f, 0.910502f, 0.893479f, 0.864358f, 0.859282f, 0.881749f, 0.897594f, 0.897013f, 0.910837f, 0.943680f, 0.945397f, 0.885614f, 0.810842f, 0.785450f, 0.810782f, 0.840026f, 0.841958f, 0.818240f, 0.787351f, 0.773027f, 0.771807f, 0.719767f, 0.550609f, 0.313730f, 0.167709f, 0.207926f, 0.353731f, 0.457636f, 0.477010f, 0.476826f, 0.500626f, 0.512220f, 0.460719f, 0.349140f, 0.228045f, 0.152067f}
+ },
+ {
+ {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f,
+ -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f,
+ 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f},
+ {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f,
+ -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f,
+ 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f}
+ },
+ {
+ {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f,
+ 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f,
+ -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f},
+ {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f,
+ 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f,
+ -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f}
+ }
+};
+const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]={
+ {
+ {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f,
+ -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f,
+ -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f},
+ {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f,
+ -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f,
+ -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f}
+ },
+ {
+ {0.140382f, 0.284796f, 0.113059f, -0.341301f, -0.862015f, -1.204634f, -1.248279f, -1.029758f, -0.664763f, -0.256066f, 0.137783f, 0.487211f, 0.775946f, 0.997771f, 1.153436f, 1.245420f, 1.277398f, 1.256961f, 1.195620f, 1.106451f, 1.001768f, 0.890131f, 0.774183f, 0.653473f, 0.530185f, 0.410173f, 0.298320f, 0.195312f, 0.099336f, 0.008646f, -0.078032f, -0.161428f, -0.241062f, -0.315649f, -0.384630f, -0.448733f, -0.509170f, -0.566793f, -0.621581f, -0.672385f, -0.717596f, -0.756520f, -0.789753f, -0.818228f, -0.842538f, -0.863181f, -0.880623f, -0.894965f, -0.906175f, -0.914704f, -0.921413f, -0.926918f, -0.931340f, -0.934448f, -0.935793f, -0.935022f, -0.932267f, -0.927970f, -0.922378f, -0.915726f, -0.908718f, -0.902136f, -0.896106f, -0.890432f, -0.885422f, -0.881597f, -0.878827f, -0.876579f, -0.874831f, -0.873952f, -0.873913f, -0.874370f, -0.875375f, -0.877274f, -0.880013f, -0.883133f, -0.886386f, -0.889857f, -0.893495f, -0.896943f, -0.899891f, -0.902370f, -0.904567f, -0.906469f, -0.907798f, -0.908330f, -0.908151f, -0.907581f, -0.906978f, -0.906626f, -0.906487f, -0.905858f, -0.903647f, -0.899249f, -0.892899f, -0.884927f,
+ -0.875053f, -0.862712f, -0.847727f, -0.830455f, -0.811563f, -0.791782f, -0.771500f, -0.750522f, -0.728617f, -0.706326f, -0.684815f, -0.664994f, -0.647154f, -0.631330f, -0.617578f, -0.605915f, -0.596270f, -0.588409f, -0.581848f, -0.576120f, -0.571189f, -0.567244f, -0.564062f, -0.560956f, -0.557300f, -0.552749f, -0.547149f, -0.540696f, -0.533982f, -0.527464f, -0.521067f, -0.514596f, -0.508155f, -0.501839f, -0.495465f, -0.488925f, -0.482422f, -0.476181f, -0.470299f, -0.464951f, -0.460286f, -0.456131f, -0.452168f, -0.448311f, -0.444625f, -0.441111f, -0.437847f, -0.435012f, -0.432529f, -0.430047f, -0.427337f, -0.424316f, -0.420805f, -0.416729f, -0.412382f, -0.407980f, -0.403285f, -0.398067f, -0.392448f, -0.386360f, -0.379335f, -0.371209f, -0.362359f, -0.353002f, -0.343026f, -0.332618f, -0.322186f, -0.311707f, -0.300948f, -0.290105f, -0.279460f, -0.268914f, -0.258530f, -0.248800f, -0.239810f, -0.231038f, -0.222364f, -0.214099f, -0.205871f, -0.196868f, -0.187179f, -0.177547f, -0.168128f, -0.158861f, -0.150296f, -0.142677f, -0.135313f, -0.127959f, -0.121270f, -0.115110f, -0.108460f, -0.101467f, -0.095154f, -0.089193f, -0.082636f, -0.076028f,
+ -0.070002f, -0.063579f, -0.056514f, -0.050189f, -0.043975f, -0.035661f, -0.026929f, -0.020905f, -0.014065f, -0.001634f, 0.010286f, 0.014441f, 0.021776f, 0.046877f, 0.075043f, 0.076336f, 0.055881f, 0.051243f, 0.071963f, 0.088061f, 0.093592f, 0.127625f, 0.202698f, 0.263860f, 0.260005f, 0.216330f, 0.195773f, 0.220955f, 0.268761f, 0.311828f, 0.337692f, 0.357947f, 0.413641f, 0.524316f, 0.615425f, 0.563270f, 0.351718f, 0.123833f, 0.026612f, 0.054001f, 0.097163f, 0.102905f, 0.112567f, 0.165999f, 0.234599f, 0.256682f, 0.199112f, 0.074735f},
+ {-0.140382f, -0.284796f, -0.113059f, 0.341301f, 0.862015f, 1.204634f, 1.248279f, 1.029758f, 0.664763f, 0.256066f, -0.137783f, -0.487211f, -0.775946f, -0.997771f, -1.153436f, -1.245420f, -1.277398f, -1.256961f, -1.195620f, -1.106451f, -1.001768f, -0.890131f, -0.774183f, -0.653473f, -0.530185f, -0.410173f, -0.298320f, -0.195312f, -0.099336f, -0.008646f, 0.078032f, 0.161428f, 0.241062f, 0.315649f, 0.384630f, 0.448733f, 0.509170f, 0.566793f, 0.621581f, 0.672385f, 0.717596f, 0.756520f, 0.789753f, 0.818228f, 0.842538f, 0.863181f, 0.880623f, 0.894965f, 0.906175f, 0.914704f, 0.921413f, 0.926918f, 0.931340f, 0.934448f, 0.935793f, 0.935022f, 0.932267f, 0.927970f, 0.922378f, 0.915726f, 0.908718f, 0.902136f, 0.896106f, 0.890432f, 0.885422f, 0.881597f, 0.878827f, 0.876579f, 0.874831f, 0.873952f, 0.873913f, 0.874370f, 0.875375f, 0.877274f, 0.880013f, 0.883133f, 0.886386f, 0.889857f, 0.893495f, 0.896943f, 0.899891f, 0.902370f, 0.904567f, 0.906469f, 0.907798f, 0.908330f, 0.908151f, 0.907581f, 0.906978f, 0.906626f, 0.906487f, 0.905858f, 0.903647f, 0.899249f, 0.892899f, 0.884927f,
+ 0.875053f, 0.862712f, 0.847727f, 0.830455f, 0.811563f, 0.791782f, 0.771500f, 0.750522f, 0.728617f, 0.706326f, 0.684815f, 0.664994f, 0.647154f, 0.631330f, 0.617578f, 0.605915f, 0.596270f, 0.588409f, 0.581848f, 0.576120f, 0.571189f, 0.567244f, 0.564062f, 0.560956f, 0.557300f, 0.552749f, 0.547149f, 0.540696f, 0.533982f, 0.527464f, 0.521067f, 0.514596f, 0.508155f, 0.501839f, 0.495465f, 0.488925f, 0.482422f, 0.476181f, 0.470299f, 0.464951f, 0.460286f, 0.456131f, 0.452168f, 0.448311f, 0.444625f, 0.441111f, 0.437847f, 0.435012f, 0.432529f, 0.430047f, 0.427337f, 0.424316f, 0.420805f, 0.416729f, 0.412382f, 0.407980f, 0.403285f, 0.398067f, 0.392448f, 0.386360f, 0.379335f, 0.371209f, 0.362359f, 0.353002f, 0.343026f, 0.332618f, 0.322186f, 0.311707f, 0.300948f, 0.290105f, 0.279460f, 0.268914f, 0.258530f, 0.248800f, 0.239810f, 0.231038f, 0.222364f, 0.214099f, 0.205871f, 0.196868f, 0.187179f, 0.177547f, 0.168128f, 0.158861f, 0.150296f, 0.142677f, 0.135313f, 0.127959f, 0.121270f, 0.115110f, 0.108460f, 0.101467f, 0.095154f, 0.089193f, 0.082636f, 0.076028f,
+ 0.070002f, 0.063579f, 0.056514f, 0.050189f, 0.043975f, 0.035661f, 0.026929f, 0.020905f, 0.014065f, 0.001634f, -0.010286f, -0.014441f, -0.021776f, -0.046877f, -0.075043f, -0.076336f, -0.055881f, -0.051243f, -0.071963f, -0.088061f, -0.093592f, -0.127625f, -0.202698f, -0.263860f, -0.260005f, -0.216330f, -0.195773f, -0.220955f, -0.268761f, -0.311828f, -0.337692f, -0.357947f, -0.413641f, -0.524316f, -0.615425f, -0.563270f, -0.351718f, -0.123833f, -0.026612f, -0.054001f, -0.097163f, -0.102905f, -0.112567f, -0.165999f, -0.234599f, -0.256682f, -0.199112f, -0.074735f}
+ },
+ {
+ {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f,
+ 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f,
+ 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f},
+ {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f,
+ 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f,
+ 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f}
+ },
+ {
+ {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f,
+ -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f,
+ -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f},
+ {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f,
+ -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f,
+ -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f}
+ }
+};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 32000 */
+
+const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1;
+const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}};
+const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0;
+const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]={
+ {
+ {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f,
+ -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f},
+ {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f,
+ -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f}
+ },
+ {
+ {0.126193f, 0.409379f, 0.770915f, 0.941927f, 0.770060f, 0.305875f, -0.262088f, -0.749508f, -1.068164f, -1.217448f, -1.229991f, -1.138532f, -0.972214f, -0.757355f, -0.514633f, -0.259993f, -0.008395f, 0.226177f, 0.433546f, 0.608821f, 0.752615f, 0.870118f, 0.967021f, 1.044852f, 1.101784f, 1.138051f, 1.158261f, 1.168128f, 1.171126f, 1.168620f, 1.161027f, 1.148005f, 1.129009f, 1.104516f, 1.076132f, 1.045356f, 1.012656f, 0.977512f, 0.938926f, 0.896304f, 0.850314f, 0.802692f, 0.754998f, 0.707919f, 0.661694f, 0.616510f, 0.572388f, 0.529305f, 0.487590f, 0.447788f, 0.410045f, 0.373936f, 0.338864f, 0.304430f, 0.270631f, 0.237903f, 0.206810f, 0.177634f, 0.150497f, 0.125709f, 0.103489f, 0.083471f, 0.065037f, 0.048044f, 0.032597f, 0.018295f, 0.004431f, -0.009163f, -0.022189f, -0.034707f, -0.047174f, -0.059713f, -0.072094f, -0.084452f, -0.097346f, -0.111038f, -0.125310f, -0.140074f, -0.155621f, -0.172102f, -0.189235f, -0.206705f, -0.224555f, -0.242985f, -0.261989f, -0.281321f, -0.300697f, -0.319952f, -0.339143f, -0.358700f, -0.379378f, -0.401765f, -0.425720f, -0.450446f, -0.475248f, -0.500046f,
+ -0.525001f, -0.549812f, -0.573628f, -0.595576f, -0.615206f, -0.632568f, -0.647989f, -0.661616f, -0.673019f, -0.681460f, -0.686704f, -0.689348f, -0.690254f, -0.689954f, -0.688764f, -0.687137f, -0.685645f, -0.684742f, -0.684652f, -0.685353f, -0.686715f, -0.688850f, -0.692213f, -0.697136f, -0.703389f, -0.710382f, -0.717558f, -0.724449f, -0.730762f, -0.736643f, -0.742509f, -0.748462f, -0.754275f, -0.759964f, -0.765773f, -0.771574f, -0.776977f, -0.781995f, -0.786951f, -0.791913f, -0.796914f, -0.802402f, -0.808694f, -0.815443f, -0.822369f, -0.829834f, -0.838049f, -0.846765f, -0.856294f, -0.867454f, -0.880120f, -0.893624f, -0.908541f, -0.925665f, -0.944278f, -0.965081f, -0.991098f, -1.015883f, -1.012611f, -0.952141f, -0.840918f, -0.727278f, -0.656859f, -0.632381f},
+ {-0.126193f, -0.409379f, -0.770915f, -0.941927f, -0.770060f, -0.305875f, 0.262088f, 0.749508f, 1.068164f, 1.217448f, 1.229991f, 1.138532f, 0.972214f, 0.757355f, 0.514633f, 0.259993f, 0.008395f, -0.226177f, -0.433546f, -0.608821f, -0.752615f, -0.870118f, -0.967021f, -1.044852f, -1.101784f, -1.138051f, -1.158261f, -1.168128f, -1.171126f, -1.168620f, -1.161027f, -1.148005f, -1.129009f, -1.104516f, -1.076132f, -1.045356f, -1.012656f, -0.977512f, -0.938926f, -0.896304f, -0.850314f, -0.802692f, -0.754998f, -0.707919f, -0.661694f, -0.616510f, -0.572388f, -0.529305f, -0.487590f, -0.447788f, -0.410045f, -0.373936f, -0.338864f, -0.304430f, -0.270631f, -0.237903f, -0.206810f, -0.177634f, -0.150497f, -0.125709f, -0.103489f, -0.083471f, -0.065037f, -0.048044f, -0.032597f, -0.018295f, -0.004431f, 0.009163f, 0.022189f, 0.034707f, 0.047174f, 0.059713f, 0.072094f, 0.084452f, 0.097346f, 0.111038f, 0.125310f, 0.140074f, 0.155621f, 0.172102f, 0.189235f, 0.206705f, 0.224555f, 0.242985f, 0.261989f, 0.281321f, 0.300697f, 0.319952f, 0.339143f, 0.358700f, 0.379378f, 0.401765f, 0.425720f, 0.450446f, 0.475248f, 0.500046f,
+ 0.525001f, 0.549812f, 0.573628f, 0.595576f, 0.615206f, 0.632568f, 0.647989f, 0.661616f, 0.673019f, 0.681460f, 0.686704f, 0.689348f, 0.690254f, 0.689954f, 0.688764f, 0.687137f, 0.685645f, 0.684742f, 0.684652f, 0.685353f, 0.686715f, 0.688850f, 0.692213f, 0.697136f, 0.703389f, 0.710382f, 0.717558f, 0.724449f, 0.730762f, 0.736643f, 0.742509f, 0.748462f, 0.754275f, 0.759964f, 0.765773f, 0.771574f, 0.776977f, 0.781995f, 0.786951f, 0.791913f, 0.796914f, 0.802402f, 0.808694f, 0.815443f, 0.822369f, 0.829834f, 0.838049f, 0.846765f, 0.856294f, 0.867454f, 0.880120f, 0.893624f, 0.908541f, 0.925665f, 0.944278f, 0.965081f, 0.991098f, 1.015883f, 1.012611f, 0.952141f, 0.840918f, 0.727278f, 0.656859f, 0.632381f}
+ },
+ {
+ {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f,
+ -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f},
+ {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f,
+ -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f}
+ },
+ {
+ {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f,
+ 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f},
+ {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f,
+ 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f}
+ }
+};
+const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]={
+ {
+ {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f,
+ -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f},
+ {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f,
+ -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f}
+ },
+ {
+ {0.140725f, 0.285846f, 0.114832f, -0.338829f, -0.858853f, -1.200757f, -1.243681f, -1.024467f, -0.658777f, -0.249357f, 0.145208f, 0.495328f, 0.784769f, 1.007322f, 1.163699f, 1.256377f, 1.289073f, 1.269367f, 1.208734f, 1.120266f, 1.016312f, 0.905408f, 0.790167f, 0.670170f, 0.547622f, 0.428343f, 0.317200f, 0.214919f, 0.119693f, 0.029734f, -0.056227f, -0.138879f, -0.217755f, -0.291611f, -0.359863f, -0.423205f, -0.482880f, -0.539767f, -0.593809f, -0.643836f, -0.688282f, -0.726462f, -0.758927f, -0.786612f, -0.810154f, -0.830039f, -0.846690f, -0.860232f, -0.870666f, -0.878418f, -0.884314f, -0.889009f, -0.892646f, -0.894952f, -0.895464f, -0.893873f, -0.890318f, -0.885190f, -0.878745f, -0.871264f, -0.863433f, -0.855991f, -0.849090f, -0.842574f, -0.836712f, -0.831995f, -0.828338f, -0.825230f, -0.822595f, -0.820794f, -0.819852f, -0.819422f, -0.819501f, -0.820450f, -0.822267f, -0.824464f, -0.826748f, -0.829242f, -0.831935f, -0.834417f, -0.836352f, -0.837828f, -0.839046f, -0.839930f, -0.840203f, -0.839703f, -0.838501f, -0.836856f, -0.835153f, -0.833735f, -0.832516f, -0.830749f, -0.827395f, -0.821885f, -0.814387f, -0.805210f,
+ -0.794148f, -0.780636f, -0.764422f, -0.745876f, -0.725740f, -0.704713f, -0.683108f, -0.660784f, -0.637569f, -0.613932f, -0.590994f, -0.569749f, -0.550511f, -0.533220f, -0.517926f, -0.504746f, -0.493587f, -0.484110f, -0.475879f, -0.468521f, -0.461919f, -0.456181f, -0.451182f, -0.446293f, -0.440761f, -0.434205f, -0.426610f, -0.418162f, -0.409301f, -0.400521f, -0.391893f, -0.383127f, -0.374182f, -0.365278f, -0.356340f, -0.347069f, -0.337579f, -0.328306f, -0.319353f, -0.310619f, -0.302285f, -0.294430f, -0.286564f, -0.278288f, -0.269879f, -0.261530f, -0.252867f, -0.243819f, -0.234732f, -0.225124f, -0.213896f, -0.200946f, -0.186484f, -0.169123f, -0.147421f, -0.120998f, -0.084260f, -0.023064f, 0.068036f, 0.162002f, 0.209461f, 0.185183f, 0.113708f, 0.036109f},
+ {-0.140725f, -0.285846f, -0.114832f, 0.338829f, 0.858853f, 1.200757f, 1.243681f, 1.024467f, 0.658777f, 0.249357f, -0.145208f, -0.495328f, -0.784769f, -1.007322f, -1.163699f, -1.256377f, -1.289073f, -1.269367f, -1.208734f, -1.120266f, -1.016312f, -0.905408f, -0.790167f, -0.670170f, -0.547622f, -0.428343f, -0.317200f, -0.214919f, -0.119693f, -0.029734f, 0.056227f, 0.138879f, 0.217755f, 0.291611f, 0.359863f, 0.423205f, 0.482880f, 0.539767f, 0.593809f, 0.643836f, 0.688282f, 0.726462f, 0.758927f, 0.786612f, 0.810154f, 0.830039f, 0.846690f, 0.860232f, 0.870666f, 0.878418f, 0.884314f, 0.889009f, 0.892646f, 0.894952f, 0.895464f, 0.893873f, 0.890318f, 0.885190f, 0.878745f, 0.871264f, 0.863433f, 0.855991f, 0.849090f, 0.842574f, 0.836712f, 0.831995f, 0.828338f, 0.825230f, 0.822595f, 0.820794f, 0.819852f, 0.819422f, 0.819501f, 0.820450f, 0.822267f, 0.824464f, 0.826748f, 0.829242f, 0.831935f, 0.834417f, 0.836352f, 0.837828f, 0.839046f, 0.839930f, 0.840203f, 0.839703f, 0.838501f, 0.836856f, 0.835153f, 0.833735f, 0.832516f, 0.830749f, 0.827395f, 0.821885f, 0.814387f, 0.805210f,
+ 0.794148f, 0.780636f, 0.764422f, 0.745876f, 0.725740f, 0.704713f, 0.683108f, 0.660784f, 0.637569f, 0.613932f, 0.590994f, 0.569749f, 0.550511f, 0.533220f, 0.517926f, 0.504746f, 0.493587f, 0.484110f, 0.475879f, 0.468521f, 0.461919f, 0.456181f, 0.451182f, 0.446293f, 0.440761f, 0.434205f, 0.426610f, 0.418162f, 0.409301f, 0.400521f, 0.391893f, 0.383127f, 0.374182f, 0.365278f, 0.356340f, 0.347069f, 0.337579f, 0.328306f, 0.319353f, 0.310619f, 0.302285f, 0.294430f, 0.286564f, 0.278288f, 0.269879f, 0.261530f, 0.252867f, 0.243819f, 0.234732f, 0.225124f, 0.213896f, 0.200946f, 0.186484f, 0.169123f, 0.147421f, 0.120998f, 0.084260f, 0.023064f, -0.068036f, -0.162002f, -0.209461f, -0.185183f, -0.113708f, -0.036109f}
+ },
+ {
+ {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f,
+ 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f},
+ {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f,
+ 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f}
+ },
+ {
+ {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f,
+ -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f},
+ {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f,
+ -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f}
+ }
+};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 16000 */
+
+const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1;
+const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}};
+const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0;
+const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]={
+ {
+ { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f},
+ { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f}
+ },
+ {
+ { 0.198789f, 0.479449f, 0.841384f, 1.014645f, 0.841631f, 0.375013f, -0.191824f, -0.677633f, -0.998453f, -1.149750f, -1.160640f, -1.068514f, -0.905139f, -0.691625f, -0.447031f, -0.192888f, 0.055312f, 0.289339f, 0.498414f, 0.671927f, 0.812235f, 0.929986f, 1.028010f, 1.102848f, 1.156570f, 1.193717f, 1.214057f, 1.219865f, 1.220241f, 1.218942f, 1.210137f, 1.192271f, 1.171448f, 1.148056f, 1.116865f, 1.080826f, 1.047158f, 1.012474f, 0.969360f, 0.921459f, 0.875238f, 0.826839f, 0.772906f, 0.720924f, 0.674871f, 0.627049f, 0.575132f, 0.527820f, 0.486114f, 0.441193f, 0.394366f, 0.354847f, 0.318787f, 0.276146f, 0.232314f, 0.196874f, 0.162640f, 0.121555f, 0.083765f, 0.056442f, 0.027308f, -0.009054f, -0.038581f, -0.059134f, -0.087738f, -0.123968f, -0.149625f, -0.170423f, -0.207343f, -0.249859f, -0.276408f, -0.306618f, -0.365081f, -0.423301f, -0.461101f, -0.538219f, -0.693008f, -0.822733f, -0.808512f, -0.718004f},
+ { -0.198789f, -0.479449f, -0.841384f, -1.014645f, -0.841631f, -0.375013f, 0.191824f, 0.677633f, 0.998453f, 1.149750f, 1.160640f, 1.068514f, 0.905139f, 0.691625f, 0.447031f, 0.192888f, -0.055312f, -0.289339f, -0.498414f, -0.671927f, -0.812235f, -0.929986f, -1.028010f, -1.102848f, -1.156570f, -1.193717f, -1.214057f, -1.219865f, -1.220241f, -1.218942f, -1.210137f, -1.192271f, -1.171448f, -1.148056f, -1.116865f, -1.080826f, -1.047158f, -1.012474f, -0.969360f, -0.921459f, -0.875238f, -0.826839f, -0.772906f, -0.720924f, -0.674871f, -0.627049f, -0.575132f, -0.527820f, -0.486114f, -0.441193f, -0.394366f, -0.354847f, -0.318787f, -0.276146f, -0.232314f, -0.196874f, -0.162640f, -0.121555f, -0.083765f, -0.056442f, -0.027308f, 0.009054f, 0.038581f, 0.059134f, 0.087738f, 0.123968f, 0.149625f, 0.170423f, 0.207343f, 0.249859f, 0.276408f, 0.306618f, 0.365081f, 0.423301f, 0.461101f, 0.538219f, 0.693008f, 0.822733f, 0.808512f, 0.718004f}
+ },
+ {
+ { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f},
+ { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f}
+ },
+ {
+ { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f},
+ { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f}
+ }
+};
+const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={
+ {
+ { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f},
+ { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f}
+ },
+ {
+ { 0.140804f, 0.288820f, 0.122901f, -0.328836f, -0.848509f, -1.186567f, -1.224746f, -1.004466f, -0.637872f, -0.223802f, 0.174851f, 0.525416f, 0.816608f, 1.044355f, 1.203947f, 1.296780f, 1.332269f, 1.317962f, 1.259572f, 1.171367f, 1.071313f, 0.965637f, 0.851706f, 0.732493f, 0.614874f, 0.500288f, 0.389707f, 0.289113f, 0.199637f, 0.113528f, 0.027703f, -0.052051f, -0.124690f, -0.195739f, -0.263851f, -0.322890f, -0.376254f, -0.431439f, -0.484825f, -0.529101f, -0.567623f, -0.605089f, -0.635842f, -0.656446f, -0.674899f, -0.694758f, -0.708108f, -0.713529f, -0.720098f, -0.728010f, -0.728543f, -0.724531f, -0.725793f, -0.727741f, -0.720454f, -0.710172f, -0.705821f, -0.698895f, -0.681963f, -0.666550f, -0.659346f, -0.647466f, -0.627275f, -0.614491f, -0.610170f, -0.596698f, -0.576958f, -0.570455f, -0.569107f, -0.551386f, -0.531742f, -0.532880f, -0.530696f, -0.501217f, -0.483082f, -0.497277f, -0.457348f, -0.288094f, -0.085091f, 0.000003f},
+ { -0.140804f, -0.288820f, -0.122901f, 0.328836f, 0.848509f, 1.186567f, 1.224746f, 1.004466f, 0.637872f, 0.223802f, -0.174851f, -0.525416f, -0.816608f, -1.044355f, -1.203947f, -1.296780f, -1.332269f, -1.317962f, -1.259572f, -1.171367f, -1.071313f, -0.965637f, -0.851706f, -0.732493f, -0.614874f, -0.500288f, -0.389707f, -0.289113f, -0.199637f, -0.113528f, -0.027703f, 0.052051f, 0.124690f, 0.195739f, 0.263851f, 0.322890f, 0.376254f, 0.431439f, 0.484825f, 0.529101f, 0.567623f, 0.605089f, 0.635842f, 0.656446f, 0.674899f, 0.694758f, 0.708108f, 0.713529f, 0.720098f, 0.728010f, 0.728543f, 0.724531f, 0.725793f, 0.727741f, 0.720454f, 0.710172f, 0.705821f, 0.698895f, 0.681963f, 0.666550f, 0.659346f, 0.647466f, 0.627275f, 0.614491f, 0.610170f, 0.596698f, 0.576958f, 0.570455f, 0.569107f, 0.551386f, 0.531742f, 0.532880f, 0.530696f, 0.501217f, 0.483082f, 0.497277f, 0.457348f, 0.288094f, 0.085091f, -0.000003f}
+ },
+ {
+ { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f},
+ { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f}
+ },
+ {
+ { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f},
+ { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f}
+ }
+};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_HOA2_HRIR **********************/
+
+#ifdef UPDATE_SBA_FILTER
+const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f;
+#else
+const float CRendBin_HOA2_HRIR_latency_s = 0.000020833333110f;
+#endif
+
+/* Sample Rate = 48000 */
+
+const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1;
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}};
+const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0;
+const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]={
+ {
+ {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f,
+ 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f,
+ 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f},
+ {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f,
+ 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f,
+ 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f}
+ },
+ {
+ {0.097314f, 0.414173f, 0.747626f, 0.754590f, 0.330783f, -0.326705f, -0.901613f, -1.190599f, -1.185056f, -0.986921f, -0.692990f, -0.354873f, -0.002249f, 0.335288f, 0.631311f, 0.869888f, 1.042481f, 1.143077f, 1.170924f, 1.135842f, 1.056300f, 0.949835f, 0.825366f, 0.685238f, 0.533253f, 0.378103f, 0.228763f, 0.089252f, -0.040641f, -0.161495f, -0.272981f, -0.375031f, -0.468133f, -0.552605f, -0.628716f, -0.697354f, -0.759761f, -0.816645f, -0.867878f, -0.912811f, -0.950646f, -0.980831f, -1.003432f, -1.019091f, -1.028553f, -1.032320f, -1.030690f, -1.023992f, -1.012844f, -0.998265f, -0.981431f, -0.963113f, -0.943286f, -0.921325f, -0.896613f, -0.869049f, -0.839024f, -0.807064f, -0.773676f, -0.739520f, -0.705375f, -0.671722f, -0.638603f, -0.606135f, -0.574805f, -0.544984f, -0.516534f, -0.489311f, -0.463725f, -0.440280f, -0.418894f, -0.399253f, -0.381525f, -0.365999f, -0.352195f, -0.339137f, -0.326488f, -0.314596f, -0.303283f, -0.291474f, -0.278425f, -0.264548f, -0.250445f, -0.235726f, -0.219500f, -0.201656f, -0.182949f, -0.163967f, -0.144609f, -0.124484f, -0.103249f, -0.080535f, -0.055987f, -0.029425f, -0.000739f, 0.030319f,
+ 0.063929f, 0.099772f, 0.136966f, 0.174386f, 0.211037f, 0.246212f, 0.279379f, 0.309898f, 0.336976f, 0.360053f, 0.379082f, 0.394265f, 0.405690f, 0.413493f, 0.418257f, 0.421046f, 0.423069f, 0.425261f, 0.427920f, 0.430738f, 0.433463f, 0.436544f, 0.440906f, 0.447174f, 0.455301f, 0.464713f, 0.474496f, 0.483726f, 0.492054f, 0.499849f, 0.507562f, 0.515203f, 0.522591f, 0.529726f, 0.536646f, 0.543230f, 0.549348f, 0.554966f, 0.560050f, 0.564644f, 0.569000f, 0.573385f, 0.577839f, 0.582298f, 0.586765f, 0.591237f, 0.595738f, 0.600532f, 0.606012f, 0.612378f, 0.619693f, 0.628054f, 0.637369f, 0.647229f, 0.657409f, 0.668130f, 0.679533f, 0.691385f, 0.703604f, 0.716403f, 0.729644f, 0.742723f, 0.755282f, 0.767338f, 0.778713f, 0.789114f, 0.798667f, 0.807637f, 0.815884f, 0.823219f, 0.829774f, 0.835517f, 0.840126f, 0.843797f, 0.847226f, 0.850573f, 0.853543f, 0.856458f, 0.859889f, 0.863411f, 0.866099f, 0.867816f, 0.868779f, 0.868745f, 0.867866f, 0.867084f, 0.866670f, 0.865984f, 0.865256f, 0.865448f, 0.866168f, 0.866282f, 0.866234f, 0.866993f, 0.867839f, 0.868126f,
+ 0.868997f, 0.870630f, 0.871367f, 0.871898f, 0.874706f, 0.877884f, 0.877771f, 0.878026f, 0.884032f, 0.889476f, 0.886115f, 0.884433f, 0.898714f, 0.912808f, 0.896260f, 0.858730f, 0.845640f, 0.869140f, 0.891869f, 0.896006f, 0.911910f, 0.948673f, 0.954899f, 0.894533f, 0.814533f, 0.786292f, 0.814134f, 0.846554f, 0.848304f, 0.823226f, 0.793405f, 0.782599f, 0.785720f, 0.738162f, 0.572339f, 0.335226f, 0.185068f, 0.220164f, 0.362443f, 0.464261f, 0.482183f, 0.481394f, 0.504881f, 0.514608f, 0.459824f, 0.346966f, 0.228758f, 0.156688f},
+ {-0.097314f, -0.414173f, -0.747626f, -0.754590f, -0.330783f, 0.326705f, 0.901613f, 1.190599f, 1.185056f, 0.986921f, 0.692990f, 0.354873f, 0.002249f, -0.335288f, -0.631311f, -0.869888f, -1.042481f, -1.143077f, -1.170924f, -1.135842f, -1.056300f, -0.949835f, -0.825366f, -0.685238f, -0.533253f, -0.378103f, -0.228763f, -0.089252f, 0.040641f, 0.161495f, 0.272981f, 0.375031f, 0.468133f, 0.552605f, 0.628716f, 0.697354f, 0.759761f, 0.816645f, 0.867878f, 0.912811f, 0.950646f, 0.980831f, 1.003432f, 1.019091f, 1.028553f, 1.032320f, 1.030690f, 1.023992f, 1.012844f, 0.998265f, 0.981431f, 0.963113f, 0.943286f, 0.921325f, 0.896613f, 0.869049f, 0.839024f, 0.807064f, 0.773676f, 0.739520f, 0.705375f, 0.671722f, 0.638603f, 0.606135f, 0.574805f, 0.544984f, 0.516534f, 0.489311f, 0.463725f, 0.440280f, 0.418894f, 0.399253f, 0.381525f, 0.365999f, 0.352195f, 0.339137f, 0.326488f, 0.314596f, 0.303283f, 0.291474f, 0.278425f, 0.264548f, 0.250445f, 0.235726f, 0.219500f, 0.201656f, 0.182949f, 0.163967f, 0.144609f, 0.124484f, 0.103249f, 0.080535f, 0.055987f, 0.029425f, 0.000739f, -0.030319f,
+ -0.063929f, -0.099772f, -0.136966f, -0.174386f, -0.211037f, -0.246212f, -0.279379f, -0.309898f, -0.336976f, -0.360053f, -0.379082f, -0.394265f, -0.405690f, -0.413493f, -0.418257f, -0.421046f, -0.423069f, -0.425261f, -0.427920f, -0.430738f, -0.433463f, -0.436544f, -0.440906f, -0.447174f, -0.455301f, -0.464713f, -0.474496f, -0.483726f, -0.492054f, -0.499849f, -0.507562f, -0.515203f, -0.522591f, -0.529726f, -0.536646f, -0.543230f, -0.549348f, -0.554966f, -0.560050f, -0.564644f, -0.569000f, -0.573385f, -0.577839f, -0.582298f, -0.586765f, -0.591237f, -0.595738f, -0.600532f, -0.606012f, -0.612378f, -0.619693f, -0.628054f, -0.637369f, -0.647229f, -0.657409f, -0.668130f, -0.679533f, -0.691385f, -0.703604f, -0.716403f, -0.729644f, -0.742723f, -0.755282f, -0.767338f, -0.778713f, -0.789114f, -0.798667f, -0.807637f, -0.815884f, -0.823219f, -0.829774f, -0.835517f, -0.840126f, -0.843797f, -0.847226f, -0.850573f, -0.853543f, -0.856458f, -0.859889f, -0.863411f, -0.866099f, -0.867816f, -0.868779f, -0.868745f, -0.867866f, -0.867084f, -0.866670f, -0.865984f, -0.865256f, -0.865448f, -0.866168f, -0.866282f, -0.866234f, -0.866993f, -0.867839f, -0.868126f,
+ -0.868997f, -0.870630f, -0.871367f, -0.871898f, -0.874706f, -0.877884f, -0.877771f, -0.878026f, -0.884032f, -0.889476f, -0.886115f, -0.884433f, -0.898714f, -0.912808f, -0.896260f, -0.858730f, -0.845640f, -0.869140f, -0.891869f, -0.896006f, -0.911910f, -0.948673f, -0.954899f, -0.894533f, -0.814533f, -0.786292f, -0.814134f, -0.846554f, -0.848304f, -0.823226f, -0.793405f, -0.782599f, -0.785720f, -0.738162f, -0.572339f, -0.335226f, -0.185068f, -0.220164f, -0.362443f, -0.464261f, -0.482183f, -0.481394f, -0.504881f, -0.514608f, -0.459824f, -0.346966f, -0.228758f, -0.156688f}
+ },
+ {
+ {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f,
+ 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f,
+ -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f},
+ {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f,
+ 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f,
+ -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f}
+ },
+ {
+ {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f,
+ -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f,
+ 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f},
+ {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f,
+ -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f,
+ 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f}
+ },
+ {
+ {0.022217f, 0.015375f, 0.018397f, 0.035300f, 0.046690f, 0.037732f, 0.022017f, 0.019869f, 0.019459f, -0.017327f, -0.102816f, -0.194710f, -0.234177f, -0.204599f, -0.138417f, -0.071733f, -0.010515f, 0.056797f, 0.132305f, 0.206318f, 0.271841f, 0.327874f, 0.371103f, 0.395052f, 0.398096f, 0.384964f, 0.359169f, 0.319562f, 0.265403f, 0.199868f, 0.126987f, 0.048878f, -0.032648f, -0.114915f, -0.195782f, -0.273182f, -0.342322f, -0.396309f, -0.431191f, -0.448778f, -0.453935f, -0.450961f, -0.442889f, -0.431917f, -0.419114f, -0.404570f, -0.388255f, -0.370115f, -0.349678f, -0.326644f, -0.301721f, -0.276201f, -0.251220f, -0.227989f, -0.207822f, -0.191043f, -0.176530f, -0.162962f, -0.149778f, -0.136591f, -0.122722f, -0.107799f, -0.091935f, -0.075014f, -0.056648f, -0.036913f, -0.016138f, 0.005944f, 0.029814f, 0.055061f, 0.080836f, 0.107214f, 0.134806f, 0.163054f, 0.190286f, 0.215551f, 0.238967f, 0.259885f, 0.276238f, 0.286705f, 0.292383f, 0.294992f, 0.294208f, 0.288458f, 0.278037f, 0.265391f, 0.251792f, 0.235652f, 0.215265f, 0.191614f, 0.166954f, 0.141873f, 0.115571f, 0.088358f, 0.062140f, 0.038532f,
+ 0.017724f, -0.000836f, -0.017500f, -0.032211f, -0.044805f, -0.055481f, -0.064916f, -0.073629f, -0.081559f, -0.088826f, -0.096406f, -0.105164f, -0.114511f, -0.122871f, -0.129287f, -0.134060f, -0.138257f, -0.143042f, -0.148807f, -0.154441f, -0.158070f, -0.158906f, -0.157915f, -0.156673f, -0.156277f, -0.157153f, -0.158912f, -0.160379f, -0.160516f, -0.159249f, -0.156964f, -0.153673f, -0.149149f, -0.143200f, -0.135383f, -0.125140f, -0.112610f, -0.098657f, -0.084044f, -0.069283f, -0.055081f, -0.042021f, -0.030039f, -0.019014f, -0.009440f, -0.001841f, 0.003841f, 0.007710f, 0.009630f, 0.009945f, 0.009536f, 0.008864f, 0.007876f, 0.006845f, 0.006260f, 0.006131f, 0.006419f, 0.007674f, 0.010369f, 0.014373f, 0.019846f, 0.027504f, 0.037346f, 0.048440f, 0.060307f, 0.073056f, 0.086098f, 0.098456f, 0.110125f, 0.121485f, 0.132067f, 0.141513f, 0.150626f, 0.159945f, 0.168818f, 0.177104f, 0.185774f, 0.194992f, 0.203954f, 0.212873f, 0.222383f, 0.231384f, 0.238515f, 0.244594f, 0.250498f, 0.254857f, 0.256981f, 0.258841f, 0.261200f, 0.262096f, 0.261400f, 0.261397f, 0.261615f, 0.259828f, 0.257747f, 0.257682f,
+ 0.256474f, 0.252253f, 0.250769f, 0.253635f, 0.251629f, 0.243566f, 0.243777f, 0.253044f, 0.249024f, 0.229975f, 0.229614f, 0.251308f, 0.237376f, 0.164020f, 0.115660f, 0.179182f, 0.302935f, 0.361288f, 0.332595f, 0.300984f, 0.297187f, 0.266515f, 0.205485f, 0.199320f, 0.282776f, 0.373785f, 0.395770f, 0.375092f, 0.369258f, 0.379275f, 0.378846f, 0.358644f, 0.304226f, 0.203779f, 0.113276f, 0.133067f, 0.271506f, 0.405312f, 0.429713f, 0.382366f, 0.361258f, 0.383739f, 0.398504f, 0.388066f, 0.377952f, 0.369700f, 0.341555f, 0.307263f},
+ {-0.022217f, -0.015375f, -0.018397f, -0.035300f, -0.046690f, -0.037732f, -0.022017f, -0.019869f, -0.019459f, 0.017327f, 0.102816f, 0.194710f, 0.234177f, 0.204599f, 0.138417f, 0.071733f, 0.010515f, -0.056797f, -0.132305f, -0.206318f, -0.271841f, -0.327874f, -0.371103f, -0.395052f, -0.398096f, -0.384964f, -0.359169f, -0.319562f, -0.265403f, -0.199868f, -0.126987f, -0.048878f, 0.032648f, 0.114915f, 0.195782f, 0.273182f, 0.342322f, 0.396309f, 0.431191f, 0.448778f, 0.453935f, 0.450961f, 0.442889f, 0.431917f, 0.419114f, 0.404570f, 0.388255f, 0.370115f, 0.349678f, 0.326644f, 0.301721f, 0.276201f, 0.251220f, 0.227989f, 0.207822f, 0.191043f, 0.176530f, 0.162962f, 0.149778f, 0.136591f, 0.122722f, 0.107799f, 0.091935f, 0.075014f, 0.056648f, 0.036913f, 0.016138f, -0.005944f, -0.029814f, -0.055061f, -0.080836f, -0.107214f, -0.134806f, -0.163054f, -0.190286f, -0.215551f, -0.238967f, -0.259885f, -0.276238f, -0.286705f, -0.292383f, -0.294992f, -0.294208f, -0.288458f, -0.278037f, -0.265391f, -0.251792f, -0.235652f, -0.215265f, -0.191614f, -0.166954f, -0.141873f, -0.115571f, -0.088358f, -0.062140f, -0.038532f,
+ -0.017724f, 0.000836f, 0.017500f, 0.032211f, 0.044805f, 0.055481f, 0.064916f, 0.073629f, 0.081559f, 0.088826f, 0.096406f, 0.105164f, 0.114511f, 0.122871f, 0.129287f, 0.134060f, 0.138257f, 0.143042f, 0.148807f, 0.154441f, 0.158070f, 0.158906f, 0.157915f, 0.156673f, 0.156277f, 0.157153f, 0.158912f, 0.160379f, 0.160516f, 0.159249f, 0.156964f, 0.153673f, 0.149149f, 0.143200f, 0.135383f, 0.125140f, 0.112610f, 0.098657f, 0.084044f, 0.069283f, 0.055081f, 0.042021f, 0.030039f, 0.019014f, 0.009440f, 0.001841f, -0.003841f, -0.007710f, -0.009630f, -0.009945f, -0.009536f, -0.008864f, -0.007876f, -0.006845f, -0.006260f, -0.006131f, -0.006419f, -0.007674f, -0.010369f, -0.014373f, -0.019846f, -0.027504f, -0.037346f, -0.048440f, -0.060307f, -0.073056f, -0.086098f, -0.098456f, -0.110125f, -0.121485f, -0.132067f, -0.141513f, -0.150626f, -0.159945f, -0.168818f, -0.177104f, -0.185774f, -0.194992f, -0.203954f, -0.212873f, -0.222383f, -0.231384f, -0.238515f, -0.244594f, -0.250498f, -0.254857f, -0.256981f, -0.258841f, -0.261200f, -0.262096f, -0.261400f, -0.261397f, -0.261615f, -0.259828f, -0.257747f, -0.257682f,
+ -0.256474f, -0.252253f, -0.250769f, -0.253635f, -0.251629f, -0.243566f, -0.243777f, -0.253044f, -0.249024f, -0.229975f, -0.229614f, -0.251308f, -0.237376f, -0.164020f, -0.115660f, -0.179182f, -0.302935f, -0.361288f, -0.332595f, -0.300984f, -0.297187f, -0.266515f, -0.205485f, -0.199320f, -0.282776f, -0.373785f, -0.395770f, -0.375092f, -0.369258f, -0.379275f, -0.378846f, -0.358644f, -0.304226f, -0.203779f, -0.113276f, -0.133067f, -0.271506f, -0.405312f, -0.429713f, -0.382366f, -0.361258f, -0.383739f, -0.398504f, -0.388066f, -0.377952f, -0.369700f, -0.341555f, -0.307263f}
+ },
+ {
+ {0.003437f, -0.012198f, -0.001203f, 0.021097f, -0.002466f, -0.043512f, 0.000962f, 0.131262f, 0.193341f, 0.073245f, -0.141155f, -0.268143f, -0.241794f, -0.140847f, -0.054105f, 0.002619f, 0.050716f, 0.099528f, 0.145239f, 0.181794f, 0.200756f, 0.196431f, 0.173654f, 0.142090f, 0.107331f, 0.073891f, 0.048716f, 0.034602f, 0.027293f, 0.024058f, 0.027766f, 0.038832f, 0.050743f, 0.057603f, 0.060423f, 0.063103f, 0.066372f, 0.067205f, 0.061224f, 0.045463f, 0.021062f, -0.007194f, -0.035078f, -0.061177f, -0.084943f, -0.105741f, -0.124709f, -0.144522f, -0.166406f, -0.189512f, -0.213041f, -0.236632f, -0.259187f, -0.279363f, -0.296402f, -0.308917f, -0.314459f, -0.311746f, -0.301536f, -0.284320f, -0.259412f, -0.227155f, -0.189434f, -0.147199f, -0.099925f, -0.048097f, 0.006127f, 0.061017f, 0.115797f, 0.169006f, 0.218343f, 0.262025f, 0.298749f, 0.326845f, 0.345052f, 0.353588f, 0.353173f, 0.343709f, 0.325096f, 0.298746f, 0.267135f, 0.231913f, 0.193115f, 0.150515f, 0.105513f, 0.060953f, 0.018598f, -0.022322f, -0.063041f, -0.102759f, -0.139669f, -0.173357f, -0.204275f, -0.231780f, -0.254700f, -0.272996f,
+ -0.286913f, -0.295377f, -0.297011f, -0.291997f, -0.281495f, -0.266021f, -0.245380f, -0.219470f, -0.188934f, -0.156137f, -0.125122f, -0.098779f, -0.076246f, -0.054735f, -0.033488f, -0.014413f, 0.000330f, 0.009800f, 0.014374f, 0.015862f, 0.016591f, 0.017377f, 0.017391f, 0.016313f, 0.015068f, 0.014452f, 0.014844f, 0.017137f, 0.022089f, 0.029075f, 0.037043f, 0.045911f, 0.055611f, 0.064990f, 0.073012f, 0.079676f, 0.084818f, 0.087704f, 0.088459f, 0.088069f, 0.086787f, 0.084427f, 0.081841f, 0.080001f, 0.078313f, 0.075848f, 0.073092f, 0.070651f, 0.067838f, 0.064177f, 0.060367f, 0.056565f, 0.051968f, 0.046818f, 0.042330f, 0.038426f, 0.034201f, 0.030169f, 0.027300f, 0.024914f, 0.022225f, 0.020280f, 0.019900f, 0.019979f, 0.019917f, 0.020854f, 0.022870f, 0.024349f, 0.025106f, 0.026471f, 0.028137f, 0.028929f, 0.029895f, 0.032523f, 0.035592f, 0.037737f, 0.040348f, 0.044286f, 0.047546f, 0.049185f, 0.050714f, 0.051542f, 0.048951f, 0.043598f, 0.038299f, 0.031936f, 0.022010f, 0.010903f, 0.001637f, -0.008334f, -0.021151f, -0.033005f, -0.042008f, -0.052364f, -0.064471f, -0.073163f,
+ -0.079941f, -0.090963f, -0.101864f, -0.105166f, -0.109415f, -0.124289f, -0.135694f, -0.130563f, -0.130580f, -0.154548f, -0.170385f, -0.149105f, -0.139181f, -0.196892f, -0.261751f, -0.216013f, -0.071571f, 0.026285f, 0.005174f, -0.050751f, -0.064299f, -0.081628f, -0.152957f, -0.210051f, -0.161120f, -0.036845f, 0.049592f, 0.047608f, 0.003439f, -0.026155f, -0.042297f, -0.092917f, -0.208966f, -0.338758f, -0.363990f, -0.229119f, -0.040285f, 0.032605f, -0.046756f, -0.151981f, -0.170066f, -0.127443f, -0.110599f, -0.135320f, -0.151985f, -0.135982f, -0.110796f, -0.098463f},
+ {-0.003437f, 0.012198f, 0.001203f, -0.021097f, 0.002466f, 0.043512f, -0.000962f, -0.131262f, -0.193341f, -0.073245f, 0.141155f, 0.268143f, 0.241794f, 0.140847f, 0.054105f, -0.002619f, -0.050716f, -0.099528f, -0.145239f, -0.181794f, -0.200756f, -0.196431f, -0.173654f, -0.142090f, -0.107331f, -0.073891f, -0.048716f, -0.034602f, -0.027293f, -0.024058f, -0.027766f, -0.038832f, -0.050743f, -0.057603f, -0.060423f, -0.063103f, -0.066372f, -0.067205f, -0.061224f, -0.045463f, -0.021062f, 0.007194f, 0.035078f, 0.061177f, 0.084943f, 0.105741f, 0.124709f, 0.144522f, 0.166406f, 0.189512f, 0.213041f, 0.236632f, 0.259187f, 0.279363f, 0.296402f, 0.308917f, 0.314459f, 0.311746f, 0.301536f, 0.284320f, 0.259412f, 0.227155f, 0.189434f, 0.147199f, 0.099925f, 0.048097f, -0.006127f, -0.061017f, -0.115797f, -0.169006f, -0.218343f, -0.262025f, -0.298749f, -0.326845f, -0.345052f, -0.353588f, -0.353173f, -0.343709f, -0.325096f, -0.298746f, -0.267135f, -0.231913f, -0.193115f, -0.150515f, -0.105513f, -0.060953f, -0.018598f, 0.022322f, 0.063041f, 0.102759f, 0.139669f, 0.173357f, 0.204275f, 0.231780f, 0.254700f, 0.272996f,
+ 0.286913f, 0.295377f, 0.297011f, 0.291997f, 0.281495f, 0.266021f, 0.245380f, 0.219470f, 0.188934f, 0.156137f, 0.125122f, 0.098779f, 0.076246f, 0.054735f, 0.033488f, 0.014413f, -0.000330f, -0.009800f, -0.014374f, -0.015862f, -0.016591f, -0.017377f, -0.017391f, -0.016313f, -0.015068f, -0.014452f, -0.014844f, -0.017137f, -0.022089f, -0.029075f, -0.037043f, -0.045911f, -0.055611f, -0.064990f, -0.073012f, -0.079676f, -0.084818f, -0.087704f, -0.088459f, -0.088069f, -0.086787f, -0.084427f, -0.081841f, -0.080001f, -0.078313f, -0.075848f, -0.073092f, -0.070651f, -0.067838f, -0.064177f, -0.060367f, -0.056565f, -0.051968f, -0.046818f, -0.042330f, -0.038426f, -0.034201f, -0.030169f, -0.027300f, -0.024914f, -0.022225f, -0.020280f, -0.019900f, -0.019979f, -0.019917f, -0.020854f, -0.022870f, -0.024349f, -0.025106f, -0.026471f, -0.028137f, -0.028929f, -0.029895f, -0.032523f, -0.035592f, -0.037737f, -0.040348f, -0.044286f, -0.047546f, -0.049185f, -0.050714f, -0.051542f, -0.048951f, -0.043598f, -0.038299f, -0.031936f, -0.022010f, -0.010903f, -0.001637f, 0.008334f, 0.021151f, 0.033005f, 0.042008f, 0.052364f, 0.064471f, 0.073163f,
+ 0.079941f, 0.090963f, 0.101864f, 0.105166f, 0.109415f, 0.124289f, 0.135694f, 0.130563f, 0.130580f, 0.154548f, 0.170385f, 0.149105f, 0.139181f, 0.196892f, 0.261751f, 0.216013f, 0.071571f, -0.026285f, -0.005174f, 0.050751f, 0.064299f, 0.081628f, 0.152957f, 0.210051f, 0.161120f, 0.036845f, -0.049592f, -0.047608f, -0.003439f, 0.026155f, 0.042297f, 0.092917f, 0.208966f, 0.338758f, 0.363990f, 0.229119f, 0.040285f, -0.032605f, 0.046756f, 0.151981f, 0.170066f, 0.127443f, 0.110599f, 0.135320f, 0.151985f, 0.135982f, 0.110796f, 0.098463f}
+ },
+ {
+ {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f,
+ 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f,
+ -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f},
+ {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f,
+ 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f,
+ -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f}
+ },
+ {
+ {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f,
+ 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f,
+ 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f},
+ {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f,
+ 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f,
+ 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f}
+ },
+ {
+ {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f,
+ 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f,
+ 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f},
+ {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f,
+ 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f,
+ 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f}
+ }
+};
+const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]={
+ {
+ {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f,
+ 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f,
+ 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f},
+ {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f,
+ 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f,
+ 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f}
+ },
+ {
+ {0.138076f, 0.232898f, -0.059293f, -0.612224f, -1.079196f, -1.174106f, -0.864429f, -0.332847f, 0.203546f, 0.626268f, 0.915930f, 1.086338f, 1.145817f, 1.101913f, 0.971577f, 0.776715f, 0.537327f, 0.273208f, 0.007437f, -0.237576f, -0.448750f, -0.625455f, -0.772863f, -0.892799f, -0.982209f, -1.039402f, -1.068583f, -1.077066f, -1.070181f, -1.050445f, -1.019817f, -0.980553f, -0.934407f, -0.882631f, -0.826646f, -0.767793f, -0.706548f, -0.642564f, -0.575417f, -0.505095f, -0.432158f, -0.357731f, -0.283190f, -0.209614f, -0.137562f, -0.067329f, 0.000718f, 0.066025f, 0.127937f, 0.186022f, 0.240454f, 0.292036f, 0.341688f, 0.389810f, 0.436063f, 0.479708f, 0.520133f, 0.557017f, 0.590135f, 0.619320f, 0.644743f, 0.666931f, 0.686264f, 0.702737f, 0.716446f, 0.727930f, 0.737674f, 0.745631f, 0.751724f, 0.756469f, 0.760579f, 0.764261f, 0.767563f, 0.771136f, 0.775889f, 0.781953f, 0.788798f, 0.796429f, 0.805575f, 0.816463f, 0.828227f, 0.840053f, 0.852209f, 0.865317f, 0.879077f, 0.892490f, 0.905078f, 0.917237f, 0.929509f, 0.942079f, 0.954921f, 0.967923f, 0.980775f, 0.993059f, 1.004433f, 1.014471f,
+ 1.022368f, 1.027077f, 1.027777f, 1.024171f, 1.016419f, 1.004875f, 0.989829f, 0.971522f, 0.950481f, 0.927664f, 0.904094f, 0.880496f, 0.857481f, 0.835889f, 0.816673f, 0.800449f, 0.787227f, 0.776425f, 0.767212f, 0.759123f, 0.752399f, 0.747484f, 0.744215f, 0.741719f, 0.738940f, 0.735065f, 0.729726f, 0.723226f, 0.716367f, 0.709723f, 0.703224f, 0.696593f, 0.689822f, 0.683015f, 0.676123f, 0.669098f, 0.662044f, 0.655092f, 0.648381f, 0.642144f, 0.636550f, 0.631509f, 0.626846f, 0.622532f, 0.618608f, 0.615118f, 0.612225f, 0.610115f, 0.608697f, 0.607677f, 0.606831f, 0.605900f, 0.604476f, 0.602385f, 0.599878f, 0.597091f, 0.593736f, 0.589617f, 0.584851f, 0.579299f, 0.572456f, 0.564168f, 0.554769f, 0.544430f, 0.533113f, 0.521100f, 0.508789f, 0.496142f, 0.483005f, 0.469593f, 0.456081f, 0.442365f, 0.428689f, 0.415677f, 0.403373f, 0.391276f, 0.379404f, 0.368075f, 0.356787f, 0.344691f, 0.331928f, 0.319178f, 0.306569f, 0.294254f, 0.282956f, 0.272791f, 0.262941f, 0.253310f, 0.244606f, 0.236417f, 0.227600f, 0.218521f, 0.210224f, 0.202126f, 0.193377f, 0.184872f,
+ 0.177026f, 0.168429f, 0.159251f, 0.151477f, 0.143811f, 0.133179f, 0.122218f, 0.115290f, 0.107467f, 0.092035f, 0.077002f, 0.072747f, 0.065602f, 0.034483f, -0.005140f, -0.013392f, 0.010536f, 0.022405f, 0.003341f, -0.016208f, -0.024400f, -0.060491f, -0.141552f, -0.211147f, -0.211352f, -0.166013f, -0.144212f, -0.172423f, -0.224227f, -0.268380f, -0.293530f, -0.314223f, -0.372350f, -0.487543f, -0.585910f, -0.542642f, -0.338207f, -0.113721f, -0.017641f, -0.045890f, -0.089863f, -0.096510f, -0.108175f, -0.164168f, -0.233196f, -0.252807f, -0.193549f, -0.071985f},
+ {-0.138076f, -0.232898f, 0.059293f, 0.612224f, 1.079196f, 1.174106f, 0.864429f, 0.332847f, -0.203546f, -0.626268f, -0.915930f, -1.086338f, -1.145817f, -1.101913f, -0.971577f, -0.776715f, -0.537327f, -0.273208f, -0.007437f, 0.237576f, 0.448750f, 0.625455f, 0.772863f, 0.892799f, 0.982209f, 1.039402f, 1.068583f, 1.077066f, 1.070181f, 1.050445f, 1.019817f, 0.980553f, 0.934407f, 0.882631f, 0.826646f, 0.767793f, 0.706548f, 0.642564f, 0.575417f, 0.505095f, 0.432158f, 0.357731f, 0.283190f, 0.209614f, 0.137562f, 0.067329f, -0.000718f, -0.066025f, -0.127937f, -0.186022f, -0.240454f, -0.292036f, -0.341688f, -0.389810f, -0.436063f, -0.479708f, -0.520133f, -0.557017f, -0.590135f, -0.619320f, -0.644743f, -0.666931f, -0.686264f, -0.702737f, -0.716446f, -0.727930f, -0.737674f, -0.745631f, -0.751724f, -0.756469f, -0.760579f, -0.764261f, -0.767563f, -0.771136f, -0.775889f, -0.781953f, -0.788798f, -0.796429f, -0.805575f, -0.816463f, -0.828227f, -0.840053f, -0.852209f, -0.865317f, -0.879077f, -0.892490f, -0.905078f, -0.917237f, -0.929509f, -0.942079f, -0.954921f, -0.967923f, -0.980775f, -0.993059f, -1.004433f, -1.014471f,
+ -1.022368f, -1.027077f, -1.027777f, -1.024171f, -1.016419f, -1.004875f, -0.989829f, -0.971522f, -0.950481f, -0.927664f, -0.904094f, -0.880496f, -0.857481f, -0.835889f, -0.816673f, -0.800449f, -0.787227f, -0.776425f, -0.767212f, -0.759123f, -0.752399f, -0.747484f, -0.744215f, -0.741719f, -0.738940f, -0.735065f, -0.729726f, -0.723226f, -0.716367f, -0.709723f, -0.703224f, -0.696593f, -0.689822f, -0.683015f, -0.676123f, -0.669098f, -0.662044f, -0.655092f, -0.648381f, -0.642144f, -0.636550f, -0.631509f, -0.626846f, -0.622532f, -0.618608f, -0.615118f, -0.612225f, -0.610115f, -0.608697f, -0.607677f, -0.606831f, -0.605900f, -0.604476f, -0.602385f, -0.599878f, -0.597091f, -0.593736f, -0.589617f, -0.584851f, -0.579299f, -0.572456f, -0.564168f, -0.554769f, -0.544430f, -0.533113f, -0.521100f, -0.508789f, -0.496142f, -0.483005f, -0.469593f, -0.456081f, -0.442365f, -0.428689f, -0.415677f, -0.403373f, -0.391276f, -0.379404f, -0.368075f, -0.356787f, -0.344691f, -0.331928f, -0.319178f, -0.306569f, -0.294254f, -0.282956f, -0.272791f, -0.262941f, -0.253310f, -0.244606f, -0.236417f, -0.227600f, -0.218521f, -0.210224f, -0.202126f, -0.193377f, -0.184872f,
+ -0.177026f, -0.168429f, -0.159251f, -0.151477f, -0.143811f, -0.133179f, -0.122218f, -0.115290f, -0.107467f, -0.092035f, -0.077002f, -0.072747f, -0.065602f, -0.034483f, 0.005140f, 0.013392f, -0.010536f, -0.022405f, -0.003341f, 0.016208f, 0.024400f, 0.060491f, 0.141552f, 0.211147f, 0.211352f, 0.166013f, 0.144212f, 0.172423f, 0.224227f, 0.268380f, 0.293530f, 0.314223f, 0.372350f, 0.487543f, 0.585910f, 0.542642f, 0.338207f, 0.113721f, 0.017641f, 0.045890f, 0.089863f, 0.096510f, 0.108175f, 0.164168f, 0.233196f, 0.252807f, 0.193549f, 0.071985f}
+ },
+ {
+ {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f,
+ -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f,
+ -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f},
+ {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f,
+ -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f,
+ -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f}
+ },
+ {
+ {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f,
+ -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f,
+ 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f},
+ {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f,
+ -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f,
+ 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f}
+ },
+ {
+ {-0.003789f, -0.003563f, 0.005390f, 0.004253f, -0.016392f, -0.039478f, -0.046987f, -0.050995f, -0.077966f, -0.121934f, -0.135164f, -0.078389f, 0.031562f, 0.138714f, 0.205564f, 0.238423f, 0.259289f, 0.272913f, 0.269301f, 0.243849f, 0.201082f, 0.144127f, 0.072703f, -0.009192f, -0.092622f, -0.171911f, -0.247325f, -0.318739f, -0.382003f, -0.432956f, -0.470676f, -0.495269f, -0.505851f, -0.501895f, -0.483566f, -0.449894f, -0.399742f, -0.335951f, -0.266183f, -0.198350f, -0.136588f, -0.081779f, -0.033568f, 0.009088f, 0.047647f, 0.083109f, 0.115870f, 0.146272f, 0.174342f, 0.199243f, 0.219907f, 0.235988f, 0.247660f, 0.255290f, 0.260042f, 0.263953f, 0.268571f, 0.274114f, 0.280349f, 0.287365f, 0.295056f, 0.302862f, 0.310459f, 0.317888f, 0.324842f, 0.330747f, 0.335542f, 0.339373f, 0.341625f, 0.341355f, 0.338531f, 0.333589f, 0.325911f, 0.314093f, 0.297767f, 0.277788f, 0.254435f, 0.226961f, 0.195597f, 0.162625f, 0.130256f, 0.098385f, 0.065891f, 0.033566f, 0.003825f, -0.022571f, -0.047471f, -0.072174f, -0.095089f, -0.113849f, -0.128315f, -0.139798f, -0.148327f, -0.152538f, -0.151922f, -0.147693f,
+ -0.141449f, -0.134009f, -0.125542f, -0.116170f, -0.106339f, -0.096745f, -0.087767f, -0.079178f, -0.070833f, -0.063188f, -0.056416f, -0.049448f, -0.040822f, -0.030317f, -0.019055f, -0.008311f, 0.001362f, 0.010417f, 0.020238f, 0.032100f, 0.045698f, 0.059224f, 0.071090f, 0.081057f, 0.089857f, 0.098613f, 0.108519f, 0.120125f, 0.132885f, 0.145947f, 0.159099f, 0.172520f, 0.186195f, 0.200063f, 0.214027f, 0.227406f, 0.239060f, 0.248310f, 0.255115f, 0.259453f, 0.261381f, 0.261468f, 0.260276f, 0.257747f, 0.253798f, 0.248995f, 0.243998f, 0.239084f, 0.234733f, 0.231749f, 0.230386f, 0.230266f, 0.231313f, 0.233779f, 0.237497f, 0.242150f, 0.247940f, 0.255021f, 0.262901f, 0.271206f, 0.280071f, 0.289077f, 0.297036f, 0.303388f, 0.308430f, 0.311992f, 0.313524f, 0.313400f, 0.312461f, 0.310668f, 0.307845f, 0.304798f, 0.302098f, 0.299086f, 0.295438f, 0.291960f, 0.288762f, 0.284855f, 0.280127f, 0.275167f, 0.269236f, 0.261328f, 0.252490f, 0.244013f, 0.235006f, 0.224872f, 0.215456f, 0.207625f, 0.199481f, 0.190596f, 0.183143f, 0.177022f, 0.169991f, 0.163109f, 0.158683f, 0.154359f,
+ 0.148010f, 0.143942f, 0.143859f, 0.140381f, 0.132047f, 0.130317f, 0.136071f, 0.131329f, 0.114971f, 0.114353f, 0.131726f, 0.123744f, 0.081739f, 0.079871f, 0.169779f, 0.273251f, 0.274171f, 0.185331f, 0.118375f, 0.110316f, 0.100500f, 0.075041f, 0.100840f, 0.188865f, 0.245753f, 0.209825f, 0.136354f, 0.098537f, 0.089245f, 0.068116f, 0.030138f, -0.014604f, -0.058375f, -0.058884f, 0.036565f, 0.189080f, 0.269087f, 0.211524f, 0.102010f, 0.054393f, 0.068058f, 0.069962f, 0.039279f, 0.011969f, -0.001065f, -0.019914f, -0.036169f, -0.019550f},
+ {0.003789f, 0.003563f, -0.005390f, -0.004253f, 0.016392f, 0.039478f, 0.046987f, 0.050995f, 0.077966f, 0.121934f, 0.135164f, 0.078389f, -0.031562f, -0.138714f, -0.205564f, -0.238423f, -0.259289f, -0.272913f, -0.269301f, -0.243849f, -0.201082f, -0.144127f, -0.072703f, 0.009192f, 0.092622f, 0.171911f, 0.247325f, 0.318739f, 0.382003f, 0.432956f, 0.470676f, 0.495269f, 0.505851f, 0.501895f, 0.483566f, 0.449894f, 0.399742f, 0.335951f, 0.266183f, 0.198350f, 0.136588f, 0.081779f, 0.033568f, -0.009088f, -0.047647f, -0.083109f, -0.115870f, -0.146272f, -0.174342f, -0.199243f, -0.219907f, -0.235988f, -0.247660f, -0.255290f, -0.260042f, -0.263953f, -0.268571f, -0.274114f, -0.280349f, -0.287365f, -0.295056f, -0.302862f, -0.310459f, -0.317888f, -0.324842f, -0.330747f, -0.335542f, -0.339373f, -0.341625f, -0.341355f, -0.338531f, -0.333589f, -0.325911f, -0.314093f, -0.297767f, -0.277788f, -0.254435f, -0.226961f, -0.195597f, -0.162625f, -0.130256f, -0.098385f, -0.065891f, -0.033566f, -0.003825f, 0.022571f, 0.047471f, 0.072174f, 0.095089f, 0.113849f, 0.128315f, 0.139798f, 0.148327f, 0.152538f, 0.151922f, 0.147693f,
+ 0.141449f, 0.134009f, 0.125542f, 0.116170f, 0.106339f, 0.096745f, 0.087767f, 0.079178f, 0.070833f, 0.063188f, 0.056416f, 0.049448f, 0.040822f, 0.030317f, 0.019055f, 0.008311f, -0.001362f, -0.010417f, -0.020238f, -0.032100f, -0.045698f, -0.059224f, -0.071090f, -0.081057f, -0.089857f, -0.098613f, -0.108519f, -0.120125f, -0.132885f, -0.145947f, -0.159099f, -0.172520f, -0.186195f, -0.200063f, -0.214027f, -0.227406f, -0.239060f, -0.248310f, -0.255115f, -0.259453f, -0.261381f, -0.261468f, -0.260276f, -0.257747f, -0.253798f, -0.248995f, -0.243998f, -0.239084f, -0.234733f, -0.231749f, -0.230386f, -0.230266f, -0.231313f, -0.233779f, -0.237497f, -0.242150f, -0.247940f, -0.255021f, -0.262901f, -0.271206f, -0.280071f, -0.289077f, -0.297036f, -0.303388f, -0.308430f, -0.311992f, -0.313524f, -0.313400f, -0.312461f, -0.310668f, -0.307845f, -0.304798f, -0.302098f, -0.299086f, -0.295438f, -0.291960f, -0.288762f, -0.284855f, -0.280127f, -0.275167f, -0.269236f, -0.261328f, -0.252490f, -0.244013f, -0.235006f, -0.224872f, -0.215456f, -0.207625f, -0.199481f, -0.190596f, -0.183143f, -0.177022f, -0.169991f, -0.163109f, -0.158683f, -0.154359f,
+ -0.148010f, -0.143942f, -0.143859f, -0.140381f, -0.132047f, -0.130317f, -0.136071f, -0.131329f, -0.114971f, -0.114353f, -0.131726f, -0.123744f, -0.081739f, -0.079871f, -0.169779f, -0.273251f, -0.274171f, -0.185331f, -0.118375f, -0.110316f, -0.100500f, -0.075041f, -0.100840f, -0.188865f, -0.245753f, -0.209825f, -0.136354f, -0.098537f, -0.089245f, -0.068116f, -0.030138f, 0.014604f, 0.058375f, 0.058884f, -0.036565f, -0.189080f, -0.269087f, -0.211524f, -0.102010f, -0.054393f, -0.068058f, -0.069962f, -0.039279f, -0.011969f, 0.001065f, 0.019914f, 0.036169f, 0.019550f}
+ },
+ {
+ {-0.006846f, -0.000152f, 0.019374f, 0.004568f, -0.021442f, 0.016645f, 0.094894f, 0.078760f, -0.081254f, -0.243610f, -0.240659f, -0.079782f, 0.093230f, 0.178154f, 0.191226f, 0.185348f, 0.178503f, 0.163321f, 0.134365f, 0.090634f, 0.035061f, -0.021392f, -0.066568f, -0.096797f, -0.113194f, -0.115470f, -0.106244f, -0.093474f, -0.082246f, -0.071041f, -0.059987f, -0.054977f, -0.059639f, -0.069988f, -0.080582f, -0.091156f, -0.105014f, -0.124424f, -0.148446f, -0.172697f, -0.191456f, -0.201829f, -0.205066f, -0.203411f, -0.198122f, -0.190935f, -0.184076f, -0.177679f, -0.169636f, -0.158353f, -0.143485f, -0.124415f, -0.100358f, -0.071388f, -0.037625f, 0.001321f, 0.044603f, 0.089548f, 0.134068f, 0.177680f, 0.219330f, 0.256720f, 0.288657f, 0.315550f, 0.336880f, 0.350608f, 0.355516f, 0.351864f, 0.339573f, 0.317907f, 0.287002f, 0.247963f, 0.201779f, 0.149696f, 0.094063f, 0.037338f, -0.019185f, -0.074517f, -0.126620f, -0.173157f, -0.213261f, -0.247652f, -0.276903f, -0.300055f, -0.315444f, -0.323001f, -0.324860f, -0.322914f, -0.316675f, -0.304809f, -0.287684f, -0.266683f, -0.242026f, -0.213279f, -0.181142f, -0.146760f,
+ -0.110142f, -0.071145f, -0.031211f, 0.007509f, 0.043988f, 0.078081f, 0.109247f, 0.136169f, 0.156829f, 0.169152f, 0.173118f, 0.171933f, 0.169302f, 0.165775f, 0.159289f, 0.148635f, 0.134827f, 0.119999f, 0.106488f, 0.096001f, 0.088379f, 0.082075f, 0.076456f, 0.072384f, 0.070438f, 0.070288f, 0.071753f, 0.074612f, 0.077583f, 0.079232f, 0.079389f, 0.078235f, 0.075055f, 0.069328f, 0.061745f, 0.052996f, 0.043060f, 0.032476f, 0.022488f, 0.013477f, 0.005059f, -0.002387f, -0.008316f, -0.013571f, -0.019235f, -0.024853f, -0.029688f, -0.034327f, -0.039294f, -0.043859f, -0.047636f, -0.051298f, -0.054721f, -0.056837f, -0.057796f, -0.058696f, -0.059300f, -0.058729f, -0.057642f, -0.056982f, -0.055954f, -0.053837f, -0.051823f, -0.050759f, -0.049643f, -0.048234f, -0.047974f, -0.049006f, -0.049803f, -0.050341f, -0.051811f, -0.053521f, -0.054180f, -0.055033f, -0.057656f, -0.060879f, -0.063704f, -0.067950f, -0.074626f, -0.081990f, -0.089761f, -0.099845f, -0.111314f, -0.121038f, -0.129556f, -0.139256f, -0.148166f, -0.153341f, -0.157148f, -0.162167f, -0.165226f, -0.164304f, -0.163483f, -0.164081f, -0.161527f, -0.156368f,
+ -0.154318f, -0.152643f, -0.144643f, -0.136635f, -0.137086f, -0.134879f, -0.118831f, -0.106512f, -0.113435f, -0.113117f, -0.082437f, -0.060570f, -0.086167f, -0.101264f, -0.021545f, 0.106592f, 0.140238f, 0.045381f, -0.056517f, -0.078374f, -0.074532f, -0.103109f, -0.107473f, -0.023777f, 0.086175f, 0.108098f, 0.028080f, -0.068297f, -0.117080f, -0.133674f, -0.164582f, -0.217773f, -0.236408f, -0.146856f, 0.037683f, 0.182002f, 0.158627f, 0.006930f, -0.106384f, -0.089821f, -0.015786f, 0.009329f, -0.016630f, -0.027747f, -0.002433f, 0.022946f, 0.022944f, 0.008213f},
+ {0.006846f, 0.000152f, -0.019374f, -0.004568f, 0.021442f, -0.016645f, -0.094894f, -0.078760f, 0.081254f, 0.243610f, 0.240659f, 0.079782f, -0.093230f, -0.178154f, -0.191226f, -0.185348f, -0.178503f, -0.163321f, -0.134365f, -0.090634f, -0.035061f, 0.021392f, 0.066568f, 0.096797f, 0.113194f, 0.115470f, 0.106244f, 0.093474f, 0.082246f, 0.071041f, 0.059987f, 0.054977f, 0.059639f, 0.069988f, 0.080582f, 0.091156f, 0.105014f, 0.124424f, 0.148446f, 0.172697f, 0.191456f, 0.201829f, 0.205066f, 0.203411f, 0.198122f, 0.190935f, 0.184076f, 0.177679f, 0.169636f, 0.158353f, 0.143485f, 0.124415f, 0.100358f, 0.071388f, 0.037625f, -0.001321f, -0.044603f, -0.089548f, -0.134068f, -0.177680f, -0.219330f, -0.256720f, -0.288657f, -0.315550f, -0.336880f, -0.350608f, -0.355516f, -0.351864f, -0.339573f, -0.317907f, -0.287002f, -0.247963f, -0.201779f, -0.149696f, -0.094063f, -0.037338f, 0.019185f, 0.074517f, 0.126620f, 0.173157f, 0.213261f, 0.247652f, 0.276903f, 0.300055f, 0.315444f, 0.323001f, 0.324860f, 0.322914f, 0.316675f, 0.304809f, 0.287684f, 0.266683f, 0.242026f, 0.213279f, 0.181142f, 0.146760f,
+ 0.110142f, 0.071145f, 0.031211f, -0.007509f, -0.043988f, -0.078081f, -0.109247f, -0.136169f, -0.156829f, -0.169152f, -0.173118f, -0.171933f, -0.169302f, -0.165775f, -0.159289f, -0.148635f, -0.134827f, -0.119999f, -0.106488f, -0.096001f, -0.088379f, -0.082075f, -0.076456f, -0.072384f, -0.070438f, -0.070288f, -0.071753f, -0.074612f, -0.077583f, -0.079232f, -0.079389f, -0.078235f, -0.075055f, -0.069328f, -0.061745f, -0.052996f, -0.043060f, -0.032476f, -0.022488f, -0.013477f, -0.005059f, 0.002387f, 0.008316f, 0.013571f, 0.019235f, 0.024853f, 0.029688f, 0.034327f, 0.039294f, 0.043859f, 0.047636f, 0.051298f, 0.054721f, 0.056837f, 0.057796f, 0.058696f, 0.059300f, 0.058729f, 0.057642f, 0.056982f, 0.055954f, 0.053837f, 0.051823f, 0.050759f, 0.049643f, 0.048234f, 0.047974f, 0.049006f, 0.049803f, 0.050341f, 0.051811f, 0.053521f, 0.054180f, 0.055033f, 0.057656f, 0.060879f, 0.063704f, 0.067950f, 0.074626f, 0.081990f, 0.089761f, 0.099845f, 0.111314f, 0.121038f, 0.129556f, 0.139256f, 0.148166f, 0.153341f, 0.157148f, 0.162167f, 0.165226f, 0.164304f, 0.163483f, 0.164081f, 0.161527f, 0.156368f,
+ 0.154318f, 0.152643f, 0.144643f, 0.136635f, 0.137086f, 0.134879f, 0.118831f, 0.106512f, 0.113435f, 0.113117f, 0.082437f, 0.060570f, 0.086167f, 0.101264f, 0.021545f, -0.106592f, -0.140238f, -0.045381f, 0.056517f, 0.078374f, 0.074532f, 0.103109f, 0.107473f, 0.023777f, -0.086175f, -0.108098f, -0.028080f, 0.068297f, 0.117080f, 0.133674f, 0.164582f, 0.217773f, 0.236408f, 0.146856f, -0.037683f, -0.182002f, -0.158627f, -0.006930f, 0.106384f, 0.089821f, 0.015786f, -0.009329f, 0.016630f, 0.027747f, 0.002433f, -0.022946f, -0.022944f, -0.008213f}
+ },
+ {
+ {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f,
+ -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f,
+ 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f},
+ {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f,
+ -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f,
+ 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f}
+ },
+ {
+ {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f,
+ -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f,
+ 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f},
+ {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f,
+ -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f,
+ 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f}
+ },
+ {
+ {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f,
+ -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f,
+ 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f},
+ {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f,
+ -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f,
+ 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f}
+ }
+};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 32000 */
+
+const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1;
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}};
+const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0;
+const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]={
+ {
+ {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f,
+ 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f},
+ {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f,
+ 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f}
+ },
+ {
+ {0.025194f, 0.342112f, 0.675564f, 0.682494f, 0.258733f, -0.398681f, -0.973589f, -1.262576f, -1.256946f, -1.058731f, -0.764793f, -0.426634f, -0.073890f, 0.263727f, 0.559774f, 0.798438f, 0.971176f, 1.071852f, 1.099750f, 1.064803f, 0.985420f, 0.879037f, 0.754656f, 0.614706f, 0.462886f, 0.307828f, 0.158623f, 0.019325f, -0.110401f, -0.231143f, -0.342445f, -0.444256f, -0.537190f, -0.621517f, -0.697392f, -0.765776f, -0.828007f, -0.884703f, -0.935654f, -0.980323f, -1.017968f, -1.047912f, -1.070192f, -1.085582f, -1.094827f, -1.098295f, -1.096314f, -1.089341f, -1.077935f, -1.062999f, -1.045792f, -1.027186f, -1.007049f, -0.984675f, -0.959577f, -0.931701f, -0.901301f, -0.868883f, -0.835096f, -0.800590f, -0.766000f, -0.731849f, -0.698317f, -0.665445f, -0.633597f, -0.603249f, -0.574361f, -0.546664f, -0.520494f, -0.496496f, -0.474634f, -0.454436f, -0.436061f, -0.419958f, -0.405621f, -0.391915f, -0.378565f, -0.366066f, -0.354142f, -0.341591f, -0.327794f, -0.313265f, -0.298453f, -0.282899f, -0.265880f, -0.247319f, -0.227788f, -0.207881f, -0.187683f, -0.166750f, -0.144562f, -0.120841f, -0.095390f, -0.067900f, -0.038125f, -0.005978f,
+ 0.028618f, 0.065539f, 0.103963f, 0.142557f, 0.180312f, 0.216742f, 0.251282f, 0.283074f, 0.311414f, 0.335949f, 0.356498f, 0.373081f, 0.385974f, 0.395461f, 0.401900f, 0.406261f, 0.410013f, 0.414134f, 0.418648f, 0.423274f, 0.428046f, 0.433325f, 0.439768f, 0.448163f, 0.458716f, 0.470631f, 0.482794f, 0.494578f, 0.505783f, 0.516446f, 0.526959f, 0.537714f, 0.548520f, 0.558994f, 0.569308f, 0.579744f, 0.589954f, 0.599564f, 0.608906f, 0.618335f, 0.627675f, 0.637031f, 0.647025f, 0.657685f, 0.668438f, 0.679464f, 0.691511f, 0.704568f, 0.718501f, 0.734270f, 0.752608f, 0.772902f, 0.795176f, 0.820738f, 0.849727f, 0.882515f, 0.922967f, 0.969024f, 0.996502f, 0.969523f, 0.881689f, 0.774824f, 0.699914f, 0.669918f},
+ {-0.025194f, -0.342112f, -0.675564f, -0.682494f, -0.258733f, 0.398681f, 0.973589f, 1.262576f, 1.256946f, 1.058731f, 0.764793f, 0.426634f, 0.073890f, -0.263727f, -0.559774f, -0.798438f, -0.971176f, -1.071852f, -1.099750f, -1.064803f, -0.985420f, -0.879037f, -0.754656f, -0.614706f, -0.462886f, -0.307828f, -0.158623f, -0.019325f, 0.110401f, 0.231143f, 0.342445f, 0.444256f, 0.537190f, 0.621517f, 0.697392f, 0.765776f, 0.828007f, 0.884703f, 0.935654f, 0.980323f, 1.017968f, 1.047912f, 1.070192f, 1.085582f, 1.094827f, 1.098295f, 1.096314f, 1.089341f, 1.077935f, 1.062999f, 1.045792f, 1.027186f, 1.007049f, 0.984675f, 0.959577f, 0.931701f, 0.901301f, 0.868883f, 0.835096f, 0.800590f, 0.766000f, 0.731849f, 0.698317f, 0.665445f, 0.633597f, 0.603249f, 0.574361f, 0.546664f, 0.520494f, 0.496496f, 0.474634f, 0.454436f, 0.436061f, 0.419958f, 0.405621f, 0.391915f, 0.378565f, 0.366066f, 0.354142f, 0.341591f, 0.327794f, 0.313265f, 0.298453f, 0.282899f, 0.265880f, 0.247319f, 0.227788f, 0.207881f, 0.187683f, 0.166750f, 0.144562f, 0.120841f, 0.095390f, 0.067900f, 0.038125f, 0.005978f,
+ -0.028618f, -0.065539f, -0.103963f, -0.142557f, -0.180312f, -0.216742f, -0.251282f, -0.283074f, -0.311414f, -0.335949f, -0.356498f, -0.373081f, -0.385974f, -0.395461f, -0.401900f, -0.406261f, -0.410013f, -0.414134f, -0.418648f, -0.423274f, -0.428046f, -0.433325f, -0.439768f, -0.448163f, -0.458716f, -0.470631f, -0.482794f, -0.494578f, -0.505783f, -0.516446f, -0.526959f, -0.537714f, -0.548520f, -0.558994f, -0.569308f, -0.579744f, -0.589954f, -0.599564f, -0.608906f, -0.618335f, -0.627675f, -0.637031f, -0.647025f, -0.657685f, -0.668438f, -0.679464f, -0.691511f, -0.704568f, -0.718501f, -0.734270f, -0.752608f, -0.772902f, -0.795176f, -0.820738f, -0.849727f, -0.882515f, -0.922967f, -0.969024f, -0.996502f, -0.969523f, -0.881689f, -0.774824f, -0.699914f, -0.669918f}
+ },
+ {
+ {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f,
+ 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f},
+ {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f,
+ 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f}
+ },
+ {
+ {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f,
+ -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f},
+ {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f,
+ -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f}
+ },
+ {
+ {-0.005214f, -0.012035f, -0.009014f, 0.007877f, 0.019283f, 0.010352f, -0.005363f, -0.007510f, -0.007889f, -0.044647f, -0.130133f, -0.222011f, -0.261436f, -0.231829f, -0.165637f, -0.098922f, -0.037652f, 0.029690f, 0.105217f, 0.179277f, 0.244858f, 0.300922f, 0.344183f, 0.368195f, 0.371300f, 0.358203f, 0.332456f, 0.292925f, 0.238828f, 0.173336f, 0.100520f, 0.022498f, -0.058965f, -0.141179f, -0.221961f, -0.299269f, -0.368344f, -0.422261f, -0.457042f, -0.474532f, -0.479617f, -0.476556f, -0.468368f, -0.457295f, -0.444411f, -0.429759f, -0.413316f, -0.395072f, -0.374540f, -0.351376f, -0.326316f, -0.300687f, -0.275591f, -0.252211f, -0.231900f, -0.215002f, -0.200352f, -0.186616f, -0.173280f, -0.159962f, -0.145930f, -0.130822f, -0.114800f, -0.097728f, -0.079173f, -0.059239f, -0.038296f, -0.016038f, 0.008048f, 0.033506f, 0.059464f, 0.086049f, 0.113882f, 0.142353f, 0.169789f, 0.195294f, 0.218976f, 0.240131f, 0.256716f, 0.267460f, 0.273427f, 0.276291f, 0.275776f, 0.270341f, 0.260230f, 0.247866f, 0.234578f, 0.218792f, 0.198739f, 0.175404f, 0.151105f, 0.126417f, 0.100478f, 0.073625f, 0.047824f, 0.024650f,
+ 0.004240f, -0.013904f, -0.030088f, -0.044324f, -0.056473f, -0.066662f, -0.075552f, -0.083740f, -0.091164f, -0.097859f, -0.104823f, -0.112999f, -0.121758f, -0.129448f, -0.135168f, -0.139283f, -0.142788f, -0.146790f, -0.151766f, -0.156646f, -0.159449f, -0.159367f, -0.157478f, -0.155349f, -0.153958f, -0.153759f, -0.154479f, -0.154881f, -0.153809f, -0.151277f, -0.147765f, -0.143164f, -0.137159f, -0.129701f, -0.120395f, -0.108503f, -0.094137f, -0.078348f, -0.061862f, -0.044971f, -0.028452f, -0.013082f, 0.001363f, 0.015222f, 0.027814f, 0.038476f, 0.047586f, 0.055404f, 0.061486f, 0.066217f, 0.071000f, 0.076305f, 0.081762f, 0.088199f, 0.096942f, 0.108135f, 0.123108f, 0.145741f, 0.175423f, 0.200807f, 0.208485f, 0.197997f, 0.181833f, 0.171727f},
+ {0.005214f, 0.012035f, 0.009014f, -0.007877f, -0.019283f, -0.010352f, 0.005363f, 0.007510f, 0.007889f, 0.044647f, 0.130133f, 0.222011f, 0.261436f, 0.231829f, 0.165637f, 0.098922f, 0.037652f, -0.029690f, -0.105217f, -0.179277f, -0.244858f, -0.300922f, -0.344183f, -0.368195f, -0.371300f, -0.358203f, -0.332456f, -0.292925f, -0.238828f, -0.173336f, -0.100520f, -0.022498f, 0.058965f, 0.141179f, 0.221961f, 0.299269f, 0.368344f, 0.422261f, 0.457042f, 0.474532f, 0.479617f, 0.476556f, 0.468368f, 0.457295f, 0.444411f, 0.429759f, 0.413316f, 0.395072f, 0.374540f, 0.351376f, 0.326316f, 0.300687f, 0.275591f, 0.252211f, 0.231900f, 0.215002f, 0.200352f, 0.186616f, 0.173280f, 0.159962f, 0.145930f, 0.130822f, 0.114800f, 0.097728f, 0.079173f, 0.059239f, 0.038296f, 0.016038f, -0.008048f, -0.033506f, -0.059464f, -0.086049f, -0.113882f, -0.142353f, -0.169789f, -0.195294f, -0.218976f, -0.240131f, -0.256716f, -0.267460f, -0.273427f, -0.276291f, -0.275776f, -0.270341f, -0.260230f, -0.247866f, -0.234578f, -0.218792f, -0.198739f, -0.175404f, -0.151105f, -0.126417f, -0.100478f, -0.073625f, -0.047824f, -0.024650f,
+ -0.004240f, 0.013904f, 0.030088f, 0.044324f, 0.056473f, 0.066662f, 0.075552f, 0.083740f, 0.091164f, 0.097859f, 0.104823f, 0.112999f, 0.121758f, 0.129448f, 0.135168f, 0.139283f, 0.142788f, 0.146790f, 0.151766f, 0.156646f, 0.159449f, 0.159367f, 0.157478f, 0.155349f, 0.153958f, 0.153759f, 0.154479f, 0.154881f, 0.153809f, 0.151277f, 0.147765f, 0.143164f, 0.137159f, 0.129701f, 0.120395f, 0.108503f, 0.094137f, 0.078348f, 0.061862f, 0.044971f, 0.028452f, 0.013082f, -0.001363f, -0.015222f, -0.027814f, -0.038476f, -0.047586f, -0.055404f, -0.061486f, -0.066217f, -0.071000f, -0.076305f, -0.081762f, -0.088199f, -0.096942f, -0.108135f, -0.123108f, -0.145741f, -0.175423f, -0.200807f, -0.208485f, -0.197997f, -0.181833f, -0.171727f}
+ },
+ {
+ {0.008681f, -0.007006f, 0.004000f, 0.026347f, 0.002760f, -0.038331f, 0.006171f, 0.136506f, 0.198542f, 0.078413f, -0.135945f, -0.262918f, -0.236625f, -0.135691f, -0.048903f, 0.007812f, 0.055850f, 0.104669f, 0.150421f, 0.186943f, 0.205853f, 0.201553f, 0.178803f, 0.147187f, 0.112390f, 0.078987f, 0.053819f, 0.039640f, 0.032313f, 0.029119f, 0.032808f, 0.043807f, 0.055721f, 0.062616f, 0.065392f, 0.068013f, 0.071303f, 0.072155f, 0.066110f, 0.050305f, 0.025937f, -0.002323f, -0.030282f, -0.056406f, -0.080135f, -0.100964f, -0.120011f, -0.139825f, -0.161681f, -0.184845f, -0.208443f, -0.232018f, -0.254562f, -0.274818f, -0.291910f, -0.304396f, -0.309955f, -0.307333f, -0.297155f, -0.279908f, -0.255047f, -0.222884f, -0.185171f, -0.142916f, -0.095718f, -0.043976f, 0.010261f, 0.065148f, 0.119827f, 0.172971f, 0.222331f, 0.265979f, 0.302588f, 0.330642f, 0.348872f, 0.357338f, 0.356806f, 0.347327f, 0.328721f, 0.302266f, 0.270550f, 0.235332f, 0.196512f, 0.153780f, 0.108694f, 0.064148f, 0.021732f, -0.019338f, -0.060114f, -0.099823f, -0.136838f, -0.170677f, -0.201625f, -0.229144f, -0.252213f, -0.270647f,
+ -0.284574f, -0.293091f, -0.294909f, -0.290009f, -0.279511f, -0.264143f, -0.243706f, -0.217880f, -0.187362f, -0.154731f, -0.123924f, -0.097637f, -0.075158f, -0.053870f, -0.032820f, -0.013784f, 0.000845f, 0.010043f, 0.014447f, 0.015892f, 0.016428f, 0.016909f, 0.016785f, 0.015629f, 0.014101f, 0.013167f, 0.013445f, 0.015591f, 0.020168f, 0.026843f, 0.034697f, 0.043310f, 0.052551f, 0.061637f, 0.069506f, 0.075771f, 0.080384f, 0.082989f, 0.083492f, 0.082527f, 0.080660f, 0.077997f, 0.074980f, 0.072358f, 0.070026f, 0.067161f, 0.063681f, 0.060202f, 0.056641f, 0.052323f, 0.047305f, 0.042095f, 0.036453f, 0.029989f, 0.023331f, 0.017095f, 0.010304f, 0.001573f, -0.008448f, -0.017114f, -0.022058f, -0.022784f, -0.020762f, -0.018652f},
+ {-0.008681f, 0.007006f, -0.004000f, -0.026347f, -0.002760f, 0.038331f, -0.006171f, -0.136506f, -0.198542f, -0.078413f, 0.135945f, 0.262918f, 0.236625f, 0.135691f, 0.048903f, -0.007812f, -0.055850f, -0.104669f, -0.150421f, -0.186943f, -0.205853f, -0.201553f, -0.178803f, -0.147187f, -0.112390f, -0.078987f, -0.053819f, -0.039640f, -0.032313f, -0.029119f, -0.032808f, -0.043807f, -0.055721f, -0.062616f, -0.065392f, -0.068013f, -0.071303f, -0.072155f, -0.066110f, -0.050305f, -0.025937f, 0.002323f, 0.030282f, 0.056406f, 0.080135f, 0.100964f, 0.120011f, 0.139825f, 0.161681f, 0.184845f, 0.208443f, 0.232018f, 0.254562f, 0.274818f, 0.291910f, 0.304396f, 0.309955f, 0.307333f, 0.297155f, 0.279908f, 0.255047f, 0.222884f, 0.185171f, 0.142916f, 0.095718f, 0.043976f, -0.010261f, -0.065148f, -0.119827f, -0.172971f, -0.222331f, -0.265979f, -0.302588f, -0.330642f, -0.348872f, -0.357338f, -0.356806f, -0.347327f, -0.328721f, -0.302266f, -0.270550f, -0.235332f, -0.196512f, -0.153780f, -0.108694f, -0.064148f, -0.021732f, 0.019338f, 0.060114f, 0.099823f, 0.136838f, 0.170677f, 0.201625f, 0.229144f, 0.252213f, 0.270647f,
+ 0.284574f, 0.293091f, 0.294909f, 0.290009f, 0.279511f, 0.264143f, 0.243706f, 0.217880f, 0.187362f, 0.154731f, 0.123924f, 0.097637f, 0.075158f, 0.053870f, 0.032820f, 0.013784f, -0.000845f, -0.010043f, -0.014447f, -0.015892f, -0.016428f, -0.016909f, -0.016785f, -0.015629f, -0.014101f, -0.013167f, -0.013445f, -0.015591f, -0.020168f, -0.026843f, -0.034697f, -0.043310f, -0.052551f, -0.061637f, -0.069506f, -0.075771f, -0.080384f, -0.082989f, -0.083492f, -0.082527f, -0.080660f, -0.077997f, -0.074980f, -0.072358f, -0.070026f, -0.067161f, -0.063681f, -0.060202f, -0.056641f, -0.052323f, -0.047305f, -0.042095f, -0.036453f, -0.029989f, -0.023331f, -0.017095f, -0.010304f, -0.001573f, 0.008448f, 0.017114f, 0.022058f, 0.022784f, 0.020762f, 0.018652f}
+ },
+ {
+ {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f,
+ 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f},
+ {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f,
+ 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f}
+ },
+ {
+ {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f,
+ 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f},
+ {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f,
+ 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f}
+ },
+ {
+ {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f,
+ 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f},
+ {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f,
+ 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f}
+ }
+};
+const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]={
+ {
+ {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f,
+ 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f},
+ {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f,
+ 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f}
+ },
+ {
+ {0.137655f, 0.231573f, -0.061569f, -0.615380f, -1.083201f, -1.179039f, -0.870305f, -0.339584f, 0.195943f, 0.617719f, 0.906453f, 1.076009f, 1.134598f, 1.089734f, 0.958490f, 0.762775f, 0.522469f, 0.257386f, -0.009275f, -0.255153f, -0.467276f, -0.644940f, -0.793225f, -0.914050f, -1.004432f, -1.062573f, -1.092628f, -1.102031f, -1.096136f, -1.077334f, -1.047589f, -1.009280f, -0.964133f, -0.913278f, -0.858195f, -0.800334f, -0.740087f, -0.677018f, -0.610805f, -0.541506f, -0.469560f, -0.396052f, -0.322485f, -0.249955f, -0.178885f, -0.109588f, -0.042559f, 0.021688f, 0.082623f, 0.139743f, 0.193113f, 0.243630f, 0.292304f, 0.339419f, 0.384570f, 0.427151f, 0.466585f, 0.502409f, 0.534395f, 0.562517f, 0.586922f, 0.607994f, 0.626173f, 0.641582f, 0.654228f, 0.664541f, 0.673117f, 0.679999f, 0.684972f, 0.688494f, 0.691429f, 0.694010f, 0.696123f, 0.698431f, 0.702002f, 0.706919f, 0.712502f, 0.718834f, 0.726783f, 0.736462f, 0.746890f, 0.757392f, 0.768323f, 0.780141f, 0.792495f, 0.804563f, 0.815877f, 0.826652f, 0.837457f, 0.848656f, 0.860155f, 0.871670f, 0.883000f, 0.893877f, 0.903812f, 0.912257f,
+ 0.918585f, 0.921831f, 0.920971f, 0.915668f, 0.906299f, 0.893208f, 0.876460f, 0.856357f, 0.833641f, 0.809154f, 0.783725f, 0.758238f, 0.733466f, 0.710044f, 0.688800f, 0.670590f, 0.655493f, 0.642657f, 0.631241f, 0.621055f, 0.612285f, 0.605091f, 0.599433f, 0.594697f, 0.589631f, 0.583188f, 0.575258f, 0.566315f, 0.556840f, 0.547295f, 0.537964f, 0.528587f, 0.518763f, 0.508660f, 0.498613f, 0.488388f, 0.477700f, 0.466959f, 0.456614f, 0.446483f, 0.436467f, 0.426959f, 0.417879f, 0.408578f, 0.399091f, 0.390055f, 0.381339f, 0.372396f, 0.363526f, 0.354887f, 0.345302f, 0.333890f, 0.320994f, 0.305859f, 0.286532f, 0.262266f, 0.228831f, 0.171282f, 0.076774f, -0.036269f, -0.117427f, -0.129893f, -0.087208f, -0.028616f},
+ {-0.137655f, -0.231573f, 0.061569f, 0.615380f, 1.083201f, 1.179039f, 0.870305f, 0.339584f, -0.195943f, -0.617719f, -0.906453f, -1.076009f, -1.134598f, -1.089734f, -0.958490f, -0.762775f, -0.522469f, -0.257386f, 0.009275f, 0.255153f, 0.467276f, 0.644940f, 0.793225f, 0.914050f, 1.004432f, 1.062573f, 1.092628f, 1.102031f, 1.096136f, 1.077334f, 1.047589f, 1.009280f, 0.964133f, 0.913278f, 0.858195f, 0.800334f, 0.740087f, 0.677018f, 0.610805f, 0.541506f, 0.469560f, 0.396052f, 0.322485f, 0.249955f, 0.178885f, 0.109588f, 0.042559f, -0.021688f, -0.082623f, -0.139743f, -0.193113f, -0.243630f, -0.292304f, -0.339419f, -0.384570f, -0.427151f, -0.466585f, -0.502409f, -0.534395f, -0.562517f, -0.586922f, -0.607994f, -0.626173f, -0.641582f, -0.654228f, -0.664541f, -0.673117f, -0.679999f, -0.684972f, -0.688494f, -0.691429f, -0.694010f, -0.696123f, -0.698431f, -0.702002f, -0.706919f, -0.712502f, -0.718834f, -0.726783f, -0.736462f, -0.746890f, -0.757392f, -0.768323f, -0.780141f, -0.792495f, -0.804563f, -0.815877f, -0.826652f, -0.837457f, -0.848656f, -0.860155f, -0.871670f, -0.883000f, -0.893877f, -0.903812f, -0.912257f,
+ -0.918585f, -0.921831f, -0.920971f, -0.915668f, -0.906299f, -0.893208f, -0.876460f, -0.856357f, -0.833641f, -0.809154f, -0.783725f, -0.758238f, -0.733466f, -0.710044f, -0.688800f, -0.670590f, -0.655493f, -0.642657f, -0.631241f, -0.621055f, -0.612285f, -0.605091f, -0.599433f, -0.594697f, -0.589631f, -0.583188f, -0.575258f, -0.566315f, -0.556840f, -0.547295f, -0.537964f, -0.528587f, -0.518763f, -0.508660f, -0.498613f, -0.488388f, -0.477700f, -0.466959f, -0.456614f, -0.446483f, -0.436467f, -0.426959f, -0.417879f, -0.408578f, -0.399091f, -0.390055f, -0.381339f, -0.372396f, -0.363526f, -0.354887f, -0.345302f, -0.333890f, -0.320994f, -0.305859f, -0.286532f, -0.262266f, -0.228831f, -0.171282f, -0.076774f, 0.036269f, 0.117427f, 0.129893f, 0.087208f, 0.028616f}
+ },
+ {
+ {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f,
+ -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f},
+ {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f,
+ -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f}
+ },
+ {
+ {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f,
+ -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f},
+ {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f,
+ -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f}
+ },
+ {
+ {-0.003949f, -0.004065f, 0.004529f, 0.003058f, -0.017910f, -0.041346f, -0.049210f, -0.053546f, -0.080846f, -0.125171f, -0.138752f, -0.082301f, 0.027313f, 0.134102f, 0.200608f, 0.233142f, 0.253660f, 0.266920f, 0.262970f, 0.237188f, 0.194063f, 0.136745f, 0.064986f, -0.017247f, -0.101044f, -0.180693f, -0.256442f, -0.328205f, -0.391843f, -0.443152f, -0.481210f, -0.506165f, -0.517126f, -0.513522f, -0.495538f, -0.462242f, -0.412470f, -0.349030f, -0.279619f, -0.212173f, -0.150791f, -0.096336f, -0.048496f, -0.006238f, 0.031944f, 0.067046f, 0.099419f, 0.129417f, 0.157110f, 0.181639f, 0.201899f, 0.217571f, 0.228864f, 0.236108f, 0.240440f, 0.243939f, 0.248173f, 0.253310f, 0.259111f, 0.265714f, 0.273010f, 0.280389f, 0.287541f, 0.294554f, 0.301097f, 0.306552f, 0.310894f, 0.314304f, 0.316123f, 0.315383f, 0.312099f, 0.306725f, 0.298589f, 0.286282f, 0.269490f, 0.249062f, 0.225223f, 0.197242f, 0.165404f, 0.131961f, 0.099076f, 0.066683f, 0.033703f, 0.000877f, -0.029410f, -0.056340f, -0.081745f, -0.106984f, -0.130473f, -0.149782f, -0.164778f, -0.176837f, -0.185968f, -0.190743f, -0.190692f, -0.187082f,
+ -0.181465f, -0.174611f, -0.166752f, -0.158044f, -0.148865f, -0.139889f, -0.131570f, -0.123691f, -0.116025f, -0.109038f, -0.102988f, -0.096774f, -0.088859f, -0.079067f, -0.068595f, -0.058652f, -0.049731f, -0.041459f, -0.032502f, -0.021490f, -0.008698f, 0.003957f, 0.014879f, 0.023943f, 0.031863f, 0.039641f, 0.048517f, 0.059156f, 0.070934f, 0.082892f, 0.094921f, 0.107290f, 0.119849f, 0.132466f, 0.145202f, 0.157413f, 0.167770f, 0.175597f, 0.181049f, 0.184050f, 0.184444f, 0.182904f, 0.180196f, 0.176079f, 0.170279f, 0.163603f, 0.156847f, 0.149956f, 0.143323f, 0.138140f, 0.134607f, 0.131865f, 0.130015f, 0.129755f, 0.130428f, 0.131261f, 0.132652f, 0.131757f, 0.119661f, 0.090367f, 0.051746f, 0.020184f, 0.004349f, 0.000237f},
+ {0.003949f, 0.004065f, -0.004529f, -0.003058f, 0.017910f, 0.041346f, 0.049210f, 0.053546f, 0.080846f, 0.125171f, 0.138752f, 0.082301f, -0.027313f, -0.134102f, -0.200608f, -0.233142f, -0.253660f, -0.266920f, -0.262970f, -0.237188f, -0.194063f, -0.136745f, -0.064986f, 0.017247f, 0.101044f, 0.180693f, 0.256442f, 0.328205f, 0.391843f, 0.443152f, 0.481210f, 0.506165f, 0.517126f, 0.513522f, 0.495538f, 0.462242f, 0.412470f, 0.349030f, 0.279619f, 0.212173f, 0.150791f, 0.096336f, 0.048496f, 0.006238f, -0.031944f, -0.067046f, -0.099419f, -0.129417f, -0.157110f, -0.181639f, -0.201899f, -0.217571f, -0.228864f, -0.236108f, -0.240440f, -0.243939f, -0.248173f, -0.253310f, -0.259111f, -0.265714f, -0.273010f, -0.280389f, -0.287541f, -0.294554f, -0.301097f, -0.306552f, -0.310894f, -0.314304f, -0.316123f, -0.315383f, -0.312099f, -0.306725f, -0.298589f, -0.286282f, -0.269490f, -0.249062f, -0.225223f, -0.197242f, -0.165404f, -0.131961f, -0.099076f, -0.066683f, -0.033703f, -0.000877f, 0.029410f, 0.056340f, 0.081745f, 0.106984f, 0.130473f, 0.149782f, 0.164778f, 0.176837f, 0.185968f, 0.190743f, 0.190692f, 0.187082f,
+ 0.181465f, 0.174611f, 0.166752f, 0.158044f, 0.148865f, 0.139889f, 0.131570f, 0.123691f, 0.116025f, 0.109038f, 0.102988f, 0.096774f, 0.088859f, 0.079067f, 0.068595f, 0.058652f, 0.049731f, 0.041459f, 0.032502f, 0.021490f, 0.008698f, -0.003957f, -0.014879f, -0.023943f, -0.031863f, -0.039641f, -0.048517f, -0.059156f, -0.070934f, -0.082892f, -0.094921f, -0.107290f, -0.119849f, -0.132466f, -0.145202f, -0.157413f, -0.167770f, -0.175597f, -0.181049f, -0.184050f, -0.184444f, -0.182904f, -0.180196f, -0.176079f, -0.170279f, -0.163603f, -0.156847f, -0.149956f, -0.143323f, -0.138140f, -0.134607f, -0.131865f, -0.130015f, -0.129755f, -0.130428f, -0.131261f, -0.132652f, -0.131757f, -0.119661f, -0.090367f, -0.051746f, -0.020184f, -0.004349f, -0.000237f}
+ },
+ {
+ {-0.006838f, -0.000073f, 0.019569f, 0.004812f, -0.021179f, 0.017001f, 0.095357f, 0.079254f, -0.080727f, -0.242975f, -0.239933f, -0.079038f, 0.094027f, 0.179068f, 0.192210f, 0.186347f, 0.179576f, 0.164512f, 0.135604f, 0.091894f, 0.036418f, -0.019928f, -0.065074f, -0.095268f, -0.111552f, -0.113737f, -0.104494f, -0.091666f, -0.080317f, -0.069042f, -0.057974f, -0.052882f, -0.057423f, -0.067725f, -0.078296f, -0.088767f, -0.102514f, -0.121895f, -0.145878f, -0.170008f, -0.188674f, -0.199029f, -0.202203f, -0.200419f, -0.195060f, -0.187856f, -0.180908f, -0.174383f, -0.166293f, -0.154984f, -0.140002f, -0.120815f, -0.096730f, -0.067714f, -0.033820f, 0.005223f, 0.048523f, 0.093540f, 0.138202f, 0.181886f, 0.223555f, 0.261046f, 0.293122f, 0.320062f, 0.341424f, 0.355281f, 0.360314f, 0.356691f, 0.344454f, 0.322937f, 0.292135f, 0.253115f, 0.207016f, 0.155091f, 0.099534f, 0.042831f, -0.013572f, -0.068750f, -0.120804f, -0.167303f, -0.207256f, -0.241508f, -0.270731f, -0.293815f, -0.309031f, -0.316475f, -0.318315f, -0.316263f, -0.309841f, -0.297894f, -0.280743f, -0.259596f, -0.234760f, -0.205963f, -0.173776f, -0.139211f,
+ -0.102436f, -0.063409f, -0.023388f, 0.015541f, 0.052145f, 0.086261f, 0.117562f, 0.144705f, 0.165452f, 0.177810f, 0.181963f, 0.180989f, 0.178411f, 0.174952f, 0.168699f, 0.158230f, 0.144450f, 0.129742f, 0.116497f, 0.106152f, 0.098556f, 0.092438f, 0.087095f, 0.083117f, 0.081219f, 0.081325f, 0.083051f, 0.085959f, 0.089030f, 0.090997f, 0.091374f, 0.090241f, 0.087241f, 0.081872f, 0.074446f, 0.065721f, 0.056063f, 0.045844f, 0.035939f, 0.026995f, 0.018956f, 0.011839f, 0.005924f, 0.000823f, -0.004378f, -0.009757f, -0.014627f, -0.018984f, -0.023457f, -0.027936f, -0.031769f, -0.035015f, -0.038036f, -0.040342f, -0.041399f, -0.041932f, -0.042717f, -0.042585f, -0.039224f, -0.031819f, -0.021956f, -0.012357f, -0.005285f, -0.001296f},
+ {0.006838f, 0.000073f, -0.019569f, -0.004812f, 0.021179f, -0.017001f, -0.095357f, -0.079254f, 0.080727f, 0.242975f, 0.239933f, 0.079038f, -0.094027f, -0.179068f, -0.192210f, -0.186347f, -0.179576f, -0.164512f, -0.135604f, -0.091894f, -0.036418f, 0.019928f, 0.065074f, 0.095268f, 0.111552f, 0.113737f, 0.104494f, 0.091666f, 0.080317f, 0.069042f, 0.057974f, 0.052882f, 0.057423f, 0.067725f, 0.078296f, 0.088767f, 0.102514f, 0.121895f, 0.145878f, 0.170008f, 0.188674f, 0.199029f, 0.202203f, 0.200419f, 0.195060f, 0.187856f, 0.180908f, 0.174383f, 0.166293f, 0.154984f, 0.140002f, 0.120815f, 0.096730f, 0.067714f, 0.033820f, -0.005223f, -0.048523f, -0.093540f, -0.138202f, -0.181886f, -0.223555f, -0.261046f, -0.293122f, -0.320062f, -0.341424f, -0.355281f, -0.360314f, -0.356691f, -0.344454f, -0.322937f, -0.292135f, -0.253115f, -0.207016f, -0.155091f, -0.099534f, -0.042831f, 0.013572f, 0.068750f, 0.120804f, 0.167303f, 0.207256f, 0.241508f, 0.270731f, 0.293815f, 0.309031f, 0.316475f, 0.318315f, 0.316263f, 0.309841f, 0.297894f, 0.280743f, 0.259596f, 0.234760f, 0.205963f, 0.173776f, 0.139211f,
+ 0.102436f, 0.063409f, 0.023388f, -0.015541f, -0.052145f, -0.086261f, -0.117562f, -0.144705f, -0.165452f, -0.177810f, -0.181963f, -0.180989f, -0.178411f, -0.174952f, -0.168699f, -0.158230f, -0.144450f, -0.129742f, -0.116497f, -0.106152f, -0.098556f, -0.092438f, -0.087095f, -0.083117f, -0.081219f, -0.081325f, -0.083051f, -0.085959f, -0.089030f, -0.090997f, -0.091374f, -0.090241f, -0.087241f, -0.081872f, -0.074446f, -0.065721f, -0.056063f, -0.045844f, -0.035939f, -0.026995f, -0.018956f, -0.011839f, -0.005924f, -0.000823f, 0.004378f, 0.009757f, 0.014627f, 0.018984f, 0.023457f, 0.027936f, 0.031769f, 0.035015f, 0.038036f, 0.040342f, 0.041399f, 0.041932f, 0.042717f, 0.042585f, 0.039224f, 0.031819f, 0.021956f, 0.012357f, 0.005285f, 0.001296f}
+ },
+ {
+ {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f,
+ -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f},
+ {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f,
+ -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f}
+ },
+ {
+ {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f,
+ -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f},
+ {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f,
+ -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f}
+ },
+ {
+ {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f,
+ -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f},
+ {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f,
+ -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f}
+ }
+};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 16000 */
+
+const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1;
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}};
+const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0;
+const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]={
+ {
+ { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f},
+ { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f}
+ },
+ {
+ { -0.012443f, 0.306951f, 0.640002f, 0.644701f, 0.222035f, -0.433014f, -1.009059f, -1.299682f, -1.291983f, -1.091837f, -0.799579f, -0.462162f, -0.106609f, 0.232265f, 0.526384f, 0.765415f, 0.941389f, 1.042514f, 1.068606f, 1.035233f, 0.959157f, 0.852416f, 0.726756f, 0.589559f, 0.440759f, 0.284682f, 0.135118f, -0.000404f, -0.127707f, -0.249843f, -0.360240f, -0.457524f, -0.548845f, -0.634531f, -0.707989f, -0.771448f, -0.832955f, -0.890467f, -0.937355f, -0.977102f, -1.014815f, -1.044459f, -1.061037f, -1.071895f, -1.081707f, -1.083157f, -1.073972f, -1.063175f, -1.052317f, -1.033040f, -1.007384f, -0.985836f, -0.965459f, -0.935829f, -0.901362f, -0.871368f, -0.838870f, -0.795666f, -0.751917f, -0.715707f, -0.675655f, -0.626445f, -0.582556f, -0.547393f, -0.504423f, -0.453551f, -0.413720f, -0.380963f, -0.333822f, -0.281188f, -0.246458f, -0.212864f, -0.152864f, -0.091358f, -0.055541f, 0.008028f, 0.159750f, 0.338247f, 0.427051f, 0.426619f},
+ { 0.012443f, -0.306951f, -0.640002f, -0.644701f, -0.222035f, 0.433014f, 1.009059f, 1.299682f, 1.291983f, 1.091837f, 0.799579f, 0.462162f, 0.106609f, -0.232265f, -0.526384f, -0.765415f, -0.941389f, -1.042514f, -1.068606f, -1.035233f, -0.959157f, -0.852416f, -0.726756f, -0.589559f, -0.440759f, -0.284682f, -0.135118f, 0.000404f, 0.127707f, 0.249843f, 0.360240f, 0.457524f, 0.548845f, 0.634531f, 0.707989f, 0.771448f, 0.832955f, 0.890467f, 0.937355f, 0.977102f, 1.014815f, 1.044459f, 1.061037f, 1.071895f, 1.081707f, 1.083157f, 1.073972f, 1.063175f, 1.052317f, 1.033040f, 1.007384f, 0.985836f, 0.965459f, 0.935829f, 0.901362f, 0.871368f, 0.838870f, 0.795666f, 0.751917f, 0.715707f, 0.675655f, 0.626445f, 0.582556f, 0.547393f, 0.504423f, 0.453551f, 0.413720f, 0.380963f, 0.333822f, 0.281188f, 0.246458f, 0.212864f, 0.152864f, 0.091358f, 0.055541f, -0.008028f, -0.159750f, -0.338247f, -0.427051f, -0.426619f}
+ },
+ {
+ { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f},
+ { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f}
+ },
+ {
+ { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f},
+ { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f}
+ },
+ {
+ { 0.000686f, -0.005679f, -0.002736f, 0.013737f, 0.025339f, 0.016835f, 0.000897f, -0.001565f, -0.001575f, -0.037994f, -0.123814f, -0.215847f, -0.254773f, -0.224963f, -0.159158f, -0.092400f, -0.030561f, 0.036822f, 0.111977f, 0.186298f, 0.252449f, 0.308392f, 0.351372f, 0.375856f, 0.379463f, 0.366110f, 0.340246f, 0.301367f, 0.247642f, 0.181811f, 0.109110f, 0.031862f, -0.049402f, -0.131957f, -0.212350f, -0.288831f, -0.357898f, -0.412063f, -0.446158f, -0.462855f, -0.468107f, -0.465087f, -0.455925f, -0.444179f, -0.431579f, -0.416646f, -0.398983f, -0.380257f, -0.360020f, -0.336141f, -0.309688f, -0.283814f, -0.258868f, -0.234234f, -0.212458f, -0.195547f, -0.180677f, -0.165064f, -0.150310f, -0.137125f, -0.122189f, -0.104504f, -0.087232f, -0.070209f, -0.049591f, -0.026301f, -0.004365f, 0.018481f, 0.046634f, 0.076352f, 0.103125f, 0.132539f, 0.168518f, 0.202438f, 0.232093f, 0.272054f, 0.318122f, 0.326574f, 0.271717f, 0.205315f},
+ { -0.000686f, 0.005679f, 0.002736f, -0.013737f, -0.025339f, -0.016835f, -0.000897f, 0.001565f, 0.001575f, 0.037994f, 0.123814f, 0.215847f, 0.254773f, 0.224963f, 0.159158f, 0.092400f, 0.030561f, -0.036822f, -0.111977f, -0.186298f, -0.252449f, -0.308392f, -0.351372f, -0.375856f, -0.379463f, -0.366110f, -0.340246f, -0.301367f, -0.247642f, -0.181811f, -0.109110f, -0.031862f, 0.049402f, 0.131957f, 0.212350f, 0.288831f, 0.357898f, 0.412063f, 0.446158f, 0.462855f, 0.468107f, 0.465087f, 0.455925f, 0.444179f, 0.431579f, 0.416646f, 0.398983f, 0.380257f, 0.360020f, 0.336141f, 0.309688f, 0.283814f, 0.258868f, 0.234234f, 0.212458f, 0.195547f, 0.180677f, 0.165064f, 0.150310f, 0.137125f, 0.122189f, 0.104504f, 0.087232f, 0.070209f, 0.049591f, 0.026301f, 0.004365f, -0.018481f, -0.046634f, -0.076352f, -0.103125f, -0.132539f, -0.168518f, -0.202438f, -0.232093f, -0.272054f, -0.318122f, -0.326574f, -0.271717f, -0.205315f}
+ },
+ {
+ { 0.007904f, -0.008429f, 0.002701f, 0.025666f, 0.001826f, -0.039845f, 0.005012f, 0.135846f, 0.197408f, 0.076852f, -0.136969f, -0.263642f, -0.237977f, -0.137254f, -0.049823f, 0.006941f, 0.054280f, 0.103144f, 0.149549f, 0.185848f, 0.204085f, 0.200088f, 0.177900f, 0.145801f, 0.110457f, 0.077582f, 0.052788f, 0.037914f, 0.030252f, 0.027742f, 0.031540f, 0.041709f, 0.053562f, 0.061202f, 0.063767f, 0.065527f, 0.069061f, 0.070600f, 0.064006f, 0.047422f, 0.023594f, -0.004162f, -0.032992f, -0.059696f, -0.082643f, -0.103277f, -0.123459f, -0.143553f, -0.164480f, -0.187877f, -0.212785f, -0.236261f, -0.257871f, -0.278890f, -0.297353f, -0.309320f, -0.314125f, -0.312895f, -0.304021f, -0.285839f, -0.260655f, -0.230623f, -0.194026f, -0.150485f, -0.103758f, -0.055096f, -0.001701f, 0.054669f, 0.107407f, 0.155932f, 0.204710f, 0.249689f, 0.280936f, 0.300421f, 0.318178f, 0.326332f, 0.297895f, 0.222216f, 0.128176f, 0.064416f},
+ { -0.007904f, 0.008429f, -0.002701f, -0.025666f, -0.001826f, 0.039845f, -0.005012f, -0.135846f, -0.197408f, -0.076852f, 0.136969f, 0.263642f, 0.237977f, 0.137254f, 0.049823f, -0.006941f, -0.054280f, -0.103144f, -0.149549f, -0.185848f, -0.204085f, -0.200088f, -0.177900f, -0.145801f, -0.110457f, -0.077582f, -0.052788f, -0.037914f, -0.030252f, -0.027742f, -0.031540f, -0.041709f, -0.053562f, -0.061202f, -0.063767f, -0.065527f, -0.069061f, -0.070600f, -0.064006f, -0.047422f, -0.023594f, 0.004162f, 0.032992f, 0.059696f, 0.082643f, 0.103277f, 0.123459f, 0.143553f, 0.164480f, 0.187877f, 0.212785f, 0.236261f, 0.257871f, 0.278890f, 0.297353f, 0.309320f, 0.314125f, 0.312895f, 0.304021f, 0.285839f, 0.260655f, 0.230623f, 0.194026f, 0.150485f, 0.103758f, 0.055096f, 0.001701f, -0.054669f, -0.107407f, -0.155932f, -0.204710f, -0.249689f, -0.280936f, -0.300421f, -0.318178f, -0.326332f, -0.297895f, -0.222216f, -0.128176f, -0.064416f}
+ },
+ {
+ { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f},
+ { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f}
+ },
+ {
+ { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f},
+ { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f}
+ },
+ {
+ { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f},
+ { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f}
+ }
+};
+const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={
+ {
+ { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f},
+ { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f}
+ },
+ {
+ { 0.137891f, 0.229594f, -0.067928f, -0.623005f, -1.090538f, -1.189519f, -0.884822f, -0.354524f, 0.180758f, 0.598608f, 0.883947f, 1.053700f, 1.111227f, 1.061907f, 0.928126f, 0.732907f, 0.490534f, 0.220795f, -0.047441f, -0.292902f, -0.508160f, -0.690313f, -0.839240f, -0.960125f, -1.054642f, -1.116743f, -1.146677f, -1.156988f, -1.156022f, -1.140346f, -1.110014f, -1.073762f, -1.034019f, -0.985244f, -0.929519f, -0.875052f, -0.820278f, -0.758166f, -0.691738f, -0.627222f, -0.560364f, -0.486773f, -0.413937f, -0.347468f, -0.280644f, -0.210486f, -0.145643f, -0.088457f, -0.030518f, 0.027797f, 0.077074f, 0.119974f, 0.167213f, 0.215231f, 0.254026f, 0.289039f, 0.328776f, 0.364400f, 0.387539f, 0.408919f, 0.435376f, 0.454122f, 0.460897f, 0.471406f, 0.487696f, 0.492222f, 0.486983f, 0.492364f, 0.502301f, 0.494577f, 0.481913f, 0.489869f, 0.498275f, 0.479752f, 0.470075f, 0.504969f, 0.517158f, 0.412306f, 0.223203f, 0.061484f},
+ { -0.137891f, -0.229594f, 0.067928f, 0.623005f, 1.090538f, 1.189519f, 0.884822f, 0.354524f, -0.180758f, -0.598608f, -0.883947f, -1.053700f, -1.111227f, -1.061907f, -0.928126f, -0.732907f, -0.490534f, -0.220795f, 0.047441f, 0.292902f, 0.508160f, 0.690313f, 0.839240f, 0.960125f, 1.054642f, 1.116743f, 1.146677f, 1.156988f, 1.156022f, 1.140346f, 1.110014f, 1.073762f, 1.034019f, 0.985244f, 0.929519f, 0.875052f, 0.820278f, 0.758166f, 0.691738f, 0.627222f, 0.560364f, 0.486773f, 0.413937f, 0.347468f, 0.280644f, 0.210486f, 0.145643f, 0.088457f, 0.030518f, -0.027797f, -0.077074f, -0.119974f, -0.167213f, -0.215231f, -0.254026f, -0.289039f, -0.328776f, -0.364400f, -0.387539f, -0.408919f, -0.435376f, -0.454122f, -0.460897f, -0.471406f, -0.487696f, -0.492222f, -0.486983f, -0.492364f, -0.502301f, -0.494577f, -0.481913f, -0.489869f, -0.498275f, -0.479752f, -0.470075f, -0.504969f, -0.517158f, -0.412306f, -0.223203f, -0.061484f}
+ },
+ {
+ { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f},
+ { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f}
+ },
+ {
+ { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f},
+ { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f}
+ },
+ {
+ { -0.003822f, -0.004182f, 0.003769f, 0.002231f, -0.018518f, -0.042371f, -0.050814f, -0.055060f, -0.082241f, -0.127129f, -0.141168f, -0.084513f, 0.025067f, 0.131195f, 0.197402f, 0.230196f, 0.250490f, 0.263052f, 0.258983f, 0.233443f, 0.189892f, 0.131909f, 0.060205f, -0.021879f, -0.106291f, -0.186505f, -0.262057f, -0.333838f, -0.398243f, -0.449958f, -0.487738f, -0.512937f, -0.524754f, -0.521358f, -0.503097f, -0.470311f, -0.421405f, -0.357963f, -0.288378f, -0.221718f, -0.161127f, -0.106483f, -0.058681f, -0.017466f, 0.020089f, 0.055500f, 0.087512f, 0.116263f, 0.143565f, 0.168412f, 0.187881f, 0.202191f, 0.213370f, 0.220775f, 0.223797f, 0.225934f, 0.230320f, 0.235230f, 0.239129f, 0.244505f, 0.252120f, 0.258553f, 0.263155f, 0.269212f, 0.275974f, 0.279247f, 0.280325f, 0.283134f, 0.284382f, 0.279208f, 0.271780f, 0.265915f, 0.254057f, 0.231999f, 0.209308f, 0.183649f, 0.128013f, 0.038161f, -0.030805f, -0.024799f},
+ { 0.003822f, 0.004182f, -0.003769f, -0.002231f, 0.018518f, 0.042371f, 0.050814f, 0.055060f, 0.082241f, 0.127129f, 0.141168f, 0.084513f, -0.025067f, -0.131195f, -0.197402f, -0.230196f, -0.250490f, -0.263052f, -0.258983f, -0.233443f, -0.189892f, -0.131909f, -0.060205f, 0.021879f, 0.106291f, 0.186505f, 0.262057f, 0.333838f, 0.398243f, 0.449958f, 0.487738f, 0.512937f, 0.524754f, 0.521358f, 0.503097f, 0.470311f, 0.421405f, 0.357963f, 0.288378f, 0.221718f, 0.161127f, 0.106483f, 0.058681f, 0.017466f, -0.020089f, -0.055500f, -0.087512f, -0.116263f, -0.143565f, -0.168412f, -0.187881f, -0.202191f, -0.213370f, -0.220775f, -0.223797f, -0.225934f, -0.230320f, -0.235230f, -0.239129f, -0.244505f, -0.252120f, -0.258553f, -0.263155f, -0.269212f, -0.275974f, -0.279247f, -0.280325f, -0.283134f, -0.284382f, -0.279208f, -0.271780f, -0.265915f, -0.254057f, -0.231999f, -0.209308f, -0.183649f, -0.128013f, -0.038161f, 0.030805f, 0.024799f}
+ },
+ {
+ { -0.007141f, -0.000269f, 0.020053f, 0.005151f, -0.021397f, 0.017134f, 0.096077f, 0.079602f, -0.080798f, -0.242492f, -0.239038f, -0.078682f, 0.094173f, 0.179901f, 0.193223f, 0.186734f, 0.180011f, 0.165677f, 0.136686f, 0.092362f, 0.037203f, -0.018468f, -0.063954f, -0.094649f, -0.110368f, -0.112031f, -0.103341f, -0.090810f, -0.078704f, -0.067141f, -0.056765f, -0.051692f, -0.055372f, -0.065676f, -0.076978f, -0.087145f, -0.100035f, -0.119731f, -0.144366f, -0.167862f, -0.185792f, -0.196760f, -0.200382f, -0.197667f, -0.191812f, -0.185459f, -0.178637f, -0.170957f, -0.162715f, -0.152400f, -0.137119f, -0.116662f, -0.092858f, -0.064845f, -0.030146f, 0.010135f, 0.052660f, 0.096829f, 0.142849f, 0.187559f, 0.227910f, 0.264896f, 0.298909f, 0.326420f, 0.345843f, 0.359746f, 0.367295f, 0.363369f, 0.348300f, 0.327585f, 0.299800f, 0.258398f, 0.207127f, 0.156648f, 0.103405f, 0.032624f, -0.049949f, -0.107648f, -0.105316f, -0.043186f},
+ { 0.007141f, 0.000269f, -0.020053f, -0.005151f, 0.021397f, -0.017134f, -0.096077f, -0.079602f, 0.080798f, 0.242492f, 0.239038f, 0.078682f, -0.094173f, -0.179901f, -0.193223f, -0.186734f, -0.180011f, -0.165677f, -0.136686f, -0.092362f, -0.037203f, 0.018468f, 0.063954f, 0.094649f, 0.110368f, 0.112031f, 0.103341f, 0.090810f, 0.078704f, 0.067141f, 0.056765f, 0.051692f, 0.055372f, 0.065676f, 0.076978f, 0.087145f, 0.100035f, 0.119731f, 0.144366f, 0.167862f, 0.185792f, 0.196760f, 0.200382f, 0.197667f, 0.191812f, 0.185459f, 0.178637f, 0.170957f, 0.162715f, 0.152400f, 0.137119f, 0.116662f, 0.092858f, 0.064845f, 0.030146f, -0.010135f, -0.052660f, -0.096829f, -0.142849f, -0.187559f, -0.227910f, -0.264896f, -0.298909f, -0.326420f, -0.345843f, -0.359746f, -0.367295f, -0.363369f, -0.348300f, -0.327585f, -0.299800f, -0.258398f, -0.207127f, -0.156648f, -0.103405f, -0.032624f, 0.049949f, 0.107648f, 0.105316f, 0.043186f}
+ },
+ {
+ { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f},
+ { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f}
+ },
+ {
+ { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f},
+ { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f}
+ },
+ {
+ { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f},
+ { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f}
+ }
+};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_HOA3_HRIR **********************/
+
+#ifdef UPDATE_SBA_FILTER
+const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f;
+#else
+const float CRendBin_HOA3_HRIR_latency_s = 0.000020833333110f;
+#endif
+
+/* Sample Rate = 48000 */
+
+const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1;
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}};
+const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0;
+const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]={
+ {
+ {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f,
+ 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f,
+ 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f},
+ {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f,
+ 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f,
+ 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f}
+ },
+ {
+ {0.073227f, 0.301823f, 0.659487f, 0.955673f, 1.013690f, 0.793634f, 0.374105f, -0.142456f, -0.636566f, -0.963913f, -1.063402f, -1.003613f, -0.793969f, -0.284345f, 0.500040f, 1.037338f, 0.731315f, -0.256929f, -0.976234f, -0.710231f, 0.228481f, 0.963086f, 1.064126f, 0.788617f, 0.498005f, 0.250379f, -0.019938f, -0.265502f, -0.411395f, -0.490847f, -0.571594f, -0.649046f, -0.690175f, -0.706288f, -0.723736f, -0.737713f, -0.735526f, -0.724667f, -0.712804f, -0.692713f, -0.661167f, -0.626102f, -0.589545f, -0.546090f, -0.498002f, -0.452447f, -0.407806f, -0.359001f, -0.309737f, -0.266056f, -0.225762f, -0.184774f, -0.145070f, -0.108495f, -0.071916f, -0.033988f, 0.002132f, 0.035682f, 0.069246f, 0.102139f, 0.131153f, 0.156988f, 0.182356f, 0.205965f, 0.225206f, 0.241562f, 0.257404f, 0.271324f, 0.281570f, 0.289838f, 0.297808f, 0.304325f, 0.308777f, 0.312991f, 0.318081f, 0.323338f, 0.328814f, 0.335493f, 0.343315f, 0.351924f, 0.361990f, 0.373445f, 0.384675f, 0.395327f, 0.406987f, 0.419758f, 0.431579f, 0.441848f, 0.452193f, 0.463217f, 0.473985f, 0.484732f, 0.496782f, 0.510255f, 0.524670f, 0.540714f,
+ 0.558946f, 0.578263f, 0.597653f, 0.617532f, 0.637778f, 0.656691f, 0.673126f, 0.687434f, 0.699645f, 0.708958f, 0.715168f, 0.718470f, 0.718323f, 0.714568f, 0.708854f, 0.703133f, 0.697784f, 0.692574f, 0.687835f, 0.683584f, 0.679336f, 0.675668f, 0.674108f, 0.674971f, 0.677066f, 0.679457f, 0.681721f, 0.683072f, 0.683153f, 0.682996f, 0.683558f, 0.684336f, 0.684660f, 0.684936f, 0.685504f, 0.685877f, 0.685935f, 0.686278f, 0.686908f, 0.687209f, 0.687279f, 0.687704f, 0.688320f, 0.688672f, 0.689087f, 0.689985f, 0.691034f, 0.692103f, 0.693870f, 0.696717f, 0.700287f, 0.704592f, 0.710078f, 0.716487f, 0.723147f, 0.730171f, 0.737961f, 0.746101f, 0.754088f, 0.762266f, 0.770876f, 0.779330f, 0.787325f, 0.795322f, 0.803321f, 0.810685f, 0.817438f, 0.824131f, 0.830559f, 0.836142f, 0.841071f, 0.845643f, 0.849388f, 0.852128f, 0.854615f, 0.857157f, 0.859203f, 0.860848f, 0.862840f, 0.864890f, 0.866029f, 0.866351f, 0.866455f, 0.866032f, 0.864930f, 0.864120f, 0.863977f, 0.863628f, 0.863131f, 0.863615f, 0.864728f, 0.865122f, 0.865257f, 0.866254f, 0.867273f, 0.867579f,
+ 0.868533f, 0.870222f, 0.870634f, 0.870784f, 0.873682f, 0.876733f, 0.875499f, 0.874870f, 0.881460f, 0.887147f, 0.882040f, 0.879821f, 0.897958f, 0.915002f, 0.891682f, 0.839628f, 0.817204f, 0.843673f, 0.874820f, 0.884019f, 0.901906f, 0.940936f, 0.947666f, 0.883159f, 0.797756f, 0.768151f, 0.798253f, 0.832623f, 0.835284f, 0.812421f, 0.787095f, 0.782104f, 0.791333f, 0.748682f, 0.584396f, 0.345257f, 0.192332f, 0.226244f, 0.368019f, 0.468300f, 0.484212f, 0.482396f, 0.505439f, 0.513973f, 0.457796f, 0.345461f, 0.230189f, 0.161014f},
+ {-0.073227f, -0.301823f, -0.659487f, -0.955673f, -1.013690f, -0.793634f, -0.374105f, 0.142456f, 0.636566f, 0.963913f, 1.063402f, 1.003613f, 0.793969f, 0.284345f, -0.500040f, -1.037338f, -0.731315f, 0.256929f, 0.976234f, 0.710231f, -0.228481f, -0.963086f, -1.064126f, -0.788617f, -0.498005f, -0.250379f, 0.019938f, 0.265502f, 0.411395f, 0.490847f, 0.571594f, 0.649046f, 0.690175f, 0.706288f, 0.723736f, 0.737713f, 0.735526f, 0.724667f, 0.712804f, 0.692713f, 0.661167f, 0.626102f, 0.589545f, 0.546090f, 0.498002f, 0.452447f, 0.407806f, 0.359001f, 0.309737f, 0.266056f, 0.225762f, 0.184774f, 0.145070f, 0.108495f, 0.071916f, 0.033988f, -0.002132f, -0.035682f, -0.069246f, -0.102139f, -0.131153f, -0.156988f, -0.182356f, -0.205965f, -0.225206f, -0.241562f, -0.257404f, -0.271324f, -0.281570f, -0.289838f, -0.297808f, -0.304325f, -0.308777f, -0.312991f, -0.318081f, -0.323338f, -0.328814f, -0.335493f, -0.343315f, -0.351924f, -0.361990f, -0.373445f, -0.384675f, -0.395327f, -0.406987f, -0.419758f, -0.431579f, -0.441848f, -0.452193f, -0.463217f, -0.473985f, -0.484732f, -0.496782f, -0.510255f, -0.524670f, -0.540714f,
+ -0.558946f, -0.578263f, -0.597653f, -0.617532f, -0.637778f, -0.656691f, -0.673126f, -0.687434f, -0.699645f, -0.708958f, -0.715168f, -0.718470f, -0.718323f, -0.714568f, -0.708854f, -0.703133f, -0.697784f, -0.692574f, -0.687835f, -0.683584f, -0.679336f, -0.675668f, -0.674108f, -0.674971f, -0.677066f, -0.679457f, -0.681721f, -0.683072f, -0.683153f, -0.682996f, -0.683558f, -0.684336f, -0.684660f, -0.684936f, -0.685504f, -0.685877f, -0.685935f, -0.686278f, -0.686908f, -0.687209f, -0.687279f, -0.687704f, -0.688320f, -0.688672f, -0.689087f, -0.689985f, -0.691034f, -0.692103f, -0.693870f, -0.696717f, -0.700287f, -0.704592f, -0.710078f, -0.716487f, -0.723147f, -0.730171f, -0.737961f, -0.746101f, -0.754088f, -0.762266f, -0.770876f, -0.779330f, -0.787325f, -0.795322f, -0.803321f, -0.810685f, -0.817438f, -0.824131f, -0.830559f, -0.836142f, -0.841071f, -0.845643f, -0.849388f, -0.852128f, -0.854615f, -0.857157f, -0.859203f, -0.860848f, -0.862840f, -0.864890f, -0.866029f, -0.866351f, -0.866455f, -0.866032f, -0.864930f, -0.864120f, -0.863977f, -0.863628f, -0.863131f, -0.863615f, -0.864728f, -0.865122f, -0.865257f, -0.866254f, -0.867273f, -0.867579f,
+ -0.868533f, -0.870222f, -0.870634f, -0.870784f, -0.873682f, -0.876733f, -0.875499f, -0.874870f, -0.881460f, -0.887147f, -0.882040f, -0.879821f, -0.897958f, -0.915002f, -0.891682f, -0.839628f, -0.817204f, -0.843673f, -0.874820f, -0.884019f, -0.901906f, -0.940936f, -0.947666f, -0.883159f, -0.797756f, -0.768151f, -0.798253f, -0.832623f, -0.835284f, -0.812421f, -0.787095f, -0.782104f, -0.791333f, -0.748682f, -0.584396f, -0.345257f, -0.192332f, -0.226244f, -0.368019f, -0.468300f, -0.484212f, -0.482396f, -0.505439f, -0.513973f, -0.457796f, -0.345461f, -0.230189f, -0.161014f}
+ },
+ {
+ {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f,
+ 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f,
+ -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f},
+ {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f,
+ 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f,
+ -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f}
+ },
+ {
+ {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f,
+ -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f,
+ 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f},
+ {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f,
+ -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f,
+ 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f}
+ },
+ {
+ {0.017978f, 0.007378f, 0.003418f, 0.018456f, 0.041119f, 0.049699f, 0.045284f, 0.053666f, 0.084664f, 0.105401f, 0.067063f, -0.046619f, -0.190974f, -0.265169f, -0.173793f, 0.058765f, 0.244978f, 0.189686f, -0.078447f, -0.301201f, -0.263931f, -0.016751f, 0.224527f, 0.329934f, 0.329708f, 0.288913f, 0.216901f, 0.107803f, -0.012593f, -0.114794f, -0.198221f, -0.272534f, -0.334167f, -0.377176f, -0.406071f, -0.424824f, -0.427385f, -0.407924f, -0.370647f, -0.324637f, -0.276593f, -0.230996f, -0.190824f, -0.155968f, -0.124589f, -0.095978f, -0.069693f, -0.043868f, -0.017228f, 0.008963f, 0.032944f, 0.054527f, 0.073798f, 0.090002f, 0.103058f, 0.114400f, 0.125425f, 0.136553f, 0.148113f, 0.160641f, 0.174135f, 0.188230f, 0.203013f, 0.218608f, 0.234347f, 0.249425f, 0.264041f, 0.278849f, 0.293615f, 0.307424f, 0.320009f, 0.331840f, 0.342789f, 0.351655f, 0.357399f, 0.360118f, 0.360077f, 0.356398f, 0.347903f, 0.335144f, 0.320169f, 0.303908f, 0.285237f, 0.263508f, 0.240490f, 0.218250f, 0.196115f, 0.171654f, 0.144348f, 0.116453f, 0.090117f, 0.065280f, 0.040995f, 0.017579f, -0.003437f, -0.020932f,
+ -0.035118f, -0.047019f, -0.057328f, -0.065776f, -0.071630f, -0.074772f, -0.075997f, -0.076290f, -0.076370f, -0.076995f, -0.078917f, -0.082069f, -0.085393f, -0.087934f, -0.089781f, -0.091750f, -0.094623f, -0.098708f, -0.103476f, -0.107500f, -0.109441f, -0.109318f, -0.108409f, -0.108026f, -0.108758f, -0.110515f, -0.112612f, -0.114027f, -0.114146f, -0.113106f, -0.111149f, -0.108063f, -0.103456f, -0.097000f, -0.088276f, -0.077056f, -0.063885f, -0.049838f, -0.035764f, -0.022273f, -0.010091f, 0.000305f, 0.008995f, 0.015941f, 0.020499f, 0.022137f, 0.021019f, 0.017496f, 0.011856f, 0.004888f, -0.002191f, -0.008658f, -0.014359f, -0.019010f, -0.022276f, -0.024240f, -0.024935f, -0.023872f, -0.020695f, -0.015538f, -0.008189f, 0.002002f, 0.014912f, 0.029556f, 0.045382f, 0.062300f, 0.079546f, 0.096100f, 0.111896f, 0.127148f, 0.141252f, 0.153795f, 0.165494f, 0.176815f, 0.187180f, 0.196581f, 0.206032f, 0.215728f, 0.224988f, 0.234090f, 0.243604f, 0.252464f, 0.259543f, 0.265839f, 0.272231f, 0.277374f, 0.280682f, 0.284095f, 0.288228f, 0.291051f, 0.292390f, 0.294354f, 0.296334f, 0.296199f, 0.295740f, 0.297143f,
+ 0.297187f, 0.294165f, 0.293865f, 0.297697f, 0.296410f, 0.289007f, 0.289718f, 0.298972f, 0.294490f, 0.274911f, 0.273741f, 0.293559f, 0.276485f, 0.199476f, 0.147802f, 0.208854f, 0.331440f, 0.389914f, 0.361504f, 0.329091f, 0.323542f, 0.290902f, 0.227246f, 0.217065f, 0.296479f, 0.385838f, 0.408311f, 0.387215f, 0.378506f, 0.385103f, 0.382955f, 0.362880f, 0.310127f, 0.213082f, 0.126049f, 0.145716f, 0.279676f, 0.409157f, 0.433671f, 0.389293f, 0.369545f, 0.390925f, 0.404683f, 0.394197f, 0.383439f, 0.373704f, 0.344838f, 0.310855f},
+ {-0.017978f, -0.007378f, -0.003418f, -0.018456f, -0.041119f, -0.049699f, -0.045284f, -0.053666f, -0.084664f, -0.105401f, -0.067063f, 0.046619f, 0.190974f, 0.265169f, 0.173793f, -0.058765f, -0.244978f, -0.189686f, 0.078447f, 0.301201f, 0.263931f, 0.016751f, -0.224527f, -0.329934f, -0.329708f, -0.288913f, -0.216901f, -0.107803f, 0.012593f, 0.114794f, 0.198221f, 0.272534f, 0.334167f, 0.377176f, 0.406071f, 0.424824f, 0.427385f, 0.407924f, 0.370647f, 0.324637f, 0.276593f, 0.230996f, 0.190824f, 0.155968f, 0.124589f, 0.095978f, 0.069693f, 0.043868f, 0.017228f, -0.008963f, -0.032944f, -0.054527f, -0.073798f, -0.090002f, -0.103058f, -0.114400f, -0.125425f, -0.136553f, -0.148113f, -0.160641f, -0.174135f, -0.188230f, -0.203013f, -0.218608f, -0.234347f, -0.249425f, -0.264041f, -0.278849f, -0.293615f, -0.307424f, -0.320009f, -0.331840f, -0.342789f, -0.351655f, -0.357399f, -0.360118f, -0.360077f, -0.356398f, -0.347903f, -0.335144f, -0.320169f, -0.303908f, -0.285237f, -0.263508f, -0.240490f, -0.218250f, -0.196115f, -0.171654f, -0.144348f, -0.116453f, -0.090117f, -0.065280f, -0.040995f, -0.017579f, 0.003437f, 0.020932f,
+ 0.035118f, 0.047019f, 0.057328f, 0.065776f, 0.071630f, 0.074772f, 0.075997f, 0.076290f, 0.076370f, 0.076995f, 0.078917f, 0.082069f, 0.085393f, 0.087934f, 0.089781f, 0.091750f, 0.094623f, 0.098708f, 0.103476f, 0.107500f, 0.109441f, 0.109318f, 0.108409f, 0.108026f, 0.108758f, 0.110515f, 0.112612f, 0.114027f, 0.114146f, 0.113106f, 0.111149f, 0.108063f, 0.103456f, 0.097000f, 0.088276f, 0.077056f, 0.063885f, 0.049838f, 0.035764f, 0.022273f, 0.010091f, -0.000305f, -0.008995f, -0.015941f, -0.020499f, -0.022137f, -0.021019f, -0.017496f, -0.011856f, -0.004888f, 0.002191f, 0.008658f, 0.014359f, 0.019010f, 0.022276f, 0.024240f, 0.024935f, 0.023872f, 0.020695f, 0.015538f, 0.008189f, -0.002002f, -0.014912f, -0.029556f, -0.045382f, -0.062300f, -0.079546f, -0.096100f, -0.111896f, -0.127148f, -0.141252f, -0.153795f, -0.165494f, -0.176815f, -0.187180f, -0.196581f, -0.206032f, -0.215728f, -0.224988f, -0.234090f, -0.243604f, -0.252464f, -0.259543f, -0.265839f, -0.272231f, -0.277374f, -0.280682f, -0.284095f, -0.288228f, -0.291051f, -0.292390f, -0.294354f, -0.296334f, -0.296199f, -0.295740f, -0.297143f,
+ -0.297187f, -0.294165f, -0.293865f, -0.297697f, -0.296410f, -0.289007f, -0.289718f, -0.298972f, -0.294490f, -0.274911f, -0.273741f, -0.293559f, -0.276485f, -0.199476f, -0.147802f, -0.208854f, -0.331440f, -0.389914f, -0.361504f, -0.329091f, -0.323542f, -0.290902f, -0.227246f, -0.217065f, -0.296479f, -0.385838f, -0.408311f, -0.387215f, -0.378506f, -0.385103f, -0.382955f, -0.362880f, -0.310127f, -0.213082f, -0.126049f, -0.145716f, -0.279676f, -0.409157f, -0.433671f, -0.389293f, -0.369545f, -0.390925f, -0.404683f, -0.394197f, -0.383439f, -0.373704f, -0.344838f, -0.310855f}
+ },
+ {
+ {0.027544f, -0.017341f, -0.023513f, 0.026515f, 0.039947f, -0.034516f, -0.096596f, -0.020772f, 0.151935f, 0.242778f, 0.149801f, -0.044033f, -0.181114f, -0.177468f, -0.055862f, 0.090745f, 0.145910f, 0.053909f, -0.102523f, -0.163455f, -0.067881f, 0.078061f, 0.138424f, 0.098143f, 0.036791f, 0.006996f, 0.000119f, 0.002369f, 0.021565f, 0.059784f, 0.101198f, 0.132385f, 0.151843f, 0.159909f, 0.156211f, 0.145023f, 0.130647f, 0.110287f, 0.079835f, 0.042474f, 0.005390f, -0.027255f, -0.053608f, -0.071675f, -0.081807f, -0.087931f, -0.093657f, -0.099808f, -0.106220f, -0.112687f, -0.117932f, -0.120493f, -0.120521f, -0.118539f, -0.113168f, -0.102044f, -0.084258f, -0.060368f, -0.030901f, 0.003748f, 0.042511f, 0.083811f, 0.126393f, 0.169523f, 0.212498f, 0.254135f, 0.292796f, 0.326898f, 0.355155f, 0.376131f, 0.388053f, 0.389497f, 0.379942f, 0.359534f, 0.328997f, 0.289934f, 0.244331f, 0.193634f, 0.139228f, 0.083598f, 0.029408f, -0.022692f, -0.073695f, -0.123339f, -0.169305f, -0.209948f, -0.246184f, -0.279689f, -0.310546f, -0.337815f, -0.361405f, -0.381914f, -0.399020f, -0.411385f, -0.418144f, -0.419390f,
+ -0.415008f, -0.404128f, -0.386279f, -0.362312f, -0.333530f, -0.300394f, -0.262664f, -0.220761f, -0.176830f, -0.134417f, -0.096541f, -0.063537f, -0.033190f, -0.003613f, 0.024357f, 0.048059f, 0.065620f, 0.077181f, 0.084404f, 0.089492f, 0.093981f, 0.097804f, 0.099996f, 0.100408f, 0.100059f, 0.100044f, 0.101037f, 0.103570f, 0.107641f, 0.112334f, 0.116752f, 0.120810f, 0.124401f, 0.126672f, 0.126908f, 0.125168f, 0.121503f, 0.115724f, 0.108269f, 0.100065f, 0.091446f, 0.082435f, 0.073719f, 0.065954f, 0.058708f, 0.051452f, 0.044644f, 0.038636f, 0.032761f, 0.026588f, 0.020600f, 0.014885f, 0.008899f, 0.002909f, -0.002242f, -0.006808f, -0.011545f, -0.016005f, -0.019451f, -0.022427f, -0.025359f, -0.027161f, -0.027123f, -0.026184f, -0.024787f, -0.022001f, -0.017911f, -0.013971f, -0.010312f, -0.005846f, -0.000945f, 0.003364f, 0.007981f, 0.014043f, 0.020341f, 0.025721f, 0.031421f, 0.038054f, 0.043780f, 0.047857f, 0.051586f, 0.054231f, 0.053369f, 0.049784f, 0.045976f, 0.040764f, 0.032016f, 0.022151f, 0.013836f, 0.004597f, -0.007321f, -0.018275f, -0.026778f, -0.036758f, -0.048211f, -0.056341f,
+ -0.062971f, -0.073642f, -0.083668f, -0.086428f, -0.090734f, -0.105031f, -0.114994f, -0.109424f, -0.110454f, -0.134392f, -0.148541f, -0.127696f, -0.121882f, -0.181720f, -0.241824f, -0.189799f, -0.046739f, 0.042939f, 0.016342f, -0.039119f, -0.052732f, -0.073996f, -0.147151f, -0.199696f, -0.145744f, -0.023298f, 0.056543f, 0.050437f, 0.006574f, -0.021832f, -0.037988f, -0.088616f, -0.203471f, -0.330990f, -0.353783f, -0.218264f, -0.032140f, 0.036633f, -0.044084f, -0.147160f, -0.163258f, -0.121115f, -0.105238f, -0.129326f, -0.144788f, -0.128572f, -0.103746f, -0.091528f},
+ {-0.027544f, 0.017341f, 0.023513f, -0.026515f, -0.039947f, 0.034516f, 0.096596f, 0.020772f, -0.151935f, -0.242778f, -0.149801f, 0.044033f, 0.181114f, 0.177468f, 0.055862f, -0.090745f, -0.145910f, -0.053909f, 0.102523f, 0.163455f, 0.067881f, -0.078061f, -0.138424f, -0.098143f, -0.036791f, -0.006996f, -0.000119f, -0.002369f, -0.021565f, -0.059784f, -0.101198f, -0.132385f, -0.151843f, -0.159909f, -0.156211f, -0.145023f, -0.130647f, -0.110287f, -0.079835f, -0.042474f, -0.005390f, 0.027255f, 0.053608f, 0.071675f, 0.081807f, 0.087931f, 0.093657f, 0.099808f, 0.106220f, 0.112687f, 0.117932f, 0.120493f, 0.120521f, 0.118539f, 0.113168f, 0.102044f, 0.084258f, 0.060368f, 0.030901f, -0.003748f, -0.042511f, -0.083811f, -0.126393f, -0.169523f, -0.212498f, -0.254135f, -0.292796f, -0.326898f, -0.355155f, -0.376131f, -0.388053f, -0.389497f, -0.379942f, -0.359534f, -0.328997f, -0.289934f, -0.244331f, -0.193634f, -0.139228f, -0.083598f, -0.029408f, 0.022692f, 0.073695f, 0.123339f, 0.169305f, 0.209948f, 0.246184f, 0.279689f, 0.310546f, 0.337815f, 0.361405f, 0.381914f, 0.399020f, 0.411385f, 0.418144f, 0.419390f,
+ 0.415008f, 0.404128f, 0.386279f, 0.362312f, 0.333530f, 0.300394f, 0.262664f, 0.220761f, 0.176830f, 0.134417f, 0.096541f, 0.063537f, 0.033190f, 0.003613f, -0.024357f, -0.048059f, -0.065620f, -0.077181f, -0.084404f, -0.089492f, -0.093981f, -0.097804f, -0.099996f, -0.100408f, -0.100059f, -0.100044f, -0.101037f, -0.103570f, -0.107641f, -0.112334f, -0.116752f, -0.120810f, -0.124401f, -0.126672f, -0.126908f, -0.125168f, -0.121503f, -0.115724f, -0.108269f, -0.100065f, -0.091446f, -0.082435f, -0.073719f, -0.065954f, -0.058708f, -0.051452f, -0.044644f, -0.038636f, -0.032761f, -0.026588f, -0.020600f, -0.014885f, -0.008899f, -0.002909f, 0.002242f, 0.006808f, 0.011545f, 0.016005f, 0.019451f, 0.022427f, 0.025359f, 0.027161f, 0.027123f, 0.026184f, 0.024787f, 0.022001f, 0.017911f, 0.013971f, 0.010312f, 0.005846f, 0.000945f, -0.003364f, -0.007981f, -0.014043f, -0.020341f, -0.025721f, -0.031421f, -0.038054f, -0.043780f, -0.047857f, -0.051586f, -0.054231f, -0.053369f, -0.049784f, -0.045976f, -0.040764f, -0.032016f, -0.022151f, -0.013836f, -0.004597f, 0.007321f, 0.018275f, 0.026778f, 0.036758f, 0.048211f, 0.056341f,
+ 0.062971f, 0.073642f, 0.083668f, 0.086428f, 0.090734f, 0.105031f, 0.114994f, 0.109424f, 0.110454f, 0.134392f, 0.148541f, 0.127696f, 0.121882f, 0.181720f, 0.241824f, 0.189799f, 0.046739f, -0.042939f, -0.016342f, 0.039119f, 0.052732f, 0.073996f, 0.147151f, 0.199696f, 0.145744f, 0.023298f, -0.056543f, -0.050437f, -0.006574f, 0.021832f, 0.037988f, 0.088616f, 0.203471f, 0.330990f, 0.353783f, 0.218264f, 0.032140f, -0.036633f, 0.044084f, 0.147160f, 0.163258f, 0.121115f, 0.105238f, 0.129326f, 0.144788f, 0.128572f, 0.103746f, 0.091528f}
+ },
+ {
+ {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f,
+ 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f,
+ -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f},
+ {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f,
+ 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f,
+ -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f}
+ },
+ {
+ {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f,
+ 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f,
+ 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f},
+ {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f,
+ 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f,
+ 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f}
+ },
+ {
+ {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f,
+ -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f,
+ 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f},
+ {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f,
+ -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f,
+ 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f}
+ },
+ {
+ {-0.007369f, -0.009113f, -0.001099f, 0.022658f, 0.070924f, 0.152318f, 0.232129f, 0.241139f, 0.159597f, 0.019376f, -0.191743f, -0.478726f, -0.641786f, -0.366448f, 0.302362f, 0.784726f, 0.561501f, -0.152339f, -0.632004f, -0.504209f, -0.082826f, 0.166508f, 0.170061f, 0.132434f, 0.150576f, 0.156677f, 0.112765f, 0.064809f, 0.038940f, 0.011560f, -0.026185f, -0.052670f, -0.058435f, -0.055297f, -0.050368f, -0.042168f, -0.033153f, -0.026070f, -0.017664f, -0.007165f, -0.000019f, 0.002560f, 0.006005f, 0.011682f, 0.014961f, 0.014711f, 0.014629f, 0.015662f, 0.015718f, 0.015511f, 0.017772f, 0.022545f, 0.028288f, 0.035048f, 0.042950f, 0.050476f, 0.056636f, 0.061995f, 0.066457f, 0.069051f, 0.070123f, 0.070862f, 0.071035f, 0.069703f, 0.067216f, 0.064295f, 0.060502f, 0.055392f, 0.049663f, 0.043845f, 0.037475f, 0.030360f, 0.022950f, 0.015014f, 0.005606f, -0.005567f, -0.018119f, -0.031952f, -0.046962f, -0.062497f, -0.078234f, -0.094671f, -0.111772f, -0.128161f, -0.142543f, -0.154931f, -0.165841f, -0.175123f, -0.182010f, -0.185649f, -0.185515f, -0.181851f, -0.175561f, -0.167354f, -0.157511f, -0.146709f,
+ -0.136223f, -0.126946f, -0.118986f, -0.112528f, -0.108273f, -0.106653f, -0.107197f, -0.108900f, -0.110998f, -0.113479f, -0.117023f, -0.122152f, -0.128391f, -0.134603f, -0.140110f, -0.145050f, -0.149794f, -0.154521f, -0.159112f, -0.163000f, -0.165438f, -0.166306f, -0.166315f, -0.166210f, -0.166147f, -0.165802f, -0.164520f, -0.161506f, -0.156473f, -0.149994f, -0.142735f, -0.134670f, -0.125420f, -0.114771f, -0.102543f, -0.088669f, -0.073713f, -0.058625f, -0.043867f, -0.029420f, -0.015423f, -0.002012f, 0.011080f, 0.023915f, 0.035810f, 0.046102f, 0.054869f, 0.062393f, 0.068774f, 0.074464f, 0.080241f, 0.086360f, 0.092594f, 0.098983f, 0.105615f, 0.112093f, 0.118168f, 0.124284f, 0.130714f, 0.137142f, 0.143655f, 0.150871f, 0.158659f, 0.166225f, 0.173522f, 0.180945f, 0.187978f, 0.193921f, 0.199247f, 0.204493f, 0.209025f, 0.212545f, 0.216101f, 0.220182f, 0.223965f, 0.227482f, 0.231885f, 0.237074f, 0.242015f, 0.247127f, 0.253052f, 0.258300f, 0.261689f, 0.264868f, 0.268891f, 0.271822f, 0.273082f, 0.275283f, 0.278781f, 0.280657f, 0.281124f, 0.283268f, 0.285951f, 0.286133f, 0.286398f, 0.289463f,
+ 0.290488f, 0.287311f, 0.288136f, 0.294374f, 0.292805f, 0.282671f, 0.284319f, 0.297926f, 0.292144f, 0.265659f, 0.265620f, 0.295582f, 0.275872f, 0.176874f, 0.118624f, 0.219351f, 0.399705f, 0.477971f, 0.424361f, 0.364658f, 0.350250f, 0.304253f, 0.215924f, 0.205638f, 0.330161f, 0.473519f, 0.512784f, 0.473603f, 0.445373f, 0.445924f, 0.442945f, 0.420484f, 0.362318f, 0.253795f, 0.151402f, 0.158962f, 0.280224f, 0.386924f, 0.389886f, 0.347680f, 0.344603f, 0.363776f, 0.360809f, 0.360105f, 0.372309f, 0.308063f, 0.110063f, -0.088473f},
+ {0.007369f, 0.009113f, 0.001099f, -0.022658f, -0.070924f, -0.152318f, -0.232129f, -0.241139f, -0.159597f, -0.019376f, 0.191743f, 0.478726f, 0.641786f, 0.366448f, -0.302362f, -0.784726f, -0.561501f, 0.152339f, 0.632004f, 0.504209f, 0.082826f, -0.166508f, -0.170061f, -0.132434f, -0.150576f, -0.156677f, -0.112765f, -0.064809f, -0.038940f, -0.011560f, 0.026185f, 0.052670f, 0.058435f, 0.055297f, 0.050368f, 0.042168f, 0.033153f, 0.026070f, 0.017664f, 0.007165f, 0.000019f, -0.002560f, -0.006005f, -0.011682f, -0.014961f, -0.014711f, -0.014629f, -0.015662f, -0.015718f, -0.015511f, -0.017772f, -0.022545f, -0.028288f, -0.035048f, -0.042950f, -0.050476f, -0.056636f, -0.061995f, -0.066457f, -0.069051f, -0.070123f, -0.070862f, -0.071035f, -0.069703f, -0.067216f, -0.064295f, -0.060502f, -0.055392f, -0.049663f, -0.043845f, -0.037475f, -0.030360f, -0.022950f, -0.015014f, -0.005606f, 0.005567f, 0.018119f, 0.031952f, 0.046962f, 0.062497f, 0.078234f, 0.094671f, 0.111772f, 0.128161f, 0.142543f, 0.154931f, 0.165841f, 0.175123f, 0.182010f, 0.185649f, 0.185515f, 0.181851f, 0.175561f, 0.167354f, 0.157511f, 0.146709f,
+ 0.136223f, 0.126946f, 0.118986f, 0.112528f, 0.108273f, 0.106653f, 0.107197f, 0.108900f, 0.110998f, 0.113479f, 0.117023f, 0.122152f, 0.128391f, 0.134603f, 0.140110f, 0.145050f, 0.149794f, 0.154521f, 0.159112f, 0.163000f, 0.165438f, 0.166306f, 0.166315f, 0.166210f, 0.166147f, 0.165802f, 0.164520f, 0.161506f, 0.156473f, 0.149994f, 0.142735f, 0.134670f, 0.125420f, 0.114771f, 0.102543f, 0.088669f, 0.073713f, 0.058625f, 0.043867f, 0.029420f, 0.015423f, 0.002012f, -0.011080f, -0.023915f, -0.035810f, -0.046102f, -0.054869f, -0.062393f, -0.068774f, -0.074464f, -0.080241f, -0.086360f, -0.092594f, -0.098983f, -0.105615f, -0.112093f, -0.118168f, -0.124284f, -0.130714f, -0.137142f, -0.143655f, -0.150871f, -0.158659f, -0.166225f, -0.173522f, -0.180945f, -0.187978f, -0.193921f, -0.199247f, -0.204493f, -0.209025f, -0.212545f, -0.216101f, -0.220182f, -0.223965f, -0.227482f, -0.231885f, -0.237074f, -0.242015f, -0.247127f, -0.253052f, -0.258300f, -0.261689f, -0.264868f, -0.268891f, -0.271822f, -0.273082f, -0.275283f, -0.278781f, -0.280657f, -0.281124f, -0.283268f, -0.285951f, -0.286133f, -0.286398f, -0.289463f,
+ -0.290488f, -0.287311f, -0.288136f, -0.294374f, -0.292805f, -0.282671f, -0.284319f, -0.297926f, -0.292144f, -0.265659f, -0.265620f, -0.295582f, -0.275872f, -0.176874f, -0.118624f, -0.219351f, -0.399705f, -0.477971f, -0.424361f, -0.364658f, -0.350250f, -0.304253f, -0.215924f, -0.205638f, -0.330161f, -0.473519f, -0.512784f, -0.473603f, -0.445373f, -0.445924f, -0.442945f, -0.420484f, -0.362318f, -0.253795f, -0.151402f, -0.158962f, -0.280224f, -0.386924f, -0.389886f, -0.347680f, -0.344603f, -0.363776f, -0.360809f, -0.360105f, -0.372309f, -0.308063f, -0.110063f, 0.088473f}
+ },
+ {
+ {-0.002688f, 0.005432f, 0.012718f, 0.008286f, -0.018981f, -0.066947f, -0.093651f, -0.039678f, 0.084418f, 0.167639f, 0.115873f, -0.019344f, -0.096903f, -0.063275f, 0.000491f, 0.014385f, -0.000484f, 0.009731f, 0.035483f, 0.032840f, 0.004036f, -0.010890f, -0.002359f, 0.000339f, -0.017379f, -0.034722f, -0.031174f, -0.012598f, 0.004762f, 0.015141f, 0.020393f, 0.020069f, 0.012230f, -0.002097f, -0.019459f, -0.036054f, -0.048695f, -0.056607f, -0.062102f, -0.067345f, -0.071275f, -0.071399f, -0.067330f, -0.060925f, -0.054215f, -0.048750f, -0.045891f, -0.046130f, -0.048390f, -0.050799f, -0.051951f, -0.051168f, -0.048155f, -0.042971f, -0.036130f, -0.028335f, -0.020063f, -0.011496f, -0.002777f, 0.005857f, 0.014252f, 0.022441f, 0.030314f, 0.037365f, 0.043111f, 0.047651f, 0.051375f, 0.054291f, 0.056203f, 0.057437f, 0.058706f, 0.060226f, 0.061657f, 0.063036f, 0.065132f, 0.068679f, 0.073849f, 0.080769f, 0.090037f, 0.102333f, 0.117751f, 0.135818f, 0.156080f, 0.178486f, 0.203206f, 0.230031f, 0.257901f, 0.285243f, 0.310971f, 0.334898f, 0.356785f, 0.375158f, 0.387601f, 0.392296f, 0.388904f, 0.377910f,
+ 0.359590f, 0.333993f, 0.301815f, 0.264974f, 0.226129f, 0.187410f, 0.149597f, 0.112764f, 0.077779f, 0.046673f, 0.021036f, 0.000235f, -0.018297f, -0.036907f, -0.055957f, -0.073988f, -0.089329f, -0.101608f, -0.111952f, -0.121846f, -0.131868f, -0.141542f, -0.150198f, -0.157697f, -0.164481f, -0.171286f, -0.178744f, -0.186942f, -0.195343f, -0.203302f, -0.210537f, -0.217024f, -0.222694f, -0.227441f, -0.231177f, -0.233784f, -0.235253f, -0.235915f, -0.236263f, -0.236534f, -0.236669f, -0.236547f, -0.236024f, -0.235038f, -0.233954f, -0.233475f, -0.233944f, -0.235111f, -0.236668f, -0.238427f, -0.239938f, -0.240742f, -0.241159f, -0.242072f, -0.243807f, -0.245955f, -0.248133f, -0.250080f, -0.251134f, -0.250524f, -0.248011f, -0.243591f, -0.237000f, -0.228096f, -0.217152f, -0.204269f, -0.189244f, -0.172334f, -0.154244f, -0.135283f, -0.115616f, -0.096165f, -0.077963f, -0.060968f, -0.044792f, -0.029876f, -0.016585f, -0.004235f, 0.007671f, 0.018639f, 0.028667f, 0.038632f, 0.048378f, 0.056858f, 0.064590f, 0.073057f, 0.081754f, 0.089292f, 0.096631f, 0.105231f, 0.113645f, 0.120294f, 0.126811f, 0.134121f, 0.139781f, 0.143768f,
+ 0.149981f, 0.157487f, 0.160603f, 0.162003f, 0.170584f, 0.181780f, 0.181900f, 0.177636f, 0.189907f, 0.209624f, 0.204280f, 0.186664f, 0.216719f, 0.295365f, 0.323582f, 0.234869f, 0.109824f, 0.071288f, 0.113232f, 0.138910f, 0.132778f, 0.165020f, 0.231457f, 0.229499f, 0.127086f, 0.030054f, 0.024335f, 0.057848f, 0.047811f, 0.011116f, 0.005056f, 0.015613f, 0.000201f, -0.011538f, 0.040879f, 0.133184f, 0.174164f, 0.133872f, 0.077041f, 0.063200f, 0.079294f, 0.086196f, 0.077456f, 0.068117f, 0.062643f, 0.057750f, 0.055152f, 0.055779f},
+ {0.002688f, -0.005432f, -0.012718f, -0.008286f, 0.018981f, 0.066947f, 0.093651f, 0.039678f, -0.084418f, -0.167639f, -0.115873f, 0.019344f, 0.096903f, 0.063275f, -0.000491f, -0.014385f, 0.000484f, -0.009731f, -0.035483f, -0.032840f, -0.004036f, 0.010890f, 0.002359f, -0.000339f, 0.017379f, 0.034722f, 0.031174f, 0.012598f, -0.004762f, -0.015141f, -0.020393f, -0.020069f, -0.012230f, 0.002097f, 0.019459f, 0.036054f, 0.048695f, 0.056607f, 0.062102f, 0.067345f, 0.071275f, 0.071399f, 0.067330f, 0.060925f, 0.054215f, 0.048750f, 0.045891f, 0.046130f, 0.048390f, 0.050799f, 0.051951f, 0.051168f, 0.048155f, 0.042971f, 0.036130f, 0.028335f, 0.020063f, 0.011496f, 0.002777f, -0.005857f, -0.014252f, -0.022441f, -0.030314f, -0.037365f, -0.043111f, -0.047651f, -0.051375f, -0.054291f, -0.056203f, -0.057437f, -0.058706f, -0.060226f, -0.061657f, -0.063036f, -0.065132f, -0.068679f, -0.073849f, -0.080769f, -0.090037f, -0.102333f, -0.117751f, -0.135818f, -0.156080f, -0.178486f, -0.203206f, -0.230031f, -0.257901f, -0.285243f, -0.310971f, -0.334898f, -0.356785f, -0.375158f, -0.387601f, -0.392296f, -0.388904f, -0.377910f,
+ -0.359590f, -0.333993f, -0.301815f, -0.264974f, -0.226129f, -0.187410f, -0.149597f, -0.112764f, -0.077779f, -0.046673f, -0.021036f, -0.000235f, 0.018297f, 0.036907f, 0.055957f, 0.073988f, 0.089329f, 0.101608f, 0.111952f, 0.121846f, 0.131868f, 0.141542f, 0.150198f, 0.157697f, 0.164481f, 0.171286f, 0.178744f, 0.186942f, 0.195343f, 0.203302f, 0.210537f, 0.217024f, 0.222694f, 0.227441f, 0.231177f, 0.233784f, 0.235253f, 0.235915f, 0.236263f, 0.236534f, 0.236669f, 0.236547f, 0.236024f, 0.235038f, 0.233954f, 0.233475f, 0.233944f, 0.235111f, 0.236668f, 0.238427f, 0.239938f, 0.240742f, 0.241159f, 0.242072f, 0.243807f, 0.245955f, 0.248133f, 0.250080f, 0.251134f, 0.250524f, 0.248011f, 0.243591f, 0.237000f, 0.228096f, 0.217152f, 0.204269f, 0.189244f, 0.172334f, 0.154244f, 0.135283f, 0.115616f, 0.096165f, 0.077963f, 0.060968f, 0.044792f, 0.029876f, 0.016585f, 0.004235f, -0.007671f, -0.018639f, -0.028667f, -0.038632f, -0.048378f, -0.056858f, -0.064590f, -0.073057f, -0.081754f, -0.089292f, -0.096631f, -0.105231f, -0.113645f, -0.120294f, -0.126811f, -0.134121f, -0.139781f, -0.143768f,
+ -0.149981f, -0.157487f, -0.160603f, -0.162003f, -0.170584f, -0.181780f, -0.181900f, -0.177636f, -0.189907f, -0.209624f, -0.204280f, -0.186664f, -0.216719f, -0.295365f, -0.323582f, -0.234869f, -0.109824f, -0.071288f, -0.113232f, -0.138910f, -0.132778f, -0.165020f, -0.231457f, -0.229499f, -0.127086f, -0.030054f, -0.024335f, -0.057848f, -0.047811f, -0.011116f, -0.005056f, -0.015613f, -0.000201f, 0.011538f, -0.040879f, -0.133184f, -0.174164f, -0.133872f, -0.077041f, -0.063200f, -0.079294f, -0.086196f, -0.077456f, -0.068117f, -0.062643f, -0.057750f, -0.055152f, -0.055779f}
+ },
+ {
+ {-0.031395f, -0.017549f, 0.012545f, 0.027085f, -0.001298f, -0.019483f, 0.059019f, 0.208286f, 0.263492f, 0.087514f, -0.255313f, -0.510902f, -0.435627f, -0.033493f, 0.386939f, 0.463824f, 0.150130f, -0.224282f, -0.317692f, -0.133994f, 0.063533f, 0.108717f, 0.062538f, 0.027810f, 0.001853f, -0.049162f, -0.095299f, -0.093148f, -0.061382f, -0.047017f, -0.057265f, -0.066961f, -0.063290f, -0.049263f, -0.023679f, 0.015474f, 0.059281f, 0.096124f, 0.123579f, 0.144087f, 0.157932f, 0.165971f, 0.171378f, 0.175091f, 0.175299f, 0.172128f, 0.167569f, 0.161483f, 0.152440f, 0.141016f, 0.128172f, 0.112226f, 0.090989f, 0.065073f, 0.036626f, 0.006936f, -0.022810f, -0.050769f, -0.076246f, -0.100391f, -0.124040f, -0.146496f, -0.166945f, -0.185227f, -0.200710f, -0.211804f, -0.216957f, -0.215246f, -0.206186f, -0.189818f, -0.166688f, -0.137158f, -0.101286f, -0.059912f, -0.015051f, 0.031417f, 0.078741f, 0.126363f, 0.172683f, 0.215583f, 0.253881f, 0.287628f, 0.317019f, 0.341528f, 0.360300f, 0.373071f, 0.380303f, 0.382359f, 0.378941f, 0.369492f, 0.353667f, 0.331025f, 0.300798f, 0.262671f, 0.217574f, 0.167114f,
+ 0.112510f, 0.054898f, -0.003462f, -0.059139f, -0.109030f, -0.151676f, -0.187106f, -0.215626f, -0.236627f, -0.248501f, -0.250097f, -0.242458f, -0.228671f, -0.211714f, -0.192851f, -0.172157f, -0.149779f, -0.126242f, -0.102213f, -0.078565f, -0.056361f, -0.036419f, -0.019092f, -0.004417f, 0.008006f, 0.019186f, 0.030126f, 0.040878f, 0.050508f, 0.057885f, 0.062245f, 0.063363f, 0.061684f, 0.058047f, 0.052884f, 0.045898f, 0.036639f, 0.025030f, 0.011292f, -0.004121f, -0.020506f, -0.037329f, -0.054568f, -0.072173f, -0.089494f, -0.105753f, -0.120651f, -0.134025f, -0.145470f, -0.154818f, -0.162347f, -0.168112f, -0.171794f, -0.173503f, -0.173945f, -0.173633f, -0.172788f, -0.171982f, -0.171913f, -0.172586f, -0.173607f, -0.174969f, -0.176759f, -0.178632f, -0.180379f, -0.182333f, -0.184562f, -0.186478f, -0.187751f, -0.188632f, -0.189123f, -0.188994f, -0.188640f, -0.188675f, -0.188837f, -0.188578f, -0.188189f, -0.188042f, -0.187510f, -0.185863f, -0.183172f, -0.179315f, -0.173560f, -0.165995f, -0.157668f, -0.148777f, -0.138701f, -0.127933f, -0.117657f, -0.107677f, -0.097244f, -0.087142f, -0.078362f, -0.070096f, -0.061614f, -0.054068f,
+ -0.047958f, -0.041708f, -0.035013f, -0.029793f, -0.025876f, -0.020687f, -0.014884f, -0.012039f, -0.011329f, -0.008255f, -0.004063f, -0.005183f, -0.011321f, -0.014544f, -0.013137f, -0.015356f, -0.025141f, -0.034687f, -0.036741f, -0.035196f, -0.036780f, -0.038630f, -0.031709f, -0.015609f, -0.004294f, -0.011898f, -0.032698f, -0.044235f, -0.036962f, -0.028397f, -0.032322f, -0.028167f, 0.009611f, 0.057777f, 0.058012f, -0.006611f, -0.081631f, -0.103618f, -0.068370f, -0.022195f, -0.005259f, -0.017573f, -0.028765f, -0.015361f, 0.003597f, -0.022097f, -0.107014f, -0.188977f},
+ {0.031395f, 0.017549f, -0.012545f, -0.027085f, 0.001298f, 0.019483f, -0.059019f, -0.208286f, -0.263492f, -0.087514f, 0.255313f, 0.510902f, 0.435627f, 0.033493f, -0.386939f, -0.463824f, -0.150130f, 0.224282f, 0.317692f, 0.133994f, -0.063533f, -0.108717f, -0.062538f, -0.027810f, -0.001853f, 0.049162f, 0.095299f, 0.093148f, 0.061382f, 0.047017f, 0.057265f, 0.066961f, 0.063290f, 0.049263f, 0.023679f, -0.015474f, -0.059281f, -0.096124f, -0.123579f, -0.144087f, -0.157932f, -0.165971f, -0.171378f, -0.175091f, -0.175299f, -0.172128f, -0.167569f, -0.161483f, -0.152440f, -0.141016f, -0.128172f, -0.112226f, -0.090989f, -0.065073f, -0.036626f, -0.006936f, 0.022810f, 0.050769f, 0.076246f, 0.100391f, 0.124040f, 0.146496f, 0.166945f, 0.185227f, 0.200710f, 0.211804f, 0.216957f, 0.215246f, 0.206186f, 0.189818f, 0.166688f, 0.137158f, 0.101286f, 0.059912f, 0.015051f, -0.031417f, -0.078741f, -0.126363f, -0.172683f, -0.215583f, -0.253881f, -0.287628f, -0.317019f, -0.341528f, -0.360300f, -0.373071f, -0.380303f, -0.382359f, -0.378941f, -0.369492f, -0.353667f, -0.331025f, -0.300798f, -0.262671f, -0.217574f, -0.167114f,
+ -0.112510f, -0.054898f, 0.003462f, 0.059139f, 0.109030f, 0.151676f, 0.187106f, 0.215626f, 0.236627f, 0.248501f, 0.250097f, 0.242458f, 0.228671f, 0.211714f, 0.192851f, 0.172157f, 0.149779f, 0.126242f, 0.102213f, 0.078565f, 0.056361f, 0.036419f, 0.019092f, 0.004417f, -0.008006f, -0.019186f, -0.030126f, -0.040878f, -0.050508f, -0.057885f, -0.062245f, -0.063363f, -0.061684f, -0.058047f, -0.052884f, -0.045898f, -0.036639f, -0.025030f, -0.011292f, 0.004121f, 0.020506f, 0.037329f, 0.054568f, 0.072173f, 0.089494f, 0.105753f, 0.120651f, 0.134025f, 0.145470f, 0.154818f, 0.162347f, 0.168112f, 0.171794f, 0.173503f, 0.173945f, 0.173633f, 0.172788f, 0.171982f, 0.171913f, 0.172586f, 0.173607f, 0.174969f, 0.176759f, 0.178632f, 0.180379f, 0.182333f, 0.184562f, 0.186478f, 0.187751f, 0.188632f, 0.189123f, 0.188994f, 0.188640f, 0.188675f, 0.188837f, 0.188578f, 0.188189f, 0.188042f, 0.187510f, 0.185863f, 0.183172f, 0.179315f, 0.173560f, 0.165995f, 0.157668f, 0.148777f, 0.138701f, 0.127933f, 0.117657f, 0.107677f, 0.097244f, 0.087142f, 0.078362f, 0.070096f, 0.061614f, 0.054068f,
+ 0.047958f, 0.041708f, 0.035013f, 0.029793f, 0.025876f, 0.020687f, 0.014884f, 0.012039f, 0.011329f, 0.008255f, 0.004063f, 0.005183f, 0.011321f, 0.014544f, 0.013137f, 0.015356f, 0.025141f, 0.034687f, 0.036741f, 0.035196f, 0.036780f, 0.038630f, 0.031709f, 0.015609f, 0.004294f, 0.011898f, 0.032698f, 0.044235f, 0.036962f, 0.028397f, 0.032322f, 0.028167f, -0.009611f, -0.057777f, -0.058012f, 0.006611f, 0.081631f, 0.103618f, 0.068370f, 0.022195f, 0.005259f, 0.017573f, 0.028765f, 0.015361f, -0.003597f, 0.022097f, 0.107014f, 0.188977f}
+ },
+ {
+ {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f,
+ 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f,
+ -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f},
+ {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f,
+ 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f,
+ -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f}
+ },
+ {
+ {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f,
+ 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f,
+ 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f},
+ {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f,
+ 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f,
+ 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f}
+ },
+ {
+ {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f,
+ 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f,
+ 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f},
+ {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f,
+ 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f,
+ 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f}
+ },
+ {
+ {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f,
+ -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f,
+ -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f},
+ {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f,
+ -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f,
+ -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f}
+ }
+};
+const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]={
+ {
+ {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f,
+ 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f,
+ 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f},
+ {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f,
+ 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f,
+ 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f}
+ },
+ {
+ {0.139811f, 0.337680f, 0.309928f, 0.007865f, -0.460052f, -0.904017f, -1.187273f, -1.245347f, -1.047341f, -0.642813f, -0.178251f, 0.255482f, 0.696327f, 1.065155f, 0.997728f, 0.263824f, -0.669296f, -0.911797f, -0.169209f, 0.827247f, 1.142336f, 0.643160f, -0.071883f, -0.512664f, -0.694340f, -0.796456f, -0.832000f, -0.752642f, -0.618206f, -0.514447f, -0.432971f, -0.329732f, -0.215270f, -0.120320f, -0.037944f, 0.050458f, 0.138590f, 0.216448f, 0.291141f, 0.367466f, 0.437249f, 0.497434f, 0.554267f, 0.607280f, 0.650114f, 0.684871f, 0.717859f, 0.746604f, 0.765897f, 0.779257f, 0.792413f, 0.803890f, 0.811171f, 0.817031f, 0.823086f, 0.826132f, 0.825083f, 0.822817f, 0.819425f, 0.812156f, 0.801947f, 0.792033f, 0.781683f, 0.768517f, 0.754237f, 0.741632f, 0.729521f, 0.716105f, 0.703200f, 0.692765f, 0.683590f, 0.674714f, 0.667761f, 0.663634f, 0.661007f, 0.659222f, 0.658950f, 0.659915f, 0.661194f, 0.662882f, 0.664859f, 0.665785f, 0.665416f, 0.665313f, 0.665679f, 0.664686f, 0.662061f, 0.659813f, 0.658729f, 0.657658f, 0.656469f, 0.656268f, 0.656891f, 0.657238f, 0.657303f, 0.657243f,
+ 0.655771f, 0.651744f, 0.645638f, 0.637693f, 0.626755f, 0.612363f, 0.595752f, 0.577822f, 0.558363f, 0.537653f, 0.516647f, 0.495719f, 0.475297f, 0.457049f, 0.442419f, 0.430883f, 0.421223f, 0.413188f, 0.406700f, 0.401222f, 0.396933f, 0.394659f, 0.393933f, 0.392945f, 0.390662f, 0.387246f, 0.382789f, 0.377529f, 0.372623f, 0.368899f, 0.365629f, 0.361963f, 0.358320f, 0.355195f, 0.352156f, 0.348998f, 0.346276f, 0.344053f, 0.341722f, 0.339344f, 0.337548f, 0.336220f, 0.334859f, 0.333734f, 0.333307f, 0.333272f, 0.333372f, 0.334113f, 0.335707f, 0.337542f, 0.339297f, 0.341219f, 0.343021f, 0.344012f, 0.344285f, 0.344318f, 0.343803f, 0.342252f, 0.340023f, 0.337478f, 0.334140f, 0.329736f, 0.324809f, 0.319534f, 0.313397f, 0.306449f, 0.299331f, 0.291965f, 0.283816f, 0.275134f, 0.266430f, 0.257468f, 0.248114f, 0.239081f, 0.230677f, 0.222271f, 0.213733f, 0.205671f, 0.197839f, 0.189344f, 0.180405f, 0.171906f, 0.163769f, 0.155721f, 0.148459f, 0.142253f, 0.136125f, 0.129829f, 0.124280f, 0.119189f, 0.113229f, 0.106765f, 0.101047f, 0.095433f, 0.088960f, 0.082699f,
+ 0.077090f, 0.070452f, 0.063164f, 0.057658f, 0.052165f, 0.042986f, 0.033716f, 0.029705f, 0.024528f, 0.010022f, -0.003487f, -0.003563f, -0.008281f, -0.044222f, -0.091161f, -0.097337f, -0.059345f, -0.032430f, -0.044938f, -0.063814f, -0.071121f, -0.106555f, -0.189396f, -0.259807f, -0.255503f, -0.202390f, -0.174583f, -0.199128f, -0.246722f, -0.285440f, -0.305850f, -0.323862f, -0.381849f, -0.499832f, -0.602701f, -0.562505f, -0.358033f, -0.132175f, -0.035515f, -0.063390f, -0.105690f, -0.109852f, -0.119592f, -0.173771f, -0.239521f, -0.254709f, -0.192460f, -0.071071f},
+ {-0.139811f, -0.337680f, -0.309928f, -0.007865f, 0.460052f, 0.904017f, 1.187273f, 1.245347f, 1.047341f, 0.642813f, 0.178251f, -0.255482f, -0.696327f, -1.065155f, -0.997728f, -0.263824f, 0.669296f, 0.911797f, 0.169209f, -0.827247f, -1.142336f, -0.643160f, 0.071883f, 0.512664f, 0.694340f, 0.796456f, 0.832000f, 0.752642f, 0.618206f, 0.514447f, 0.432971f, 0.329732f, 0.215270f, 0.120320f, 0.037944f, -0.050458f, -0.138590f, -0.216448f, -0.291141f, -0.367466f, -0.437249f, -0.497434f, -0.554267f, -0.607280f, -0.650114f, -0.684871f, -0.717859f, -0.746604f, -0.765897f, -0.779257f, -0.792413f, -0.803890f, -0.811171f, -0.817031f, -0.823086f, -0.826132f, -0.825083f, -0.822817f, -0.819425f, -0.812156f, -0.801947f, -0.792033f, -0.781683f, -0.768517f, -0.754237f, -0.741632f, -0.729521f, -0.716105f, -0.703200f, -0.692765f, -0.683590f, -0.674714f, -0.667761f, -0.663634f, -0.661007f, -0.659222f, -0.658950f, -0.659915f, -0.661194f, -0.662882f, -0.664859f, -0.665785f, -0.665416f, -0.665313f, -0.665679f, -0.664686f, -0.662061f, -0.659813f, -0.658729f, -0.657658f, -0.656469f, -0.656268f, -0.656891f, -0.657238f, -0.657303f, -0.657243f,
+ -0.655771f, -0.651744f, -0.645638f, -0.637693f, -0.626755f, -0.612363f, -0.595752f, -0.577822f, -0.558363f, -0.537653f, -0.516647f, -0.495719f, -0.475297f, -0.457049f, -0.442419f, -0.430883f, -0.421223f, -0.413188f, -0.406700f, -0.401222f, -0.396933f, -0.394659f, -0.393933f, -0.392945f, -0.390662f, -0.387246f, -0.382789f, -0.377529f, -0.372623f, -0.368899f, -0.365629f, -0.361963f, -0.358320f, -0.355195f, -0.352156f, -0.348998f, -0.346276f, -0.344053f, -0.341722f, -0.339344f, -0.337548f, -0.336220f, -0.334859f, -0.333734f, -0.333307f, -0.333272f, -0.333372f, -0.334113f, -0.335707f, -0.337542f, -0.339297f, -0.341219f, -0.343021f, -0.344012f, -0.344285f, -0.344318f, -0.343803f, -0.342252f, -0.340023f, -0.337478f, -0.334140f, -0.329736f, -0.324809f, -0.319534f, -0.313397f, -0.306449f, -0.299331f, -0.291965f, -0.283816f, -0.275134f, -0.266430f, -0.257468f, -0.248114f, -0.239081f, -0.230677f, -0.222271f, -0.213733f, -0.205671f, -0.197839f, -0.189344f, -0.180405f, -0.171906f, -0.163769f, -0.155721f, -0.148459f, -0.142253f, -0.136125f, -0.129829f, -0.124280f, -0.119189f, -0.113229f, -0.106765f, -0.101047f, -0.095433f, -0.088960f, -0.082699f,
+ -0.077090f, -0.070452f, -0.063164f, -0.057658f, -0.052165f, -0.042986f, -0.033716f, -0.029705f, -0.024528f, -0.010022f, 0.003487f, 0.003563f, 0.008281f, 0.044222f, 0.091161f, 0.097337f, 0.059345f, 0.032430f, 0.044938f, 0.063814f, 0.071121f, 0.106555f, 0.189396f, 0.259807f, 0.255503f, 0.202390f, 0.174583f, 0.199128f, 0.246722f, 0.285440f, 0.305850f, 0.323862f, 0.381849f, 0.499832f, 0.602701f, 0.562505f, 0.358033f, 0.132175f, 0.035515f, 0.063390f, 0.105690f, 0.109852f, 0.119592f, 0.173771f, 0.239521f, 0.254709f, 0.192460f, 0.071071f}
+ },
+ {
+ {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f,
+ -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f,
+ -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f},
+ {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f,
+ -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f,
+ -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f}
+ },
+ {
+ {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f,
+ -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f,
+ 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f},
+ {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f,
+ -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f,
+ 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f}
+ },
+ {
+ {-0.004145f, -0.003666f, 0.011472f, 0.025737f, 0.020888f, 0.002681f, -0.005708f, -0.001729f, -0.016346f, -0.075712f, -0.160203f, -0.207765f, -0.152869f, 0.017357f, 0.211441f, 0.262841f, 0.087261f, -0.176895f, -0.266228f, -0.075175f, 0.219293f, 0.361347f, 0.282230f, 0.104299f, -0.053635f, -0.176306f, -0.281631f, -0.353803f, -0.373719f, -0.355618f, -0.322626f, -0.277765f, -0.217383f, -0.148569f, -0.078599f, -0.004588f, 0.075448f, 0.153048f, 0.217527f, 0.265298f, 0.297854f, 0.317827f, 0.329255f, 0.336467f, 0.341363f, 0.344354f, 0.346614f, 0.348711f, 0.348971f, 0.345749f, 0.339625f, 0.331802f, 0.322488f, 0.312203f, 0.302613f, 0.294865f, 0.288630f, 0.283324f, 0.278784f, 0.274543f, 0.269837f, 0.264413f, 0.258247f, 0.250753f, 0.241341f, 0.230387f, 0.218578f, 0.205635f, 0.190698f, 0.173676f, 0.155193f, 0.135271f, 0.113074f, 0.088233f, 0.061586f, 0.034088f, 0.005671f, -0.023848f, -0.053155f, -0.080091f, -0.104054f, -0.126354f, -0.147577f, -0.166135f, -0.180635f, -0.192361f, -0.203590f, -0.214103f, -0.221263f, -0.223474f, -0.221824f, -0.217974f, -0.211925f, -0.202660f, -0.190084f, -0.175511f,
+ -0.160523f, -0.145801f, -0.131012f, -0.115698f, -0.100234f, -0.085751f, -0.073156f, -0.062624f, -0.054028f, -0.047150f, -0.041205f, -0.034932f, -0.027678f, -0.019998f, -0.012848f, -0.006575f, -0.000758f, 0.005551f, 0.013454f, 0.023353f, 0.034257f, 0.044468f, 0.053061f, 0.060377f, 0.067374f, 0.075053f, 0.084164f, 0.094773f, 0.106230f, 0.117963f, 0.129996f, 0.142510f, 0.155380f, 0.168334f, 0.180912f, 0.192154f, 0.200956f, 0.206850f, 0.209945f, 0.210369f, 0.208393f, 0.204697f, 0.199808f, 0.193700f, 0.186516f, 0.179137f, 0.172540f, 0.167322f, 0.164156f, 0.163805f, 0.166348f, 0.171193f, 0.177950f, 0.186502f, 0.196457f, 0.207441f, 0.219566f, 0.232839f, 0.246720f, 0.260848f, 0.275255f, 0.289353f, 0.301890f, 0.312265f, 0.320652f, 0.326802f, 0.330234f, 0.331393f, 0.331081f, 0.329265f, 0.325882f, 0.321843f, 0.317809f, 0.313301f, 0.308200f, 0.303376f, 0.298948f, 0.294010f, 0.288493f, 0.282922f, 0.276566f, 0.268585f, 0.260096f, 0.252244f, 0.244001f, 0.234745f, 0.226212f, 0.219060f, 0.211305f, 0.202525f, 0.194820f, 0.188050f, 0.180130f, 0.172258f, 0.166654f, 0.160911f,
+ 0.153056f, 0.147449f, 0.145612f, 0.140126f, 0.129723f, 0.125834f, 0.129084f, 0.121600f, 0.102649f, 0.099485f, 0.113861f, 0.102603f, 0.058029f, 0.054997f, 0.145041f, 0.249571f, 0.251898f, 0.163725f, 0.095922f, 0.086161f, 0.074951f, 0.048383f, 0.072896f, 0.160524f, 0.219423f, 0.186863f, 0.115135f, 0.076735f, 0.067205f, 0.048319f, 0.014202f, -0.026677f, -0.067100f, -0.065851f, 0.027911f, 0.176276f, 0.254369f, 0.199913f, 0.095255f, 0.049417f, 0.061851f, 0.063067f, 0.033342f, 0.006788f, -0.006173f, -0.024075f, -0.038289f, -0.020048f},
+ {0.004145f, 0.003666f, -0.011472f, -0.025737f, -0.020888f, -0.002681f, 0.005708f, 0.001729f, 0.016346f, 0.075712f, 0.160203f, 0.207765f, 0.152869f, -0.017357f, -0.211441f, -0.262841f, -0.087261f, 0.176895f, 0.266228f, 0.075175f, -0.219293f, -0.361347f, -0.282230f, -0.104299f, 0.053635f, 0.176306f, 0.281631f, 0.353803f, 0.373719f, 0.355618f, 0.322626f, 0.277765f, 0.217383f, 0.148569f, 0.078599f, 0.004588f, -0.075448f, -0.153048f, -0.217527f, -0.265298f, -0.297854f, -0.317827f, -0.329255f, -0.336467f, -0.341363f, -0.344354f, -0.346614f, -0.348711f, -0.348971f, -0.345749f, -0.339625f, -0.331802f, -0.322488f, -0.312203f, -0.302613f, -0.294865f, -0.288630f, -0.283324f, -0.278784f, -0.274543f, -0.269837f, -0.264413f, -0.258247f, -0.250753f, -0.241341f, -0.230387f, -0.218578f, -0.205635f, -0.190698f, -0.173676f, -0.155193f, -0.135271f, -0.113074f, -0.088233f, -0.061586f, -0.034088f, -0.005671f, 0.023848f, 0.053155f, 0.080091f, 0.104054f, 0.126354f, 0.147577f, 0.166135f, 0.180635f, 0.192361f, 0.203590f, 0.214103f, 0.221263f, 0.223474f, 0.221824f, 0.217974f, 0.211925f, 0.202660f, 0.190084f, 0.175511f,
+ 0.160523f, 0.145801f, 0.131012f, 0.115698f, 0.100234f, 0.085751f, 0.073156f, 0.062624f, 0.054028f, 0.047150f, 0.041205f, 0.034932f, 0.027678f, 0.019998f, 0.012848f, 0.006575f, 0.000758f, -0.005551f, -0.013454f, -0.023353f, -0.034257f, -0.044468f, -0.053061f, -0.060377f, -0.067374f, -0.075053f, -0.084164f, -0.094773f, -0.106230f, -0.117963f, -0.129996f, -0.142510f, -0.155380f, -0.168334f, -0.180912f, -0.192154f, -0.200956f, -0.206850f, -0.209945f, -0.210369f, -0.208393f, -0.204697f, -0.199808f, -0.193700f, -0.186516f, -0.179137f, -0.172540f, -0.167322f, -0.164156f, -0.163805f, -0.166348f, -0.171193f, -0.177950f, -0.186502f, -0.196457f, -0.207441f, -0.219566f, -0.232839f, -0.246720f, -0.260848f, -0.275255f, -0.289353f, -0.301890f, -0.312265f, -0.320652f, -0.326802f, -0.330234f, -0.331393f, -0.331081f, -0.329265f, -0.325882f, -0.321843f, -0.317809f, -0.313301f, -0.308200f, -0.303376f, -0.298948f, -0.294010f, -0.288493f, -0.282922f, -0.276566f, -0.268585f, -0.260096f, -0.252244f, -0.244001f, -0.234745f, -0.226212f, -0.219060f, -0.211305f, -0.202525f, -0.194820f, -0.188050f, -0.180130f, -0.172258f, -0.166654f, -0.160911f,
+ -0.153056f, -0.147449f, -0.145612f, -0.140126f, -0.129723f, -0.125834f, -0.129084f, -0.121600f, -0.102649f, -0.099485f, -0.113861f, -0.102603f, -0.058029f, -0.054997f, -0.145041f, -0.249571f, -0.251898f, -0.163725f, -0.095922f, -0.086161f, -0.074951f, -0.048383f, -0.072896f, -0.160524f, -0.219423f, -0.186863f, -0.115135f, -0.076735f, -0.067205f, -0.048319f, -0.014202f, 0.026677f, 0.067100f, 0.065851f, -0.027911f, -0.176276f, -0.254369f, -0.199913f, -0.095255f, -0.049417f, -0.061851f, -0.063067f, -0.033342f, -0.006788f, 0.006173f, 0.024075f, 0.038289f, 0.020048f}
+ },
+ {
+ {-0.021669f, -0.023685f, 0.023828f, 0.034018f, -0.023524f, -0.049286f, 0.040503f, 0.161875f, 0.150811f, -0.019734f, -0.197676f, -0.229030f, -0.106401f, 0.062770f, 0.162365f, 0.129952f, -0.007762f, -0.128175f, -0.106139f, 0.044971f, 0.173666f, 0.163889f, 0.058328f, -0.023611f, -0.033294f, -0.007600f, 0.017864f, 0.044155f, 0.072516f, 0.086941f, 0.077826f, 0.052501f, 0.019845f, -0.016546f, -0.051887f, -0.081943f, -0.109000f, -0.136036f, -0.158638f, -0.169848f, -0.168532f, -0.157762f, -0.140048f, -0.118475f, -0.097856f, -0.081023f, -0.066814f, -0.053083f, -0.038732f, -0.022657f, -0.003922f, 0.016835f, 0.038572f, 0.061908f, 0.087943f, 0.115804f, 0.143100f, 0.168000f, 0.189456f, 0.206191f, 0.216814f, 0.220647f, 0.217699f, 0.207967f, 0.191048f, 0.166404f, 0.133914f, 0.094053f, 0.047458f, -0.005253f, -0.062902f, -0.123378f, -0.184188f, -0.242930f, -0.297204f, -0.344947f, -0.385106f, -0.417196f, -0.440297f, -0.453766f, -0.458836f, -0.457795f, -0.451309f, -0.438205f, -0.418365f, -0.394081f, -0.367688f, -0.339298f, -0.307922f, -0.273643f, -0.237339f, -0.199024f, -0.157916f, -0.114031f, -0.068508f, -0.022295f,
+ 0.024378f, 0.070864f, 0.115420f, 0.156302f, 0.192913f, 0.225272f, 0.252645f, 0.273162f, 0.284913f, 0.287670f, 0.283774f, 0.276781f, 0.268540f, 0.257900f, 0.242812f, 0.223195f, 0.201277f, 0.179871f, 0.160911f, 0.144831f, 0.130605f, 0.116910f, 0.103678f, 0.091983f, 0.082527f, 0.075057f, 0.068993f, 0.063538f, 0.057488f, 0.050008f, 0.041284f, 0.031626f, 0.020682f, 0.008290f, -0.004841f, -0.017983f, -0.030869f, -0.042934f, -0.053314f, -0.061863f, -0.068957f, -0.074456f, -0.078162f, -0.080807f, -0.083164f, -0.084941f, -0.085810f, -0.086426f, -0.087233f, -0.087667f, -0.087431f, -0.086993f, -0.086222f, -0.084410f, -0.081830f, -0.079316f, -0.076543f, -0.072767f, -0.068486f, -0.064301f, -0.059443f, -0.053446f, -0.047480f, -0.042320f, -0.037216f, -0.032146f, -0.028420f, -0.026114f, -0.023941f, -0.021979f, -0.021258f, -0.021151f, -0.020625f, -0.020834f, -0.023040f, -0.026119f, -0.029262f, -0.034092f, -0.041349f, -0.049446f, -0.058245f, -0.069370f, -0.081739f, -0.092511f, -0.102306f, -0.113154f, -0.123020f, -0.129316f, -0.134387f, -0.140442f, -0.144425f, -0.144702f, -0.145130f, -0.146612f, -0.144890f, -0.140872f,
+ -0.139791f, -0.138608f, -0.131360f, -0.124680f, -0.126031f, -0.124079f, -0.109182f, -0.099237f, -0.107590f, -0.107222f, -0.078014f, -0.060004f, -0.087081f, -0.098386f, -0.015611f, 0.107616f, 0.131899f, 0.033279f, -0.065099f, -0.084123f, -0.081752f, -0.110294f, -0.109745f, -0.022550f, 0.083650f, 0.098982f, 0.017454f, -0.075044f, -0.120096f, -0.135564f, -0.165934f, -0.217688f, -0.234747f, -0.144650f, 0.038500f, 0.179477f, 0.153231f, 0.002298f, -0.107319f, -0.088405f, -0.015190f, 0.008703f, -0.016573f, -0.026527f, -0.001403f, 0.023135f, 0.022859f, 0.008202f},
+ {0.021669f, 0.023685f, -0.023828f, -0.034018f, 0.023524f, 0.049286f, -0.040503f, -0.161875f, -0.150811f, 0.019734f, 0.197676f, 0.229030f, 0.106401f, -0.062770f, -0.162365f, -0.129952f, 0.007762f, 0.128175f, 0.106139f, -0.044971f, -0.173666f, -0.163889f, -0.058328f, 0.023611f, 0.033294f, 0.007600f, -0.017864f, -0.044155f, -0.072516f, -0.086941f, -0.077826f, -0.052501f, -0.019845f, 0.016546f, 0.051887f, 0.081943f, 0.109000f, 0.136036f, 0.158638f, 0.169848f, 0.168532f, 0.157762f, 0.140048f, 0.118475f, 0.097856f, 0.081023f, 0.066814f, 0.053083f, 0.038732f, 0.022657f, 0.003922f, -0.016835f, -0.038572f, -0.061908f, -0.087943f, -0.115804f, -0.143100f, -0.168000f, -0.189456f, -0.206191f, -0.216814f, -0.220647f, -0.217699f, -0.207967f, -0.191048f, -0.166404f, -0.133914f, -0.094053f, -0.047458f, 0.005253f, 0.062902f, 0.123378f, 0.184188f, 0.242930f, 0.297204f, 0.344947f, 0.385106f, 0.417196f, 0.440297f, 0.453766f, 0.458836f, 0.457795f, 0.451309f, 0.438205f, 0.418365f, 0.394081f, 0.367688f, 0.339298f, 0.307922f, 0.273643f, 0.237339f, 0.199024f, 0.157916f, 0.114031f, 0.068508f, 0.022295f,
+ -0.024378f, -0.070864f, -0.115420f, -0.156302f, -0.192913f, -0.225272f, -0.252645f, -0.273162f, -0.284913f, -0.287670f, -0.283774f, -0.276781f, -0.268540f, -0.257900f, -0.242812f, -0.223195f, -0.201277f, -0.179871f, -0.160911f, -0.144831f, -0.130605f, -0.116910f, -0.103678f, -0.091983f, -0.082527f, -0.075057f, -0.068993f, -0.063538f, -0.057488f, -0.050008f, -0.041284f, -0.031626f, -0.020682f, -0.008290f, 0.004841f, 0.017983f, 0.030869f, 0.042934f, 0.053314f, 0.061863f, 0.068957f, 0.074456f, 0.078162f, 0.080807f, 0.083164f, 0.084941f, 0.085810f, 0.086426f, 0.087233f, 0.087667f, 0.087431f, 0.086993f, 0.086222f, 0.084410f, 0.081830f, 0.079316f, 0.076543f, 0.072767f, 0.068486f, 0.064301f, 0.059443f, 0.053446f, 0.047480f, 0.042320f, 0.037216f, 0.032146f, 0.028420f, 0.026114f, 0.023941f, 0.021979f, 0.021258f, 0.021151f, 0.020625f, 0.020834f, 0.023040f, 0.026119f, 0.029262f, 0.034092f, 0.041349f, 0.049446f, 0.058245f, 0.069370f, 0.081739f, 0.092511f, 0.102306f, 0.113154f, 0.123020f, 0.129316f, 0.134387f, 0.140442f, 0.144425f, 0.144702f, 0.145130f, 0.146612f, 0.144890f, 0.140872f,
+ 0.139791f, 0.138608f, 0.131360f, 0.124680f, 0.126031f, 0.124079f, 0.109182f, 0.099237f, 0.107590f, 0.107222f, 0.078014f, 0.060004f, 0.087081f, 0.098386f, 0.015611f, -0.107616f, -0.131899f, -0.033279f, 0.065099f, 0.084123f, 0.081752f, 0.110294f, 0.109745f, 0.022550f, -0.083650f, -0.098982f, -0.017454f, 0.075044f, 0.120096f, 0.135564f, 0.165934f, 0.217688f, 0.234747f, 0.144650f, -0.038500f, -0.179477f, -0.153231f, -0.002298f, 0.107319f, 0.088405f, 0.015190f, -0.008703f, 0.016573f, 0.026527f, 0.001403f, -0.023135f, -0.022859f, -0.008202f}
+ },
+ {
+ {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f,
+ -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f,
+ 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f},
+ {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f,
+ -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f,
+ 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f}
+ },
+ {
+ {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f,
+ -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f,
+ 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f},
+ {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f,
+ -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f,
+ 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f}
+ },
+ {
+ {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f,
+ -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f,
+ 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f},
+ {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f,
+ -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f,
+ 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f}
+ },
+ {
+ {0.005237f, 0.021703f, 0.045977f, 0.071806f, 0.092952f, 0.081260f, -0.003190f, -0.145310f, -0.275966f, -0.362527f, -0.395227f, -0.264156f, 0.150047f, 0.651732f, 0.736748f, 0.178493f, -0.546265f, -0.726461f, -0.253335f, 0.307326f, 0.460253f, 0.280757f, 0.110658f, 0.068622f, 0.044595f, -0.021458f, -0.074721f, -0.084225f, -0.083528f, -0.089857f, -0.082326f, -0.054179f, -0.024468f, -0.003872f, 0.012161f, 0.024961f, 0.032523f, 0.038120f, 0.043734f, 0.045226f, 0.042031f, 0.040072f, 0.040964f, 0.039871f, 0.035748f, 0.033014f, 0.032973f, 0.032945f, 0.032894f, 0.035106f, 0.038930f, 0.041809f, 0.043292f, 0.043813f, 0.042340f, 0.038269f, 0.032751f, 0.026426f, 0.018771f, 0.010266f, 0.002197f, -0.005598f, -0.014102f, -0.022944f, -0.031212f, -0.039210f, -0.047434f, -0.055236f, -0.062092f, -0.068591f, -0.075131f, -0.081310f, -0.087184f, -0.093424f, -0.099923f, -0.105783f, -0.110523f, -0.114008f, -0.115743f, -0.115455f, -0.113562f, -0.110039f, -0.103812f, -0.094238f, -0.082140f, -0.068646f, -0.053906f, -0.037508f, -0.019400f, -0.000138f, 0.019150f, 0.037116f, 0.052952f, 0.066525f, 0.077559f, 0.085419f,
+ 0.090024f, 0.092137f, 0.092407f, 0.090931f, 0.088051f, 0.084846f, 0.082459f, 0.081306f, 0.081002f, 0.080874f, 0.080752f, 0.081399f, 0.083837f, 0.088256f, 0.093970f, 0.100339f, 0.107259f, 0.114966f, 0.123841f, 0.134136f, 0.145461f, 0.156869f, 0.167780f, 0.178468f, 0.189584f, 0.201647f, 0.214894f, 0.228991f, 0.243006f, 0.256233f, 0.268833f, 0.281258f, 0.293527f, 0.305381f, 0.316502f, 0.326245f, 0.333893f, 0.339409f, 0.343323f, 0.345920f, 0.347256f, 0.347629f, 0.347192f, 0.345526f, 0.342384f, 0.338359f, 0.334213f, 0.330257f, 0.326814f, 0.324352f, 0.322779f, 0.321501f, 0.320285f, 0.319177f, 0.317892f, 0.316244f, 0.314676f, 0.313474f, 0.312258f, 0.310891f, 0.309761f, 0.308650f, 0.306736f, 0.303971f, 0.300919f, 0.297365f, 0.292823f, 0.287889f, 0.283309f, 0.278653f, 0.273613f, 0.269123f, 0.265633f, 0.262210f, 0.258582f, 0.255670f, 0.253312f, 0.250271f, 0.246652f, 0.243183f, 0.238876f, 0.232859f, 0.226812f, 0.222000f, 0.216739f, 0.210266f, 0.204891f, 0.201099f, 0.196094f, 0.189759f, 0.185117f, 0.181542f, 0.175943f, 0.170100f, 0.166931f, 0.162845f,
+ 0.155378f, 0.150889f, 0.151178f, 0.145769f, 0.133595f, 0.131101f, 0.138699f, 0.131114f, 0.107876f, 0.107399f, 0.131831f, 0.121095f, 0.065160f, 0.067368f, 0.195312f, 0.334380f, 0.321328f, 0.179544f, 0.074250f, 0.062451f, 0.055156f, 0.024988f, 0.064983f, 0.195879f, 0.284344f, 0.231376f, 0.110090f, 0.037519f, 0.019981f, -0.000182f, -0.041027f, -0.092433f, -0.145801f, -0.157474f, -0.070642f, 0.074676f, 0.146071f, 0.088851f, 0.000113f, -0.023302f, -0.011566f, -0.029134f, -0.060776f, -0.081612f, -0.140841f, -0.254957f, -0.296521f, -0.136956f},
+ {-0.005237f, -0.021703f, -0.045977f, -0.071806f, -0.092952f, -0.081260f, 0.003190f, 0.145310f, 0.275966f, 0.362527f, 0.395227f, 0.264156f, -0.150047f, -0.651732f, -0.736748f, -0.178493f, 0.546265f, 0.726461f, 0.253335f, -0.307326f, -0.460253f, -0.280757f, -0.110658f, -0.068622f, -0.044595f, 0.021458f, 0.074721f, 0.084225f, 0.083528f, 0.089857f, 0.082326f, 0.054179f, 0.024468f, 0.003872f, -0.012161f, -0.024961f, -0.032523f, -0.038120f, -0.043734f, -0.045226f, -0.042031f, -0.040072f, -0.040964f, -0.039871f, -0.035748f, -0.033014f, -0.032973f, -0.032945f, -0.032894f, -0.035106f, -0.038930f, -0.041809f, -0.043292f, -0.043813f, -0.042340f, -0.038269f, -0.032751f, -0.026426f, -0.018771f, -0.010266f, -0.002197f, 0.005598f, 0.014102f, 0.022944f, 0.031212f, 0.039210f, 0.047434f, 0.055236f, 0.062092f, 0.068591f, 0.075131f, 0.081310f, 0.087184f, 0.093424f, 0.099923f, 0.105783f, 0.110523f, 0.114008f, 0.115743f, 0.115455f, 0.113562f, 0.110039f, 0.103812f, 0.094238f, 0.082140f, 0.068646f, 0.053906f, 0.037508f, 0.019400f, 0.000138f, -0.019150f, -0.037116f, -0.052952f, -0.066525f, -0.077559f, -0.085419f,
+ -0.090024f, -0.092137f, -0.092407f, -0.090931f, -0.088051f, -0.084846f, -0.082459f, -0.081306f, -0.081002f, -0.080874f, -0.080752f, -0.081399f, -0.083837f, -0.088256f, -0.093970f, -0.100339f, -0.107259f, -0.114966f, -0.123841f, -0.134136f, -0.145461f, -0.156869f, -0.167780f, -0.178468f, -0.189584f, -0.201647f, -0.214894f, -0.228991f, -0.243006f, -0.256233f, -0.268833f, -0.281258f, -0.293527f, -0.305381f, -0.316502f, -0.326245f, -0.333893f, -0.339409f, -0.343323f, -0.345920f, -0.347256f, -0.347629f, -0.347192f, -0.345526f, -0.342384f, -0.338359f, -0.334213f, -0.330257f, -0.326814f, -0.324352f, -0.322779f, -0.321501f, -0.320285f, -0.319177f, -0.317892f, -0.316244f, -0.314676f, -0.313474f, -0.312258f, -0.310891f, -0.309761f, -0.308650f, -0.306736f, -0.303971f, -0.300919f, -0.297365f, -0.292823f, -0.287889f, -0.283309f, -0.278653f, -0.273613f, -0.269123f, -0.265633f, -0.262210f, -0.258582f, -0.255670f, -0.253312f, -0.250271f, -0.246652f, -0.243183f, -0.238876f, -0.232859f, -0.226812f, -0.222000f, -0.216739f, -0.210266f, -0.204891f, -0.201099f, -0.196094f, -0.189759f, -0.185117f, -0.181542f, -0.175943f, -0.170100f, -0.166931f, -0.162845f,
+ -0.155378f, -0.150889f, -0.151178f, -0.145769f, -0.133595f, -0.131101f, -0.138699f, -0.131114f, -0.107876f, -0.107399f, -0.131831f, -0.121095f, -0.065160f, -0.067368f, -0.195312f, -0.334380f, -0.321328f, -0.179544f, -0.074250f, -0.062451f, -0.055156f, -0.024988f, -0.064983f, -0.195879f, -0.284344f, -0.231376f, -0.110090f, -0.037519f, -0.019981f, 0.000182f, 0.041027f, 0.092433f, 0.145801f, 0.157474f, 0.070642f, -0.074676f, -0.146071f, -0.088851f, -0.000113f, 0.023302f, 0.011566f, 0.029134f, 0.060776f, 0.081612f, 0.140841f, 0.254957f, 0.296521f, 0.136956f}
+ },
+ {
+ {0.003290f, 0.004457f, -0.005528f, -0.024503f, -0.040658f, -0.025318f, 0.044206f, 0.129212f, 0.134877f, 0.022060f, -0.113425f, -0.138652f, -0.048257f, 0.038579f, 0.043176f, 0.010064f, 0.006812f, 0.021760f, 0.008859f, -0.024480f, -0.035157f, -0.018780f, -0.010069f, -0.021483f, -0.027992f, -0.012071f, 0.011813f, 0.022917f, 0.019094f, 0.008846f, -0.003933f, -0.019076f, -0.033862f, -0.044037f, -0.047229f, -0.043365f, -0.034518f, -0.024371f, -0.015194f, -0.005790f, 0.005807f, 0.018765f, 0.030239f, 0.038382f, 0.043045f, 0.044775f, 0.044750f, 0.045028f, 0.047510f, 0.052757f, 0.060176f, 0.068888f, 0.078026f, 0.086682f, 0.094135f, 0.100148f, 0.104865f, 0.108434f, 0.110857f, 0.112171f, 0.112552f, 0.112064f, 0.110518f, 0.107865f, 0.104605f, 0.101407f, 0.098467f, 0.095713f, 0.093491f, 0.092393f, 0.092459f, 0.093229f, 0.094672f, 0.097391f, 0.101744f, 0.107363f, 0.113784f, 0.120958f, 0.128800f, 0.136599f, 0.143271f, 0.148034f, 0.150614f, 0.150845f, 0.148141f, 0.141385f, 0.129494f, 0.112216f, 0.090156f, 0.063735f, 0.032399f, -0.004651f, -0.046969f, -0.092530f, -0.138942f, -0.184556f,
+ -0.228255f, -0.268567f, -0.303451f, -0.331114f, -0.351060f, -0.364229f, -0.371919f, -0.374505f, -0.371598f, -0.363669f, -0.353079f, -0.342887f, -0.334569f, -0.327154f, -0.318566f, -0.307656f, -0.295101f, -0.282663f, -0.271630f, -0.261889f, -0.252419f, -0.242495f, -0.232267f, -0.222371f, -0.213326f, -0.205197f, -0.197481f, -0.189342f, -0.180196f, -0.170060f, -0.159249f, -0.147949f, -0.136227f, -0.124196f, -0.111996f, -0.099831f, -0.088089f, -0.077140f, -0.066975f, -0.057295f, -0.047872f, -0.038650f, -0.029694f, -0.021309f, -0.013879f, -0.007297f, -0.000899f, 0.005873f, 0.013174f, 0.021158f, 0.029939f, 0.039052f, 0.047778f, 0.056179f, 0.065084f, 0.075097f, 0.086363f, 0.099143f, 0.113686f, 0.129646f, 0.146404f, 0.163684f, 0.181241f, 0.198487f, 0.214981f, 0.230647f, 0.245100f, 0.257590f, 0.267839f, 0.275939f, 0.281514f, 0.284182f, 0.284595f, 0.283723f, 0.281609f, 0.278146f, 0.274139f, 0.270221f, 0.265944f, 0.261144f, 0.256555f, 0.252147f, 0.247009f, 0.241520f, 0.236982f, 0.232888f, 0.227759f, 0.222258f, 0.217750f, 0.212978f, 0.206361f, 0.199432f, 0.193539f, 0.186770f, 0.178678f, 0.172413f,
+ 0.167586f, 0.159508f, 0.149897f, 0.145822f, 0.143645f, 0.132268f, 0.117259f, 0.115520f, 0.119222f, 0.102510f, 0.076298f, 0.083698f, 0.113656f, 0.084809f, -0.030790f, -0.132140f, -0.115897f, -0.025563f, 0.020739f, 0.007588f, 0.010784f, 0.033761f, -0.006155f, -0.114325f, -0.177032f, -0.130405f, -0.055807f, -0.044287f, -0.066534f, -0.052950f, -0.016133f, -0.003723f, 0.004837f, 0.055791f, 0.115431f, 0.104274f, 0.022364f, -0.044182f, -0.042903f, -0.010534f, 0.000271f, -0.011501f, -0.020234f, -0.019218f, -0.016156f, -0.012286f, -0.006242f, -0.001442f},
+ {-0.003290f, -0.004457f, 0.005528f, 0.024503f, 0.040658f, 0.025318f, -0.044206f, -0.129212f, -0.134877f, -0.022060f, 0.113425f, 0.138652f, 0.048257f, -0.038579f, -0.043176f, -0.010064f, -0.006812f, -0.021760f, -0.008859f, 0.024480f, 0.035157f, 0.018780f, 0.010069f, 0.021483f, 0.027992f, 0.012071f, -0.011813f, -0.022917f, -0.019094f, -0.008846f, 0.003933f, 0.019076f, 0.033862f, 0.044037f, 0.047229f, 0.043365f, 0.034518f, 0.024371f, 0.015194f, 0.005790f, -0.005807f, -0.018765f, -0.030239f, -0.038382f, -0.043045f, -0.044775f, -0.044750f, -0.045028f, -0.047510f, -0.052757f, -0.060176f, -0.068888f, -0.078026f, -0.086682f, -0.094135f, -0.100148f, -0.104865f, -0.108434f, -0.110857f, -0.112171f, -0.112552f, -0.112064f, -0.110518f, -0.107865f, -0.104605f, -0.101407f, -0.098467f, -0.095713f, -0.093491f, -0.092393f, -0.092459f, -0.093229f, -0.094672f, -0.097391f, -0.101744f, -0.107363f, -0.113784f, -0.120958f, -0.128800f, -0.136599f, -0.143271f, -0.148034f, -0.150614f, -0.150845f, -0.148141f, -0.141385f, -0.129494f, -0.112216f, -0.090156f, -0.063735f, -0.032399f, 0.004651f, 0.046969f, 0.092530f, 0.138942f, 0.184556f,
+ 0.228255f, 0.268567f, 0.303451f, 0.331114f, 0.351060f, 0.364229f, 0.371919f, 0.374505f, 0.371598f, 0.363669f, 0.353079f, 0.342887f, 0.334569f, 0.327154f, 0.318566f, 0.307656f, 0.295101f, 0.282663f, 0.271630f, 0.261889f, 0.252419f, 0.242495f, 0.232267f, 0.222371f, 0.213326f, 0.205197f, 0.197481f, 0.189342f, 0.180196f, 0.170060f, 0.159249f, 0.147949f, 0.136227f, 0.124196f, 0.111996f, 0.099831f, 0.088089f, 0.077140f, 0.066975f, 0.057295f, 0.047872f, 0.038650f, 0.029694f, 0.021309f, 0.013879f, 0.007297f, 0.000899f, -0.005873f, -0.013174f, -0.021158f, -0.029939f, -0.039052f, -0.047778f, -0.056179f, -0.065084f, -0.075097f, -0.086363f, -0.099143f, -0.113686f, -0.129646f, -0.146404f, -0.163684f, -0.181241f, -0.198487f, -0.214981f, -0.230647f, -0.245100f, -0.257590f, -0.267839f, -0.275939f, -0.281514f, -0.284182f, -0.284595f, -0.283723f, -0.281609f, -0.278146f, -0.274139f, -0.270221f, -0.265944f, -0.261144f, -0.256555f, -0.252147f, -0.247009f, -0.241520f, -0.236982f, -0.232888f, -0.227759f, -0.222258f, -0.217750f, -0.212978f, -0.206361f, -0.199432f, -0.193539f, -0.186770f, -0.178678f, -0.172413f,
+ -0.167586f, -0.159508f, -0.149897f, -0.145822f, -0.143645f, -0.132268f, -0.117259f, -0.115520f, -0.119222f, -0.102510f, -0.076298f, -0.083698f, -0.113656f, -0.084809f, 0.030790f, 0.132140f, 0.115897f, 0.025563f, -0.020739f, -0.007588f, -0.010784f, -0.033761f, 0.006155f, 0.114325f, 0.177032f, 0.130405f, 0.055807f, 0.044287f, 0.066534f, 0.052950f, 0.016133f, 0.003723f, -0.004837f, -0.055791f, -0.115431f, -0.104274f, -0.022364f, 0.044182f, 0.042903f, 0.010534f, -0.000271f, 0.011501f, 0.020234f, 0.019218f, 0.016156f, 0.012286f, 0.006242f, 0.001442f}
+ },
+ {
+ {0.011164f, 0.032836f, 0.036645f, 0.010266f, -0.002453f, 0.048984f, 0.112171f, 0.055369f, -0.161208f, -0.386598f, -0.393418f, -0.096523f, 0.327126f, 0.541470f, 0.342730f, -0.107176f, -0.401047f, -0.302387f, 0.016123f, 0.212089f, 0.167723f, 0.036742f, -0.030253f, -0.044201f, -0.062205f, -0.067661f, -0.027021f, 0.029533f, 0.052252f, 0.045066f, 0.045409f, 0.066031f, 0.094060f, 0.121955f, 0.148648f, 0.165808f, 0.164983f, 0.149562f, 0.128033f, 0.103839f, 0.078146f, 0.053697f, 0.031162f, 0.008320f, -0.015066f, -0.036973f, -0.057449f, -0.078140f, -0.098645f, -0.117711f, -0.136293f, -0.155534f, -0.173582f, -0.187426f, -0.195978f, -0.199282f, -0.197030f, -0.189763f, -0.179374f, -0.166925f, -0.151599f, -0.132527f, -0.109872f, -0.083662f, -0.053273f, -0.018574f, 0.019487f, 0.059494f, 0.099905f, 0.139081f, 0.175756f, 0.209103f, 0.237873f, 0.260210f, 0.274934f, 0.282259f, 0.282639f, 0.275632f, 0.260647f, 0.238307f, 0.210293f, 0.177967f, 0.141703f, 0.101603f, 0.058418f, 0.013424f, -0.032487f, -0.079182f, -0.126657f, -0.174435f, -0.221816f, -0.268160f, -0.312343f, -0.352314f, -0.385884f, -0.411766f,
+ -0.429215f, -0.436998f, -0.433649f, -0.418961f, -0.394679f, -0.363490f, -0.327514f, -0.287649f, -0.244197f, -0.198315f, -0.152926f, -0.111682f, -0.076694f, -0.047638f, -0.023186f, -0.002688f, 0.013718f, 0.025795f, 0.033396f, 0.036453f, 0.035301f, 0.030767f, 0.023826f, 0.015431f, 0.006538f, -0.002356f, -0.011778f, -0.022870f, -0.036327f, -0.051958f, -0.068973f, -0.086308f, -0.103002f, -0.118765f, -0.133990f, -0.148972f, -0.163394f, -0.176630f, -0.188097f, -0.197282f, -0.203969f, -0.208402f, -0.210775f, -0.210752f, -0.207996f, -0.202785f, -0.195626f, -0.186736f, -0.176426f, -0.165358f, -0.153969f, -0.142280f, -0.130641f, -0.119870f, -0.110421f, -0.102206f, -0.095291f, -0.089829f, -0.085360f, -0.081117f, -0.076882f, -0.072735f, -0.068397f, -0.063649f, -0.058777f, -0.053866f, -0.048414f, -0.042214f, -0.035732f, -0.029221f, -0.022534f, -0.015932f, -0.009843f, -0.003888f, 0.002599f, 0.009436f, 0.016248f, 0.023570f, 0.031998f, 0.041152f, 0.050592f, 0.060497f, 0.070490f, 0.079404f, 0.086950f, 0.093796f, 0.099686f, 0.103660f, 0.106051f, 0.107861f, 0.108670f, 0.107687f, 0.105806f, 0.104009f, 0.101428f, 0.097536f,
+ 0.093765f, 0.090589f, 0.086306f, 0.080851f, 0.076442f, 0.072650f, 0.066432f, 0.058555f, 0.053047f, 0.048898f, 0.040819f, 0.029903f, 0.023605f, 0.022728f, 0.019228f, 0.010531f, 0.005076f, 0.008678f, 0.015334f, 0.017655f, 0.018434f, 0.024584f, 0.033609f, 0.033286f, 0.017113f, -0.002988f, -0.006746f, 0.008393f, 0.021799f, 0.020507f, 0.021478f, 0.041101f, 0.054308f, 0.019430f, -0.054565f, -0.102615f, -0.079454f, -0.013054f, 0.033272f, 0.030133f, -0.000759f, -0.021432f, -0.017817f, -0.013999f, -0.044719f, -0.101574f, -0.121223f, -0.055701f},
+ {-0.011164f, -0.032836f, -0.036645f, -0.010266f, 0.002453f, -0.048984f, -0.112171f, -0.055369f, 0.161208f, 0.386598f, 0.393418f, 0.096523f, -0.327126f, -0.541470f, -0.342730f, 0.107176f, 0.401047f, 0.302387f, -0.016123f, -0.212089f, -0.167723f, -0.036742f, 0.030253f, 0.044201f, 0.062205f, 0.067661f, 0.027021f, -0.029533f, -0.052252f, -0.045066f, -0.045409f, -0.066031f, -0.094060f, -0.121955f, -0.148648f, -0.165808f, -0.164983f, -0.149562f, -0.128033f, -0.103839f, -0.078146f, -0.053697f, -0.031162f, -0.008320f, 0.015066f, 0.036973f, 0.057449f, 0.078140f, 0.098645f, 0.117711f, 0.136293f, 0.155534f, 0.173582f, 0.187426f, 0.195978f, 0.199282f, 0.197030f, 0.189763f, 0.179374f, 0.166925f, 0.151599f, 0.132527f, 0.109872f, 0.083662f, 0.053273f, 0.018574f, -0.019487f, -0.059494f, -0.099905f, -0.139081f, -0.175756f, -0.209103f, -0.237873f, -0.260210f, -0.274934f, -0.282259f, -0.282639f, -0.275632f, -0.260647f, -0.238307f, -0.210293f, -0.177967f, -0.141703f, -0.101603f, -0.058418f, -0.013424f, 0.032487f, 0.079182f, 0.126657f, 0.174435f, 0.221816f, 0.268160f, 0.312343f, 0.352314f, 0.385884f, 0.411766f,
+ 0.429215f, 0.436998f, 0.433649f, 0.418961f, 0.394679f, 0.363490f, 0.327514f, 0.287649f, 0.244197f, 0.198315f, 0.152926f, 0.111682f, 0.076694f, 0.047638f, 0.023186f, 0.002688f, -0.013718f, -0.025795f, -0.033396f, -0.036453f, -0.035301f, -0.030767f, -0.023826f, -0.015431f, -0.006538f, 0.002356f, 0.011778f, 0.022870f, 0.036327f, 0.051958f, 0.068973f, 0.086308f, 0.103002f, 0.118765f, 0.133990f, 0.148972f, 0.163394f, 0.176630f, 0.188097f, 0.197282f, 0.203969f, 0.208402f, 0.210775f, 0.210752f, 0.207996f, 0.202785f, 0.195626f, 0.186736f, 0.176426f, 0.165358f, 0.153969f, 0.142280f, 0.130641f, 0.119870f, 0.110421f, 0.102206f, 0.095291f, 0.089829f, 0.085360f, 0.081117f, 0.076882f, 0.072735f, 0.068397f, 0.063649f, 0.058777f, 0.053866f, 0.048414f, 0.042214f, 0.035732f, 0.029221f, 0.022534f, 0.015932f, 0.009843f, 0.003888f, -0.002599f, -0.009436f, -0.016248f, -0.023570f, -0.031998f, -0.041152f, -0.050592f, -0.060497f, -0.070490f, -0.079404f, -0.086950f, -0.093796f, -0.099686f, -0.103660f, -0.106051f, -0.107861f, -0.108670f, -0.107687f, -0.105806f, -0.104009f, -0.101428f, -0.097536f,
+ -0.093765f, -0.090589f, -0.086306f, -0.080851f, -0.076442f, -0.072650f, -0.066432f, -0.058555f, -0.053047f, -0.048898f, -0.040819f, -0.029903f, -0.023605f, -0.022728f, -0.019228f, -0.010531f, -0.005076f, -0.008678f, -0.015334f, -0.017655f, -0.018434f, -0.024584f, -0.033609f, -0.033286f, -0.017113f, 0.002988f, 0.006746f, -0.008393f, -0.021799f, -0.020507f, -0.021478f, -0.041101f, -0.054308f, -0.019430f, 0.054565f, 0.102615f, 0.079454f, 0.013054f, -0.033272f, -0.030133f, 0.000759f, 0.021432f, 0.017817f, 0.013999f, 0.044719f, 0.101574f, 0.121223f, 0.055701f}
+ },
+ {
+ {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f,
+ -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f,
+ -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f},
+ {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f,
+ -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f,
+ -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f}
+ },
+ {
+ {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f,
+ 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f,
+ -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f},
+ {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f,
+ 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f,
+ -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f}
+ },
+ {
+ {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f,
+ 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f,
+ -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f},
+ {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f,
+ 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f,
+ -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f}
+ },
+ {
+ {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f,
+ 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f,
+ -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f},
+ {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f,
+ 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f,
+ -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f}
+ }
+};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 32000 */
+
+const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1;
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}};
+const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0;
+const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]={
+ {
+ {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f,
+ 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f},
+ {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f,
+ 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f}
+ },
+ {
+ {0.025824f, 0.254482f, 0.612140f, 0.908281f, 0.966338f, 0.746349f, 0.326804f, -0.189774f, -0.683810f, -1.011094f, -1.110601f, -1.050792f, -0.841050f, -0.331373f, 0.453002f, 0.990359f, 0.684451f, -0.303752f, -1.023046f, -0.756945f, 0.181886f, 0.916524f, 1.017605f, 0.742230f, 0.451730f, 0.204139f, -0.066098f, -0.311503f, -0.457293f, -0.536699f, -0.617322f, -0.694602f, -0.735639f, -0.751680f, -0.768963f, -0.782765f, -0.780489f, -0.769523f, -0.757459f, -0.737198f, -0.705559f, -0.670342f, -0.633558f, -0.589942f, -0.541742f, -0.495987f, -0.451106f, -0.402147f, -0.352739f, -0.308813f, -0.268274f, -0.227132f, -0.187240f, -0.150381f, -0.113561f, -0.075466f, -0.039106f, -0.005245f, 0.028554f, 0.061642f, 0.090951f, 0.117114f, 0.142717f, 0.166563f, 0.186151f, 0.202842f, 0.218927f, 0.233139f, 0.243777f, 0.252381f, 0.260617f, 0.267492f, 0.272370f, 0.276920f, 0.282318f, 0.288000f, 0.293924f, 0.300949f, 0.309137f, 0.318235f, 0.328763f, 0.340586f, 0.352257f, 0.363455f, 0.375587f, 0.388768f, 0.401116f, 0.411976f, 0.422808f, 0.434307f, 0.445690f, 0.457064f, 0.469628f, 0.483664f, 0.498780f, 0.515481f,
+ 0.534276f, 0.554263f, 0.574434f, 0.595002f, 0.615889f, 0.635594f, 0.652882f, 0.667922f, 0.680882f, 0.691118f, 0.698246f, 0.702348f, 0.703094f, 0.700394f, 0.695668f, 0.690852f, 0.686570f, 0.682549f, 0.678880f, 0.675687f, 0.672709f, 0.670365f, 0.669993f, 0.672124f, 0.675718f, 0.679580f, 0.683205f, 0.686101f, 0.687934f, 0.689429f, 0.691608f, 0.694284f, 0.696649f, 0.698823f, 0.701383f, 0.704096f, 0.706544f, 0.709152f, 0.712317f, 0.715522f, 0.718443f, 0.721714f, 0.725654f, 0.729661f, 0.733628f, 0.738335f, 0.743905f, 0.749740f, 0.756281f, 0.764683f, 0.774778f, 0.785838f, 0.798756f, 0.814520f, 0.832066f, 0.851590f, 0.875921f, 0.899332f, 0.897448f, 0.844156f, 0.745650f, 0.645128f, 0.582813f, 0.561026f},
+ {-0.025824f, -0.254482f, -0.612140f, -0.908281f, -0.966338f, -0.746349f, -0.326804f, 0.189774f, 0.683810f, 1.011094f, 1.110601f, 1.050792f, 0.841050f, 0.331373f, -0.453002f, -0.990359f, -0.684451f, 0.303752f, 1.023046f, 0.756945f, -0.181886f, -0.916524f, -1.017605f, -0.742230f, -0.451730f, -0.204139f, 0.066098f, 0.311503f, 0.457293f, 0.536699f, 0.617322f, 0.694602f, 0.735639f, 0.751680f, 0.768963f, 0.782765f, 0.780489f, 0.769523f, 0.757459f, 0.737198f, 0.705559f, 0.670342f, 0.633558f, 0.589942f, 0.541742f, 0.495987f, 0.451106f, 0.402147f, 0.352739f, 0.308813f, 0.268274f, 0.227132f, 0.187240f, 0.150381f, 0.113561f, 0.075466f, 0.039106f, 0.005245f, -0.028554f, -0.061642f, -0.090951f, -0.117114f, -0.142717f, -0.166563f, -0.186151f, -0.202842f, -0.218927f, -0.233139f, -0.243777f, -0.252381f, -0.260617f, -0.267492f, -0.272370f, -0.276920f, -0.282318f, -0.288000f, -0.293924f, -0.300949f, -0.309137f, -0.318235f, -0.328763f, -0.340586f, -0.352257f, -0.363455f, -0.375587f, -0.388768f, -0.401116f, -0.411976f, -0.422808f, -0.434307f, -0.445690f, -0.457064f, -0.469628f, -0.483664f, -0.498780f, -0.515481f,
+ -0.534276f, -0.554263f, -0.574434f, -0.595002f, -0.615889f, -0.635594f, -0.652882f, -0.667922f, -0.680882f, -0.691118f, -0.698246f, -0.702348f, -0.703094f, -0.700394f, -0.695668f, -0.690852f, -0.686570f, -0.682549f, -0.678880f, -0.675687f, -0.672709f, -0.670365f, -0.669993f, -0.672124f, -0.675718f, -0.679580f, -0.683205f, -0.686101f, -0.687934f, -0.689429f, -0.691608f, -0.694284f, -0.696649f, -0.698823f, -0.701383f, -0.704096f, -0.706544f, -0.709152f, -0.712317f, -0.715522f, -0.718443f, -0.721714f, -0.725654f, -0.729661f, -0.733628f, -0.738335f, -0.743905f, -0.749740f, -0.756281f, -0.764683f, -0.774778f, -0.785838f, -0.798756f, -0.814520f, -0.832066f, -0.851590f, -0.875921f, -0.899332f, -0.897448f, -0.844156f, -0.745650f, -0.645128f, -0.582813f, -0.561026f}
+ },
+ {
+ {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f,
+ 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f},
+ {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f,
+ 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f}
+ },
+ {
+ {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f,
+ -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f},
+ {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f,
+ -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f}
+ },
+ {
+ {-0.007503f, -0.018071f, -0.022034f, -0.007019f, 0.015663f, 0.024279f, 0.019856f, 0.028228f, 0.059265f, 0.080034f, 0.041688f, -0.071985f, -0.216288f, -0.290455f, -0.199084f, 0.033503f, 0.219776f, 0.164507f, -0.103621f, -0.326326f, -0.288993f, -0.041795f, 0.199504f, 0.304980f, 0.304814f, 0.264038f, 0.192066f, 0.083050f, -0.037289f, -0.139466f, -0.222831f, -0.297054f, -0.358635f, -0.401608f, -0.430419f, -0.449077f, -0.451590f, -0.432074f, -0.394694f, -0.348591f, -0.300496f, -0.254823f, -0.214532f, -0.179585f, -0.148147f, -0.119436f, -0.093021f, -0.067108f, -0.040394f, -0.014078f, 0.010038f, 0.031708f, 0.051075f, 0.067427f, 0.080619f, 0.092054f, 0.103201f, 0.114496f, 0.126191f, 0.138824f, 0.152470f, 0.166746f, 0.181664f, 0.197385f, 0.213306f, 0.228573f, 0.243329f, 0.258289f, 0.273266f, 0.287270f, 0.300006f, 0.312023f, 0.323208f, 0.332273f, 0.338187f, 0.341130f, 0.341345f, 0.337872f, 0.329576f, 0.317081f, 0.302379f, 0.286336f, 0.267902f, 0.246477f, 0.223744f, 0.201743f, 0.179892f, 0.155773f, 0.128766f, 0.101142f, 0.075145f, 0.050682f, 0.026716f, 0.003617f, -0.017003f, -0.034092f,
+ -0.047931f, -0.059456f, -0.069308f, -0.077317f, -0.082784f, -0.085477f, -0.086182f, -0.086000f, -0.085634f, -0.085723f, -0.087061f, -0.089692f, -0.092489f, -0.094395f, -0.095590f, -0.096974f, -0.099214f, -0.102553f, -0.106591f, -0.109940f, -0.111114f, -0.110117f, -0.108385f, -0.107202f, -0.106996f, -0.107734f, -0.108885f, -0.109325f, -0.108294f, -0.106062f, -0.102988f, -0.098685f, -0.092663f, -0.084794f, -0.074707f, -0.061933f, -0.047004f, -0.031245f, -0.015438f, 0.000083f, 0.014483f, 0.027034f, 0.038033f, 0.047706f, 0.055152f, 0.059661f, 0.061803f, 0.062109f, 0.060454f, 0.057667f, 0.055600f, 0.054965f, 0.055463f, 0.057980f, 0.063846f, 0.072975f, 0.086512f, 0.108858f, 0.140638f, 0.171127f, 0.185558f, 0.180720f, 0.167370f, 0.157904f},
+ {0.007503f, 0.018071f, 0.022034f, 0.007019f, -0.015663f, -0.024279f, -0.019856f, -0.028228f, -0.059265f, -0.080034f, -0.041688f, 0.071985f, 0.216288f, 0.290455f, 0.199084f, -0.033503f, -0.219776f, -0.164507f, 0.103621f, 0.326326f, 0.288993f, 0.041795f, -0.199504f, -0.304980f, -0.304814f, -0.264038f, -0.192066f, -0.083050f, 0.037289f, 0.139466f, 0.222831f, 0.297054f, 0.358635f, 0.401608f, 0.430419f, 0.449077f, 0.451590f, 0.432074f, 0.394694f, 0.348591f, 0.300496f, 0.254823f, 0.214532f, 0.179585f, 0.148147f, 0.119436f, 0.093021f, 0.067108f, 0.040394f, 0.014078f, -0.010038f, -0.031708f, -0.051075f, -0.067427f, -0.080619f, -0.092054f, -0.103201f, -0.114496f, -0.126191f, -0.138824f, -0.152470f, -0.166746f, -0.181664f, -0.197385f, -0.213306f, -0.228573f, -0.243329f, -0.258289f, -0.273266f, -0.287270f, -0.300006f, -0.312023f, -0.323208f, -0.332273f, -0.338187f, -0.341130f, -0.341345f, -0.337872f, -0.329576f, -0.317081f, -0.302379f, -0.286336f, -0.267902f, -0.246477f, -0.223744f, -0.201743f, -0.179892f, -0.155773f, -0.128766f, -0.101142f, -0.075145f, -0.050682f, -0.026716f, -0.003617f, 0.017003f, 0.034092f,
+ 0.047931f, 0.059456f, 0.069308f, 0.077317f, 0.082784f, 0.085477f, 0.086182f, 0.086000f, 0.085634f, 0.085723f, 0.087061f, 0.089692f, 0.092489f, 0.094395f, 0.095590f, 0.096974f, 0.099214f, 0.102553f, 0.106591f, 0.109940f, 0.111114f, 0.110117f, 0.108385f, 0.107202f, 0.106996f, 0.107734f, 0.108885f, 0.109325f, 0.108294f, 0.106062f, 0.102988f, 0.098685f, 0.092663f, 0.084794f, 0.074707f, 0.061933f, 0.047004f, 0.031245f, 0.015438f, -0.000083f, -0.014483f, -0.027034f, -0.038033f, -0.047706f, -0.055152f, -0.059661f, -0.061803f, -0.062109f, -0.060454f, -0.057667f, -0.055600f, -0.054965f, -0.055463f, -0.057980f, -0.063846f, -0.072975f, -0.086512f, -0.108858f, -0.140638f, -0.171127f, -0.185558f, -0.180720f, -0.167370f, -0.157904f}
+ },
+ {
+ {0.033462f, -0.011452f, -0.017620f, 0.032435f, 0.045854f, -0.028637f, -0.090702f, -0.014859f, 0.157822f, 0.248642f, 0.155687f, -0.038140f, -0.175256f, -0.171621f, -0.049992f, 0.096608f, 0.151735f, 0.059734f, -0.096679f, -0.157632f, -0.062095f, 0.083857f, 0.144231f, 0.103916f, 0.042535f, 0.012755f, 0.005878f, 0.008085f, 0.027262f, 0.065497f, 0.106896f, 0.138036f, 0.157486f, 0.165566f, 0.161837f, 0.150604f, 0.136230f, 0.115874f, 0.085377f, 0.047978f, 0.010903f, -0.021750f, -0.048159f, -0.066253f, -0.076374f, -0.082524f, -0.088309f, -0.094475f, -0.100881f, -0.107392f, -0.112694f, -0.115260f, -0.115292f, -0.113369f, -0.108048f, -0.096922f, -0.079156f, -0.055336f, -0.025908f, 0.008746f, 0.047468f, 0.088692f, 0.131249f, 0.174377f, 0.217290f, 0.258854f, 0.297502f, 0.331588f, 0.359765f, 0.380676f, 0.392592f, 0.393999f, 0.384351f, 0.363891f, 0.333348f, 0.294223f, 0.248522f, 0.197787f, 0.143366f, 0.087648f, 0.033362f, -0.018763f, -0.069801f, -0.119555f, -0.165608f, -0.206270f, -0.242567f, -0.276200f, -0.307129f, -0.334420f, -0.358104f, -0.378747f, -0.395911f, -0.408313f, -0.415200f, -0.416578f,
+ -0.412241f, -0.401426f, -0.383736f, -0.359890f, -0.331149f, -0.298118f, -0.260569f, -0.218772f, -0.174893f, -0.132630f, -0.094946f, -0.062032f, -0.031764f, -0.002387f, 0.025391f, 0.049012f, 0.066448f, 0.077765f, 0.084806f, 0.089808f, 0.094109f, 0.097653f, 0.099678f, 0.099974f, 0.099364f, 0.099047f, 0.099882f, 0.102244f, 0.105972f, 0.110354f, 0.114607f, 0.118404f, 0.121573f, 0.123531f, 0.123564f, 0.121439f, 0.117280f, 0.111181f, 0.103433f, 0.094690f, 0.085509f, 0.076144f, 0.066975f, 0.058481f, 0.050601f, 0.042886f, 0.035360f, 0.028387f, 0.021756f, 0.014870f, 0.007725f, 0.000696f, -0.006360f, -0.013704f, -0.020901f, -0.027694f, -0.035063f, -0.043655f, -0.051368f, -0.054456f, -0.051542f, -0.045299f, -0.039709f, -0.036841f},
+ {-0.033462f, 0.011452f, 0.017620f, -0.032435f, -0.045854f, 0.028637f, 0.090702f, 0.014859f, -0.157822f, -0.248642f, -0.155687f, 0.038140f, 0.175256f, 0.171621f, 0.049992f, -0.096608f, -0.151735f, -0.059734f, 0.096679f, 0.157632f, 0.062095f, -0.083857f, -0.144231f, -0.103916f, -0.042535f, -0.012755f, -0.005878f, -0.008085f, -0.027262f, -0.065497f, -0.106896f, -0.138036f, -0.157486f, -0.165566f, -0.161837f, -0.150604f, -0.136230f, -0.115874f, -0.085377f, -0.047978f, -0.010903f, 0.021750f, 0.048159f, 0.066253f, 0.076374f, 0.082524f, 0.088309f, 0.094475f, 0.100881f, 0.107392f, 0.112694f, 0.115260f, 0.115292f, 0.113369f, 0.108048f, 0.096922f, 0.079156f, 0.055336f, 0.025908f, -0.008746f, -0.047468f, -0.088692f, -0.131249f, -0.174377f, -0.217290f, -0.258854f, -0.297502f, -0.331588f, -0.359765f, -0.380676f, -0.392592f, -0.393999f, -0.384351f, -0.363891f, -0.333348f, -0.294223f, -0.248522f, -0.197787f, -0.143366f, -0.087648f, -0.033362f, 0.018763f, 0.069801f, 0.119555f, 0.165608f, 0.206270f, 0.242567f, 0.276200f, 0.307129f, 0.334420f, 0.358104f, 0.378747f, 0.395911f, 0.408313f, 0.415200f, 0.416578f,
+ 0.412241f, 0.401426f, 0.383736f, 0.359890f, 0.331149f, 0.298118f, 0.260569f, 0.218772f, 0.174893f, 0.132630f, 0.094946f, 0.062032f, 0.031764f, 0.002387f, -0.025391f, -0.049012f, -0.066448f, -0.077765f, -0.084806f, -0.089808f, -0.094109f, -0.097653f, -0.099678f, -0.099974f, -0.099364f, -0.099047f, -0.099882f, -0.102244f, -0.105972f, -0.110354f, -0.114607f, -0.118404f, -0.121573f, -0.123531f, -0.123564f, -0.121439f, -0.117280f, -0.111181f, -0.103433f, -0.094690f, -0.085509f, -0.076144f, -0.066975f, -0.058481f, -0.050601f, -0.042886f, -0.035360f, -0.028387f, -0.021756f, -0.014870f, -0.007725f, -0.000696f, 0.006360f, 0.013704f, 0.020901f, 0.027694f, 0.035063f, 0.043655f, 0.051368f, 0.054456f, 0.051542f, 0.045299f, 0.039709f, 0.036841f}
+ },
+ {
+ {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f,
+ 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f},
+ {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f,
+ 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f}
+ },
+ {
+ {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f,
+ 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f},
+ {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f,
+ 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f}
+ },
+ {
+ {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f,
+ -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f},
+ {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f,
+ -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f}
+ },
+ {
+ {-0.038707f, -0.040443f, -0.032425f, -0.008667f, 0.039610f, 0.121021f, 0.200841f, 0.209863f, 0.128343f, -0.011854f, -0.222956f, -0.509917f, -0.672944f, -0.397576f, 0.271260f, 0.753657f, 0.530475f, -0.183327f, -0.662957f, -0.535116f, -0.113682f, 0.135696f, 0.139296f, 0.101726f, 0.119927f, 0.126081f, 0.082228f, 0.034341f, 0.008539f, -0.018778f, -0.056453f, -0.082857f, -0.088546f, -0.085336f, -0.080321f, -0.072030f, -0.062931f, -0.055762f, -0.047257f, -0.036657f, -0.029416f, -0.026737f, -0.023178f, -0.017390f, -0.014005f, -0.014139f, -0.014094f, -0.012938f, -0.012763f, -0.012836f, -0.010434f, -0.005527f, 0.000352f, 0.007263f, 0.015320f, 0.022993f, 0.029308f, 0.034837f, 0.039468f, 0.042226f, 0.043473f, 0.044401f, 0.044758f, 0.043609f, 0.041320f, 0.038608f, 0.035016f, 0.030111f, 0.024605f, 0.019016f, 0.012867f, 0.005983f, -0.001177f, -0.008863f, -0.018026f, -0.028938f, -0.041213f, -0.054772f, -0.069509f, -0.084750f, -0.100179f, -0.116316f, -0.133109f, -0.149167f, -0.163209f, -0.175265f, -0.185829f, -0.194738f, -0.201250f, -0.204518f, -0.203992f, -0.199910f, -0.193205f, -0.184582f, -0.174292f, -0.163022f,
+ -0.152075f, -0.142325f, -0.133856f, -0.126875f, -0.122103f, -0.119943f, -0.119907f, -0.121022f, -0.122534f, -0.124394f, -0.127276f, -0.131743f, -0.137311f, -0.142802f, -0.147553f, -0.151741f, -0.155707f, -0.159595f, -0.163318f, -0.166341f, -0.167867f, -0.167752f, -0.166759f, -0.165644f, -0.164497f, -0.162993f, -0.160544f, -0.156329f, -0.149991f, -0.142138f, -0.133494f, -0.123973f, -0.113132f, -0.100831f, -0.086925f, -0.071241f, -0.054316f, -0.037204f, -0.020348f, -0.003592f, 0.012893f, 0.028859f, 0.044680f, 0.060561f, 0.075703f, 0.089381f, 0.101902f, 0.113636f, 0.124499f, 0.135054f, 0.146443f, 0.158891f, 0.172084f, 0.186647f, 0.203232f, 0.221745f, 0.243776f, 0.271628f, 0.299956f, 0.313432f, 0.301412f, 0.272461f, 0.246103f, 0.233169f},
+ {0.038707f, 0.040443f, 0.032425f, 0.008667f, -0.039610f, -0.121021f, -0.200841f, -0.209863f, -0.128343f, 0.011854f, 0.222956f, 0.509917f, 0.672944f, 0.397576f, -0.271260f, -0.753657f, -0.530475f, 0.183327f, 0.662957f, 0.535116f, 0.113682f, -0.135696f, -0.139296f, -0.101726f, -0.119927f, -0.126081f, -0.082228f, -0.034341f, -0.008539f, 0.018778f, 0.056453f, 0.082857f, 0.088546f, 0.085336f, 0.080321f, 0.072030f, 0.062931f, 0.055762f, 0.047257f, 0.036657f, 0.029416f, 0.026737f, 0.023178f, 0.017390f, 0.014005f, 0.014139f, 0.014094f, 0.012938f, 0.012763f, 0.012836f, 0.010434f, 0.005527f, -0.000352f, -0.007263f, -0.015320f, -0.022993f, -0.029308f, -0.034837f, -0.039468f, -0.042226f, -0.043473f, -0.044401f, -0.044758f, -0.043609f, -0.041320f, -0.038608f, -0.035016f, -0.030111f, -0.024605f, -0.019016f, -0.012867f, -0.005983f, 0.001177f, 0.008863f, 0.018026f, 0.028938f, 0.041213f, 0.054772f, 0.069509f, 0.084750f, 0.100179f, 0.116316f, 0.133109f, 0.149167f, 0.163209f, 0.175265f, 0.185829f, 0.194738f, 0.201250f, 0.204518f, 0.203992f, 0.199910f, 0.193205f, 0.184582f, 0.174292f, 0.163022f,
+ 0.152075f, 0.142325f, 0.133856f, 0.126875f, 0.122103f, 0.119943f, 0.119907f, 0.121022f, 0.122534f, 0.124394f, 0.127276f, 0.131743f, 0.137311f, 0.142802f, 0.147553f, 0.151741f, 0.155707f, 0.159595f, 0.163318f, 0.166341f, 0.167867f, 0.167752f, 0.166759f, 0.165644f, 0.164497f, 0.162993f, 0.160544f, 0.156329f, 0.149991f, 0.142138f, 0.133494f, 0.123973f, 0.113132f, 0.100831f, 0.086925f, 0.071241f, 0.054316f, 0.037204f, 0.020348f, 0.003592f, -0.012893f, -0.028859f, -0.044680f, -0.060561f, -0.075703f, -0.089381f, -0.101902f, -0.113636f, -0.124499f, -0.135054f, -0.146443f, -0.158891f, -0.172084f, -0.186647f, -0.203232f, -0.221745f, -0.243776f, -0.271628f, -0.299956f, -0.313432f, -0.301412f, -0.272461f, -0.246103f, -0.233169f}
+ },
+ {
+ {-0.011441f, -0.003265f, 0.004011f, -0.000472f, -0.027714f, -0.075629f, -0.102363f, -0.048427f, 0.075716f, 0.158973f, 0.107163f, -0.028068f, -0.105566f, -0.071921f, -0.008203f, 0.005703f, -0.009101f, 0.001108f, 0.026819f, 0.024213f, -0.004533f, -0.019483f, -0.010977f, -0.008220f, -0.025895f, -0.043275f, -0.039729f, -0.021081f, -0.003698f, 0.006641f, 0.011920f, 0.011671f, 0.003832f, -0.010526f, -0.027836f, -0.044363f, -0.057022f, -0.064947f, -0.070367f, -0.075558f, -0.079517f, -0.079629f, -0.075472f, -0.069036f, -0.062356f, -0.056849f, -0.053900f, -0.054130f, -0.056410f, -0.058748f, -0.059818f, -0.059044f, -0.056030f, -0.050751f, -0.043844f, -0.036068f, -0.027766f, -0.019090f, -0.010327f, -0.001711f, 0.006749f, 0.015049f, 0.022944f, 0.029990f, 0.035833f, 0.040478f, 0.044205f, 0.047143f, 0.049179f, 0.050500f, 0.051764f, 0.053342f, 0.054913f, 0.056356f, 0.058453f, 0.062098f, 0.067413f, 0.074374f, 0.083664f, 0.096097f, 0.111651f, 0.129744f, 0.150062f, 0.172637f, 0.197477f, 0.224325f, 0.252295f, 0.279828f, 0.305655f, 0.329617f, 0.351655f, 0.370228f, 0.382750f, 0.387511f, 0.384321f, 0.373523f,
+ 0.355270f, 0.329788f, 0.297855f, 0.261198f, 0.222427f, 0.183885f, 0.146353f, 0.109686f, 0.074803f, 0.043946f, 0.018611f, -0.002035f, -0.020413f, -0.038698f, -0.057436f, -0.075307f, -0.090415f, -0.102296f, -0.112325f, -0.122030f, -0.131716f, -0.140923f, -0.149260f, -0.156505f, -0.162826f, -0.169104f, -0.176221f, -0.184054f, -0.191847f, -0.199220f, -0.206057f, -0.212014f, -0.216913f, -0.221002f, -0.224224f, -0.226071f, -0.226577f, -0.226473f, -0.226101f, -0.225292f, -0.224225f, -0.223145f, -0.221549f, -0.219033f, -0.216406f, -0.214610f, -0.213404f, -0.212354f, -0.211792f, -0.211513f, -0.210235f, -0.207593f, -0.204699f, -0.201857f, -0.198207f, -0.193847f, -0.188118f, -0.174986f, -0.146065f, -0.102134f, -0.057750f, -0.029670f, -0.021689f, -0.023453f},
+ {0.011441f, 0.003265f, -0.004011f, 0.000472f, 0.027714f, 0.075629f, 0.102363f, 0.048427f, -0.075716f, -0.158973f, -0.107163f, 0.028068f, 0.105566f, 0.071921f, 0.008203f, -0.005703f, 0.009101f, -0.001108f, -0.026819f, -0.024213f, 0.004533f, 0.019483f, 0.010977f, 0.008220f, 0.025895f, 0.043275f, 0.039729f, 0.021081f, 0.003698f, -0.006641f, -0.011920f, -0.011671f, -0.003832f, 0.010526f, 0.027836f, 0.044363f, 0.057022f, 0.064947f, 0.070367f, 0.075558f, 0.079517f, 0.079629f, 0.075472f, 0.069036f, 0.062356f, 0.056849f, 0.053900f, 0.054130f, 0.056410f, 0.058748f, 0.059818f, 0.059044f, 0.056030f, 0.050751f, 0.043844f, 0.036068f, 0.027766f, 0.019090f, 0.010327f, 0.001711f, -0.006749f, -0.015049f, -0.022944f, -0.029990f, -0.035833f, -0.040478f, -0.044205f, -0.047143f, -0.049179f, -0.050500f, -0.051764f, -0.053342f, -0.054913f, -0.056356f, -0.058453f, -0.062098f, -0.067413f, -0.074374f, -0.083664f, -0.096097f, -0.111651f, -0.129744f, -0.150062f, -0.172637f, -0.197477f, -0.224325f, -0.252295f, -0.279828f, -0.305655f, -0.329617f, -0.351655f, -0.370228f, -0.382750f, -0.387511f, -0.384321f, -0.373523f,
+ -0.355270f, -0.329788f, -0.297855f, -0.261198f, -0.222427f, -0.183885f, -0.146353f, -0.109686f, -0.074803f, -0.043946f, -0.018611f, 0.002035f, 0.020413f, 0.038698f, 0.057436f, 0.075307f, 0.090415f, 0.102296f, 0.112325f, 0.122030f, 0.131716f, 0.140923f, 0.149260f, 0.156505f, 0.162826f, 0.169104f, 0.176221f, 0.184054f, 0.191847f, 0.199220f, 0.206057f, 0.212014f, 0.216913f, 0.221002f, 0.224224f, 0.226071f, 0.226577f, 0.226473f, 0.226101f, 0.225292f, 0.224225f, 0.223145f, 0.221549f, 0.219033f, 0.216406f, 0.214610f, 0.213404f, 0.212354f, 0.211792f, 0.211513f, 0.210235f, 0.207593f, 0.204699f, 0.201857f, 0.198207f, 0.193847f, 0.188118f, 0.174986f, 0.146065f, 0.102134f, 0.057750f, 0.029670f, 0.021689f, 0.023453f}
+ },
+ {
+ {-0.022899f, -0.009050f, 0.021042f, 0.035577f, 0.007193f, -0.010991f, 0.067505f, 0.216765f, 0.271970f, 0.095990f, -0.246846f, -0.502443f, -0.427170f, -0.025043f, 0.395378f, 0.472255f, 0.158557f, -0.215865f, -0.309289f, -0.125601f, 0.071920f, 0.117090f, 0.070896f, 0.036158f, 0.010191f, -0.040842f, -0.086996f, -0.084856f, -0.053104f, -0.038760f, -0.049026f, -0.058734f, -0.055081f, -0.041078f, -0.015513f, 0.023625f, 0.067409f, 0.104226f, 0.131662f, 0.152151f, 0.165968f, 0.173980f, 0.179366f, 0.183056f, 0.183232f, 0.180032f, 0.175450f, 0.169336f, 0.160257f, 0.148803f, 0.135933f, 0.119953f, 0.098677f, 0.072731f, 0.044254f, 0.014523f, -0.015264f, -0.043256f, -0.068768f, -0.092960f, -0.116651f, -0.139142f, -0.159634f, -0.177968f, -0.193495f, -0.204628f, -0.209832f, -0.208176f, -0.199162f, -0.182839f, -0.159769f, -0.130297f, -0.094474f, -0.053153f, -0.008358f, 0.038048f, 0.085319f, 0.132878f, 0.179125f, 0.221960f, 0.260199f, 0.293872f, 0.323183f, 0.347625f, 0.366329f, 0.379015f, 0.386161f, 0.388145f, 0.384647f, 0.375101f, 0.359186f, 0.336465f, 0.306144f, 0.267908f, 0.222716f, 0.172166f,
+ 0.117452f, 0.059721f, 0.001259f, -0.054522f, -0.104542f, -0.147316f, -0.182857f, -0.211501f, -0.232650f, -0.244662f, -0.246382f, -0.238892f, -0.225272f, -0.208463f, -0.189745f, -0.169228f, -0.147036f, -0.123663f, -0.099806f, -0.076368f, -0.054370f, -0.034613f, -0.017496f, -0.003066f, 0.009127f, 0.020090f, 0.030773f, 0.041240f, 0.050609f, 0.057724f, 0.061768f, 0.062553f, 0.060572f, 0.056607f, 0.051053f, 0.043676f, 0.034051f, 0.022022f, 0.007797f, -0.008087f, -0.024935f, -0.042312f, -0.060172f, -0.078368f, -0.096310f, -0.113326f, -0.129046f, -0.143214f, -0.155555f, -0.166012f, -0.174718f, -0.181676f, -0.186839f, -0.190425f, -0.192896f, -0.195026f, -0.197709f, -0.199950f, -0.196779f, -0.182409f, -0.157947f, -0.133337f, -0.118252f, -0.113142f},
+ {0.022899f, 0.009050f, -0.021042f, -0.035577f, -0.007193f, 0.010991f, -0.067505f, -0.216765f, -0.271970f, -0.095990f, 0.246846f, 0.502443f, 0.427170f, 0.025043f, -0.395378f, -0.472255f, -0.158557f, 0.215865f, 0.309289f, 0.125601f, -0.071920f, -0.117090f, -0.070896f, -0.036158f, -0.010191f, 0.040842f, 0.086996f, 0.084856f, 0.053104f, 0.038760f, 0.049026f, 0.058734f, 0.055081f, 0.041078f, 0.015513f, -0.023625f, -0.067409f, -0.104226f, -0.131662f, -0.152151f, -0.165968f, -0.173980f, -0.179366f, -0.183056f, -0.183232f, -0.180032f, -0.175450f, -0.169336f, -0.160257f, -0.148803f, -0.135933f, -0.119953f, -0.098677f, -0.072731f, -0.044254f, -0.014523f, 0.015264f, 0.043256f, 0.068768f, 0.092960f, 0.116651f, 0.139142f, 0.159634f, 0.177968f, 0.193495f, 0.204628f, 0.209832f, 0.208176f, 0.199162f, 0.182839f, 0.159769f, 0.130297f, 0.094474f, 0.053153f, 0.008358f, -0.038048f, -0.085319f, -0.132878f, -0.179125f, -0.221960f, -0.260199f, -0.293872f, -0.323183f, -0.347625f, -0.366329f, -0.379015f, -0.386161f, -0.388145f, -0.384647f, -0.375101f, -0.359186f, -0.336465f, -0.306144f, -0.267908f, -0.222716f, -0.172166f,
+ -0.117452f, -0.059721f, -0.001259f, 0.054522f, 0.104542f, 0.147316f, 0.182857f, 0.211501f, 0.232650f, 0.244662f, 0.246382f, 0.238892f, 0.225272f, 0.208463f, 0.189745f, 0.169228f, 0.147036f, 0.123663f, 0.099806f, 0.076368f, 0.054370f, 0.034613f, 0.017496f, 0.003066f, -0.009127f, -0.020090f, -0.030773f, -0.041240f, -0.050609f, -0.057724f, -0.061768f, -0.062553f, -0.060572f, -0.056607f, -0.051053f, -0.043676f, -0.034051f, -0.022022f, -0.007797f, 0.008087f, 0.024935f, 0.042312f, 0.060172f, 0.078368f, 0.096310f, 0.113326f, 0.129046f, 0.143214f, 0.155555f, 0.166012f, 0.174718f, 0.181676f, 0.186839f, 0.190425f, 0.192896f, 0.195026f, 0.197709f, 0.199950f, 0.196779f, 0.182409f, 0.157947f, 0.133337f, 0.118252f, 0.113142f}
+ },
+ {
+ {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f,
+ 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f},
+ {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f,
+ 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f}
+ },
+ {
+ {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f,
+ 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f},
+ {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f,
+ 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f}
+ },
+ {
+ {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f,
+ 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f},
+ {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f,
+ 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f}
+ },
+ {
+ {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f,
+ -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f},
+ {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f,
+ -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f}
+ }
+};
+const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]={
+ {
+ {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f,
+ 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f},
+ {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f,
+ 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f}
+ },
+ {
+ {0.139549f, 0.336827f, 0.308435f, 0.005808f, -0.462640f, -0.907220f, -1.191107f, -1.249724f, -1.052267f, -0.648374f, -0.184425f, 0.248777f, 0.689047f, 1.057228f, 0.989213f, 0.254777f, -0.678946f, -0.922096f, -0.180074f, 0.815838f, 1.130295f, 0.630480f, -0.085113f, -0.526462f, -0.708792f, -0.811530f, -0.847619f, -0.768858f, -0.635090f, -0.531932f, -0.451007f, -0.348401f, -0.234607f, -0.140241f, -0.058435f, 0.029303f, 0.116774f, 0.194059f, 0.268152f, 0.343788f, 0.412925f, 0.472537f, 0.528731f, 0.581041f, 0.623246f, 0.657416f, 0.689726f, 0.717764f, 0.736441f, 0.749186f, 0.761628f, 0.772404f, 0.779073f, 0.784280f, 0.789592f, 0.791949f, 0.790280f, 0.787315f, 0.783161f, 0.775216f, 0.764362f, 0.753702f, 0.742584f, 0.728749f, 0.713786f, 0.700391f, 0.687515f, 0.673424f, 0.659785f, 0.648526f, 0.638593f, 0.629023f, 0.621278f, 0.616302f, 0.612923f, 0.610405f, 0.609282f, 0.609387f, 0.609910f, 0.610809f, 0.611881f, 0.611943f, 0.610799f, 0.609839f, 0.609254f, 0.607395f, 0.603956f, 0.600774f, 0.598705f, 0.596760f, 0.594697f, 0.593483f, 0.593097f, 0.592548f, 0.591657f, 0.590509f,
+ 0.588008f, 0.583041f, 0.575878f, 0.566779f, 0.554791f, 0.539385f, 0.521605f, 0.502464f, 0.481918f, 0.460090f, 0.437796f, 0.415604f, 0.394034f, 0.374531f, 0.358494f, 0.345637f, 0.334728f, 0.325270f, 0.317257f, 0.310383f, 0.304694f, 0.300804f, 0.298429f, 0.295932f, 0.292037f, 0.286783f, 0.280539f, 0.273591f, 0.266789f, 0.260976f, 0.255734f, 0.250105f, 0.244196f, 0.238683f, 0.233398f, 0.227855f, 0.222384f, 0.217379f, 0.212359f, 0.206958f, 0.201751f, 0.197057f, 0.192250f, 0.187098f, 0.182271f, 0.177860f, 0.173126f, 0.168131f, 0.163596f, 0.158984f, 0.153008f, 0.145729f, 0.137439f, 0.126380f, 0.110802f, 0.090574f, 0.060909f, 0.008923f, -0.070270f, -0.152060f, -0.192269f, -0.168828f, -0.103696f, -0.033024f},
+ {-0.139549f, -0.336827f, -0.308435f, -0.005808f, 0.462640f, 0.907220f, 1.191107f, 1.249724f, 1.052267f, 0.648374f, 0.184425f, -0.248777f, -0.689047f, -1.057228f, -0.989213f, -0.254777f, 0.678946f, 0.922096f, 0.180074f, -0.815838f, -1.130295f, -0.630480f, 0.085113f, 0.526462f, 0.708792f, 0.811530f, 0.847619f, 0.768858f, 0.635090f, 0.531932f, 0.451007f, 0.348401f, 0.234607f, 0.140241f, 0.058435f, -0.029303f, -0.116774f, -0.194059f, -0.268152f, -0.343788f, -0.412925f, -0.472537f, -0.528731f, -0.581041f, -0.623246f, -0.657416f, -0.689726f, -0.717764f, -0.736441f, -0.749186f, -0.761628f, -0.772404f, -0.779073f, -0.784280f, -0.789592f, -0.791949f, -0.790280f, -0.787315f, -0.783161f, -0.775216f, -0.764362f, -0.753702f, -0.742584f, -0.728749f, -0.713786f, -0.700391f, -0.687515f, -0.673424f, -0.659785f, -0.648526f, -0.638593f, -0.629023f, -0.621278f, -0.616302f, -0.612923f, -0.610405f, -0.609282f, -0.609387f, -0.609910f, -0.610809f, -0.611881f, -0.611943f, -0.610799f, -0.609839f, -0.609254f, -0.607395f, -0.603956f, -0.600774f, -0.598705f, -0.596760f, -0.594697f, -0.593483f, -0.593097f, -0.592548f, -0.591657f, -0.590509f,
+ -0.588008f, -0.583041f, -0.575878f, -0.566779f, -0.554791f, -0.539385f, -0.521605f, -0.502464f, -0.481918f, -0.460090f, -0.437796f, -0.415604f, -0.394034f, -0.374531f, -0.358494f, -0.345637f, -0.334728f, -0.325270f, -0.317257f, -0.310383f, -0.304694f, -0.300804f, -0.298429f, -0.295932f, -0.292037f, -0.286783f, -0.280539f, -0.273591f, -0.266789f, -0.260976f, -0.255734f, -0.250105f, -0.244196f, -0.238683f, -0.233398f, -0.227855f, -0.222384f, -0.217379f, -0.212359f, -0.206958f, -0.201751f, -0.197057f, -0.192250f, -0.187098f, -0.182271f, -0.177860f, -0.173126f, -0.168131f, -0.163596f, -0.158984f, -0.153008f, -0.145729f, -0.137439f, -0.126380f, -0.110802f, -0.090574f, -0.060909f, -0.008923f, 0.070270f, 0.152060f, 0.192269f, 0.168828f, 0.103696f, 0.033024f}
+ },
+ {
+ {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f,
+ -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f},
+ {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f,
+ -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f}
+ },
+ {
+ {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f,
+ -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f},
+ {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f,
+ -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f}
+ },
+ {
+ {-0.004287f, -0.004125f, 0.010669f, 0.024630f, 0.019494f, 0.000957f, -0.007771f, -0.004086f, -0.018999f, -0.078706f, -0.163526f, -0.211376f, -0.156788f, 0.013090f, 0.206855f, 0.257968f, 0.082065f, -0.182440f, -0.272081f, -0.081322f, 0.212807f, 0.354516f, 0.275100f, 0.096863f, -0.061422f, -0.184431f, -0.290052f, -0.362546f, -0.382821f, -0.365049f, -0.332356f, -0.287833f, -0.227815f, -0.159321f, -0.089659f, -0.016005f, 0.063671f, 0.140956f, 0.205111f, 0.252511f, 0.284711f, 0.304370f, 0.315455f, 0.322285f, 0.326832f, 0.329503f, 0.331399f, 0.333108f, 0.333026f, 0.329471f, 0.322961f, 0.314750f, 0.305096f, 0.294458f, 0.284464f, 0.276331f, 0.269753f, 0.264070f, 0.259113f, 0.254491f, 0.249431f, 0.243603f, 0.237011f, 0.229139f, 0.219355f, 0.207972f, 0.195732f, 0.182410f, 0.167075f, 0.149600f, 0.130686f, 0.110376f, 0.087751f, 0.062438f, 0.035361f, 0.007458f, -0.021421f, -0.051426f, -0.081166f, -0.108532f, -0.132991f, -0.155787f, -0.177450f, -0.196472f, -0.211501f, -0.223729f, -0.235413f, -0.246432f, -0.254147f, -0.256866f, -0.255699f, -0.252400f, -0.246930f, -0.238183f, -0.226128f, -0.212153f,
+ -0.197762f, -0.183576f, -0.169356f, -0.154687f, -0.139838f, -0.125919f, -0.113952f, -0.104109f, -0.096147f, -0.089874f, -0.084624f, -0.079081f, -0.072485f, -0.065470f, -0.059088f, -0.053584f, -0.048459f, -0.042892f, -0.035834f, -0.026742f, -0.016583f, -0.007210f, 0.000460f, 0.006925f, 0.013101f, 0.019829f, 0.027937f, 0.037640f, 0.048171f, 0.058820f, 0.069767f, 0.081298f, 0.093098f, 0.104818f, 0.116218f, 0.126365f, 0.133907f, 0.138397f, 0.140204f, 0.139366f, 0.135883f, 0.130589f, 0.124266f, 0.116642f, 0.107629f, 0.098425f, 0.090176f, 0.083055f, 0.077635f, 0.075176f, 0.075705f, 0.078026f, 0.081969f, 0.088024f, 0.095261f, 0.102733f, 0.111115f, 0.118029f, 0.114164f, 0.091680f, 0.056373f, 0.024417f, 0.006512f, 0.000770f},
+ {0.004287f, 0.004125f, -0.010669f, -0.024630f, -0.019494f, -0.000957f, 0.007771f, 0.004086f, 0.018999f, 0.078706f, 0.163526f, 0.211376f, 0.156788f, -0.013090f, -0.206855f, -0.257968f, -0.082065f, 0.182440f, 0.272081f, 0.081322f, -0.212807f, -0.354516f, -0.275100f, -0.096863f, 0.061422f, 0.184431f, 0.290052f, 0.362546f, 0.382821f, 0.365049f, 0.332356f, 0.287833f, 0.227815f, 0.159321f, 0.089659f, 0.016005f, -0.063671f, -0.140956f, -0.205111f, -0.252511f, -0.284711f, -0.304370f, -0.315455f, -0.322285f, -0.326832f, -0.329503f, -0.331399f, -0.333108f, -0.333026f, -0.329471f, -0.322961f, -0.314750f, -0.305096f, -0.294458f, -0.284464f, -0.276331f, -0.269753f, -0.264070f, -0.259113f, -0.254491f, -0.249431f, -0.243603f, -0.237011f, -0.229139f, -0.219355f, -0.207972f, -0.195732f, -0.182410f, -0.167075f, -0.149600f, -0.130686f, -0.110376f, -0.087751f, -0.062438f, -0.035361f, -0.007458f, 0.021421f, 0.051426f, 0.081166f, 0.108532f, 0.132991f, 0.155787f, 0.177450f, 0.196472f, 0.211501f, 0.223729f, 0.235413f, 0.246432f, 0.254147f, 0.256866f, 0.255699f, 0.252400f, 0.246930f, 0.238183f, 0.226128f, 0.212153f,
+ 0.197762f, 0.183576f, 0.169356f, 0.154687f, 0.139838f, 0.125919f, 0.113952f, 0.104109f, 0.096147f, 0.089874f, 0.084624f, 0.079081f, 0.072485f, 0.065470f, 0.059088f, 0.053584f, 0.048459f, 0.042892f, 0.035834f, 0.026742f, 0.016583f, 0.007210f, -0.000460f, -0.006925f, -0.013101f, -0.019829f, -0.027937f, -0.037640f, -0.048171f, -0.058820f, -0.069767f, -0.081298f, -0.093098f, -0.104818f, -0.116218f, -0.126365f, -0.133907f, -0.138397f, -0.140204f, -0.139366f, -0.135883f, -0.130589f, -0.124266f, -0.116642f, -0.107629f, -0.098425f, -0.090176f, -0.083055f, -0.077635f, -0.075176f, -0.075705f, -0.078026f, -0.081969f, -0.088024f, -0.095261f, -0.102733f, -0.111115f, -0.118029f, -0.114164f, -0.091680f, -0.056373f, -0.024417f, -0.006512f, -0.000770f}
+ },
+ {
+ {-0.021647f, -0.023586f, 0.024030f, 0.034286f, -0.023210f, -0.048883f, 0.041004f, 0.162430f, 0.151420f, -0.019026f, -0.196878f, -0.228185f, -0.105491f, 0.063785f, 0.163457f, 0.131089f, -0.006547f, -0.126856f, -0.104754f, 0.046404f, 0.175190f, 0.165514f, 0.060007f, -0.021876f, -0.031457f, -0.005672f, 0.019840f, 0.046199f, 0.074668f, 0.089172f, 0.080103f, 0.054860f, 0.022313f, -0.014010f, -0.049302f, -0.079262f, -0.106213f, -0.133194f, -0.155736f, -0.166838f, -0.165427f, -0.154608f, -0.136822f, -0.115133f, -0.094431f, -0.077550f, -0.063253f, -0.049405f, -0.034984f, -0.018856f, -0.000016f, 0.020853f, 0.042649f, 0.066048f, 0.092202f, 0.120165f, 0.147513f, 0.172493f, 0.194076f, 0.210899f, 0.221573f, 0.225505f, 0.222686f, 0.213027f, 0.196166f, 0.171640f, 0.139274f, 0.099475f, 0.052952f, 0.000374f, -0.057162f, -0.117584f, -0.178302f, -0.236900f, -0.291078f, -0.338764f, -0.378809f, -0.410753f, -0.433773f, -0.447178f, -0.452109f, -0.450928f, -0.444375f, -0.431188f, -0.411190f, -0.386779f, -0.360327f, -0.331827f, -0.300282f, -0.265894f, -0.229528f, -0.191072f, -0.149793f, -0.105819f, -0.060219f, -0.013836f,
+ 0.033000f, 0.079560f, 0.124221f, 0.165296f, 0.202053f, 0.234481f, 0.261993f, 0.282718f, 0.294593f, 0.297426f, 0.293710f, 0.286928f, 0.278788f, 0.268248f, 0.253380f, 0.233961f, 0.212129f, 0.190864f, 0.172155f, 0.156250f, 0.142108f, 0.128607f, 0.115645f, 0.104097f, 0.094743f, 0.087526f, 0.081734f, 0.076398f, 0.070494f, 0.063326f, 0.054855f, 0.045303f, 0.034575f, 0.022541f, 0.009630f, -0.003393f, -0.015973f, -0.027652f, -0.037849f, -0.046228f, -0.052913f, -0.058025f, -0.061573f, -0.063948f, -0.065787f, -0.067201f, -0.067897f, -0.068076f, -0.068265f, -0.068365f, -0.067848f, -0.066716f, -0.065221f, -0.063029f, -0.059813f, -0.056114f, -0.052102f, -0.046012f, -0.035782f, -0.022435f, -0.010202f, -0.002684f, 0.000040f, 0.000220f},
+ {0.021647f, 0.023586f, -0.024030f, -0.034286f, 0.023210f, 0.048883f, -0.041004f, -0.162430f, -0.151420f, 0.019026f, 0.196878f, 0.228185f, 0.105491f, -0.063785f, -0.163457f, -0.131089f, 0.006547f, 0.126856f, 0.104754f, -0.046404f, -0.175190f, -0.165514f, -0.060007f, 0.021876f, 0.031457f, 0.005672f, -0.019840f, -0.046199f, -0.074668f, -0.089172f, -0.080103f, -0.054860f, -0.022313f, 0.014010f, 0.049302f, 0.079262f, 0.106213f, 0.133194f, 0.155736f, 0.166838f, 0.165427f, 0.154608f, 0.136822f, 0.115133f, 0.094431f, 0.077550f, 0.063253f, 0.049405f, 0.034984f, 0.018856f, 0.000016f, -0.020853f, -0.042649f, -0.066048f, -0.092202f, -0.120165f, -0.147513f, -0.172493f, -0.194076f, -0.210899f, -0.221573f, -0.225505f, -0.222686f, -0.213027f, -0.196166f, -0.171640f, -0.139274f, -0.099475f, -0.052952f, -0.000374f, 0.057162f, 0.117584f, 0.178302f, 0.236900f, 0.291078f, 0.338764f, 0.378809f, 0.410753f, 0.433773f, 0.447178f, 0.452109f, 0.450928f, 0.444375f, 0.431188f, 0.411190f, 0.386779f, 0.360327f, 0.331827f, 0.300282f, 0.265894f, 0.229528f, 0.191072f, 0.149793f, 0.105819f, 0.060219f, 0.013836f,
+ -0.033000f, -0.079560f, -0.124221f, -0.165296f, -0.202053f, -0.234481f, -0.261993f, -0.282718f, -0.294593f, -0.297426f, -0.293710f, -0.286928f, -0.278788f, -0.268248f, -0.253380f, -0.233961f, -0.212129f, -0.190864f, -0.172155f, -0.156250f, -0.142108f, -0.128607f, -0.115645f, -0.104097f, -0.094743f, -0.087526f, -0.081734f, -0.076398f, -0.070494f, -0.063326f, -0.054855f, -0.045303f, -0.034575f, -0.022541f, -0.009630f, 0.003393f, 0.015973f, 0.027652f, 0.037849f, 0.046228f, 0.052913f, 0.058025f, 0.061573f, 0.063948f, 0.065787f, 0.067201f, 0.067897f, 0.068076f, 0.068265f, 0.068365f, 0.067848f, 0.066716f, 0.065221f, 0.063029f, 0.059813f, 0.056114f, 0.052102f, 0.046012f, 0.035782f, 0.022435f, 0.010202f, 0.002684f, -0.000040f, -0.000220f}
+ },
+ {
+ {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f,
+ -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f},
+ {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f,
+ -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f}
+ },
+ {
+ {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f,
+ -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f},
+ {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f,
+ -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f}
+ },
+ {
+ {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f,
+ -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f},
+ {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f,
+ -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f}
+ },
+ {
+ {0.005047f, 0.021126f, 0.045009f, 0.070453f, 0.091218f, 0.079137f, -0.005705f, -0.148208f, -0.279248f, -0.366201f, -0.399292f, -0.268604f, 0.145211f, 0.646500f, 0.731126f, 0.172486f, -0.552664f, -0.733258f, -0.260523f, 0.299749f, 0.452278f, 0.272382f, 0.101891f, 0.059461f, 0.035030f, -0.031425f, -0.085084f, -0.094988f, -0.094701f, -0.101435f, -0.094303f, -0.066565f, -0.037269f, -0.017081f, -0.001454f, 0.010929f, 0.018070f, 0.023255f, 0.028455f, 0.029520f, 0.025899f, 0.023522f, 0.023990f, 0.022461f, 0.017906f, 0.014746f, 0.014269f, 0.013796f, 0.013307f, 0.015082f, 0.018457f, 0.020882f, 0.021919f, 0.021991f, 0.020056f, 0.015522f, 0.009547f, 0.002759f, -0.005372f, -0.014351f, -0.022889f, -0.031164f, -0.040159f, -0.049486f, -0.058237f, -0.066734f, -0.075464f, -0.083764f, -0.091121f, -0.098138f, -0.105200f, -0.111892f, -0.118289f, -0.125068f, -0.132105f, -0.138497f, -0.143784f, -0.147831f, -0.150121f, -0.150387f, -0.149069f, -0.146131f, -0.140481f, -0.131487f, -0.119994f, -0.107110f, -0.092969f, -0.077185f, -0.059714f, -0.041087f, -0.022428f, -0.005113f, 0.010051f, 0.022960f, 0.033330f, 0.040497f,
+ 0.044394f, 0.045809f, 0.045372f, 0.043155f, 0.039528f, 0.035586f, 0.032440f, 0.030494f, 0.029398f, 0.028485f, 0.027544f, 0.027340f, 0.028936f, 0.032511f, 0.037335f, 0.042789f, 0.048810f, 0.055598f, 0.063500f, 0.072809f, 0.083162f, 0.093560f, 0.103403f, 0.113024f, 0.123077f, 0.134014f, 0.146084f, 0.159017f, 0.171851f, 0.183812f, 0.195106f, 0.206245f, 0.217176f, 0.227589f, 0.237250f, 0.245546f, 0.251644f, 0.255500f, 0.257760f, 0.258677f, 0.258173f, 0.256605f, 0.254245f, 0.250550f, 0.245153f, 0.238801f, 0.232311f, 0.225757f, 0.219429f, 0.214026f, 0.209321f, 0.204392f, 0.199161f, 0.193782f, 0.187372f, 0.179378f, 0.169453f, 0.152758f, 0.120530f, 0.072470f, 0.024676f, -0.003666f, -0.009454f, -0.003869f},
+ {-0.005047f, -0.021126f, -0.045009f, -0.070453f, -0.091218f, -0.079137f, 0.005705f, 0.148208f, 0.279248f, 0.366201f, 0.399292f, 0.268604f, -0.145211f, -0.646500f, -0.731126f, -0.172486f, 0.552664f, 0.733258f, 0.260523f, -0.299749f, -0.452278f, -0.272382f, -0.101891f, -0.059461f, -0.035030f, 0.031425f, 0.085084f, 0.094988f, 0.094701f, 0.101435f, 0.094303f, 0.066565f, 0.037269f, 0.017081f, 0.001454f, -0.010929f, -0.018070f, -0.023255f, -0.028455f, -0.029520f, -0.025899f, -0.023522f, -0.023990f, -0.022461f, -0.017906f, -0.014746f, -0.014269f, -0.013796f, -0.013307f, -0.015082f, -0.018457f, -0.020882f, -0.021919f, -0.021991f, -0.020056f, -0.015522f, -0.009547f, -0.002759f, 0.005372f, 0.014351f, 0.022889f, 0.031164f, 0.040159f, 0.049486f, 0.058237f, 0.066734f, 0.075464f, 0.083764f, 0.091121f, 0.098138f, 0.105200f, 0.111892f, 0.118289f, 0.125068f, 0.132105f, 0.138497f, 0.143784f, 0.147831f, 0.150121f, 0.150387f, 0.149069f, 0.146131f, 0.140481f, 0.131487f, 0.119994f, 0.107110f, 0.092969f, 0.077185f, 0.059714f, 0.041087f, 0.022428f, 0.005113f, -0.010051f, -0.022960f, -0.033330f, -0.040497f,
+ -0.044394f, -0.045809f, -0.045372f, -0.043155f, -0.039528f, -0.035586f, -0.032440f, -0.030494f, -0.029398f, -0.028485f, -0.027544f, -0.027340f, -0.028936f, -0.032511f, -0.037335f, -0.042789f, -0.048810f, -0.055598f, -0.063500f, -0.072809f, -0.083162f, -0.093560f, -0.103403f, -0.113024f, -0.123077f, -0.134014f, -0.146084f, -0.159017f, -0.171851f, -0.183812f, -0.195106f, -0.206245f, -0.217176f, -0.227589f, -0.237250f, -0.245546f, -0.251644f, -0.255500f, -0.257760f, -0.258677f, -0.258173f, -0.256605f, -0.254245f, -0.250550f, -0.245153f, -0.238801f, -0.232311f, -0.225757f, -0.219429f, -0.214026f, -0.209321f, -0.204392f, -0.199161f, -0.193782f, -0.187372f, -0.179378f, -0.169453f, -0.152758f, -0.120530f, -0.072470f, -0.024676f, 0.003666f, 0.009454f, 0.003869f}
+ },
+ {
+ {0.003264f, 0.004318f, -0.005829f, -0.024893f, -0.041105f, -0.025902f, 0.043471f, 0.128408f, 0.134001f, 0.021030f, -0.114589f, -0.139872f, -0.049571f, 0.037102f, 0.041588f, 0.008422f, 0.005052f, 0.019837f, 0.006847f, -0.026552f, -0.037371f, -0.021147f, -0.012506f, -0.023997f, -0.030666f, -0.014881f, 0.008946f, 0.019948f, 0.015955f, 0.005594f, -0.007241f, -0.022512f, -0.037468f, -0.047732f, -0.050991f, -0.047280f, -0.038592f, -0.028517f, -0.019426f, -0.010194f, 0.001263f, 0.014159f, 0.025520f, 0.033481f, 0.038027f, 0.039692f, 0.039526f, 0.039623f, 0.042009f, 0.047181f, 0.054431f, 0.062973f, 0.072033f, 0.080590f, 0.087853f, 0.093716f, 0.098363f, 0.101802f, 0.104025f, 0.105212f, 0.105518f, 0.104869f, 0.103123f, 0.100365f, 0.097014f, 0.093624f, 0.090496f, 0.087654f, 0.085314f, 0.084000f, 0.083899f, 0.084586f, 0.085875f, 0.088367f, 0.092576f, 0.098106f, 0.104335f, 0.111281f, 0.119002f, 0.126690f, 0.133135f, 0.137682f, 0.140158f, 0.140242f, 0.137283f, 0.130334f, 0.118340f, 0.100873f, 0.078543f, 0.051954f, 0.020504f, -0.016782f, -0.059370f, -0.105077f, -0.151633f, -0.197526f,
+ -0.241483f, -0.281925f, -0.316997f, -0.344975f, -0.365154f, -0.378455f, -0.386389f, -0.389309f, -0.386608f, -0.378830f, -0.368544f, -0.358689f, -0.350553f, -0.343331f, -0.335103f, -0.324515f, -0.312129f, -0.299944f, -0.289316f, -0.279871f, -0.270574f, -0.260978f, -0.251183f, -0.241549f, -0.232707f, -0.224985f, -0.217706f, -0.209798f, -0.200910f, -0.191257f, -0.180862f, -0.169770f, -0.158385f, -0.146895f, -0.135062f, -0.123099f, -0.111787f, -0.101401f, -0.091527f, -0.082057f, -0.073151f, -0.064454f, -0.055670f, -0.047503f, -0.040626f, -0.034415f, -0.027978f, -0.021363f, -0.014489f, -0.006443f, 0.002867f, 0.012203f, 0.021232f, 0.031102f, 0.042272f, 0.054913f, 0.071608f, 0.094348f, 0.116599f, 0.123809f, 0.106728f, 0.072105f, 0.036517f, 0.010336f},
+ {-0.003264f, -0.004318f, 0.005829f, 0.024893f, 0.041105f, 0.025902f, -0.043471f, -0.128408f, -0.134001f, -0.021030f, 0.114589f, 0.139872f, 0.049571f, -0.037102f, -0.041588f, -0.008422f, -0.005052f, -0.019837f, -0.006847f, 0.026552f, 0.037371f, 0.021147f, 0.012506f, 0.023997f, 0.030666f, 0.014881f, -0.008946f, -0.019948f, -0.015955f, -0.005594f, 0.007241f, 0.022512f, 0.037468f, 0.047732f, 0.050991f, 0.047280f, 0.038592f, 0.028517f, 0.019426f, 0.010194f, -0.001263f, -0.014159f, -0.025520f, -0.033481f, -0.038027f, -0.039692f, -0.039526f, -0.039623f, -0.042009f, -0.047181f, -0.054431f, -0.062973f, -0.072033f, -0.080590f, -0.087853f, -0.093716f, -0.098363f, -0.101802f, -0.104025f, -0.105212f, -0.105518f, -0.104869f, -0.103123f, -0.100365f, -0.097014f, -0.093624f, -0.090496f, -0.087654f, -0.085314f, -0.084000f, -0.083899f, -0.084586f, -0.085875f, -0.088367f, -0.092576f, -0.098106f, -0.104335f, -0.111281f, -0.119002f, -0.126690f, -0.133135f, -0.137682f, -0.140158f, -0.140242f, -0.137283f, -0.130334f, -0.118340f, -0.100873f, -0.078543f, -0.051954f, -0.020504f, 0.016782f, 0.059370f, 0.105077f, 0.151633f, 0.197526f,
+ 0.241483f, 0.281925f, 0.316997f, 0.344975f, 0.365154f, 0.378455f, 0.386389f, 0.389309f, 0.386608f, 0.378830f, 0.368544f, 0.358689f, 0.350553f, 0.343331f, 0.335103f, 0.324515f, 0.312129f, 0.299944f, 0.289316f, 0.279871f, 0.270574f, 0.260978f, 0.251183f, 0.241549f, 0.232707f, 0.224985f, 0.217706f, 0.209798f, 0.200910f, 0.191257f, 0.180862f, 0.169770f, 0.158385f, 0.146895f, 0.135062f, 0.123099f, 0.111787f, 0.101401f, 0.091527f, 0.082057f, 0.073151f, 0.064454f, 0.055670f, 0.047503f, 0.040626f, 0.034415f, 0.027978f, 0.021363f, 0.014489f, 0.006443f, -0.002867f, -0.012203f, -0.021232f, -0.031102f, -0.042272f, -0.054913f, -0.071608f, -0.094348f, -0.116599f, -0.123809f, -0.106728f, -0.072105f, -0.036517f, -0.010336f}
+ },
+ {
+ {0.011217f, 0.032990f, 0.036897f, 0.010621f, -0.001993f, 0.049544f, 0.112830f, 0.056133f, -0.160339f, -0.385630f, -0.392350f, -0.095349f, 0.328404f, 0.542847f, 0.344208f, -0.105590f, -0.399358f, -0.300598f, 0.018016f, 0.214090f, 0.169827f, 0.038946f, -0.027942f, -0.041781f, -0.059684f, -0.065038f, -0.024287f, 0.032375f, 0.055196f, 0.048115f, 0.048570f, 0.069300f, 0.097432f, 0.125436f, 0.152243f, 0.169511f, 0.168791f, 0.153482f, 0.132068f, 0.107982f, 0.082397f, 0.058065f, 0.035645f, 0.012912f, -0.010363f, -0.032150f, -0.052509f, -0.073090f, -0.093478f, -0.112421f, -0.130887f, -0.150015f, -0.167940f, -0.181658f, -0.190093f, -0.193280f, -0.190900f, -0.183505f, -0.172998f, -0.160425f, -0.144966f, -0.125766f, -0.102989f, -0.076649f, -0.046121f, -0.011292f, 0.026894f, 0.067039f, 0.107592f, 0.146900f, 0.183708f, 0.217201f, 0.246116f, 0.268588f, 0.283453f, 0.290932f, 0.291460f, 0.284592f, 0.269758f, 0.247580f, 0.219717f, 0.187538f, 0.151436f, 0.111504f, 0.068474f, 0.023637f, -0.022098f, -0.068620f, -0.115935f, -0.163543f, -0.210736f, -0.256901f, -0.300916f, -0.340700f, -0.374071f, -0.399767f,
+ -0.417035f, -0.424614f, -0.421054f, -0.406173f, -0.381691f, -0.350278f, -0.314081f, -0.274012f, -0.230338f, -0.184210f, -0.138589f, -0.097123f, -0.061885f, -0.032563f, -0.007863f, 0.012882f, 0.029569f, 0.041935f, 0.049803f, 0.053141f, 0.052307f, 0.048088f, 0.041442f, 0.033372f, 0.024841f, 0.016293f, 0.007207f, -0.003502f, -0.016548f, -0.031791f, -0.048410f, -0.065287f, -0.081508f, -0.096823f, -0.111564f, -0.125991f, -0.139856f, -0.152551f, -0.163405f, -0.171901f, -0.177907f, -0.181647f, -0.183211f, -0.182296f, -0.178654f, -0.172490f, -0.164191f, -0.154059f, -0.142478f, -0.129944f, -0.116760f, -0.103091f, -0.089272f, -0.075716f, -0.062663f, -0.050022f, -0.036539f, -0.019395f, 0.002713f, 0.024763f, 0.036870f, 0.033747f, 0.020633f, 0.006443f},
+ {-0.011217f, -0.032990f, -0.036897f, -0.010621f, 0.001993f, -0.049544f, -0.112830f, -0.056133f, 0.160339f, 0.385630f, 0.392350f, 0.095349f, -0.328404f, -0.542847f, -0.344208f, 0.105590f, 0.399358f, 0.300598f, -0.018016f, -0.214090f, -0.169827f, -0.038946f, 0.027942f, 0.041781f, 0.059684f, 0.065038f, 0.024287f, -0.032375f, -0.055196f, -0.048115f, -0.048570f, -0.069300f, -0.097432f, -0.125436f, -0.152243f, -0.169511f, -0.168791f, -0.153482f, -0.132068f, -0.107982f, -0.082397f, -0.058065f, -0.035645f, -0.012912f, 0.010363f, 0.032150f, 0.052509f, 0.073090f, 0.093478f, 0.112421f, 0.130887f, 0.150015f, 0.167940f, 0.181658f, 0.190093f, 0.193280f, 0.190900f, 0.183505f, 0.172998f, 0.160425f, 0.144966f, 0.125766f, 0.102989f, 0.076649f, 0.046121f, 0.011292f, -0.026894f, -0.067039f, -0.107592f, -0.146900f, -0.183708f, -0.217201f, -0.246116f, -0.268588f, -0.283453f, -0.290932f, -0.291460f, -0.284592f, -0.269758f, -0.247580f, -0.219717f, -0.187538f, -0.151436f, -0.111504f, -0.068474f, -0.023637f, 0.022098f, 0.068620f, 0.115935f, 0.163543f, 0.210736f, 0.256901f, 0.300916f, 0.340700f, 0.374071f, 0.399767f,
+ 0.417035f, 0.424614f, 0.421054f, 0.406173f, 0.381691f, 0.350278f, 0.314081f, 0.274012f, 0.230338f, 0.184210f, 0.138589f, 0.097123f, 0.061885f, 0.032563f, 0.007863f, -0.012882f, -0.029569f, -0.041935f, -0.049803f, -0.053141f, -0.052307f, -0.048088f, -0.041442f, -0.033372f, -0.024841f, -0.016293f, -0.007207f, 0.003502f, 0.016548f, 0.031791f, 0.048410f, 0.065287f, 0.081508f, 0.096823f, 0.111564f, 0.125991f, 0.139856f, 0.152551f, 0.163405f, 0.171901f, 0.177907f, 0.181647f, 0.183211f, 0.182296f, 0.178654f, 0.172490f, 0.164191f, 0.154059f, 0.142478f, 0.129944f, 0.116760f, 0.103091f, 0.089272f, 0.075716f, 0.062663f, 0.050022f, 0.036539f, 0.019395f, -0.002713f, -0.024763f, -0.036870f, -0.033747f, -0.020633f, -0.006443f}
+ },
+ {
+ {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f,
+ -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f},
+ {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f,
+ -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f}
+ },
+ {
+ {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f,
+ 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f},
+ {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f,
+ 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f}
+ },
+ {
+ {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f,
+ -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f},
+ {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f,
+ -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f}
+ },
+ {
+ {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f,
+ 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f},
+ {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f,
+ 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f}
+ }
+};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL};
+
+/* Sample Rate = 16000 */
+
+const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1;
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} };
+const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0};
+const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}};
+const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0;
+const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f};
+const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]={
+ {
+ { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f},
+ { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f}
+ },
+ {
+ { -0.027320f, 0.203042f, 0.560441f, 0.855080f, 0.913923f, 0.695595f, 0.275320f, -0.242317f, -0.734864f, -1.060751f, -1.161327f, -1.101927f, -0.890150f, -0.379506f, 0.403667f, 0.941418f, 0.637872f, -0.349883f, -1.070253f, -0.802884f, 0.138395f, 0.872965f, 0.973380f, 0.700130f, 0.411920f, 0.163851f, -0.106361f, -0.348889f, -0.492759f, -0.572846f, -0.652509f, -0.726343f, -0.765973f, -0.782601f, -0.797805f, -0.807837f, -0.804710f, -0.793867f, -0.778506f, -0.754424f, -0.722406f, -0.686425f, -0.645124f, -0.597900f, -0.549560f, -0.501709f, -0.451184f, -0.399036f, -0.349319f, -0.301514f, -0.254382f, -0.210559f, -0.169586f, -0.126625f, -0.082489f, -0.042121f, -0.003063f, 0.039580f, 0.081194f, 0.116558f, 0.151377f, 0.189529f, 0.223338f, 0.250399f, 0.280134f, 0.312833f, 0.337748f, 0.358162f, 0.386893f, 0.417232f, 0.436207f, 0.457643f, 0.496886f, 0.534086f, 0.559077f, 0.615495f, 0.720955f, 0.788091f, 0.733920f, 0.633048f},
+ { 0.027320f, -0.203042f, -0.560441f, -0.855080f, -0.913923f, -0.695595f, -0.275320f, 0.242317f, 0.734864f, 1.060751f, 1.161327f, 1.101927f, 0.890150f, 0.379506f, -0.403667f, -0.941418f, -0.637872f, 0.349883f, 1.070253f, 0.802884f, -0.138395f, -0.872965f, -0.973380f, -0.700130f, -0.411920f, -0.163851f, 0.106361f, 0.348889f, 0.492759f, 0.572846f, 0.652509f, 0.726343f, 0.765973f, 0.782601f, 0.797805f, 0.807837f, 0.804710f, 0.793867f, 0.778506f, 0.754424f, 0.722406f, 0.686425f, 0.645124f, 0.597900f, 0.549560f, 0.501709f, 0.451184f, 0.399036f, 0.349319f, 0.301514f, 0.254382f, 0.210559f, 0.169586f, 0.126625f, 0.082489f, 0.042121f, 0.003063f, -0.039580f, -0.081194f, -0.116558f, -0.151377f, -0.189529f, -0.223338f, -0.250399f, -0.280134f, -0.312833f, -0.337748f, -0.358162f, -0.386893f, -0.417232f, -0.436207f, -0.457643f, -0.496886f, -0.534086f, -0.559077f, -0.615495f, -0.720955f, -0.788091f, -0.733920f, -0.633048f}
+ },
+ {
+ { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f},
+ { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f}
+ },
+ {
+ { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f},
+ { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f}
+ },
+ {
+ { 0.011552f, 0.000565f, -0.003312f, 0.012114f, 0.034643f, 0.042894f, 0.038718f, 0.047434f, 0.078185f, 0.098700f, 0.060730f, -0.052718f, -0.197397f, -0.271665f, -0.179838f, 0.052824f, 0.238687f, 0.183493f, -0.084160f, -0.306954f, -0.270000f, -0.022547f, 0.219181f, 0.324412f, 0.323963f, 0.283599f, 0.211949f, 0.102569f, -0.017904f, -0.119553f, -0.202749f, -0.277404f, -0.338929f, -0.381318f, -0.410145f, -0.429239f, -0.431485f, -0.411399f, -0.374227f, -0.328491f, -0.279921f, -0.233766f, -0.193863f, -0.159140f, -0.127047f, -0.098014f, -0.072129f, -0.046232f, -0.018734f, 0.007677f, 0.031175f, 0.053092f, 0.073299f, 0.089460f, 0.102015f, 0.113996f, 0.125945f, 0.136708f, 0.147823f, 0.161322f, 0.175607f, 0.188937f, 0.203404f, 0.220320f, 0.236539f, 0.250298f, 0.264790f, 0.281291f, 0.295883f, 0.307388f, 0.320088f, 0.334110f, 0.343177f, 0.346983f, 0.353477f, 0.359929f, 0.343271f, 0.284042f, 0.198067f, 0.133818f},
+ { -0.011552f, -0.000565f, 0.003312f, -0.012114f, -0.034643f, -0.042894f, -0.038718f, -0.047434f, -0.078185f, -0.098700f, -0.060730f, 0.052718f, 0.197397f, 0.271665f, 0.179838f, -0.052824f, -0.238687f, -0.183493f, 0.084160f, 0.306954f, 0.270000f, 0.022547f, -0.219181f, -0.324412f, -0.323963f, -0.283599f, -0.211949f, -0.102569f, 0.017904f, 0.119553f, 0.202749f, 0.277404f, 0.338929f, 0.381318f, 0.410145f, 0.429239f, 0.431485f, 0.411399f, 0.374227f, 0.328491f, 0.279921f, 0.233766f, 0.193863f, 0.159140f, 0.127047f, 0.098014f, 0.072129f, 0.046232f, 0.018734f, -0.007677f, -0.031175f, -0.053092f, -0.073299f, -0.089460f, -0.102015f, -0.113996f, -0.125945f, -0.136708f, -0.147823f, -0.161322f, -0.175607f, -0.188937f, -0.203404f, -0.220320f, -0.236539f, -0.250298f, -0.264790f, -0.281291f, -0.295883f, -0.307388f, -0.320088f, -0.334110f, -0.343177f, -0.346983f, -0.353477f, -0.359929f, -0.343271f, -0.284042f, -0.198067f, -0.133818f}
+ },
+ {
+ { 0.051162f, 0.004630f, -0.001227f, 0.050366f, 0.063139f, -0.012808f, -0.073989f, 0.003079f, 0.174556f, 0.264299f, 0.172675f, -0.020436f, -0.159153f, -0.156052f, -0.032841f, 0.113831f, 0.167176f, 0.075277f, -0.079544f, -0.141124f, -0.047299f, 0.099392f, 0.161108f, 0.119504f, 0.056727f, 0.028236f, 0.022203f, 0.022582f, 0.040897f, 0.080790f, 0.122332f, 0.151311f, 0.170587f, 0.180438f, 0.176020f, 0.162553f, 0.148761f, 0.129984f, 0.097918f, 0.058507f, 0.022731f, -0.008873f, -0.037674f, -0.057264f, -0.065527f, -0.071491f, -0.080334f, -0.087226f, -0.091495f, -0.098993f, -0.107772f, -0.110111f, -0.108138f, -0.108645f, -0.106898f, -0.094525f, -0.075444f, -0.055728f, -0.029601f, 0.007217f, 0.045808f, 0.081023f, 0.120922f, 0.166769f, 0.206984f, 0.240262f, 0.277196f, 0.313665f, 0.334528f, 0.343916f, 0.355052f, 0.356025f, 0.328945f, 0.289951f, 0.257626f, 0.201059f, 0.086037f, -0.044980f, -0.115572f, -0.123491f},
+ { -0.051162f, -0.004630f, 0.001227f, -0.050366f, -0.063139f, 0.012808f, 0.073989f, -0.003079f, -0.174556f, -0.264299f, -0.172675f, 0.020436f, 0.159153f, 0.156052f, 0.032841f, -0.113831f, -0.167176f, -0.075277f, 0.079544f, 0.141124f, 0.047299f, -0.099392f, -0.161108f, -0.119504f, -0.056727f, -0.028236f, -0.022203f, -0.022582f, -0.040897f, -0.080790f, -0.122332f, -0.151311f, -0.170587f, -0.180438f, -0.176020f, -0.162553f, -0.148761f, -0.129984f, -0.097918f, -0.058507f, -0.022731f, 0.008873f, 0.037674f, 0.057264f, 0.065527f, 0.071491f, 0.080334f, 0.087226f, 0.091495f, 0.098993f, 0.107772f, 0.110111f, 0.108138f, 0.108645f, 0.106898f, 0.094525f, 0.075444f, 0.055728f, 0.029601f, -0.007217f, -0.045808f, -0.081023f, -0.120922f, -0.166769f, -0.206984f, -0.240262f, -0.277196f, -0.313665f, -0.334528f, -0.343916f, -0.355052f, -0.356025f, -0.328945f, -0.289951f, -0.257626f, -0.201059f, -0.086037f, 0.044980f, 0.115572f, 0.123491f}
+ },
+ {
+ { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f},
+ { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f}
+ },
+ {
+ { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f},
+ { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f}
+ },
+ {
+ { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f},
+ { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f}
+ },
+ {
+ { -0.006941f, -0.009137f, -0.001025f, 0.023181f, 0.071280f, 0.152288f, 0.232381f, 0.241767f, 0.159918f, 0.019441f, -0.191250f, -0.477987f, -0.641445f, -0.366185f, 0.303140f, 0.785583f, 0.561935f, -0.151779f, -0.630912f, -0.503217f, -0.082209f, 0.167454f, 0.171480f, 0.133590f, 0.151479f, 0.158082f, 0.114516f, 0.066176f, 0.040238f, 0.013478f, -0.024102f, -0.051025f, -0.056634f, -0.052834f, -0.047949f, -0.040161f, -0.030751f, -0.023050f, -0.014898f, -0.004699f, 0.003065f, 0.006126f, 0.009138f, 0.014713f, 0.018779f, 0.018792f, 0.018156f, 0.019353f, 0.020281f, 0.020049f, 0.021722f, 0.026967f, 0.033551f, 0.039947f, 0.047332f, 0.055643f, 0.062465f, 0.067092f, 0.071222f, 0.074871f, 0.076231f, 0.075857f, 0.075991f, 0.075860f, 0.073017f, 0.068571f, 0.065118f, 0.061079f, 0.053861f, 0.045973f, 0.040311f, 0.033378f, 0.022033f, 0.010850f, 0.001847f, -0.014432f, -0.042350f, -0.064916f, -0.064261f, -0.051262f},
+ { 0.006941f, 0.009137f, 0.001025f, -0.023181f, -0.071280f, -0.152288f, -0.232381f, -0.241767f, -0.159918f, -0.019441f, 0.191250f, 0.477987f, 0.641445f, 0.366185f, -0.303140f, -0.785583f, -0.561935f, 0.151779f, 0.630912f, 0.503217f, 0.082209f, -0.167454f, -0.171480f, -0.133590f, -0.151479f, -0.158082f, -0.114516f, -0.066176f, -0.040238f, -0.013478f, 0.024102f, 0.051025f, 0.056634f, 0.052834f, 0.047949f, 0.040161f, 0.030751f, 0.023050f, 0.014898f, 0.004699f, -0.003065f, -0.006126f, -0.009138f, -0.014713f, -0.018779f, -0.018792f, -0.018156f, -0.019353f, -0.020281f, -0.020049f, -0.021722f, -0.026967f, -0.033551f, -0.039947f, -0.047332f, -0.055643f, -0.062465f, -0.067092f, -0.071222f, -0.074871f, -0.076231f, -0.075857f, -0.075991f, -0.075860f, -0.073017f, -0.068571f, -0.065118f, -0.061079f, -0.053861f, -0.045973f, -0.040311f, -0.033378f, -0.022033f, -0.010850f, -0.001847f, 0.014432f, 0.042350f, 0.064916f, 0.064261f, 0.051262f}
+ },
+ {
+ { -0.009108f, -0.000638f, 0.006579f, 0.001811f, -0.025320f, -0.072975f, -0.099878f, -0.046177f, 0.078173f, 0.161617f, 0.109552f, -0.025830f, -0.103052f, -0.069323f, -0.005915f, 0.007950f, -0.006548f, 0.003625f, 0.029014f, 0.026490f, -0.001964f, -0.017075f, -0.008856f, -0.005898f, -0.023342f, -0.040994f, -0.037654f, -0.018706f, -0.001195f, 0.008790f, 0.013986f, 0.014099f, 0.006255f, -0.008494f, -0.025735f, -0.041885f, -0.054703f, -0.062996f, -0.068182f, -0.073039f, -0.077308f, -0.077697f, -0.073146f, -0.066479f, -0.060233f, -0.054842f, -0.051364f, -0.051522f, -0.054305f, -0.056526f, -0.056981f, -0.056335f, -0.053803f, -0.048110f, -0.040567f, -0.033134f, -0.025166f, -0.015716f, -0.006373f, 0.001714f, 0.010176f, 0.019674f, 0.028014f, 0.034461f, 0.040938f, 0.047298f, 0.051293f, 0.053861f, 0.057721f, 0.061503f, 0.062963f, 0.065308f, 0.071389f, 0.076861f, 0.080196f, 0.090996f, 0.112659f, 0.126656f, 0.115757f, 0.095245f},
+ { 0.009108f, 0.000638f, -0.006579f, -0.001811f, 0.025320f, 0.072975f, 0.099878f, 0.046177f, -0.078173f, -0.161617f, -0.109552f, 0.025830f, 0.103052f, 0.069323f, 0.005915f, -0.007950f, 0.006548f, -0.003625f, -0.029014f, -0.026490f, 0.001964f, 0.017075f, 0.008856f, 0.005898f, 0.023342f, 0.040994f, 0.037654f, 0.018706f, 0.001195f, -0.008790f, -0.013986f, -0.014099f, -0.006255f, 0.008494f, 0.025735f, 0.041885f, 0.054703f, 0.062996f, 0.068182f, 0.073039f, 0.077308f, 0.077697f, 0.073146f, 0.066479f, 0.060233f, 0.054842f, 0.051364f, 0.051522f, 0.054305f, 0.056526f, 0.056981f, 0.056335f, 0.053803f, 0.048110f, 0.040567f, 0.033134f, 0.025166f, 0.015716f, 0.006373f, -0.001714f, -0.010176f, -0.019674f, -0.028014f, -0.034461f, -0.040938f, -0.047298f, -0.051293f, -0.053861f, -0.057721f, -0.061503f, -0.062963f, -0.065308f, -0.071389f, -0.076861f, -0.080196f, -0.090996f, -0.112659f, -0.126656f, -0.115757f, -0.095245f}
+ },
+ {
+ { -0.036299f, -0.021576f, 0.008339f, 0.022024f, -0.006026f, -0.023441f, 0.054545f, 0.203109f, 0.258935f, 0.083497f, -0.260111f, -0.516144f, -0.440053f, -0.037701f, 0.381792f, 0.458565f, 0.145761f, -0.228806f, -0.323180f, -0.139235f, 0.059116f, 0.103770f, 0.056741f, 0.022598f, -0.002741f, -0.054614f, -0.101353f, -0.098354f, -0.066298f, -0.053021f, -0.063515f, -0.072217f, -0.068674f, -0.055829f, -0.030066f, 0.010072f, 0.053291f, 0.089027f, 0.117100f, 0.138411f, 0.151225f, 0.158410f, 0.164831f, 0.168991f, 0.167807f, 0.164211f, 0.160954f, 0.154801f, 0.144154f, 0.132890f, 0.121469f, 0.104824f, 0.081993f, 0.056942f, 0.029818f, -0.001262f, -0.032295f, -0.058604f, -0.083127f, -0.109320f, -0.133549f, -0.153530f, -0.173701f, -0.194504f, -0.209278f, -0.217046f, -0.222920f, -0.223700f, -0.211596f, -0.190929f, -0.169788f, -0.141148f, -0.097122f, -0.049726f, -0.007241f, 0.050044f, 0.129214f, 0.183903f, 0.170356f, 0.125994f},
+ { 0.036299f, 0.021576f, -0.008339f, -0.022024f, 0.006026f, 0.023441f, -0.054545f, -0.203109f, -0.258935f, -0.083497f, 0.260111f, 0.516144f, 0.440053f, 0.037701f, -0.381792f, -0.458565f, -0.145761f, 0.228806f, 0.323180f, 0.139235f, -0.059116f, -0.103770f, -0.056741f, -0.022598f, 0.002741f, 0.054614f, 0.101353f, 0.098354f, 0.066298f, 0.053021f, 0.063515f, 0.072217f, 0.068674f, 0.055829f, 0.030066f, -0.010072f, -0.053291f, -0.089027f, -0.117100f, -0.138411f, -0.151225f, -0.158410f, -0.164831f, -0.168991f, -0.167807f, -0.164211f, -0.160954f, -0.154801f, -0.144154f, -0.132890f, -0.121469f, -0.104824f, -0.081993f, -0.056942f, -0.029818f, 0.001262f, 0.032295f, 0.058604f, 0.083127f, 0.109320f, 0.133549f, 0.153530f, 0.173701f, 0.194504f, 0.209278f, 0.217046f, 0.222920f, 0.223700f, 0.211596f, 0.190929f, 0.169788f, 0.141148f, 0.097122f, 0.049726f, 0.007241f, -0.050044f, -0.129214f, -0.183903f, -0.170356f, -0.125994f}
+ },
+ {
+ { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f},
+ { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f}
+ },
+ {
+ { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f},
+ { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f}
+ },
+ {
+ { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f},
+ { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f}
+ },
+ {
+ { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f},
+ { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f}
+ }
+};
+const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={
+ {
+ { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f},
+ { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f}
+ },
+ {
+ { 0.139379f, 0.334475f, 0.302418f, -0.001740f, -0.470657f, -0.918060f, -1.205378f, -1.264950f, -1.068335f, -0.667808f, -0.206855f, 0.225808f, 0.664665f, 1.029106f, 0.958676f, 0.223895f, -0.711948f, -0.958987f, -0.218731f, 0.776762f, 1.088344f, 0.584741f, -0.131994f, -0.574116f, -0.760032f, -0.866210f, -0.902940f, -0.825573f, -0.695964f, -0.595691f, -0.515122f, -0.414746f, -0.305467f, -0.213289f, -0.131852f, -0.047320f, 0.035561f, 0.111395f, 0.184753f, 0.256163f, 0.320948f, 0.379770f, 0.434479f, 0.481617f, 0.520017f, 0.553844f, 0.583536f, 0.605648f, 0.621334f, 0.633823f, 0.642170f, 0.646572f, 0.651242f, 0.655765f, 0.655221f, 0.651172f, 0.648535f, 0.643768f, 0.631801f, 0.617925f, 0.606967f, 0.592474f, 0.571477f, 0.552782f, 0.538082f, 0.517509f, 0.492647f, 0.475480f, 0.461290f, 0.437183f, 0.413126f, 0.403158f, 0.390400f, 0.360546f, 0.340803f, 0.339290f, 0.288776f, 0.145051f, -0.000376f, -0.026236f},
+ { -0.139379f, -0.334475f, -0.302418f, 0.001740f, 0.470657f, 0.918060f, 1.205378f, 1.264950f, 1.068335f, 0.667808f, 0.206855f, -0.225808f, -0.664665f, -1.029106f, -0.958676f, -0.223895f, 0.711948f, 0.958987f, 0.218731f, -0.776762f, -1.088344f, -0.584741f, 0.131994f, 0.574116f, 0.760032f, 0.866210f, 0.902940f, 0.825573f, 0.695964f, 0.595691f, 0.515122f, 0.414746f, 0.305467f, 0.213289f, 0.131852f, 0.047320f, -0.035561f, -0.111395f, -0.184753f, -0.256163f, -0.320948f, -0.379770f, -0.434479f, -0.481617f, -0.520017f, -0.553844f, -0.583536f, -0.605648f, -0.621334f, -0.633823f, -0.642170f, -0.646572f, -0.651242f, -0.655765f, -0.655221f, -0.651172f, -0.648535f, -0.643768f, -0.631801f, -0.617925f, -0.606967f, -0.592474f, -0.571477f, -0.552782f, -0.538082f, -0.517509f, -0.492647f, -0.475480f, -0.461290f, -0.437183f, -0.413126f, -0.403158f, -0.390400f, -0.360546f, -0.340803f, -0.339290f, -0.288776f, -0.145051f, 0.000376f, 0.026236f}
+ },
+ {
+ { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f},
+ { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f}
+ },
+ {
+ { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f},
+ { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f}
+ },
+ {
+ { -0.004434f, -0.004101f, 0.011236f, 0.025203f, 0.019806f, 0.001597f, -0.006647f, -0.003102f, -0.018186f, -0.077431f, -0.161881f, -0.209978f, -0.155425f, 0.015003f, 0.208989f, 0.259800f, 0.084031f, -0.179896f, -0.269483f, -0.079015f, 0.215424f, 0.357678f, 0.278152f, 0.099699f, -0.058114f, -0.180673f, -0.286537f, -0.359113f, -0.378791f, -0.360714f, -0.328350f, -0.283730f, -0.223043f, -0.154424f, -0.085113f, -0.011153f, 0.069195f, 0.146411f, 0.210268f, 0.258185f, 0.290989f, 0.310397f, 0.321311f, 0.328850f, 0.333862f, 0.336132f, 0.338054f, 0.340622f, 0.340800f, 0.336748f, 0.330523f, 0.323257f, 0.313600f, 0.302440f, 0.293034f, 0.285845f, 0.278952f, 0.272797f, 0.268758f, 0.264967f, 0.259214f, 0.253039f, 0.247703f, 0.240380f, 0.229389f, 0.217820f, 0.207144f, 0.193744f, 0.176271f, 0.158660f, 0.141444f, 0.119286f, 0.091743f, 0.065323f, 0.038472f, -0.002614f, -0.061009f, -0.109488f, -0.108302f, -0.045399f},
+ { 0.004434f, 0.004101f, -0.011236f, -0.025203f, -0.019806f, -0.001597f, 0.006647f, 0.003102f, 0.018186f, 0.077431f, 0.161881f, 0.209978f, 0.155425f, -0.015003f, -0.208989f, -0.259800f, -0.084031f, 0.179896f, 0.269483f, 0.079015f, -0.215424f, -0.357678f, -0.278152f, -0.099699f, 0.058114f, 0.180673f, 0.286537f, 0.359113f, 0.378791f, 0.360714f, 0.328350f, 0.283730f, 0.223043f, 0.154424f, 0.085113f, 0.011153f, -0.069195f, -0.146411f, -0.210268f, -0.258185f, -0.290989f, -0.310397f, -0.321311f, -0.328850f, -0.333862f, -0.336132f, -0.338054f, -0.340622f, -0.340800f, -0.336748f, -0.330523f, -0.323257f, -0.313600f, -0.302440f, -0.293034f, -0.285845f, -0.278952f, -0.272797f, -0.268758f, -0.264967f, -0.259214f, -0.253039f, -0.247703f, -0.240380f, -0.229389f, -0.217820f, -0.207144f, -0.193744f, -0.176271f, -0.158660f, -0.141444f, -0.119286f, -0.091743f, -0.065323f, -0.038472f, 0.002614f, 0.061009f, 0.109488f, 0.108302f, 0.045399f}
+ },
+ {
+ { -0.022223f, -0.023532f, 0.026143f, 0.036395f, -0.022129f, -0.046557f, 0.045156f, 0.166015f, 0.154331f, -0.014356f, -0.190818f, -0.223106f, -0.100545f, 0.070829f, 0.171310f, 0.137761f, 0.000653f, -0.117443f, -0.095181f, 0.054848f, 0.184857f, 0.177260f, 0.071288f, -0.011410f, -0.019128f, 0.008364f, 0.032900f, 0.058999f, 0.089829f, 0.105464f, 0.095113f, 0.070357f, 0.040449f, 0.004549f, -0.032060f, -0.060672f, -0.084976f, -0.112282f, -0.135857f, -0.144728f, -0.140958f, -0.131144f, -0.113768f, -0.089047f, -0.066562f, -0.051180f, -0.036343f, -0.018844f, -0.003461f, 0.010980f, 0.031603f, 0.056462f, 0.078228f, 0.100182f, 0.129600f, 0.161531f, 0.187796f, 0.212133f, 0.238638f, 0.258971f, 0.267587f, 0.272407f, 0.276295f, 0.269169f, 0.249535f, 0.228442f, 0.204681f, 0.165734f, 0.116242f, 0.071322f, 0.024434f, -0.038282f, -0.101208f, -0.144017f, -0.186203f, -0.247657f, -0.284781f, -0.238696f, -0.131685f, -0.036438f},
+ { 0.022223f, 0.023532f, -0.026143f, -0.036395f, 0.022129f, 0.046557f, -0.045156f, -0.166015f, -0.154331f, 0.014356f, 0.190818f, 0.223106f, 0.100545f, -0.070829f, -0.171310f, -0.137761f, -0.000653f, 0.117443f, 0.095181f, -0.054848f, -0.184857f, -0.177260f, -0.071288f, 0.011410f, 0.019128f, -0.008364f, -0.032900f, -0.058999f, -0.089829f, -0.105464f, -0.095113f, -0.070357f, -0.040449f, -0.004549f, 0.032060f, 0.060672f, 0.084976f, 0.112282f, 0.135857f, 0.144728f, 0.140958f, 0.131144f, 0.113768f, 0.089047f, 0.066562f, 0.051180f, 0.036343f, 0.018844f, 0.003461f, -0.010980f, -0.031603f, -0.056462f, -0.078228f, -0.100182f, -0.129600f, -0.161531f, -0.187796f, -0.212133f, -0.238638f, -0.258971f, -0.267587f, -0.272407f, -0.276295f, -0.269169f, -0.249535f, -0.228442f, -0.204681f, -0.165734f, -0.116242f, -0.071322f, -0.024434f, 0.038282f, 0.101208f, 0.144017f, 0.186203f, 0.247657f, 0.284781f, 0.238696f, 0.131685f, 0.036438f}
+ },
+ {
+ { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f},
+ { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f}
+ },
+ {
+ { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f},
+ { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f}
+ },
+ {
+ { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f},
+ { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f}
+ },
+ {
+ { 0.004986f, 0.021455f, 0.046135f, 0.071785f, 0.092466f, 0.080954f, -0.003158f, -0.145617f, -0.276633f, -0.362866f, -0.395355f, -0.264738f, 0.149265f, 0.651373f, 0.736434f, 0.177675f, -0.547090f, -0.726833f, -0.253845f, 0.306337f, 0.459460f, 0.280374f, 0.109965f, 0.067554f, 0.043904f, -0.021849f, -0.075554f, -0.085260f, -0.084048f, -0.090241f, -0.083218f, -0.055049f, -0.024749f, -0.004212f, 0.011330f, 0.024407f, 0.032551f, 0.037896f, 0.043132f, 0.045153f, 0.042454f, 0.040083f, 0.040807f, 0.040467f, 0.036682f, 0.033444f, 0.033537f, 0.034430f, 0.034508f, 0.036228f, 0.040565f, 0.044452f, 0.045834f, 0.046017f, 0.045496f, 0.042430f, 0.036603f, 0.030268f, 0.024047f, 0.016450f, 0.007946f, 0.000698f, -0.005855f, -0.013972f, -0.022632f, -0.029204f, -0.034902f, -0.042227f, -0.049092f, -0.052708f, -0.056008f, -0.061987f, -0.066609f, -0.066985f, -0.069150f, -0.074874f, -0.070084f, -0.044292f, -0.013242f, -0.000130f},
+ { -0.004986f, -0.021455f, -0.046135f, -0.071785f, -0.092466f, -0.080954f, 0.003158f, 0.145617f, 0.276633f, 0.362866f, 0.395355f, 0.264738f, -0.149265f, -0.651373f, -0.736434f, -0.177675f, 0.547090f, 0.726833f, 0.253845f, -0.306337f, -0.459460f, -0.280374f, -0.109965f, -0.067554f, -0.043904f, 0.021849f, 0.075554f, 0.085260f, 0.084048f, 0.090241f, 0.083218f, 0.055049f, 0.024749f, 0.004212f, -0.011330f, -0.024407f, -0.032551f, -0.037896f, -0.043132f, -0.045153f, -0.042454f, -0.040083f, -0.040807f, -0.040467f, -0.036682f, -0.033444f, -0.033537f, -0.034430f, -0.034508f, -0.036228f, -0.040565f, -0.044452f, -0.045834f, -0.046017f, -0.045496f, -0.042430f, -0.036603f, -0.030268f, -0.024047f, -0.016450f, -0.007946f, -0.000698f, 0.005855f, 0.013972f, 0.022632f, 0.029204f, 0.034902f, 0.042227f, 0.049092f, 0.052708f, 0.056008f, 0.061987f, 0.066609f, 0.066985f, 0.069150f, 0.074874f, 0.070084f, 0.044292f, 0.013242f, 0.000130f}
+ },
+ {
+ { 0.003402f, 0.004407f, -0.006051f, -0.025050f, -0.041008f, -0.025966f, 0.043136f, 0.128240f, 0.134022f, 0.020795f, -0.115019f, -0.140061f, -0.049669f, 0.036681f, 0.041074f, 0.008186f, 0.004784f, 0.019218f, 0.006249f, -0.026881f, -0.037864f, -0.021977f, -0.013202f, -0.024484f, -0.031445f, -0.015937f, 0.008115f, 0.019221f, 0.014829f, 0.004287f, -0.008269f, -0.023585f, -0.039009f, -0.049334f, -0.052310f, -0.048822f, -0.040627f, -0.030481f, -0.021172f, -0.012355f, -0.001360f, 0.011724f, 0.023165f, 0.030522f, 0.034690f, 0.036621f, 0.036317f, 0.035645f, 0.037782f, 0.043224f, 0.050040f, 0.057691f, 0.066656f, 0.075380f, 0.081835f, 0.086743f, 0.091441f, 0.094789f, 0.095756f, 0.095987f, 0.096430f, 0.095207f, 0.091675f, 0.088019f, 0.084731f, 0.079935f, 0.074369f, 0.070712f, 0.067983f, 0.063773f, 0.060332f, 0.060178f, 0.059510f, 0.055794f, 0.055006f, 0.058300f, 0.051108f, 0.024257f, -0.003223f, -0.006390f},
+ { -0.003402f, -0.004407f, 0.006051f, 0.025050f, 0.041008f, 0.025966f, -0.043136f, -0.128240f, -0.134022f, -0.020795f, 0.115019f, 0.140061f, 0.049669f, -0.036681f, -0.041074f, -0.008186f, -0.004784f, -0.019218f, -0.006249f, 0.026881f, 0.037864f, 0.021977f, 0.013202f, 0.024484f, 0.031445f, 0.015937f, -0.008115f, -0.019221f, -0.014829f, -0.004287f, 0.008269f, 0.023585f, 0.039009f, 0.049334f, 0.052310f, 0.048822f, 0.040627f, 0.030481f, 0.021172f, 0.012355f, 0.001360f, -0.011724f, -0.023165f, -0.030522f, -0.034690f, -0.036621f, -0.036317f, -0.035645f, -0.037782f, -0.043224f, -0.050040f, -0.057691f, -0.066656f, -0.075380f, -0.081835f, -0.086743f, -0.091441f, -0.094789f, -0.095756f, -0.095987f, -0.096430f, -0.095207f, -0.091675f, -0.088019f, -0.084731f, -0.079935f, -0.074369f, -0.070712f, -0.067983f, -0.063773f, -0.060332f, -0.060178f, -0.059510f, -0.055794f, -0.055006f, -0.058300f, -0.051108f, -0.024257f, 0.003223f, 0.006390f}
+ },
+ {
+ { 0.011580f, 0.033110f, 0.035997f, 0.009825f, -0.002131f, 0.048826f, 0.111220f, 0.054933f, -0.161075f, -0.387225f, -0.394599f, -0.096964f, 0.326957f, 0.540354f, 0.341380f, -0.107676f, -0.401640f, -0.303987f, 0.014646f, 0.211430f, 0.166588f, 0.034676f, -0.031854f, -0.045160f, -0.063992f, -0.070171f, -0.028788f, 0.028095f, 0.049715f, 0.042124f, 0.043372f, 0.063906f, 0.090684f, 0.118564f, 0.146170f, 0.162760f, 0.160684f, 0.145656f, 0.124864f, 0.099606f, 0.072825f, 0.049131f, 0.026964f, 0.002608f, -0.021547f, -0.042454f, -0.063121f, -0.085674f, -0.106502f, -0.124513f, -0.144021f, -0.165318f, -0.183168f, -0.196174f, -0.206536f, -0.211896f, -0.208932f, -0.201414f, -0.193839f, -0.183228f, -0.166803f, -0.148575f, -0.129851f, -0.105037f, -0.073501f, -0.041507f, -0.008652f, 0.030592f, 0.071399f, 0.104577f, 0.134417f, 0.167669f, 0.193709f, 0.202800f, 0.208008f, 0.214079f, 0.187614f, 0.107244f, 0.021441f, -0.005911f},
+ { -0.011580f, -0.033110f, -0.035997f, -0.009825f, 0.002131f, -0.048826f, -0.111220f, -0.054933f, 0.161075f, 0.387225f, 0.394599f, 0.096964f, -0.326957f, -0.540354f, -0.341380f, 0.107676f, 0.401640f, 0.303987f, -0.014646f, -0.211430f, -0.166588f, -0.034676f, 0.031854f, 0.045160f, 0.063992f, 0.070171f, 0.028788f, -0.028095f, -0.049715f, -0.042124f, -0.043372f, -0.063906f, -0.090684f, -0.118564f, -0.146170f, -0.162760f, -0.160684f, -0.145656f, -0.124864f, -0.099606f, -0.072825f, -0.049131f, -0.026964f, -0.002608f, 0.021547f, 0.042454f, 0.063121f, 0.085674f, 0.106502f, 0.124513f, 0.144021f, 0.165318f, 0.183168f, 0.196174f, 0.206536f, 0.211896f, 0.208932f, 0.201414f, 0.193839f, 0.183228f, 0.166803f, 0.148575f, 0.129851f, 0.105037f, 0.073501f, 0.041507f, 0.008652f, -0.030592f, -0.071399f, -0.104577f, -0.134417f, -0.167669f, -0.193709f, -0.202800f, -0.208008f, -0.214079f, -0.187614f, -0.107244f, -0.021441f, 0.005911f}
+ },
+ {
+ { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f},
+ { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f}
+ },
+ {
+ { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f},
+ { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f}
+ },
+ {
+ { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f},
+ { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f}
+ },
+ {
+ { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f},
+ { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f}
+ }
+};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL};
+#endif /* UPDATE_SBA_FILTER */
+
+
/********************** CRendBin_Combined_BRIR **********************/
-#ifdef FIX_BINAURAL_DELAY_PRECISION
+#ifdef UPDATE_SBA_FILTER
const float CRendBin_Combined_BRIR_latency_s = 0.000145834f;
#else
const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f;
@@ -6923,3 +8165,4 @@ const float CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS][252
0.050578f, 0.012222f, 0.020049f, -0.020057f, -0.032135f, -0.002553f, -0.037541f, -0.023567f, -0.008392f, -0.012215f, 0.001644f, -0.001142f, 0.000540f, 0.001404f, -0.027979f, -0.022362f, -0.012091f, -0.022963f, 0.009075f, 0.010977f, -0.007069f, -0.000183f, -0.022228f, -0.001348f, 0.006548f, -0.003034f}
};
+#undef WMC_TOOL_SKIP
diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h
index 64582a16723b9f0dd5956d6c213fa4f5ab0d44f7..8f0823dc7b05dd48506c80499752f7ab1b797b66 100644
--- a/lib_rend/ivas_rom_binaural_crend_head.h
+++ b/lib_rend/ivas_rom_binaural_crend_head.h
@@ -45,10 +45,14 @@
#ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_
#define _IVAS_ROM_BINAURAL_CREND_HEAD_
+#ifndef UPDATE_SBA_FILTER
#include
#include "cnst.h"
+#endif
#include "ivas_cnst.h"
+#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000
+
/********************** CRendBin_Combined_HRIR **********************/
@@ -95,6 +99,10 @@ extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80];
extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80];
extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS];
extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS];
+#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */
+
+#ifndef UPDATE_SBA_FILTER
+
/********************** CRendBin_HOA3_HRIR **********************/
@@ -141,6 +149,159 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160];
extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160];
extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS];
extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS];
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_FOA_HRIR **********************/
+
+extern float CRendBin_FOA_HRIR_latency_s;
+
+/* Sample Rate = 48000 */
+
+extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz;
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz;
+extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4];
+extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS];
+extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240];
+extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 32000 */
+
+extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz;
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz;
+extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4];
+extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS];
+extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160];
+extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 16000 */
+
+extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz;
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz;
+extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4];
+extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS];
+extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80];
+extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS];
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_HOA2_HRIR **********************/
+
+extern float CRendBin_HOA2_HRIR_latency_s;
+
+/* Sample Rate = 48000 */
+
+extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz;
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz;
+extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9];
+extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240];
+extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 32000 */
+
+extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz;
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz;
+extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9];
+extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160];
+extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 16000 */
+
+extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz;
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz;
+extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9];
+extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80];
+extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS];
+#endif /* UPDATE_SBA_FILTER */
+
+#ifdef UPDATE_SBA_FILTER
+
+
+/********************** CRendBin_HOA3_HRIR **********************/
+
+extern float CRendBin_HOA3_HRIR_latency_s;
+
+/* Sample Rate = 48000 */
+
+extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz;
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz;
+extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16];
+extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240];
+extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 32000 */
+
+extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz;
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz;
+extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16];
+extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160];
+extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS];
+
+/* Sample Rate = 16000 */
+
+extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz;
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS];
+extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1];
+extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz;
+extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16];
+extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS];
+extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80];
+extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS];
+extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS];
+#endif /* UPDATE_SBA_FILTER */
+
+
/********************** CRendBin_Combined_BRIR **********************/
diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c
index ce3e5e6cd92be8a390ca5a6a8ed385f97cfa60d1..f02380e6b06987bf66b11f83f592c4fbd1c62ba4 100644
--- a/lib_rend/ivas_rotation.c
+++ b/lib_rend/ivas_rotation.c
@@ -68,7 +68,6 @@ ivas_error ivas_headTrack_open(
( *hHeadTrackData )->lrSwitchInterpVal = 0.0f;
( *hHeadTrackData )->lrSwitchedCurrent = 0;
( *hHeadTrackData )->lrSwitchedNext = 0;
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( ( ( *hHeadTrackData )->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" );
@@ -78,7 +77,6 @@ ivas_error ivas_headTrack_open(
{
return error;
}
-#endif
/* Initialise Rmat_prev to I, Rmat will be computed later */
for ( i = 0; i < 3; i++ )
@@ -87,11 +85,15 @@ ivas_error ivas_headTrack_open(
( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f;
}
+ set_zero( ( *hHeadTrackData )->chEneIIR[0], MASA_FREQUENCY_BANDS );
+ set_zero( ( *hHeadTrackData )->chEneIIR[1], MASA_FREQUENCY_BANDS );
+ set_zero( ( *hHeadTrackData )->procChEneIIR[0], MASA_FREQUENCY_BANDS );
+ set_zero( ( *hHeadTrackData )->procChEneIIR[1], MASA_FREQUENCY_BANDS );
+
return IVAS_ERR_OK;
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*-----------------------------------------------------------------------*
* ivas_headTrack_close()
*
@@ -118,7 +120,6 @@ void ivas_headTrack_close(
return;
}
-#endif
/*----------------------------------------------------------------------------------
@@ -132,7 +133,6 @@ void QuatToRotMat(
float Rmat[3][3] /* o : real-space rotation matrix for this rotation */
)
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
Rmat[0][0] = quat.w * quat.w + quat.x * quat.x - quat.y * quat.y - quat.z * quat.z;
Rmat[0][1] = 2.0f * ( quat.x * quat.y - quat.w * quat.z );
Rmat[0][2] = 2.0f * ( quat.x * quat.z + quat.w * quat.y );
@@ -144,109 +144,11 @@ void QuatToRotMat(
Rmat[2][0] = 2.0f * ( quat.x * quat.z - quat.w * quat.y );
Rmat[2][1] = 2.0f * ( quat.y * quat.z + quat.w * quat.x );
Rmat[2][2] = quat.w * quat.w - quat.x * quat.x - quat.y * quat.y + quat.z * quat.z;
-#else
- float s1, s2, s3, c1, c2, c3;
-
-#ifdef DEBUGGING
- /* PrintQuat( quat ); */
-#endif
-
- /* For debugging purposes we can also calculate the rotation matrix from
- * Euler angles instead of quaternions. In this case, all the w values must
- * be set to -3.0 in the trajectory file to signal switching to Euler angles.
- * The x,y, and z components of the quaternion are then interpreted as
-#ifdef FIX_I109_ORIENTATION_TRACKING
- * yaw-pitch-roll.
-#else // see below: "Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention"
- * roll-pitch-yaw.
-#endif
- */
- if ( quat.w != -3.0 )
- {
- Rmat[0][0] = quat.w * quat.w + quat.x * quat.x - quat.y * quat.y - quat.z * quat.z;
- Rmat[0][1] = 2.0f * ( quat.x * quat.y - quat.w * quat.z );
- Rmat[0][2] = 2.0f * ( quat.x * quat.z + quat.w * quat.y );
-
- Rmat[1][0] = 2.0f * ( quat.x * quat.y + quat.w * quat.z );
- Rmat[1][1] = quat.w * quat.w - quat.x * quat.x + quat.y * quat.y - quat.z * quat.z;
- Rmat[1][2] = 2.0f * ( quat.y * quat.z - quat.w * quat.x );
-
- Rmat[2][0] = 2.0f * ( quat.x * quat.z - quat.w * quat.y );
- Rmat[2][1] = 2.0f * ( quat.y * quat.z + quat.w * quat.x );
- Rmat[2][2] = quat.w * quat.w - quat.x * quat.x - quat.y * quat.y + quat.z * quat.z;
- }
- else
- {
- /* Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention
- *
- * yaw: rotate scene counter-clockwise in the horizontal plane
- * pitch: rotate scene in the median plane, increase elevation with positive values
- * roll: rotate scene from the right ear to the top
- */
-
- c1 = cosf( quat.z / _180_OVER_PI );
- c2 = cosf( quat.y / _180_OVER_PI );
- c3 = cosf( quat.x / _180_OVER_PI );
-
- s1 = sinf( quat.z / _180_OVER_PI );
- s2 = sinf( -quat.y / _180_OVER_PI );
- s3 = sinf( quat.x / _180_OVER_PI );
-
- Rmat[0][0] = c2 * c3;
- Rmat[0][1] = -c2 * s3;
- Rmat[0][2] = s2;
-
- Rmat[1][0] = c1 * s3 + c3 * s1 * s2;
- Rmat[1][1] = c1 * c3 - s1 * s2 * s3;
- Rmat[1][2] = -c2 * s1;
-
- Rmat[2][0] = s1 * s3 - c1 * c3 * s2;
- Rmat[2][1] = c3 * s1 + c1 * s2 * s3;
- Rmat[2][2] = c1 * c2;
- }
-#endif
return;
}
-#ifndef FIX_I109_ORIENTATION_TRACKING
-/*-------------------------------------------------------------------------
- * Quat2Euler()
- *
- * Quaternion handling: calculate corresponding Euler angles in radians
- *------------------------------------------------------------------------*/
-
-void Quat2Euler(
- const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */
- float *yaw, /* o : yaw (z) */
- float *pitch, /* o : pitch (y) */
- float *roll /* o : roll (x) */
-)
-{
- if ( quat.w != -3.0 )
- {
- *yaw = atan2f( 2 * ( quat.w * quat.x + quat.y * quat.z ), 1 - 2 * ( quat.x * quat.x + quat.y * quat.y ) );
- *pitch = asinf( 2 * ( quat.w * quat.y - quat.z * quat.x ) );
- *roll = atan2f( 2 * ( quat.w * quat.z + quat.x * quat.y ), 1 - 2 * ( quat.y * quat.y + quat.z * quat.z ) );
- }
- else
- {
- /* Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention
- *
- * yaw: rotate scene counter-clockwise in the horizontal plane
- * pitch: rotate scene in the median plane, increase elevation with positive values
- * roll: rotate scene from the right ear to the top
- */
- *yaw = quat.z;
- *pitch = quat.y;
- *roll = quat.x;
- }
-
- return;
-}
-#endif
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*-------------------------------------------------------------------------
* Euler2Quat()
*
@@ -263,14 +165,13 @@ void Euler2Quat(
float cr = cosf( roll * 0.5f );
float sr = sinf( roll * 0.5f );
float cp = cosf( pitch * 0.5f );
- float sp = sinf( -pitch * 0.5f );
+ float sp = sinf( pitch * 0.5f );
float cy = cosf( yaw * 0.5f );
float sy = sinf( yaw * 0.5f );
-
- quat->w = cr * cp * cy - sr * sp * sy;
- quat->x = sr * cp * cy + cr * sp * sy;
- quat->y = cr * sp * cy - sr * cp * sy;
- quat->z = cr * cp * sy + sr * sp * cy;
+ quat->w = cr * cp * cy + sr * sp * sy;
+ quat->x = sr * cp * cy - cr * sp * sy;
+ quat->y = sr * cp * sy + cr * sp * cy;
+ quat->z = cr * cp * sy - sr * sp * cy;
return;
}
@@ -294,7 +195,6 @@ float deg2rad(
return PI_OVER_180 * degrees;
}
-#endif
/*-------------------------------------------------------------------------
* rotateAziEle()
@@ -354,10 +254,14 @@ void rotateFrame_shd(
#else
HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */
#endif
- float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */
- const int16_t subframe_len, /* i : subframe length per channel */
- const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
- const int16_t subframe_idx /* i : subframe index */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: unrotated HOA3 signal buffer in TD */
+#else
+ float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */
+#endif
+ const int16_t subframe_len, /* i : subframe length per channel */
+ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
+ const int16_t subframe_idx /* i : subframe index */
)
{
int16_t i, l, n, m;
@@ -472,11 +376,15 @@ void rotateFrame_sd(
#else
HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */
#endif
- float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */
- const int16_t subframe_len, /* i : subframe length per channel */
- const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
- const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */
- const int16_t subframe_idx /* i : subframe index */
+#ifdef JBM_TSM_ON_TCS
+ float *output[], /* i/o: unrotated SD signal buffer in TD */
+#else
+ float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */
+#endif
+ const int16_t subframe_len, /* i : subframe length per channel */
+ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */
+ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */
+ const int16_t subframe_idx /* i : subframe index */
)
{
int16_t i, j;
@@ -624,7 +532,10 @@ void rotateFrame_shd_cldfb(
float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */
float Rmat[3][3], /* i : real-space rotation matrix */
const int16_t nInChannels, /* i : number of channels */
- const int16_t shd_rot_max_order /* i : split-order rotation method */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to process */
+#endif
+ const int16_t shd_rot_max_order /* i : split-order rotation method */
)
{
int16_t n = 0;
@@ -647,7 +558,11 @@ void rotateFrame_shd_cldfb(
SHrotmatgen( SHrotmat, Rmat, shd_rot_max_order );
/* rotation by mtx multiplication */
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < numTimeSlots; i++ )
+#else
for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+#endif
{
for ( iBand = 0; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ )
{
@@ -722,7 +637,10 @@ void rotateFrame_sd_cldfb(
float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */
const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */
const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */
- const int16_t nb_band /* i : number of CLDFB bands to process */
+#ifdef JBM_TSM_ON_TCS
+ const int16_t numTimeSlots, /* i : number of time slots to process */
+#endif
+ const int16_t nb_band /* i : number of CLDFB bands to process */
)
{
int16_t iBlock, iBand, m, n;
@@ -784,7 +702,11 @@ void rotateFrame_sd_cldfb(
p_imagRot = imagRot[n];
if ( g1 > 0.f )
{
+#ifdef JBM_TSM_ON_TCS
+ for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ )
+#else
for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ )
+#endif
{
p_real = Cldfb_RealBuffer[m][iBlock];
p_imag = Cldfb_ImagBuffer[m][iBlock];
@@ -804,7 +726,11 @@ void rotateFrame_sd_cldfb(
{
p_realRot = realRot[n];
p_imagRot = imagRot[n];
+#ifdef JBM_TSM_ON_TCS
+ for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ )
+#else
for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ )
+#endif
{
p_real = Cldfb_RealBuffer[n][iBlock];
p_imag = Cldfb_ImagBuffer[n][iBlock];
diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c
index 8fd10d83ba3b261a3874eed9065197fbca20ab3a..059cd847e1a44782cf226dafafa90a65043666ca 100644
--- a/lib_rend/ivas_sba_rendering.c
+++ b/lib_rend/ivas_sba_rendering.c
@@ -51,11 +51,10 @@
*-------------------------------------------------------------------*/
void ivas_sba_prototype_renderer(
- Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
- float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
- float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
- const int16_t firstSubframe, /* i : First subframe to map */
- const int16_t nSubframes /* i : Number of subframes to map */
+ Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */
+ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */
+ float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */
+ const int16_t subframe /* i : Subframe to render */
)
{
float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
@@ -66,8 +65,10 @@ void ivas_sba_prototype_renderer(
int16_t num_cldfb_bands, numch_in, numch_out;
int16_t cldfb_band;
int16_t out_ch, in_ch;
- int16_t firstSlot, slotEnd, firstInCh, inChEnd, firstOutCh, outChEnd;
- int16_t sf_idx;
+ int16_t firstInCh, inChEnd, firstOutCh, outChEnd;
+#ifdef JBM_TSM_ON_TCS
+ int16_t slot_idx_start, md_idx;
+#endif
push_wmops( "ivas_sba_prototype_renderer" );
@@ -75,12 +76,12 @@ void ivas_sba_prototype_renderer(
hDecoderConfig = st_ivas->hDecoderConfig;
num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands;
- firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES );
- slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES );
-
num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands;
numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans;
numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans;
+#ifdef JBM_TSM_ON_TCS
+ slot_idx_start = hSpar->slots_rendered;
+#endif
if ( st_ivas->nchan_transport == 1 )
{
@@ -98,10 +99,19 @@ void ivas_sba_prototype_renderer(
}
/* Apply mixing matrix */
- for ( ts = firstSlot; ts < slotEnd; ts++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ )
+#else
+ for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ )
+#endif
{
/* determine SPAR parameters for this time slot */
- ivas_spar_get_parameters( hSpar, hDecoderConfig, ts, numch_out, numch_in, num_spar_bands, mixer_mat );
+#ifdef JBM_TSM_ON_TCS
+ md_idx = hSpar->render_to_md_map[ts + slot_idx_start];
+ ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat );
+#else
+ ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + subframe * CLDFB_SLOTS_PER_SUBFRAME, numch_out, numch_in, num_spar_bands, mixer_mat );
+#endif
for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ )
{
@@ -145,10 +155,12 @@ void ivas_sba_prototype_renderer(
}
}
+#ifdef JBM_TSM_ON_TCS
/* Update mixing matrices */
- if ( ( ( ts + 1 ) % MAX_PARAM_SPATIAL_SUBFRAMES ) == 0 )
+ if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) )
{
- sf_idx = ts / MAX_PARAM_SPATIAL_SUBFRAMES;
+ /* we have crossed an unadapted parameter sf border, update previous mixing matrices */
+ int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME;
hSpar->i_subframe++;
hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES );
mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
@@ -162,17 +174,43 @@ void ivas_sba_prototype_renderer(
{
for ( b = 0; b < num_spar_bands; b++ )
{
- hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + sf_idx * IVAS_MAX_NUM_BANDS];
+ hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS];
}
}
}
}
+#endif
}
+#ifndef JBM_TSM_ON_TCS
+ /* Update mixing matrices */
+ hSpar->i_subframe++;
+ hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+ mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS );
+
+ for ( out_ch = 0; out_ch < numch_out; out_ch++ )
+ {
+ for ( in_ch = 0; in_ch < numch_in; in_ch++ )
+ {
+ for ( b = 0; b < num_spar_bands; b++ )
+ {
+ hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + subframe * IVAS_MAX_NUM_BANDS];
+ }
+ }
+ }
+#endif
+
/* Create prototypes */
if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM )
{
- for ( ts = firstSlot; ts < slotEnd; ts++ )
+#ifdef JBM_TSM_ON_TCS
+ for ( ts = 0; ts < hSpar->subframe_nbslots[subframe]; ts++ )
+#else
+ for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ )
+#endif
{
if ( st_ivas->nchan_transport == 1 ) /* Dual mono */
{
@@ -198,6 +236,10 @@ void ivas_sba_prototype_renderer(
}
}
+#ifdef JBM_TSM_ON_TCS
+ hSpar->subframes_rendered++;
+ hSpar->slots_rendered += hSpar->subframe_nbslots[subframe];
+#endif
pop_wmops();
return;
diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h
index 01534d0f9ae494b2287a34902edb72cfe0692e4e..09e5710ed4851979cca68b5c5d30c4bfcc6c862a 100644
--- a/lib_rend/ivas_stat_rend.h
+++ b/lib_rend/ivas_stat_rend.h
@@ -140,6 +140,7 @@ typedef struct ivas_dirac_dec_binaural_data_structure
uint16_t useSubframeMode; /* 0 = process in 20 ms frames, 1 = process in 5 ms subframes */
uint16_t useTdDecorr;
ivas_td_decorr_state_t *hTdDecorr;
+ float reqularizationFactor;
} DIRAC_DEC_BIN_DATA, *DIRAC_DEC_BIN_HANDLE;
@@ -225,10 +226,13 @@ typedef struct EFAP
* Orientation tracking structure
*----------------------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
typedef struct ivas_orient_trk_state_t
{
+#ifdef FIX_439_OTR_PARAMS
+ HEAD_ORIENT_TRK_T orientation_tracking;
+#else
OTR_TRACKING_T trackingType;
+#endif
float centerAdaptationRate;
float offCenterAdaptationRate;
float adaptationAngle;
@@ -239,34 +243,6 @@ typedef struct ivas_orient_trk_state_t
IVAS_QUATERNION trkRot; /* tracked rotation */
} ivas_orient_trk_state_t;
-#else
-typedef struct ivas_orient_trk_state_t
-{
- OTR_TRACKING_T trackingType;
- float centerAdaptationRate;
- float offCenterAdaptationRate;
- float adaptationAngle;
-
- float alpha;
-
- float absYaw; /* absolute orientation */
- float absPitch;
- float absRoll;
-
- float absAvgYaw; /* average absolute orientation */
- float absAvgPitch;
- float absAvgRoll;
-
- float refYaw; /* reference orientation */
- float refPitch;
- float refRoll;
-
- float trkYaw; /* tracked orientation */
- float trkPitch;
- float trkRoll;
-
-} ivas_orient_trk_state_t;
-#endif
/*----------------------------------------------------------------------------------*
* Head rotation data structure
@@ -276,13 +252,9 @@ typedef struct
{
int8_t headRotEnabled;
IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME];
-#ifdef TD5
- IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME];
-#endif
+ IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME];
float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME];
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_orient_trk_state_t *hOrientationTracker;
-#endif
} IVAS_REND_HeadRotData;
@@ -290,9 +262,7 @@ typedef struct ivas_binaural_head_track_struct
{
int16_t num_quaternions;
IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES];
-#ifdef TD5
- IVAS_POSITION Pos[MAX_PARAM_SPATIAL_SUBFRAMES];
-#endif
+ IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES];
float Rmat[3][3];
float Rmat_prev[3][3];
@@ -300,10 +270,11 @@ typedef struct ivas_binaural_head_track_struct
uint8_t lrSwitchedCurrent;
float lrSwitchInterpVal;
+ float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */
+ float procChEneIIR[2][MASA_FREQUENCY_BANDS];
+
int16_t shd_rot_max_order;
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_orient_trk_state_t *OrientationTracker;
-#endif
} HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE;
@@ -373,9 +344,7 @@ typedef struct ivas_render_config_t
ivas_renderTypeOverride renderer_type_override;
#endif
ivas_roomAcoustics_t roomAcoustics;
-#ifdef TD5
float directivity[3];
-#endif
} RENDER_CONFIG_DATA, *RENDER_CONFIG_HANDLE;
@@ -679,6 +648,7 @@ typedef struct
float mem_hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1];
float mem_hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1];
float Gain;
+ float prevGain;
} TDREND_SRC_t;
/* Top level TD binaural renderer handle */
@@ -771,6 +741,10 @@ typedef struct ivas_hrtfs_crend_structure
{
HRTFS_DATA *hHRTF_hrir_combined;
HRTFS_DATA *hHRTF_hrir_hoa3;
+#ifdef UPDATE_SBA_FILTER
+ HRTFS_DATA *hHRTF_hrir_hoa2;
+ HRTFS_DATA *hHRTF_hrir_foa;
+#endif
HRTFS_DATA *hHRTF_brir_combined;
} HRTFS_CREND, *HRTFS_CREND_HANDLE;
@@ -781,17 +755,43 @@ typedef struct ivas_hrtfs_crend_structure
typedef struct ivas_hrtfs_fastconv_struct
{
float FASTCONV_HRIR_latency_s;
+#ifdef UPDATE_SBA_FILTER
+ float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
+ float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
+ float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
+ float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS];
+#else
float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7];
float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7];
float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7];
float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7];
+#endif
float FASTCONV_HOA3_latency_s;
+#ifdef UPDATE_SBA_FILTER
+ float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
+ float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
+ float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
+ float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS];
+#else
float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7];
float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7];
float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7];
float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7];
+#endif
+#ifdef UPDATE_SBA_FILTER
+ float FASTCONV_HOA2_latency_s;
+ float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+ float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+ float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+ float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS];
+ float FASTCONV_FOA_latency_s;
+ float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+ float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+ float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+ float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS];
+#endif
float FASTCONV_BRIR_latency_s;
float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX];
float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX];
diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c
index be73d6986db14d500aab83346ed07fb80be476d4..b4a3d6f469a080127ddfdbcdbf166375c4cd7a08 100644
--- a/lib_rend/lib_rend.c
+++ b/lib_rend/lib_rend.c
@@ -121,6 +121,8 @@ typedef struct
CREND_WRAPPER_HANDLE crendWrapper;
REVERB_HANDLE hReverb;
rotation_matrix rot_mat_prev;
+ int16_t nonDiegeticPan;
+ float nonDiegeticPanGain;
} input_ism;
typedef struct
@@ -147,6 +149,8 @@ typedef struct
CREND_WRAPPER_HANDLE crendWrapper;
REVERB_HANDLE hReverb;
rotation_gains rot_gains_prev;
+ int16_t nonDiegeticPan;
+ float nonDiegeticPanGain;
lfe_routing lfeRouting;
} input_mc;
@@ -909,11 +913,7 @@ static ivas_error getEfapGains(
return IVAS_ERR_OK;
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
static ivas_error initHeadRotation(
-#else
-static void initHeadRotation(
-#endif
IVAS_REND_HANDLE hIvasRend )
{
int16_t i, crossfade_len;
@@ -937,7 +937,6 @@ static void initHeadRotation(
hIvasRend->headRotData.headPositions[i] = quaternionInit();
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL )
{
return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Orientation tracking" );
@@ -949,12 +948,8 @@ static void initHeadRotation(
}
return IVAS_ERR_OK;
-#else
- return;
-#endif
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
static void closeHeadRotation(
IVAS_REND_HANDLE hIvasRend )
{
@@ -965,7 +960,6 @@ static void closeHeadRotation(
return;
}
-#endif
static void initRotMatrix(
@@ -1026,11 +1020,10 @@ static IVAS_REND_AudioObjectPosition defaultObjectPosition(
pos.azimuth = 0.0f;
pos.elevation = 0.0f;
-#ifdef TD5
pos.radius = 1.0f;
pos.yaw = 0.0f;
pos.pitch = 0.0f;
-#endif
+ pos.non_diegetic_flag = 0;
return pos;
}
@@ -1126,11 +1119,7 @@ static ivas_error setRendInputActiveIsm(
error = IVAS_ERR_OK;
if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL )
{
-#ifdef TD5
if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK )
-#endif
{
return error;
}
@@ -1139,11 +1128,7 @@ static ivas_error setRendInputActiveIsm(
{
if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on )
{
-#ifdef TD5
if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK )
-#endif
{
return error;
}
@@ -1156,9 +1141,6 @@ static ivas_error setRendInputActiveIsm(
else
{
if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- 0,
-#endif
NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK )
{
return error;
@@ -1650,7 +1632,16 @@ static ivas_error updateMcPanGainsForMcOut(
inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO ||
inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM )
{
- error = initMcPanGainsWithEfap( inputMc, outConfig );
+ if ( ( inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) )
+ {
+ inputMc->panGains[0][0] = ( inputMc->nonDiegeticPanGain + 1.f ) * 0.5f;
+ inputMc->panGains[0][1] = 1.f - inputMc->panGains[0][0];
+ error = IVAS_ERR_OK;
+ }
+ else
+ {
+ error = initMcPanGainsWithEfap( inputMc, outConfig );
+ }
}
else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MONO )
{
@@ -1833,7 +1824,7 @@ static ivas_error initMcBinauralRendering(
outSampleRate = *inputMc->base.ctx.pOutSampleRate;
- /* TODO tmu : needs review allocate both renderers; needed if headrotation is toggled so the renderer can be switched */
+ /* Needs optimization, see issue 513 */
// bool initTDRend;
// initTDRend = false;
// if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM )
@@ -1851,11 +1842,7 @@ static ivas_error initMcBinauralRendering(
// if ( initTDRend )
{
-#ifdef TD5
if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK )
-#else
- if ( ( error = ivas_td_binaural_open_ext( &inputMc->tdRendWrapper, inConfig, &inputMc->customLsInput, outSampleRate ) ) != IVAS_ERR_OK )
-#endif
{
return error;
}
@@ -1871,9 +1858,6 @@ static ivas_error initMcBinauralRendering(
{
if ( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) ? AUDIO_CONFIG_7_1_4 : getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- 0,
-#endif
NULL, outSampleRate ) ) != IVAS_ERR_OK )
{
return error;
@@ -2142,9 +2126,6 @@ static ivas_error updateSbaPanGains(
getIvasAudioConfigFromRendAudioConfig( inConfig ),
getIvasAudioConfigFromRendAudioConfig( outConfig ),
hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- 0,
-#endif
NULL,
*rendCtx.pOutSampleRate );
break;
@@ -2158,9 +2139,6 @@ static ivas_error updateSbaPanGains(
AUDIO_CONFIG_7_1_4,
getIvasAudioConfigFromRendAudioConfig( outConfig ),
hRendCfg,
-#ifndef FIX_I109_ORIENTATION_TRACKING
- 0,
-#endif
NULL,
*rendCtx.pOutSampleRate );
break;
@@ -2243,9 +2221,13 @@ static ivas_error initMasaDummyDecForMcOut(
output_config = getIvasAudioConfigFromRendAudioConfig( outConfig );
decDummy->hDecoderConfig->output_config = output_config;
+ decDummy->sba_analysis_order = 1;
+
decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */
- decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
- decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
+#ifndef SBA_MODE_CLEAN_UP
+ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
+#endif
+ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
ivas_output_init( &( decDummy->hOutSetup ), output_config );
ivas_output_init( &( decDummy->hIntSetup ), output_config );
@@ -2270,6 +2252,7 @@ static ivas_error initMasaDummyDecForMcOut(
{
return error;
}
+ decDummy->hDirAC->dirac_bs_md_write_idx = 0;
if ( decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC )
{
@@ -2326,8 +2309,12 @@ static ivas_error initMasaDummyDecForSbaOut(
decDummy->hDecoderConfig->output_config = output_config;
decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */
- decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
- decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
+#ifndef SBA_MODE_CLEAN_UP
+ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
+#endif
+ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
+
+ decDummy->sba_analysis_order = 1;
ivas_output_init( &( decDummy->hOutSetup ), output_config );
ivas_output_init( &( decDummy->hIntSetup ), output_config );
@@ -2346,6 +2333,7 @@ static ivas_error initMasaDummyDecForSbaOut(
{
return error;
}
+ decDummy->hDirAC->dirac_bs_md_write_idx = 0;
numCldfbAnalyses = decDummy->nchan_transport;
numCldfbSyntheses = decDummy->hDecoderConfig->nchan_out;
@@ -2394,9 +2382,13 @@ static ivas_error initMasaDummyDecForBinauralOut(
output_config = decDummy->hDecoderConfig->output_config;
+ decDummy->sba_analysis_order = 1;
+
decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */
- decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
- decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
+#ifndef SBA_MODE_CLEAN_UP
+ decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */
+#endif
+ decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */
ivas_output_init( &( decDummy->hOutSetup ), output_config );
if ( output_config == AUDIO_CONFIG_BINAURAL )
@@ -2414,6 +2406,7 @@ static ivas_error initMasaDummyDecForBinauralOut(
{
return error;
}
+ decDummy->hDirAC->dirac_bs_md_write_idx = 0;
if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &decDummy->hHrtfParambin ) ) != IVAS_ERR_OK )
{
@@ -2492,6 +2485,9 @@ static DecoderDummy *initDecoderDummy(
decDummy->hDecoderConfig->output_Fs = sampleRate;
decDummy->hDecoderConfig->nchan_out = numOutChannels;
decDummy->hDecoderConfig->Opt_Headrotation = 0;
+#ifdef JBM_TSM_ON_TCS
+ decDummy->hDecoderConfig->voip_active = 0;
+#endif
decDummy->hBinRenderer = NULL;
decDummy->hEFAPdata = NULL;
@@ -2503,10 +2499,18 @@ static DecoderDummy *initDecoderDummy(
decDummy->hMasa = NULL;
decDummy->hDiracDecBin = NULL;
decDummy->hQMetaData = NULL;
+#ifdef FIX_482_DUMMYDEC_INIT
+ decDummy->hHrtfParambin = NULL;
+ decDummy->hHeadTrackData = NULL;
+ decDummy->hDirAC = NULL;
+#endif
+#ifdef JBM_TSM_ON_TCS
+ decDummy->hTcBuffer = NULL;
+#endif
decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig );
decDummy->nchan_transport = numTransChannels;
- if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM )
+ if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL )
{
decDummy->hHeadTrackData = malloc( sizeof( HEAD_TRACK_DATA ) );
/* Initialise Rmat_prev to I, Rmat will be computed later */
@@ -2516,14 +2520,25 @@ static DecoderDummy *initDecoderDummy(
decDummy->hHeadTrackData->Rmat_prev[i][i] = 1.0f;
}
+#ifdef FIX_482_DUMMYDEC_INIT
+ set_zero( decDummy->hHeadTrackData->chEneIIR[0], MASA_FREQUENCY_BANDS );
+ set_zero( decDummy->hHeadTrackData->chEneIIR[1], MASA_FREQUENCY_BANDS );
+ set_zero( decDummy->hHeadTrackData->procChEneIIR[0], MASA_FREQUENCY_BANDS );
+ set_zero( decDummy->hHeadTrackData->procChEneIIR[1], MASA_FREQUENCY_BANDS );
+ for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
+ {
+ decDummy->hHeadTrackData->Quaternions[i].w = 1.0f;
+ decDummy->hHeadTrackData->Quaternions[i].x = 0.0f;
+ decDummy->hHeadTrackData->Quaternions[i].y = 0.0f;
+ decDummy->hHeadTrackData->Quaternions[i].z = 0.0f;
+ }
+#endif
decDummy->hHeadTrackData->num_quaternions = 0;
decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f;
decDummy->hHeadTrackData->lrSwitchedCurrent = 0;
decDummy->hHeadTrackData->lrSwitchedNext = 0;
-#ifdef FIX_I109_ORIENTATION_TRACKING
decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) );
ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker );
-#endif
#ifdef EXTERNAL_ORIENTATIONS
/* External orientations */
@@ -2538,6 +2553,7 @@ static DecoderDummy *initDecoderDummy(
assert( error == IVAS_ERR_OK );
}
#endif
+
}
else
{
@@ -2559,6 +2575,11 @@ static DecoderDummy *initDecoderDummy(
decDummy->hRenderConfig = NULL;
}
+#ifdef JBM_TSM_ON_TCS
+ /* get a default TC buffer, needed for some renderers */
+ ivas_jbm_dec_tc_buffer_open( decDummy, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 );
+#endif
+
decDummy->renderer_type = RENDERER_DISABLE;
return decDummy;
@@ -2622,12 +2643,10 @@ static void freeDecoderDummy(
if ( pDecDummy->hHeadTrackData != NULL )
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( pDecDummy->hHeadTrackData->OrientationTracker != NULL )
{
free( pDecDummy->hHeadTrackData->OrientationTracker );
}
-#endif
free( pDecDummy->hHeadTrackData );
}
#ifdef EXTERNAL_ORIENTATIONS
@@ -2679,6 +2698,11 @@ static void freeDecoderDummy(
/* Parametric binaural renderer handle */
ivas_dirac_dec_close_binaural_data( &pDecDummy->hDiracDecBin );
+#ifdef JBM_TSM_ON_TCS
+ /* TC buffer */
+ ivas_jbm_dec_tc_buffer_close( &pDecDummy->hTcBuffer );
+#endif
+
free( pDecDummy );
pDecDummy = NULL;
@@ -2701,7 +2725,9 @@ static void clearInputMasa(
ivas_error IVAS_REND_Open(
IVAS_REND_HANDLE *phIvasRend,
const int32_t outputSampleRate,
- const IVAS_REND_AudioConfig outConfig )
+ const IVAS_REND_AudioConfig outConfig,
+ const int16_t nonDiegeticPan,
+ const float nonDiegeticPanGain )
{
int16_t i;
IVAS_REND_HANDLE hIvasRend;
@@ -2753,14 +2779,10 @@ ivas_error IVAS_REND_Open(
}
/* Initialize headrotation data */
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( ( error = initHeadRotation( hIvasRend ) ) != IVAS_ERR_OK )
{
return error;
}
-#else
- initHeadRotation( hIvasRend );
-#endif
#ifdef EXTERNAL_ORIENTATIONS
/* Initialize external orientation data */
@@ -2789,6 +2811,8 @@ ivas_error IVAS_REND_Open(
hIvasRend->inputsIsm[i].crendWrapper = NULL;
hIvasRend->inputsIsm[i].hReverb = NULL;
hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL;
+ hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan;
+ hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain;
}
for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i )
@@ -2798,6 +2822,8 @@ ivas_error IVAS_REND_Open(
hIvasRend->inputsMc[i].crendWrapper = NULL;
hIvasRend->inputsMc[i].hReverb = NULL;
hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL;
+ hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan;
+ hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain;
}
for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i )
@@ -3583,7 +3609,7 @@ ivas_error IVAS_REND_GetDelay(
{
if ( hIvasRend->inputsMasa[i].base.inConfig != IVAS_REND_AUDIO_CONFIG_UNKNOWN )
{
- latency_ns = NS2SA( hIvasRend->sampleRateOut, (int32_t) ( (float) IVAS_FB_DEC_DELAY_NS + 0.5f ) );
+ latency_ns = (int32_t) ( (float) IVAS_FB_DEC_DELAY_NS + 0.5f );
max_latency_ns = max( max_latency_ns, latency_ns );
}
}
@@ -3747,11 +3773,14 @@ ivas_error IVAS_REND_FeedInputMasaMetadata(
*-------------------------------------------------------------------*/
ivas_error IVAS_REND_InitConfig(
- IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
- const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */
+ IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
+ const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */
)
{
ivas_error error;
+ bool rendererConfigEnabled;
+
+ rendererConfigEnabled = ( getAudioConfigType( outAudioConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL );
if ( rendererConfigEnabled )
{
@@ -3768,8 +3797,7 @@ ivas_error IVAS_REND_InitConfig(
{
return error;
}
-
- if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) ) != IVAS_ERR_OK )
+ if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK )
{
return error;
}
@@ -3822,6 +3850,9 @@ int16_t IVAS_REND_GetRenderConfig(
hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands;
hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay;
hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay;
+#ifdef FIX_463_TD_RENDERER_DIRECTIVITY_RESET
+ mvr2r( hRCin->directivity, hRCout->directivity, 3 );
+#endif
mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX );
mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX );
@@ -3848,11 +3879,8 @@ int16_t IVAS_REND_FeedRenderConfig(
{
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
-
hRenderConfig = hIvasRend->hRendererConfig;
-#ifdef TD5
- mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 );
-#endif
+
#ifdef DEBUGGING
hRenderConfig->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE;
if ( renderConfig.renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV )
@@ -3873,6 +3901,7 @@ int16_t IVAS_REND_FeedRenderConfig(
mvr2r( renderConfig.room_acoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX );
mvr2r( renderConfig.room_acoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX );
mvr2r( renderConfig.room_acoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX );
+ mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 );
return IVAS_ERR_OK;
}
@@ -3885,19 +3914,13 @@ int16_t IVAS_REND_FeedRenderConfig(
*-------------------------------------------------------------------*/
ivas_error IVAS_REND_SetHeadRotation(
- IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
-#ifdef TD5
+ IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */
- const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */
-#else
- const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */
-#endif
+ const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */
)
{
int16_t i;
-#ifdef FIX_I109_ORIENTATION_TRACKING
IVAS_QUATERNION rotQuat;
-#endif
/* Validate function arguments */
if ( hIvasRend == NULL )
@@ -3920,7 +3943,6 @@ ivas_error IVAS_REND_SetHeadRotation(
hIvasRend->headRotData.headRotEnabled = 1;
for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i )
{
-#ifdef FIX_I109_ORIENTATION_TRACKING
/* check for Euler angle signaling */
if ( headRot[i].w == -3.0f )
{
@@ -3932,12 +3954,7 @@ ivas_error IVAS_REND_SetHeadRotation(
}
ivas_orient_trk_Process( hIvasRend->headRotData.hOrientationTracker, rotQuat, FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES, &hIvasRend->headRotData.headPositions[i] );
-#else
- hIvasRend->headRotData.headPositions[i] = headRot[i];
-#endif
-#ifdef TD5
hIvasRend->headRotData.Pos[i] = Pos[i];
-#endif
}
}
@@ -3945,7 +3962,6 @@ ivas_error IVAS_REND_SetHeadRotation(
}
-#ifdef FIX_I109_ORIENTATION_TRACKING
/*-------------------------------------------------------------------*
* IVAS_REND_SetOrientationTrackingMode()
*
@@ -3954,9 +3970,16 @@ ivas_error IVAS_REND_SetHeadRotation(
ivas_error IVAS_REND_SetOrientationTrackingMode(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
- const uint8_t otrMode /* i : Orientation tracking mode */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */
+#else
+ const uint8_t otrMode /* i : Orientation tracking mode */
+#endif
)
{
+#ifdef FIX_439_OTR_PARAMS
+ return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking );
+#else
OTR_TRACKING_T mode;
ivas_error error;
@@ -3973,14 +3996,12 @@ ivas_error IVAS_REND_SetOrientationTrackingMode(
case IVAS_ORIENT_TRK_REF:
mode = OTR_TRACKING_REF_ORIENT;
break;
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
case IVAS_ORIENT_TRK_REF_VEC:
mode = OTR_TRACKING_REF_VEC;
break;
case IVAS_ORIENT_TRK_REF_VEC_LEV:
mode = OTR_TRACKING_REF_VEC_LEV;
break;
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
case IVAS_ORIENT_TRK_NONE:
default:
mode = OTR_TRACKING_NONE;
@@ -3993,6 +4014,7 @@ ivas_error IVAS_REND_SetOrientationTrackingMode(
}
return IVAS_ERR_OK;
+#endif
}
@@ -4078,7 +4100,6 @@ ivas_error IVAS_REND_GetTrackedRotation(
}
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
/*---------------------------------------------------------------------*
* IVAS_REND_SetReferenceVector( )
*
@@ -4099,8 +4120,7 @@ ivas_error IVAS_REND_SetReferenceVector(
return ivas_orient_trk_SetReferenceVector( hIvasRend->headRotData.hOrientationTracker, listenerPos, refPos );
}
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif
+
#ifdef EXTERNAL_ORIENTATIONS
@@ -4523,7 +4543,6 @@ static ivas_error rotateFrameSba(
( 1 - headRotData->crossfade[i] ) * gains_prev[n][m] * ( *readPtr );
}
}
-#ifdef FIX_376_SBA_ROTATE
/* write back the result */
for ( n = m1; n < m2; n++ )
{
@@ -4532,18 +4551,7 @@ static ivas_error rotateFrameSba(
}
m1 = m2;
m2 += 2 * ( l + 1 ) + 1;
-#endif
- }
-#ifndef FIX_376_SBA_ROTATE
- /* write back the result */
- for ( n = m1; n < m2; n++ )
- {
- writePtr = getSmplPtr( outAudio, n, subframe_idx * subframe_len + i );
- ( *writePtr ) = tmpRot[n - m1];
}
- m1 = m2;
- m2 += 2 * ( l + 1 ) + 1;
-#endif
}
/*unoptimized code for reference (full matrix multiplication)*/
@@ -4584,7 +4592,6 @@ static ivas_error renderIsmToBinaural(
copyBufferTo2dArray( ismInput->base.inputBuffer, tmpTDRendBuffer );
- /* TODO tmu : missing: interpolation between positions, 5ms rendering */
if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper,
ismInput->base.inConfig,
NULL,
@@ -4630,6 +4637,14 @@ static ivas_error renderIsmToBinauralRoom(
#else
IVAS_QUATERNION quat;
#endif
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS];
+
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpRendBuffer[i] = tmpRendBuffer[i];
+ }
+#endif
push_wmops( "renderIsmToBinauralRoom" );
@@ -4661,7 +4676,6 @@ static ivas_error renderIsmToBinauralRoom(
{
copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer );
- /* TODO tmu : missing: interpolation between positions, 5ms rendering */
if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper,
ismInput->base.inConfig,
NULL,
@@ -4719,9 +4733,9 @@ static ivas_error renderIsmToBinauralRoom(
(void) subframe_len; // avoid warning
}
- /* TODO tmu : missing: interpolation between positions, 5ms rendering */
- /* TODO(sgi): Possible optimization: less processing needed if position didn't change */
- /* TODO tmu2sgi: needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */
+ /* TODO tmu : see issue #518 */
+ /* Possible optimization: less processing needed if position didn't change
+ * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */
/* previous position gains */
#ifdef EXTERNAL_ORIENTATIONS
if ( combinedOrientationEnabled )
@@ -4788,8 +4802,13 @@ static ivas_error renderIsmToBinauralRoom(
copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer );
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM,
+ NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM,
NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -4816,17 +4835,26 @@ static ivas_error renderIsmToMc(
/* TODO(sgi): Possible optimization: less processing needed if position didn't change */
if ( *ismInput->base.ctx.pOutConfig == IVAS_REND_AUDIO_CONFIG_STEREO )
{
- set_zero( currentPanGains, 16 );
- ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth,
- ismInput->currentPos.elevation,
- ¤tPanGains[0],
- ¤tPanGains[1] );
-
- set_zero( previousPanGains, 16 );
- ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth,
- ismInput->previousPos.elevation,
- &previousPanGains[0],
- &previousPanGains[1] );
+ if ( ismInput->nonDiegeticPan )
+ {
+ previousPanGains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f;
+ previousPanGains[1] = currentPanGains[1] = 1.f - currentPanGains[0];
+ error = IVAS_ERR_OK;
+ }
+ else
+ {
+ set_zero( currentPanGains, 16 );
+ ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth,
+ ismInput->currentPos.elevation,
+ ¤tPanGains[0],
+ ¤tPanGains[1] );
+
+ set_zero( previousPanGains, 16 );
+ ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth,
+ ismInput->previousPos.elevation,
+ &previousPanGains[0],
+ &previousPanGains[1] );
+ }
}
else
{
@@ -5048,6 +5076,15 @@ static ivas_error renderMcToBinaural(
IVAS_REND_AudioConfig inConfig;
ivas_error error;
IVAS_REND_AudioBuffer tmpRotBuffer;
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS];
+ int16_t i;
+
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpRendBuffer[i] = tmpRendBuffer[i];
+ }
+#endif
push_wmops( "renderMcToBinaural" );
@@ -5095,8 +5132,13 @@ static ivas_error renderMcToBinaural(
}
/* call CREND */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
+ NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -5104,7 +5146,6 @@ static ivas_error renderMcToBinaural(
accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio );
- /* TODO tmu : needs delay compensation */
if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK )
{
return error;
@@ -5125,6 +5166,15 @@ static ivas_error renderMcToBinauralRoom(
IVAS_REND_AudioConfig inConfig;
ivas_error error;
IVAS_REND_AudioBuffer tmpRotBuffer;
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS];
+ int16_t i;
+
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpRendBuffer[i] = tmpRendBuffer[i];
+ }
+#endif
push_wmops( "renderMcToBinauralRoom" );
@@ -5171,8 +5221,13 @@ static ivas_error renderMcToBinauralRoom(
}
/* call CREND */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
+ NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -5180,7 +5235,6 @@ static ivas_error renderMcToBinauralRoom(
accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio );
- /* TODO tmu : needs delay compensation */
if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK )
{
return error;
@@ -5204,6 +5258,9 @@ static ivas_error renderMcCustomLsToBinauralRoom(
IVAS_REND_AudioBuffer tmpRotBuffer;
IVAS_REND_AudioBuffer tmpMcBuffer;
IVAS_REND_AudioBuffer *tmpBufPtr;
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS];
+#endif
push_wmops( "renderMcCustomLsToBinauralRoom" );
@@ -5211,6 +5268,13 @@ static ivas_error renderMcCustomLsToBinauralRoom(
headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled;
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpCrendBuffer[i] = tmpCrendBuffer[i];
+ }
+#endif
+
/* apply rotation */
if ( headRotEnabled )
{
@@ -5248,15 +5312,19 @@ static ivas_error renderMcCustomLsToBinauralRoom(
copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer );
/* call CREND */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL,
+ p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL,
tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio );
- /* TODO tmu : needs delay compensation */
if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK )
{
return error;
@@ -5448,12 +5516,22 @@ static ivas_error renderSbaToBinaural(
IVAS_REND_AudioBuffer outAudio )
{
float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k];
-
ivas_error error;
IVAS_REND_AudioBuffer tmpRotBuffer;
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS];
+ int16_t i;
+#endif
push_wmops( "renderSbaToBinaural" );
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpCrendBuffer[i] = tmpCrendBuffer[i];
+ }
+#endif
+
/* apply rotation */
if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled )
{
@@ -5481,8 +5559,13 @@ static ivas_error renderSbaToBinaural(
}
/* call CREND */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
+ NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ),
NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -5507,11 +5590,21 @@ static ivas_error renderSbaToBinauralRoom(
IVAS_REND_AudioBuffer tmpRotBuffer;
IVAS_REND_AudioBuffer tmpMcBuffer;
IVAS_REND_AudioBuffer *tmpBufPtr;
+#ifdef JBM_TSM_ON_TCS
+ float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS];
+#endif
tmpRotBuffer = outAudio; /* avoid compilation warning */
push_wmops( "renderSbaToBinauralRoom" );
+#ifdef JBM_TSM_ON_TCS
+ for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
+ {
+ p_tmpCrendBuffer[i] = tmpCrendBuffer[i];
+ }
+#endif
+
headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled;
/* apply rotation */
@@ -5554,8 +5647,13 @@ static ivas_error renderSbaToBinauralRoom(
copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer );
/* call CREND */
+#ifdef JBM_TSM_ON_TCS
+ if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ),
+ NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#else
if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ),
NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK )
+#endif
{
return error;
}
@@ -5656,34 +5754,39 @@ static void copyMasaMetadataToDiracRenderer(
DIRAC_DEC_HANDLE hDirAC )
{
int16_t band, sf, bin;
+ int16_t meta_write_index;
hDirAC->numSimultaneousDirections = meta->descriptive_meta.numberOfDirections + 1;
for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ )
{
+ meta_write_index = ( hDirAC->dirac_bs_md_write_idx + sf ) % hDirAC->dirac_md_buffer_length;
+
for ( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ )
{
for ( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1]; bin++ )
{
- hDirAC->azimuth[sf][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band];
- hDirAC->elevation[sf][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band];
- hDirAC->energy_ratio1[sf][bin] = meta->directional_meta[0].energy_ratio[sf][band];
- hDirAC->diffuseness_vector[sf][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band];
- hDirAC->spreadCoherence[sf][bin] = meta->directional_meta[0].spread_coherence[sf][band];
- hDirAC->surroundingCoherence[sf][bin] = meta->common_meta.surround_coherence[sf][band];
+ hDirAC->azimuth[meta_write_index][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band];
+ hDirAC->elevation[meta_write_index][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band];
+ hDirAC->energy_ratio1[meta_write_index][bin] = meta->directional_meta[0].energy_ratio[sf][band];
+ hDirAC->diffuseness_vector[meta_write_index][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band];
+ hDirAC->spreadCoherence[meta_write_index][bin] = meta->directional_meta[0].spread_coherence[sf][band];
+ hDirAC->surroundingCoherence[meta_write_index][bin] = meta->common_meta.surround_coherence[sf][band];
if ( hDirAC->numSimultaneousDirections == 2 )
{
- hDirAC->azimuth2[sf][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band];
- hDirAC->elevation2[sf][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band];
- hDirAC->energy_ratio2[sf][bin] = meta->directional_meta[1].energy_ratio[sf][band];
- hDirAC->diffuseness_vector[sf][bin] -= meta->directional_meta[1].energy_ratio[sf][band];
- hDirAC->spreadCoherence2[sf][bin] = meta->directional_meta[1].spread_coherence[sf][band];
+ hDirAC->azimuth2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band];
+ hDirAC->elevation2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band];
+ hDirAC->energy_ratio2[meta_write_index][bin] = meta->directional_meta[1].energy_ratio[sf][band];
+ hDirAC->diffuseness_vector[meta_write_index][bin] -= meta->directional_meta[1].energy_ratio[sf][band];
+ hDirAC->spreadCoherence2[meta_write_index][bin] = meta->directional_meta[1].spread_coherence[sf][band];
}
}
}
}
+ hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length;
+
return;
}
@@ -5696,7 +5799,6 @@ static void renderMasaToMc(
copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer );
copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC );
- /* TODO(sgi): Remove code duplication w.r.t. MASA rendering to other output configs */
if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC )
{
#ifdef EXTERNAL_ORIENTATIONS
@@ -5707,7 +5809,11 @@ static void renderMasaToMc(
}
else
{
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels );
+#else
ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 );
+#endif
}
accumulate2dArrayToBuffer( tmpBuffer, &outAudio );
@@ -5724,7 +5830,11 @@ static void renderMasaToSba(
copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer );
copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC );
+#ifdef JBM_TSM_ON_TCS
+ ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels );
+#else
ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 );
+#endif
accumulate2dArrayToBuffer( tmpBuffer, &outAudio );
@@ -5960,9 +6070,7 @@ void IVAS_REND_Close(
ivas_limiter_close( &hIvasRend->hLimiter );
-#ifdef FIX_I109_ORIENTATION_TRACKING
closeHeadRotation( hIvasRend );
-#endif
#ifdef EXTERNAL_ORIENTATIONS
ivas_external_orientation_close( &hIvasRend->hExternalOrientationData );
diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h
index b061f7f301053051b81f6c19766d68afab279506..4256e57b9e9664c73560ca13499663a903c5a8a3 100644
--- a/lib_rend/lib_rend.h
+++ b/lib_rend/lib_rend.h
@@ -134,7 +134,9 @@ typedef uint16_t IVAS_REND_InputId;
ivas_error IVAS_REND_Open(
IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */
const int32_t outputSampleRate, /* i : output sampling rate */
- const IVAS_REND_AudioConfig outConfig /* i : output audio config */
+ const IVAS_REND_AudioConfig outConfig, /* i : output audio config */
+ const int16_t nonDiegeticPan, /* i : non-diegetic object flag */
+ const float nonDiegeticPanGain /* i : non-diegetic panning gain */
);
/* Note: this will reset custom LFE routings set for any MC input */
@@ -143,7 +145,6 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(
const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */
);
-/* Support for custom HRTFs will be added in the future. */
/* Note: this affects output delay */
ivas_error IVAS_REND_SetCustomHrtf(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
@@ -229,7 +230,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata(
ivas_error IVAS_REND_InitConfig(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
- const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */
+ const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */
);
int16_t IVAS_REND_GetRenderConfig(
@@ -244,18 +245,17 @@ int16_t IVAS_REND_FeedRenderConfig(
ivas_error IVAS_REND_SetHeadRotation(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
-#ifdef TD5
const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */
- const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */
-#else
- const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : head positions for next rendering call */
-#endif
+ const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */
);
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error IVAS_REND_SetOrientationTrackingMode(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
- const uint8_t otrMode /* i : Orientation tracking mode */
+#ifdef FIX_439_OTR_PARAMS
+ const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */
+#else
+ const uint8_t otrMode /* i : Orientation tracking mode */
+#endif
);
ivas_error IVAS_REND_SetReferenceRotation(
@@ -273,14 +273,11 @@ ivas_error IVAS_REND_GetTrackedRotation(
IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer for processed rotation */
);
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
ivas_error IVAS_REND_SetReferenceVector(
IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */
const IVAS_VECTOR3 listenerPos, /* i : Listener position */
const IVAS_VECTOR3 refPos /* i : Reference position */
);
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
-#endif /* FIX_I109_ORIENTATION_TRACKING */
#ifdef EXTERNAL_ORIENTATIONS
ivas_error IVAS_REND_SetExternalOrientation(
diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c
index b27a8ceca6cf9ae990de7ff580a4eb53443307d9..0ed64d02c59f8a5b3a19c74c9e4986895ad6c5f1 100644
--- a/lib_util/audio_file_writer.c
+++ b/lib_util/audio_file_writer.c
@@ -98,11 +98,7 @@ ivas_error AudioFileWriter_open(
int8_t retCode;
-#ifdef FIX_I109_ORIENTATION_TRACKING
if ( ( fileNameLen > wavSuffixLen ) && ( strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 ) )
-#else
- if ( fileNameLen > wavSuffixLen && strncmp( fileName + fileNameLen - wavSuffixLen, wavSuffix, wavSuffixLen ) == 0 )
-#endif
{
retCode = AudioFileWriter_open_wav( self, fileName, sampleRate, numChannels );
}
@@ -155,7 +151,6 @@ ivas_error AudioFileWriter_write(
uint32_t numSamples )
{
ivas_error error = IVAS_ERR_OK;
-
if ( self->rawFile )
{
if ( fwrite( samples, sizeof( int16_t ), numSamples, self->rawFile ) != numSamples )
diff --git a/lib_util/cmdln_parser.c b/lib_util/cmdln_parser.c
index 200b8c86e9bf77bf6c38f39b0f444e4da097e59b..6ac2b0ec2d0ebf5e58c7637c5c00e3e813dd4444 100644
--- a/lib_util/cmdln_parser.c
+++ b/lib_util/cmdln_parser.c
@@ -31,6 +31,7 @@
*******************************************************************************************************/
#include "cmdln_parser.h"
+#include "cmdl_tools.h"
#include
#include
#include
@@ -119,7 +120,7 @@ static int16_t initOpts(
static int8_t stringLooksLikeOption(
const char *str )
{
- if ( str[0] == '-' )
+ if ( ( str[0] == '-' ) && is_number( str ) == false )
{
return 1;
}
@@ -130,7 +131,7 @@ static int8_t stringLooksLikeOption(
static const char *stringToOptionName(
const char *str )
{
- while ( *str == '-' )
+ while ( ( *str == '-' ) && ( ( str[1] != '0' ) || ( str[1] != '1' ) ) )
{
++str;
}
@@ -268,7 +269,7 @@ static const char *getBasename(
static int32_t totalOptionNameLength(
const OptionProps opt )
{
- return strlen( opt.match ) + strlen( opt.matchShort );
+ return (int32_t) ( strlen( opt.match ) + strlen( opt.matchShort ) );
}
static void printWhitespace(
diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c
index 2f653b7b253b6b929ef4f1cb5043dd69238d9f09..3fd6e4f4395bbe1ebdac6d97c8d33570f82729d6 100644
--- a/lib_util/head_rotation_file_reader.c
+++ b/lib_util/head_rotation_file_reader.c
@@ -93,43 +93,28 @@ ivas_error HeadRotationFileReader_open(
* Read values from the trajectory file
*-----------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error HeadRotationFileReading(
HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */
-#ifdef TD5
- IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */
- IVAS_POSITION *pPos /* o : listener position */
-#else
- IVAS_QUATERNION *pQuaternion /* o : head-tracking data */
-#endif
+ IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */
+ IVAS_VECTOR3 *pPos /* o : listener position */
)
{
float w, x, y, z;
-#ifdef TD5
float posx, posy, posz;
int32_t read_values;
posx = 0.0f;
posy = 0.0f;
posz = 0.0f;
-#endif
-#ifdef TD5
read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz );
if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */
-#else
- if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) )
-#endif
{
if ( feof( headRotReader->trajFile ) )
{
rewind( headRotReader->trajFile );
headRotReader->fileRewind = true;
-#ifdef TD5
return HeadRotationFileReading( headRotReader, pQuaternion, pPos );
-#else
- return HeadRotationFileReading( headRotReader, pQuaternion );
-#endif
}
return IVAS_ERR_FAILED_FILE_PARSE;
}
@@ -140,79 +125,16 @@ ivas_error HeadRotationFileReading(
pQuaternion->x = x;
pQuaternion->y = y;
pQuaternion->z = z;
-#ifdef TD5
if ( pPos != NULL )
{
pPos->x = posx;
pPos->y = posy;
pPos->z = posz;
}
-#endif
return IVAS_ERR_OK;
}
-#else
-ivas_error HeadRotationFileReading(
- HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */
- IVAS_QUATERNION *Quaternions, /* o : head-tracking data, listener orientation */
-#ifdef TD5
- IVAS_POSITION *Pos /* o : listener position */
-#else
- const int32_t frame_dec /* i : decoded frame number */
-#endif
-)
-{
- uint16_t i;
- float w, x, y, z;
-#ifdef TD5
- float posx, posy, posz;
- int32_t read_values;
-
- posx = 0.0f;
- posy = 0.0f;
- posz = 0.0f;
-#endif
-
- for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
- {
-#ifdef TD5
- read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz );
- if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */
-#else
- if ( 4 != fscanf( headRotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) )
-#endif
- {
- if ( feof( headRotReader->trajFile ) )
- {
- rewind( headRotReader->trajFile );
- headRotReader->fileRewind = true;
-#ifdef TD5
- return HeadRotationFileReading( headRotReader, Quaternions, Pos );
-#else
- return HeadRotationFileReading( headRotReader, Quaternions, frame_dec );
-#endif
- }
- return IVAS_ERR_FAILED_FILE_PARSE;
- }
-
- ( headRotReader->frameCounter )++;
-
- Quaternions[i].w = w;
- Quaternions[i].x = x;
- Quaternions[i].y = y;
- Quaternions[i].z = z;
-#ifdef TD5
- Pos[i].x = posx;
- Pos[i].y = posy;
- Pos[i].z = posz;
-#endif
- }
-
- return IVAS_ERR_OK;
-}
-#endif
-
/*-----------------------------------------------------------------------*
* HeadRotationFileReader_close()
diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h
index 05e27417c9955eb14f8089a2d9e41f4a98b27692..3c82f06403d25a5d5382e96261d832ec310328ff 100644
--- a/lib_util/head_rotation_file_reader.h
+++ b/lib_util/head_rotation_file_reader.h
@@ -58,27 +58,11 @@ ivas_error HeadRotationFileReader_open(
* Read values from the trajectory file
*-----------------------------------------------------------------------*/
-#ifdef FIX_I109_ORIENTATION_TRACKING
ivas_error HeadRotationFileReading(
HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */
-#ifdef TD5
- IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */
- IVAS_POSITION *pPos /* o : listener position */
-#else
- IVAS_QUATERNION *pQuaternion /* o : head-tracking data */
-#endif
+ IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */
+ IVAS_VECTOR3 *pPos /* o : listener position */
);
-#else
-ivas_error HeadRotationFileReading(
- HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */
- IVAS_QUATERNION *Quaternions, /* o : head-tracking data */
-#ifdef TD5
- IVAS_POSITION *Pos /* o : listener position */
-#else
- const int32_t frame_dec /* i : decoded frame number */
-#endif
-);
-#endif
/*-----------------------------------------------------------------------*
* HeadRotationFileReader_close()
diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c
index b7ffe8168201577d495040cf84e2e20ac6b51add..d2f923bfeb791535c786f4dfbb90c9bd30345abd 100644
--- a/lib_util/hrtf_file_reader.c
+++ b/lib_util/hrtf_file_reader.c
@@ -195,7 +195,12 @@ static ivas_error check_hrtf_binary_header(
}
/* Check the output format of the decoder */
+
+#ifdef UPDATE_SBA_FILTER
+ if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) )
+#else
if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) )
+#endif
{
return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (input audio configuration)" );
}
@@ -974,6 +979,31 @@ static ivas_error init_fastconv_HRTF_handle(
set_zero( hHrtf->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS );
}
}
+#ifdef UPDATE_SBA_FILTER
+ hHrtf->FASTCONV_HOA2_latency_s = 0;
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < 9; j++ )
+ {
+ set_zero( hHrtf->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS );
+ }
+ }
+ hHrtf->FASTCONV_FOA_latency_s = 0;
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < 4; j++ )
+ {
+ set_zero( hHrtf->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS );
+ set_zero( hHrtf->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS );
+ }
+ }
+#endif
+
hHrtf->FASTCONV_BRIR_latency_s = 0;
for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
@@ -1078,7 +1108,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata(
}
}
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 )
+#else
if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
/* HRIR_HOA3 */
( *hHRTF )->FASTCONV_HOA3_latency_s = *( (float *) ( hrtf_data_rptr ) );
@@ -1129,8 +1163,116 @@ static ivas_error create_fastconv_HRTF_from_rawdata(
}
}
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 )
+ {
+ /* HRIR_HOA2 */
+ ( *hHRTF )->FASTCONV_HOA2_latency_s = *( (float *) ( hrtf_data_rptr ) );
+ hrtf_data_rptr += sizeof( float );
+
+ if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" );
+ }
+ hrtf_data_rptr += sizeof( uint16_t );
+
+ if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" );
+ }
+ hrtf_data_rptr += sizeof( uint16_t );
+
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->leftHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->leftHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->rightHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->rightHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ }
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA )
+ {
+ /* HRIR_FOA */
+ ( *hHRTF )->FASTCONV_FOA_latency_s = *( (float *) ( hrtf_data_rptr ) );
+ hrtf_data_rptr += sizeof( float );
+
+ if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" );
+ }
+ hrtf_data_rptr += sizeof( uint16_t );
+
+ if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) )
+ {
+ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" );
+ }
+ hrtf_data_rptr += sizeof( uint16_t );
+
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->leftHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->leftHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->rightHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < HRTF_SH_CHANNELS; j++ )
+ {
+ memcpy( ( *hHRTF )->rightHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) );
+ hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float );
+ }
+ }
+ }
+#endif
/* BRIR */
+#ifdef UPDATE_SBA_FILTER
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED )
+#else
if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED )
+#endif
{
( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) );
hrtf_data_rptr += sizeof( float );
@@ -1488,10 +1630,24 @@ ivas_error create_SetOfHRTF_from_binary(
{
hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined );
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 )
+#else
else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 );
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 )
+ {
+ hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 );
+ }
+ else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA )
+ {
+ hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa );
+ }
+#endif
}
else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
{
@@ -1598,6 +1754,10 @@ ivas_error destroy_SetOfHRTF(
{
destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) );
destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) );
+#ifdef UPDATE_SBA_FILTER
+ destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) );
+ destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) );
+#endif
destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) );
}
diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c
index d60a7c1984be63283863b8298b01ebd333f5222d..7054d2081bc8b4f59ceef6574eb71efc08ac0dfd 100644
--- a/lib_util/ism_file_reader.c
+++ b/lib_util/ism_file_reader.c
@@ -35,14 +35,9 @@
#include
#include
-
-#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */
-#ifdef TD5
-#define NUM_ISM_METADATA_PER_LINE 7 /* Number of ISM metadata per line in a metadata file */
-#define NUM_MIN_ISM_METADATA 2 /* Minimum number of metadata parameters (azimuth and elevation) */
-#else
-#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */
-#endif
+#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */
+#define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */
+#define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */
struct IsmFileReader
@@ -100,20 +95,16 @@ ivas_error IsmFileReader_readNextFrame(
{
char char_buff[META_LINE_LENGTH];
float meta_prm[NUM_ISM_METADATA_PER_LINE];
-#ifdef TD5
- const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f };
-#endif
+ const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f };
char *char_ptr;
int16_t i;
FILE *file;
-#ifdef TD5
/* Set default metadata parameters */
for ( i = 0; i < NUM_ISM_METADATA_PER_LINE; i++ )
{
meta_prm[i] = meta_prm_default[i];
}
-#endif
if ( ismMetadata == NULL || self->file == NULL )
{
@@ -143,36 +134,28 @@ ivas_error IsmFileReader_readNextFrame(
meta_prm[i++] = (float) atof( char_ptr );
}
-#ifdef TD5
- /* Check if minimum number of metadata values were read. Additional values are ignored. */
- if ( i < NUM_MIN_ISM_METADATA )
-#else
- if ( i != NUM_ISM_METADATA_PER_LINE )
-#endif
- {
- /* Not enough values provided in one line */
- return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT;
- }
-
-#ifndef TD5
- if ( char_ptr != NULL )
+ /* Verify the number of metadata values. */
+ if ( i < NUM_MIN_ISM_METADATA || char_ptr != NULL )
{
- /* Too many values provided in one line */
+ /* Invalid number of metadata parameters (2-7 supported) */
return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT;
}
-#endif
ismMetadata->azimuth = meta_prm[0];
ismMetadata->elevation = meta_prm[1];
ismMetadata->radius = meta_prm[2];
ismMetadata->spread = meta_prm[3];
ismMetadata->gainFactor = meta_prm[4];
-#ifdef TD5
ismMetadata->yaw = meta_prm[5];
ismMetadata->pitch = meta_prm[6];
-#endif
+ ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7];
/* verify whether the read metadata values are in an expected range */
+ if ( ( ismMetadata->non_diegetic_flag ) != 0 && ( ismMetadata->non_diegetic_flag != 1 ) )
+ {
+ return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
+ }
+
if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 )
{
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
@@ -183,7 +166,7 @@ ivas_error IsmFileReader_readNextFrame(
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
}
- if ( ismMetadata->radius < 0 ) // Ivas_fmToDo: to be reviewed
+ if ( ismMetadata->radius < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */
{
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
}
@@ -197,7 +180,6 @@ ivas_error IsmFileReader_readNextFrame(
{
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
}
-#ifdef TD5
if ( ismMetadata->yaw > 180 || ismMetadata->yaw < -180 )
{
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
@@ -207,7 +189,6 @@ ivas_error IsmFileReader_readNextFrame(
{
return IVAS_ERR_ISM_INVALID_METADATA_VALUE;
}
-#endif
return IVAS_ERR_OK;
}
diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c
index 870cf335867073266763d2a454e6fc6b0a1fab14..ca845323e72b69afa5c0cd9c1bb1b7228c136676 100644
--- a/lib_util/ism_file_writer.c
+++ b/lib_util/ism_file_writer.c
@@ -36,9 +36,6 @@
#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */
-#ifndef TD5
-#define NUM_ISM_METADATA_PER_LINE 5 /* Number of ISM metadata per line in a metadata file */
-#endif
struct IsmFileWriter
@@ -66,7 +63,7 @@ ivas_error IsmFileWriter_open(
strncpy( metadata_filename_loc, filePathWav, sizeof( metadata_filename_loc ) - 1 );
snprintf( ext_meta, sizeof( ext_meta ), ".%d.csv", obj_num );
- const int32_t maxNumCharactersToAppend = (int32_t) sizeof( metadata_filename_loc ) - strlen( metadata_filename_loc ) - 1;
+ const int32_t maxNumCharactersToAppend = (int32_t) ( sizeof( metadata_filename_loc ) - strlen( metadata_filename_loc ) - 1 );
strncat( metadata_filename_loc, ext_meta, maxNumCharactersToAppend );
strcpy( filePath, metadata_filename_loc );
@@ -116,20 +113,7 @@ ivas_error IsmFileWriter_writeFrame(
file = ismWriter->file;
- /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */
-#ifdef FIX_293_EXT_RENDERER_CLI
-#ifdef TD5
- sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch );
-#else
- sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor );
-#endif
-#endif
-#ifdef TD5
- snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch );
-#else
- snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor );
-#endif
-
+ snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag );
if ( file )
{
fputs( char_buff, file );
diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c
index 19f12182f3ab11246cbe74ff5ddf2eec45a0ca89..90756a39b1ec5dcb33c3c2034f832ba5f1d9042e 100644
--- a/lib_util/masa_file_reader.c
+++ b/lib_util/masa_file_reader.c
@@ -84,7 +84,7 @@ MasaFileReader *MasaFileReader_open(
*------------------------------------------------------------------------*/
IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle(
- MasaFileReader *self /* i/o: MasaFileReader handle */
+ MasaFileReader *self /* i/o: MasaFileReader handle */
)
{
if ( self == NULL )
@@ -95,12 +95,13 @@ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle(
return &self->metadataFrame;
}
+
+#ifndef HR_METADATA
/*-------------------------------------------------------------------------
* deindex_sph_idx()
*
* deindex the MASA metadata from the input metadata file
*------------------------------------------------------------------------*/
-
static void deindex_sph_idx(
const uint16_t sphIndex, /* i : Spherical index */
const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */
@@ -249,6 +250,7 @@ static void deindex_sph_idx(
return;
}
+#endif
/*-------------------------------------------------------------------------
@@ -342,6 +344,9 @@ ivas_error MasaFileReader_readNextFrame(
for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ )
{
deindex_sph_idx( readIndex[b], &self->sph_grid16, &( hMeta->directional_meta[i].elevation[j][b] ), &( hMeta->directional_meta[i].azimuth[j][b] ) );
+#ifdef HR_METADATA
+ hMeta->directional_meta[i].spherical_index[j][b] = readIndex[b];
+#endif
}
/* Direct-to-total ratio */
@@ -412,7 +417,7 @@ ivas_error MasaFileReader_readNextFrame(
*------------------------------------------------------------------------*/
void MasaFileReader_close(
- MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */
+ MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */
)
{
if ( selfPtr == NULL || *selfPtr == NULL )
diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c
index 74429f9185c07ad0367325e2377112850389ac2b..e7f3aca0b69b6089973f63ca433d33df36aa73c6 100644
--- a/lib_util/masa_file_writer.c
+++ b/lib_util/masa_file_writer.c
@@ -32,15 +32,12 @@
#include "masa_file_writer.h"
#include "ivas_stat_com.h"
-#ifdef FIX_350_MASA_DELAY_COMP
#include "ivas_stat_dec.h"
-#endif
#include "ivas_cnst.h"
#include
#include
#include
-#ifdef FIX_350_MASA_DELAY_COMP
typedef struct masaMetaDelayStorage
{
MASA_DECRIPTIVE_META descriptiveMeta;
@@ -51,26 +48,18 @@ typedef struct masaMetaDelayStorage
uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS];
} MASA_META_DELAY_STORAGE;
-#endif
struct MasaFileWriter
{
FILE *file;
char *file_path;
-#ifdef FIX_350_MASA_DELAY_COMP
MASA_META_DELAY_STORAGE *delayStorage;
-#endif
};
/*-----------------------------------------------------------------------*
* Local constants
*-----------------------------------------------------------------------*/
-#ifndef FIX_350_MASA_DELAY_COMP
-#ifndef FIX_373_MASA_DELAY_COMP_MSAN
-#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */
-#endif
-#endif
/*-----------------------------------------------------------------------*
* Local functions
@@ -95,7 +84,6 @@ static void getExtMasaMetadataFileName(
return;
}
-#ifdef FIX_350_MASA_DELAY_COMP
static void delayMasaMetadata(
MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o : New input metadata which is inplace replaced with delayed metadata frame */
MASA_META_DELAY_STORAGE *delayStorage /* i/o : Storage for 10 ms of metadata and related descriptive metadata */
@@ -152,7 +140,6 @@ static void delayMasaMetadata(
return;
}
-#endif
/*---------------------------------------------------------------------*
* MasaFileWriter_open()
@@ -161,11 +148,9 @@ static void delayMasaMetadata(
*---------------------------------------------------------------------*/
ivas_error MasaFileWriter_open(
- const char *outputWavFilename, /* i : name of the output audio file */
-#ifdef FIX_350_MASA_DELAY_COMP
+ const char *outputWavFilename, /* i : name of the output audio file */
const bool delayCompensationEnabled, /* i : is delay compensation enabled */
-#endif
- MasaFileWriter **masaWriter /* o : MasaFileWriter handle */
+ MasaFileWriter **masaWriter /* o : MasaFileWriter handle */
)
{
MasaFileWriter *self;
@@ -191,12 +176,10 @@ ivas_error MasaFileWriter_open(
self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 );
strcpy( self->file_path, filePath );
-#ifdef FIX_350_MASA_DELAY_COMP
if ( !delayCompensationEnabled )
{
self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 );
}
-#endif
*masaWriter = self;
@@ -211,12 +194,8 @@ ivas_error MasaFileWriter_open(
*---------------------------------------------------------------------*/
ivas_error MasaFileWriter_writeFrame(
- MasaFileWriter *self, /* i/o: MasaFileWriter handle */
-#ifdef FIX_350_MASA_DELAY_COMP
+ MasaFileWriter *self, /* i/o: MasaFileWriter handle */
MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */
-#else
- IVAS_MASA_QMETADATA_HANDLE hMasaQMetadata /* i/o: MASA qMetadata handle to be written */
-#endif
)
{
if ( self == NULL )
@@ -224,29 +203,10 @@ ivas_error MasaFileWriter_writeFrame(
return IVAS_ERR_UNEXPECTED_NULL_POINTER;
}
-#ifdef FIX_350_MASA_DELAY_COMP
uint16_t descMetaTemp = 0;
int16_t i, sf, dir, numDirections;
uint8_t writeTempOther[MASA_FREQUENCY_BANDS];
-#else
- const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */
- uint16_t descMetaTemp = 0;
- int16_t i, sf, b_old, b_new, dir;
- uint16_t writeTempIndex[MASA_FREQUENCY_BANDS];
- uint8_t writeTempOther[MASA_FREQUENCY_BANDS];
- MASA_DECRIPTIVE_META descMeta;
- int16_t *bandMap;
- uint8_t numCodingBands;
- uint8_t numDirections;
- int16_t nchan_transport;
-
- numDirections = (uint8_t) hMasaQMetadata->no_directions;
- numCodingBands = hMasaQMetadata->numCodingBands;
- bandMap = hMasaQMetadata->bandMap;
- nchan_transport = hMasaQMetadata->nchan_transport;
-#endif
-
-#ifdef FIX_350_MASA_DELAY_COMP
+
/* If delay storage has been reserved, then we are in the normal mode for the decoder
* (i.e., no delay compensation for PCM) which means that metadata should be delayed
* by two subframes (10 ms). Descriptive metadata is a combined result. */
@@ -282,47 +242,6 @@ ivas_error MasaFileWriter_writeFrame(
descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelAngle << 6u;
/* 6 LSB remain at zero */
}
-#else
- /* Construct descriptive meta */
- for ( i = 0; i < 8; i++ )
- {
- descMeta.formatDescriptor[i] = ivasmasaFormatDescriptor[i];
- descMeta.numberOfDirections = numDirections - 1;
- descMeta.numberOfChannels = (uint8_t) ( nchan_transport - 1 );
- /* Following correspond to "unknown" values until transmission is implemented */
- descMeta.sourceFormat = 0x0u;
- descMeta.transportDefinition = 0x0u;
- descMeta.channelAngle = 0x0u;
- descMeta.channelDistance = 0x0u;
- descMeta.channelLayout = 0x0u;
- }
-
- if ( fwrite( &( descMeta.formatDescriptor ), sizeof( uint8_t ), 8, self->file ) != 8 )
- {
- return IVAS_ERR_FAILED_FILE_WRITE;
- }
-
- descMetaTemp += descMeta.numberOfDirections << 15u;
- descMetaTemp += descMeta.numberOfChannels << 14u;
- descMetaTemp += descMeta.sourceFormat << 12u;
- if ( descMeta.sourceFormat == 0x0 || descMeta.sourceFormat == 0x1 )
- {
- descMetaTemp += descMeta.transportDefinition << 9u;
- descMetaTemp += descMeta.channelAngle << 6u;
- descMetaTemp += descMeta.channelDistance;
- }
- else if ( descMeta.sourceFormat == 0x2 )
- {
- descMetaTemp += descMeta.channelLayout << 9u;
- /* 9 LSB remain at zero */
- }
- else if ( descMeta.sourceFormat == 0x3 )
- {
- descMetaTemp += descMeta.transportDefinition << 9u;
- descMetaTemp += descMeta.channelAngle << 6u;
- /* 6 LSB remain at zero */
- }
-#endif
if ( fwrite( &( descMetaTemp ), sizeof( uint16_t ), 1, self->file ) != 1 )
{
@@ -334,73 +253,19 @@ ivas_error MasaFileWriter_writeFrame(
for ( dir = 0; dir < numDirections; dir++ )
{
/* Spherical index */
-#ifdef FIX_350_MASA_DELAY_COMP
if ( fwrite( hMasaExtOutMeta->directionIndex[dir][sf], sizeof( uint16_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#else
- for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
- {
- writeTempIndex[i] = SPH_IDX_FRONT;
- }
-
- for ( b_old = 0; b_old < numCodingBands; b_old++ )
- {
- for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
- {
- writeTempIndex[b_new] = hMasaQMetadata->q_direction[dir].band_data[b_old].spherical_index[sf];
- }
- }
-
- if ( fwrite( writeTempIndex, sizeof( uint16_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#endif
{
return IVAS_ERR_FAILED_FILE_WRITE;
}
/* Direct-to-total ratio */
-#ifdef FIX_350_MASA_DELAY_COMP
if ( fwrite( hMasaExtOutMeta->directToTotalRatio[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#else
- for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
- {
- writeTempOther[i] = 0;
- }
-
- for ( b_old = 0; b_old < numCodingBands; b_old++ )
- {
- for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
- {
- writeTempOther[b_new] = (uint8_t) floorf( hMasaQMetadata->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
- }
- }
-
- if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#endif
{
return IVAS_ERR_FAILED_FILE_WRITE;
}
/* Spread coherence */
-#ifdef FIX_350_MASA_DELAY_COMP
if ( fwrite( hMasaExtOutMeta->spreadCoherence[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#else
- for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
- {
- writeTempOther[i] = 0;
- }
-
- if ( hMasaQMetadata->q_direction[dir].coherence_band_data != NULL )
- {
- for ( b_old = 0; b_old < numCodingBands; b_old++ )
- {
- for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
- {
- writeTempOther[b_new] = hMasaQMetadata->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf];
- }
- }
- }
-
- if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#endif
{
return IVAS_ERR_FAILED_FILE_WRITE;
}
@@ -408,72 +273,23 @@ ivas_error MasaFileWriter_writeFrame(
/* Common spatial meta */
/* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */
-#ifdef FIX_350_MASA_DELAY_COMP
if ( fwrite( hMasaExtOutMeta->diffuseToTotalRatio[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#else
- for ( b_new = 0; b_new < MASA_FREQUENCY_BANDS; b_new++ )
- {
- writeTempOther[b_new] = UINT8_MAX;
- }
-
- for ( b_old = 0; b_old < numCodingBands; b_old++ )
- {
- for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
- {
- writeTempOther[b_new] = UINT8_MAX;
- for ( dir = 0; dir < numDirections; dir++ )
- {
- writeTempOther[b_new] -= (uint8_t) floorf( hMasaQMetadata->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX );
- }
- }
- }
-
- if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#endif
{
return IVAS_ERR_FAILED_FILE_WRITE;
}
/* Surround coherence */
-#ifdef FIX_350_MASA_DELAY_COMP
if ( fwrite( hMasaExtOutMeta->surroundCoherence[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#else
- /* Surround coherence */
- for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
- {
- writeTempOther[i] = 0;
- }
-
- if ( hMasaQMetadata->surcoh_band_data != NULL )
- {
- for ( b_old = 0; b_old < numCodingBands; b_old++ )
- {
- for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ )
- {
- writeTempOther[b_new] = hMasaQMetadata->surcoh_band_data[b_old].surround_coherence[sf];
- }
- }
- }
-
- if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
-#endif
{
return IVAS_ERR_FAILED_FILE_WRITE;
}
/* Remainder-to-total ratio */
/* This is zero after codec */
-#ifdef FIX_350_MASA_DELAY_COMP
for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ )
{
writeTempOther[i] = 0u;
}
-#else
- for ( b_new = 0; b_new < MASA_FREQUENCY_BANDS; b_new++ )
- {
- writeTempOther[b_new] = 0u;
- }
-#endif
if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS )
{
@@ -502,9 +318,7 @@ void MasaFileWriter_close(
fclose( ( *selfPtr )->file );
free( ( *selfPtr )->file_path );
-#ifdef FIX_350_MASA_DELAY_COMP
free( ( *selfPtr )->delayStorage );
-#endif
free( *selfPtr );
*selfPtr = NULL;
diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h
index cb7d8f3d1efdb608e5e880be8a18a49bd43bffec..62aa8c6b48c0c990138621689f05fc665cabe914 100644
--- a/lib_util/masa_file_writer.h
+++ b/lib_util/masa_file_writer.h
@@ -35,9 +35,7 @@
#include
#include "options.h"
-#ifdef FIX_350_MASA_DELAY_COMP
#include
-#endif
#include "common_api_types.h"
@@ -45,20 +43,14 @@ struct MasaFileWriter;
typedef struct MasaFileWriter MasaFileWriter;
ivas_error MasaFileWriter_open(
- const char *outputWavFilename, /* i : name of the output audio file */
-#ifdef FIX_350_MASA_DELAY_COMP
+ const char *outputWavFilename, /* i : name of the output audio file */
const bool delayCompensationEnabled, /* i : is delay compensation enabled */
-#endif
- MasaFileWriter **masaWriter /* o : MasaFileWriter handle */
+ MasaFileWriter **masaWriter /* o : MasaFileWriter handle */
);
ivas_error MasaFileWriter_writeFrame(
- MasaFileWriter *self, /* i/o: MasaFileWriter handle */
-#ifdef FIX_350_MASA_DELAY_COMP
+ MasaFileWriter *self, /* i/o: MasaFileWriter handle */
MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */
-#else
- IVAS_MASA_QMETADATA_HANDLE hMasaQMetadata /* i/o: MASA qMetadata handle to be written */
-#endif
);
void MasaFileWriter_close(
diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c
index 907d148a6e7523172e6e2e8aa28f287abf357d75..54f2d012ce7f06c567ba87d1e216e98680306845 100644
--- a/lib_util/render_config_reader.c
+++ b/lib_util/render_config_reader.c
@@ -522,7 +522,6 @@ ivas_error RenderConfigReader_read(
errorHandler( pValue, ERROR_VALUE_INVALID );
}
}
-#ifdef TD5
else if ( strcmp( item, "DIRECTIVITY" ) == 0 )
{
if ( read_vector( pValue, 3, hRenderConfig->directivity ) )
@@ -530,7 +529,6 @@ ivas_error RenderConfigReader_read(
errorHandler( item, ERROR_VALUE_INVALID );
}
}
-#endif
#ifdef DEBUGGING
else
{
diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h
index d0531eb6653c47288f7db1b6f1c84d454f55227d..393633a745a76f31626d9120f7112f99e8b775bf 100644
--- a/lib_util/tinywaveout_c.h
+++ b/lib_util/tinywaveout_c.h
@@ -205,7 +205,7 @@ static WAVEFILEOUT *CreateBWF(
wfch.blockAlignment = LittleEndian16( (int16_t) blockAlignment );
wfch.sampleRate = LittleEndian32( sampleRate );
wfch.bytesPerSecond = LittleEndian32( sampleRate * blockAlignment );
- /* tbd: wavfmt ext hdr here */
+ /* ToDo: tbd: wavfmt ext hdr here */
/* write to file */
self->fmtChunkOffset = ByteCnt;
ByteCnt += (uint32_t) fwrite( &wfch, 1, sizeof( wfch ), self->theFile );
@@ -490,6 +490,49 @@ static int32_t WriteWavShort(
return __TWO_SUCCESS;
}
+#ifdef DEBUG_JBM
+/* this function expects values in the 16 bit range +-32767/8 */
+static int32_t WriteWavFloat(
+ WAVEFILEOUT *self,
+ float sampleBuffer[],
+ uint32_t nSamples )
+{
+ uint32_t i;
+ int32_t err = __TWO_SUCCESS;
+
+ if ( !self )
+ {
+ return __TWO_ERROR;
+ }
+ if ( !sampleBuffer )
+ {
+ return __TWO_ERROR;
+ }
+ if ( __dataSizeChk( self, nSamples * sizeof( float ) ) )
+ {
+ return __TWO_ERROR;
+ }
+
+ for ( i = 0; i < nSamples; i++ )
+ {
+ if ( self->bps == 32 )
+ {
+ err = __WriteSample32( self, sampleBuffer[i] / 32768.0f );
+ }
+ else
+ {
+ err = __TWO_ERROR;
+ }
+ if ( err != __TWO_SUCCESS )
+ {
+ return err;
+ }
+ }
+
+ return __TWO_SUCCESS;
+}
+#endif
+
static int32_t CloseWav(
WAVEFILEOUT *self )
{
diff --git a/lib_util/tsm_scale_file_reader.c b/lib_util/tsm_scale_file_reader.c
new file mode 100644
index 0000000000000000000000000000000000000000..fbd1824d9dfd4d7219ad72c18549bc19a9d016a9
--- /dev/null
+++ b/lib_util/tsm_scale_file_reader.c
@@ -0,0 +1,148 @@
+/******************************************************************************************************
+
+ (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository. All Rights Reserved.
+
+ This software is protected by copyright law and by international treaties.
+ The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
+ Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
+ Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
+ Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
+ contributors to this repository retain full ownership rights in their respective contributions in
+ the software. This notice grants no license of any kind, including but not limited to patent
+ license, nor is any license granted by implication, estoppel or otherwise.
+
+ Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
+ contributions.
+
+ This software is provided "AS IS", without any express or implied warranties. The software is in the
+ development stage. It is intended exclusively for experts who have experience with such software and
+ solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
+ and fitness for a particular purpose are hereby disclaimed and excluded.
+
+ Any dispute, controversy or claim arising under or in relation to providing this software shall be
+ submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
+ accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
+ the United Nations Convention on Contracts on the International Sales of Goods.
+
+*******************************************************************************************************/
+
+#include "tsm_scale_file_reader.h"
+#include "cmdl_tools.h"
+#include
+#include
+#include
+
+struct TsmScaleFileReader
+{
+ FILE *file;
+ char *file_path;
+ bool fileRewind;
+};
+
+
+/*---------------------------------------------------------------------*
+ * TsmScaleFileReader_open()
+ *
+ * Allocates memory for an TsmScaleFileReader and opens the file at given path for reading.
+ *---------------------------------------------------------------------*/
+
+/*! r: JbmFileReader handle */
+TsmScaleFileReader *TsmScaleFileReader_open(
+ const char *filePath /* i : path to CA config file */
+)
+{
+ TsmScaleFileReader *self;
+ FILE *file;
+
+ if ( !filePath )
+ {
+ return NULL;
+ }
+
+ file = fopen( filePath, "rb" );
+
+ if ( !file )
+ {
+ return NULL;
+ }
+
+ self = calloc( sizeof( TsmScaleFileReader ), 1 );
+ self->file = file;
+ self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 );
+ strcpy( self->file_path, filePath );
+
+ return self;
+}
+
+
+/*---------------------------------------------------------------------*
+ * TsmScaleFileReader_readScale()
+ *
+ * Read TSM scale entry
+ *---------------------------------------------------------------------*/
+
+ivas_error TsmScaleFileReader_readScale(
+ TsmScaleFileReader *self, /* i/o: TsmScaleFileReader handle */
+ int16_t *scale /* o : scale */
+)
+{
+ int tmp;
+ if ( 1 != fscanf( self->file, "%d", &tmp ) )
+ {
+ if ( feof( self->file ) )
+ {
+ rewind( self->file );
+ self->fileRewind = true;
+ return TsmScaleFileReader_readScale( self, scale );
+ }
+ return IVAS_ERR_FAILED_FILE_PARSE;
+ }
+ *scale = (int16_t) tmp;
+ return IVAS_ERR_OK;
+}
+
+
+/*---------------------------------------------------------------------*
+ * JbmFileReader_close()
+ *
+ * De-allocates all underlying memory of an JbmFileReader.
+ *---------------------------------------------------------------------*/
+
+void TsmScaleFileReader_close(
+ TsmScaleFileReader **selfPtr /* i/o: pointer to JbmFileReader handle */
+)
+{
+ if ( selfPtr == NULL || *selfPtr == NULL )
+ {
+ return;
+ }
+
+ fclose( ( *selfPtr )->file );
+ free( ( *selfPtr )->file_path );
+ free( *selfPtr );
+ *selfPtr = NULL;
+
+ return;
+}
+
+
+/*---------------------------------------------------------------------*
+ * JbmFileReader_getFilePath()
+ *
+ *---------------------------------------------------------------------*/
+
+const char *TsmScaleFileReader_getFilePath(
+ TsmScaleFileReader *self /* i/o: JbmFileReader handle */
+)
+{
+ if ( self == NULL )
+ {
+ return NULL;
+ }
+
+ return self->file_path;
+}
diff --git a/scripts/pyaudio3dtools/quaternions/__init__.py b/lib_util/tsm_scale_file_reader.h
similarity index 62%
rename from scripts/pyaudio3dtools/quaternions/__init__.py
rename to lib_util/tsm_scale_file_reader.h
index 8f1f04c36906bb9a43d1c3226aca6eced4f63498..7a795a25cb27316f36acef8bb07dfe67c6dcbf4c 100644
--- a/scripts/pyaudio3dtools/quaternions/__init__.py
+++ b/lib_util/tsm_scale_file_reader.h
@@ -1,6 +1,5 @@
-#!/usr/bin/env python3
+/******************************************************************************************************
-"""
(C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
@@ -28,17 +27,41 @@
submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-"""
-Quaternions
-====
+*******************************************************************************************************/
-Provides
- Handling of quaternions in the same conventions as in IVAS and the Matlab scripts
+#ifndef IVAS_TSM_SCALE_FILE_READER_H
+#define IVAS_TSM_SCALE_FILE_READER_H
-Imports
--------
-functions
-"""
-from . import functions
+#include
+#include "common_api_types.h"
+#include "ivas_error.h"
+
+/* clang-format off */
+
+typedef struct TsmScaleFileReader TsmScaleFileReader;
+
+
+/*! r: TsmScaleFileReader handle */
+TsmScaleFileReader *TsmScaleFileReader_open(
+ const char *filePath /* i : path to TSM scale file */
+);
+
+ivas_error TsmScaleFileReader_readScale(
+ TsmScaleFileReader* self, /* i/o: TsmScaleFileReader handle */
+ int16_t *scale /* o : next scale */
+);
+
+void TsmScaleFileReader_close(
+ TsmScaleFileReader **selfPtr /* i/o: pointer to TsmScaleFileReader handle */
+);
+
+/*! r: path to the currently opened file or NULL if `self` is NULL */
+const char *TsmScaleFileReader_getFilePath(
+ TsmScaleFileReader* self /* i/o: TsmScaleFileReader handle */
+);
+
+
+/* clang-format on */
+
+#endif /* IVAS_TSM_SCALE_FILE_READER_H */
diff --git a/lib_util/vector3_pair_file_reader.c b/lib_util/vector3_pair_file_reader.c
index 1b8a95bc8802caedf0ca50a537928a6ff2622f34..9e03358b91c901e9c6f2875bb8f714cce00a86db 100644
--- a/lib_util/vector3_pair_file_reader.c
+++ b/lib_util/vector3_pair_file_reader.c
@@ -38,7 +38,6 @@
#include "prot.h"
#include "options.h" /* only included to get access to the feature-defines */
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
struct Vector3PairFileReader
{
@@ -162,5 +161,3 @@ const char *Vector3PairFileReader_getFilePath(
return reader->file_path;
}
-
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
diff --git a/lib_util/vector3_pair_file_reader.h b/lib_util/vector3_pair_file_reader.h
index a2fd706fc2243fa5e01ce8f2bf8d86278b284578..4ab687848c25265bc08fc33a7f2d5e474516e25b 100644
--- a/lib_util/vector3_pair_file_reader.h
+++ b/lib_util/vector3_pair_file_reader.h
@@ -37,7 +37,6 @@
#include "ivas_error.h"
#include "options.h" /* only included to get access to the feature-defines */
-#ifdef OTR_REFERENCE_VECTOR_TRACKING
typedef struct Vector3PairFileReader Vector3PairFileReader;
@@ -84,6 +83,5 @@ const char *Vector3PairFileReader_getFilePath(
Vector3PairFileReader *vector3PairReader /* i/o: Vector3PairFileReader handle */
);
-#endif /* OTR_REFERENCE_VECTOR_TRACKING */
#endif /* IVAS_V3PAIR_FILE_READER_H */
diff --git a/readme.txt b/readme.txt
index eeaea0f84a668c66907d2758d7566e778d49c188..21a5a19e7940665f7cf537520a0cf248466d22e7 100644
--- a/readme.txt
+++ b/readme.txt
@@ -123,32 +123,33 @@ should have the following structure:
|-- Workspace_msvc
|-- apps
|-- lib_com
-....|-- lib_debug
+ |-- lib_debug
|-- lib_dec
|-- lib_enc
+ |-- lib_rend
|-- lib_util
|-- scripts
-....|-- work_in_progress
- |-- readme_OSS.txt
- `-- readme.txt
+ |-- tests
+ |-- readme.txt
The package includes a Makefile for gcc, which has been verified on
32-bit Linux systems. The code can be compiled by entering the directory
-"c-code" and typing the command: make. The resulting encoder/decoder
-executables are named "IVAS_cod" and "IVAS_dec". Both reside in the c-code
-directory.
+"c-code" and typing the command: make. The resulting encoder/decoder/renderer
+executables are named "IVAS_cod", "IVAS_dec", and "IVAS_rend". All reside
+in the c-code directory.
The package also includes a solution-file for Microsoft Visual Studio 2017 (x86).
To compile the code, please open "Workspace_msvc\Workspace_msvc.sln" and build
"encoder" for the encoder and "decoder" for the decoder executable. The resulting
-encoder/decoder executables are named "IVAS_cod.exe" and "IVAS_dec.exe". Both reside
-in the c-code directory.
+encoder/decoder/renderer executables are named "IVAS_cod.exe", "IVAS_dec.exe",
+and "IVAS_rend.exe". All reside in the c-code directory.
RUNNING THE SOFTWARE
====================
The usage of the "IVAS_cod" program is as follows:
+--------------------------------------------------
Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file
@@ -161,9 +162,9 @@ R : Bitrate in bps,
for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250,
19850, 23050, 23850)
for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000,
- 96000, 128000, 160000, 192000, 256000)
- for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM,
- (24400, 32000, 48000, 64000, 80000, 96000, 128000)
+ 96000, 128000, 160000, 192000, 256000)
+ for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM,
+ (24400, 32000, 48000, 64000, 80000, 96000,128000)
for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000
for 3 ISM and 4 ISM also 384000
for 4 ISM also 512000
@@ -179,17 +180,17 @@ bitstream_file : Output bitstream filename
Options:
--------
EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc
--stereo [Mode] : Stereo format, default is unified stereo
- optional for Mode: 1: DFT Stereo, 2: TD Stereo, 3: MDCT Stereo
--ism Channels Files : ISM format
- where Channels specifies the number of ISMs (1-4)
+-stereo : Stereo format
+-ism [+]Ch Files : ISM format
+ where Ch specifies the number of ISMs (1-4)
+ where positive (+) indicates extended metadata (only 64 kbps and up)
and Files specify input files containing metadata, one file per object
(use NULL for no input metadata)
-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),
where Order specifies the Ambisionics order (1-3),
where positive (+) means full 3D and negative (-) only 2D/planar components to be coded
--masa Channels File : MASA format
- where Channels specifies the number of input/transport channels (1 or 2):
+-masa Ch File : MASA format
+ where Ch specifies the number of input/transport channels (1 or 2):
and File specifies input file containing parametric MASA metadata
-mc InputConf : Multi-channel format
where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4
@@ -213,13 +214,13 @@ EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba,
-mime : Mime output bitstream file format
The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format).
default output bitstream file format is G.192
--agc op : SBA Adaptive gain control, op = (0, 1), by default op is 0 or deactivated
-bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1
-q : Quiet mode, no frame counters
default is deactivated
The usage of the "IVAS_dec" program is as follows:
+--------------------------------------------------
Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file
Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file
@@ -255,22 +256,27 @@ Options:
Format files, the magic word in the mime file is used to determine
which of the two supported formats is in use.
default bitstream file format is G.192
--T File : Head rotation specified by external trajectory File
-hrtf File : HRTF filter File used in ISm format and BINAURAL output configuration
--FEC X : Insert frame erasures, X = 0-10 is the percentage
- of erased frames, or X may be the name of binary file or
- file with G192 headers indicating GOOD FRAME or BAD FRAME
- containing FEC pattern (short values of 0 (good) or 1 (bad))
- default is OFF, if this option is not used
--force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND),
--otr tracking_type : head orientation tracking type: 'ref' or 'avg' (only for binaural rendering)
+-T File : Head rotation specified by external trajectory File
+-otr tracking_type : Head orientation tracking type: 'none', 'ref', 'avg', 'ref_vec'
+ or 'ref_vec_lev' (only for binaural rendering)
+-rf File : Reference rotation specified by external trajectory file
+ works only in combination with '-otr ref' mode
+-rvf File : Reference vector specified by external trajectory file
+ works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes
-render_config File : Renderer configuration option File
--no_diegetic_pan : panning mono no dietic sound to stereo -1<= pan <=1,
- left or l or 1->left, right or r or -1->right, center or c or 0->middle
+-non_diegetic_pan P : panning mono non-diegetic sound to stereo -90<= P <=90,
+ left or l or 90->left, right or r or -90->right, center or c or 0->middle
-q : Quiet mode, no frame counter
default is deactivated
+The usage of the "IVAS_rend" program is as follows:
+---------------------------------------------------
+
+TBD
+
+
MULTICHANNEL LOUDSPEAKER INPUT / OUTPUT CONFIGURATIONS
======================================================
The loudspeaker positions for each MC layouts are assumed to have the following azimuth and elevation
@@ -353,7 +359,7 @@ stv2MASA2TC48c.wav - 2 channels (2 MASA transport channel), 48000 Hz, 48000 Hz,
For the MASA operation modes, in addition the following metadata files
-are required:
+located in /scripts/testv/ folder are required:
stv1MASA1TC48c.met
stv1MASA1TC48n.met
@@ -369,7 +375,7 @@ available at
https://www.3gpp.org/ftp/TSG_SA/WG4_CODEC/TSGS4_118-e/Docs/S4-220443.zip
For the ISM operation modes, in addition the following metadata files
-are required:
+located at /scripts/testv/ folder are required:
stvISM1.csv
stvISM2.csv
@@ -378,21 +384,40 @@ stvISM4.csv
These are comma separated files (csv) which indicate the per object position
in the format:
-frame azimuth, elevation, distance (unit circle), spread, gain
+frame azimuth, elevation, radius, spread, gain, yaw, pitch, non-diegetic
with the following meaning:
-| Parameter | format, value range | meaning
------------------------------------------------------------------------------------
-| azimuth | float, [-180,180[ | azimuth; positive indicates left
------------------------------------------------------------------------------------
-| elevation | float, [-90,90] | elevation; positive indicates up
------------------------------------------------------------------------------------
-| distance | float, tbd | distance; default: 1
------------------------------------------------------------------------------------
-| spread | float, [0,360] | spread in angles from 0...360 deg; default: 0
------------------------------------------------------------------------------------
-| gain | float, [0,1] | gain; default: 1
------------------------------------------------------------------------------------
+| Parameter | format, value range | meaning
+---------------------------------------------------------------------------------------------------
+| azimuth | float, [-180,180] | azimuth; positive indicates left; default: 0
+---------------------------------------------------------------------------------------------------
+| elevation | float, [-90,90] | elevation; positive indicates up; default: 0
+---------------------------------------------------------------------------------------------------
+| radius | float, [0, 15.75] | radius (extended metadata); default: 1
+---------------------------------------------------------------------------------------------------
+| spread | float, [0,360] | spread in angles from 0...360 deg; default: 0
+---------------------------------------------------------------------------------------------------
+| gain | float, [0,1] | gain; default: 1
+---------------------------------------------------------------------------------------------------
+| yaw | float, [-180,180] | yaw (extended metadata); positive indicates left; default: 0
+---------------------------------------------------------------------------------------------------
+| pitch | float, [-90,90] | pitch (extended metadata); positive indicates up; default: 0
+---------------------------------------------------------------------------------------------------
+| non-diegetic | float*, [0 1] | Flag for activation of non-diegetic rendering; default: 0
+| | if Flag is set to 1, panning gain is specified by azimuth.
+| | Value between [-90,90], 90 left, -90 right, 0 center
+---------------------------------------------------------------------------------------------------
+*Read as float value for convenience, but used as an integer flag internally.
+
+The metadata reader accepts 1-8 values specified per line. If a value is not specified, the default
+value is assumed.
+
+For the HRTF filter File option, external HRTF filter Files are available in folder
+/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data :
+
+ivas_binaural_16kHz.bin
+ivas_binaural_32kHz.bin
+ivas_binaural_48kHz.bin
For the Head rotation operation modes, external trajectory files are available:
@@ -403,6 +428,9 @@ headrot_case01_3000_q.csv
headrot_case02_3000_q.csv
headrot_case03_3000_q.csv
+For Reference vector specified by external trajectory file, example files are available at
+/scripts/trajectories folder.
+
For the Renderer configuration option operation modes, external configuration files are available:
@@ -415,5 +443,6 @@ config_renderer.cfg
==================
Additional scripts for item generation and codec testing are available
-in the directory scripts. Please refer to scripts/README.md for
-additional documentation.
+in the directories scripts and tests. Please refer to scripts/README.md, resp.
+tests/README.md for additional documentation.
+
diff --git a/scripts/README.md b/scripts/README.md
index fec54ffeac8a7929b329d55ecb72641eb79b0e22..4e8a9b366451700c6acd9a23cb7198235297b290 100644
--- a/scripts/README.md
+++ b/scripts/README.md
@@ -38,7 +38,6 @@ title: Python scripts for Testing the IVAS code and Generating test items
- [Python scripts for Testing the IVAS code and Generating test items](#python-scripts-for-testing-the-ivas-code-and-generating-test-items)
- [Contents](#contents)
- [0. Requirements](#0-requirements)
- - [- numpy and scipy for `generate_test_items.py`, `testBitexact.py` and `self_test.py`](#--numpy-and-scipy-for-generate_test_itemspy-testbitexactpy-and-self_testpy)
- [1. Scripts and classes for testing IVAS code](#1--scripts-and-classes-for-testing-ivas-code)
- [1.1 Classes](#11-classes)
- [1.2 Output directory structure](#12-output-directory-structure)
@@ -49,16 +48,6 @@ title: Python scripts for Testing the IVAS code and Generating test items
- [`IvasBuildAndRunChecks.py`](#ivasbuildandruncheckspy)
- [`testBitexact.py`](#testbitexactpy)
- [`self_test.py`](#self_testpy)
- - [2. Script for generating listening test items](#2-script-for-generating-listening-test-items)
- - [2.1. `generate_test_items.py`](#21-generate_test_itemspy)
- - [2.2. Test configuration file](#22-test-configuration-file)
- - [2.3. Supported test conditions](#23-supported-test-conditions)
- - [2.4. Supported input/output/rendered audio formats](#24-supported-inputoutputrendered-audio-formats)
- - [2.5. Processing](#25-processing)
- - [2.6. Renderer Metadata definition](#26-renderer-metadata-definition)
- - [3. Script for converting formats and binauralizing](#3-script-for-converting-formats-and-binauralizing)
- - [3.1. Binauralizing with head rotation](#31-binauralizing-with-head-rotation)
- - [3.2. Generating binaural reference signals](#32-generating-binaural-reference-signals)
---
@@ -441,216 +430,3 @@ Missing reference conditions and the test conditions are then generated and
the reference and test conditions are compared.
-----
-
-
-## 2. Script for generating listening test items
-
-The `generate_test_items.py` python script helps to quickly setup listening tests with multiple (pre-)processing and post-processing options.
-
-### 2.1. `generate_test_items.py`
-
-Script for generating (listening) test items.
-
-```
-usage: generate_test_items.py [-h] -i INFILE [INFILE ...]
-
-Generate test items
-
-optional arguments:
- -h, --help show this help message and exit
- -i INFILE [INFILE ...], --infile INFILE [INFILE ...]
- Configuration file(s): FILE1.json FILE2.json ...
-```
-
-Example how to call it:
-
-```
- python3 .\generate_test_items.py -i .\examples\my_test_config.json
-```
-
-Where `my_test_config.json` is a test configuration file in json format with fields explained in next section.
-
-### 2.2. Test configuration file
-
-This is the main file to edit in order to change global configuration options, detailed below.
-
-*NOTE: Paths specified in the JSON file are relative to the working directory where the script is executed from, NOT the location of the JSON file itself. It is possible (and recommended!) to use absolute paths instead to avoid confusion.*
-
-| key | values (example) | default | description |
-|---------------------------|:------------------:|:-------------:|-----------------------------------------------|
-| name | "my_test" | Required | name of the test session |
-| author | "myself" | | Author of the configuration file (optional) |
-| date | 20210205 | | Date of creation (optional) |
-| | | | |
-| enable_multiprocessing | True/False | True | Enables multiprocessing, recommended to set to True to make things fast. |
-| delete_tmp | True/False | False | Enables deletion of temporary directories (containing intermediate processing files, bitstreams and per-item logfiles etc.). |
-| | | | |
-| input_path | ./my_items/ | Required | Input directory with *.WAV, *.PCM or *.TXT files to process |
-| preproc_input | True/False | False | Whether to execute preprocessing on the input files |
-| in_format | HOA3 | Required | Input format for the conditions to generate, see spatial_audio_format |
-| in_fs | 32000 | 48000 | Input sampling rate for conditions to generate (assumed to be sampling-rate of input PCM files to process) |
-| input_select | ["in", "file2"] | Required | Filenames to filter in the input directory, can be a single value, an array or null. Only compares filenames (therefore "in" in this array would match both "in.wav" and "in.pcm") |
-| | | | |
-| concatenate_input | True/False | False | Whether to (horizontally) concatenate files in the input directory |
-| concat_silence_ms | [1000, 1000] | [0, 0] | Specifies the pre- and post-silence duration to pad concatenation with in ms. If a single value is specified it will be used for BOTH pre- and post-padding |
-| preproc_loudness | -26 | | Loudness to preprocess input to (dBov / LKFS depending on tool). Only processed if preproc_input is True. |
-| | | | |
-| output_path | ./out/ | | Output root directory hosting generated items & log |
-| out_fs | 48000 | 48000 | Output sampling rate for conditions to generate |
-| output_loudness | -26 | | Loudness level for output file (dBov / LKFS depending on tool). |
-| | | | |
-| renderer_format | 7_1_4 or CICP19 | Required | Format to be rendered (using offline rendering, will be bypassed if = out_format) |
-| binaural_rendered | True/False | False | Extra binauralization of the rendered outputs (using offline rendering) |
-| include_LFE | True/False | False | Whether to include LFE in binural rendering |
-| gain_factor | float value | 1.0 | Gain factor to be applied to LFE channel |
-| loudness_tool | "sv56demo" | "bs1770demo" | Tool to use for loudness adjustment. Currently only sv56demo and bs1770demo are supported for appropriate format configurations. Optionally can be a path to the binary. |
-| | | | |
-| lt_mode | "MUSHRA" | | Automatically generates a NAME.ltg file with generate_lt_file.py in output_path according to the specified mode |
-| conditions_to_generate | ["ref", "ivas"] | Required | list of conditions to be generated, for ivas and evs, multiple conditions can be specified with an \_ separator (i.e. "ivas_branch", "ivas_trunk" etc.) |
-| | | | |
-| ref | | | |
-| - out_fc | 32000 | 48000 | cut-off frequency to be applied to the reference condition in post |
-| ivas | | | |
-| - bitrates | [16400, 128000] | Required | Bitrate(s) used for IVAS encoder |
-| - enc_fs | 48000 | 48000 | Sampling rate for input to the encoder (pre-processing) |
-| - max_band | wb, swb, fb etc. | FB | Maximum encoded bandwidth |
-| - out_format | 7_1_4 or CICP19 | Required | Output format for IVAS, see spatial_audio_format |
-| - dec_fs | 48000 | 48000 | Sampling rate for decoder output |
-| - dtx | True/False | False | Enable DTX mode |
-| - head_tracking | True/False | False | Enable head tracking |
-| - ht_file | | "./trajectories/full_circle_in_15s" | Head rotation file |
-| - plc | True/False | False | Enables forward error correction `IVAS_dec -FEC X` |
-| - plc_rate | 0-10 | 10 | Percentage of erased frames |
-| - cod_bin | "../../../IVAS_cod"| "../IVAS_cod" | path to encoder binary |
-| - dec_bin | "../../../IVAS_dec"| "../IVAS_dec" | path to decoder binary |
-| - cod_opt | ["-ucct", "1"] | | list of additional encoder options |
-| - dec_opt | ["-q"] | | list of additional decoder options |
-| evs | | | |
-| - bitrates | [13200, 164000] | Required | Bitrate used for multi-stream EVS condition per stream/channel |
-| - enc_fs | 48000 | 48000 | Sampling rate for input to the encoder (pre-processing) |
-| - max_band | wb, swb, fb etc. | FB | Maximum encoded bandwidth |
-| - dec_fs | 48000 | 480000 | Sampling rate for decoder output |
-| - dtx | True/False | False | Enable DTX mode |
-| - cod_bin | ../../../IVAS_cod | "../IVAS_cod" | path to binary |
-| - dec_bin | ../../../IVAS_dec | "../IVAS_dec" | path to binary |
-| | | | |
-
----
-### 2.3. Supported test conditions
-
-The following conditions are the conditions which can be generated currently by `generate_test_items.py`.
-
-| Supported conditions | Description |
-|:--------------------:|-----------------------------------------------------------|
-| ref | Uncoded (reference) |
-| lp3k5 | Uncoded low-passed at 3.5 kHz (anchor) |
-| lp7k | Uncoded low-passed at 7 kHz (anchor) |
-| evs_mono | Coded with multi-stream EVS codec, !!metadata not coded!! |
-| ivas | Coded with IVAS codec |
-
-
-Multiple conditions for evs_mono and ivas can be specified by using underscore separators e.g. `"ivas_1" : {...}, "ivas_2" : {...}`
-(also see `test_SBA.json` for an example)
-
----
-
-### 2.4. Supported input/output/rendered audio formats
-
-| spatial_audio_format | Input/Ouput/Rendered | Description |
-|--------------------------------------------------|----------------------|------------------------------------------------|
-| MONO | yes/yes/yes | mono signals |
-| STEREO | yes/yes/yes | stereo signals |
-| ISM or ISMx | yes/no/no | Objects with metadata, description using renderer metadata |
-| MASA or MASAx | yes/no/no | mono or stereo signals with spatial metadata !!!metadata must share same basename as waveform file but with .met extension!!! |
-| FOA/HOA2/HOA3 or PLANAR(FOA/HOAx) | yes/yes/yes | Ambisonic signals or planar ambisonic signals |
-| BINAURAL/BINAURAL_ROOM | no/yes/yes | Binaural signals |
-| 5_1/5_1_2/5_1_4/7_1/7_1_4 or CICP[6/12/14/16/19] | yes/yes/yes | Multi-channel signals for predefined loudspeaker layout |
-| META | yes/yes/no | Audio scene described by a renderer config |
-
----
-
-### 2.5. Processing
-
-The processing chain is as follows:
-
-1. Preprocessing
- - **Condition**: `preproc_input == true`
- - Input files converted to `in_format`
-2. Processing
- - **Condition**: Performed depending on key in `conditions_to_generate`
- - Coding/decoding from `in_format` to `out_format`
-3. Postprocessing
- 1. Rendering to `renderer_format`
- - **Condition**: `out_format != renderer_format`
- - output files converted from `out_format` to `renderer_format`
- 1. Binaural Rendering
- - **Condition**: `binaural_rendered == true` and `out_format` is not a BINAURAL type
- - output files converted from `out_format` to `BINAURAL`
-
----
-
-### 2.6. Renderer Metadata definition
-
-To run, the renderer requires a config file describing the input scene.The expected format of the config file is as follows:
-
----
-
-- Line 1: Path to a "multitrack" audio file. This should be a single multichannel wav/pcm file that contains all input audio. For example channels 1-4 can be an FOA scene,channel 5 - an object and channels 6-11 - a 5.1 channel bed. If the path is not absolute, it is considered relative to the renderer executable, not the config file. This path has lower priority than the one given on the command line: *The path in the config file is ignored if the --inputAudio argument to the renderer executable is specified.*
-
----
-
-- Line 2: Contains number of inputs. An input can either be an Ambisonics scene, anobject or a channel bed.This is NOT the total number of channels in the input audio file.The renderer currently supports simultaneously: *Up to 2 SBA inputs, Up to 2 MC inputs* Up to 16 ISM inputsThese limits can be freely changed with pre-processor macros, if needed.
-
----
-- Following lines:
-Define each of the inputs. Inputs can be listed in any order - they are NOT required to be listed in the same order as in the audio file.
-Input definitions:
- - First line of an input definition contains the input type: SBA, MC or ISM.Following lines depend on the input type:SBAIndex of the first channel of this input in the multitrack file (1-indexed)Ambisonics orderMCIndex of the first channel of this input in the multitrack file (1-indexed)CICP index of the speaker layoutISMIndex of this input's audio in the multitrack file (1-indexed)Path to ISM metadata file (if not absolute, relative to executable location)ORISMIndex of this input's audio in the multitrack file (1-indexed)Number N of positions defined, followed by N lines in form:
-stay in position for x frames, azimuth, elevation(ISM position metadata defined this way is looped if there are more framesof audio than given positions)
-
----
-Example config
-The following example defines a scene with 4 inputs: *ISM with trajectory defined in a separate file. Channel 12 in the input file.* Ambisonics, order 1. Channels 1-4 in the input audio file. *CICP6 channel bed. Channels 5-10 in the input audio file.* ISM with 2 defined positions (-90,0) and (90,0). Channel 11 in the input file. The object will start at position (-90,0) and stay there for 5 frames, then move to (90,0) and stay there for 5 frames. This trajectory is looped over the duration of the input audio file.
-
-```
-./input_audio.wav4ISM12path/to/IVAS_ISM_metadata.csv
-3
-SBA
-1
-1
-MC
-5
-6
-ISM
-1
-1
-25,-90,05,90,
-```
-
-## 3. Script for converting formats and binauralizing
-
-The script audio3dtools.py can convert between different input and output formats and binauralize signals.
-
-Execute `python -m pyaudio3dtools.audio3dtools --help` for usage.
-
-### 3.1. Binauralizing with head rotation
-
-This example binauralizes a HOA3 signal with a head-rotation trajectory. Head rotation is peformed in SHD. It is supported for HOA3 and META input formats. For META input format, the audioscene is first prerendered to HOA3 and then rotated and binauralized.
-
-```
-python -m pyaudio3dtools.audio3dtools -i hoa3_input.wav -o . -F BINAURAL -T .\trajectories\full_circle_in_15s
-```
-
-### 3.2. Generating binaural reference signals
-
-Currently MC input signals are supported. The reference processing can be activated by selecting BINAURAL[_ROOM]_REF as output format. The signals are generated by convolving the channels with the filters from the database that are closes to the current position of the virtual LS. All interpolation methods supported by numpy can be chosen between the measured points along the trajectory.
-
-```
-python -m pyaudio3dtools.audio3dtools -i cicp6_input.wav -o . -F BINAURAL_REF -T .\trajectories\full_circle_in_15s
-```
-
-### 3.3. Rendering ISM to Custom loudspeakers with auxiliary binaural output
-ISM metadata can either be specified via an input text file in the Renderer Metadata definition format, or via the commandline using the same style as IVAS:
-```
-python -m pyaudio3dtools.audio3dtools -i ism2.wav -f ISM2 -m ism1.csv NULL -F 7_1_4 -o . -b -T .\trajectories\full_circle_in_15s
-```
diff --git a/scripts/batch_comp_audio.py b/scripts/batch_comp_audio.py
index 72ae3fcc7d6a506aea3d94386f0a02e5b77e1af1..97e9f8f54840f22f71fddb44ebd0bddd8fa486ce 100755
--- a/scripts/batch_comp_audio.py
+++ b/scripts/batch_comp_audio.py
@@ -96,10 +96,9 @@ def main(args):
if not args.diffs_only or diff > 0:
if diff == 0.0:
- label = "\033[00;32m[OKAY]\033[00;00m"
+ label = "[OKAY]"
else:
- label = "\033[00;31m[FAIL]\033[00;00m"
-
+ label = "[FAIL]"
result = f"{label} Max. diff (PCM) for file {f}: {diff}"
if args.verbose and diff != 0.0:
@@ -108,10 +107,10 @@ def main(args):
print(result, file=out_file)
- if num_files_diff > 0:
- print(f"{num_files_diff} files differ/don't exist", file=out_file)
- else:
- print(f"All files are bitexact", file=out_file)
+ if num_files_diff > 0:
+ print(f"{num_files_diff} files differ/don't exist", file=out_file)
+ else:
+ print(f"All files are bitexact", file=out_file)
def compare_files(f, fol1, fol2, outputs_dict):
diff --git a/scripts/binauralRenderer_interface/CMakeLists.txt b/scripts/binauralRenderer_interface/CMakeLists.txt
deleted file mode 100644
index 99d62c94172a328e0621e872bd097ef63e5929f4..0000000000000000000000000000000000000000
--- a/scripts/binauralRenderer_interface/CMakeLists.txt
+++ /dev/null
@@ -1,103 +0,0 @@
-cmake_minimum_required(VERSION 3.0)
-
-project(generate_crend_ivas_tables)
-
-set(EXTERNALS_PATH ${PROJECT_SOURCE_DIR}/Externals)
-set(IVAS_TRUNK_PATH "${PROJECT_SOURCE_DIR}/../..")
-set(IVAS_TRUNK_UTIL_PATH ${IVAS_TRUNK_PATH}/lib_util)
-set(IVAS_TRUNK_DEC_PATH ${IVAS_TRUNK_PATH}/lib_dec)
-set(IVAS_TRUNK_REND_PATH ${IVAS_TRUNK_PATH}/lib_rend)
-set(IVAS_TRUNK_ENC_PATH ${IVAS_TRUNK_PATH}/lib_enc)
-set(IVAS_TRUNK_COM_PATH ${IVAS_TRUNK_PATH}/lib_com)
-set(IVAS_TRUNK_DEBUG_PATH ${IVAS_TRUNK_PATH}/lib_debug)
-
-if(WIN32)
- find_path(ZLIB_DIR "zlib.h" ${EXTERNALS_PATH}/zlib/zlib-1.2.12)
-
- if(ZLIB_DIR)
- else()
- set(ZLIB_DIR ${EXTERNALS_PATH}/zlib)
- find_package(Python3 REQUIRED)
-
- if(Python3_Interpreter_FOUND)
- execute_process(COMMAND ${Python3_EXECUTABLE} resolve_build_dep.py
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- RESULT_VARIABLE py_result OUTPUT_VARIABLE ZLIB_DIR)
- set(ZLIB_DIR ${PROJECT_SOURCE_DIR} ${ZLIB_DIR})
- endif()
-
- message(STATUS " ZLIB_DIR: ${ZLIB_DIR}")
- endif()
-endif()
-
-if(WIN32)
- add_subdirectory(${ZLIB_DIR})
- set(ZLIB_INCLUDE_DIRS ${ZLIB_DIR} ${PROJECT_BINARY_DIR}/Externals/zlib/zlib-1.2.12)
- set(zlib zlibstatic)
- target_include_directories(example PUBLIC ${ZLIB_INCLUDE_DIRS})
- target_include_directories(minigzip PUBLIC ${ZLIB_INCLUDE_DIRS})
-endif()
-
-if(UNIX)
- find_package(ZLIB)
-
- if(ZLIB_FOUND)
- message(${ZLIB_INCLUDE_DIRS})
- message(${ZLIB_LIBRARIES})
- set(zlib ${ZLIB_LIBRARIES})
- else()
- message(FATAL_ERROR "Zlib not found")
- endif()
-endif()
-
-find_path(SOFA_READER_DIR "libmysofa.pc.cmake" ${EXTERNALS_PATH}/libmysofa)
-
-if(SOFA_READER_DIR)
-else()
- set(SOFA_READER_DIR ${EXTERNALS_PATH}/libmysofa)
- set(GIT_URL https://github.com/hoene/libmysofa.git)
- execute_process(COMMAND git clone ${GIT_URL} ${EXTERNALS_PATH}/libmysofa)
-endif()
-
-include_directories(${SOFA_READER_DIR}/src ${ZLIB_INCLUDE_DIRS} ${IVAS_TRUNK_UTIL_PATH} ${IVAS_TRUNK_ENC_PATH} ${IVAS_TRUNK_DEC_PATH} ${IVAS_TRUNK_REND_PATH} ${IVAS_TRUNK_COM_PATH} ${IVAS_TRUNK_DEBUG_PATH})
-
-option(BUILD_TESTS "Build test programs" OFF)
-option(BUILD_SHARED_LIBS "Build shared library" OFF)
-add_subdirectory(${SOFA_READER_DIR})
-set(SOURCE_FILES_C
- ${PROJECT_SOURCE_DIR}/ivas_crend_binaural_filter_design.c
- ${IVAS_TRUNK_COM_PATH}/basop32.c
- ${IVAS_TRUNK_COM_PATH}/basop_mpy.c
- ${IVAS_TRUNK_COM_PATH}/enh40.c
- ${IVAS_TRUNK_COM_PATH}/fft.c
- ${IVAS_TRUNK_COM_PATH}/fft_rel.c
- ${IVAS_TRUNK_COM_PATH}/ifft_rel.c
- ${IVAS_TRUNK_COM_PATH}/ivas_mdft_imdft.c
- ${IVAS_TRUNK_COM_PATH}/rom_com.c
- ${IVAS_TRUNK_COM_PATH}/ivas_rom_com.c
- ${IVAS_TRUNK_COM_PATH}/tools.c
- ${IVAS_TRUNK_COM_PATH}/tns_base.c
-)
-
-set(SOURCE_FILES_H
- ${PROJECT_SOURCE_DIR}/ivas_crend_binaural_filter_design.c
- ${SOFA_READER_DIR}/src/hrtf/mysofa.h
- ${IVAS_TRUNK_REND_PATH}/ivas_stat_rend.h
- ${IVAS_TRUNK_DEC_PATH}/ivas_stat_dec.h
- ${IVAS_TRUNK_DEC_PATH}/stat_dec.h
- ${IVAS_TRUNK_COM_PATH}/options.h
- ${IVAS_TRUNK_COM_PATH}/ivas_cnst.h
- ${IVAS_TRUNK_COM_PATH}/cnst.h
- ${IVAS_TRUNK_COM_PATH}/prot.h
- ${IVAS_TRUNK_COM_PATH}/ivas_prot.h
- ${IVAS_TRUNK_COM_PATH}/common_api_types.h
-)
-
-add_library(${PROJECT_NAME}_lib STATIC ${SOURCE_FILES_C} ${SOURCE_FILES_H})
-
-add_executable(${PROJECT_NAME} generate_crend_ivas_tables_from_sofa.c)
-target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_lib mysofa-static ${zlib})
-
-if(WIN32)
- add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
-endif()
diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa
new file mode 100644
index 0000000000000000000000000000000000000000..7c30b0de53d5f79843a060a72cb6254b313d1d44
--- /dev/null
+++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be90326a0196b802502d2d93dcaacc2bcec15f6d79f1b8d4c7e69564f32e1132
+size 46952
diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa
new file mode 100644
index 0000000000000000000000000000000000000000..9d91f9a04dcb0004dfb1b8bb407d8281a09c48ad
--- /dev/null
+++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6acd3ec4d8e0d586dac663b53124a90be699244fa21107d553fca00af00fa373
+size 51905
diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa
new file mode 100644
index 0000000000000000000000000000000000000000..74e60618a02e695974dfdd09f1b85ab5dc1f18db
--- /dev/null
+++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:872b1d794d77f1987a38f20cc3cb5627aee67bfd01ed7a50ab3514e0accedea5
+size 58924
diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/CMakeLists.txt b/scripts/binauralRenderer_interface/Table_Format_Converter/CMakeLists.txt
deleted file mode 100644
index 259e3b97b6abc67129aca82147929a3841848e2a..0000000000000000000000000000000000000000
--- a/scripts/binauralRenderer_interface/Table_Format_Converter/CMakeLists.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-cmake_minimum_required(VERSION 3.6)
-
-project(tables_format_converter)
-
-if(WIN32)
- # MSVC compiler flags
- add_definitions(
- -D_CRT_SECURE_NO_WARNINGS
- )
-
- # CMake sets /W3 by default, until CMake version 3.15. Instead of setting /W4 separately, replace in existing settings
- string(REGEX REPLACE "/W3" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-endif()
-
-set(IVAS_PATH "${PROJECT_SOURCE_DIR}/../../..")
-set(IVAS_UTIL_PATH ${IVAS_PATH}/lib_util)
-set(IVAS_DEC_PATH ${IVAS_PATH}/lib_dec)
-set(IVAS_ENC_PATH ${IVAS_PATH}/lib_enc)
-set(IVAS_COM_PATH ${IVAS_PATH}/lib_com)
-set(IVAS_REND_PATH ${IVAS_PATH}/lib_rend)
-set(IVAS_DEBUG_PATH ${IVAS_PATH}/lib_debug)
-
-include_directories(${IVAS_UTIL_PATH} ${IVAS_ENC_PATH} ${IVAS_DEC_PATH} ${IVAS_COM_PATH} ${IVAS_REND_PATH} ${IVAS_DEBUG_PATH})
-
-set(SOURCE_FILES_C
- ${IVAS_REND_PATH}/ivas_rom_binauralRenderer.c
- ${IVAS_REND_PATH}/ivas_rom_binaural_crend_head.c)
-
-set(SOURCE_FILES_H
- ${IVAS_REND_PATH}/ivas_rom_binauralRenderer.h
- ${IVAS_REND_PATH}/ivas_rom_binaural_crend_head.h)
-
-add_library(${PROJECT_NAME}_lib STATIC ${SOURCE_FILES_C} ${SOURCE_FILES_H})
-
-add_executable(${PROJECT_NAME} generate_tables_from_rom_to_bin.c)
-target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_lib)
diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c
index a7d4391c7520be27e06d0127aecac706bc1d8b6d..6c0054ff6b5d7ef46829130c5a71ac00bd252214 100644
--- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c
+++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c
@@ -58,8 +58,12 @@
#define DEFAULT_BIN_FILE_EXT ".bin"
#define IVAS_NB_RENDERER_TYPE 7
-#define IVAS_NB_AUDIO_CONFIG 2
-#define IVAS_NB_SAMPLERATE 3
+#ifdef UPDATE_SBA_FILTER
+#define IVAS_NB_AUDIO_CONFIG 4
+#else
+#define IVAS_NB_AUDIO_CONFIG 2
+#endif
+#define IVAS_NB_SAMPLERATE 3
const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = {
RENDERER_BINAURAL_FASTCONV,
@@ -72,8 +76,15 @@ const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = {
};
const BINAURAL_INPUT_AUDIO_CONFIG input_cfgs[IVAS_NB_AUDIO_CONFIG] = {
BINAURAL_INPUT_AUDIO_CONFIG_COMBINED,
+#ifdef UPDATE_SBA_FILTER
+ BINAURAL_INPUT_AUDIO_CONFIG_HOA3,
+ BINAURAL_INPUT_AUDIO_CONFIG_HOA2,
+ BINAURAL_INPUT_AUDIO_CONFIG_FOA
+#else
BINAURAL_INPUT_AUDIO_CONFIG_HOA
+#endif
};
+
const int32_t sample_rates[IVAS_NB_SAMPLERATE] = { 48000, 32000, 16000 }; /* Hz */ /* 8000 Hz not supported by mdft */
#ifdef FILE_HEADER
@@ -323,7 +334,7 @@ int main( int argc, char *argv[] )
setOfHRTF[nbHRTF] = create_hrtf_tdrend( freq_ptr[k], &hrtf_size );
if ( hrtf_size == -1 )
{
- fprintf( stderr, "Creation of HRTF (%d, %d, %d) failed!\n\n", rend_types[i], input_cfgs[j], freq_ptr[k] );
+ fprintf( stderr, "Creation of HRTF (%d, %d) failed!\n\n", rend_types[i], freq_ptr[k] );
for ( l = 0; l < nbHRTF; l++ )
{
free( setOfHRTF[l] );
@@ -820,7 +831,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG
cldfb_nchan_max = CLDFB_NO_CHANNELS_MAX;
}
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 )
+#else
else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM )
{
@@ -832,6 +847,32 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG
hrtf_channels = HRTF_SH_CHANNELS;
num_taps = BINAURAL_NTAPS;
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 )
+ {
+ if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ /* No HOA2 BRIRs */
+ return NULL;
+ }
+
+ latency_s = FASTCONV_HOA2_latency_s;
+ hrtf_channels = 9;
+ num_taps = BINAURAL_NTAPS;
+ }
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA )
+ {
+ if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM )
+ {
+ /* No HOA2 BRIRs */
+ return NULL;
+ }
+
+ latency_s = FASTCONV_FOA_latency_s;
+ hrtf_channels = 4;
+ num_taps = BINAURAL_NTAPS;
+ }
+#endif
else
{
fprintf( stderr, "Unsupported renderer type in create_hrtf_fastconv()\n\n" );
@@ -943,7 +984,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG
}
}
// HRIR_HOA3
+#ifdef UPDATE_SBA_FILTER
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 )
+#else
else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float
hrtf_wptr += sizeof( float );
@@ -988,6 +1033,99 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG
}
}
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 )
+ {
+ memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float
+ hrtf_wptr += sizeof( float );
+
+ memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t
+ hrtf_wptr += sizeof( uint16_t );
+
+ memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t
+ hrtf_wptr += sizeof( uint16_t );
+
+ data_size_tmp = num_taps * sizeof( float );
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &leftHRIRReal_HOA2[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &leftHRIRImag_HOA2[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &rightHRIRReal_HOA2[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &rightHRIRImag_HOA2[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ }
+ // FOA
+ else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA )
+ {
+ memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float
+ hrtf_wptr += sizeof( float );
+
+ memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t
+ hrtf_wptr += sizeof( uint16_t );
+
+ memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t
+ hrtf_wptr += sizeof( uint16_t );
+
+ data_size_tmp = num_taps * sizeof( float );
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &leftHRIRReal_FOA[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &leftHRIRImag_FOA[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &rightHRIRReal_FOA[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ for ( i = 0; i < BINAURAL_CONVBANDS; i++ )
+ {
+ for ( j = 0; j < hrtf_channels; j++ )
+ {
+ memcpy( hrtf_wptr, &rightHRIRImag_FOA[i][j], data_size_tmp );
+ hrtf_wptr += data_size_tmp;
+ }
+ }
+ }
+#endif
// BRIR
else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED )
{
@@ -1191,7 +1329,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
{
if ( frequency == 48000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_48kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz );
@@ -1209,7 +1347,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
else if ( frequency == 32000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_32kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz );
@@ -1227,7 +1365,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
else if ( frequency == 16000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_16kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz );
@@ -1251,11 +1389,15 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
hrtf_table_dims_out.max_num_iterations_diffuse = 0;
hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 )
+#else
else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
if ( frequency == 48000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_48kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz );
@@ -1269,11 +1411,12 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
hrtf_table_dims_out.max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz;
+
result = 0;
}
else if ( frequency == 32000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_32kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz );
@@ -1291,7 +1434,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
else if ( frequency == 16000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_16kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz );
@@ -1315,6 +1458,118 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
hrtf_table_dims_out.max_num_iterations_diffuse = 0;
hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 )
+ {
+ if ( frequency == 48000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_48kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_48kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_48kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz;
+ result = 0;
+ }
+ else if ( frequency == 32000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_32kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_32kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_32kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz;
+ result = 0;
+ }
+ else if ( frequency == 16000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_16kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_16kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_16kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz;
+ result = 0;
+ }
+ hrtf_table_dims_out.max_num_ir = 9;
+ }
+ else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA )
+ {
+ if ( frequency == 48000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_48kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_48kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_48kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz;
+ result = 0;
+ }
+ else if ( frequency == 32000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_32kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_32kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_32kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz;
+ result = 0;
+ }
+ else if ( frequency == 16000 )
+ {
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s;
+ hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_16kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz );
+ hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz );
+ hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz );
+ hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz );
+ hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz );
+ hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_16kHz );
+ hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_16kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz );
+ hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz );
+
+ hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz;
+ result = 0;
+ }
+ hrtf_table_dims_out.max_num_ir = 4;
+ }
+#endif
}
else if ( rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM )
{
@@ -1322,7 +1577,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
{
if ( frequency == 48000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_48kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz );
@@ -1340,7 +1595,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
else if ( frequency == 32000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_32kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz );
@@ -1358,7 +1613,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
else if ( frequency == 16000 )
{
- hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s;
+ hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s;
hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_16kHz );
hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz );
hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz );
@@ -1382,7 +1637,11 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
hrtf_table_dims_out.max_num_iterations_diffuse = 0;
hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/
}
+#ifdef UPDATE_SBA_FILTER
+ else if ( ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) )
+#else
else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA )
+#endif
{
result = 0;
}
@@ -1458,6 +1717,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON
}
}
+
// Copy the results
if ( ( result == 0 ) && ( hrtf_table_ptrs != NULL ) )
{
diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt
similarity index 95%
rename from scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt
rename to scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt
index dda6738a9ae8ea0be8f875ef85b36fa0489b916b..8648ecb2e68fdcfc48d5da1b11e472af7a688e9d 100644
--- a/scripts/binauralRenderer_interface/Table_Format_Converter/table_format_converter_readme.txt
+++ b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt
@@ -57,4 +57,4 @@ Options :
-input_td_file_name : Name of input td file (without extension .bin, default = 'hrfilter_model').
For example :
-table_format_converter(.exe) -output_file_path './' -48 -input_td_file_path './../../../td_object_renderer/hrtf_data/Orange_53/' -input_td_file_name 'hrfilter_model_v002'
\ No newline at end of file
+tables_format_converter(.exe) -output_file_path './' -48 -input_td_file_path './../../../td_object_renderer/hrtf_data/Orange_53/' -input_td_file_name 'hrfilter_model_v002'
\ No newline at end of file
diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin
index b9a35aa26bc7f15ba44e953fa83c2d8187b657bb..980668c27e1882fb0c132062a37fcd29ca8e91ed 100644
--- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin
+++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:81d8c14bf10697a0353c15986fde3432df1b6909ea2d122ce3599b3655237d71
-size 2074176
+oid sha256:07d2de62c345650f19a404001c5502e64f72277e6c689064e204a7031779bc0e
+size 2072948
diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin
index 992a1c61fa8ed95135a85384bed269b083e76259..9659006ef602a63827eb5e19fdc2490d6670ff9d 100644
--- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin
+++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:16b993a0af01bf8b8289e554452e6d2c98e7b977bf2a40f0afd3ca7498d39f8b
-size 2578388
+oid sha256:d2c8461458ca23f86f592acf102edfec4eb80bbb935bb324e04ab1c535d0dd94
+size 2573320
diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin
index eaf5d445febfbea1a8684f56179927b5aaad710b..d2dee97c348e2f3a82f307b0d10b77bacc8a267f 100644
--- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin
+++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1a29e9692bd5be5e93358db63159f55851d12f66c0382ff14afb642090427685
-size 2860964
+oid sha256:80043c85556218c5444c87aa2a86498ab4158fc40c6f4c3190caa182af1553e5
+size 2852056
diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c
index 3f847f83cf30ff3f786f47463d308efc833afdbe..5858b430d90eec6d87925d0c45570f9687769799 100644
--- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c
+++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c
@@ -169,7 +169,9 @@ int main( int argc, char *argv[] )
char *lib_rend_path = NULL;
bool no_optim = false;
+ bool add_define = false;
int notEndingWithSeparator = 0;
+ char *sofa_name = NULL;
int i = 1;
/* Optional arguments */
@@ -194,6 +196,11 @@ int main( int argc, char *argv[] )
no_optim = true;
i++;
}
+ else if ( strcmp( to_upper( argv[i] ), "-ADD_DEFINE" ) == 0 )
+ {
+ add_define = true;
+ i++;
+ }
else
{
fprintf( stderr, "Unknown option: %s\n\n", argv[i] );
@@ -389,9 +396,44 @@ int main( int argc, char *argv[] )
int err = 0;
for ( ; i < argc; i++ )
{
+ if ( add_define )
+ {
+ fp = fopen( c_file_path, "a" );
+ if ( fp )
+ {
+ sofa_name = strrchr( argv[i], '/' );
+ size_t size_path = strlen( sofa_name );
+ sofa_name = malloc( sizeof( char ) * size_path - 5 );
+ strncpy( sofa_name, strrchr( argv[i], '/' ) + 1, size_path - 5 );
+ sofa_name[size_path - 6] = '\0';
+ fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) );
+ fclose( fp );
+ }
+ fp = fopen( h_file_path, "a" );
+ if ( fp )
+ {
+ fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) );
+ fclose( fp );
+ }
+ }
err = generate_crend_ivas_tables_from_sofa( argv[i], no_optim );
if ( err != 0 )
return err;
+ if ( add_define )
+ {
+ fp = fopen( c_file_path, "a" );
+ if ( fp )
+ {
+ fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) );
+ fclose( fp );
+ }
+ fp = fopen( h_file_path, "a" );
+ if ( fp )
+ {
+ fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) );
+ fclose( fp );
+ }
+ }
}
fp = fopen( h_file_path, "a" );
if ( fp )
@@ -812,7 +854,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim )
ivas_set_hrtf_fr( &hrtf_data, ivas_hrtf, frame_len );
}
-#ifdef FIX_BINAURAL_DELAY_PRECISION
+#ifdef UPDATE_SBA_FILTER
hrtf_data.latency_s += 0.000000001f;
#endif
@@ -992,8 +1034,9 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int
{
/* float latency_s; */
fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name );
-#ifdef FIX_BINAURAL_DELAY_PRECISION
- fprintf( fp, "\nconst float %s_%s_latency_s = %10.9ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s );
+#ifdef UPDATE_SBA_FILTER
+ fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s );
+ fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f );
#else
fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s );
#endif
diff --git a/scripts/config/ci_linux.json b/scripts/config/ci_linux.json
index 6bca2663d97b51ce5d632a329187122aaa92affe..1cb11417522c52ac297ddd41afe57f113efc8beb 100644
--- a/scripts/config/ci_linux.json
+++ b/scripts/config/ci_linux.json
@@ -10,8 +10,8 @@
"SBA": "/usr/local/testv/stv3OA48c.wav",
"MASA1TC1DIR": "/usr/local/testv/stv1MASA1TC48c.wav",
"MASA1TC2DIR": "/usr/local/testv/stv2MASA1TC48c.wav",
- "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48c.wav.wav",
- "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav.wav",
+ "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48c.wav",
+ "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav",
"5_1": "/usr/local/testv/stv51MC48c.wav",
"5_1_2": "/usr/local/testv/stv512MC48c.wav",
"5_1_4": "/usr/local/testv/stv514MC48c.wav",
diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json
new file mode 100644
index 0000000000000000000000000000000000000000..3436d9eaea7fe55a06f705250065e3e1c4930e07
--- /dev/null
+++ b/scripts/config/ci_linux_sidstart_test.json
@@ -0,0 +1,25 @@
+{
+ "afspPath": "not_needed",
+ "utilPath": "/tools",
+ "inpaths": {
+ "MONO": "/usr/local/testv/test_mono.wav",
+ "STEREO": "/usr/local/testv/test_stereo.wav",
+ "FOA": "/usr/local/ltv/ltv48_FOA.wav",
+ "HOA2": "/usr/local/ltv/ltv48_HOA2.wav",
+ "HOA3": "/usr/local/ltv/ltv48_HOA3.wav",
+ "SBA": "/usr/local/ltv/ltv48_HOA3.wav",
+ "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav",
+ "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav",
+ "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav",
+ "MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav",
+ "5_1": "/usr/local/testv/test_MC51.wav",
+ "5_1_2": "/usr/local/testv/test_MC51p2.wav",
+ "5_1_4": "/usr/local/testv/test_MC51p4.wav",
+ "7_1": "/usr/local/testv/test_MC71.wav",
+ "7_1_4": "/usr/local/testv/test_MC71p4.wav",
+ "ISM1": "/usr/local/testv/test_mono.wav",
+ "ISM2": "/usr/local/testv/test_ISM_2obj.wav",
+ "ISM3": "/usr/local/testv/test_ISM_3obj.wav",
+ "ISM4": "/usr/local/testv/test_ISM_4obj.wav"
+ }
+}
diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json
index a2adaa4ccf89ecb49200c245aa23c066ad78401e..97bfb263f80c27dd935d1ce9894378f4dd9357f2 100644
--- a/scripts/config/ivas_modes.json
+++ b/scripts/config/ivas_modes.json
@@ -964,6 +964,44 @@
]
}
},
+ "MASA_1TC_1DIR_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-masa",
+ "1"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "7_1_4": [],
+ "HOA3": [],
+ "mono": [],
+ "stereo": [],
+ "EXT": []
+ },
+ "in_config": "MASA1TC1DIR",
+ "table_name": "MASA 1TC 1DIR@{table_bitrate} kbps RS {bandwidth}",
+ "nummetadata": 1,
+ "metadatafilenames": [
+ "{item}.met"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ }
+ }
+
+ },
"MASA_2TC_1DIR_b{bitrate}_{bandwidth}_cbr": {
"encmodeoption": [
"-masa",
@@ -1034,6 +1072,46 @@
]
}
},
+ "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-masa",
+ "2"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "7_1_4": [],
+ "HOA3": [],
+ "mono": [],
+ "stereo": [],
+ "EXT": []
+ },
+ "in_config": "MASA2TC1DIR",
+ "table_name": "MASA 2TC 1DIR@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 1,
+ "metadatafilenames": [
+ "{item}.met"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_13k2_512k.bin"
+ }
+ }
+ },
"MASA_1TC_2DIR_b{bitrate}_{bandwidth}_cbr": {
"encmodeoption": [
"-masa",
@@ -1813,7 +1891,7 @@
"table_name": "ISM1@{table_bitrate} kbps {bandwidth}",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -1851,6 +1929,39 @@
]
}
},
+ "ISM1_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-ism",
+ "1"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM1",
+ "table_name": "ISM1@{table_bitrate} RS kbps {bandwidth}",
+ "nummetadata": 1,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_13k2_128k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_13k2_128k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_32k_128k.bin"
+ }
+ }
+ },
"ISM1_b{bitrate}_dtx_{bandwidth}_cbr": {
"encmodeoption": [
"-ism",
@@ -1868,7 +1979,7 @@
"table_name": "ISM1@{table_bitrate} kbps DTX {bandwidth}",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -1924,7 +2035,69 @@
"table_name": "ISM2@{table_bitrate} kbps {bandwidth}",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "swb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ]
+ }
+ },
+ "ISM2_b{bitrate}_dtx_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-dtx",
+ "-ism",
+ "2"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM2",
+ "table_name": "ISM2@{table_bitrate} kbps DTX {bandwidth}",
+ "nummetadata": 2,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -1968,6 +2141,39 @@
256000
]
}
+ },
+ "ISM2_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-ism",
+ "2"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM2",
+ "table_name": "ISM2@{table_bitrate} kbps RS {bandwidth}",
+ "nummetadata": 2,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_16k4_256k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_16k4_256k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_32k_256k.bin"
+ }
+ }
}
},
"ISM3": {
@@ -1987,7 +2193,7 @@
"table_name": "ISM3@{table_bitrate} kbps {bandwidth}",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -2050,7 +2256,7 @@
"table_name": "ISM3@{table_bitrate} kbps DTX {bandwidth}",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -2058,16 +2264,76 @@
"bitrates": {
"wb": [
24400,
- 32000
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
],
"swb": [
24400,
- 32000
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
],
"fb": [
- 32000
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
]
}
+ },
+ "ISM3_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-ism",
+ "3"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM3",
+ "table_name": "ISM3@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 3,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_24k4_384k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_24k4_384k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_32k_384k.bin"
+ }
+ }
}
},
"ISM4": {
@@ -2087,7 +2353,7 @@
"table_name": "ISM4@{table_bitrate} kbps {bandwidth}",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -2153,7 +2419,7 @@
"table_name": "ISM4@{table_bitrate} kbps DTX {bandwidth}",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -2161,18 +2427,577 @@
"bitrates": {
"wb": [
24400,
- 32000
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
],
"swb": [
24400,
- 32000
- ],
- "fb": [
- 32000
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ]
+ }
+ },
+ "ISM4_b{bitrate}_{bandwidth}_rs": {
+ "encmodeoption": [
+ "-ism",
+ "4"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM4",
+ "table_name": "ISM4@{table_bitrate} kbps RS {bandwidth}",
+ "nummetadata": 4,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": true,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": {
+ "all": "{sw_files_path}/sw_24k4_384k.bin"
+ },
+ "swb": {
+ "all": "{sw_files_path}/sw_24k4_384k.bin"
+ },
+ "fb": {
+ "all": "{sw_files_path}/sw_32k_384k.bin"
+ }
+ }
+ }
+ },
+ "ISM+1": {
+ "ISM+1_b{bitrate}_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-ism",
+ "+1"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM1",
+ "table_name": "ISM+1@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 1,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 13200,
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ],
+ "swb": [
+ 13200,
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ]
+ }
+ },
+ "ISM+1_b{bitrate}_dtx_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-ism",
+ "+1"
+ ],
+ "encoptions": [
+ "-dtx",
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM1",
+ "table_name": "ISM+1@{table_bitrate} kbps DTX {bandwidth}",
+ "nummetadata": 1,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 13200,
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ],
+ "swb": [
+ 13200,
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000
+ ]
+ }
+ }
+ },
+ "ISM+2": {
+ "ISM+2_b{bitrate}_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-ism",
+ "+2"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM2",
+ "table_name": "ISM+2@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 2,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "swb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ]
+ }
+ },
+ "ISM+2_b{bitrate}_dtx_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-dtx",
+ "-ism",
+ "+2"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM2",
+ "table_name": "ISM+2@{table_bitrate} kbps DTX {bandwidth}",
+ "nummetadata": 2,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "swb": [
+ 16400,
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000
]
}
}
},
+ "ISM+3": {
+ "ISM+3_b{bitrate}_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-ism",
+ "+3"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM3",
+ "table_name": "ISM+3@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 3,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ],
+ "swb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ]
+ }
+ },
+ "ISM+3_b{bitrate}_dtx_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-dtx",
+ "-ism",
+ "+3"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM3",
+ "table_name": "ISM+3@{table_bitrate} kbps DTX {bandwidth}",
+ "nummetadata": 3,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ],
+ "swb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000
+ ]
+ }
+ }
+ },
+ "ISM+4": {
+ "ISM+4_b{bitrate}_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-ism",
+ "+4"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM4",
+ "table_name": "ISM+4@{table_bitrate} kbps {bandwidth}",
+ "nummetadata": 4,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ],
+ "swb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ]
+ }
+ },
+ "ISM+4_b{bitrate}_dtx_{bandwidth}_cbr": {
+ "encmodeoption": [
+ "-dtx",
+ "-ism",
+ "+4"
+ ],
+ "encoptions": [
+ "-max_band",
+ "{bandwidth}"
+ ],
+ "dec": {
+ "EXT": []
+ },
+ "in_config": "ISM4",
+ "table_name": "ISM+4@{table_bitrate} kbps DTX {bandwidth}",
+ "nummetadata": 4,
+ "metadatafilenames": [
+ "stvISM{mdi}.csv"
+ ],
+ "rs": false,
+ "amr": false,
+ "mono": false,
+ "bitrates": {
+ "wb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ],
+ "swb": [
+ 24400,
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ],
+ "fb": [
+ 32000,
+ 48000,
+ 64000,
+ 80000,
+ 96000,
+ 128000,
+ 160000,
+ 192000,
+ 256000,
+ 384000,
+ 512000
+ ]
+ }
+ }
+ },
"stereo": {
"stereo_b{bitrate}_{bandwidth}_cbr": {
"encmodeoption": [
diff --git a/scripts/config/ivas_modes_debug.json b/scripts/config/ivas_modes_debug.json
index 769ed791ea64008ea2c8b28b3ffdbc398ba84765..bbd63d224ce3f0ca5d75dd6b040b91dcdbbda6fd 100644
--- a/scripts/config/ivas_modes_debug.json
+++ b/scripts/config/ivas_modes_debug.json
@@ -12117,7 +12117,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12141,7 +12141,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12165,7 +12165,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12189,7 +12189,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12213,7 +12213,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12237,7 +12237,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12261,7 +12261,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12285,7 +12285,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12309,7 +12309,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12333,7 +12333,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12357,7 +12357,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12381,7 +12381,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12405,7 +12405,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12429,7 +12429,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12453,7 +12453,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12477,7 +12477,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12501,7 +12501,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12525,7 +12525,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12549,7 +12549,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12573,7 +12573,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12597,7 +12597,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12621,7 +12621,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12645,7 +12645,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12669,7 +12669,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12693,7 +12693,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12717,7 +12717,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12741,7 +12741,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12765,7 +12765,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12789,7 +12789,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12813,7 +12813,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12837,7 +12837,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12861,7 +12861,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12885,7 +12885,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12909,7 +12909,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12933,7 +12933,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12958,7 +12958,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -12983,7 +12983,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13008,7 +13008,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13033,7 +13033,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13058,7 +13058,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13083,7 +13083,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13108,7 +13108,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13133,7 +13133,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13158,7 +13158,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13183,7 +13183,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13208,7 +13208,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13233,7 +13233,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13258,7 +13258,7 @@
"bw": "wb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13283,7 +13283,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13308,7 +13308,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13333,7 +13333,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13358,7 +13358,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13383,7 +13383,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13408,7 +13408,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13433,7 +13433,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13458,7 +13458,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13483,7 +13483,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13508,7 +13508,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13533,7 +13533,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13558,7 +13558,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13583,7 +13583,7 @@
"bw": "swb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13608,7 +13608,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13633,7 +13633,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13658,7 +13658,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13683,7 +13683,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13708,7 +13708,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13733,7 +13733,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13758,7 +13758,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13783,7 +13783,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13808,7 +13808,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13833,7 +13833,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13858,7 +13858,7 @@
"bw": "fb",
"nummetadata": 1,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13884,7 +13884,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13908,7 +13908,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13932,7 +13932,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13956,7 +13956,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -13980,7 +13980,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14004,7 +14004,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14028,7 +14028,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14052,7 +14052,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14076,7 +14076,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14100,7 +14100,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14124,7 +14124,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14148,7 +14148,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14172,7 +14172,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14196,7 +14196,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14220,7 +14220,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14244,7 +14244,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14268,7 +14268,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14292,7 +14292,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14316,7 +14316,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14340,7 +14340,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14364,7 +14364,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14388,7 +14388,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14412,7 +14412,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14436,7 +14436,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14460,7 +14460,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14484,7 +14484,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14508,7 +14508,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14532,7 +14532,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14556,7 +14556,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14580,7 +14580,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14604,7 +14604,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14628,7 +14628,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14653,7 +14653,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14678,7 +14678,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14703,7 +14703,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14728,7 +14728,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14753,7 +14753,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14778,7 +14778,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14803,7 +14803,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14828,7 +14828,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14853,7 +14853,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14878,7 +14878,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14903,7 +14903,7 @@
"bw": "wb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14928,7 +14928,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14953,7 +14953,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -14978,7 +14978,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15003,7 +15003,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15028,7 +15028,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15053,7 +15053,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15078,7 +15078,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15103,7 +15103,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15128,7 +15128,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15153,7 +15153,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15178,7 +15178,7 @@
"bw": "swb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15203,7 +15203,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15228,7 +15228,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15253,7 +15253,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15278,7 +15278,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15303,7 +15303,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15328,7 +15328,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15353,7 +15353,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15378,7 +15378,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15403,7 +15403,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15428,7 +15428,7 @@
"bw": "fb",
"nummetadata": 2,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15454,7 +15454,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15478,7 +15478,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15502,7 +15502,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15526,7 +15526,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15550,7 +15550,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15574,7 +15574,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15598,7 +15598,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15622,7 +15622,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15646,7 +15646,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15670,7 +15670,7 @@
"bw": "wb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15694,7 +15694,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15718,7 +15718,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15742,7 +15742,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15766,7 +15766,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15790,7 +15790,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15814,7 +15814,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15838,7 +15838,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15862,7 +15862,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15886,7 +15886,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15910,7 +15910,7 @@
"bw": "swb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15934,7 +15934,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15958,7 +15958,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -15982,7 +15982,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16006,7 +16006,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16030,7 +16030,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16054,7 +16054,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16078,7 +16078,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16102,7 +16102,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16126,7 +16126,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16150,7 +16150,7 @@
"bw": "fb",
"nummetadata": 3,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16176,7 +16176,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16200,7 +16200,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16224,7 +16224,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16248,7 +16248,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16272,7 +16272,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16296,7 +16296,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16320,7 +16320,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16344,7 +16344,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16368,7 +16368,7 @@
"bw": "wb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16392,7 +16392,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16416,7 +16416,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16440,7 +16440,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16464,7 +16464,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16488,7 +16488,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16512,7 +16512,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16536,7 +16536,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16560,7 +16560,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16584,7 +16584,7 @@
"bw": "swb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16608,7 +16608,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16632,7 +16632,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16656,7 +16656,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16680,7 +16680,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16704,7 +16704,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16728,7 +16728,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16752,7 +16752,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16776,7 +16776,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
@@ -16800,7 +16800,7 @@
"bw": "fb",
"nummetadata": 4,
"metadatafilenames": [
- "test_ISM_trajectory{mdi}.csv"
+ "stvISM{mdi}.csv"
],
"rs": false,
"amr": false,
diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm
index 223ac0352c236eac057b8ac0a6da86eadf3de341..81fe3cff88cee088f0ac88a1dcc0a6c5924957c9 100644
--- a/scripts/config/self_test.prm
+++ b/scripts/config/self_test.prm
@@ -161,19 +161,19 @@
../IVAS_dec STEREO 48 bit testv/stvST48c.wav_stereo_32000_48-48_bandwidth_sw.tst
// stereo at 32 kbps, 48kHz in, 32kHz out, random FEC at 6%
-../IVAS_cod -stereo -max_band FB 32000 48 testv/stvST48c.wav bit
+../IVAS_cod -stereo 32000 48 testv/stvST48c.wav bit
../IVAS_dec -fec testv/FEC_6pct.bin STEREO 32 bit testv/stvST48c.wav_stereo_32000_48-32_FEC5.tst
// stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, random FEC at 5%
-../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit
+../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit
../IVAS_dec -fec 5 STEREO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_FEC5.tst
// stereo at 32 kbps, 48kHz in, 48kHz out, DTX on, MONO out, random FEC at 5%
-../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit
+../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit
../IVAS_dec -fec 5 MONO 48 bit testv/stvST48n.wav_stereo_32000_48-48_DTX_MONO_FEC5.tst
// stereo at 32 kbps, 48kHz in, 16kHz out, DTX on, MONO out, random FEC at 5%
-../IVAS_cod -stereo -dtx -max_band FB 32000 48 testv/stvST48n.wav bit
+../IVAS_cod -stereo -dtx 32000 48 testv/stvST48n.wav bit
../IVAS_dec -fec 5 MONO 16 bit testv/stvST48n.wav_stereo_32000_48-16_DTX_MONO_FEC5.tst
// stereo at 48 kbps, 16kHz in, 16kHz out
@@ -250,154 +250,182 @@
-// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out
+// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, MONO out
../IVAS_cod -ism 1 testv/stvISM1.csv 13200 48 testv/stv1ISM48s.wav bit
../IVAS_dec MONO 48 bit testv/stv1ISM48s.wav_13200_48-48_MONO.tst
-// 1 ISm with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5%
+// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5%
../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 13200 48 testv/stv48n.wav bit
../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst
-// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out
+// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out
../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit
../IVAS_dec STEREO 48 bit testv/stv2ISM48s.wav_16400_48-48_STEREO.tst
-// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out
+// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out
+../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst
+
+// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
+../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit
+../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst
+
+// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out
../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit
../IVAS_dec 7_1 48 bit testv/stv3ISM48s.wav_24400_48-48_7_1.tst
-// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5%
+// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, MONO out, random FEC at 5%
../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit
../IVAS_dec -fec 5 MONO 48 bit testv/stv3ISM48s.wav_24400_48-48_MONO_FEC5.tst
-// 1 ISm with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out
+// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out
+../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst
+
+// 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out
../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 32000 32 testv/stv32n.wav bit
../IVAS_dec MONO 32 bit testv/stv32n.wav_32000_32-32_DTX_MONO.tst
-// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out
+// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, FOA out
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
../IVAS_dec FOA 48 bit testv/stv4ISM48s.wav_32000_48-48_FOA.tst
-// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out
+// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, STEREO out
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst
-// 3 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out
-../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit
-../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst
-
-// 2 ISm with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out
-../IVAS_cod -max_band FB -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit
-../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst
+// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst
-// 4 ISm with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out
-../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst
+// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out
+../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst
-// 4 ISm with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out
-../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst
+// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out
+../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit
+../IVAS_dec HOA2 48 bit testv/stv2ST48c.wav_32000_48-48_DTX_HOA2.tst
-// 3 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5%
-../IVAS_cod -max_band FB -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit
-../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst
+// 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out
+../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit
+../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst
-// 4 ISm with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out
-../IVAS_cod -max_band FB -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst
+// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5%
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst
-// 2 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out
-../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst
+// 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out
+../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit
+../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst
-// 3 ISm with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out
-../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst
+// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FEC at 5%
+../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit
+../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst
-// 2 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5%
+// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5%
../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit
../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst
-// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out
-../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst
-
-// 1 ISm with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
-../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit
-../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst
-
-// 2 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, EXTERNAL out
-../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit
-../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst
+// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5%
+../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit
+../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst
-// 2 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
+// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit
../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst
-// 4 ISm with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5%
-../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst
+// 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out
+../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit
+../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst
-// 4 ISm with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
+// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit
../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst
-// 1 ISm with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5%
-../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit
-../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst
+// 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out
+../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit
+../IVAS_dec STEREO 48 bit testv/stv2ST48c.wav_80000_48-48_DTX_STEREO.tst
-// 1 ISm with metadata at 96 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file)
-../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit
-../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_TD_binaural.tst
+// 4 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, HOA2 out
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst
-// 2 ISm with metadata at 160 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out
-../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit
-../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_TD_binaural.tst
+// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FEC at 5%
+../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit
+../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst
-// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out (Model from file)
-../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit
-../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TD_binaural.tst
+// 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst
-// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out
-../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TD_binaural.tst
+// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file)
+../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit
+../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst
-// 1 ISm with metadata at 80 kbps, 48 kHz in, 16 kHz out, TD BINAURAL out (Model from file), head rotation, random FEC at 5%
-../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit
-../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_TDHR_FEC5.tst
+// 3 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5%
+../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit
+../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst
-// 2 ISm with metadata at 128 kbps, 48 kHz in, 32 kHz out, TD BINAURAL out (Model from file), head rotation
+// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation
../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit
-../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_TDHR.tst
+../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst
+
+// 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst
-// 3 ISm with metadata at 192 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, random FEC at 5%
+// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out
+../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit
+../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst
+
+// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file)
+../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit
+../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst
+
+// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FEC at 5%
../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit
-../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_TDHR_FEC5.tst
+../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst
+
+// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst
-// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation
+// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
-../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_TDHR.tst
+../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst
-// 3 ISm with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out
+// 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out
../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit
../IVAS_dec 7_1_4 32 bit testv/stv3ISM48s.wav_384000_48-32_7_1_4.tst
-// 4 ISm with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1
+// 4 ISM with metadata at 512 kbps, 48 kHz in, 48 kHz out, 5_1
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit
../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst
-// 1 ISm with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on
+// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, Orientation tracking
+../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst
+
+// 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on
../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit
../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst
-// 4 ISm with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out
+// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out
../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_BINAURAL.tst
+../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst
-// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, DTX on, TD BINAURAL out
-../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit
-../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_256000_48-48_DTX_TD_binaural.tst
+// 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out
+../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit
+../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst
+
+
+// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FEC at 5%
+../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst
+// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out
+../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst
// SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out
@@ -432,6 +460,10 @@
../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit
../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst
+// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, Orientation tracking
+../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst
+
// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5%
../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit
../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst
@@ -476,6 +508,18 @@
../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit
../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst
+// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking
+../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst
+
+// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking
+../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit
+../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst
+
+// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode
+../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit
+../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst
+
// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5%
../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit
../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst
@@ -493,7 +537,7 @@
../IVAS_dec -fec 5 FOA 32 bit testv/stvFOA32c.wav_SBA_64000_32-32_DTX_FOA.tst
// SBA at 64 kbps, 48kHz in, 48kHz out, 5_1_4 out
-../IVAS_cod -max_band FB -sba 1 64000 48 testv/stvFOA48c.wav bit
+../IVAS_cod -sba 1 64000 48 testv/stvFOA48c.wav bit
../IVAS_dec 5_1_4 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_5_1_4.tst
// SBA at 64 kbps, 48kHz in, 48kHz out, 7_1_4 out
@@ -532,6 +576,10 @@
../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit
../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst
+// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking
+../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst
+
// SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5%
../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit
../IVAS_dec -fec 5 HOA2 48 bit testv/stv3OA48c.wav_SBA_192000_48-48_HOA2_FEC5.tst
@@ -666,6 +714,10 @@
../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit
../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst
+// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking
+../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst
+
// MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5%
../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit
../IVAS_dec -fec 5 7_1_4 48 bit testv/stv1MASA2TC48c.wav_48000_48-48_7_1_4_FEC5.tst
@@ -804,6 +856,10 @@
../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit
../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst
+// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking
+../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit
+../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst
+
// Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out
../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit
../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_5_1.tst
@@ -844,6 +900,14 @@
../IVAS_cod -mc 7_1_4 96000 48 testv/stv714MC48c.wav bit
../IVAS_dec -fec 5 5_1 48 bit testv/stv714MC48c.wav_MC714_96000_48-48_5_1_FEC5.tst
+// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL out
+../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural.tst
+
+// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, 7_1_4 out
+../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit
+../IVAS_dec 7_1_4 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC714.tst
+
// Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FEC at 5%
../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit
../IVAS_dec -fec 5 STEREO 48 bit testv/stv512MC48c.wav_MC714_32000_48-48_Stereo.tst
@@ -960,3 +1024,14 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit
../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit
networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0
../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv51MC48c.wav_MC51_384000_48-48_7_1_4_JBM5.tst
+
+
+
+// NON DIEGETiC PAN at 60 kbps, 48kHz in, 48kHz out, STEREO out
+../IVAS_cod 64000 48 testv/stv48c.wav bit
+../IVAS_dec -non_diegetic_pan -0.5 48 bit testv/stv48c.pcm_MONO_64000_48-48_STEREO_NON-DIEGETIC-PAN_-0.5.tst
+
+// 4 ISM with extended metadata and non diegetic pan object switching bitrate 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out
+../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit
+../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst
+
diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py
index 5fee9845e743fb26b0f3552b09e26b31cf3d0954..4986ccec21ecbe7cf73b8ffd444de75b52cb42b1 100755
--- a/scripts/cut_bs.py
+++ b/scripts/cut_bs.py
@@ -35,11 +35,32 @@ import argparse
import os.path
import sys
-SID_BITS = {35, 48, 88, 100}
+SID_BITS = {35, 48, 104}
SYNC_WORDS = {b"!k", b" k"}
-def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False):
+def cut_to_length(fp, fp_out, length):
+ assert length > 0
+
+ fr_cnt = 0
+
+ for f in range(length):
+ sync_word = fp.read(2)
+ if sync_word == b"":
+ return fr_cnt
+ if sync_word not in SYNC_WORDS:
+ raise ValueError("Bad Sync word!")
+ n_bits_bs = fp.read(2)
+ n_bits = struct.unpack("h", n_bits_bs)[0]
+ fp_out.write(sync_word)
+ fp_out.write(n_bits_bs)
+ fp_out.write(fp.read(n_bits * 2))
+ fr_cnt += 1
+
+ return fr_cnt
+
+
+def cut_from_start(fp, fp_out, start_frame=0, start_with_sid=False):
# cut until start frame
fr_cnt = 0
cut_cnt = 0
@@ -86,20 +107,20 @@ def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False):
fp_out.write(n_bits_bs)
fp_out.write(fp.read(n_bits * 2))
fr_cnt += 1
-
return (fr_cnt, cut_cnt)
if __name__ == "__main__":
my_parser = argparse.ArgumentParser(
- description="Cut frames from the beginning of a G.192 bit stream file"
+ description="Cut a G.192 bit stream file"
)
my_parser.add_argument(
- "--sid", "-s", help="Cut until the first SID frame", action="store_true"
+ "--sid", "-s", help="Cut away all frames before the first SID frame", action="store_true"
)
my_parser.add_argument(
- "--frame", "-f", type=int, help="Number of frames to cut.", default=0
+ "--frame", "-f", type=int, help="Number of frames to cut from the start of the file.", default=0
)
+ my_parser.add_argument("--length", "-l", type=int, help="Cut bitstream to this length (in frames)", default=-1)
my_parser.add_argument("bs_in", type=str, help="G.192 bit stream file name to cut")
my_parser.add_argument("bs_out", type=str, help="Cut G.192 bit stream file name")
my_args = my_parser.parse_args()
@@ -113,10 +134,16 @@ if __name__ == "__main__":
with open(my_args.bs_in, "rb") as fp_in:
with open(my_args.bs_out, "wb") as fp_out:
- fr_cnt, cut_cnt = cut_bs(
- fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid
- )
+ if my_args.sid or my_args.frame:
+ fr_cnt, cut_cnt = cut_from_start(
+ fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid
+ )
+ if my_args.sid and (fr_cnt == cut_cnt):
+ print("Warning! No SID frame found in bitstream!")
+ print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}")
+ elif my_args.length:
+ fr_cnt = cut_to_length(fp_in, fp_out, my_args.length)
+ if fr_cnt != my_args.length:
+ print(f"Warning! Could not cut to length {my_args.length} as bitstream only contained {fr_cnt} frames!")
+ print(f"Cut {my_args.bs_in} to {fr_cnt} frames")
- if my_args.sid and (fr_cnt == cut_cnt):
- print("Warning! No SID frame found in bitstream!")
- print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}")
diff --git a/scripts/prepare_instrumentation.sh b/scripts/prepare_instrumentation.sh
index c748f19aca4745df84b90a3e7132235fdfa36555..70d69874968d26e078a7ce5b65b1e2c5ec5b5bee 100755
--- a/scripts/prepare_instrumentation.sh
+++ b/scripts/prepare_instrumentation.sh
@@ -103,7 +103,8 @@ find $targetdir -name "*.[ch]" -exec sed -i.bak -e "s/\(0x[0-9a-fA-F]*\)UL/\(\(u
# run wmc_tool
"tools/$system/wmc_tool" -m "$targetdir/apps/encoder.c" "$targetdir/lib_enc/*.c" "$targetdir/lib_com/*.c" >> /dev/null
-"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" "$targetdir/lib_rend/*.c" >> /dev/null
+"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" >> /dev/null
+"tools/$system/wmc_tool" -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" >> /dev/null
# automatically enable #define WMOPS in options.h
sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*WMOPS\)[[:space:]]*\*\//\1/g" $targetdir/lib_com/options.h
diff --git a/scripts/prepare_mem_dryrun.py b/scripts/prepare_mem_dryrun.py
old mode 100644
new mode 100755
index 21f5b8114592067bdb0b9d04d00fa9bb20c22227..20da546c198953c47a9848806a8d1b106d65c478
--- a/scripts/prepare_mem_dryrun.py
+++ b/scripts/prepare_mem_dryrun.py
@@ -1,4 +1,4 @@
-#!/bin/python3
+#!/usr/bin/env python3
import re, os, fnmatch
@@ -16,6 +16,7 @@ for d in dirs:
with open(fileIn, 'r') as f_in:
lines = f_in.readlines()
with open(fileIn, 'w') as f_out:
+ skip = 0
for line in lines:
if re.search(r'#define\W+WMC_TOOL_SKIP', line):
skip = 1
diff --git a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_SBA3.mat b/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_SBA3.mat
deleted file mode 100644
index 5bc7464f7f5e8e76cd848e52e2c389cfd722b6f3..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_SBA3.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b41a527b6ba22b4c100265655ca801ee4d2dba3c3e03dc58f7cc5d99e397d2c3
-size 11795531
diff --git a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_combined.mat b/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_combined.mat
deleted file mode 100644
index 61ba946617a5c35cb56e32814b40f4e728ecdafd..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_combined.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:081a9053c8b04831d97e6f18d641d4737b2c23b076778a9b41c7b3a41d954c32
-size 6348446
diff --git a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_full.mat b/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_full.mat
deleted file mode 100644
index 440c8aedd677937f558767742a7b5a66ea13bb61..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/BRIRs_mat/IIS_BRIR_officialMPEG_222UC_full.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0544d1cf80a7cceb156760107d81b10fd787807bb0ea1e74e9aeb552474b3373
-size 13233924
diff --git a/scripts/pyaudio3dtools/EFAP.py b/scripts/pyaudio3dtools/EFAP.py
deleted file mode 100644
index dcc615355ed32dcbc06990d090d08cffaf9a29c0..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/EFAP.py
+++ /dev/null
@@ -1,929 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
- Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The Baseline Development Group consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
- Panasonic Corporation, Qualcomm Technologies, Inc., and VoiceAge Corporation retain full ownership
- rights in their respective contributions in the software. No license of any kind, including but not
- limited to patent license, of any foregoing parties is hereby granted by implication, estoppel or
- otherwise.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and/or fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import argparse
-import os
-from enum import Enum
-from itertools import combinations
-from typing import Optional, Tuple, Union
-
-import numpy as np
-
-
-def wrap_angles(
- azi: float, ele: float, clip_ele: Optional[bool] = False
-) -> Tuple[float, float]:
- """
- Wrap angles to (-180, 180] azimuth and [-90, 90] elevation
- Takes into account hemisphere flips from large elevation changes unless clip_ele is specified
- """
- if clip_ele:
- ele = min(max(ele, -90), 90)
-
- if ele != 0 and ele % 90 == 0:
- # if elevation is a multiple of 90, azimuth is irrelevant since we are at a pole
- azi = 0
- while np.abs(ele) > 90:
- ele -= 360
- else:
- # wrap elevation value
- while np.abs(ele) > 90:
- # flip azimuth to other hemisphere
- azi += 180
-
- # compensate elevation accordingly
- if ele > 90:
- ele -= 180
- elif ele < -90:
- ele += 180
-
- # wrap azimuth value
- while np.abs(azi) > 180:
- azi = (azi + 180) % 360
- if azi < 0:
- azi += 360
- azi -= 180
-
- # set -180 azimuth to 180
- if azi == -180:
- azi = 180
-
- return azi, ele
-
-
-class EfapDmxType(Enum):
- NONE = 0
- AMPLITUDE = 1
- INTENSITY = 2
-
-
-class EfapVertex:
- """
- Vertex data structure for EFAP
- Initialises a vertex from the given spherical coordinate pair, with a flag specifying if it is a ghost loudspeaker
-
-
- Parameters
- ----------
- azi : float
- Azimuth of vertex
- ele : float
- Elevation of vertex
- is_ghost : bool
- Whether the vertex is a ghost, default is False
- dmx_type : EfapDmxType
- Downmix type for ghost vertices
- """
-
- def __init__(
- self,
- azi: float,
- ele: float,
- is_ghost: Optional[bool] = False,
- dmx_type: Optional[EfapDmxType] = EfapDmxType.INTENSITY,
- ):
- self.azi, self.ele = wrap_angles(azi, ele)
- self.pos = np.array(
- [
- np.cos(np.deg2rad(azi)) * np.cos(np.deg2rad(ele)),
- np.sin(np.deg2rad(azi)) * np.cos(np.deg2rad(ele)),
- np.sin(np.deg2rad(ele)),
- ]
- )
-
- idx_azi = np.round(np.abs(90 - np.abs(self.azi)))
- idx_ele = 90 - np.round(np.abs(self.ele))
- self.index = (
- idx_azi + 181 * idx_ele
- ) # vertices on the median plane have lowest index
-
- self.is_ghost = is_ghost
- self.dmx_type = dmx_type
-
- def __str__(self):
- str_ = f"a{self.azi}e{self.ele}"
- if self.is_ghost:
- str_ += "*"
- return str_
-
- def __lt__(self, other):
- return self.index < other.index
-
-
-class EFAP:
- """
- EFAP data structure
-
- Initialise EFAP data for computing panning gains
-
-
- Parameters
- ----------
- azimuths : np.ndarray
- Azimuth positions of the loudspeaker array
- elevations : npndarray
- Elevation postions of the loudspeaker array
- intensity_panning : bool
- Whether intensity panning is enabled or not
-
- Examples
- --------
-
- >>> from EFAP import EFAP
- >>> panner = EFAP([30, -30, 0, 110, -110], [0, 0, 0, 0, 0], False)
- >>> panner.pan(15, 45)
- array([0.66742381, 0.19069252, 0.66742381, 0.19069252, 0.19069252])
-
- """
-
- _EFAP_HULL_TOL = 1e-4 # tolerance for a point to be added to the convex hull
- _EFAP_MAX_AZI_GAP = 160 # maximum allowed angular gap in the middle layer
- _EFAP_POLAR_ELE = 90 # elevation of north / south poles (zenith / nadir)
- _EFAP_THRESH_COPLANAR = 1e-3 # tolerance for points to be considered coplanar
- _EFAP_THRESH_MID_LAYER = 45 # elevation threshold for loudspeakers to be considered as in the middle layer
- _EFAP_THRESH_POLES = 1e-6 # tolerance for a vertex to be considered polar
- _EFAP_THRESH_TRI = 1e-10 # tolerance for a point to be inside a triangle
-
- def __init__(
- self,
- azimuths: Union[list, np.ndarray],
- elevations: Union[list, np.ndarray],
- intensity_panning: Optional[bool] = False,
- ):
- # validation
- azimuths = np.array(azimuths)
- elevations = np.array(elevations)
- if np.squeeze(azimuths).ndim > 1:
- raise ValueError("Too many dimensions for loudspeaker azimuth array")
- if np.squeeze(elevations).ndim > 1:
- raise ValueError("Too many dimensions for loudspeaker elevations array")
- if azimuths.shape != elevations.shape:
- raise ValueError("Mismatch between loudspeaker azimuths and elevations")
-
- # set EFIP flag
- self.intensity_panning = intensity_panning
-
- # initialise vertices and add ghost loudspeakers if needed
- self.verts = np.array(
- [EfapVertex(azi, ele) for azi, ele in zip(azimuths, elevations)]
- )
- self._add_ghost_speakers()
-
- # formulate initial tetrahedron for the convex hull
- self._init_simplex()
-
- # add the remaining vertices to the convex hull in order of their index
- for i in np.argsort(self.verts):
- if self.verts[i] not in self.verts[self.tris]:
- self._add_vertex_to_hull(i)
-
- # compute downmix matrix with remapped ghost speakers
- self._remap_ghost_speakers()
-
- # set vertices near poles to have NaN azimuth
- for v in self.verts:
- if (
- v.ele > self._EFAP_POLAR_ELE - self._EFAP_THRESH_POLES
- or v.ele < self._EFAP_THRESH_POLES - self._EFAP_POLAR_ELE
- ):
- v.azi = np.nan
-
- # combine triangles into polygons
- self._tri2poly()
-
- def _add_ghost_speakers(self) -> None:
- """
- Add ghost loudspeakers at the poles, or to fill large horizontal gaps
- """
- ele = [v.ele for v in self.verts]
-
- dmx_type = EfapDmxType.INTENSITY
-
- # add ghost loudspeakers at the poles if necessary
- if max(ele) < self._EFAP_POLAR_ELE:
-
- if self.intensity_panning:
- if max(ele) > self._EFAP_THRESH_MID_LAYER:
- dmx_type = EfapDmxType.NONE
- else:
- dmx_type = EfapDmxType.AMPLITUDE
-
- self.verts = np.append(self.verts, EfapVertex(0, 90, True, dmx_type))
-
- if min(ele) > -self._EFAP_POLAR_ELE:
-
- if self.intensity_panning:
- if min(ele) < -self._EFAP_THRESH_MID_LAYER:
- dmx_type = EfapDmxType.NONE
- else:
- dmx_type = EfapDmxType.AMPLITUDE
-
- self.verts = np.append(self.verts, EfapVertex(0, -90, True, dmx_type))
-
- # check for large gaps in the middle horizontal layer
- mid_spkrs = [
- v.azi for v in self.verts if np.abs(v.ele) < self._EFAP_THRESH_MID_LAYER
- ]
-
- # no speakers in middle layer; add a triangle of ghost speakers
- if not mid_spkrs:
- self.verts = np.append(
- self.verts,
- [
- EfapVertex(0, 0, True),
- EfapVertex(180, 0, True),
- EfapVertex(240, 0, True),
- ],
- )
- # only one speaker in the threshold; add two ghost speakers to form a triangle
- elif len(mid_spkrs) == 1:
- self.verts = np.append(
- self.verts,
- [
- EfapVertex(mid_spkrs[0] + 120, 0, True),
- EfapVertex(mid_spkrs[0] + 240, 0, True),
- ],
- )
- # search for and fill gaps greater than MAX_AZI_GAP
- else:
- mid_spkrs = np.sort(mid_spkrs)
- angle_diff = np.diff(np.concatenate([mid_spkrs, [mid_spkrs[0] + 360]]))
- sectors = np.ceil(angle_diff / self._EFAP_MAX_AZI_GAP)
-
- for i, s in enumerate(sectors):
- if s > 1:
- new_diff = angle_diff[i] / s
- num_new = s - 1
- for k in range(int(num_new)):
- new_azi = mid_spkrs[i] + (k + 1) * new_diff
- self.verts = np.append(self.verts, EfapVertex(new_azi, 0, True))
-
- def _init_simplex(self) -> None:
- """
- Create an initial tetrahedron / simplex for the convex hull from 4 vertices
- """
- # take the first vertex as seed
- t = [0]
-
- # attempt to form an edge with non-zero length
- for i, v in enumerate(self.verts):
- if (
- v.azi != self.verts[t[0]].azi or v.ele != self.verts[t[0]].ele
- ) and i not in t:
- t.append(i)
- break
- else:
- raise ValueError("Vertices are conincident!")
-
- # attempt to form a triangle with non-zero area
- for i, v in enumerate(self.verts):
- if (
- np.linalg.norm(
- np.cross(
- self.verts[t[1]].pos - self.verts[t[0]].pos,
- v.pos - self.verts[t[0]].pos,
- ),
- 2,
- )
- > self._EFAP_HULL_TOL
- and i not in t
- ):
- t.append(i)
- break
- else:
- raise ValueError("Vertices are colinear!")
-
- # attempt to form a tetrahedron with non-zero volume
- for i, v in enumerate(self.verts):
- if (
- np.abs(
- np.dot(
- np.cross(
- self.verts[t[1]].pos - self.verts[t[0]].pos,
- self.verts[t[2]].pos - self.verts[t[0]].pos,
- ),
- v.pos - self.verts[t[0]].pos,
- )
- )
- ) > self._EFAP_HULL_TOL and i not in t:
- t.append(i)
- break
- else:
- raise ValueError("Vertices are coplanar!")
-
- # create a list of the triangles of the initial simplex / tetrahedron
- t = np.array(t)
- self.tris = np.array([t[[0, 1, 2]], t[[0, 1, 3]], t[[0, 2, 3]], t[[1, 2, 3]]])
-
- # orient the triangle surface planes outwards from the centroid
- self.centroid = np.mean([self.verts[i].pos for i in t], axis=0)
- for i, tri in enumerate(self.tris):
- self.tris[i, :] = self._flip_plane(tri)
-
- def _add_vertex_to_hull(self, idx_new_vert: int) -> None:
- """
- Add a vertex to the convex hull and update the list of triangles in the hull
- """
- # compute the centroid of the current convex hull
- self.centroid = np.mean(
- [self.verts[i].pos for i in np.unique(self.tris)], axis=0
- )
-
- tris_new = []
- visible = []
-
- # find which hull surfaces are visible from the new vertex
- for i, tri in enumerate(self.tris):
- if self._vertex_dist(tri, idx_new_vert) > -1e-6:
- visible.append(i)
- else:
- tris_new.append(tri)
-
- tris_new = np.array(tris_new)
- visible = np.array(visible, dtype=int)
-
- # find edges of the visible hull surfaces
- max_vert = np.amax(self.tris[visible]) + 1
- counter = np.zeros([max_vert, max_vert])
- for i, tri in enumerate(self.tris[visible]):
- surface = np.append(tri, tri[0])
- for n in range(3):
- a = surface[n]
- b = surface[n + 1]
- counter[a, b] = counter[a, b] + 1
-
- counter += counter.T
-
- edges = []
- for a in range(max_vert - 1):
- for b in range(a + 1, max_vert):
- if counter[a, b] == 1:
- edges.append([a, b])
- edges = np.vstack(edges)
-
- # break the edges visible from the new vertex and add the new triangle
- for e in edges:
- tris_new = np.vstack(
- [tris_new, self._flip_plane(np.append(e, idx_new_vert))]
- )
-
- # update the list of triangles in the convex hull
- self.tris = tris_new
-
- def _remap_ghost_speakers(self) -> None:
- """
- Remove unused ghost speakers and compute a downmix matrix for the rest
- """
- # find ghosts that are not part of the convex hull
- ghosts = [i for i, v in enumerate(self.verts) if v.is_ghost]
- unused_ghosts = np.compress(
- np.isin(ghosts, np.unique(self.tris), invert=True), ghosts
- )
-
- if unused_ghosts.size > 0:
- # remove the unused ghosts from the triangle array and also adjust indices
- self.tris[self.tris > unused_ghosts.min()] -= unused_ghosts.size
- # delete them from the vertex array
- self.verts = np.delete(self.verts, unused_ghosts)
-
- # generate initial sound energy distribution matrix
- n_vtx = len(self.verts)
- n_ghost = len(ghosts) - len(unused_ghosts)
-
- M = np.eye(n_vtx)
- for i, v in enumerate(self.verts):
- if v.is_ghost:
- neighbours = self._get_neighbours(i)
- M[:, i] = np.zeros(n_vtx)
- M[neighbours, i] = np.ones(len(neighbours)) / len(neighbours)
-
- # re-distribute sound energy from ghosts
- M2 = M.copy()
- for i, v in enumerate(self.verts):
- if v.is_ghost:
- vec = M[:, i]
- while np.sum(vec[-n_ghost:]) > 1e-4:
- vec = M @ vec
- M2[:, i] = vec
-
- self.dmx_mat = M2[:-n_ghost, :]
-
- # amplitude downmix for real loudspeakers
- self.dmx_mat[:, :-n_ghost] = np.sqrt(self.dmx_mat[:, :-n_ghost])
-
- # distribute ghosts according to downmix type
- for i, v in enumerate(self.verts):
- if v.is_ghost:
- if v.dmx_type == EfapDmxType.NONE:
- self.dmx_mat[:, i] = 0
- elif v.dmx_type == EfapDmxType.AMPLITUDE:
- pass
- else:
- self.dmx_mat[:, i] = np.sqrt(self.dmx_mat[:, i])
-
- def _tri2poly(self) -> None:
- """
- Merge hull triangles into polygons if they are coplanar
- """
- polys = []
-
- for tri in self.tris:
- # find all vertices coplanar with this triangle (including those already in the triangle)
- new_poly = np.array(
- [
- i
- for i, _ in enumerate(self.verts)
- if np.abs(self._vertex_dist(tri, i)) < self._EFAP_THRESH_COPLANAR
- ]
- )
-
- # check if we already found this polygon as a complete subset
- is_subset = [
- i for i, poly in enumerate(polys) if np.all(np.isin(new_poly, poly))
- ]
- is_superset = [
- i for i, poly in enumerate(polys) if np.all(np.isin(poly, new_poly))
- ]
-
- if is_subset:
- continue
- elif is_superset:
- # remove the other polygon since it will be replaced by the superset polygon
- polys_new = [p for i, p in enumerate(polys) if i not in is_superset]
- polys = polys_new
-
- # orient the polygon plane in the same direction as the triangle
- P1 = self.verts[tri[0]].pos
- P2 = self.verts[tri[1]].pos
- P3 = self.verts[tri[2]].pos
-
- # first base vector
- U = P2 - P1
- U = U / np.linalg.norm(U)
-
- # second base vector
- V = P3 - P2
- V = V - np.dot(U, V) * U
- V = V / np.linalg.norm(V)
-
- # center of the first triangle
- M = np.mean([P1, P2, P3], axis=0)
-
- # sort vertices
- azi = np.zeros_like(new_poly, dtype=float)
- for i, idx_v in enumerate(new_poly):
- P = self.verts[idx_v].pos - M
- X = np.dot(P, U)
- Y = np.dot(P, V)
- azi[i] = np.arctan2(Y, X)
-
- idx = np.argsort(azi)
- new_poly = new_poly[idx]
-
- # add the polygon to the main list
- polys.append(new_poly)
-
- self.polys = polys
-
- def _pan_EFAP_poly(
- self, azimuth: float, elevation: float, poly: np.ndarray, mod: int
- ) -> np.ndarray:
- """
- Compute panning gains for each vertex in the given polygon
-
-
- Parameters
- ----------
- azimuth : float
- Azimuth of requested panning position
- elevation : float
- Elevation of requested panning position
- poly : np.ndarray
- Array of vertices defining the polygon
-
- Returns
- -------
- poly_gain: np.ndarray
- Gains for each vertex in the polygon
- """
- poly_gain = np.zeros_like(poly, dtype=float)
-
- P = np.array([azimuth, elevation])
- # search for the triangle of the polygon in which P belongs
- for i in range(1, poly.size + 1):
- A = np.array([self.verts[poly[i - 1]].azi, self.verts[poly[i - 1]].ele])
- for j in range(i, poly.size - 2 + i):
- idx1 = 1 + (j % poly.size)
- idx2 = 1 + (idx1 % poly.size)
- B = np.array(
- [self.verts[poly[idx1 - 1]].azi, self.verts[poly[idx1 - 1]].ele]
- )
- C = np.array(
- [self.verts[poly[idx2 - 1]].azi, self.verts[poly[idx2 - 1]].ele]
- )
-
- if mod:
- if not np.isnan(A[0]):
- A[0] %= mod
- if not np.isnan(B[0]):
- B[0] %= mod
- if not np.isnan(C[0]):
- C[0] %= mod
-
- if self._in_triangle(P, A, B, C):
- N = np.transpose([B[1] - C[1], C[0] - B[0]])
- N = N / np.dot(N, B - A)
- poly_gain[i - 1] = 1 - np.dot(P - A, N)
-
- """ DEBUGGING / TODO """
- # set gains <= -60dB to 0
- poly_gain[np.abs(poly_gain) < 1e-6] = 0
-
- return poly_gain
-
- """ geometric / math helper functions """
-
- def _get_neighbours(self, idx_vert: int) -> np.ndarray:
- """
- Find triangles containing the given vertex index (neighbouring vertices)
- """
- n = self.tris[np.any(np.isin(self.tris, idx_vert), axis=1)]
- return np.unique(n[n != idx_vert])
-
- def _get_azi_ele(self, idx_vert: int) -> Tuple[float, float]:
- """
- Return a tuple of (azi, ele) for a vertex at the given index
- """
- return self.verts[idx_vert].azi, self.verts[idx_vert].ele
-
- def _in_polygon(
- self, azimuth: float, elevation: float, poly: np.ndarray
- ) -> Tuple[bool, int]:
- """
- Determine whether the panning position lies within the given polygon
- by iteratively checking its triangles
-
- Parameters
- ----------
- azimuth : float
- Azimuth of requested panning position
- elevation : float
- Elevation of requested panning position
- poly : np.ndarray
- Array of vertices defining the polygon
-
- Returns
- -------
- in_polygon, mod: Tuple[bool, int]
- Flag indicating whether the point is inside the given polygon
- Value of wrapping required if used
- """
- azi = [self.verts[v].azi for v in poly]
-
- P = np.array([azimuth, elevation])
-
- for tri in combinations(poly, 3):
- A = np.array(self._get_azi_ele(tri[0]))
- B = np.array(self._get_azi_ele(tri[1]))
- C = np.array(self._get_azi_ele(tri[2]))
- if self._in_triangle(P, A, B, C):
- return True, None
-
- # if the azimuth difference is large, perform the 2D check again with azimuths wrapped to (-360, 0] and [0, 360)
- if np.nanmax(azi) - np.nanmin(azi) > 180:
- for tri in combinations(poly, 3):
- A = np.array(self._get_azi_ele(tri[0]))
- B = np.array(self._get_azi_ele(tri[1]))
- C = np.array(self._get_azi_ele(tri[2]))
- if not np.isnan(A[0]):
- A[0] %= 360
- if not np.isnan(B[0]):
- B[0] %= 360
- if not np.isnan(C[0]):
- C[0] %= 360
- if self._in_triangle(P, A, B, C):
- return True, 360
-
- for tri in combinations(poly, 3):
- A = np.array(self._get_azi_ele(tri[0]))
- B = np.array(self._get_azi_ele(tri[1]))
- C = np.array(self._get_azi_ele(tri[2]))
- if not np.isnan(A[0]):
- A[0] %= -360
- if not np.isnan(B[0]):
- B[0] %= -360
- if not np.isnan(C[0]):
- C[0] %= -360
- if self._in_triangle(P, A, B, C):
- return True, -360
-
- return False, None
-
- def _in_triangle(
- self, P: np.ndarray, A: np.ndarray, B: np.ndarray, C: np.ndarray
- ) -> bool:
- """
- Determine whether the panning position lies within the given triangle
-
- Parameters
- ----------
- P : float
- Point under test
- A : float
- First vertex of the triangle
- B : float
- Second vertex of the triangle
- C : float
- Third vertex of the triangle
-
-
- Returns
- -------
- bool
- Flag indicating whether the point is inside the given triangle
- """
- if np.isnan(A[0]):
- A[0] = P[0]
-
- if np.isnan(B[0]):
- B[0] = P[0]
-
- if np.isnan(C[0]):
- C[0] = P[0]
-
- tmpMat = np.transpose([B - A, C - A])
- if (1 / np.linalg.cond(tmpMat)) < self._EFAP_THRESH_TRI:
- return False
-
- Minv = np.linalg.inv(tmpMat)
- S = Minv @ (P - A)
-
- if (
- S[0] < -self._EFAP_THRESH_TRI
- or S[1] < -self._EFAP_THRESH_TRI
- or S[0] + S[1] > 1 + self._EFAP_THRESH_TRI
- ):
- return False
-
- return True
-
- def _vertex_dist(self, surface: np.ndarray, idx_vert: int) -> float:
- """
- Compute the distance of a vertex from a given plane
-
- Parameters
- ----------
- surface : np.ndarray
- Array of 3 ordered vertices defining the plane and its orientation
- idx_vert: int
- Index of the vertex to compute the distance for
-
- Returns
- -------
- float
- Distance of the vertex from the given plane
- """
- return self._point_plane_dist(
- self.verts[surface[0]].pos,
- self.verts[surface[1]].pos,
- self.verts[surface[2]].pos,
- self.verts[idx_vert].pos,
- )
-
- def _point_plane_dist(
- self, P1: np.ndarray, P2: np.ndarray, P3: np.ndarray, X: np.ndarray
- ) -> float:
- """
- Compute the distance of a vertex from a plane defined by three points
-
- Parameters
- ----------
- P1 : np.ndarray
- Cartesian coordinates of the first point
- P2 : np.ndarray
- Cartesian coordinates of the second point
- P3 : np.ndarray
- Cartesian coordinates of the third point
- X: np.ndarray
- Cartesian coordinates of the vertex
-
- Returns
- -------
- float
- Distance of the vertex from the given plane
- """
-
- if np.all(X == P1) or np.all(X == P2) or np.all(X == P3):
- return 0
- else:
- N = np.cross(P1 - P2, P1 - P3)
- return np.dot(X - P1, N / np.linalg.norm(N))
-
- def _flip_plane(self, surface: np.ndarray) -> np.ndarray:
- """
- Flip the orientation of a plane (invert normal vector)
-
- Parameters
- ----------
- surface : np.ndarray
- Array of 3 ordered vertices defining the plane and its orientation
-
- Returns
- -------
- surface : np.ndarray
- Reordered vertices with plane normal pointing outwards from the hull centroid
- """
- if (
- self._point_plane_dist(
- self.verts[surface[0]].pos,
- self.verts[surface[1]].pos,
- self.verts[surface[2]].pos,
- self.centroid,
- )
- > 0
- ):
- surface = np.flip(surface.copy())
-
- return surface
-
- def _compute_gains_point(self, azimuth: float, elevation: float) -> np.ndarray:
- """
- Compute gains for the requested panning position
-
-
- Parameters
- ----------
- azimuth : float
- Azimuth of requested panning position
- elevation : float
- Elevation of requested panning position
-
- Returns
- -------
- gains: np.ndarray
- Panning gains for the loudspeaker layout
- """
- if np.isnan(azimuth) or np.isnan(elevation):
- raise ValueError(f"Angles cannot be NaNs : ({azimuth}, {elevation})")
-
- azimuth, elevation = wrap_angles(azimuth, elevation)
- point_pos = [
- np.cos(np.deg2rad(azimuth)) * np.cos(np.deg2rad(elevation)),
- np.sin(np.deg2rad(azimuth)) * np.cos(np.deg2rad(elevation)),
- np.sin(np.deg2rad(elevation)),
- ]
-
- # filter the polygon list with a quick 2d check
- found_polys = []
- for poly in self.polys:
- in_poly, mod = self._in_polygon(azimuth, elevation, poly)
- if in_poly:
- found_polys.append((poly, mod))
-
- if not found_polys:
- raise AssertionError("Unexpected error during panning")
-
- # find a visible polygon with the smallest distance
- dist = []
-
- for poly, mod in found_polys:
- surface = self.verts[poly]
- d = self._point_plane_dist(
- surface[0].pos,
- surface[1].pos,
- surface[2].pos,
- point_pos,
- )
- if d >= 0:
- dist.append(d)
- else:
- dist.append(np.inf)
-
- found_poly, mod = found_polys[np.argmin(dist)]
-
- # compute gains for the polygon vertices
- poly_gain = self._pan_EFAP_poly(azimuth, elevation, found_poly, mod)
-
- # downmix ghost loudspeakers
- gains = np.zeros(self.verts.size)
- gains[found_poly] = poly_gain / np.linalg.norm(poly_gain)
- gains = gains @ self.dmx_mat.T
- gains = gains / np.linalg.norm(gains)
-
- if self.intensity_panning:
- gains = np.sqrt(gains / np.sum(gains))
-
- return gains
-
- """ public functions """
-
- def pan(
- self, azimuths: float, elevations: float, intensity_panning: bool = False
- ) -> np.ndarray:
- """
- Compute gains for the requested panning position
-
-
- Parameters
- ----------
- azimuth : float
- Azimuth of requested panning position
- elevation : float
- Elevation of requested panning position
- intensity_panning : bool
- Flag whether to use intensity panning (Default is False == amplitude panning)
-
- Returns
- -------
- gains: np.ndarray
- Panning gains for the loudspeaker layout
- """
- azimuths = np.array(azimuths)
- elevations = np.array(elevations)
- if azimuths.size == 1 and elevations.size == 1:
- return self._compute_gains_point(azimuths, elevations)
- elif np.squeeze(azimuths).ndim == 1 and np.squeeze(elevations).ndim == 1:
- gains = []
- for a, e in zip(azimuths, elevations):
- gains.append(self._compute_gains_point(a, e))
- return np.vstack(gains)
- else:
- raise ValueError(
- "Azimuth and Elevation arrays cannot have more than one dimension and must be of equal size"
- )
-
-
-def main(args):
- """
- Parses a speaker layout text file and prints the panning gains
- for the requested position
-
-
- Parameters
- ----------
- args : tuple
- Command line arguments
-
- """
-
- speaker_positions = np.loadtxt(
- os.path.abspath(args.input), delimiter=",", max_rows=2
- )
- panner = EFAP(speaker_positions[0, :], speaker_positions[1, :], args.efip)
- print(panner.pan(args.azimuth, args.elevation))
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(description="Edge-Fading Amplitude Panning")
- parser.add_argument(
- "-i",
- "--input",
- metavar="layout_file",
- required=True,
- type=str,
- help="IVAS compatible loudspeaker layout file (Loudspeaker azimuths in first line, elevations in second, subsequent lines are ignored)",
- )
- parser.add_argument(
- "-efip",
- "-intensity_panning",
- default=False,
- action="store_true",
- help="Intensity panning mode (EFIP)",
- )
- parser.add_argument(
- "azimuth",
- type=float,
- help="Azimuth of direction to compute panning gains for (positive-left)",
- )
- parser.add_argument(
- "elevation",
- type=float,
- help="Elevation of direction to compute panning gains for (positive-up)",
- )
- args = parser.parse_args()
- main(args)
diff --git a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_SBA3.mat b/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_SBA3.mat
deleted file mode 100644
index 0d113a34af498f3c981c6e2d4a59e8dc304851c6..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_SBA3.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:02c8a25178b36399054c1802f00bb5a8739f3ac950c21b0c760c046b1dba530d
-size 36201
diff --git a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_combined.mat b/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_combined.mat
deleted file mode 100644
index e52e031e8c2858501b29b36344144fd9d03f9760..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_combined.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9660be83192f7babb4f67e19653a94bc02cee7b3071065880cf618547c19d842
-size 20138
diff --git a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_full.mat b/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_full.mat
deleted file mode 100644
index f2c22c39ec4f7f176f82f3a198b3ac91954d98fa..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/HRIRs_mat/ORANGE_HRIR_53_48000_full.mat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:05ae461fc303c8498d5912ebe37cd1601c077c2505baf3da3dbe12b37e8f2cf0
-size 14097574
diff --git a/scripts/pyaudio3dtools/__init__.py b/scripts/pyaudio3dtools/__init__.py
index 9870fb6620c859e7e7195c8dae52d16d67841713..33a5d39126901fd6a7f2b2d04168d09cf83ad151 100644
--- a/scripts/pyaudio3dtools/__init__.py
+++ b/scripts/pyaudio3dtools/__init__.py
@@ -43,10 +43,5 @@ class
from . import (
audioarray,
audiofile,
- binauralrenderer,
- hoadecoder,
- spatialaudioconvert,
spatialaudioformat,
- spatialmetadata,
)
-from .EFAP import EFAP
diff --git a/scripts/pyaudio3dtools/audio3dtools.py b/scripts/pyaudio3dtools/audio3dtools.py
index e6c03d7b73a8a068cb4c8f531ddef371ba22085c..cfb7acb9f566d7c4a31b6607c120d2bc5571022e 100755
--- a/scripts/pyaudio3dtools/audio3dtools.py
+++ b/scripts/pyaudio3dtools/audio3dtools.py
@@ -36,8 +36,6 @@ import os
from pyaudio3dtools import (
audiofile,
- binauralrenderer,
- spatialaudioconvert,
spatialaudioformat,
)
@@ -47,245 +45,10 @@ logger.setLevel(logging.DEBUG)
def main():
- parser = argparse.ArgumentParser(
- description="Audio3DTools: Convert/Manipulate spatial audio files."
+ print(
+ f"These scripts have been deprecated! Please check out and use the latest version from https://forge.3gpp.org/rep/ivas-codec-pc/ivas-processing-scripts.git"
)
- """ Required arguments """
- parser.add_argument(
- "-i",
- "--infiles",
- required=True,
- type=str,
- help="input file *.wav or *.pcm or directory",
- default=None,
- )
- parser.add_argument(
- "-o",
- "--outdir",
- required=True,
- type=str,
- help="output file *.wav or directory",
- default="out",
- )
- parser.add_argument(
- "-f",
- "--informat",
- required=True,
- type=str,
- metavar="INFORMAT",
- help="Input format (use -l/-L for a list)",
- default=None,
- )
-
- """ Additional arguments """
- parser.add_argument(
- "-F",
- "--outformat",
- type=str,
- metavar="OUTFORMAT",
- help="Output format (default = %(default)s, same as input format). Can be a custom loudspeaker layout file.",
- default=None,
- )
- parser.add_argument(
- "-s",
- "--infs",
- type=int,
- help="Input sampling rate (Hz) (default = %(default)s, deduced for input file)",
- default=None,
- )
- parser.add_argument(
- "-S",
- "--outfs",
- type=int,
- help="Output sampling rate (Hz) (default = %(default)s, same as input)",
- default=None,
- )
- parser.add_argument(
- "-c",
- "--inchan",
- type=int,
- help="Input number of channels (default = %(default)s, deduced for input file)",
- default=None,
- )
- parser.add_argument(
- "-m",
- "--metadata",
- type=str,
- nargs="+",
- help="list of input metadata files (only relevant for ISM and MASA input)",
- default=None,
- )
- parser.add_argument(
- "-fc",
- "--outfc",
- type=int,
- help="Cut-off freq for eventual low-pass filtering (default = %(default)s)",
- default=None,
- )
- parser.add_argument(
- "-T",
- "--trajectory",
- type=str,
- help="Head-tracking trajectory file (default = %(default)s)",
- default=None,
- )
- parser.add_argument(
- "-n",
- "--normalize",
- default=None,
- type=int,
- help="Normalize to given loudness with --LOUDNESS_TOOL (default = %(default)s)",
- )
-
- """ Miscellaneous or meta arguments """
- parser.add_argument(
- "-b",
- "--binaural",
- help="Binauralize output *in addition to converting to output format",
- action="store_true",
- )
- parser.add_argument(
- "--binaural_dataset",
- type=str,
- help="Dataset to use for binaural rendering (default = %(default)s)",
- choices=["orange51", "orange52", "orange53", "orange54", "sadie"],
- default="orange53",
- )
- parser.add_argument(
- "-l",
- "--list",
- help="list all supported spatial audio formats",
- action="store_true",
- )
- parser.add_argument(
- "-L",
- "--long",
- help="list all supported spatial audio formats with long description",
- action="store_true",
- )
- parser.add_argument(
- "-lt",
- "--loudness_tool",
- default="bs1770demo",
- type=str,
- help="Loudness tool to use: bs1770demo [default] or sv56demo (tool must be in $PATH or a path to the binary)",
- )
- parser.add_argument(
- "-rn",
- "--dont-rename",
- help="Disable default behaviour of renaming output files _.",
- action="store_true",
- )
- args = parser.parse_args()
-
- # Set up logging handlers
- console_handler = logging.StreamHandler()
- console_handler.setLevel(logging.INFO)
- console_handler.setFormatter(logging.Formatter("%(message)s"))
-
- # Configure loggers
- LOGGER_FORMAT = "%(asctime)s | %(name)-12s | %(levelname)-8s | %(message)s"
- LOGGER_DATEFMT = "%m-%d %H:%M"
- logging.basicConfig(
- format=LOGGER_FORMAT,
- datefmt=LOGGER_DATEFMT,
- level=logging.INFO,
- handlers=[console_handler],
- )
- logger.info("Audio3DTools")
- logger.info(
- "Attention: you are using an older version of the pyaudio3dtools scripts (not including ISM-> binaural reference renderer or loudness tool)"
- )
- logger.info("For the newest version see branch python_scripts_updates")
-
- if args.list is True or args.long is True:
- logger.info("===Supported spatial audio formats===")
- spatialaudioformat.Format.list_all(args.long)
-
- elif args.infiles is not None:
- logger.info("===Convert spatial audio file===")
- # Input folder can be a path, a file or a list of files
- if os.path.isdir(args.infiles):
- path = args.infiles
- audio_list = [
- os.path.join(path, f) for f in os.listdir(path) if f.endswith((".wav"))
- ]
- else:
- audio_list = [args.infiles]
-
- outdir = args.outdir
- _, output_ext = os.path.splitext(os.path.basename(outdir))
- if (len(audio_list) == 1) and (
- (output_ext.lower() == ".wav") or (output_ext.lower() == ".pcm")
- ):
- outfile = outdir
- else:
- outfile = None
- if not os.path.exists(outdir):
- os.makedirs(outdir)
-
- for infile in audio_list:
- logger.info(f" process {infile}")
-
- _, input_ext = os.path.splitext(os.path.basename(infile))
-
- if outfile is None:
- outfile = os.path.basename(infile)
- if not args.dont_rename:
- if args.outformat is not None:
- outfile = outfile.replace(input_ext, f"_{args.outformat}.wav")
- else:
- outfile = outfile.replace(input_ext, ".out.wav")
- outfile = os.path.join(outdir, outfile)
-
- spatialaudioconvert.spatial_audio_convert(
- infile,
- outfile,
- in_format=args.informat,
- in_fs=args.infs,
- in_nchans=args.inchan,
- in_meta_files=args.metadata,
- out_format=args.outformat,
- out_fs=args.outfs,
- out_fc=args.outfc,
- output_loudness=args.normalize,
- loudness_tool=args.loudness_tool,
- trajectory=args.trajectory,
- binaural_dataset=args.binaural_dataset,
- )
-
- logger.info(f" Output {outfile}")
-
- if args.binaural:
- if args.outformat.startswith("BINAURAL"):
- raise SystemExit(
- "BINAURAL output format can not be binauralized again!"
- )
-
- _, output_ext = os.path.splitext(os.path.basename(outfile))
- outfile_bin = outfile.replace(output_ext, "_BINAURAL.wav")
- logger.info(f" Output binaural {outfile_bin}")
-
- spatialaudioconvert.spatial_audio_convert(
- in_file=outfile,
- out_file=outfile_bin,
- in_format=args.outformat,
- in_fs=args.outfs,
- in_meta_files=args.metadata,
- out_format="BINAURAL",
- output_loudness=args.normalize,
- loudness_tool=args.loudness_tool,
- trajectory=args.trajectory,
- binaural_dataset=args.binaural_dataset,
- )
-
- outfile = None
- else:
- raise Exception(
- "Input file must be provided for conversion and audio manipulation."
- )
-
if __name__ == "__main__":
main()
diff --git a/scripts/pyaudio3dtools/audioarray.py b/scripts/pyaudio3dtools/audioarray.py
index 87fc50b4632de86fd9e88c4042980cf76fd64f38..740c40c3c6fda3cdc9f0112d3dfbfad9c6f5e1dc 100644
--- a/scripts/pyaudio3dtools/audioarray.py
+++ b/scripts/pyaudio3dtools/audioarray.py
@@ -221,7 +221,7 @@ def cut(x: np.ndarray, limits: Tuple[int, int]) -> np.ndarray:
return y
-def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) -> dict:
+def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) -> dict:
"""Compare two audio arrays
Parameters
@@ -250,7 +250,7 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) ->
"nsamples_diff_percentage": 0.0,
"first_diff_pos_sample": -1,
"first_diff_pos_channel": -1,
- "first_diff_pos_frame": -1
+ "first_diff_pos_frame": -1,
}
if per_frame:
result["max_abs_diff_pos_frame"] = 0
@@ -269,7 +269,7 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) ->
max_diff_pos[0][0] // framesize,
max_diff_pos[1][0],
]
-
+
first_diff_pos = np.nonzero(diff)
first_diff_pos = [
first_diff_pos[0][0],
@@ -454,7 +454,9 @@ def get_framewise(x: np.ndarray, chunk_size: int, zero_pad=False) -> np.ndarray:
if x.shape[0] % chunk_size:
last_chunk = x[n_frames * chunk_size :, :]
if zero_pad:
- yield np.pad(last_chunk, [[0, chunk_size - (x.shape[0] % chunk_size)], [0, 0]])
+ yield np.pad(
+ last_chunk, [[0, chunk_size - (x.shape[0] % chunk_size)], [0, 0]]
+ )
else:
yield last_chunk
diff --git a/scripts/pyaudio3dtools/audiofile.py b/scripts/pyaudio3dtools/audiofile.py
index 77be42285fc7cfe3b0a8fccede6c3d8006a37a0a..5b6ffcdced2c3dadee3224d98d960123df002ec3 100644
--- a/scripts/pyaudio3dtools/audiofile.py
+++ b/scripts/pyaudio3dtools/audiofile.py
@@ -695,7 +695,6 @@ def print_plot_play(x: np.ndarray, fs: int, text: Optional[str] = "") -> None:
def get_wav_file_info(filename: str) -> dict:
-
"""
Get the format information from a WAV file.
Return a dictionary with the format information
@@ -713,7 +712,6 @@ def get_wav_file_info(filename: str) -> dict:
fid = open(filename, "rb")
try:
-
riff = fid.read(4)
if riff == b"RIFF":
@@ -769,7 +767,9 @@ def get_wav_file_info(filename: str) -> dict:
if __name__ == "__main__":
import argparse
- parser = argparse.ArgumentParser(description="Tool for basic operations on audio files")
+ parser = argparse.ArgumentParser(
+ description="Tool for basic operations on audio files"
+ )
subparsers = parser.add_subparsers()
def pre_trim_wrapper(pre_trim_args):
@@ -779,14 +779,21 @@ if __name__ == "__main__":
print("Delay currently only supported with WAV file input")
exit(-1)
- x, _ = readfile(pre_trim_args.input_file, fs=input_file_properties["fs"], nchannels=input_file_properties["channels"])
+ x, _ = readfile(
+ pre_trim_args.input_file,
+ fs=input_file_properties["fs"],
+ nchannels=input_file_properties["channels"],
+ )
trim = int(pre_trim_args.amount_in_ms * input_file_properties["fs"] / 1000)
x = x[trim:]
writefile(pre_trim_args.output_file, x, fs=input_file_properties["fs"])
-
- parser_delay = subparsers.add_parser("pre-trim", help="Trim a given amount of content from the beginning of the file")
- parser_delay.add_argument("amount_in_ms", type=float, help="Trim amount milliseconds.")
+ parser_delay = subparsers.add_parser(
+ "pre-trim", help="Trim a given amount of content from the beginning of the file"
+ )
+ parser_delay.add_argument(
+ "amount_in_ms", type=float, help="Trim amount milliseconds."
+ )
parser_delay.add_argument("input_file")
parser_delay.add_argument("output_file")
parser_delay.set_defaults(func=pre_trim_wrapper)
@@ -799,7 +806,8 @@ if __name__ == "__main__":
convertfile(convert_args.input_file, convert_args.output_file)
parser_convert = subparsers.add_parser(
- "convert", help="Convert file format (output file extension determines output format)"
+ "convert",
+ help="Convert file format (output file extension determines output format)",
)
parser_convert.add_argument("input_file")
parser_convert.add_argument("output_file")
diff --git a/scripts/pyaudio3dtools/binauralrenderer.py b/scripts/pyaudio3dtools/binauralrenderer.py
deleted file mode 100644
index 2567b433db993e0029b66cccc477a44d34ae110b..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/binauralrenderer.py
+++ /dev/null
@@ -1,782 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-import timeit
-from typing import Tuple
-
-import numpy as np
-import scipy.interpolate as interp
-import scipy.io as sio
-import scipy.signal as sig
-from pyaudio3dtools.rotation import rotateHOA, rotateISM, rotateMC
-
-from pyaudio3dtools import audioarray, spatialaudioformat, spatialaudioconvert
-from pyaudio3dtools.constants import *
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-"""" Helper functions """
-
-
-def NS2SA(fs, x):
- return int(int(fs / 100) * ((x) / 100) / 100000)
-
-
-def read_hrirs_from_mat(
- hrirs_path: str = "/HRIRs_mat/ORANGE_HRIR_53_48000_combined.mat",
-) -> np.ndarray:
- """Read HRIRs from Matlab dictionary file mat
-
- Parameters
- ----------
- hrirs_path: str
- HRTFs file name (.mat)
-
- Returns
- -------
- IR: np.ndarray
- array of impulse responses
- SourcePosition: np.ndarray
- array of source positions corresponding to the impulse responses
-
- """
- script_path = os.path.dirname(os.path.abspath(__file__))
- hrirs_filename = script_path + hrirs_path
-
- mat_contents = sio.loadmat(hrirs_filename)
- IR = mat_contents["IR"]
- try:
- SourcePosition = mat_contents["SourcePosition"]
- except KeyError:
- SourcePosition = None
-
- logger.debug(f"Loaded HRIRs: {hrirs_filename}, {IR.shape[0]} by {IR.shape[1]}")
-
- return IR, SourcePosition
-
-
-def get_IR(
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
- dataset: str,
-) -> Tuple[np.ndarray, np.ndarray, float]:
- """get_IR
-
- Parameters
- ----------
- in_spfmt: spatialaudioformat
- input spatial audio format
- out_spfmt: spatialaudioformat
- output spatial audio format
- dataset: str
- name of the HRIRs or BRIRs dataset
-
- Returns
- -------
- IR: np.ndarray
- desired impulse response array
- SourcePosition: np.ndarray
- source positions of corresponding IRs
-
- """
- # override for BRIRs, currently only one option
- if out_spfmt.name == "BINAURAL_ROOM":
- dataset = "mozart_iis"
-
- # dataset file prefix
- if dataset.lower().startswith("sadie"):
- prefix = "/HRIRs_mat/SADIE_II_D2_48K_24bit_256tap"
- elif dataset.lower().startswith("orange"):
- prefix = f"/HRIRs_mat/ORANGE_HRIR_{dataset.replace('_full', '')[-2:]}_48000"
- elif dataset.lower().startswith("mozart"):
- prefix = "/BRIRs_mat/IIS_BRIR_officialMPEG_222UC"
- else:
- raise ValueError(f"Unsupported dataset '{dataset}' for HRIRs")
-
- # dataset file suffix
- if in_spfmt.name.startswith("ISM") or in_spfmt.altname.startswith("CUSTOM_LS"):
- suffix = "full.mat"
- elif in_spfmt.isloudspeaker and in_spfmt.nchannels > 1:
- suffix = "combined.mat"
- elif in_spfmt.ambi_order > 0 or in_spfmt.name.upper() == "MONO":
- suffix = "SBA3.mat"
- else:
- raise ValueError(
- f"Unsupported format '{in_spfmt.name}' for dataset '{dataset}' for HRIRs"
- )
-
- IR, SourcePosition = read_hrirs_from_mat("_".join([prefix, suffix]))
-
- latency_smp = float(np.min(np.argmax(np.sum(np.abs(IR), axis=(1)), axis=(0))))
-
- if in_spfmt.name.startswith("MONO"):
- IR = IR[:, :, :1] # use omni/W from SBA
- elif in_spfmt.name.startswith("STEREO"):
- IR = IR[:, :, :2] # use L and R channels
- elif in_spfmt.isloudspeaker and not in_spfmt.altname.startswith("CUSTOM_LS"):
- # extract positions from the combined file
- tmp_spfmt = spatialaudioformat.Format("COMBINED")
- IR_tmp = IR.copy()
- IR = np.zeros([IR_tmp.shape[0], IR_tmp.shape[1], in_spfmt.nchannels])
-
- ir_index = 0
- for i in range(tmp_spfmt.nchannels):
- for j in range(in_spfmt.nchannels):
- if (
- tmp_spfmt.ls_azi[i] == in_spfmt.ls_azi[j]
- and tmp_spfmt.ls_ele[i] == in_spfmt.ls_ele[j]
- ):
- if j != in_spfmt.lfe_index[0]:
- IR[:, :, ir_index] = IR_tmp[:, :, i]
- ir_index += 1
-
- return IR, SourcePosition, latency_smp
-
-
-def FindFilter(SourcePosition: np.ndarray, azi: float, ele: float) -> int:
- """Find measurement closest to the selected direction,
- reimplemented roughly along the lines of ConvBinauralRenderer.m
-
- Parameters
- ----------
- SourcePosition: np.ndarray
- Source IR positions
- azi: float
- desired response azimuth
- ele: float
- desired response elevation
-
- Returns
- -------
- i_dir: int
- index of nearest SourcePosition
- """
- if azi < 0:
- azi = azi + 360.0
-
- if ele < 0:
- ele = ele + 360.0
-
- delta_azi = np.deg2rad(np.abs(azi - SourcePosition[:, 0]))
- dist = np.arccos(
- np.sin(np.deg2rad(SourcePosition[:, 2])) * np.sin(np.deg2rad(ele))
- + np.cos(np.deg2rad(SourcePosition[:, 1]))
- * np.cos(np.deg2rad(ele))
- * np.cos(delta_azi)
- )
-
- i_dir = np.argmin(dist)
-
- # print('Direction closest to {}, {} is {} with angles {}, {} and distance {}\n'.format(
- # azi, ele, i_dir, SourcePosition[i_dir,0], SourcePosition[i_dir,1], dist[i_dir]
- # )
- # )
-
- return i_dir
-
-
-""" Core binaural rendering functions """
-
-
-def binaural_fftconv(
- x: np.ndarray, IR: np.ndarray, nchannels: int, lfe_index: list = []
-) -> np.ndarray:
- """Binauralization using fft convolution
-
- Parameters
- ----------
- x: np array
- input multi-channel array
- IR: np array
- HRIRs array
- nchannels: int
- maximum number of channels to process
- lfe_index: list
- list of LFE channel indices
-
- Returns
- -------
- y: np.ndarray
- output convolved signal array
-
- """
- y = np.zeros([x.shape[0], 2])
- for chan_idx in range(min(x.shape[1], nchannels)):
- if chan_idx not in lfe_index:
- y[:, 0] = np.add(
- y[:, 0],
- sig.fftconvolve(
- x[:, chan_idx].astype(float), IR[:, 0, chan_idx]
- ).astype(float)[: x.shape[0]],
- )
- y[:, 1] = np.add(
- y[:, 1],
- sig.fftconvolve(
- x[:, chan_idx].astype(float), IR[:, 1, chan_idx]
- ).astype(float)[: x.shape[0]],
- )
- else:
- logger.debug(f" Mute LFE channel of index: {str(chan_idx)}")
-
- return y
-
-
-def binaural_fftconv_framewise(
- x: np.ndarray,
- IR: np.ndarray,
- SourcePosition: np.ndarray,
- azi: np.ndarray = None,
- ele: np.ndarray = None,
- frame_len: int = (IVAS_FRAME_LEN_MS // 4) * 48,
- interp_method="linear",
- verbose=False,
-) -> np.ndarray:
- """Binauralization using fft convolution with frame-wise processing
- supports rotation on trajectories with interpolation between measured Source
- positions, reimplemented roughly along the lines of ConvBinauralRenderer.m
-
- Parameters
- ----------
- x: np.ndarray
- input multi-channel array
- IR: np.ndarray
- HRIRs array
- SourcePosition: np.ndarray
- positions of the source in the measurements in IR
- azi: np.ndarray
- azimuth angles for all frames
- ele: np.ndarray
- elevation angles for all frames
- frame_len: int
- frame length, optional, default = (IVAS_FRAME_LEN_MS // 4) * 48000
- interp_method:
- interpolation method, optional, default = linear
-
-
- Returns
- -------
- y: np.ndarray
- output binaural signal array
-
- """
-
- sig_len = x.shape[0]
- frame_len = (IVAS_FRAME_LEN_MS // 4) * 48
- N_frames = int(sig_len / frame_len)
-
- N_HRIR_taps = IR.shape[2]
-
- if azi is None or ele is None:
- azi = np.repeat([0.0], N_frames)
- ele = np.repeat([0.0], N_frames)
- elif len(azi) < N_frames or len(ele) < N_frames:
- azi = np.concatenate(
- [np.repeat(azi, N_frames // len(azi)), azi[: N_frames % len(azi)]]
- )
- ele = np.concatenate(
- [np.repeat(ele, N_frames // len(ele)), ele[: N_frames % len(ele)]]
- )
-
- iGs = np.zeros([N_frames + 1], dtype=int)
- mGs = np.zeros([N_frames + 1], dtype=int)
-
- # store trajectory as a sequence of indices of source positions
- # on the HRTF database in a compressed format such that, for
- # each new measurement point the trajectory hits, the sample index
- # is stored in mGs and the index of the measurement in iG
- # the number of measurement points hit by the trajectory is nsp
- isp = 0
- iGs[0] = FindFilter(SourcePosition, azi[0], ele[0])
- mGs[0] = 0
- for i_frame in range(1, N_frames):
- iG = FindFilter(SourcePosition, azi[i_frame], ele[i_frame])
- if iG != iGs[isp]:
- isp += 1
- iGs[isp] = iG
- mGs[isp] = i_frame * frame_len + 1
- nsp = isp + 1
-
- # set last fence post explicitly
- if mGs[nsp] < sig_len:
- iGs[nsp] = iG
- mGs[nsp] = sig_len
- nsp = nsp + 1
-
- T_rev = frame_len + N_HRIR_taps - 1
- N_rev = int(np.ceil(T_rev / frame_len))
-
- if verbose:
- print(" N_rev = ", N_rev)
-
- fastcode = True
- if N_rev > 5:
- if verbose:
- print(
- " __ __ ___ ___ _ _ ___ _ _ ___ "
- )
- print(
- r" \ \ / / / \ | _ \ | \| | |_ _| | \| | / __|"
- )
- print(
- r" \ \/\/ / | - | | / | . | | | | . | | (_ |"
- )
- print(
- r" \_/\_/ |_|_| |_|_\ |_|\_| |___| |_|\_| \___|"
- )
- print(
- " "
- )
- print(
- " You are using very long filters! This will be slooooow and use a lot of memory!"
- )
- else:
- fastcode = False
-
- if fastcode and verbose:
- print(
- " __ __ ___ ___ _ _ ___ _ _ ___ "
- )
- print(
- r" \ \ / / / \ | _ \ | \| | |_ _| | \| | / __|"
- )
- print(
- r" \ \/\/ / | - | | / | . | | | | . | | (_ |"
- )
- print(
- r" \_/\_/ |_|_| |_|_\ |_|\_| |___| |_|\_| \___|"
- )
- print(
- " "
- )
- print(
- " To speed up the otherwise extremely slow calculation, we only calculate the "
- )
- print(
- " responses of the latest frame with the latest filters instead of the full "
- )
- print(
- " integrals. This is much faster but much more prone to clicks. Inspect your "
- )
- print(
- " output signals carefully! To change this behavior, go to binauralrenderer.py "
- )
- print(
- " and set fastcode to False. "
- )
-
- y = np.zeros([sig_len + T_rev, 2])
- y0 = np.zeros([N_rev, sig_len + T_rev, 2])
-
- fade_in = np.arange(frame_len) / (frame_len - 1)
- fade_in = fade_in[:, np.newaxis]
- fade_out = 1.0 - fade_in
-
- for i_ear in [0, 1]:
-
- Gs = IR[
- iGs[0:nsp], i_ear, :
- ] # Green's function along the trajectory sampled by the measurement points
- interp_G = interp.interp1d(
- mGs[0:nsp], Gs, kind=interp_method, axis=0
- ) # interpolator for Green's function between those points
-
- G = interp_G(np.arange(0, sig_len, frame_len))
-
- t0 = timeit.default_timer()
-
- if fastcode:
- for i_frame in range(N_frames):
-
- i1 = i_frame * frame_len
- i2 = (i_frame + 1) * frame_len
- i2p = i1 + T_rev
-
- fade_out = np.linspace(0.0, 1.0, T_rev, endpoint=False)
- fade_in = 1.0 - fade_out
-
- for j_frame in [0, 1]:
- G_n_m = G[min(j_frame + i_frame, N_frames - 1), :]
- y0[j_frame, i1:i2p, i_ear] = sig.oaconvolve(
- np.squeeze(x[i1:i2]), G_n_m
- )
-
- y[i1:i2p, i_ear] = (
- np.squeeze(fade_out) * y0[0, i1:i2p, i_ear]
- + np.squeeze(fade_in) * y0[1, i1:i2p, i_ear]
- )
-
- t1 = timeit.default_timer()
- fps = (i_frame + 1) / (t1 - t0)
- eta = (2 * N_frames - (i_frame + 1) + i_ear * N_frames) / fps
-
- if verbose:
- print(
- " Frame {}/{} on ear {}/2 done at {: 3.1f} fps, ETA {: 6.0f} s ".format(
- i_frame + 1, N_frames, i_ear + 1, fps, eta
- ),
- end="\r",
- )
-
- else:
- for i_frame in range(N_frames):
-
- i1 = i_frame * frame_len
- i2 = (i_frame + 1) * frame_len
- i2p = i1 + T_rev
-
- y0[:] = 0.0
- for j_frame in range(
- max(0, i_frame - N_rev), min(i_frame + 1, N_frames)
- ):
-
- j1 = j_frame * frame_len
- j2 = (j_frame + 1) * frame_len
- j2p = j1 + T_rev
-
- G0 = G[i_frame]
- G1 = G[min(i_frame + 1, N_frames - 1)]
-
- y0[0, j1:j2p, i_ear] += sig.oaconvolve(np.squeeze(x[j1:j2]), G0)
- y0[1, j1:j2p, i_ear] += sig.oaconvolve(np.squeeze(x[j1:j2]), G1)
-
- y[i1:i2, i_ear] = (
- np.squeeze(fade_out) * y0[0, i1:i2, i_ear]
- + np.squeeze(fade_in) * y0[1, i1:i2, i_ear]
- )
-
- t1 = timeit.default_timer()
- fps = (i_frame + 1) / (t1 - t0)
- eta = (2 * N_frames - (i_frame + 1) + i_ear * N_frames) / fps
-
- if verbose:
- print(
- " Frame {}/{} on ear {}/2 done at {: 3.1f} fps, ETA {: 6.0f} s ".format(
- i_frame + 1, N_frames, i_ear + 1, fps, eta
- ),
- end="\r",
- )
-
- if verbose:
- print("")
-
- return y[0:sig_len]
-
-
-def binaural_render_LFE(
- x: np.ndarray,
- fs: int = 48000,
- lfe_index: list = [3],
- LFE_gain: float = 10 ** (5.5 / 20),
- latency_smp: int = 0,
-) -> np.ndarray:
- """
- Extract LFE from the given input and render
- it binaurally, accounting for delay of the
- """
-
- lfe = x[:, lfe_index].copy()
-
- # if there is more than one LFE sum them into one
- if lfe.shape[1] > 1:
- lfe = np.sum(lfe, axis=1)
-
- # TODO tmu - disabled temporarily here, disabled in C
- lfe_delay_ns = 0
- """
- # 120 Hz low-pass filtering for LFE using IVAS filter coefficients
- if fs == 48000:
- lfe = sig.sosfilt(IVAS_LPF_4_BUTTER_48K_SOS, lfe, axis=0)
- else:
- raise NotImplementedError("Only 48 kHz supported at the moment!")
-
- # 3.5ms LP filter delay from IVAS ROM
- lfe_delay_ns = 0.0035 * 1e9
- lfe_delay_smp = round(lfe_delay_ns * fs / 1e9)
-
- # Delay LFE by the same amount as the HRTF delay
- lfe = np.roll(lfe, round(latency_smp), axis=0)
- lfe[0 : round(latency_smp), :] = 0
- """
-
- # apply gain
- lfe *= LFE_gain
-
- # duplicate for each binaural channel
- lfe = np.hstack([lfe, lfe])
-
- return lfe, lfe_delay_ns
-
-
-""" Format specific wrapper functions """
-
-
-def render_custom_ls_binaural(
- x: np.ndarray,
- fs: int,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
- IR: np.ndarray,
- SourcePosition: np.ndarray,
- trajectory: np.ndarray,
-) -> np.ndarray:
-
- ls_azi_all = in_spfmt.ls_azi
- ls_ele_all = in_spfmt.ls_ele
- lfe_index_all = in_spfmt.lfe_index
-
- logger.info(" Processing channels on custom LS layout")
- azis = ", ".join([f"{a:7.2f}" for a in ls_azi_all])
- eles = ", ".join([f"{e:7.2f}" for e in ls_ele_all])
- logger.info(f" azi: {azis}")
- logger.info(f" ele: {eles}")
- logger.info(f" lfe_index: {lfe_index_all}")
-
- if out_spfmt.name == "BINAURAL_ROOM":
- tmp_spfmt = spatialaudioformat.Format("7_1_4")
- x = spatialaudioconvert.convert_mc(x, in_spfmt, tmp_spfmt)
- ls_azi_all = tmp_spfmt.ls_azi
- ls_ele_all = tmp_spfmt.ls_ele
- lfe_index_all = tmp_spfmt.lfe_index
- logger.info(f" {in_spfmt.name} -> {tmp_spfmt.name} -> {out_spfmt.name}")
-
- frame_len = (IVAS_FRAME_LEN_MS // 4) * (fs // 1000)
- sig_len = x.shape[0]
- N_frames = int(sig_len / frame_len)
-
- i_ls = 0
- y = np.zeros([sig_len, 2])
- for i_chan in range(x.shape[1]):
-
- # skip LFE
- if i_chan in lfe_index_all:
- continue
-
- # skip silent (or very low volume) channels
- if np.allclose(x[:, i_chan], 0.0, atol=32.0):
- continue
-
- ls_azi = np.repeat(ls_azi_all[i_ls], N_frames)
- ls_ele = np.repeat(ls_ele_all[i_ls], N_frames)
-
- azi, ele = rotateISM(ls_azi, ls_ele, trajectory=trajectory)
-
- y += binaural_fftconv_framewise(
- x[:, i_chan],
- IR,
- SourcePosition,
- frame_len=frame_len,
- azi=azi,
- ele=ele,
- verbose=False,
- )
- i_ls += 1
-
- return y
-
-
-def render_ism_binaural(
- x: np.ndarray,
- fs: int,
- IR: np.ndarray,
- SourcePosition: np.ndarray,
- trajectory: np.ndarray,
- in_pos: np.ndarray,
-) -> np.ndarray:
-
- frame_len = (IVAS_FRAME_LEN_MS // 4) * (fs // 1000)
- sig_len = x.shape[0]
- N_frames = int(sig_len / frame_len)
-
- # get ISM metadata and repeat it nsubframe times
- pos_data = []
- for pos in in_pos:
- pos_data.extend(
- [pos["azimuth"], pos["elevation"]] for _ in range(pos["use_for_frames"])
- )
- pos_data = np.array(pos_data)
- pos_data = np.repeat(pos_data, 4, axis=0)
-
- # extract positions only according to the audio duration
- pos_data = pos_data[:N_frames, :]
-
- azi, ele = rotateISM(pos_data[:, 0], pos_data[:, 1], trajectory=trajectory)
-
- y = np.zeros([sig_len, 2])
- y += binaural_fftconv_framewise(
- x,
- IR,
- SourcePosition,
- frame_len=frame_len,
- azi=azi,
- ele=ele,
- verbose=False,
- )
-
- return y
-
-
-def render_masa_binaural(
- x: np.ndarray,
- fs: int,
- in_spfmt: spatialaudioformat.Format,
- IR: np.ndarray,
- SourcePosition: np.ndarray,
- trajectory: np.ndarray,
-):
- y = x[:, :2]
- # TODO
- return y
-
-
-def render_ambi_ls_binaural(
- x: np.ndarray,
- fs: int,
- in_spfmt: spatialaudioformat.Format,
- IR: np.ndarray,
- trajectory: np.ndarray,
-) -> np.ndarray:
-
- y = x[:]
- if trajectory is not None:
- if in_spfmt.ambi_order > 0:
- y = rotateHOA(y, trajectory)
- if in_spfmt.isloudspeaker:
- y = rotateMC(y, trajectory, in_spfmt)
-
- y = binaural_fftconv(y, IR, in_spfmt.nchannels, in_spfmt.lfe_index)
-
- return y
-
-
-""" Wrapper function for generic binaural rendering """
-
-
-def binaural_rendering(
- x: np.ndarray,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
- dataset: str = "orange53",
- fs: int = 48000,
- trajectory: str = None,
- include_LFE: bool = False,
- LFE_gain: float = 10 ** (5.5 / 20),
- in_pos: dict = None,
-):
- """Binaural rendering
-
- Parameters
- ----------
- x: np array
- input multi-channel array
- in_spfmt_name: str
- name of input spatial format
- dataset: str
- name of the HRIRs or BRIRs dataset
- fs: int
- input/output sampling-rate (default 48kHz)
- trajectory: str
- path to trajectory file
-
- Returns
- -------
- y: np.ndarray
- output binaural signal array
-
- """
-
- if trajectory is not None:
- logger.info(
- " performing rotation along trajectory from file {}".format(trajectory)
- )
-
- # resample to 48 kHz
- y = audioarray.resample(x, fs, 48000)
- delay_total_ns = 0
-
- # get IR corresponding to the input and output formats
- IR, SourcePosition, latency_smp = get_IR(in_spfmt, out_spfmt, dataset)
- delay_total_ns += latency_smp / float(fs) * 1e9
-
- # prepare LFE signal to be added to output
- if include_LFE and in_spfmt.isloudspeaker and in_spfmt.lfe_index:
- lfe, lfe_delay_ns = binaural_render_LFE(
- x, 48000, in_spfmt.lfe_index, LFE_gain, latency_smp
- )
- delay_total_ns += lfe_delay_ns
-
- # get binauralized signal based on format
- if in_spfmt.altname.startswith("CUSTOM_LS"):
- y = render_custom_ls_binaural(
- x, fs, in_spfmt, out_spfmt, IR, SourcePosition, trajectory
- )
- elif in_spfmt.name.startswith("ISM"):
- if not in_pos:
- raise ValueError("ISM metadata empty!")
- y = render_ism_binaural(
- x,
- fs,
- IR,
- SourcePosition,
- trajectory,
- in_pos,
- )
- elif in_spfmt.name.startswith("MASA"):
- y = render_masa_binaural(x, fs, in_spfmt, IR, SourcePosition, trajectory)
- elif in_spfmt.ambi_order > 0 or in_spfmt.isloudspeaker:
- y = render_ambi_ls_binaural(x, fs, in_spfmt, IR, trajectory)
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
- # add LFE signal to output
- if include_LFE and in_spfmt.isloudspeaker and in_spfmt.lfe_index:
- # delay the binauralized signal by the LFE delay
- lfe_delay_smp = NS2SA(fs, int(lfe_delay_ns))
- y = np.roll(y, lfe_delay_smp, axis=0)
- y[0:lfe_delay_smp, :] = 0
- y += lfe
-
- # delay compensation
- delay_total_smp = NS2SA(fs, delay_total_ns)
- y = np.roll(y, -delay_total_smp, axis=0)
- if delay_total_smp > 0:
- y[-delay_total_smp:, :] = 0
-
- # resample back to original rate
- y = audioarray.resample(y, 48000, fs)
-
- return y
diff --git a/scripts/pyaudio3dtools/hoadecoder.py b/scripts/pyaudio3dtools/hoadecoder.py
deleted file mode 100644
index c37ceb3bdcf6f04a91308583ac3d5c9df76c12a5..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/hoadecoder.py
+++ /dev/null
@@ -1,186 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-from typing import Optional
-
-import numpy as np
-from scipy.special import lpmv
-
-from pyaudio3dtools import spatialaudioformat
-from pyaudio3dtools.constants import T_DESIGN_11_AZI, T_DESIGN_11_ELE
-from pyaudio3dtools.EFAP import EFAP
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-def get_hoa_mtx(
- ambi_order: int,
- spkrlayout: spatialaudioformat,
- norm: Optional[str] = "sn3d",
- rE_weight: Optional[bool] = False,
- intensity_panning: Optional[bool] = True,
-) -> np.ndarray:
- nharm = spatialaudioformat.Format.nchannels_from_ambiorder(ambi_order)
- if spkrlayout.name == "MONO":
- mtx_hoa_dec = np.zeros([1, nharm])
- mtx_hoa_dec[0, 0] = 1
- elif spkrlayout.name == "STEREO":
- mtx_hoa_dec = np.zeros([2, nharm])
- # Cardioids +/- 90 degrees
- mtx_hoa_dec[0, 0] = 0.5
- mtx_hoa_dec[0, 1] = 0.5
- mtx_hoa_dec[1, 0] = 0.5
- mtx_hoa_dec[1, 1] = -0.5
- elif spkrlayout.isloudspeaker:
- Y_td = getRSH(
- T_DESIGN_11_AZI,
- T_DESIGN_11_ELE,
- ambi_order,
- norm="ortho",
- )
- Y_td *= np.sqrt(4 * np.pi)
-
- n_ls_woLFE = spkrlayout.nchannels - len(spkrlayout.lfe_index)
- ls_azi_woLFE = np.delete(spkrlayout.ls_azi, spkrlayout.lfe_index).astype(float)
- ls_ele_woLFE = np.delete(spkrlayout.ls_ele, spkrlayout.lfe_index).astype(float)
-
- panner = EFAP(ls_azi_woLFE, ls_ele_woLFE, intensity_panning)
- G_td = panner.pan(T_DESIGN_11_AZI, T_DESIGN_11_ELE)
-
- mtx_hoa_dec = (G_td.T @ Y_td.T) / T_DESIGN_11_AZI.size
-
- if norm == "sn3d":
- mtx_hoa_dec = mtx_hoa_dec @ np.diag(sn2n(ambi_order))
- elif norm == "ortho":
- mtx_hoa_dec *= np.sqrt(4 * np.pi)
-
- if rE_weight:
- a_n = rE_weight(ambi_order)
- nrg_pre = np.sqrt(len(n_ls_woLFE) / np.sum(a_n**2))
- mtx_hoa_dec = mtx_hoa_dec @ np.diag(a_n) * nrg_pre
-
- mtx_hoa_dec = np.insert(
- mtx_hoa_dec, spkrlayout.lfe_index, np.zeros(nharm), axis=0
- )
- else:
- raise ValueError(
- f"Unsupported spatial audio format for ALLRAD: {spkrlayout.name}"
- )
-
- return mtx_hoa_dec
-
-
-def hoa_linear_decoding(signal_in: np.ndarray, mtx_hoa_dec: np.ndarray) -> np.ndarray:
- if not signal_in.shape[1] == mtx_hoa_dec.shape[1]:
- raise Exception(
- "Input number of channels must be equal to renderer matrix second dimension"
- )
-
- signal_out = np.dot(signal_in, mtx_hoa_dec.transpose())
-
- logger.debug(f"Signal out: {signal_out.shape[0]} by {signal_out.shape[1]}")
-
- return signal_out
-
-
-def rE_weight(order: int) -> np.ndarray:
- return np.array(
- [
- lpmv(0, l, np.cos(np.deg2rad(137.9) / (order + 1.51)))
- for l in range(order + 1)
- for _ in range(-l, l + 1)
- ]
- ).T
-
-
-def n2sn(order: int) -> np.ndarray:
- return np.array(
- [1.0 / np.sqrt(2 * l + 1) for l in range(order + 1) for _ in range(-l, l + 1)]
- )
-
-
-def sn2n(order: int) -> np.ndarray:
- return np.array(
- [np.sqrt(2 * l + 1) for l in range(order + 1) for _ in range(-l, l + 1)]
- )
-
-
-def getRSH(
- azi: np.ndarray,
- ele: np.ndarray,
- ambi_order: int,
- norm: Optional[str] = "sn3d",
- degrees: Optional[bool] = True,
-) -> np.ndarray:
- """
- Returns real spherical harmonic response for the given position(s)
- """
- if degrees:
- azi = np.deg2rad(azi)
- ele = np.deg2rad(ele)
-
- LM = np.array([(l, m) for l in range(ambi_order + 1) for m in range(-l, l + 1)])
-
- response = np.zeros([LM.shape[0], azi.shape[0]])
-
- # trig_term * legendre * uncondon
- for i, (l, m) in enumerate(LM):
- # N3D norm
- response[i, :] = np.sqrt(
- ((2 * l + 1) * np.math.factorial(l - np.abs(m)))
- / (4 * np.pi * np.math.factorial(l + np.abs(m)))
- )
-
- # trig term
- if m < 0:
- response[i, :] *= np.sqrt(2) * np.sin(azi * np.abs(m))
- elif m == 0:
- pass # response[i,:] *= 1
- else:
- response[i, :] *= np.sqrt(2) * np.cos(azi * m)
-
- # legendre polynomial
- response[i, :] *= lpmv(np.abs(m), l, np.sin(ele)) * ((-1) ** np.abs(m))
-
- if norm == "sn3d":
- response *= np.sqrt(4 * np.pi)
- response[:] = np.diag(n2sn(ambi_order)) @ response
- elif norm == "n3d":
- response *= np.sqrt(4 * np.pi)
- else:
- pass # ortho
-
- return response
diff --git a/scripts/pyaudio3dtools/masarenderer.py b/scripts/pyaudio3dtools/masarenderer.py
deleted file mode 100644
index ff9a3612a4f86ba7211708be81f678aadf5141a2..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/masarenderer.py
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-
-import os
-import shutil
-import subprocess as sp
-from tempfile import TemporaryDirectory
-
-import numpy as np
-
-from pyaudio3dtools.audiofile import readfile, writefile
-from pyaudio3dtools.spatialaudioformat import Format
-
-
-def render_masa(
- in_sig: str,
- in_meta: str,
- in_spfmt: Format,
- out_spfmt: Format,
-) -> np.ndarray:
- """Python wrapper for masaRenderer binaray
-
- Parameters
- ----------
- in_sig: np.ndarray
- Input signal with MASA transport channels
- in_meta: str
- Input MASA metadata file
- in_spfmt: Format
- Input spatial audio format
- out_spfmt: Format
- Output spatial audio format
-
- Returns
- -------
- out_sig: np.ndarray
- Rendered signal
- fs : int
- Sampling frequency (always 48 kHz for masaRenderer)
- """
-
- if shutil.which("masaRenderer") is None:
- raise FileNotFoundError("The masaRenderer binary was not found in path!")
-
- with TemporaryDirectory() as tmp_dir:
- MASA_RENDERER_CMD = [
- "masaRenderer",
- "", # outputMode -LS51, -LS714 or BINAURAL
- "", # input PCM
- in_meta[0],
- "", # output PCM
- ]
-
- cmd = MASA_RENDERER_CMD[:]
- if out_spfmt.name.startswith("BINAURAL"):
- cmd[1] = "-BINAURAL"
- out_nchan = 2
- elif out_spfmt.name == "5_1":
- cmd[1] = "-LS51"
- out_nchan = 6
- else:
- cmd[1] = "-LS714"
- out_nchan = 12
-
- tmp_in = os.path.join(tmp_dir, "tmp_masa_in.pcm")
- tmp_out = os.path.join(tmp_dir, "tmp_masa_out.pcm")
-
- cmd[2] = tmp_in
- cmd[4] = tmp_out
-
- writefile(tmp_in, in_sig, 48000)
-
- try:
- result = sp.run(cmd, check=True, capture_output=True, text=True)
- except sp.CalledProcessError as e:
- raise SystemError(
- f"Command returned non-zero exit status ({e.returncode}): {' '.join(e.cmd)}\n{e.stderr}\n{e.stdout}"
- )
-
- out_sig, _ = readfile(tmp_out, out_nchan, 48000)
-
- return out_sig
diff --git a/scripts/pyaudio3dtools/quaternions/functions.py b/scripts/pyaudio3dtools/quaternions/functions.py
deleted file mode 100644
index 6b30ccb5ee0e269cde63149b78ee15a5dbab332f..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/quaternions/functions.py
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-from typing import Tuple
-import numpy as np
-
-
-def Quat2Euler(quat: np.ndarray, degrees: bool = True):
- "Convert Quaternion to Euler angles"
-
- sinr = +2.0 * (quat[..., 0] * quat[..., 1] + quat[..., 2] * quat[..., 3])
- cosr = +1.0 - 2.0 * (quat[..., 1] * quat[..., 1] + quat[..., 2] * quat[..., 2])
- roll = np.arctan2(sinr, cosr)
-
- sinp = +2.0 * (quat[..., 0] * quat[..., 2] - quat[..., 3] * quat[..., 1])
- pitch = np.where(np.fabs(sinp) >= 1, np.copysign(np.pi / 2, sinp), np.arcsin(sinp))
-
- siny = +2.0 * (quat[..., 0] * quat[..., 3] + quat[..., 1] * quat[..., 2])
- cosy = +1.0 - 2.0 * (quat[..., 2] * quat[..., 2] + quat[..., 3] * quat[..., 3])
- yaw = np.arctan2(siny, cosy)
-
- ypr = np.array([yaw, pitch, roll]).T
-
- if degrees:
- ypr = np.rad2deg(ypr)
-
- return ypr
-
-
-def Euler2Quat(ypr: np.ndarray, degrees: bool = True):
- "Convert Euler angles to Quaternion"
-
- if degrees:
- ypr = np.deg2rad(ypr)
-
- if len(ypr.shape) == 2:
- N_quat = ypr.shape[0]
- quat = np.zeros([N_quat, 4])
- yaw = ypr[:, 0]
- pitch = ypr[:, 1]
- roll = ypr[:, 2]
- else:
- quat = np.zeros([4])
- yaw = ypr[0]
- pitch = ypr[1]
- roll = ypr[2]
-
- c1 = np.cos(0.5 * yaw)
- c2 = np.cos(0.5 * pitch)
- c3 = np.cos(0.5 * roll)
-
- s1 = np.sin(0.5 * yaw)
- s2 = np.sin(0.5 * pitch)
- s3 = np.sin(0.5 * roll)
-
- quat[..., 0] = c3 * c2 * c1 + s3 * s2 * s1
- quat[..., 1] = s3 * c2 * c1 - c3 * s2 * s1
- quat[..., 2] = s3 * c2 * s1 + c3 * s2 * c1
- quat[..., 3] = c3 * c2 * s1 - s3 * s2 * c1
-
- return quat
-
-
-def Quat2RotMat(quat: np.ndarray):
- "Convert quaternion to rotation matrix"
-
- R = np.zeros([3, 3])
-
- if quat[0] != -3:
-
- # Quaternions
- # formula taken from ivas_rotation.c
-
- R[0, 0] = (
- quat[0] * quat[0]
- + quat[1] * quat[1]
- - quat[2] * quat[2]
- - quat[3] * quat[3]
- )
- R[0, 1] = 2.0 * (quat[1] * quat[2] - quat[0] * quat[3])
- R[0, 2] = 2.0 * (quat[1] * quat[3] + quat[0] * quat[2])
-
- R[1, 0] = 2.0 * (quat[1] * quat[2] + quat[0] * quat[3])
- R[1, 1] = (
- quat[0] * quat[0]
- - quat[1] * quat[1]
- + quat[2] * quat[2]
- - quat[3] * quat[3]
- )
- R[1, 2] = 2.0 * (quat[2] * quat[3] - quat[0] * quat[1])
-
- R[2, 0] = 2.0 * (quat[1] * quat[3] - quat[0] * quat[2])
- R[2, 1] = 2.0 * (quat[2] * quat[3] + quat[0] * quat[1])
- R[2, 2] = (
- quat[0] * quat[0]
- - quat[1] * quat[1]
- - quat[2] * quat[2]
- + quat[3] * quat[3]
- )
-
- else:
-
- # Euler angles in R_X(roll)*R_Y(pitch)*R_Z(yaw) convention
- #
- # yaw: rotate scene counter-clockwise in the horizontal plane
- # pitch: rotate scene in the median plane, increase elevation with positive values
- # roll: rotate scene from the right ear to the top
- #
- # formula taken from ivas_rotation.c
-
- c1 = np.cos(quat[3] / 180.0 * np.pi)
- c2 = np.cos(quat[2] / 180.0 * np.pi)
- c3 = np.cos(quat[1] / 180.0 * np.pi)
-
- s1 = np.sin(quat[3] / 180.0 * np.pi)
- s2 = np.sin(-quat[2] / 180.0 * np.pi)
- s3 = np.sin(quat[1] / 180.0 * np.pi)
-
- R[0, 0] = c2 * c3
- R[0, 1] = -c2 * s3
- R[0, 2] = s2
-
- R[1, 0] = c1 * s3 + c3 * s1 * s2
- R[1, 1] = c1 * c3 - s1 * s2 * s3
- R[1, 2] = -c2 * s1
-
- R[2, 0] = s1 * s3 - c1 * c3 * s2
- R[2, 1] = c3 * s1 + c1 * s2 * s3
- R[2, 2] = c1 * c2
-
- return R
-
-
-def rotateAziEle(
- azi: float, ele: float, R: np.ndarray, is_planar: bool = False
-) -> Tuple[float, float]:
- w = np.cos(np.deg2rad(ele))
- dv = np.array(
- [
- w * np.cos(np.deg2rad(azi)),
- w * np.sin(np.deg2rad(azi)),
- np.sin(np.deg2rad(ele)),
- ]
- )
-
- dv_rot = R @ dv
-
- azi = np.rad2deg(np.arctan2(dv_rot[1], dv_rot[0]))
- if is_planar:
- ele = 0
- else:
- ele = np.rad2deg(np.arctan2(dv_rot[2], np.sqrt(np.sum(dv_rot[:2] ** 2))))
-
- return azi, ele
diff --git a/scripts/pyaudio3dtools/rotation.py b/scripts/pyaudio3dtools/rotation.py
deleted file mode 100644
index cbd76aef3fe468378674cd13dc5de12f4ef60c02..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/rotation.py
+++ /dev/null
@@ -1,346 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import numpy as np
-
-from pyaudio3dtools import EFAP, spatialaudioformat
-from pyaudio3dtools.constants import *
-from pyaudio3dtools.quaternions.functions import Quat2RotMat, rotateAziEle
-
-#########################################################################
-# Helper functions used by Ruedenberg,
-# an implementation of the algorithm in
-# Ivanic, J. & Ruedenberg, K., J. Phys. Chem. 100, 6342 (1996)
-# translated from ivas_rotation.c
-#########################################################################
-
-
-def SHrot_p(
- i: int, l: int, a: int, b: int, SHrotmat: np.ndarray, R_lm1: np.ndarray
-) -> float:
- """Helper function to calculate the ps"""
-
- ri1 = SHrotmat[i + 1 + 1][1 + 1 + 1]
- rim1 = SHrotmat[i + 1 + 1][-1 + 1 + 1]
- ri0 = SHrotmat[i + 1 + 1][0 + 1 + 1]
-
- if b == -l:
- R_lm1_1 = R_lm1[a + l - 1][0]
- R_lm1_2 = R_lm1[a + l - 1][2 * l - 2]
- p = ri1 * R_lm1_1 + rim1 * R_lm1_2
- else:
- if b == l:
- R_lm1_1 = R_lm1[a + l - 1][2 * l - 2]
- R_lm1_2 = R_lm1[a + l - 1][0]
- p = ri1 * R_lm1_1 - rim1 * R_lm1_2
- else:
- R_lm1_1 = R_lm1[a + l - 1][b + l - 1]
- p = ri0 * R_lm1_1
-
- return p
-
-
-def SHrot_u(l: int, m: int, n: int, SHrotmat: np.ndarray, R_lm1: np.ndarray) -> float:
- """Helper function to calculate the us"""
- return SHrot_p(0, l, m, n, SHrotmat, R_lm1)
-
-
-def SHrot_v(l: int, m: int, n: int, SHrotmat: np.ndarray, R_lm1: np.ndarray) -> float:
- """Helper function to calculate the vs"""
-
- if m == 0:
- p0 = SHrot_p(1, l, 1, n, SHrotmat, R_lm1)
- p1 = SHrot_p(-1, l, -1, n, SHrotmat, R_lm1)
- return p0 + p1
- else:
- if m > 0:
- d = 1.0 if (m == 1) else 0.0
- p0 = SHrot_p(1, l, m - 1, n, SHrotmat, R_lm1)
- p1 = SHrot_p(-1, l, -m + 1, n, SHrotmat, R_lm1)
- return p0 * np.sqrt(1.0 + d) - p1 * (1.0 - d)
- else:
- d = 1.0 if (m == -1) else 0.0
- p0 = SHrot_p(1, l, m + 1, n, SHrotmat, R_lm1)
- p1 = SHrot_p(-1, l, -m - 1, n, SHrotmat, R_lm1)
- return p0 * (1.0 - d) + p1 * np.sqrt(1.0 + d)
-
-
-def SHrot_w(l: int, m: int, n: int, SHrotmat: np.ndarray, R_lm1: np.ndarray) -> float:
- """Helper function to calculate the w"""
- if m == 0:
- raise ValueError("ERROR should not be called\n")
- else:
- if m > 0:
- p0 = SHrot_p(1, l, m + 1, n, SHrotmat, R_lm1)
- p1 = SHrot_p(-1, l, -m - 1, n, SHrotmat, R_lm1)
- return p0 + p1
- else:
- p0 = SHrot_p(1, l, m - 1, n, SHrotmat, R_lm1)
- p1 = SHrot_p(-1, l, -m + 1, n, SHrotmat, R_lm1)
- return p0 - p1
-
-
-########################################
-# SHD rotation matrix calculation
-# translated from ivas_rotation.c
-########################################
-def SHrotmatgen(R: np.ndarray, order: int = 3) -> np.ndarray:
- """Calculate SHD roatation matrix from that in real space
-
- Parameters:
- ----------
- R: np.ndarray
- real-space rotation matrix
-
- order: Optional[int]
- Ambisonics order, default = 3
-
- Returns:
- ----------
- SHrotmat: np.ndarray
- SHD rotation matrix
-
- """
- dim = (order + 1) * (order + 1)
-
- SHrotmat = np.zeros([dim, dim])
- R_lm1 = np.zeros([dim, dim])
- R_l = np.zeros([dim, dim])
-
- SHrotmat[0][0] = 1.0
-
- SHrotmat[1][1] = R[1][1]
- SHrotmat[1][2] = R[1][2]
- SHrotmat[1][3] = R[1][0]
-
- SHrotmat[2][1] = R[2][1]
- SHrotmat[2][2] = R[2][2]
- SHrotmat[2][3] = R[2][0]
-
- SHrotmat[3][1] = R[0][1]
- SHrotmat[3][2] = R[0][2]
- SHrotmat[3][3] = R[0][0]
-
- for i in range(2 * 1 + 1):
- for j in range(2 * 1 + 1):
- R_lm1[i][j] = SHrotmat[i + 1][j + 1]
-
- band_idx = 4
- for l in range(2, order + 1):
-
- R_l[:, :] = 0.0
-
- for m in range(-l, l + 1):
-
- d = 1 if (m == 0) else 0
- absm = abs(m)
- sql2mm2 = np.sqrt((l * l - m * m))
- sqdabsm = np.sqrt(((1 + d) * (l + absm - 1) * (l + absm)))
- sqlabsm = np.sqrt(((l - absm - 1) * (l - absm)))
-
- for n in range(-l, l + 1):
- if abs(n) == l:
- sqdenom = np.sqrt((2 * l) * (2 * l - 1))
- else:
- sqdenom = np.sqrt(l * l - n * n)
-
- u = sql2mm2 / sqdenom
- v = sqdabsm / sqdenom * (1 - 2 * d) * 0.5
- w = sqlabsm / sqdenom * (1 - d) * (-0.5)
-
- if u != 0:
- u = u * SHrot_u(l, m, n, SHrotmat, R_lm1)
- if v != 0:
- v = v * SHrot_v(l, m, n, SHrotmat, R_lm1)
- if w != 0:
- w = w * SHrot_w(l, m, n, SHrotmat, R_lm1)
- R_l[m + l][n + l] = u + v + w
-
- for i in range(2 * l + 1):
- for j in range(2 * l + 1):
- SHrotmat[band_idx + i][band_idx + j] = R_l[i][j]
-
- for i in range(2 * l + 1):
- for j in range(2 * l + 1):
- R_lm1[i][j] = R_l[i][j]
-
- band_idx += 2 * l + 1
-
- return SHrotmat
-
-
-def rotateHOA(x: np.ndarray, trajectory: str) -> np.ndarray:
- """Rotate HOA signal by applying a rotation matrix calculated from the current quaternion
- in each subframe
-
- Parameters:
- ----------
- x: np.ndarray
- input signal upto HOA3
- trajectory: str
- path to trajectory file
-
- Returns:
- ----------
- y: np.ndarray
- rotated HOA signal
- """
-
- trj_data = np.genfromtxt(trajectory, delimiter=",")
- trj_frames = trj_data.shape[0]
-
- sig_len = x.shape[0]
- sig_dim = x.shape[1]
- frame_len = (IVAS_FRAME_LEN_MS // 4) * 48
- N_frames = int(sig_len / frame_len)
-
- if sig_dim not in [4, 9, 16]:
- raise ValueError("rotateHOA can only handle FOA, HOA2 or HOA3 signals!")
-
- y = np.zeros([sig_len, sig_dim])
-
- fade_in = np.arange(frame_len) / (frame_len - 1)
- fade_in = fade_in[:, np.newaxis]
- fade_out = 1.0 - fade_in
-
- R = np.eye(sig_dim)
- R_old = np.eye(sig_dim)
- for i_frame in range(N_frames):
-
- i1 = i_frame * frame_len
- i2 = (i_frame + 1) * frame_len
-
- q1 = trj_data[i_frame % trj_frames, :]
- R_r = Quat2RotMat(q1)
- R[:, :] = SHrotmatgen(R_r, order=int(np.sqrt(sig_dim)) - 1)
-
- frame_in = x[i1:i2, :]
- frame_out = y[i1:i2, :]
-
- frame_out[:, :] = (fade_in * frame_in @ R.T) + (fade_out * frame_in @ R_old.T)
-
- R_old[:, :] = R.copy()
-
- return y
-
-
-def rotateISM(
- azi: np.ndarray,
- ele: np.ndarray,
- trajectory: str = None,
-) -> tuple:
-
- if trajectory is None:
- return azi, ele
-
- trj_data = np.genfromtxt(trajectory, delimiter=",")
- trj_frames = trj_data.shape[0]
-
- N_frames = azi.shape[0]
- if ele.shape[0] != azi.shape[0]:
- raise ValueError("Inconsistent input in azi and ele")
-
- azi_rot = np.zeros([N_frames])
- ele_rot = np.zeros([N_frames])
-
- for i_frame in range(N_frames):
- q = trj_data[i_frame % trj_frames, :]
- azi_rot[i_frame], ele_rot[i_frame] = rotateAziEle(
- azi[i_frame], ele[i_frame], Quat2RotMat(q)
- )
-
- return azi_rot, ele_rot
-
-
-def rotateMC(x: np.ndarray, trajectory: str, layout: spatialaudioformat) -> np.ndarray:
- """Rotate MC signal by applying a rotation matrix calculated from the current quaternion
- in each subframe
-
- Parameters:
- ----------
- x: np.ndarray
- input multichannel signal
- trajectory: str
- path to trajectory file
-
- Returns:
- ----------
- y: np.ndarray
- rotated multichannel signal
- """
-
- # TODO needs optimization, currently slow
- trj_data = np.genfromtxt(trajectory, delimiter=",")
- trj_frames = trj_data.shape[0]
-
- sig_len = x.shape[0]
- sig_dim = x.shape[1]
- frame_len = (IVAS_FRAME_LEN_MS // 4) * 48
- N_frames = int(sig_len / frame_len)
-
- y = np.zeros([sig_len, sig_dim])
-
- # TODO LFE handling here
- panner = EFAP.EFAP(layout.ls_azi, layout.ls_ele)
-
- fade_in = np.arange(frame_len) / (frame_len - 1)
- fade_in = fade_in[:, np.newaxis]
- fade_out = 1.0 - fade_in
-
- R = np.eye(layout.nchannels)
- R_old = np.eye(layout.nchannels)
-
- for i_frame in range(N_frames):
-
- start = i_frame * frame_len
- end = (i_frame + 1) * frame_len
-
- q = trj_data[i_frame % trj_frames, :]
-
- rotated_pos = np.array(
- [
- rotateAziEle(a, e, Quat2RotMat(q))
- for a, e in zip(layout.ls_azi, layout.ls_ele)
- ]
- )
- R = panner.pan(rotated_pos[:, 0], rotated_pos[:, 1])
- R[:, layout.lfe_index] = np.zeros([layout.nchannels, 1])
- R[layout.lfe_index, layout.lfe_index] = 1
-
- frame_in = x[start:end, :]
- frame_out = y[start:end, :]
-
- frame_out[:, :] = (fade_in * frame_in @ R) + (fade_out * frame_in @ R_old)
-
- R_old = R.copy()
-
- return y
diff --git a/scripts/pyaudio3dtools/spatialaudioconvert.py b/scripts/pyaudio3dtools/spatialaudioconvert.py
deleted file mode 100644
index 0040f28acea8ca519189f920a1bc516ecf1991ca..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/spatialaudioconvert.py
+++ /dev/null
@@ -1,570 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-import warnings
-from typing import Optional, Tuple
-
-import numpy as np
-
-from pyaudio3dtools import (
- EFAP,
- audioarray,
- audiofile,
- binauralrenderer,
- hoadecoder,
- masarenderer,
- spatialaudioformat,
- spatialmetadata,
-)
-from pyaudio3dtools.constants import *
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-def spatial_audio_convert(
- in_file: str,
- out_file: str,
- in_format: Optional[str] = None,
- in_fs: Optional[int] = None,
- in_nchans: Optional[int] = None,
- in_meta_files: Optional[list] = None,
- out_format: Optional[str] = None,
- out_fs: Optional[int] = None,
- out_fc: Optional[int] = None,
- output_loudness: Optional[int] = None,
- loudness_tool: Optional[str] = None,
- limit_output: Optional[bool] = False,
- cut_preamble_s: Optional[int] = None,
- trajectory: Optional[str] = None,
- bin_rend_include_LFE: Optional[bool] = True,
- bin_rend_LFE_gain: Optional[float] = 10 ** (5.5 / 20),
- binaural_dataset: Optional[str] = "orange53",
-) -> Tuple[np.ndarray, int]:
- """
- Spatial audio conversion between various formats
-
- Parameters
- ----------
- in_file: str
- input filename
- out_file: str
- output filename
-
- in_format: Optional[str]
- input spatial audio format
- in_fs: Optional[int]
- input sampling frequency
- in_nchans: Optional[int]
- input number of channels (deduced for .wav)
-
- out_format: Optional[str]
- output spatial audio format
- out_fs: Optional[int]
- output sampling frequency
- out_fc: Optional[int]
- output cutoff frequency (low-pass filtering)
-
- output_loudness: Optional[int]
- Loudness level in LKFS/dBov
- loudness_tool: Optional[str]
- Loudness tool to use. Must be in $PATH.
- Supported tools:
- ITU-R BS.1770-4 / "bs1770demo" (default)
- ITU-T P.56 / "sv56demo"
-
- limit_output: Optional[bool]
- flag whether to apply limiting to the output
- cut_preamble_s: Optional[int]
- preamble to cut in seconds
-
- trajectory: Optional[str]
- head rotation trajectory file (for binaural rendering)
- bin_rend_include_LFE: Optional[bool]
- flag to include LFE in binaural rendering
- bin_rend_LFE_gain: Optional[float]
- gain to apply for LFE in binaural rendering
- binaural_dataset: Optional[str]
- dataset for binaural HRIR or BRIRs
-
- Returns
- -------
- out_sig : np.ndarray
- output signal
- out_fs : int
- output sampling frequency
- """
-
- """ get spatial input and audio format configurations """
- if in_format is None:
- if in_nchans is not None:
- in_format = spatialaudioformat.Format.detect_format(in_nchans)
- in_spfmt = spatialaudioformat.Format(in_format)
- logger.info(f" Input spatial audio format detected: {in_format}")
- else:
- logger.info(f" Input spatial audio format: {in_format}")
- in_spfmt = spatialaudioformat.Format(in_format)
-
- if out_format is None:
- out_format = in_format
- logger.info(
- f" Output spatial audio format not specified, defaulting to pass-through: {out_format}"
- )
- out_spfmt = spatialaudioformat.Format(out_format)
-
- """ read input file """
- # Input is either waveform file (.pcm or .wav) or iis metadata (.txt)
- _, input_ext = os.path.splitext(os.path.basename(in_file))
-
- if input_ext == ".pcm":
- if in_fs is None:
- if out_fs:
- in_fs = out_fs
- else:
- raise ValueError("Input and output fs not defined.")
- if in_nchans is None:
- if in_spfmt is not None:
- in_nchans = in_spfmt.nchannels
- else:
- raise ValueError(
- "Number of input channels not defined and can't be deduced."
- )
- in_sig, in_fs = audiofile.readfile(in_file, fs=in_fs, nchannels=in_nchans)
- elif input_ext == ".wav":
- in_sig, in_fs = audiofile.readfile(in_file)
- if in_format is None:
- in_format = spatialaudioformat.Format.detect_format(in_sig.shape[1])
- in_spfmt = spatialaudioformat.Format(in_format)
-
- # Adjust number of channels if case of HOA, zeroed vert channels if planar
- if in_spfmt.ambi_order > 0:
- in_sig = audioarray.convert(in_sig, out_nchans=in_spfmt.nchannels)
- elif input_ext == ".txt":
- metadata_obj = spatialmetadata.Metadata(in_file, audio_fs=in_fs)
- in_sig, in_fs = metadata_obj.get_audio_array()
- if in_spfmt.name != "META":
- logger.info(
- f" {in_spfmt.name} specified with .txt input file: overriding to META format"
- )
- in_format = "META"
- in_spfmt = spatialaudioformat.Format(in_format)
- else:
- raise Exception(f"Not supported file {input_ext}")
- _, in_nchans = in_sig.shape
-
- """ convert metadata based formats (ISM / META) directly to output format """
- if in_spfmt.name.startswith("META") or in_spfmt.name.startswith("ISM"):
- if out_spfmt.name.startswith("META"):
- raise Exception("out format must be specified for META (.txt) or ISM input")
-
- if in_spfmt.name.startswith("ISM"):
- if in_meta_files is None:
- raise ValueError(
- f"Please specify a list of metadata files for {in_spfmt.name}"
- )
- if len(in_meta_files) != int(in_spfmt.name[-1]):
- raise ValueError(
- f"Mismatch between number of streams and number of specified metadata files for {in_spfmt.name}"
- )
-
- # initialise metadata object for ISM
- metadata_obj = spatialmetadata.Metadata()
- metadata_obj.init_for_ism(in_file, in_fs, in_nchans, in_meta_files)
-
- # TODO decide on reference path for BINAURAL_ROOM
- if out_spfmt.name.startswith("BINAURAL_ROOM"):
- in_format = "7_1_4"
- else:
- in_format = out_format
- in_spfmt = spatialaudioformat.Format(in_format)
-
- else:
- # set input format to output format
- # render_meta() handles all conversions
- in_format = out_format
- in_spfmt = out_spfmt
-
- in_sig = render_meta(
- metadata_obj,
- in_spfmt,
- dataset=binaural_dataset,
- fs=in_fs,
- trajectory=trajectory,
- include_LFE=bin_rend_include_LFE,
- LFE_gain=bin_rend_LFE_gain,
- )
-
- """ cut preamble """
- if cut_preamble_s is not None:
- samples_to_cut = int(cut_preamble_s * in_fs)
- if samples_to_cut > 0:
- logger.info(f" Cut preample by {samples_to_cut} samples")
- in_sig = audioarray.cut(in_sig, (samples_to_cut, -1))
-
- """ zero non-planar input ambisonics channels """
- if in_spfmt.ambi_order > 0 and in_spfmt.isplanar:
- in_sig = spatialaudioformat.Format.zero_vert_hoa_channels(in_sig)
-
- """ Spatial audio format conversion """
- out_sig = in_sig
- if (in_spfmt.name != out_spfmt.name) and not (
- in_spfmt.isheadphones and out_spfmt.isheadphones
- ):
- logger.info(f" {in_spfmt.name} -> {out_spfmt.name}")
-
- # binaural output (except MASA)
- if out_spfmt.name.startswith("BINAURAL") and not in_spfmt.name.startswith(
- "MASA"
- ):
- out_sig = binauralrenderer.binaural_rendering(
- in_sig,
- in_spfmt,
- out_spfmt,
- dataset=binaural_dataset,
- fs=in_fs,
- trajectory=trajectory,
- include_LFE=bin_rend_include_LFE,
- LFE_gain=bin_rend_LFE_gain,
- )
- # non-binaural outputs
- # HOA conversion
- elif in_spfmt.ambi_order > 0:
- out_sig = convert_sba(in_sig, in_spfmt, out_spfmt)
-
- # MC conversion
- elif in_spfmt.isloudspeaker:
- out_sig = convert_mc(in_sig, in_spfmt, out_spfmt)
-
- # MASA conversion
- elif in_spfmt.name.startswith("MASA"):
- out_sig = convert_masa(in_sig, in_fs, in_meta_files, in_spfmt, out_spfmt)
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
- """ zero non-planar output ambisonics channels """
- if out_spfmt.ambi_order > 0 and out_spfmt.isplanar:
- out_sig = spatialaudioformat.Format.zero_vert_hoa_channels(out_sig)
-
- """ resampling """
- if (out_fs is not None) and (out_fs != in_fs):
- out_sig = audioarray.resample(out_sig, in_fs, out_fs)
- else:
- out_fs = in_fs
-
- """ low-pass filtering """
- if out_fc is not None:
- logger.info(f" Low-pass filter ({out_fc}Hz)")
- out_sig = audioarray.lpfilter(out_sig, out_fc, out_fs)
-
- """ limiting """
- if limit_output:
- logger.info(" apply limiter")
- audioarray.limiter(out_sig, out_fs)
-
- """ loudness normalization """
- if output_loudness:
- _, scale_factor = audiofile.loudnessinfo(
- out_sig,
- out_fs,
- out_format,
- output_loudness=output_loudness,
- loudness_tool=loudness_tool,
- )
- out_sig *= scale_factor
-
- audiofile.writefile(out_file, out_sig, out_fs)
-
- return out_sig, out_fs
-
-
-def convert_sba(
- in_sig: np.ndarray,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
-) -> np.ndarray:
- """Convert an ambisonics signal to the requested output format"""
- # HOA -> LS
- if out_spfmt.isloudspeaker:
- HOA2LS = hoadecoder.get_hoa_mtx(in_spfmt.ambi_order, out_spfmt)
- return hoadecoder.hoa_linear_decoding(in_sig, HOA2LS)
- # HOA -> HOA
- elif out_spfmt.ambi_order > 0:
- return audioarray.convert(in_sig, in_fs=None, out_nchans=out_spfmt.nchannels)
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
-
-def convert_mc(
- in_sig: np.ndarray,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
-) -> np.ndarray:
- """Convert a multichannel signal to the requested output format"""
- # MC -> LS
- if in_spfmt.name == "STEREO" and out_spfmt.name == "MONO":
- MC2LS = np.vstack([[0.5], [0.5]])
- return in_sig @ MC2LS
- elif out_spfmt.isloudspeaker:
- try:
- MC2LS = IVAS_MC_CONVERSION[in_spfmt.name][out_spfmt.name]
- except KeyError:
- ls_azi_woLFE = np.delete(out_spfmt.ls_azi, out_spfmt.lfe_index).astype(
- float
- )
- ls_ele_woLFE = np.delete(out_spfmt.ls_ele, out_spfmt.lfe_index).astype(
- float
- )
-
- panner = EFAP.EFAP(ls_azi_woLFE, ls_ele_woLFE)
-
- MC2LS = np.vstack(
- [
- panner.pan(a, e).T
- for i, (a, e) in enumerate(zip(in_spfmt.ls_azi, in_spfmt.ls_ele))
- if i not in in_spfmt.lfe_index
- ]
- )
- # TODO tmu : implement configurable LFE handling
- # pass-through for LFE
- MC2LS = np.insert(MC2LS, in_spfmt.lfe_index, 0, axis=0)
- MC2LS = np.insert(MC2LS, out_spfmt.lfe_index, 0, axis=1)
- MC2LS[in_spfmt.lfe_index, out_spfmt.lfe_index] = 1
-
- # TODO tmu temporarily disable LFE rendering to MONO/STEREO
- if out_spfmt.name == "MONO" or out_spfmt.name == "STEREO":
- MC2LS[in_spfmt.lfe_index, :] = 0
- return in_sig @ MC2LS
- # MC -> HOA
- elif out_spfmt.ambi_order > 0:
- # SH response for loudspeaker positions
- MC2HOA = np.hstack(
- [
- hoadecoder.getRSH([a], [e], out_spfmt.ambi_order)
- for a, e in zip(in_spfmt.ls_azi, in_spfmt.ls_ele)
- ]
- ).T
-
- # do not add LFE to output
- MC2HOA[in_spfmt.lfe_index] = 0
-
- return in_sig @ MC2HOA
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
-
-def convert_ism(
- in_sig: np.ndarray,
- in_fs: int,
- in_pos: dict,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
-) -> np.ndarray:
- """Convert an ISM signal to the requested output format"""
- pos_data = []
- for pos in in_pos:
- pos_data.extend(
- [pos["azimuth"], pos["elevation"]] for _ in range(pos["use_for_frames"])
- )
- pos_data = np.array(pos_data)
- pos_frames = pos_data.shape[0]
-
- sig_len = in_sig.shape[0]
- frame_len = IVAS_FRAME_LEN_MS * (in_fs // 1000)
-
- out_sig = np.zeros([sig_len, out_spfmt.nchannels])
-
- fade_in = np.arange(frame_len) / (frame_len - 1)
- fade_in = fade_in[:, np.newaxis]
- fade_out = 1.0 - fade_in
-
- if out_spfmt.isloudspeaker:
- ls_azi_woLFE = np.delete(out_spfmt.ls_azi, out_spfmt.lfe_index)
- ls_ele_woLFE = np.delete(out_spfmt.ls_ele, out_spfmt.lfe_index)
- panner = EFAP.EFAP(ls_azi_woLFE, ls_ele_woLFE)
-
- gains_old = None
-
- for i_frame, (in_frame, out_frame) in enumerate(
- zip(
- audioarray.get_framewise(in_sig, frame_len),
- audioarray.get_framewise(out_sig, frame_len),
- )
- ):
- # update the crossfade if we have a smaller last frame
- if out_frame.shape[0] != frame_len:
- frame_size = out_frame.shape[0]
- fade_in = np.arange(frame_size) / (frame_size - 1)
- fade_in = fade_in[:, np.newaxis]
- fade_out = 1.0 - fade_in
-
- pos = EFAP.wrap_angles(*pos_data[i_frame % pos_frames, :], clip_ele=True)
-
- # ISM -> MC
- if out_spfmt.isloudspeaker:
- gains = panner.pan(pos[0], pos[1])
- gains = np.insert(gains, out_spfmt.lfe_index, 0)
- gains = gains[:, np.newaxis]
- # ISM -> HOA
- elif out_spfmt.ambi_order > 0:
- gains = hoadecoder.getRSH([pos[0]], [pos[1]], out_spfmt.ambi_order)
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
- if gains_old is None:
- gains_old = gains.copy()
-
- out_frame[:] = (fade_in * in_frame @ gains.T) + (
- fade_out * in_frame @ gains_old.T
- )
-
- gains_old = gains.copy()
-
- return out_sig
-
-
-def convert_masa(
- in_sig: np.ndarray,
- in_fs: int,
- in_meta: str,
- in_spfmt: spatialaudioformat.Format,
- out_spfmt: spatialaudioformat.Format,
-) -> np.ndarray:
- """Convert a MASA signal to the requested output format"""
-
- if in_fs != 48000:
- raise ValueError(f"{in_spfmt.name} rendering only support for 48kHz!")
-
- tmp_spfmt = out_spfmt
-
- # MASA -> LS
- if out_spfmt.isloudspeaker:
- if not (out_spfmt.name == "5_1" or out_spfmt.name == "7_1_4"):
- tmp_spfmt = spatialaudioformat.Format("7_1_4")
- warnings.warn(
- f"{out_spfmt.name} not natively supported by masaRenderer, using {tmp_spfmt.name} as intermediate format"
- )
- # MASA -> HOA
- elif out_spfmt.ambi_order > 0:
- tmp_spfmt = spatialaudioformat.Format("7_1_4")
- warnings.warn(
- f"{out_spfmt.name} not natively supported by masaRenderer, using {tmp_spfmt.name} as intermediate format"
- )
- elif out_spfmt.name == "BINAURAL":
- warnings.warn(
- f"Using masaRenderer for rendering; any binaural_dataset setting will be ignored!"
- )
- else:
- raise NotImplementedError(
- f"{in_spfmt.name} -> {out_spfmt.name}: format conversion not implemented"
- )
-
- out_sig = masarenderer.render_masa(in_sig, in_meta, in_spfmt, tmp_spfmt)
-
- # conversion done
- if tmp_spfmt.name == out_spfmt.name:
- return out_sig
- # only rendered an intermediate format, more conversion needed
- else:
- return convert_mc(out_sig, tmp_spfmt, out_spfmt)
-
-
-def render_meta(
- metadata_obj: spatialmetadata.Metadata,
- dest_fmt: spatialaudioformat.Format,
- dataset: str,
- fs: int,
- trajectory: str,
- include_LFE: bool = False,
- LFE_gain: float = 10 ** (5.5 / 20),
-) -> np.ndarray:
- """Render mixed scene metadata to the desired format"""
-
- logger.info(f" META -> {dest_fmt.name}")
-
- out_sig = np.zeros([metadata_obj.audio_array.shape[0], dest_fmt.nchannels])
-
- for object in metadata_obj.objects:
- # extract object signal
- start = object["track_index"]
- stop = start + object["nb_tracks"]
- obj_sig = metadata_obj.audio_array[:, start:stop]
- # apply gain
- if hasattr(object, "gain"):
- obj_sig *= object["gain"]
-
- if dest_fmt.name.startswith("BINAURAL"):
- if object["input_type"] == "ism":
- src_format = spatialaudioformat.Format(f"ISM")
- positions = object["positions"]
- if object["input_type"] == "sba":
- src_format = spatialaudioformat.Format(f"SBA{object['order']}")
- positions = None
- elif object["input_type"] == "mc":
- src_format = spatialaudioformat.Format(f"CICP{object['cicp_index']}")
- positions = None
-
- out_sig += binauralrenderer.binaural_rendering(
- obj_sig,
- src_format,
- dest_fmt,
- dataset=dataset,
- fs=fs,
- trajectory=trajectory,
- include_LFE=include_LFE,
- LFE_gain=LFE_gain,
- in_pos=positions,
- )
- else:
- if object["input_type"] == "ism":
- src_format = spatialaudioformat.Format("ISM")
- out_sig += convert_ism(
- obj_sig, fs, object["positions"], src_format, dest_fmt
- )
- elif object["input_type"] == "sba":
- src_format = object["format"]
- out_sig += convert_sba(obj_sig, src_format, dest_fmt)
- elif object["input_type"] == "mc":
- src_format = object["format"]
- out_sig += convert_mc(obj_sig, src_format, dest_fmt)
-
- return out_sig
diff --git a/scripts/pyaudio3dtools/spatialmetadata.py b/scripts/pyaudio3dtools/spatialmetadata.py
deleted file mode 100644
index 3cf1338d4fb45ce47f04b4fc905a418a576059c1..0000000000000000000000000000000000000000
--- a/scripts/pyaudio3dtools/spatialmetadata.py
+++ /dev/null
@@ -1,492 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import math
-import os
-from typing import Optional, TextIO
-
-import numpy as np
-
-from pyaudio3dtools import audioarray, audiofile, spatialaudioformat
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-class Metadata:
- def __init__(
- self,
- metadata_path: Optional[str] = None,
- metadata_format: Optional[str] = "iis",
- audio_wav_path: Optional[str] = None,
- audio_fs: Optional[int] = 48000,
- ):
- """
- Spatial Metadata
-
- Parameters
- ----------
- metadata_path: Optional[str]
- path to metadata file
- metadata_format: Optional[str]
- format for metadata file, supported: ["iis", "ivas_ism"]
- audio_wav_path: Optional[str]
- path to corresponding audio files
- audio_fs: Optional[int]
- audio sampling frequency
-
- Returns
- -------
- self
-
- """
-
- self._delete_all()
- if audio_fs is None:
- audio_fs = 48000
- self.audio_fs = audio_fs
-
- # init from input file
- if metadata_path is not None and os.path.isfile(metadata_path):
- self.read_metadata(metadata_path, metadata_format, audio_wav_path)
-
- def _delete_all(self) -> None:
- self.objects = [] # list of audio objects
- self.nb_objects = 0 # Number of objects
- self.nb_tracks = 0 # Number of tracks
- self.audio_wav = [] # list of wav files
- self.audio_array = np.zeros([1, 0])
- self.nb_frames = 0 # Number of frames
-
- def read_metadata(
- self,
- metadata_path: str,
- metadata_format: str = "iis",
- audio_wav_path: Optional[str] = None,
- ) -> None:
- if metadata_format == "iis":
- with open(metadata_path, "r") as file_in:
- dirname = os.path.dirname(metadata_path)
- self.audio_wav.append(os.path.join(dirname, file_in.readline().strip()))
- nb_new_objects = int(file_in.readline())
-
- for _ in range(nb_new_objects):
- in_type = file_in.readline().strip()
-
- if in_type.lower() == "ism":
- self.objects.append(read_ism_input(file_in, dirname))
- elif in_type.lower() == "sba":
- self.objects.append(read_sba_input(file_in))
- elif in_type.lower() == "mc":
- self.objects.append(read_mc_input(file_in))
- else:
- raise ValueError("Unknown input type in metadata file")
-
- self._append_audio_array(self.audio_wav[-1])
- self.nb_objects += 1
-
- elif metadata_format == "ivas_ism":
- if audio_wav_path is None:
- raise FileNotFoundError("Wave file not specified!")
-
- self.audio_wav.append(audio_wav_path)
- self.objects.append(
- read_ism_ivas_data(metadata_path, object_index=self.nb_objects)
- )
- self._append_audio_array(self.audio_wav[-1])
- self.nb_objects += 1
- else:
- raise ValueError("Metadata: unknown metadata format")
-
- def write_metadata(
- self,
- metadata_path: str,
- metadata_format: str = "iis",
- audio_output_path: Optional[str] = None,
- max_objects: Optional[int] = None,
- ) -> list:
- metadata_out_list = []
-
- if metadata_format == "iis":
- with open(metadata_path, "w") as file_out:
- if audio_output_path is not None:
- file_out.write(f"{audio_output_path}\n")
- dirname = os.path.dirname(metadata_path)
- self.write_audio_array(os.path.join(dirname, audio_output_path))
-
- file_out.write(f"{str(self.nb_objects)}\n")
- for object_index in range(self.nb_objects):
- if self.objects[object_index]["input_type"] == "ism":
- write_ism_input(
- file_out,
- self.objects[object_index],
- metadata_path,
- num_frames=self.nb_frames,
- )
- elif self.objects[object_index]["input_type"] == "sba":
- write_sba_input(file_out, self.objects[object_index])
- elif self.objects[object_index]["input_type"] == "mc":
- write_mc_input(file_out, self.objects[object_index])
- else:
- raise ValueError("Unknown input type in metadata file")
-
- metadata_out_list.append(file_out.name)
-
- elif metadata_format == "ivas_ism":
- outfilename, output_ext = os.path.splitext(os.path.basename(metadata_path))
- x = np.zeros([1, 0])
-
- for object_index in range(self.nb_objects):
- if self.objects[object_index]["input_type"] == "ism":
- # Prepare audio wavefrom
- if audio_output_path is not None:
- chan_start = self.objects[object_index]["track_index"]
- chan_end = chan_start + self.objects[object_index]["nb_tracks"]
- if x.shape[1] == 0:
- x = self.audio_array[:, chan_start:chan_end]
- else:
- x = np.append(
- x, self.audio_array[:, chan_start:chan_end], axis=1
- )
-
- # Write positions
- with open(
- metadata_path.replace(
- output_ext,
- str(self.objects[object_index]["track_index"]) + output_ext,
- ),
- "w",
- ) as file_out:
- write_ism_ivas_data(
- file_out,
- self.objects[object_index],
- num_frames=self.nb_frames,
- )
- metadata_out_list.append(file_out.name)
-
- if (max_objects is not None) and (
- len(metadata_out_list) >= max_objects
- ):
- break
-
- # Write audio waveform
- if audio_output_path is not None:
- audiofile.writefile(audio_output_path, x, fs=self.audio_fs)
-
- return metadata_out_list
-
- def print_info(self) -> None:
- print(f"Number of objects in the scene: {self.nb_objects}")
- for object_index in range(self.nb_objects):
- print(f" Object #{object_index} Type: {self.objects[object_index]}")
-
- def _append_audio_array(self, audio_wav=None, fs=48000, nchan=1, object_index=None):
- if audio_wav is None:
- audio_wav = self.audio_wav[-1]
- if object_index is None:
- object_index = -1
-
- x, fs = audiofile.readfile(audio_wav, fs=fs, nchannels=nchan)
- logger.debug(f"Append {audio_wav}: {x.shape[0]} by {x.shape[1]}")
-
- # Select appropriate channels & resample if necessary
- chan_start = self.objects[object_index]["track_index"]
- chan_end = chan_start + self.objects[object_index]["nb_tracks"]
- logger.debug(f" channels from {chan_start} to {chan_end}")
- x = x[:, chan_start:chan_end]
- x = audioarray.resample(x, fs, self.audio_fs)
-
- # Append array and update track index
- self.objects[object_index]["track_index"] = self.audio_array.shape[1]
- if self.audio_array.shape[1] == 0:
- self.audio_array = x
- else:
- len_min = min([self.audio_array.shape[0], x.shape[0]])
- self.audio_array = np.append(
- self.audio_array[:len_min][:], x[:len_min][:], axis=1
- )
-
- self.nb_tracks = self.nb_tracks + x.shape[1]
- self.nb_frames = math.ceil(50.0 * self.audio_array.shape[0] / self.audio_fs)
-
- # init with list of ISM metadata files
- def init_for_ism(
- self,
- in_file: str,
- in_fs: int,
- in_nchan: int,
- metadata_files: list,
- ) -> None:
- self.audio_wav.append(in_file)
-
- for csv in metadata_files:
- self.objects.append(read_ism_ivas_data(csv, object_index=self.nb_objects))
- self.objects[-1]["track_index"] = self.nb_objects
- self._append_audio_array(self.audio_wav[-1], fs=in_fs, nchan=in_nchan)
- self.nb_objects += 1
-
- # Get audio array with sampling rate
- def get_audio_array(self):
- return self.audio_array, self.audio_fs
-
- # Set audio array from file
- def set_audio_array(self, audio_path, fs=None):
- if fs is None:
- fs = self.audio_fs
- audiofile.readfile(audio_path, self.audio_array, fs)
- self.audio_fs = fs
-
- # Write in file audio array
- def write_audio_array(self, audio_path):
- audiofile.writefile(audio_path, self.audio_array, fs=self.audio_fs)
-
-
-##################################################
-# Helper functions for IIS metadata
-##################################################
-def read_ism_input(file_handle: TextIO, dirname: str) -> dict:
- """
- Read ISM Input (IIS metadata format)
-
- Parameters
- ----------
- file_handle: TextIO
- file pointer
- dirname: str
- root directory used to read csv files
-
- Returns
- -------
- dict
- ISM dictionary with positions
- """
- ism = {"input_type": "ism"}
- ism["track_index"] = int(file_handle.readline()) - 1
- ism["nb_tracks"] = 1
- ism["positions"] = []
- ism["gain"] = 1
- line = file_handle.readline()
-
- try:
- ism["num_positions"] = int(line)
- for _ in range(ism["num_positions"]):
- [use_for_frames, azimuth, elevation] = (
- file_handle.readline().strip().split(",")
- )
- pos = {}
- pos["use_for_frames"] = int(use_for_frames)
- pos["azimuth"] = int(azimuth)
- pos["elevation"] = int(elevation)
- ism["positions"].append(pos)
- ism["gain"] = read_gain_value(file_handle)
- except:
- meta_csv = os.path.join(dirname, line.strip())
- pos_idx = 0
- with open(meta_csv) as file_handle:
- for line in file_handle:
- current_values = line.strip().split(",")
- pos = {}
- pos["use_for_frames"] = 1
- pos["azimuth"] = float(current_values[0])
- pos["elevation"] = float(current_values[1])
- ism["positions"].append(pos)
- pos_idx += 1
-
- ism["num_positions"] = pos_idx
-
- return ism
-
-
-def write_ism_input(
- file_handle: TextIO,
- ism_dict: dict,
- metadata_path: Optional[str] = None,
- num_frames: Optional[int] = None,
-) -> None:
- """
- Write ISM Input (IIS metadata format)
-
- Parameters
- ----------
- file_handle: TextIO
- file pointer
- ism_dict: dict
- ISM dictionnary with positions
- metadata_path: Optional[str]
- if given positions writen cvs format
- num_frame: Optional[int]
- number of frames to be written
-
- Returns
- -------
- None
- """
- file_handle.write("ISM\n")
- track_index = ism_dict["track_index"]
- file_handle.write(f"{str(track_index + 1)}\n")
-
- if metadata_path is None:
- num_positions = ism_dict["num_positions"]
- file_handle.write(f"{str(num_positions)}\n")
-
- positions = ism_dict["positions"]
- for pos_idx in range(ism_dict["num_positions"]):
- use_for_frames = positions[pos_idx]["use_for_frames"]
- azimuth = round(positions[pos_idx]["azimuth"])
- elevation = round(positions[pos_idx]["elevation"])
-
- file_handle.write(f"{use_for_frames:04d},{azimuth:+03d},{elevation:+03d}\n")
- else:
- # Write filename
- _, extname = os.path.splitext(metadata_path)
- dirname = os.path.dirname(metadata_path)
- basename = os.path.basename(metadata_path).replace(
- extname, "." + str(track_index) + ".csv"
- )
- file_handle.write(f"{basename}\n")
- # Write positions
- with open(os.path.join(dirname, basename), "w") as file_out:
- write_ism_ivas_data(file_out, ism_dict, num_frames=num_frames)
-
-
-def read_sba_input(file_handle: TextIO) -> dict:
- sba = {"input_type": "sba"}
- sba["track_index"] = int(file_handle.readline()) - 1
- sba["format"] = spatialaudioformat.Format(f"SBA{int(file_handle.readline())}")
- sba["order"] = sba["format"].ambi_order
- sba["nb_tracks"] = (sba["order"] + 1) ** 2
- sba["gain"] = read_gain_value(file_handle)
- return sba
-
-
-def write_sba_input(file_handle: TextIO, sba_dict: dict) -> None:
- file_handle.write("SBA\n")
- track_index = sba_dict["track_index"]
- file_handle.write(f"{str(track_index + 1)}\n")
- order = sba_dict["order"]
- file_handle.write(f"{str(order)}\n")
-
-
-def read_mc_input(file_handle: TextIO) -> dict:
- mc = {"input_type": "mc"}
- mc["track_index"] = int(file_handle.readline()) - 1
- mc["format"] = spatialaudioformat.Format(file_handle.readline().strip())
- mc["nb_tracks"] = mc["format"].nchannels
- mc["gain"] = read_gain_value(file_handle)
- return mc
-
-
-def write_mc_input(file_handle: TextIO, mc_dict: dict) -> None:
- file_handle.write("MC\n")
- track_index = mc_dict["track_index"]
- file_handle.write(f"{str(track_index + 1)}\n")
- name = mc_dict["format"].name
- file_handle.write(f"{name}\n")
-
-
-def read_gain_value(file_handle: TextIO) -> float:
- original_pos = file_handle.tell()
- gain = file_handle.readline().lower()
- if gain.startswith("gain_db"):
- gain = float(gain.replace("gain_db", ""))
- return 10 ** (gain / 20)
- else:
- file_handle.seek(original_pos)
- return 1
-
-
-##################################################
-# Helper functions for ISM IVAS metadata
-##################################################
-def read_ism_ivas_data(metadata_path: str, object_index: int = 0) -> None:
- ism = {"input_type": "ism"}
- ism["track_index"] = 0
- ism["num_positions"] = 0
- ism["nb_tracks"] = 1
- ism["positions"] = []
-
- pos_idx = 0
-
- try:
- with open(metadata_path) as file_handle:
- for line in file_handle:
- current_values = line.strip().split(",")
- pos = {}
- pos["use_for_frames"] = 1
- pos["azimuth"] = float(current_values[0])
- pos["elevation"] = float(current_values[1])
- ism["positions"].append(pos)
- pos_idx += 1
- except FileNotFoundError:
- # TODO in case of NULL metadata we can also spread the objects spatially
- pos = {}
- pos["use_for_frames"] = 1
- pos["azimuth"] = 0.0
- pos["elevation"] = 0.0
- ism["positions"].append(pos)
- pos_idx += 1
-
- ism["num_positions"] = pos_idx
- return ism
-
-
-def write_ism_ivas_data(
- file_handle: TextIO, ism_dict: dict, num_frames: Optional[int] = None
-) -> None:
- positions = ism_dict["positions"]
-
- if num_frames is None:
- num_frames = 0
- for pos_idx in range(len(positions)):
- num_frames += positions[pos_idx]["use_for_frames"]
-
- # Constants for all positions
- distance = 1.0
- spread = 0.0
- gain = 1.0
- pos_idx = 0
- pos_used_times = 0
- for _ in range(num_frames):
- azimuth = float(positions[pos_idx]["azimuth"])
- elevation = float(positions[pos_idx]["elevation"])
-
- file_handle.write(
- f"{azimuth:+07.2f},{elevation:+06.2f},{distance:05.2f},{spread:06.2f},{gain:04.2f}\n"
- )
-
- pos_used_times += 1
-
- if pos_used_times == positions[pos_idx]["use_for_frames"]:
- pos_idx = (pos_idx + 1) % len(positions)
- pos_used_times = 0
diff --git a/scripts/pyivastest/IvasModeAnalyzer.py b/scripts/pyivastest/IvasModeAnalyzer.py
index fed4f29ecdcbf16219db68176a62e366d8944d5d..7e6d40b2e588a1cf33d0a2f0eb1ce71eeb78b3e4 100644
--- a/scripts/pyivastest/IvasModeAnalyzer.py
+++ b/scripts/pyivastest/IvasModeAnalyzer.py
@@ -187,8 +187,9 @@ class IvasModeAnalyzer(IvasModeCollector):
all_log_files = os.listdir(log_dir)
for mode in self.flat_mode_list:
for f in all_log_files:
+ search_string = re.escape("_{}".format(mode))
if (
- re.search("_{}".format(mode), f)
+ re.search(search_string, f)
and os.path.splitext(f)[1] == LOG_FILE_EXT
):
# this is a log file belonging to the ivas_format
@@ -958,6 +959,7 @@ class IvasModeAnalyzer(IvasModeCollector):
IvasModeAnalyzer.write_csv_file(filename, table)
def all_instrumented_to_csv(self, basefilename, encdec=-1):
+ basefilename = os.path.abspath(basefilename)
for value in INSTRUMENTED_RESULTS:
table = self.get_instrumented_value(value, encdec=encdec)
IvasModeAnalyzer.write_csv_file("".join([basefilename, "_", value]), table)
diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py
index 3df9994170a1cdfb3b4957b4bd6f7363f08a612d..a3876a2b4ee73d429b39a3e90deb17e267449dbe 100644
--- a/scripts/pyivastest/IvasScriptsCommon.py
+++ b/scripts/pyivastest/IvasScriptsCommon.py
@@ -276,6 +276,12 @@ class IvasScriptArgParser(argparse.ArgumentParser):
help="Cut frames from the beginning of the encoded bit stream until the first SID frame",
action="store_true",
)
+ self.add_argument(
+ "--bs_length",
+ help="Cut bitstream to this (maximum) length. Is applied AFTER --sidstart processing, if this is given",
+ type=int,
+ default=-1,
+ )
self.add_argument(
"--info",
help="Ouput debug info in subfolders of /res (use with caution, this can generate a huge amount of data)",
@@ -613,6 +619,18 @@ def runner_setup(runner, args):
]
add_to_proc_chain(bs_proc_chain, sidstart_cmd)
+ if args["bs_length"] > 0:
+ bs_len = args["bs_length"]
+ bs_cut_cmd = [
+ os.path.join(constants.SCRIPTS_BASE_DIR, "cut_bs.py"),
+ "--length",
+ f"{bs_len}",
+ "{in_file}",
+ "{out_file}",
+ f"{bs_len}frames",
+ ]
+ add_to_proc_chain(bs_proc_chain, bs_cut_cmd)
+
if bs_proc_chain != {}:
runner.global_bitstream_processing = bs_proc_chain
@@ -631,7 +649,8 @@ def runner_setup(runner, args):
if args["item_list"]:
runner.set_global_item_list(args["item_list"])
if args["metadata_files"]:
- runner.set_global_metadata_file_list(args["metadata_files"])
+ metadata_files = [os.path.abspath(f) for f in args["metadata_files"]]
+ runner.set_global_metadata_file_list(metadata_files)
if args["decoder_only"]:
runner.run_encoder = False
if args["info"]:
diff --git a/scripts/pyprocessing/__init__.py b/scripts/pyprocessing/__init__.py
deleted file mode 100644
index 5e7b5aa892d9f45d2eed18386bf8aa8889cb4900..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/__init__.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-"""
-pyprocessing
-====
-
-Provides
- Methods for processing/coding 3D audio
-
-Imports
--------
-functions
-class
-"""
-from . import evs, ivas, prepost_processing, processing, processing_configs, utils
diff --git a/scripts/pyprocessing/evs.py b/scripts/pyprocessing/evs.py
deleted file mode 100644
index 6de86f2a27b2a69adf3d1567a165207b7618dfde..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/evs.py
+++ /dev/null
@@ -1,238 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-
-from pyaudio3dtools import audiofile, spatialaudioformat, spatialmetadata
-from pyaudio3dtools.spatialaudioconvert import render_meta
-
-from pyprocessing import utils
-from pyprocessing.processing import Processing
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-class EVS(Processing):
- def __init__(
- self,
- in_format: str,
- out_format: str,
- bitrate: int,
- in_fs: int = 48000,
- **kwargs,
- ):
- super().__init__()
- for k, v in kwargs.items():
- setattr(self, k, v)
- self.in_format = spatialaudioformat.Format(in_format)
- self.out_format = spatialaudioformat.Format(out_format)
- if isinstance(bitrate, int):
- self.bitrate = [bitrate]
- if self.in_format.nchannels > 0:
- self.bitrate = [bitrate] * self.in_format.nchannels
- elif isinstance(bitrate, list):
- self.bitrate = bitrate
- if self.in_format.nchannels > 0:
- self.bitrate.extend([0] * (self.in_format.nchannels - len(bitrate)))
- self.in_fs = in_fs
- self.exec_enc = utils.get_exec_path(kwargs["cod_bin"])
- self.exec_dec = utils.get_exec_path(kwargs["dec_bin"])
-
- if in_format != out_format:
- raise ValueError(f"EVS_: output format must be equal to input format.")
- if not os.path.exists(self.exec_enc):
- raise FileNotFoundError(
- f"The EVS encoder binary was not found at the given path: {self.exec_enc}"
- )
- if not os.path.exists(self.exec_dec):
- raise FileNotFoundError(
- f"The EVS decoder binary was not found at the given path: {self.exec_dec}"
- )
-
- def process(self, input_path: str, output_path: str, tmp_path: str) -> None:
- logger.debug(f"EVS {input_path} -> {output_path}")
- # Read input file
- _, input_ext = os.path.splitext(os.path.basename(input_path))
- _, output_ext = os.path.splitext(os.path.basename(output_path))
- if input_ext == ".txt":
- metadata_obj = spatialmetadata.Metadata(input_path, audio_fs=self.in_fs)
- input_multi_channels = output_path.replace(output_ext, ".pcm")
- if self.in_format.name[:3] == "ISM":
- # extract IVAS ISM metadata and
- input_csv = output_path.replace(output_ext, ".csv")
- metadata_files = metadata_obj.write_metadata(
- input_csv, "ivas_ism", input_multi_channels, max_objects=4
- )
- # change number of ISM
- self.in_format.name = "ISM" + str(len(metadata_files))
- self.in_format = spatialaudioformat.Format(self.in_format.name[:4])
- if len(self.bitrate) < len(metadata_files):
- self.bitrate.extend(
- [self.bitrate[-1]] * (len(metadata_files) - len(self.bitrate))
- )
- else:
- in_sig, fs = metadata_obj.get_audio_array()
- in_sig = render_meta(metadata_obj, self.in_spfmt)
- audiofile.writefile(input_multi_channels, in_sig, self.in_fs)
- elif input_ext == ".wav" or input_ext == ".pcm":
- input_multi_channels = input_path
- else:
- raise ValueError(f"EVS: invalid audio input extension: {input_ext}")
-
- # Split the corresponding channels at enc_fs
- split_chans_in = []
- for idx in range(self.in_format.nchannels):
- split_chans_in.append(
- output_path.replace(output_ext, "." + str(idx) + ".pcm")
- )
-
- audiofile.splitfiles(
- input_multi_channels,
- split_chans_in,
- in_nchans=self.in_format.nchannels,
- in_fs=self.in_fs,
- out_fs=self.enc_fs,
- )
-
- # Zero vertical Ambi channels if planar
- mute_next_chan = -1
- if self.in_format.ambi_order > 0 and self.in_format.isplanar:
- mute_chans_enum = enumerate(self.in_format.get_vert_hoa_channels())
- _, mute_next_chan = next(mute_chans_enum)
-
- # run processing
- split_chans_out = []
- for idx, split_in in enumerate(split_chans_in):
- split_bs = split_in.replace(".pcm", ".bs")
- split_out = split_in.replace(".pcm", ".dec.pcm")
-
- # Zero vertical Ambi channels if planar
- if idx == mute_next_chan:
- audiofile.mutefile(split_in, split_in, in_fs=self.enc_fs, in_nchans=1)
- try:
- _, mute_next_chan = next(mute_chans_enum)
- except:
- pass
-
- if self.bitrate[idx] > 0:
- self.enc(split_in, split_bs, self.bitrate[idx])
- self.dec(split_bs, split_out)
- else:
- # zero channel
- audiofile.convertfile(
- split_in, split_out, in_fs=self.enc_fs, out_fs=self.dec_fs
- )
- audiofile.mutefile(split_out, split_out, in_fs=self.dec_fs, in_nchans=1)
-
- split_chans_out.append(split_out)
-
- # Output file: combine waveform files into one output, and optinaly write iis metadata
- if output_ext == ".pcm" or output_ext == ".wav":
- audiofile.combinefiles(
- split_chans_out, output_path, in_fs=self.dec_fs, out_fs=self.dec_fs
- )
- elif output_ext == ".txt":
- output_wav = output_path.replace(output_ext, ".wav")
- if self.in_format.name[:3] == "ISM":
- # Write new metadata
- metadata_out_obj = spatialmetadata.Metadata(audio_fs=self.dec_fs)
- for idx in range(self.in_format.nchannels):
- logger.debug(
- "EVS_mono Read metadata "
- + metadata_files[idx]
- + " with audio file "
- + split_chans_out[idx]
- )
- metadata_out_obj.read_metadata(
- metadata_files[idx],
- metadata_format="ivas_ism",
- audio_wav_path=split_chans_out[idx],
- )
- metadata_out_obj.write_metadata(
- output_path,
- metadata_format="iis",
- audio_output_path=os.path.basename(output_wav),
- )
- else:
- # pass-trhough mode, rewrite only audio waveform with decoded file
- audiofile.combinefiles(
- split_chans_out, output_wav, in_fs=self.dec_fs, out_fs=self.dec_fs
- )
- metadata_obj.write_metadata(output_path, metadata_format="iis")
- else:
- raise ValueError(f"EVS: invalid audio input extension: {output_ext}")
-
- def enc(self, input_wav: str, output_bs: str, bitrate: int) -> None:
- input_pcm = output_bs.replace(".bs", ".pcm")
- audiofile.convertfile(input_wav, input_pcm, out_nchans=1, out_fs=self.in_fs)
-
- cmd = [self.exec_enc]
- if self.dtx:
- cmd.append("-dtx")
-
- if self.cod_opt:
- cmd.extend(self.cod_opt)
-
- cmd.extend(
- [
- "-max_band",
- self.max_band,
- str(bitrate),
- str(self.enc_fs // 1000),
- input_pcm,
- output_bs,
- ]
- )
- Processing.run(cmd)
-
- def dec(self, input_bs: str, output_wav: str) -> None:
- cmd = [self.exec_dec]
-
- if self.dec_opt:
- cmd.extend(self.dec_opt)
-
- cmd.extend([str(self.dec_fs // 1000), input_bs, output_wav])
- Processing.run(cmd)
-
- def get_processing_file_paths(self, template_out_file: str, input_ext: str) -> list:
- if input_ext == ".wav" or input_ext == ".pcm":
- return [template_out_file.replace(".wav", "_evs_mono.wav")]
- elif input_ext == ".txt":
- return [template_out_file.replace(".wav", "_evs_mono.txt")]
- else:
- raise ValueError(f"EVS: invalid audio input extension: {input_ext}")
-
- def get_total_bit_rate(self):
- return sum(self.bitrate)
diff --git a/scripts/pyprocessing/ivas.py b/scripts/pyprocessing/ivas.py
deleted file mode 100644
index 0f182fd1fbf98f5a8daa31f69426bd351c8d73fb..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/ivas.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-from typing import Optional
-
-from pyaudio3dtools import audiofile, spatialaudioformat, spatialmetadata
-from pyaudio3dtools.spatialaudioconvert import render_meta
-
-from pyprocessing import utils
-from pyprocessing.processing import Processing
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-class IVAS(Processing):
- def __init__(self, in_format: str, bitrate: int, in_fs: int = 48000, **kwargs):
- super().__init__()
- for k, v in kwargs.items():
- setattr(self, k, v)
- self.in_format = spatialaudioformat.Format(in_format)
- self.bitrate = bitrate
- self.in_fs = in_fs
- self.out_format = spatialaudioformat.Format(kwargs["out_format"])
- self.exec_enc = utils.get_exec_path(kwargs["cod_bin"])
- self.exec_dec = utils.get_exec_path(kwargs["dec_bin"])
- self.ht_file = os.path.abspath(self.ht_file)
-
- if self.out_format.name == "ISM":
- self.out_format.name = "EXT"
-
- if not os.path.exists(self.exec_enc):
- raise FileNotFoundError(
- f"The IVAS encoder binary was not found at the given path: {self.exec_enc}"
- )
- if not os.path.exists(self.exec_dec):
- raise FileNotFoundError(
- f"The IVAS decoder binary was not found at the given path: {self.exec_dec}"
- )
-
- def process(self, input_path: str, output_path: str, tmp_path: str) -> None:
- logger.debug(f"IVAS {input_path} -> {output_path}")
-
- _, output_ext = os.path.splitext(os.path.basename(output_path))
- if output_ext == ".wav":
- output_bs = output_path.replace(".wav", ".bs")
- else:
- raise ValueError(f"IVAS: invalid audio input extension: {output_ext}")
-
- self.enc(input_path, output_bs)
- self.dec(output_bs, output_path)
-
- def enc(self, input_path: str, output_bs: str) -> None:
- logger.debug(f"IVAS encoder {input_path} -> {output_bs}")
-
- # Only resample and convert if wav, otherwise supposed pcm to be sampled at self.in_fs
- _, input_ext = os.path.splitext(os.path.basename(input_path))
- metadata_files = []
-
- # for MASA suppose that metadata file as same basename and location as input file
- if self.in_format.name.lower()[:4] == "masa":
- metadata_files.append(input_path.replace(input_ext, ".met"))
-
- # Support input file wav, pcm and txt (metadata iis)
- if (input_ext == ".wav") or (input_ext == ".pcm"):
- input_pcm = output_bs.replace(".bs", ".pcm")
- audiofile.convertfile(
- input_path,
- input_pcm,
- in_fs=self.in_fs,
- out_fs=self.enc_fs,
- in_nchans=self.in_format.nchannels,
- out_nchans=self.in_format.nchannels,
- )
- elif input_ext == ".txt":
- metadata_obj = spatialmetadata.Metadata(input_path, audio_fs=self.enc_fs)
- input_pcm = output_bs.replace(".bs", ".pcm")
- input_csv = output_bs.replace(".bs", ".csv")
- if self.in_format.name[:3] == "ISM":
- # extract IVAS ISM metadata and
- metadata_files = metadata_obj.write_metadata(
- input_csv, "ivas_ism", input_pcm, max_objects=4
- )
-
- # change number of ISM
- self.in_format.name = "ISM" + str(len(metadata_files))
- self.in_format = spatialaudioformat.Format(self.in_format.name[:4])
- else:
- in_sig = render_meta(metadata_obj, self.in_spfmt)
- audiofile.writefile(input_pcm, in_sig, self.enc_fs)
- else:
- raise ValueError(f"IVAS: invalid audio input extension: {input_ext}")
-
- cmd = [self.exec_enc]
- if self.dtx:
- cmd.append("-dtx")
-
- if self.cod_opt:
- cmd.extend(self.cod_opt)
-
- cmd.extend(
- [
- *IVAS.parse_config(self.in_format, metadata_files),
- "-max_band",
- self.max_band,
- str(self.bitrate),
- str(self.enc_fs // 1000),
- input_pcm,
- output_bs,
- ]
- )
- Processing.run(cmd)
-
- def dec(self, input_bs: str, output_wav: str) -> None:
- logger.debug(f"IVAS decoder {input_bs} -> {output_wav}")
-
- cmd = [self.exec_dec]
- if self.head_tracking:
- cmd.extend(["-T", self.ht_file])
-
- if self.plc:
- cmd.extend(["-FEC", str(self.plc_rate)])
-
- if self.dec_opt:
- cmd.extend(self.dec_opt)
-
- cmd.extend(
- [
- self.out_format.name,
- str(self.dec_fs // 1000),
- input_bs,
- output_wav,
- ]
- )
- Processing.run(cmd)
-
- @staticmethod
- def parse_config(spformat: spatialaudioformat, metadata_files: Optional[list] = []):
- name = spformat.name.lower()
-
- if name == "mono":
- return [""]
- elif name == "stereo":
- return ["-stereo"]
- elif name.startswith("ism"):
- # replace any missing files with NULL
- while len(metadata_files) < int(name[-1]):
- metadata_files.append("NULL")
- return ["-ism", name[-1]] + metadata_files[: int(name[-1])]
- elif name.startswith("masa"):
- return ["-masa", name[-1], metadata_files[0]]
- elif spformat.ambi_order > 0:
- if spformat.isplanar:
- return ["-sba", f"-{spformat.ambi_order}"]
- else:
- return ["-sba", f"+{spformat.ambi_order}"]
- elif spformat.isloudspeaker:
- return ["-mc", name]
-
- raise ValueError(f"IVAS: Invalid input config: {spformat}")
-
- def get_processing_file_paths(
- self, template_out_file: str, input_ext: Optional[str] = None
- ) -> list:
- return [template_out_file.replace(".wav", "_ivas.wav")]
-
- def get_total_bit_rate(self):
- return self.bitrate
diff --git a/scripts/pyprocessing/prepost_processing.py b/scripts/pyprocessing/prepost_processing.py
deleted file mode 100644
index 3ea7411cea8e4d282b98661a55eda7c7496ad8d1..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/prepost_processing.py
+++ /dev/null
@@ -1,220 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import json
-import logging
-import os
-import shutil
-from typing import Optional
-
-from pyaudio3dtools import (
- audioarray,
- audiofile,
- binauralrenderer,
- spatialaudioconvert,
- spatialaudioformat,
-)
-
-from pyprocessing import utils
-from pyprocessing.processing import Processing
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-class PreProcessing(Processing):
- def __init__(
- self,
- out_format: str,
- out_fs: int = 48000,
- out_fc: Optional[int] = None,
- output_loudness: Optional[int] = None,
- loudness_tool: Optional[str] = "bs1770demo",
- ):
- super().__init__()
- self.out_format = out_format
- self.out_fs = out_fs
- self.fc = out_fc
- self.output_loudness = output_loudness
- self.loudness_tool = loudness_tool
-
- def process(self, input_path: str, output_path: str, tmp_path: str):
- output_nickname = utils.get_nickname(output_path)
- logger.info(
- f" Pre Processing: convert to {self.out_format} : {output_nickname}"
- )
-
- try:
- spatialaudioconvert.spatial_audio_convert(
- input_path,
- tmp_path,
- out_format=self.out_format,
- out_fs=self.out_fs,
- output_loudness=self.output_loudness,
- loudness_tool=self.loudness_tool,
- )
- except Exception as e:
- logger.info(
- f" Pre Processing: by-pass : {output_nickname}. Encountered exception {e}"
- )
- else:
- shutil.move(tmp_path, output_path)
-
- def get_processing_file_paths(
- self, template_out_file: str, input_ext: Optional[str] = None
- ) -> list:
- return [template_out_file.replace(".wav", "_pre.wav")]
-
-
-class PostProcessing(Processing):
- def __init__(
- self,
- in_format: str,
- out_format: str,
- in_fs: int = 48000,
- out_fs: int = 48000,
- out_fc: Optional[int] = None,
- binaural_rendered: bool = False,
- limit_output: bool = False,
- cut_preamble: float = 0.0,
- split_file_path: str = "",
- bin_rend_include_LFE: bool = False,
- bin_rend_LFE_gain: Optional[float] = 10 ** (5.5 / 20),
- binaural_dataset: Optional[str] = "orange53",
- output_loudness: Optional[int] = None,
- loudness_tool: Optional[str] = "bs1770demo",
- ):
- super().__init__()
- self.in_spfmt = spatialaudioformat.Format(in_format=in_format)
- self.out_spfmt = spatialaudioformat.Format(in_format=out_format)
-
- self.in_fs = in_fs
- self.out_fs = out_fs
- self.fc = out_fc
- self.binaural_rendered = binaural_rendered
- self.cut_preamble = cut_preamble
- self.split_file_path = split_file_path
- self.bin_rend_include_LFE = bin_rend_include_LFE
- self.bin_rend_LFE_gain = bin_rend_LFE_gain
- self.binaural_dataset = binaural_dataset
- self.limit_output = limit_output
- self.output_loudness = output_loudness
- self.loudness_tool = loudness_tool
-
- def process(self, input_path: str, output_path: str, tmp_path: str):
- output_nickname = utils.get_nickname(output_path)
- logger.info(
- f" Post Processing: {self.in_spfmt.name} -> {self.out_spfmt.name} : {output_nickname}"
- )
-
- # Spatial audio format conversion
- spatialaudioconvert.spatial_audio_convert(
- input_path,
- tmp_path,
- in_format=self.in_spfmt.name,
- out_format=self.out_spfmt.name,
- in_fs=self.in_fs,
- out_fs=self.out_fs,
- out_fc=self.fc,
- cut_preamble_s=self.cut_preamble,
- limit_output=self.limit_output,
- bin_rend_include_LFE=self.bin_rend_include_LFE,
- bin_rend_LFE_gain=self.bin_rend_LFE_gain,
- output_loudness=self.output_loudness,
- loudness_tool=self.loudness_tool,
- binaural_dataset=self.binaural_dataset,
- )
- shutil.move(tmp_path, output_path)
-
- # Binaural rendering
- if self.binaural_rendered and "BINAURAL" not in self.out_spfmt.name:
- out_sig, fs = audiofile.readfile(output_path)
- bin_sig = binauralrenderer.binaural_rendering(
- out_sig,
- self.out_spfmt,
- spatialaudioformat.Format("BINAURAL"),
- fs=fs,
- include_LFE=self.bin_rend_include_LFE,
- LFE_gain=self.bin_rend_LFE_gain,
- )
- output_binaural_wav = output_path.replace(".wav", "_BINAURAL.wav")
- logger.info(
- f" Rendering {self.out_spfmt.name} -> BINAURAL : {output_nickname[:-4]}_BINAURAL.wav"
- )
- if self.limit_output:
- logger.info(f" limiting")
- audioarray.limiter(bin_sig, self.out_fs)
- audiofile.writefile(output_binaural_wav, bin_sig, self.out_fs)
-
- # split file
- if self.split_file_path:
- # check for the split info
- split_file_name = os.path.join(
- self.split_file_path,
- "".join(
- [
- os.path.basename(output_path)
- .replace(".wav", "")
- .replace("_post", ""),
- ".split",
- ]
- ),
- )
- if os.path.exists(split_file_name):
- fp = open(split_file_name, "r")
- splits = json.load(fp)
- fp.close
- n_splits = len(splits) - 1
- for split_idx in range(n_splits):
- output_path_split = output_path.replace(
- ".wav", f"_split{split_idx}.wav"
- )
- start = int(splits[split_idx] * self.out_fs)
- stop = int(splits[split_idx + 1] * self.out_fs)
- split_sig = audioarray.cut(out_sig, (start, stop))
- audiofile.writefile(output_path_split, split_sig, self.out_fs)
- if (self.binaural_rendered is True) and (
- self.out_spfmt.name != "BINAURAL"
- ):
- output_bin_wav_split = output_binaural_wav.replace(
- ".wav", f"_split{split_idx}.wav"
- )
- split_sig = audioarray.cut(bin_sig, (start, stop))
- audiofile.writefile(
- output_bin_wav_split, split_sig, self.out_fs
- )
-
- def get_processing_file_paths(
- self, template_out_file: str, input_ext: Optional[str] = None
- ) -> list:
- return [template_out_file.replace(".wav", "_post.wav")]
diff --git a/scripts/pyprocessing/processing.py b/scripts/pyprocessing/processing.py
deleted file mode 100644
index a0533b2b4edead2b7f699c39b14eebdf56e84227..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/processing.py
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-import subprocess
-from abc import ABC, abstractmethod
-
-global_print_cmd_only = False
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-
-class Processing(ABC):
- def __init__(self):
- pass
-
- @abstractmethod
- def process(self, input_path: str, output_path: str, tmp_path: str) -> None:
- pass
-
- @abstractmethod
- def get_processing_file_paths(self, template_out_file: str) -> list:
- pass
-
- @staticmethod
- def run(cmd: list) -> None:
- Processing.print_cmd(cmd)
-
- if not global_print_cmd_only:
- try:
- result = subprocess.run(cmd, check=True, capture_output=True, text=True)
- except subprocess.CalledProcessError as e:
- logger.debug(f"Command returned non-zero exit status : {e.returncode}")
- logger.debug(e.stderr)
- logger.debug(e.stdout)
- raise SystemError(
- f"Command returned non-zero exit status ({e.returncode}): {' '.join(e.cmd)}\n{e.stderr}\n{e.stdout}"
- )
-
- logger.debug(result.stderr)
- logger.debug(result.stdout)
-
- @staticmethod
- def run_python(cmd: list) -> None:
- Processing.print_cmd(cmd)
-
- if not global_print_cmd_only:
- result = subprocess.run(
- ["python3"] + cmd, check=True, capture_output=True, text=True
- )
- logger.debug(result.stderr)
- logger.debug(str(result.stdout))
-
- @staticmethod
- def print_cmd(cmd: list) -> None:
- cmd[:] = [i if i is not None else "MISSING" for i in cmd]
- logger.debug(f"Running command: {' '.join(cmd)}")
- if "MISSING" in cmd:
- logger.error("Missing arg in command")
- raise ValueError("Missing arg in command")
-
-
-def process_chain(
- proc_chain: list,
- input_path: str,
- output_wav: str,
- tmp_folder_path: str = os.path.abspath("tmp"),
-) -> None:
- tmp_file_template_name = os.path.join(tmp_folder_path, os.path.basename(output_wav))
-
- # Prepare a chain of of input/tmp/output files
- processing_paths = [input_path]
- for p in proc_chain:
- _, input_ext = os.path.splitext(processing_paths[-1])
- processing_paths.extend(
- p.get_processing_file_paths(tmp_file_template_name, input_ext=input_ext)
- )
-
- # Temporary files if needed
- tmp_processing_paths = processing_paths[:]
- tmp_path_iter = iter(tmp_processing_paths)
- next(tmp_path_iter)
-
- # Replace last with real output
- processing_paths[-1] = output_wav
- in_path_iter = iter(processing_paths)
- out_path_iter = iter(processing_paths)
- next(out_path_iter)
-
- # go through processing chain
- for p in proc_chain:
- p.process(next(in_path_iter), next(out_path_iter), next(tmp_path_iter))
diff --git a/scripts/pyprocessing/processing_configs.py b/scripts/pyprocessing/processing_configs.py
deleted file mode 100644
index 255f183c6decc1d8d84243aa61d7f4dfc32f581d..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/processing_configs.py
+++ /dev/null
@@ -1,375 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import json
-import logging
-import os
-
-from pyprocessing.evs import EVS
-from pyprocessing.ivas import IVAS
-from pyprocessing.prepost_processing import PostProcessing, PreProcessing
-from pyprocessing.utils import list_audio
-
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-# Parse a JSON file into class and perform necessary validation
-class test_config:
- def __init__(self, filename: str):
- # Open and read configuration test file
- with open(filename, "r") as fp:
- config_dict = json.load(fp)
-
- # Init lists of conditions and associated folders
- self.list_of_conditions = list()
- self.output_folders = list()
- self.tmp_folders = list()
-
- # Set defaults
- self._set_defaults()
-
- # Set/override class attributes based on JSON file and update internal dict
- for key, value in config_dict.items():
- # update subdictionaries in case of ivas and evs
- if key.startswith("ivas"):
- setattr(self, key, self.DEFAULTS_ivas.copy())
- getattr(self, key).update(value)
- self.dict[key] = self.DEFAULTS_ivas.copy()
- self.dict[key].update(value)
- elif key.startswith("evs"):
- setattr(self, key, self.DEFAULTS_evs.copy())
- getattr(self, key).update(value)
- self.dict[key] = self.DEFAULTS_evs.copy()
- self.dict[key].update(value)
- # avoid overwriting the whole subkey, merge instead
- elif hasattr(self, key) and isinstance(getattr(self, key), dict):
- for k, v in value.items():
- getattr(self, key)[k] = v
- self.dict[key][k] = v
- else:
- setattr(self, key, value)
- self.dict[key] = value
-
- # Check required keys
- REQUIRED_KEYS = [
- "name",
- "input_path",
- "output_path",
- "in_format",
- "renderer_format",
- "conditions_to_generate",
- ]
- REQUIRED_KEYS_IVAS = ["bitrates", "out_format"]
- REQUIRED_KEYS_EVS = ["bitrates"]
- MISSING_KEYS = list()
-
- for key in REQUIRED_KEYS:
- if not hasattr(self, key):
- MISSING_KEYS.append(key)
- elif not getattr(self, key):
- MISSING_KEYS.append(key)
-
- for condition in self.conditions_to_generate:
- if condition.startswith("ivas"):
- if not hasattr(self, condition):
- raise SystemExit(
- f"Definition not found for condition {condition}, but was specified in conditions to generate"
- )
- else:
- for key in REQUIRED_KEYS_IVAS:
- if getattr(self, condition).get(key, None) is None:
- MISSING_KEYS.append(f"{condition}:{key}")
- elif condition.startswith("evs"):
- if not hasattr(self, condition):
- raise SystemExit(
- f"Definition not found for condition {condition}, but was specified in conditions to generate"
- )
- else:
- for key in REQUIRED_KEYS_EVS:
- if getattr(self, condition).get(key, None) is None:
- MISSING_KEYS.append(f"{condition}:{key}")
-
- # Report missing keys to the user
- if len(MISSING_KEYS) > 0:
- raise KeyError(
- f"The following key(s) must be specified in {filename} : {MISSING_KEYS}"
- )
-
- # Remove DEFAULTS_ keys from dict and self
- for key in list(self.dict.keys()):
- if key.startswith("DEFAULTS_"):
- delattr(self, key)
- self.dict.pop(key, None)
-
- # Store the updated JSON for later output
- self.json_out = json.dumps(self.dict, indent=4)
-
- # Concatenation options
- if self.concatenate_input:
- if len(self.concat_silence_ms):
- self.concat_silence_pre = self.concat_silence_ms[0]
- self.concat_silence_post = self.concat_silence_ms[1]
- else:
- self.concat_silence_pre = self.concat_silence_ms
- self.concat_silence_post = self.concat_silence_ms
-
- # Pre-processing
- if self.preproc_input:
- self.list_of_conditions.append(self._get_condition_definition("preproc", 0))
-
- # Check input directory for items
- self.items_list = list_audio(
- self.input_path, absolute=True, select_list=self.input_select
- )
-
- if self.items_list is None or len(self.items_list) == 0:
- raise SystemExit(
- f"Directory {self.input_path} is either blank, does not exist or all files were filtered out."
- )
-
- # Check if concatenation is required
- if self.concatenate_input and any(
- [i.endswith(".txt") for i in self.items_list]
- ):
- raise SystemExit("Concatenation for text files is unsupported")
-
- # Go through conditions to generate
- for cond in self.conditions_to_generate:
- try:
- bitrates = getattr(self, cond)["bitrates"]
- # If single value, convert to list for convenience
- if not hasattr(bitrates, "__len__") and not isinstance(bitrates, str):
- bitrates = [bitrates]
- for b in bitrates:
- if isinstance(b, list):
- self.list_of_conditions.append(
- self._get_condition_definition(cond, [int(x) for x in b])
- )
- else:
- self.list_of_conditions.append(
- self._get_condition_definition(cond, int(b))
- )
- bitrate_label = str(
- self.list_of_conditions[-1]["proc_chain"][
- 0
- ].get_total_bit_rate()
- )
- self.list_of_conditions[-1]["id"] = f"{cond}_{bitrate_label}"
- except:
- self.list_of_conditions.append(self._get_condition_definition(cond, 0))
-
- # create output and temporary folder names for the conditions
- for list_cond in self.list_of_conditions:
- self.output_folders.append(os.path.join(self.output_path, list_cond["id"]))
- self.tmp_folders.append(
- os.path.join(self.output_path, "tmp_" + list_cond["id"])
- )
-
- def __repr__(self):
- return str(vars(self))
-
- # default values to enable a sparse JSON input file - update if adding new keys
- def _set_defaults(self):
- DEFAULT_CONFIG = {
- # general options
- "enable_multiprocessing": True,
- "delete_tmp": False,
- # input/preprocessing options
- "preproc_input": False,
- "input_select": None,
- "concatenate_input": False,
- "concat_silence_ms": [0, 0],
- # sampling rates
- "in_fs": 48000,
- "out_fs": 48000,
- # binaural rendering
- "binaural_rendered": False,
- "bin_rend_include_LFE": False,
- "bin_rend_LFE_gain": 10 ** (5.5 / 20),
- "binaural_dataset": "orange53",
- # apply limiter in the postprocessing
- "limit_output": False,
- # loudness adjustments
- "preproc_loudness": None,
- "output_loudness": None,
- "loudness_tool": "bs1770demo",
- # condition-specific values
- "ref": {"out_fc": 48000},
- "DEFAULTS_ivas": {
- "cod_bin": "../IVAS_cod",
- "dec_bin": "../IVAS_dec",
- "cod_opt": None,
- "dec_opt": None,
- "enc_fs": 48000,
- "dec_fs": 48000,
- "max_band": "FB",
- "dtx": False,
- # head tracking
- "head_tracking": False,
- "ht_file": "./trajectories/full_circle_in_15s",
- # BER/FER
- "plc": False,
- "plc_rate": 10,
- },
- "DEFAULTS_evs": {
- "cod_bin": "../IVAS_cod",
- "dec_bin": "../IVAS_dec",
- "cod_opt": None,
- "dec_opt": None,
- "enc_fs": 48000,
- "dec_fs": 48000,
- "max_band": "FB",
- "dtx": False,
- },
- }
-
- # needed to output JSON later
- self.dict = DEFAULT_CONFIG
-
- # set defaults from above dict
- for key, value in DEFAULT_CONFIG.items():
- setattr(self, key, value)
-
- # Definitions of processing chains (edit with care)
- def _get_condition_definition(self, cond: str, bitrate: int) -> dict:
- definition = dict(id=cond, proc_chain=[])
-
- if cond.startswith("preproc"):
- definition["proc_chain"].extend(
- [
- PreProcessing(
- out_format=self.in_format,
- out_fs=self.in_fs,
- output_loudness=self.preproc_loudness,
- loudness_tool=self.loudness_tool,
- )
- ]
- )
- elif cond.startswith("ref"):
- definition["proc_chain"].extend(
- [
- PostProcessing(
- in_format=self.in_format,
- out_format=self.renderer_format,
- in_fs=self.in_fs,
- out_fs=self.out_fs,
- out_fc=self.ref["out_fc"],
- binaural_rendered=self.binaural_rendered,
- bin_rend_include_LFE=self.bin_rend_include_LFE,
- bin_rend_LFE_gain=self.bin_rend_LFE_gain,
- binaural_dataset=self.binaural_dataset,
- limit_output=self.limit_output,
- output_loudness=self.output_loudness,
- loudness_tool=self.loudness_tool,
- )
- ]
- )
- elif cond.startswith("lp3k5"):
- definition["proc_chain"].extend(
- [
- PostProcessing(
- in_format=self.in_format,
- out_format=self.renderer_format,
- in_fs=self.in_fs,
- out_fs=self.out_fs,
- out_fc=3500,
- binaural_rendered=self.binaural_rendered,
- binaural_dataset=self.binaural_dataset,
- limit_output=self.limit_output,
- output_loudness=self.output_loudness,
- loudness_tool=self.loudness_tool,
- )
- ]
- )
- elif cond.startswith("lp7k"):
- definition["proc_chain"].extend(
- [
- PostProcessing(
- in_format=self.in_format,
- out_format=self.renderer_format,
- in_fs=self.in_fs,
- out_fs=self.out_fs,
- out_fc=7000,
- binaural_rendered=self.binaural_rendered,
- binaural_dataset=self.binaural_dataset,
- limit_output=self.limit_output,
- output_loudness=self.output_loudness,
- loudness_tool=self.loudness_tool,
- )
- ]
- )
- elif cond.startswith("evs"):
- definition["proc_chain"].extend(
- [
- EVS(
- in_format=self.in_format,
- out_format=self.in_format,
- bitrate=bitrate,
- in_fs=self.in_fs,
- **getattr(self, cond),
- ),
- PostProcessing(
- in_format=self.in_format,
- out_format=self.renderer_format,
- in_fs=getattr(self, cond)["dec_fs"],
- out_fs=self.out_fs,
- binaural_rendered=self.binaural_rendered,
- binaural_dataset=self.binaural_dataset,
- limit_output=self.limit_output,
- ),
- ]
- )
- elif cond.startswith("ivas"):
- definition["proc_chain"].extend(
- [
- IVAS(
- in_format=self.in_format,
- bitrate=bitrate,
- in_fs=self.in_fs,
- **getattr(self, cond),
- ),
- PostProcessing(
- in_format=getattr(self, cond)["out_format"],
- out_format=self.renderer_format,
- in_fs=getattr(self, cond)["dec_fs"],
- out_fs=self.out_fs,
- binaural_rendered=self.binaural_rendered,
- binaural_dataset=self.binaural_dataset,
- limit_output=self.limit_output,
- ),
- ]
- )
- else:
- raise SystemExit(f"Invalid condition: {cond}")
-
- return definition
diff --git a/scripts/pyprocessing/utils.py b/scripts/pyprocessing/utils.py
deleted file mode 100644
index e62840fd1367ef536ee9213065c535598fcf35ca..0000000000000000000000000000000000000000
--- a/scripts/pyprocessing/utils.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/env python3
-
-"""
- (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-"""
-
-import logging
-import os
-import platform
-import shutil
-from typing import Union
-
-"""
-Directory/path handling
-"""
-
-ALLOWED_INPUT_EXT = (".wav", ".pcm", ".txt")
-main_logger = logging.getLogger("__main__")
-logger = main_logger.getChild(__name__)
-logger.setLevel(logging.DEBUG)
-
-# Creates a directory at the given path if it does not exist already
-def create_dir(path: str) -> None:
- if not os.path.exists(path):
- os.makedirs(path)
-
-
-def delete_dir(path: str) -> None:
- if os.path.exists(path) and os.path.isdir(path):
- logger.debug(f"Deleting path {path}")
- shutil.rmtree(path)
-
-
-class DirManager:
- """
- Context manager that creates directories if not already present and
- automatically cleans up (i.e. deletes) all specified paths
- """
-
- def __init__(
- self, create_paths: Union[str, list], delete_paths: Union[str, list] = list()
- ):
- self.create_paths = (
- create_paths if type(create_paths) == list else [create_paths]
- )
- self.delete_paths = (
- delete_paths if type(delete_paths) == list else [delete_paths]
- )
-
- def __enter__(self):
- for path in self.create_paths:
- create_dir(path)
-
- def __exit__(self, exc_type, exc_value, exc_traceback):
- for path in self.delete_paths:
- if path in self.create_paths:
- delete_dir(path)
- else:
- print(
- "Attempting to delete a tmp dir that was not in create_paths. Do not delete."
- )
-
-
-def list_audio(path: str, absolute: bool = False, select_list: list = None) -> list:
- """
- Return list with all files with ALLOWED_INPUT_EXT found under the given path.
-
- If path is a directory, all files in it are included, if it is a file, just the file
- will be in the list. If a select list is provided, files are filtered accordingly.
- """
- audio_list = list()
-
- if os.path.exists(path):
- if os.path.isdir(path):
- if absolute:
- audio_list = [
- os.path.join(path, f)
- for f in os.listdir(path)
- if f.endswith(ALLOWED_INPUT_EXT)
- ]
- else:
- audio_list = [
- f for f in os.listdir(path) if f.endswith(ALLOWED_INPUT_EXT)
- ]
- else:
- if not absolute:
- path = os.path.basename(path)
- ext = os.path.splitext(path)[-1].lower()
- if ext in ALLOWED_INPUT_EXT:
- audio_list.append(path)
-
- # Filter according to select list
- if select_list is not None:
- if hasattr(select_list, "__len__") and not isinstance(select_list, str):
- select_set = set([os.path.splitext(i)[0] for i in select_list])
- else:
- select_set = [os.path.splitext(select_list)[0]]
-
- audio_list_orig = audio_list
- audio_list = []
- for f in audio_list_orig:
- f_name = os.path.splitext(os.path.basename(f))[0]
- if any(x in f_name for x in select_set):
- audio_list.append(f)
-
- return audio_list
-
-
-def get_exec_path(path: str) -> str:
- if platform.system() == "Windows" and os.path.splitext(path)[1] != ".exe":
- exe = ".exe"
- else:
- exe = ""
-
- return f"{os.path.abspath(path)}{exe}"
-
-
-def get_nickname(path: str) -> str:
- nickname = os.path.join(
- os.path.basename(os.path.dirname(path)), os.path.basename(path)
- )
- return nickname
diff --git a/scripts/runIvasCodec.py b/scripts/runIvasCodec.py
index 070fb8e4f04da261e273fc0a1576c6ab5533cb6b..7cf1d64a6b130b52ad00a317c78dc2bea7a94bc0 100755
--- a/scripts/runIvasCodec.py
+++ b/scripts/runIvasCodec.py
@@ -34,6 +34,7 @@ import os.path
import platform
import sys
import logging
+import shutil
from pyivastest import IvasScriptsCommon, IvasModeRunner
import pyivastest.constants as constants
@@ -81,6 +82,11 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript):
help="Decoder binary name (default {})".format(default_dec),
default=default_dec,
)
+ self.parser.add_argument(
+ "--fail_log_dir",
+ help="Move logs of failed modes to dir (default none)",
+ default=None,
+ )
def run(self):
self.parse_args()
@@ -137,13 +143,26 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript):
self.logger.console(" Encoder: {}".format(bin_enc), logging.INFO)
self.logger.console(" Decoder: {}".format(bin_dec), logging.INFO)
+
runner.run()
self.logger.console(" ")
+ fail_log_dir=None
+ if self.args["fail_log_dir"] is not None:
+ fail_log_dir = os.path.realpath(self.args["fail_log_dir"])
+ if not(os.path.exists(fail_log_dir)):
+ os.makedirs(fail_log_dir)
for r in runner.results:
self.logger.console(r[0])
+ if fail_log_dir is not None:
+ shutil.copy(r[3],fail_log_dir)
+
self.logger.console(" ")
+ encs_failed = len(runner.failed_modes["enc"]) > 0
+ decs_failed = len(runner.failed_modes["dec"]) > 0
+ return encs_failed or decs_failed
+
if __name__ == "__main__":
script = RunIvasCodec()
- script.run()
+ sys.exit(script.run())
diff --git a/scripts/self_test.py b/scripts/self_test.py
index 2be585882b1dd4b322a9fd64aaae02d86159e5d6..d7118832db57d14fad8db5451230c3ab79ae5de2 100755
--- a/scripts/self_test.py
+++ b/scripts/self_test.py
@@ -63,7 +63,7 @@ MODES = {
"5_1_4": "5_1_4",
"7_1_4": "7_1_4",
},
- "-ISM": {"1": "ISM1", "2": "ISM2", "3": "ISM3", "4": "ISM4"},
+ "-ISM": {"1": "ISM1", "2": "ISM2", "3": "ISM3", "4": "ISM4", "+4": "ISM+4"},
"-SBA": {
"-3": "HOA3",
"3": "HOA3",
diff --git a/scripts/switchPaths/sw_13k2_128k.bin b/scripts/switchPaths/sw_13k2_128k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..7309ee26ab59fbbfaf4889e1163b97628a0ef565
--- /dev/null
+++ b/scripts/switchPaths/sw_13k2_128k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d9ddf71b27bcd47d5f37abb6c62146ff4fb5a848cd85605d4df87a9cc4b1d1e0
+size 60000
diff --git a/scripts/switchPaths/sw_13k2_256k.bin b/scripts/switchPaths/sw_13k2_256k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..1d0c3fac28a5f752f12830674f1864f6ac1e971b
--- /dev/null
+++ b/scripts/switchPaths/sw_13k2_256k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:05fd8870e43b0eb349d5e9b3bb939574b71d3e7630940a10d6767cae2c6c4a3c
+size 60000
diff --git a/scripts/switchPaths/sw_16k4_128k.bin b/scripts/switchPaths/sw_16k4_128k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..1e85a18b77c031b534476e37465cdf5ca76a6472
--- /dev/null
+++ b/scripts/switchPaths/sw_16k4_128k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3e07f8c6be0e08ed96b15c9a3daa2811ef0b596dc08cc687bce1f0ca8e49969b
+size 60000
diff --git a/scripts/switchPaths/sw_16k4_256k.bin b/scripts/switchPaths/sw_16k4_256k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..47bc9c9aa35a39376bffd6059fb41e54123f2dc0
--- /dev/null
+++ b/scripts/switchPaths/sw_16k4_256k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7dedd5a20cbc5594ec869b13b3e9774efd6394ad5d5b64a4e98210447c3a75ba
+size 60000
diff --git a/scripts/switchPaths/sw_24k4_256k_1.bin b/scripts/switchPaths/sw_24k4_256k_1.bin
new file mode 100644
index 0000000000000000000000000000000000000000..e2852619262f36e617038034a42807364fae28ed
--- /dev/null
+++ b/scripts/switchPaths/sw_24k4_256k_1.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf5b303299209bdd4f7e007d1190c7957b17ab3ee399570f1bb87d27f3fec092
+size 60000
diff --git a/scripts/switchPaths/sw_24k4_384k.bin b/scripts/switchPaths/sw_24k4_384k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..781e3023b26710b65400686883f8502e1c683253
--- /dev/null
+++ b/scripts/switchPaths/sw_24k4_384k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e3e7599638d3792d851a5bdc13b85d6b401ebc9724795562b1a5d25fc2c3bc6
+size 60000
diff --git a/scripts/switchPaths/sw_24k4_512k.bin b/scripts/switchPaths/sw_24k4_512k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..dcc58dbdc6a2b4801563dcbab3b87d76cb180b5c
--- /dev/null
+++ b/scripts/switchPaths/sw_24k4_512k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2369edc21bdf3440ceaf21de16698e38cf50c246ddf04878a5961538dded11ad
+size 60000
diff --git a/scripts/switchPaths/sw_32k_128k.bin b/scripts/switchPaths/sw_32k_128k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..fc4b81e0c3d2f57cc7241c75c37d64fbcec9f909
--- /dev/null
+++ b/scripts/switchPaths/sw_32k_128k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fdb0da661cb08cc546c3761afa1d778d2c7aa04df61b608ae4301e31867dcc2e
+size 60000
diff --git a/scripts/switchPaths/sw_32k_256k.bin b/scripts/switchPaths/sw_32k_256k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..46b1e17cd4bb30aa1b3fd5ed82c7b1ac1702824a
--- /dev/null
+++ b/scripts/switchPaths/sw_32k_256k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:61dacf79a7582edb83c151c300392efb719f08762a963da29f9b7665305a8c5f
+size 60000
diff --git a/scripts/switchPaths/sw_32k_384k.bin b/scripts/switchPaths/sw_32k_384k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..088edfacbffdb508a96b89d434cf5298081a6b21
--- /dev/null
+++ b/scripts/switchPaths/sw_32k_384k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77f6e7b141b16bd21005c5169cd9bc8b7b2c96df379ce9e74788717c66b9130f
+size 60000
diff --git a/scripts/switchPaths/sw_32k_512k.bin b/scripts/switchPaths/sw_32k_512k.bin
new file mode 100644
index 0000000000000000000000000000000000000000..d385f3a890804eedaafdc308233954e106e9f2c4
--- /dev/null
+++ b/scripts/switchPaths/sw_32k_512k.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a6eb4080fce3bc1a7ba20cfc8ef3e8ff981ebce5de7c8e45bbc12edf7f21d0c
+size 60000
diff --git a/scripts/testv/config_directivity.cfg b/scripts/testv/config_directivity.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..94807d688ce642a6fd5aff7d7a958e4f4fa7127b
--- /dev/null
+++ b/scripts/testv/config_directivity.cfg
@@ -0,0 +1,3 @@
+[general]
+directivity = [0.0, 360.0, 0.2512];
+
diff --git a/scripts/testv/headrot_case04_3000_q.csv b/scripts/testv/headrot_case04_3000_q.csv
new file mode 100644
index 0000000000000000000000000000000000000000..9f90e9e38b368eabccd6d1f04be84c3d5c51c7fb
--- /dev/null
+++ b/scripts/testv/headrot_case04_3000_q.csv
@@ -0,0 +1,3000 @@
+1.00,0.00,0.00,0.00,5.03,6.40,0.00
+1.00,-0.00,0.00,0.00,5.03,6.40,0.00
+1.00,-0.00,0.00,0.00,5.03,6.40,0.00
+1.00,-0.00,0.00,0.00,5.03,6.41,0.01
+1.00,-0.00,0.00,0.00,5.03,6.41,0.01
+1.00,-0.00,0.00,0.00,5.03,6.41,0.01
+1.00,-0.00,0.00,0.01,5.03,6.41,0.01
+1.00,-0.00,0.00,0.01,5.03,6.42,0.01
+1.00,-0.00,0.00,0.01,5.03,6.42,0.01
+1.00,-0.00,0.00,0.01,5.03,6.42,0.02
+1.00,-0.00,0.00,0.01,5.03,6.43,0.02
+1.00,-0.00,0.00,0.01,5.03,6.43,0.02
+1.00,-0.00,0.00,0.01,5.03,6.43,0.02
+1.00,-0.00,0.00,0.01,5.03,6.43,0.02
+1.00,-0.00,0.00,0.01,5.03,6.44,0.03
+1.00,-0.00,0.01,0.01,5.03,6.44,0.03
+1.00,-0.00,0.01,0.01,5.03,6.44,0.03
+1.00,-0.00,0.01,0.02,5.03,6.44,0.03
+1.00,-0.00,0.01,0.02,5.03,6.45,0.03
+1.00,-0.00,0.01,0.02,5.03,6.45,0.03
+1.00,-0.00,0.01,0.02,5.03,6.45,0.04
+1.00,-0.00,0.01,0.02,5.03,6.46,0.04
+1.00,-0.00,0.01,0.02,5.03,6.46,0.04
+1.00,-0.00,0.01,0.02,5.03,6.46,0.04
+1.00,-0.00,0.01,0.02,5.03,6.46,0.04
+1.00,-0.00,0.01,0.02,5.03,6.47,0.05
+1.00,-0.00,0.01,0.02,5.03,6.47,0.05
+1.00,-0.00,0.01,0.02,5.03,6.47,0.05
+1.00,-0.00,0.01,0.03,5.03,6.48,0.05
+1.00,-0.00,0.01,0.03,5.03,6.48,0.05
+1.00,-0.00,0.01,0.03,5.02,6.48,0.05
+1.00,-0.00,0.01,0.03,5.02,6.48,0.06
+1.00,-0.00,0.01,0.03,5.02,6.49,0.06
+1.00,-0.00,0.01,0.03,5.02,6.49,0.06
+1.00,-0.00,0.01,0.03,5.02,6.49,0.06
+1.00,-0.00,0.01,0.03,5.02,6.49,0.06
+1.00,-0.00,0.01,0.03,5.02,6.50,0.07
+1.00,-0.00,0.01,0.03,5.02,6.50,0.07
+1.00,-0.00,0.01,0.03,5.02,6.50,0.07
+1.00,-0.00,0.01,0.04,5.02,6.51,0.07
+1.00,-0.00,0.01,0.04,5.02,6.51,0.07
+1.00,-0.00,0.01,0.04,5.02,6.51,0.08
+1.00,-0.00,0.01,0.04,5.02,6.51,0.08
+1.00,-0.00,0.01,0.04,5.02,6.52,0.08
+1.00,-0.00,0.02,0.04,5.02,6.52,0.08
+1.00,-0.00,0.02,0.04,5.02,6.52,0.08
+1.00,-0.00,0.02,0.04,5.02,6.53,0.08
+1.00,-0.00,0.02,0.04,5.02,6.53,0.09
+1.00,-0.00,0.02,0.04,5.02,6.53,0.09
+1.00,-0.00,0.02,0.04,5.02,6.53,0.09
+1.00,-0.00,0.02,0.05,5.02,6.54,0.09
+1.00,-0.00,0.02,0.05,5.02,6.54,0.09
+1.00,-0.00,0.02,0.05,5.02,6.54,0.10
+1.00,-0.00,0.02,0.05,5.02,6.54,0.10
+1.00,-0.00,0.02,0.05,5.02,6.55,0.10
+1.00,-0.00,0.02,0.05,5.02,6.55,0.10
+1.00,-0.00,0.02,0.05,5.02,6.55,0.10
+1.00,-0.00,0.02,0.05,5.02,6.56,0.10
+1.00,-0.00,0.02,0.05,5.02,6.56,0.11
+1.00,-0.00,0.02,0.05,5.02,6.56,0.11
+1.00,-0.00,0.02,0.05,5.02,6.56,0.11
+1.00,-0.00,0.02,0.06,5.02,6.57,0.11
+1.00,-0.00,0.02,0.06,5.02,6.57,0.11
+1.00,-0.00,0.02,0.06,5.02,6.57,0.12
+1.00,-0.00,0.02,0.06,5.02,6.58,0.12
+1.00,-0.00,0.02,0.06,5.02,6.58,0.12
+1.00,-0.00,0.02,0.06,5.02,6.58,0.12
+1.00,-0.00,0.02,0.06,5.02,6.58,0.12
+1.00,-0.00,0.02,0.06,5.02,6.59,0.12
+1.00,-0.00,0.02,0.06,5.02,6.59,0.13
+1.00,-0.00,0.02,0.06,5.01,6.59,0.13
+1.00,-0.00,0.02,0.06,5.01,6.59,0.13
+1.00,-0.00,0.03,0.07,5.01,6.60,0.13
+1.00,-0.00,0.03,0.07,5.01,6.60,0.13
+1.00,-0.00,0.03,0.07,5.01,6.60,0.14
+1.00,-0.00,0.03,0.07,5.01,6.61,0.14
+1.00,-0.00,0.03,0.07,5.01,6.61,0.14
+1.00,-0.00,0.03,0.07,5.01,6.61,0.14
+1.00,-0.00,0.03,0.07,5.01,6.61,0.14
+1.00,-0.00,0.03,0.07,5.01,6.62,0.14
+1.00,-0.00,0.03,0.07,5.01,6.62,0.15
+1.00,-0.00,0.03,0.07,5.01,6.62,0.15
+1.00,-0.00,0.03,0.08,5.01,6.63,0.15
+1.00,-0.00,0.03,0.08,5.01,6.63,0.15
+1.00,-0.00,0.03,0.08,5.01,6.63,0.15
+1.00,-0.00,0.03,0.08,5.01,6.63,0.16
+1.00,-0.00,0.03,0.08,5.01,6.64,0.16
+1.00,-0.00,0.03,0.08,5.01,6.64,0.16
+1.00,-0.00,0.03,0.08,5.01,6.64,0.16
+1.00,-0.00,0.03,0.08,5.01,6.64,0.16
+1.00,-0.00,0.03,0.08,5.01,6.65,0.16
+1.00,-0.00,0.03,0.08,5.01,6.65,0.17
+1.00,-0.00,0.03,0.08,5.01,6.65,0.17
+1.00,-0.00,0.03,0.09,5.01,6.66,0.17
+1.00,-0.00,0.03,0.09,5.00,6.66,0.17
+1.00,-0.00,0.03,0.09,5.00,6.66,0.17
+1.00,-0.00,0.03,0.09,5.00,6.66,0.18
+1.00,-0.00,0.03,0.09,5.00,6.67,0.18
+1.00,-0.00,0.03,0.09,5.00,6.67,0.18
+1.00,-0.00,0.03,0.09,5.00,6.67,0.18
+1.00,-0.00,0.03,0.09,5.00,6.68,0.18
+1.00,-0.00,0.04,0.09,5.00,6.68,0.18
+1.00,-0.00,0.04,0.09,5.00,6.68,0.19
+0.99,-0.00,0.04,0.09,5.00,6.68,0.19
+0.99,-0.00,0.04,0.10,5.00,6.69,0.19
+0.99,-0.00,0.04,0.10,5.00,6.69,0.19
+0.99,-0.00,0.04,0.10,5.00,6.69,0.19
+0.99,-0.00,0.04,0.10,5.00,6.69,0.20
+0.99,-0.00,0.04,0.10,5.00,6.70,0.20
+0.99,-0.00,0.04,0.10,5.00,6.70,0.20
+0.99,-0.00,0.04,0.10,5.00,6.70,0.20
+0.99,-0.00,0.04,0.10,5.00,6.71,0.20
+0.99,-0.00,0.04,0.10,5.00,6.71,0.20
+0.99,-0.00,0.04,0.10,4.99,6.71,0.21
+0.99,-0.00,0.04,0.10,4.99,6.71,0.21
+0.99,-0.00,0.04,0.11,4.99,6.72,0.21
+0.99,-0.00,0.04,0.11,4.99,6.72,0.21
+0.99,-0.00,0.04,0.11,4.99,6.72,0.21
+0.99,-0.00,0.04,0.11,4.99,6.72,0.22
+0.99,-0.00,0.04,0.11,4.99,6.73,0.22
+0.99,-0.00,0.04,0.11,4.99,6.73,0.22
+0.99,-0.00,0.04,0.11,4.99,6.73,0.22
+0.99,-0.00,0.04,0.11,4.99,6.74,0.22
+0.99,-0.00,0.04,0.11,4.99,6.74,0.22
+0.99,-0.00,0.04,0.11,4.99,6.74,0.23
+0.99,-0.00,0.04,0.11,4.99,6.74,0.23
+0.99,-0.01,0.04,0.12,4.99,6.75,0.23
+0.99,-0.01,0.04,0.12,4.99,6.75,0.23
+0.99,-0.01,0.04,0.12,4.99,6.75,0.23
+0.99,-0.01,0.04,0.12,4.98,6.75,0.24
+0.99,-0.01,0.05,0.12,4.98,6.76,0.24
+0.99,-0.01,0.05,0.12,4.98,6.76,0.24
+0.99,-0.01,0.05,0.12,4.98,6.76,0.24
+0.99,-0.01,0.05,0.12,4.98,6.77,0.24
+0.99,-0.01,0.05,0.12,4.98,6.77,0.24
+0.99,-0.01,0.05,0.12,4.98,6.77,0.25
+0.99,-0.01,0.05,0.12,4.98,6.77,0.25
+0.99,-0.01,0.05,0.13,4.98,6.78,0.25
+0.99,-0.01,0.05,0.13,4.98,6.78,0.25
+0.99,-0.01,0.05,0.13,4.98,6.78,0.25
+0.99,-0.01,0.05,0.13,4.98,6.78,0.26
+0.99,-0.01,0.05,0.13,4.98,6.79,0.26
+0.99,-0.01,0.05,0.13,4.98,6.79,0.26
+0.99,-0.01,0.05,0.13,4.98,6.79,0.26
+0.99,-0.01,0.05,0.13,4.97,6.80,0.26
+0.99,-0.01,0.05,0.13,4.97,6.80,0.26
+0.99,-0.01,0.05,0.13,4.97,6.80,0.27
+0.99,-0.01,0.05,0.13,4.97,6.80,0.27
+0.99,-0.01,0.05,0.14,4.97,6.81,0.27
+0.99,-0.01,0.05,0.14,4.97,6.81,0.27
+0.99,-0.01,0.05,0.14,4.97,6.81,0.27
+0.99,-0.01,0.05,0.14,4.97,6.81,0.28
+0.99,-0.01,0.05,0.14,4.97,6.82,0.28
+0.99,-0.01,0.05,0.14,4.97,6.82,0.28
+0.99,-0.01,0.05,0.14,4.97,6.82,0.28
+0.99,-0.01,0.05,0.14,4.97,6.83,0.28
+0.99,-0.01,0.05,0.14,4.97,6.83,0.28
+0.99,-0.01,0.05,0.14,4.96,6.83,0.29
+0.99,-0.01,0.05,0.14,4.96,6.83,0.29
+0.99,-0.01,0.05,0.14,4.96,6.84,0.29
+0.99,-0.01,0.06,0.15,4.96,6.84,0.29
+0.99,-0.01,0.06,0.15,4.96,6.84,0.29
+0.99,-0.01,0.06,0.15,4.96,6.84,0.30
+0.99,-0.01,0.06,0.15,4.96,6.85,0.30
+0.99,-0.01,0.06,0.15,4.96,6.85,0.30
+0.99,-0.01,0.06,0.15,4.96,6.85,0.30
+0.99,-0.01,0.06,0.15,4.96,6.86,0.30
+0.99,-0.01,0.06,0.15,4.96,6.86,0.30
+0.99,-0.01,0.06,0.15,4.96,6.86,0.31
+0.99,-0.01,0.06,0.15,4.95,6.86,0.31
+0.99,-0.01,0.06,0.15,4.95,6.87,0.31
+0.99,-0.01,0.06,0.16,4.95,6.87,0.31
+0.99,-0.01,0.06,0.16,4.95,6.87,0.31
+0.99,-0.01,0.06,0.16,4.95,6.87,0.32
+0.99,-0.01,0.06,0.16,4.95,6.88,0.32
+0.99,-0.01,0.06,0.16,4.95,6.88,0.32
+0.99,-0.01,0.06,0.16,4.95,6.88,0.32
+0.98,-0.01,0.06,0.16,4.95,6.88,0.32
+0.98,-0.01,0.06,0.16,4.95,6.89,0.32
+0.98,-0.01,0.06,0.16,4.95,6.89,0.33
+0.98,-0.01,0.06,0.16,4.94,6.89,0.33
+0.98,-0.01,0.06,0.16,4.94,6.90,0.33
+0.98,-0.01,0.06,0.17,4.94,6.90,0.33
+0.98,-0.01,0.06,0.17,4.94,6.90,0.33
+0.98,-0.01,0.06,0.17,4.94,6.90,0.33
+0.98,-0.01,0.06,0.17,4.94,6.91,0.34
+0.98,-0.01,0.06,0.17,4.94,6.91,0.34
+0.98,-0.01,0.06,0.17,4.94,6.91,0.34
+0.98,-0.01,0.06,0.17,4.94,6.91,0.34
+0.98,-0.01,0.06,0.17,4.94,6.92,0.34
+0.98,-0.01,0.07,0.17,4.94,6.92,0.35
+0.98,-0.01,0.07,0.17,4.93,6.92,0.35
+0.98,-0.01,0.07,0.17,4.93,6.92,0.35
+0.98,-0.01,0.07,0.18,4.93,6.93,0.35
+0.98,-0.01,0.07,0.18,4.93,6.93,0.35
+0.98,-0.01,0.07,0.18,4.93,6.93,0.35
+0.98,-0.01,0.07,0.18,4.93,6.94,0.36
+0.98,-0.01,0.07,0.18,4.93,6.94,0.36
+0.98,-0.01,0.07,0.18,4.93,6.94,0.36
+0.98,-0.01,0.07,0.18,4.93,6.94,0.36
+0.98,-0.01,0.07,0.18,4.93,6.95,0.36
+0.98,-0.01,0.07,0.18,4.92,6.95,0.37
+0.98,-0.01,0.07,0.18,4.92,6.95,0.37
+0.98,-0.01,0.07,0.18,4.92,6.95,0.37
+0.98,-0.01,0.07,0.19,4.92,6.96,0.37
+0.98,-0.01,0.07,0.19,4.92,6.96,0.37
+0.98,-0.01,0.07,0.19,4.92,6.96,0.37
+0.98,-0.01,0.07,0.19,4.92,6.96,0.38
+0.98,-0.01,0.07,0.19,4.92,6.97,0.38
+0.98,-0.01,0.07,0.19,4.92,6.97,0.38
+0.98,-0.01,0.07,0.19,4.92,6.97,0.38
+0.98,-0.01,0.07,0.19,4.91,6.97,0.38
+0.98,-0.01,0.07,0.19,4.91,6.98,0.39
+0.98,-0.01,0.07,0.19,4.91,6.98,0.39
+0.98,-0.01,0.07,0.19,4.91,6.98,0.39
+0.98,-0.01,0.07,0.20,4.91,6.99,0.39
+0.98,-0.01,0.07,0.20,4.91,6.99,0.39
+0.98,-0.01,0.07,0.20,4.91,6.99,0.39
+0.98,-0.02,0.07,0.20,4.91,6.99,0.40
+0.98,-0.02,0.07,0.20,4.91,7.00,0.40
+0.98,-0.02,0.08,0.20,4.90,7.00,0.40
+0.98,-0.02,0.08,0.20,4.90,7.00,0.40
+0.98,-0.02,0.08,0.20,4.90,7.00,0.40
+0.98,-0.02,0.08,0.20,4.90,7.01,0.40
+0.98,-0.02,0.08,0.20,4.90,7.01,0.41
+0.98,-0.02,0.08,0.20,4.90,7.01,0.41
+0.98,-0.02,0.08,0.20,4.90,7.01,0.41
+0.98,-0.02,0.08,0.21,4.90,7.02,0.41
+0.98,-0.02,0.08,0.21,4.90,7.02,0.41
+0.97,-0.02,0.08,0.21,4.89,7.02,0.42
+0.97,-0.02,0.08,0.21,4.89,7.02,0.42
+0.97,-0.02,0.08,0.21,4.89,7.03,0.42
+0.97,-0.02,0.08,0.21,4.89,7.03,0.42
+0.97,-0.02,0.08,0.21,4.89,7.03,0.42
+0.97,-0.02,0.08,0.21,4.89,7.03,0.42
+0.97,-0.02,0.08,0.21,4.89,7.04,0.43
+0.97,-0.02,0.08,0.21,4.89,7.04,0.43
+0.97,-0.02,0.08,0.21,4.88,7.04,0.43
+0.97,-0.02,0.08,0.22,4.88,7.05,0.43
+0.97,-0.02,0.08,0.22,4.88,7.05,0.43
+0.97,-0.02,0.08,0.22,4.88,7.05,0.43
+0.97,-0.02,0.08,0.22,4.88,7.05,0.44
+0.97,-0.02,0.08,0.22,4.88,7.06,0.44
+0.97,-0.02,0.08,0.22,4.88,7.06,0.44
+0.97,-0.02,0.08,0.22,4.88,7.06,0.44
+0.97,-0.02,0.08,0.22,4.88,7.06,0.44
+0.97,-0.02,0.08,0.22,4.87,7.07,0.45
+0.97,-0.02,0.08,0.22,4.87,7.07,0.45
+0.97,-0.02,0.08,0.22,4.87,7.07,0.45
+0.97,-0.02,0.08,0.23,4.87,7.07,0.45
+0.97,-0.02,0.08,0.23,4.87,7.08,0.45
+0.97,-0.02,0.09,0.23,4.87,7.08,0.45
+0.97,-0.02,0.09,0.23,4.87,7.08,0.46
+0.97,-0.02,0.09,0.23,4.87,7.08,0.46
+0.97,-0.02,0.09,0.23,4.86,7.09,0.46
+0.97,-0.02,0.09,0.23,4.86,7.09,0.46
+0.97,-0.02,0.09,0.23,4.86,7.09,0.46
+0.97,-0.02,0.09,0.23,4.86,7.09,0.46
+0.97,-0.02,0.09,0.23,4.86,7.10,0.47
+0.97,-0.02,0.09,0.23,4.86,7.10,0.47
+0.97,-0.02,0.09,0.24,4.86,7.10,0.47
+0.97,-0.02,0.09,0.24,4.85,7.10,0.47
+0.97,-0.02,0.09,0.24,4.85,7.11,0.47
+0.97,-0.02,0.09,0.24,4.85,7.11,0.48
+0.97,-0.02,0.09,0.24,4.85,7.11,0.48
+0.97,-0.02,0.09,0.24,4.85,7.11,0.48
+0.97,-0.02,0.09,0.24,4.85,7.12,0.48
+0.97,-0.02,0.09,0.24,4.85,7.12,0.48
+0.97,-0.02,0.09,0.24,4.85,7.12,0.48
+0.97,-0.02,0.09,0.24,4.84,7.12,0.49
+0.97,-0.02,0.09,0.24,4.84,7.13,0.49
+0.96,-0.02,0.09,0.24,4.84,7.13,0.49
+0.96,-0.02,0.09,0.25,4.84,7.13,0.49
+0.96,-0.02,0.09,0.25,4.84,7.13,0.49
+0.96,-0.02,0.09,0.25,4.84,7.14,0.49
+0.96,-0.02,0.09,0.25,4.84,7.14,0.50
+0.96,-0.02,0.09,0.25,4.83,7.14,0.50
+0.96,-0.02,0.09,0.25,4.83,7.14,0.50
+0.96,-0.02,0.09,0.25,4.83,7.15,0.50
+0.96,-0.02,0.09,0.25,4.83,7.15,0.50
+0.96,-0.02,0.09,0.25,4.83,7.15,0.51
+0.96,-0.02,0.09,0.25,4.83,7.15,0.51
+0.96,-0.03,0.10,0.25,4.83,7.16,0.51
+0.96,-0.03,0.10,0.26,4.82,7.16,0.51
+0.96,-0.03,0.10,0.26,4.82,7.16,0.51
+0.96,-0.03,0.10,0.26,4.82,7.16,0.51
+0.96,-0.03,0.10,0.26,4.82,7.17,0.52
+0.96,-0.03,0.10,0.26,4.82,7.17,0.52
+0.96,-0.03,0.10,0.26,4.82,7.17,0.52
+0.96,-0.03,0.10,0.26,4.82,7.17,0.52
+0.96,-0.03,0.10,0.26,4.81,7.18,0.52
+0.96,-0.03,0.10,0.26,4.81,7.18,0.52
+0.96,-0.03,0.10,0.26,4.81,7.18,0.53
+0.96,-0.03,0.10,0.26,4.81,7.18,0.53
+0.96,-0.03,0.10,0.26,4.81,7.19,0.53
+0.96,-0.03,0.10,0.27,4.81,7.19,0.53
+0.96,-0.03,0.10,0.27,4.81,7.19,0.53
+0.96,-0.03,0.10,0.27,4.80,7.19,0.53
+0.96,-0.03,0.10,0.27,4.80,7.20,0.54
+0.96,-0.03,0.10,0.27,4.80,7.20,0.54
+0.96,-0.03,0.10,0.27,4.80,7.20,0.54
+0.96,-0.03,0.10,0.27,4.80,7.20,0.54
+0.96,-0.03,0.10,0.27,4.80,7.21,0.54
+0.96,-0.03,0.10,0.27,4.80,7.21,0.55
+0.96,-0.03,0.10,0.27,4.79,7.21,0.55
+0.96,-0.03,0.10,0.27,4.79,7.21,0.55
+0.96,-0.03,0.10,0.28,4.79,7.22,0.55
+0.96,-0.03,0.10,0.28,4.79,7.22,0.55
+0.95,-0.03,0.10,0.28,4.79,7.22,0.55
+0.95,-0.03,0.10,0.28,4.79,7.22,0.56
+0.95,-0.03,0.10,0.28,4.79,7.23,0.56
+0.95,-0.03,0.10,0.28,4.78,7.23,0.56
+0.95,-0.03,0.10,0.28,4.78,7.23,0.56
+0.95,-0.03,0.10,0.28,4.78,7.23,0.56
+0.95,-0.03,0.10,0.28,4.78,7.24,0.56
+0.95,-0.03,0.11,0.28,4.78,7.24,0.57
+0.95,-0.03,0.11,0.28,4.78,7.24,0.57
+0.95,-0.03,0.11,0.28,4.77,7.24,0.57
+0.95,-0.03,0.11,0.29,4.77,7.25,0.57
+0.95,-0.03,0.11,0.29,4.77,7.25,0.57
+0.95,-0.03,0.11,0.29,4.77,7.25,0.57
+0.95,-0.03,0.11,0.29,4.77,7.25,0.58
+0.95,-0.03,0.11,0.29,4.77,7.26,0.58
+0.95,-0.03,0.11,0.29,4.76,7.26,0.58
+0.95,-0.03,0.11,0.29,4.76,7.26,0.58
+0.95,-0.03,0.11,0.29,4.76,7.26,0.58
+0.95,-0.03,0.11,0.29,4.76,7.27,0.58
+0.95,-0.03,0.11,0.29,4.76,7.27,0.59
+0.95,-0.03,0.11,0.29,4.76,7.27,0.59
+0.95,-0.03,0.11,0.29,4.76,7.27,0.59
+0.95,-0.03,0.11,0.30,4.75,7.27,0.59
+0.95,-0.03,0.11,0.30,4.75,7.28,0.59
+0.95,-0.03,0.11,0.30,4.75,7.28,0.60
+0.95,-0.03,0.11,0.30,4.75,7.28,0.60
+0.95,-0.04,0.11,0.30,4.75,7.28,0.60
+0.95,-0.04,0.11,0.30,4.75,7.29,0.60
+0.95,-0.04,0.11,0.30,4.74,7.29,0.60
+0.95,-0.04,0.11,0.30,4.74,7.29,0.60
+0.95,-0.04,0.11,0.30,4.74,7.29,0.61
+0.95,-0.04,0.11,0.30,4.74,7.30,0.61
+0.95,-0.04,0.11,0.30,4.74,7.30,0.61
+0.94,-0.04,0.11,0.31,4.74,7.30,0.61
+0.94,-0.04,0.11,0.31,4.73,7.30,0.61
+0.94,-0.04,0.11,0.31,4.73,7.31,0.61
+0.94,-0.04,0.11,0.31,4.73,7.31,0.62
+0.94,-0.04,0.11,0.31,4.73,7.31,0.62
+0.94,-0.04,0.11,0.31,4.73,7.31,0.62
+0.94,-0.04,0.11,0.31,4.73,7.32,0.62
+0.94,-0.04,0.12,0.31,4.72,7.32,0.62
+0.94,-0.04,0.12,0.31,4.72,7.32,0.62
+0.94,-0.04,0.12,0.31,4.72,7.32,0.63
+0.94,-0.04,0.12,0.31,4.72,7.32,0.63
+0.94,-0.04,0.12,0.31,4.72,7.33,0.63
+0.94,-0.04,0.12,0.32,4.71,7.33,0.63
+0.94,-0.04,0.12,0.32,4.71,7.33,0.63
+0.94,-0.04,0.12,0.32,4.71,7.33,0.63
+0.94,-0.04,0.12,0.32,4.71,7.34,0.64
+0.94,-0.04,0.12,0.32,4.71,7.34,0.64
+0.94,-0.04,0.12,0.32,4.71,7.34,0.64
+0.94,-0.04,0.12,0.32,4.70,7.34,0.64
+0.94,-0.04,0.12,0.32,4.70,7.35,0.64
+0.94,-0.04,0.12,0.32,4.70,7.35,0.64
+0.94,-0.04,0.12,0.32,4.70,7.35,0.65
+0.94,-0.04,0.12,0.32,4.70,7.35,0.65
+0.94,-0.04,0.12,0.32,4.70,7.35,0.65
+0.94,-0.04,0.12,0.33,4.69,7.36,0.65
+0.94,-0.04,0.12,0.33,4.69,7.36,0.65
+0.94,-0.04,0.12,0.33,4.69,7.36,0.65
+0.94,-0.04,0.12,0.33,4.69,7.36,0.66
+0.94,-0.04,0.12,0.33,4.69,7.37,0.66
+0.94,-0.04,0.12,0.33,4.68,7.37,0.66
+0.93,-0.04,0.12,0.33,4.68,7.37,0.66
+0.93,-0.04,0.12,0.33,4.68,7.37,0.66
+0.93,-0.04,0.12,0.33,4.68,7.38,0.66
+0.93,-0.04,0.12,0.33,4.68,7.38,0.67
+0.93,-0.04,0.12,0.33,4.68,7.38,0.67
+0.93,-0.04,0.12,0.33,4.67,7.38,0.67
+0.93,-0.04,0.12,0.34,4.67,7.38,0.67
+0.93,-0.04,0.12,0.34,4.67,7.39,0.67
+0.93,-0.04,0.12,0.34,4.67,7.39,0.67
+0.93,-0.05,0.12,0.34,4.67,7.39,0.68
+0.93,-0.05,0.12,0.34,4.66,7.39,0.68
+0.93,-0.05,0.12,0.34,4.66,7.40,0.68
+0.93,-0.05,0.13,0.34,4.66,7.40,0.68
+0.93,-0.05,0.13,0.34,4.66,7.40,0.68
+0.93,-0.05,0.13,0.34,4.66,7.40,0.68
+0.93,-0.05,0.13,0.34,4.65,7.41,0.69
+0.93,-0.05,0.13,0.34,4.65,7.41,0.69
+0.93,-0.05,0.13,0.34,4.65,7.41,0.69
+0.93,-0.05,0.13,0.35,4.65,7.41,0.69
+0.93,-0.05,0.13,0.35,4.65,7.41,0.69
+0.93,-0.05,0.13,0.35,4.65,7.42,0.69
+0.93,-0.05,0.13,0.35,4.64,7.42,0.70
+0.93,-0.05,0.13,0.35,4.64,7.42,0.70
+0.93,-0.05,0.13,0.35,4.64,7.42,0.70
+0.93,-0.05,0.13,0.35,4.64,7.43,0.70
+0.93,-0.05,0.13,0.35,4.64,7.43,0.70
+0.93,-0.05,0.13,0.35,4.63,7.43,0.70
+0.93,-0.05,0.13,0.35,4.63,7.43,0.71
+0.92,-0.05,0.13,0.35,4.63,7.43,0.71
+0.92,-0.05,0.13,0.35,4.63,7.44,0.71
+0.92,-0.05,0.13,0.36,4.63,7.44,0.71
+0.92,-0.05,0.13,0.36,4.62,7.44,0.71
+0.92,-0.05,0.13,0.36,4.62,7.44,0.71
+0.92,-0.05,0.13,0.36,4.62,7.45,0.72
+0.92,-0.05,0.13,0.36,4.62,7.45,0.72
+0.92,-0.05,0.13,0.36,4.62,7.45,0.72
+0.92,-0.05,0.13,0.36,4.61,7.45,0.72
+0.92,-0.05,0.13,0.36,4.61,7.45,0.72
+0.92,-0.05,0.13,0.36,4.61,7.46,0.72
+0.92,-0.05,0.13,0.36,4.61,7.46,0.73
+0.92,-0.05,0.13,0.36,4.61,7.46,0.73
+0.92,-0.05,0.13,0.36,4.60,7.46,0.73
+0.92,-0.05,0.13,0.37,4.60,7.47,0.73
+0.92,-0.05,0.13,0.37,4.60,7.47,0.73
+0.92,-0.05,0.13,0.37,4.60,7.47,0.73
+0.92,-0.05,0.13,0.37,4.60,7.47,0.74
+0.92,-0.05,0.13,0.37,4.59,7.47,0.74
+0.92,-0.05,0.13,0.37,4.59,7.48,0.74
+0.92,-0.05,0.14,0.37,4.59,7.48,0.74
+0.92,-0.05,0.14,0.37,4.59,7.48,0.74
+0.92,-0.06,0.14,0.37,4.59,7.48,0.74
+0.92,-0.06,0.14,0.37,4.58,7.48,0.75
+0.92,-0.06,0.14,0.37,4.58,7.49,0.75
+0.92,-0.06,0.14,0.37,4.58,7.49,0.75
+0.91,-0.06,0.14,0.38,4.58,7.49,0.75
+0.91,-0.06,0.14,0.38,4.58,7.49,0.75
+0.91,-0.06,0.14,0.38,4.57,7.50,0.75
+0.91,-0.06,0.14,0.38,4.57,7.50,0.76
+0.91,-0.06,0.14,0.38,4.57,7.50,0.76
+0.91,-0.06,0.14,0.38,4.57,7.50,0.76
+0.91,-0.06,0.14,0.38,4.57,7.50,0.76
+0.91,-0.06,0.14,0.38,4.56,7.51,0.76
+0.91,-0.06,0.14,0.38,4.56,7.51,0.76
+0.91,-0.06,0.14,0.38,4.56,7.51,0.77
+0.91,-0.06,0.14,0.38,4.56,7.51,0.77
+0.91,-0.06,0.14,0.38,4.56,7.51,0.77
+0.91,-0.06,0.14,0.39,4.55,7.52,0.77
+0.91,-0.06,0.14,0.39,4.55,7.52,0.77
+0.91,-0.06,0.14,0.39,4.55,7.52,0.77
+0.91,-0.06,0.14,0.39,4.55,7.52,0.78
+0.91,-0.06,0.14,0.39,4.54,7.52,0.78
+0.91,-0.06,0.14,0.39,4.54,7.53,0.78
+0.91,-0.06,0.14,0.39,4.54,7.53,0.78
+0.91,-0.06,0.14,0.39,4.54,7.53,0.78
+0.91,-0.06,0.14,0.39,4.54,7.53,0.78
+0.91,-0.06,0.14,0.39,4.53,7.54,0.79
+0.91,-0.06,0.14,0.39,4.53,7.54,0.79
+0.91,-0.06,0.14,0.39,4.53,7.54,0.79
+0.91,-0.06,0.14,0.40,4.53,7.54,0.79
+0.90,-0.06,0.14,0.40,4.53,7.54,0.79
+0.90,-0.06,0.14,0.40,4.52,7.55,0.79
+0.90,-0.06,0.14,0.40,4.52,7.55,0.79
+0.90,-0.06,0.14,0.40,4.52,7.55,0.80
+0.90,-0.06,0.14,0.40,4.52,7.55,0.80
+0.90,-0.06,0.14,0.40,4.51,7.55,0.80
+0.90,-0.06,0.14,0.40,4.51,7.56,0.80
+0.90,-0.06,0.15,0.40,4.51,7.56,0.80
+0.90,-0.06,0.15,0.40,4.51,7.56,0.80
+0.90,-0.07,0.15,0.40,4.51,7.56,0.81
+0.90,-0.07,0.15,0.40,4.50,7.56,0.81
+0.90,-0.07,0.15,0.40,4.50,7.57,0.81
+0.90,-0.07,0.15,0.41,4.50,7.57,0.81
+0.90,-0.07,0.15,0.41,4.50,7.57,0.81
+0.90,-0.07,0.15,0.41,4.50,7.57,0.81
+0.90,-0.07,0.15,0.41,4.49,7.57,0.82
+0.90,-0.07,0.15,0.41,4.49,7.58,0.82
+0.90,-0.07,0.15,0.41,4.49,7.58,0.82
+0.90,-0.07,0.15,0.41,4.49,7.58,0.82
+0.90,-0.07,0.15,0.41,4.48,7.58,0.82
+0.90,-0.07,0.15,0.41,4.48,7.58,0.82
+0.90,-0.07,0.15,0.41,4.48,7.59,0.83
+0.90,-0.07,0.15,0.41,4.48,7.59,0.83
+0.90,-0.07,0.15,0.41,4.47,7.59,0.83
+0.89,-0.07,0.15,0.42,4.47,7.59,0.83
+0.89,-0.07,0.15,0.42,4.47,7.59,0.83
+0.89,-0.07,0.15,0.42,4.47,7.60,0.83
+0.89,-0.07,0.15,0.42,4.47,7.60,0.83
+0.89,-0.07,0.15,0.42,4.46,7.60,0.84
+0.89,-0.07,0.15,0.42,4.46,7.60,0.84
+0.89,-0.07,0.15,0.42,4.46,7.60,0.84
+0.89,-0.07,0.15,0.42,4.46,7.61,0.84
+0.89,-0.07,0.15,0.42,4.45,7.61,0.84
+0.89,-0.07,0.15,0.42,4.45,7.61,0.84
+0.89,-0.07,0.15,0.42,4.45,7.61,0.85
+0.89,-0.07,0.15,0.42,4.45,7.61,0.85
+0.89,-0.07,0.15,0.42,4.45,7.62,0.85
+0.89,-0.07,0.15,0.43,4.44,7.62,0.85
+0.89,-0.07,0.15,0.43,4.44,7.62,0.85
+0.89,-0.07,0.15,0.43,4.44,7.62,0.85
+0.89,-0.07,0.15,0.43,4.44,7.62,0.86
+0.89,-0.07,0.15,0.43,4.43,7.63,0.86
+0.89,-0.07,0.15,0.43,4.43,7.63,0.86
+0.89,-0.07,0.15,0.43,4.43,7.63,0.86
+0.89,-0.08,0.15,0.43,4.43,7.63,0.86
+0.89,-0.08,0.15,0.43,4.42,7.63,0.86
+0.89,-0.08,0.15,0.43,4.42,7.64,0.86
+0.88,-0.08,0.16,0.43,4.42,7.64,0.87
+0.88,-0.08,0.16,0.43,4.42,7.64,0.87
+0.88,-0.08,0.16,0.43,4.42,7.64,0.87
+0.88,-0.08,0.16,0.44,4.41,7.64,0.87
+0.88,-0.08,0.16,0.44,4.41,7.64,0.87
+0.88,-0.08,0.16,0.44,4.41,7.65,0.87
+0.88,-0.08,0.16,0.44,4.41,7.65,0.88
+0.88,-0.08,0.16,0.44,4.40,7.65,0.88
+0.88,-0.08,0.16,0.44,4.40,7.65,0.88
+0.88,-0.08,0.16,0.44,4.40,7.65,0.88
+0.88,-0.08,0.16,0.44,4.40,7.66,0.88
+0.88,-0.08,0.16,0.44,4.39,7.66,0.88
+0.88,-0.08,0.16,0.44,4.39,7.66,0.89
+0.88,-0.08,0.16,0.44,4.39,7.66,0.89
+0.88,-0.08,0.16,0.44,4.39,7.66,0.89
+0.88,-0.08,0.16,0.44,4.38,7.67,0.89
+0.88,-0.08,0.16,0.45,4.38,7.67,0.89
+0.88,-0.08,0.16,0.45,4.38,7.67,0.89
+0.88,-0.08,0.16,0.45,4.38,7.67,0.89
+0.88,-0.08,0.16,0.45,4.37,7.67,0.90
+0.88,-0.08,0.16,0.45,4.37,7.67,0.90
+0.87,-0.08,0.16,0.45,4.37,7.68,0.90
+0.87,-0.08,0.16,0.45,4.37,7.68,0.90
+0.87,-0.08,0.16,0.45,4.36,7.68,0.90
+0.87,-0.08,0.16,0.45,4.36,7.68,0.90
+0.87,-0.08,0.16,0.45,4.36,7.68,0.91
+0.87,-0.08,0.16,0.45,4.36,7.69,0.91
+0.87,-0.08,0.16,0.45,4.36,7.69,0.91
+0.87,-0.08,0.16,0.45,4.35,7.69,0.91
+0.87,-0.08,0.16,0.46,4.35,7.69,0.91
+0.87,-0.08,0.16,0.46,4.35,7.69,0.91
+0.87,-0.09,0.16,0.46,4.35,7.69,0.91
+0.87,-0.09,0.16,0.46,4.34,7.70,0.92
+0.87,-0.09,0.16,0.46,4.34,7.70,0.92
+0.87,-0.09,0.16,0.46,4.34,7.70,0.92
+0.87,-0.09,0.16,0.46,4.34,7.70,0.92
+0.87,-0.09,0.16,0.46,4.33,7.70,0.92
+0.87,-0.09,0.16,0.46,4.33,7.71,0.92
+0.87,-0.09,0.16,0.46,4.33,7.71,0.93
+0.87,-0.09,0.16,0.46,4.33,7.71,0.93
+0.87,-0.09,0.16,0.46,4.32,7.71,0.93
+0.87,-0.09,0.16,0.46,4.32,7.71,0.93
+0.86,-0.09,0.16,0.47,4.32,7.71,0.93
+0.86,-0.09,0.16,0.47,4.32,7.72,0.93
+0.86,-0.09,0.17,0.47,4.31,7.72,0.93
+0.86,-0.09,0.17,0.47,4.31,7.72,0.94
+0.86,-0.09,0.17,0.47,4.31,7.72,0.94
+0.86,-0.09,0.17,0.47,4.31,7.72,0.94
+0.86,-0.09,0.17,0.47,4.30,7.73,0.94
+0.86,-0.09,0.17,0.47,4.30,7.73,0.94
+0.86,-0.09,0.17,0.47,4.30,7.73,0.94
+0.86,-0.09,0.17,0.47,4.30,7.73,0.95
+0.86,-0.09,0.17,0.47,4.29,7.73,0.95
+0.86,-0.09,0.17,0.47,4.29,7.73,0.95
+0.86,-0.09,0.17,0.47,4.29,7.74,0.95
+0.86,-0.09,0.17,0.48,4.28,7.74,0.95
+0.86,-0.09,0.17,0.48,4.28,7.74,0.95
+0.86,-0.09,0.17,0.48,4.28,7.74,0.95
+0.86,-0.09,0.17,0.48,4.28,7.74,0.96
+0.86,-0.09,0.17,0.48,4.27,7.74,0.96
+0.86,-0.09,0.17,0.48,4.27,7.75,0.96
+0.86,-0.09,0.17,0.48,4.27,7.75,0.96
+0.86,-0.10,0.17,0.48,4.27,7.75,0.96
+0.85,-0.10,0.17,0.48,4.26,7.75,0.96
+0.85,-0.10,0.17,0.48,4.26,7.75,0.96
+0.85,-0.10,0.17,0.48,4.26,7.75,0.97
+0.85,-0.10,0.17,0.48,4.26,7.76,0.97
+0.85,-0.10,0.17,0.48,4.25,7.76,0.97
+0.85,-0.10,0.17,0.49,4.25,7.76,0.97
+0.85,-0.10,0.17,0.49,4.25,7.76,0.97
+0.85,-0.10,0.17,0.49,4.25,7.76,0.97
+0.85,-0.10,0.17,0.49,4.24,7.76,0.98
+0.85,-0.10,0.17,0.49,4.24,7.77,0.98
+0.85,-0.10,0.17,0.49,4.24,7.77,0.98
+0.85,-0.10,0.17,0.49,4.24,7.77,0.98
+0.85,-0.10,0.17,0.49,4.23,7.77,0.98
+0.85,-0.10,0.17,0.49,4.23,7.77,0.98
+0.85,-0.10,0.17,0.49,4.23,7.77,0.98
+0.85,-0.10,0.17,0.49,4.23,7.78,0.99
+0.85,-0.10,0.17,0.49,4.22,7.78,0.99
+0.85,-0.10,0.17,0.49,4.22,7.78,0.99
+0.85,-0.10,0.17,0.49,4.22,7.78,0.99
+0.84,-0.10,0.17,0.50,4.21,7.78,0.99
+0.84,-0.10,0.17,0.50,4.21,7.78,0.99
+0.84,-0.10,0.17,0.50,4.21,7.79,0.99
+0.84,-0.10,0.17,0.50,4.21,7.79,1.00
+0.84,-0.10,0.17,0.50,4.20,7.79,1.00
+0.84,-0.10,0.17,0.50,4.20,7.79,1.00
+0.84,-0.10,0.17,0.50,4.20,7.79,1.00
+0.84,-0.10,0.17,0.50,4.20,7.79,1.00
+0.84,-0.10,0.17,0.50,4.19,7.80,1.00
+0.84,-0.10,0.17,0.50,4.19,7.80,1.00
+0.84,-0.10,0.18,0.50,4.19,7.80,1.01
+0.84,-0.11,0.18,0.50,4.19,7.80,1.01
+0.84,-0.11,0.18,0.50,4.18,7.80,1.01
+0.84,-0.11,0.18,0.51,4.18,7.80,1.01
+0.84,-0.11,0.18,0.51,4.18,7.80,1.01
+0.84,-0.11,0.18,0.51,4.17,7.81,1.01
+0.84,-0.11,0.18,0.51,4.17,7.81,1.01
+0.84,-0.11,0.18,0.51,4.17,7.81,1.02
+0.84,-0.11,0.18,0.51,4.17,7.81,1.02
+0.84,-0.11,0.18,0.51,4.16,7.81,1.02
+0.83,-0.11,0.18,0.51,4.16,7.81,1.02
+0.83,-0.11,0.18,0.51,4.16,7.82,1.02
+0.83,-0.11,0.18,0.51,4.16,7.82,1.02
+0.83,-0.11,0.18,0.51,4.15,7.82,1.03
+0.83,-0.11,0.18,0.51,4.15,7.82,1.03
+0.83,-0.11,0.18,0.51,4.15,7.82,1.03
+0.83,-0.11,0.18,0.51,4.14,7.82,1.03
+0.83,-0.11,0.18,0.52,4.14,7.82,1.03
+0.83,-0.11,0.18,0.52,4.14,7.83,1.03
+0.83,-0.11,0.18,0.52,4.14,7.83,1.03
+0.83,-0.11,0.18,0.52,4.13,7.83,1.04
+0.83,-0.11,0.18,0.52,4.13,7.83,1.04
+0.83,-0.11,0.18,0.52,4.13,7.83,1.04
+0.83,-0.11,0.18,0.52,4.13,7.83,1.04
+0.83,-0.11,0.18,0.52,4.12,7.83,1.04
+0.83,-0.11,0.18,0.52,4.12,7.84,1.04
+0.83,-0.11,0.18,0.52,4.12,7.84,1.04
+0.83,-0.11,0.18,0.52,4.11,7.84,1.05
+0.82,-0.11,0.18,0.52,4.11,7.84,1.05
+0.82,-0.11,0.18,0.52,4.11,7.84,1.05
+0.82,-0.12,0.18,0.52,4.11,7.84,1.05
+0.82,-0.12,0.18,0.53,4.10,7.85,1.05
+0.82,-0.12,0.18,0.53,4.10,7.85,1.05
+0.82,-0.12,0.18,0.53,4.10,7.85,1.05
+0.82,-0.12,0.18,0.53,4.09,7.85,1.06
+0.82,-0.12,0.18,0.53,4.09,7.85,1.06
+0.82,-0.12,0.18,0.53,4.09,7.85,1.06
+0.82,-0.12,0.18,0.53,4.09,7.85,1.06
+0.82,-0.12,0.18,0.53,4.08,7.86,1.06
+0.82,-0.12,0.18,0.53,4.08,7.86,1.06
+0.82,-0.12,0.18,0.53,4.08,7.86,1.06
+0.82,-0.12,0.18,0.53,4.07,7.86,1.07
+0.82,-0.12,0.18,0.53,4.07,7.86,1.07
+0.82,-0.12,0.18,0.53,4.07,7.86,1.07
+0.82,-0.12,0.18,0.53,4.07,7.86,1.07
+0.82,-0.12,0.18,0.54,4.06,7.87,1.07
+0.82,-0.12,0.18,0.54,4.06,7.87,1.07
+0.81,-0.12,0.18,0.54,4.06,7.87,1.07
+0.81,-0.12,0.18,0.54,4.05,7.87,1.08
+0.81,-0.12,0.18,0.54,4.05,7.87,1.08
+0.81,-0.12,0.18,0.54,4.05,7.87,1.08
+0.81,-0.12,0.18,0.54,4.05,7.87,1.08
+0.81,-0.12,0.18,0.54,4.04,7.87,1.08
+0.81,-0.12,0.18,0.54,4.04,7.88,1.08
+0.81,-0.12,0.19,0.54,4.04,7.88,1.08
+0.81,-0.12,0.19,0.54,4.03,7.88,1.08
+0.81,-0.12,0.19,0.54,4.03,7.88,1.09
+0.81,-0.12,0.19,0.54,4.03,7.88,1.09
+0.81,-0.13,0.19,0.54,4.03,7.88,1.09
+0.81,-0.13,0.19,0.55,4.02,7.88,1.09
+0.81,-0.13,0.19,0.55,4.02,7.89,1.09
+0.81,-0.13,0.19,0.55,4.02,7.89,1.09
+0.81,-0.13,0.19,0.55,4.01,7.89,1.09
+0.81,-0.13,0.19,0.55,4.01,7.89,1.10
+0.80,-0.13,0.19,0.55,4.01,7.89,1.10
+0.80,-0.13,0.19,0.55,4.01,7.89,1.10
+0.80,-0.13,0.19,0.55,4.00,7.89,1.10
+0.80,-0.13,0.19,0.55,4.00,7.89,1.10
+0.80,-0.13,0.19,0.55,4.00,7.90,1.10
+0.80,-0.13,0.19,0.55,3.99,7.90,1.10
+0.80,-0.13,0.19,0.55,3.99,7.90,1.11
+0.80,-0.13,0.19,0.55,3.99,7.90,1.11
+0.80,-0.13,0.19,0.55,3.99,7.90,1.11
+0.80,-0.13,0.19,0.55,3.98,7.90,1.11
+0.80,-0.13,0.19,0.56,3.98,7.90,1.11
+0.80,-0.13,0.19,0.56,3.98,7.91,1.11
+0.80,-0.13,0.19,0.56,3.97,7.91,1.11
+0.80,-0.13,0.19,0.56,3.97,7.91,1.12
+0.80,-0.13,0.19,0.56,3.97,7.91,1.12
+0.80,-0.13,0.19,0.56,3.97,7.91,1.12
+0.80,-0.13,0.19,0.56,3.96,7.91,1.12
+0.80,-0.13,0.19,0.56,3.96,7.91,1.12
+0.79,-0.13,0.19,0.56,3.96,7.91,1.12
+0.79,-0.13,0.19,0.56,3.95,7.92,1.12
+0.79,-0.13,0.19,0.56,3.95,7.92,1.12
+0.79,-0.13,0.19,0.56,3.95,7.92,1.13
+0.79,-0.14,0.19,0.56,3.94,7.92,1.13
+0.79,-0.14,0.19,0.56,3.94,7.92,1.13
+0.79,-0.14,0.19,0.57,3.94,7.92,1.13
+0.79,-0.14,0.19,0.57,3.94,7.92,1.13
+0.79,-0.14,0.19,0.57,3.93,7.92,1.13
+0.79,-0.14,0.19,0.57,3.93,7.92,1.13
+0.79,-0.14,0.19,0.57,3.93,7.93,1.14
+0.79,-0.14,0.19,0.57,3.92,7.93,1.14
+0.79,-0.14,0.19,0.57,3.92,7.93,1.14
+0.79,-0.14,0.19,0.57,3.92,7.93,1.14
+0.79,-0.14,0.19,0.57,3.91,7.93,1.14
+0.79,-0.14,0.19,0.57,3.91,7.93,1.14
+0.79,-0.14,0.19,0.57,3.91,7.93,1.14
+0.78,-0.14,0.19,0.57,3.91,7.93,1.15
+0.78,-0.14,0.19,0.57,3.90,7.94,1.15
+0.78,-0.14,0.19,0.57,3.90,7.94,1.15
+0.78,-0.14,0.19,0.57,3.90,7.94,1.15
+0.78,-0.14,0.19,0.58,3.89,7.94,1.15
+0.78,-0.14,0.19,0.58,3.89,7.94,1.15
+0.78,-0.14,0.19,0.58,3.89,7.94,1.15
+0.78,-0.14,0.19,0.58,3.88,7.94,1.15
+0.78,-0.14,0.19,0.58,3.88,7.94,1.16
+0.78,-0.14,0.19,0.58,3.88,7.94,1.16
+0.78,-0.14,0.19,0.58,3.88,7.95,1.16
+0.78,-0.14,0.19,0.58,3.87,7.95,1.16
+0.78,-0.14,0.19,0.58,3.87,7.95,1.16
+0.78,-0.15,0.19,0.58,3.87,7.95,1.16
+0.78,-0.15,0.19,0.58,3.86,7.95,1.16
+0.78,-0.15,0.19,0.58,3.86,7.95,1.17
+0.78,-0.15,0.19,0.58,3.86,7.95,1.17
+0.77,-0.15,0.19,0.58,3.85,7.95,1.17
+0.77,-0.15,0.19,0.58,3.85,7.95,1.17
+0.77,-0.15,0.19,0.59,3.85,7.96,1.17
+0.77,-0.15,0.19,0.59,3.84,7.96,1.17
+0.77,-0.15,0.20,0.59,3.84,7.96,1.17
+0.77,-0.15,0.20,0.59,3.84,7.96,1.17
+0.77,-0.15,0.20,0.59,3.84,7.96,1.18
+0.77,-0.15,0.20,0.59,3.83,7.96,1.18
+0.77,-0.15,0.20,0.59,3.83,7.96,1.18
+0.77,-0.15,0.20,0.59,3.83,7.96,1.18
+0.77,-0.15,0.20,0.59,3.82,7.96,1.18
+0.77,-0.15,0.20,0.59,3.82,7.97,1.18
+0.77,-0.15,0.20,0.59,3.82,7.97,1.18
+0.77,-0.15,0.20,0.59,3.81,7.97,1.18
+0.77,-0.15,0.20,0.59,3.81,7.97,1.19
+0.77,-0.15,0.20,0.59,3.81,7.97,1.19
+0.76,-0.15,0.20,0.59,3.80,7.97,1.19
+0.76,-0.15,0.20,0.59,3.80,7.97,1.19
+0.76,-0.15,0.20,0.60,3.80,7.97,1.19
+0.76,-0.15,0.20,0.60,3.80,7.97,1.19
+0.76,-0.15,0.20,0.60,3.79,7.97,1.19
+0.76,-0.15,0.20,0.60,3.79,7.98,1.20
+0.76,-0.16,0.20,0.60,3.79,7.98,1.20
+0.76,-0.16,0.20,0.60,3.78,7.98,1.20
+0.76,-0.16,0.20,0.60,3.78,7.98,1.20
+0.76,-0.16,0.20,0.60,3.78,7.98,1.20
+0.76,-0.16,0.20,0.60,3.77,7.98,1.20
+0.76,-0.16,0.20,0.60,3.77,7.98,1.20
+0.76,-0.16,0.20,0.60,3.77,7.98,1.20
+0.76,-0.16,0.20,0.60,3.76,7.98,1.21
+0.76,-0.16,0.20,0.60,3.76,7.98,1.21
+0.76,-0.16,0.20,0.60,3.76,7.98,1.21
+0.75,-0.16,0.20,0.60,3.75,7.99,1.21
+0.75,-0.16,0.20,0.61,3.75,7.99,1.21
+0.75,-0.16,0.20,0.61,3.75,7.99,1.21
+0.75,-0.16,0.20,0.61,3.75,7.99,1.21
+0.75,-0.16,0.20,0.61,3.74,7.99,1.21
+0.75,-0.16,0.20,0.61,3.74,7.99,1.22
+0.75,-0.16,0.20,0.61,3.74,7.99,1.22
+0.75,-0.16,0.20,0.61,3.73,7.99,1.22
+0.75,-0.16,0.20,0.61,3.73,7.99,1.22
+0.75,-0.16,0.20,0.61,3.73,7.99,1.22
+0.75,-0.16,0.20,0.61,3.72,7.99,1.22
+0.75,-0.16,0.20,0.61,3.72,8.00,1.22
+0.75,-0.16,0.20,0.61,3.72,8.00,1.22
+0.75,-0.16,0.20,0.61,3.71,8.00,1.23
+0.75,-0.16,0.20,0.61,3.71,8.00,1.23
+0.75,-0.16,0.20,0.61,3.71,8.00,1.23
+0.74,-0.17,0.20,0.61,3.70,8.00,1.23
+0.74,-0.17,0.20,0.62,3.70,8.00,1.23
+0.74,-0.17,0.20,0.62,3.70,8.00,1.23
+0.74,-0.17,0.20,0.62,3.69,8.00,1.23
+0.74,-0.17,0.20,0.62,3.69,8.00,1.23
+0.74,-0.17,0.20,0.62,3.69,8.00,1.24
+0.74,-0.17,0.20,0.62,3.68,8.01,1.24
+0.74,-0.17,0.20,0.62,3.68,8.01,1.24
+0.74,-0.17,0.20,0.62,3.68,8.01,1.24
+0.74,-0.17,0.20,0.62,3.68,8.01,1.24
+0.74,-0.17,0.20,0.62,3.67,8.01,1.24
+0.74,-0.17,0.20,0.62,3.67,8.01,1.24
+0.74,-0.17,0.20,0.62,3.67,8.01,1.24
+0.74,-0.17,0.20,0.62,3.66,8.01,1.25
+0.74,-0.17,0.20,0.62,3.66,8.01,1.25
+0.74,-0.17,0.20,0.62,3.66,8.01,1.25
+0.73,-0.17,0.20,0.62,3.65,8.01,1.25
+0.73,-0.17,0.20,0.63,3.65,8.01,1.25
+0.73,-0.17,0.20,0.63,3.65,8.02,1.25
+0.73,-0.17,0.20,0.63,3.64,8.02,1.25
+0.73,-0.17,0.20,0.63,3.64,8.02,1.25
+0.73,-0.17,0.20,0.63,3.64,8.02,1.26
+0.73,-0.17,0.20,0.63,3.63,8.02,1.26
+0.73,-0.17,0.20,0.63,3.63,8.02,1.26
+0.73,-0.18,0.20,0.63,3.63,8.02,1.26
+0.73,-0.18,0.20,0.63,3.62,8.02,1.26
+0.73,-0.18,0.20,0.63,3.62,8.02,1.26
+0.73,-0.18,0.20,0.63,3.62,8.02,1.26
+0.73,-0.18,0.20,0.63,3.61,8.02,1.26
+0.73,-0.18,0.20,0.63,3.61,8.02,1.26
+0.73,-0.18,0.20,0.63,3.61,8.02,1.27
+0.72,-0.18,0.20,0.63,3.60,8.02,1.27
+0.72,-0.18,0.20,0.63,3.60,8.03,1.27
+0.72,-0.18,0.20,0.63,3.60,8.03,1.27
+0.72,-0.18,0.20,0.64,3.59,8.03,1.27
+0.72,-0.18,0.20,0.64,3.59,8.03,1.27
+0.72,-0.18,0.20,0.64,3.59,8.03,1.27
+0.72,-0.18,0.20,0.64,3.58,8.03,1.27
+0.72,-0.18,0.20,0.64,3.58,8.03,1.28
+0.72,-0.18,0.20,0.64,3.58,8.03,1.28
+0.72,-0.18,0.20,0.64,3.57,8.03,1.28
+0.72,-0.18,0.20,0.64,3.57,8.03,1.28
+0.72,-0.18,0.20,0.64,3.57,8.03,1.28
+0.72,-0.18,0.20,0.64,3.56,8.03,1.28
+0.72,-0.18,0.20,0.64,3.56,8.03,1.28
+0.72,-0.18,0.20,0.64,3.56,8.03,1.28
+0.72,-0.18,0.20,0.64,3.55,8.04,1.29
+0.71,-0.18,0.20,0.64,3.55,8.04,1.29
+0.71,-0.18,0.20,0.64,3.55,8.04,1.29
+0.71,-0.19,0.20,0.64,3.55,8.04,1.29
+0.71,-0.19,0.21,0.64,3.54,8.04,1.29
+0.71,-0.19,0.21,0.65,3.54,8.04,1.29
+0.71,-0.19,0.21,0.65,3.54,8.04,1.29
+0.71,-0.19,0.21,0.65,3.53,8.04,1.29
+0.71,-0.19,0.21,0.65,3.53,8.04,1.29
+0.71,-0.19,0.21,0.65,3.53,8.04,1.30
+0.71,-0.19,0.21,0.65,3.52,8.04,1.30
+0.71,-0.19,0.21,0.65,3.52,8.04,1.30
+0.71,-0.19,0.21,0.65,3.52,8.04,1.30
+0.71,-0.19,0.21,0.65,3.51,8.04,1.30
+0.71,-0.19,0.21,0.65,3.51,8.04,1.30
+0.71,-0.19,0.21,0.65,3.51,8.04,1.30
+0.70,-0.19,0.21,0.65,3.50,8.04,1.30
+0.70,-0.19,0.21,0.65,3.50,8.05,1.31
+0.70,-0.19,0.21,0.65,3.50,8.05,1.31
+0.70,-0.19,0.21,0.65,3.49,8.05,1.31
+0.70,-0.19,0.21,0.65,3.49,8.05,1.31
+0.70,-0.19,0.21,0.65,3.49,8.05,1.31
+0.70,-0.19,0.21,0.66,3.48,8.05,1.31
+0.70,-0.19,0.21,0.66,3.48,8.05,1.31
+0.70,-0.19,0.21,0.66,3.48,8.05,1.31
+0.70,-0.19,0.21,0.66,3.47,8.05,1.31
+0.70,-0.19,0.21,0.66,3.47,8.05,1.32
+0.70,-0.20,0.21,0.66,3.47,8.05,1.32
+0.70,-0.20,0.21,0.66,3.46,8.05,1.32
+0.70,-0.20,0.21,0.66,3.46,8.05,1.32
+0.69,-0.20,0.21,0.66,3.46,8.05,1.32
+0.69,-0.20,0.21,0.66,3.45,8.05,1.32
+0.69,-0.20,0.21,0.66,3.45,8.05,1.32
+0.69,-0.20,0.21,0.66,3.45,8.05,1.32
+0.69,-0.20,0.21,0.66,3.44,8.05,1.32
+0.69,-0.20,0.21,0.66,3.44,8.05,1.33
+0.69,-0.20,0.21,0.66,3.43,8.06,1.33
+0.69,-0.20,0.21,0.66,3.43,8.06,1.33
+0.69,-0.20,0.21,0.66,3.43,8.06,1.33
+0.69,-0.20,0.21,0.67,3.42,8.06,1.33
+0.69,-0.20,0.21,0.67,3.42,8.06,1.33
+0.69,-0.20,0.21,0.67,3.42,8.06,1.33
+0.69,-0.20,0.21,0.67,3.41,8.06,1.33
+0.69,-0.20,0.21,0.67,3.41,8.06,1.33
+0.69,-0.20,0.21,0.67,3.41,8.06,1.34
+0.68,-0.20,0.21,0.67,3.40,8.06,1.34
+0.68,-0.20,0.21,0.67,3.40,8.06,1.34
+0.68,-0.20,0.21,0.67,3.40,8.06,1.34
+0.68,-0.20,0.21,0.67,3.39,8.06,1.34
+0.68,-0.20,0.21,0.67,3.39,8.06,1.34
+0.68,-0.20,0.21,0.67,3.39,8.06,1.34
+0.68,-0.21,0.21,0.67,3.38,8.06,1.34
+0.68,-0.21,0.21,0.67,3.38,8.06,1.34
+0.68,-0.21,0.21,0.67,3.38,8.06,1.35
+0.68,-0.21,0.21,0.67,3.37,8.06,1.35
+0.68,-0.21,0.21,0.67,3.37,8.06,1.35
+0.68,-0.21,0.21,0.67,3.37,8.06,1.35
+0.68,-0.21,0.21,0.68,3.36,8.06,1.35
+0.68,-0.21,0.21,0.68,3.36,8.06,1.35
+0.68,-0.21,0.21,0.68,3.36,8.06,1.35
+0.67,-0.21,0.21,0.68,3.35,8.07,1.35
+0.67,-0.21,0.21,0.68,3.35,8.07,1.35
+0.67,-0.21,0.21,0.68,3.35,8.07,1.36
+0.67,-0.21,0.21,0.68,3.34,8.07,1.36
+0.67,-0.21,0.21,0.68,3.34,8.07,1.36
+0.67,-0.21,0.21,0.68,3.34,8.07,1.36
+0.67,-0.21,0.21,0.68,3.33,8.07,1.36
+0.67,-0.21,0.21,0.68,3.33,8.07,1.36
+0.67,-0.21,0.21,0.68,3.33,8.07,1.36
+0.67,-0.21,0.21,0.68,3.32,8.07,1.36
+0.67,-0.21,0.21,0.68,3.32,8.07,1.36
+0.67,-0.21,0.21,0.68,3.32,8.07,1.37
+0.67,-0.21,0.21,0.68,3.31,8.07,1.37
+0.67,-0.21,0.21,0.68,3.31,8.07,1.37
+0.66,-0.22,0.21,0.68,3.31,8.07,1.37
+0.66,-0.22,0.21,0.68,3.30,8.07,1.37
+0.66,-0.22,0.21,0.69,3.30,8.07,1.37
+0.66,-0.22,0.21,0.69,3.30,8.07,1.37
+0.66,-0.22,0.21,0.69,3.29,8.07,1.37
+0.66,-0.22,0.21,0.69,3.29,8.07,1.37
+0.66,-0.22,0.21,0.69,3.28,8.07,1.37
+0.66,-0.22,0.21,0.69,3.28,8.07,1.38
+0.66,-0.22,0.21,0.69,3.28,8.07,1.38
+0.66,-0.22,0.21,0.69,3.27,8.07,1.38
+0.66,-0.22,0.21,0.69,3.27,8.07,1.38
+0.66,-0.22,0.21,0.69,3.27,8.07,1.38
+0.66,-0.22,0.21,0.69,3.26,8.07,1.38
+0.66,-0.22,0.21,0.69,3.26,8.07,1.38
+0.65,-0.22,0.21,0.69,3.26,8.07,1.38
+0.65,-0.22,0.21,0.69,3.25,8.07,1.38
+0.65,-0.22,0.21,0.69,3.25,8.07,1.39
+0.65,-0.22,0.21,0.69,3.25,8.07,1.39
+0.65,-0.22,0.21,0.69,3.24,8.07,1.39
+0.65,-0.22,0.21,0.69,3.24,8.07,1.39
+0.65,-0.22,0.21,0.69,3.24,8.07,1.39
+0.65,-0.22,0.21,0.70,3.23,8.07,1.39
+0.65,-0.22,0.21,0.70,3.23,8.07,1.39
+0.65,-0.23,0.21,0.70,3.23,8.07,1.39
+0.65,-0.23,0.21,0.70,3.22,8.07,1.39
+0.65,-0.23,0.21,0.70,3.22,8.07,1.39
+0.65,-0.23,0.21,0.70,3.22,8.08,1.40
+0.65,-0.23,0.21,0.70,3.21,8.08,1.40
+0.64,-0.23,0.21,0.70,3.21,8.08,1.40
+0.64,-0.23,0.21,0.70,3.20,8.08,1.40
+0.64,-0.23,0.21,0.70,3.20,8.08,1.40
+0.64,-0.23,0.21,0.70,3.20,8.08,1.40
+0.64,-0.23,0.21,0.70,3.19,8.08,1.40
+0.64,-0.23,0.21,0.70,3.19,8.08,1.40
+0.64,-0.23,0.21,0.70,3.19,8.08,1.40
+0.64,-0.23,0.21,0.70,3.18,8.08,1.40
+0.64,-0.23,0.21,0.70,3.18,8.08,1.41
+0.64,-0.23,0.21,0.70,3.18,8.08,1.41
+0.64,-0.23,0.21,0.70,3.17,8.08,1.41
+0.64,-0.23,0.21,0.70,3.17,8.08,1.41
+0.64,-0.23,0.21,0.70,3.17,8.08,1.41
+0.64,-0.23,0.21,0.71,3.16,8.08,1.41
+0.63,-0.23,0.21,0.71,3.16,8.08,1.41
+0.63,-0.23,0.21,0.71,3.16,8.08,1.41
+0.63,-0.23,0.21,0.71,3.15,8.08,1.41
+0.63,-0.23,0.21,0.71,3.15,8.08,1.41
+0.63,-0.24,0.21,0.71,3.15,8.08,1.42
+0.63,-0.24,0.21,0.71,3.14,8.08,1.42
+0.63,-0.24,0.21,0.71,3.14,8.08,1.42
+0.63,-0.24,0.21,0.71,3.13,8.08,1.42
+0.63,-0.24,0.21,0.71,3.13,8.08,1.42
+0.63,-0.24,0.21,0.71,3.13,8.08,1.42
+0.63,-0.24,0.21,0.71,3.12,8.08,1.42
+0.63,-0.24,0.21,0.71,3.12,8.08,1.42
+0.63,-0.24,0.21,0.71,3.12,8.08,1.42
+0.63,-0.24,0.21,0.71,3.11,8.08,1.42
+0.62,-0.24,0.21,0.71,3.11,8.08,1.43
+0.62,-0.24,0.21,0.71,3.11,8.08,1.43
+0.62,-0.24,0.21,0.71,3.10,8.08,1.43
+0.62,-0.24,0.21,0.71,3.10,8.08,1.43
+0.62,-0.24,0.21,0.71,3.10,8.08,1.43
+0.62,-0.24,0.21,0.72,3.09,8.08,1.43
+0.62,-0.24,0.21,0.72,3.09,8.08,1.43
+0.62,-0.24,0.21,0.72,3.09,8.08,1.43
+0.62,-0.24,0.21,0.72,3.08,8.08,1.43
+0.62,-0.24,0.21,0.72,3.08,8.08,1.43
+0.62,-0.24,0.21,0.72,3.07,8.08,1.44
+0.62,-0.24,0.21,0.72,3.07,8.08,1.44
+0.62,-0.24,0.21,0.72,3.07,8.08,1.44
+0.62,-0.25,0.21,0.72,3.06,8.08,1.44
+0.61,-0.25,0.21,0.72,3.06,8.08,1.44
+0.61,-0.25,0.21,0.72,3.06,8.08,1.44
+0.61,-0.25,0.21,0.72,3.05,8.08,1.44
+0.61,-0.25,0.21,0.72,3.05,8.08,1.44
+0.61,-0.25,0.21,0.72,3.05,8.08,1.44
+0.61,-0.25,0.21,0.72,3.04,8.08,1.44
+0.61,-0.25,0.21,0.72,3.04,8.08,1.45
+0.61,-0.25,0.21,0.72,3.04,8.08,1.45
+0.61,-0.25,0.21,0.72,3.03,8.08,1.45
+0.61,-0.25,0.21,0.72,3.03,8.08,1.45
+0.61,-0.25,0.21,0.72,3.02,8.08,1.45
+0.61,-0.25,0.21,0.72,3.02,8.08,1.45
+0.61,-0.25,0.21,0.73,3.02,8.07,1.45
+0.60,-0.25,0.21,0.73,3.01,8.07,1.45
+0.60,-0.25,0.21,0.73,3.01,8.07,1.45
+0.60,-0.25,0.21,0.73,3.01,8.07,1.45
+0.60,-0.25,0.21,0.73,3.00,8.07,1.45
+0.60,-0.25,0.21,0.73,3.00,8.07,1.46
+0.60,-0.25,0.21,0.73,3.00,8.07,1.46
+0.60,-0.25,0.21,0.73,2.99,8.07,1.46
+0.60,-0.25,0.21,0.73,2.99,8.07,1.46
+0.60,-0.26,0.21,0.73,2.99,8.07,1.46
+0.60,-0.26,0.21,0.73,2.98,8.07,1.46
+0.60,-0.26,0.21,0.73,2.98,8.07,1.46
+0.60,-0.26,0.21,0.73,2.98,8.07,1.46
+0.60,-0.26,0.21,0.73,2.97,8.07,1.46
+0.60,-0.26,0.21,0.73,2.97,8.07,1.46
+0.59,-0.26,0.21,0.73,2.96,8.07,1.46
+0.59,-0.26,0.21,0.73,2.96,8.07,1.47
+0.59,-0.26,0.21,0.73,2.96,8.07,1.47
+0.59,-0.26,0.21,0.73,2.95,8.07,1.47
+0.59,-0.26,0.21,0.73,2.95,8.07,1.47
+0.59,-0.26,0.21,0.73,2.95,8.07,1.47
+0.59,-0.26,0.21,0.73,2.94,8.07,1.47
+0.59,-0.26,0.21,0.74,2.94,8.07,1.47
+0.59,-0.26,0.21,0.74,2.94,8.07,1.47
+0.59,-0.26,0.21,0.74,2.93,8.07,1.47
+0.59,-0.26,0.21,0.74,2.93,8.07,1.47
+0.59,-0.26,0.21,0.74,2.92,8.07,1.47
+0.59,-0.26,0.21,0.74,2.92,8.07,1.48
+0.58,-0.26,0.21,0.74,2.92,8.07,1.48
+0.58,-0.26,0.21,0.74,2.91,8.07,1.48
+0.58,-0.26,0.21,0.74,2.91,8.07,1.48
+0.58,-0.27,0.21,0.74,2.91,8.07,1.48
+0.58,-0.27,0.21,0.74,2.90,8.07,1.48
+0.58,-0.27,0.21,0.74,2.90,8.07,1.48
+0.58,-0.27,0.21,0.74,2.90,8.07,1.48
+0.58,-0.27,0.21,0.74,2.89,8.07,1.48
+0.58,-0.27,0.21,0.74,2.89,8.07,1.48
+0.58,-0.27,0.21,0.74,2.89,8.07,1.48
+0.58,-0.27,0.21,0.74,2.88,8.07,1.48
+0.58,-0.27,0.21,0.74,2.88,8.07,1.49
+0.58,-0.27,0.21,0.74,2.87,8.06,1.49
+0.58,-0.27,0.21,0.74,2.87,8.06,1.49
+0.57,-0.27,0.21,0.74,2.87,8.06,1.49
+0.57,-0.27,0.21,0.74,2.86,8.06,1.49
+0.57,-0.27,0.21,0.75,2.86,8.06,1.49
+0.57,-0.27,0.21,0.75,2.86,8.06,1.49
+0.57,-0.27,0.21,0.75,2.85,8.06,1.49
+0.57,-0.27,0.21,0.75,2.85,8.06,1.49
+0.57,-0.27,0.21,0.75,2.85,8.06,1.49
+0.57,-0.27,0.21,0.75,2.84,8.06,1.49
+0.57,-0.27,0.21,0.75,2.84,8.06,1.50
+0.57,-0.27,0.21,0.75,2.83,8.06,1.50
+0.57,-0.27,0.21,0.75,2.83,8.06,1.50
+0.57,-0.27,0.21,0.75,2.83,8.06,1.50
+0.57,-0.28,0.21,0.75,2.82,8.06,1.50
+0.56,-0.28,0.21,0.75,2.82,8.06,1.50
+0.56,-0.28,0.21,0.75,2.82,8.06,1.50
+0.56,-0.28,0.21,0.75,2.81,8.06,1.50
+0.56,-0.28,0.21,0.75,2.81,8.06,1.50
+0.56,-0.28,0.21,0.75,2.81,8.06,1.50
+0.56,-0.28,0.21,0.75,2.80,8.06,1.50
+0.56,-0.28,0.21,0.75,2.80,8.06,1.50
+0.56,-0.28,0.21,0.75,2.80,8.06,1.51
+0.56,-0.28,0.21,0.75,2.79,8.05,1.51
+0.56,-0.28,0.21,0.75,2.79,8.05,1.51
+0.56,-0.28,0.21,0.75,2.78,8.05,1.51
+0.56,-0.28,0.21,0.75,2.78,8.05,1.51
+0.56,-0.28,0.21,0.75,2.78,8.05,1.51
+0.55,-0.28,0.21,0.76,2.77,8.05,1.51
+0.55,-0.28,0.21,0.76,2.77,8.05,1.51
+0.55,-0.28,0.21,0.76,2.77,8.05,1.51
+0.55,-0.28,0.21,0.76,2.76,8.05,1.51
+0.55,-0.28,0.21,0.76,2.76,8.05,1.51
+0.55,-0.28,0.21,0.76,2.76,8.05,1.51
+0.55,-0.28,0.21,0.76,2.75,8.05,1.52
+0.55,-0.28,0.21,0.76,2.75,8.05,1.52
+0.55,-0.29,0.21,0.76,2.74,8.05,1.52
+0.55,-0.29,0.21,0.76,2.74,8.05,1.52
+0.55,-0.29,0.21,0.76,2.74,8.05,1.52
+0.55,-0.29,0.21,0.76,2.73,8.05,1.52
+0.55,-0.29,0.21,0.76,2.73,8.05,1.52
+0.54,-0.29,0.21,0.76,2.73,8.05,1.52
+0.54,-0.29,0.21,0.76,2.72,8.04,1.52
+0.54,-0.29,0.21,0.76,2.72,8.04,1.52
+0.54,-0.29,0.21,0.76,2.72,8.04,1.52
+0.54,-0.29,0.21,0.76,2.71,8.04,1.52
+0.54,-0.29,0.21,0.76,2.71,8.04,1.52
+0.54,-0.29,0.21,0.76,2.70,8.04,1.53
+0.54,-0.29,0.21,0.76,2.70,8.04,1.53
+0.54,-0.29,0.21,0.76,2.70,8.04,1.53
+0.54,-0.29,0.21,0.76,2.69,8.04,1.53
+0.54,-0.29,0.21,0.76,2.69,8.04,1.53
+0.54,-0.29,0.21,0.76,2.69,8.04,1.53
+0.54,-0.29,0.21,0.77,2.68,8.04,1.53
+0.53,-0.29,0.20,0.77,2.68,8.04,1.53
+0.53,-0.29,0.20,0.77,2.68,8.04,1.53
+0.53,-0.29,0.20,0.77,2.67,8.04,1.53
+0.53,-0.29,0.20,0.77,2.67,8.04,1.53
+0.53,-0.30,0.20,0.77,2.66,8.03,1.53
+0.53,-0.30,0.20,0.77,2.66,8.03,1.53
+0.53,-0.30,0.20,0.77,2.66,8.03,1.54
+0.53,-0.30,0.20,0.77,2.65,8.03,1.54
+0.53,-0.30,0.20,0.77,2.65,8.03,1.54
+0.53,-0.30,0.20,0.77,2.65,8.03,1.54
+0.53,-0.30,0.20,0.77,2.64,8.03,1.54
+0.53,-0.30,0.20,0.77,2.64,8.03,1.54
+0.53,-0.30,0.20,0.77,2.64,8.03,1.54
+0.52,-0.30,0.20,0.77,2.63,8.03,1.54
+0.52,-0.30,0.20,0.77,2.63,8.03,1.54
+0.52,-0.30,0.20,0.77,2.62,8.03,1.54
+0.52,-0.30,0.20,0.77,2.62,8.03,1.54
+0.52,-0.30,0.20,0.77,2.62,8.03,1.54
+0.52,-0.30,0.20,0.77,2.61,8.02,1.54
+0.52,-0.30,0.20,0.77,2.61,8.02,1.55
+0.52,-0.30,0.20,0.77,2.61,8.02,1.55
+0.52,-0.30,0.20,0.77,2.60,8.02,1.55
+0.52,-0.30,0.20,0.77,2.60,8.02,1.55
+0.52,-0.30,0.20,0.77,2.59,8.02,1.55
+0.52,-0.30,0.20,0.77,2.59,8.02,1.55
+0.52,-0.30,0.20,0.77,2.59,8.02,1.55
+0.51,-0.31,0.20,0.78,2.58,8.02,1.55
+0.51,-0.31,0.20,0.78,2.58,8.02,1.55
+0.51,-0.31,0.20,0.78,2.58,8.02,1.55
+0.51,-0.31,0.20,0.78,2.57,8.02,1.55
+0.51,-0.31,0.20,0.78,2.57,8.01,1.55
+0.51,-0.31,0.20,0.78,2.57,8.01,1.55
+0.51,-0.31,0.20,0.78,2.56,8.01,1.55
+0.51,-0.31,0.20,0.78,2.56,8.01,1.56
+0.51,-0.31,0.20,0.78,2.55,8.01,1.56
+0.51,-0.31,0.20,0.78,2.55,8.01,1.56
+0.51,-0.31,0.20,0.78,2.55,8.01,1.56
+0.51,-0.31,0.20,0.78,2.54,8.01,1.56
+0.50,-0.31,0.20,0.78,2.54,8.01,1.56
+0.50,-0.31,0.20,0.78,2.54,8.01,1.56
+0.50,-0.31,0.20,0.78,2.53,8.01,1.56
+0.50,-0.31,0.20,0.78,2.53,8.01,1.56
+0.50,-0.31,0.20,0.78,2.53,8.00,1.56
+0.50,-0.31,0.20,0.78,2.52,8.00,1.56
+0.50,-0.31,0.20,0.78,2.52,8.00,1.56
+0.50,-0.31,0.20,0.78,2.51,8.00,1.56
+0.50,-0.31,0.20,0.78,2.51,8.00,1.56
+0.50,-0.31,0.20,0.78,2.51,8.00,1.57
+0.50,-0.32,0.20,0.78,2.50,8.00,1.57
+0.50,-0.32,0.20,0.78,2.50,8.00,1.57
+0.50,-0.32,0.20,0.78,2.50,8.00,1.57
+0.49,-0.32,0.20,0.78,2.49,8.00,1.57
+0.49,-0.32,0.20,0.78,2.49,8.00,1.57
+0.49,-0.32,0.20,0.78,2.49,7.99,1.57
+0.49,-0.32,0.20,0.79,2.48,7.99,1.57
+0.49,-0.32,0.20,0.79,2.48,7.99,1.57
+0.49,-0.32,0.20,0.79,2.47,7.99,1.57
+0.49,-0.32,0.20,0.79,2.47,7.99,1.57
+0.49,-0.32,0.20,0.79,2.47,7.99,1.57
+0.49,-0.32,0.20,0.79,2.46,7.99,1.57
+0.49,-0.32,0.20,0.79,2.46,7.99,1.57
+0.49,-0.32,0.20,0.79,2.46,7.99,1.58
+0.49,-0.32,0.20,0.79,2.45,7.99,1.58
+0.49,-0.32,0.20,0.79,2.45,7.98,1.58
+0.48,-0.32,0.20,0.79,2.45,7.98,1.58
+0.48,-0.32,0.20,0.79,2.44,7.98,1.58
+0.48,-0.32,0.20,0.79,2.44,7.98,1.58
+0.48,-0.32,0.20,0.79,2.43,7.98,1.58
+0.48,-0.32,0.20,0.79,2.43,7.98,1.58
+0.48,-0.33,0.20,0.79,2.43,7.98,1.58
+0.48,-0.33,0.20,0.79,2.42,7.98,1.58
+0.48,-0.33,0.20,0.79,2.42,7.98,1.58
+0.48,-0.33,0.20,0.79,2.42,7.98,1.58
+0.48,-0.33,0.20,0.79,2.41,7.97,1.58
+0.48,-0.33,0.20,0.79,2.41,7.97,1.58
+0.48,-0.33,0.20,0.79,2.40,7.97,1.58
+0.47,-0.33,0.20,0.79,2.40,7.97,1.58
+0.47,-0.33,0.20,0.79,2.40,7.97,1.59
+0.47,-0.33,0.20,0.79,2.39,7.97,1.59
+0.47,-0.33,0.20,0.79,2.39,7.97,1.59
+0.47,-0.33,0.20,0.79,2.39,7.97,1.59
+0.47,-0.33,0.20,0.79,2.38,7.97,1.59
+0.47,-0.33,0.20,0.79,2.38,7.96,1.59
+0.47,-0.33,0.20,0.79,2.38,7.96,1.59
+0.47,-0.33,0.20,0.79,2.37,7.96,1.59
+0.47,-0.33,0.20,0.80,2.37,7.96,1.59
+0.47,-0.33,0.20,0.80,2.36,7.96,1.59
+0.47,-0.33,0.20,0.80,2.36,7.96,1.59
+0.47,-0.33,0.20,0.80,2.36,7.96,1.59
+0.46,-0.33,0.19,0.80,2.35,7.96,1.59
+0.46,-0.33,0.19,0.80,2.35,7.96,1.59
+0.46,-0.34,0.19,0.80,2.35,7.95,1.59
+0.46,-0.34,0.19,0.80,2.34,7.95,1.59
+0.46,-0.34,0.19,0.80,2.34,7.95,1.60
+0.46,-0.34,0.19,0.80,2.34,7.95,1.60
+0.46,-0.34,0.19,0.80,2.33,7.95,1.60
+0.46,-0.34,0.19,0.80,2.33,7.95,1.60
+0.46,-0.34,0.19,0.80,2.32,7.95,1.60
+0.46,-0.34,0.19,0.80,2.32,7.95,1.60
+0.46,-0.34,0.19,0.80,2.32,7.94,1.60
+0.46,-0.34,0.19,0.80,2.31,7.94,1.60
+0.46,-0.34,0.19,0.80,2.31,7.94,1.60
+0.45,-0.34,0.19,0.80,2.31,7.94,1.60
+0.45,-0.34,0.19,0.80,2.30,7.94,1.60
+0.45,-0.34,0.19,0.80,2.30,7.94,1.60
+0.45,-0.34,0.19,0.80,2.30,7.94,1.60
+0.45,-0.34,0.19,0.80,2.29,7.94,1.60
+0.45,-0.34,0.19,0.80,2.29,7.93,1.60
+0.45,-0.34,0.19,0.80,2.28,7.93,1.60
+0.45,-0.34,0.19,0.80,2.28,7.93,1.61
+0.45,-0.34,0.19,0.80,2.28,7.93,1.61
+0.45,-0.34,0.19,0.80,2.27,7.93,1.61
+0.45,-0.34,0.19,0.80,2.27,7.93,1.61
+0.45,-0.35,0.19,0.80,2.27,7.93,1.61
+0.44,-0.35,0.19,0.80,2.26,7.93,1.61
+0.44,-0.35,0.19,0.80,2.26,7.92,1.61
+0.44,-0.35,0.19,0.80,2.26,7.92,1.61
+0.44,-0.35,0.19,0.80,2.25,7.92,1.61
+0.44,-0.35,0.19,0.81,2.25,7.92,1.61
+0.44,-0.35,0.19,0.81,2.24,7.92,1.61
+0.44,-0.35,0.19,0.81,2.24,7.92,1.61
+0.44,-0.35,0.19,0.81,2.24,7.92,1.61
+0.44,-0.35,0.19,0.81,2.23,7.92,1.61
+0.44,-0.35,0.19,0.81,2.23,7.91,1.61
+0.44,-0.35,0.19,0.81,2.23,7.91,1.61
+0.44,-0.35,0.19,0.81,2.22,7.91,1.61
+0.43,-0.35,0.19,0.81,2.22,7.91,1.61
+0.43,-0.35,0.19,0.81,2.22,7.91,1.62
+0.43,-0.35,0.19,0.81,2.21,7.91,1.62
+0.43,-0.35,0.19,0.81,2.21,7.91,1.62
+0.43,-0.35,0.19,0.81,2.20,7.90,1.62
+0.43,-0.35,0.19,0.81,2.20,7.90,1.62
+0.43,-0.35,0.19,0.81,2.20,7.90,1.62
+0.43,-0.35,0.19,0.81,2.19,7.90,1.62
+0.43,-0.35,0.19,0.81,2.19,7.90,1.62
+0.43,-0.36,0.19,0.81,2.19,7.90,1.62
+0.43,-0.36,0.19,0.81,2.18,7.90,1.62
+0.43,-0.36,0.19,0.81,2.18,7.89,1.62
+0.43,-0.36,0.19,0.81,2.18,7.89,1.62
+0.42,-0.36,0.19,0.81,2.17,7.89,1.62
+0.42,-0.36,0.19,0.81,2.17,7.89,1.62
+0.42,-0.36,0.19,0.81,2.16,7.89,1.62
+0.42,-0.36,0.19,0.81,2.16,7.89,1.62
+0.42,-0.36,0.19,0.81,2.16,7.89,1.62
+0.42,-0.36,0.19,0.81,2.15,7.88,1.62
+0.42,-0.36,0.19,0.81,2.15,7.88,1.62
+0.42,-0.36,0.19,0.81,2.15,7.88,1.63
+0.42,-0.36,0.19,0.81,2.14,7.88,1.63
+0.42,-0.36,0.19,0.81,2.14,7.88,1.63
+0.42,-0.36,0.19,0.81,2.14,7.88,1.63
+0.42,-0.36,0.18,0.81,2.13,7.88,1.63
+0.41,-0.36,0.18,0.81,2.13,7.87,1.63
+0.41,-0.36,0.18,0.81,2.12,7.87,1.63
+0.41,-0.36,0.18,0.81,2.12,7.87,1.63
+0.41,-0.36,0.18,0.81,2.12,7.87,1.63
+0.41,-0.36,0.18,0.81,2.11,7.87,1.63
+0.41,-0.36,0.18,0.82,2.11,7.87,1.63
+0.41,-0.37,0.18,0.82,2.11,7.87,1.63
+0.41,-0.37,0.18,0.82,2.10,7.86,1.63
+0.41,-0.37,0.18,0.82,2.10,7.86,1.63
+0.41,-0.37,0.18,0.82,2.10,7.86,1.63
+0.41,-0.37,0.18,0.82,2.09,7.86,1.63
+0.41,-0.37,0.18,0.82,2.09,7.86,1.63
+0.41,-0.37,0.18,0.82,2.08,7.86,1.63
+0.40,-0.37,0.18,0.82,2.08,7.85,1.63
+0.40,-0.37,0.18,0.82,2.08,7.85,1.63
+0.40,-0.37,0.18,0.82,2.07,7.85,1.64
+0.40,-0.37,0.18,0.82,2.07,7.85,1.64
+0.40,-0.37,0.18,0.82,2.07,7.85,1.64
+0.40,-0.37,0.18,0.82,2.06,7.85,1.64
+0.40,-0.37,0.18,0.82,2.06,7.84,1.64
+0.40,-0.37,0.18,0.82,2.06,7.84,1.64
+0.40,-0.37,0.18,0.82,2.05,7.84,1.64
+0.40,-0.37,0.18,0.82,2.05,7.84,1.64
+0.40,-0.37,0.18,0.82,2.04,7.84,1.64
+0.40,-0.37,0.18,0.82,2.04,7.84,1.64
+0.39,-0.37,0.18,0.82,2.04,7.84,1.64
+0.39,-0.37,0.18,0.82,2.03,7.83,1.64
+0.39,-0.37,0.18,0.82,2.03,7.83,1.64
+0.39,-0.38,0.18,0.82,2.03,7.83,1.64
+0.39,-0.38,0.18,0.82,2.02,7.83,1.64
+0.39,-0.38,0.18,0.82,2.02,7.83,1.64
+0.39,-0.38,0.18,0.82,2.02,7.83,1.64
+0.39,-0.38,0.18,0.82,2.01,7.82,1.64
+0.39,-0.38,0.18,0.82,2.01,7.82,1.64
+0.39,-0.38,0.18,0.82,2.01,7.82,1.64
+0.39,-0.38,0.18,0.82,2.00,7.82,1.64
+0.39,-0.38,0.18,0.82,2.00,7.82,1.65
+0.38,-0.38,0.18,0.82,1.99,7.82,1.65
+0.38,-0.38,0.18,0.82,1.99,7.81,1.65
+0.38,-0.38,0.18,0.82,1.99,7.81,1.65
+0.38,-0.38,0.18,0.82,1.98,7.81,1.65
+0.38,-0.38,0.18,0.82,1.98,7.81,1.65
+0.38,-0.38,0.18,0.82,1.98,7.81,1.65
+0.38,-0.38,0.18,0.82,1.97,7.80,1.65
+0.38,-0.38,0.18,0.82,1.97,7.80,1.65
+0.38,-0.38,0.18,0.82,1.97,7.80,1.65
+0.38,-0.38,0.18,0.82,1.96,7.80,1.65
+0.38,-0.38,0.18,0.82,1.96,7.80,1.65
+0.38,-0.38,0.17,0.83,1.95,7.80,1.65
+0.37,-0.38,0.17,0.83,1.95,7.79,1.65
+0.37,-0.38,0.17,0.83,1.95,7.79,1.65
+0.37,-0.39,0.17,0.83,1.94,7.79,1.65
+0.37,-0.39,0.17,0.83,1.94,7.79,1.65
+0.37,-0.39,0.17,0.83,1.94,7.79,1.65
+0.37,-0.39,0.17,0.83,1.93,7.79,1.65
+0.37,-0.39,0.17,0.83,1.93,7.78,1.65
+0.37,-0.39,0.17,0.83,1.93,7.78,1.65
+0.37,-0.39,0.17,0.83,1.92,7.78,1.65
+0.37,-0.39,0.17,0.83,1.92,7.78,1.65
+0.37,-0.39,0.17,0.83,1.92,7.78,1.65
+0.37,-0.39,0.17,0.83,1.91,7.77,1.66
+0.37,-0.39,0.17,0.83,1.91,7.77,1.66
+0.36,-0.39,0.17,0.83,1.90,7.77,1.66
+0.36,-0.39,0.17,0.83,1.90,7.77,1.66
+0.36,-0.39,0.17,0.83,1.90,7.77,1.66
+0.36,-0.39,0.17,0.83,1.89,7.77,1.66
+0.36,-0.39,0.17,0.83,1.89,7.76,1.66
+0.36,-0.39,0.17,0.83,1.89,7.76,1.66
+0.36,-0.39,0.17,0.83,1.88,7.76,1.66
+0.36,-0.39,0.17,0.83,1.88,7.76,1.66
+0.36,-0.39,0.17,0.83,1.88,7.76,1.66
+0.36,-0.39,0.17,0.83,1.87,7.75,1.66
+0.36,-0.39,0.17,0.83,1.87,7.75,1.66
+0.36,-0.40,0.17,0.83,1.87,7.75,1.66
+0.35,-0.40,0.17,0.83,1.86,7.75,1.66
+0.35,-0.40,0.17,0.83,1.86,7.75,1.66
+0.35,-0.40,0.17,0.83,1.85,7.74,1.66
+0.35,-0.40,0.17,0.83,1.85,7.74,1.66
+0.35,-0.40,0.17,0.83,1.85,7.74,1.66
+0.35,-0.40,0.17,0.83,1.84,7.74,1.66
+0.35,-0.40,0.17,0.83,1.84,7.74,1.66
+0.35,-0.40,0.17,0.83,1.84,7.73,1.66
+0.35,-0.40,0.17,0.83,1.83,7.73,1.66
+0.35,-0.40,0.17,0.83,1.83,7.73,1.66
+0.35,-0.40,0.17,0.83,1.83,7.73,1.66
+0.35,-0.40,0.17,0.83,1.82,7.73,1.66
+0.34,-0.40,0.17,0.83,1.82,7.72,1.66
+0.34,-0.40,0.17,0.83,1.82,7.72,1.67
+0.34,-0.40,0.17,0.83,1.81,7.72,1.67
+0.34,-0.40,0.17,0.83,1.81,7.72,1.67
+0.34,-0.40,0.16,0.83,1.81,7.72,1.67
+0.34,-0.40,0.16,0.83,1.80,7.71,1.67
+0.34,-0.40,0.16,0.83,1.80,7.71,1.67
+0.34,-0.40,0.16,0.83,1.79,7.71,1.67
+0.34,-0.40,0.16,0.83,1.79,7.71,1.67
+0.34,-0.40,0.16,0.83,1.79,7.71,1.67
+0.34,-0.41,0.16,0.83,1.78,7.70,1.67
+0.34,-0.41,0.16,0.83,1.78,7.70,1.67
+0.33,-0.41,0.16,0.83,1.78,7.70,1.67
+0.33,-0.41,0.16,0.83,1.77,7.70,1.67
+0.33,-0.41,0.16,0.83,1.77,7.70,1.67
+0.33,-0.41,0.16,0.83,1.77,7.69,1.67
+0.33,-0.41,0.16,0.84,1.76,7.69,1.67
+0.33,-0.41,0.16,0.84,1.76,7.69,1.67
+0.33,-0.41,0.16,0.84,1.76,7.69,1.67
+0.33,-0.41,0.16,0.84,1.75,7.69,1.67
+0.33,-0.41,0.16,0.84,1.75,7.68,1.67
+0.33,-0.41,0.16,0.84,1.75,7.68,1.67
+0.33,-0.41,0.16,0.84,1.74,7.68,1.67
+0.33,-0.41,0.16,0.84,1.74,7.68,1.67
+0.32,-0.41,0.16,0.84,1.73,7.68,1.67
+0.32,-0.41,0.16,0.84,1.73,7.67,1.67
+0.32,-0.41,0.16,0.84,1.73,7.67,1.67
+0.32,-0.41,0.16,0.84,1.72,7.67,1.67
+0.32,-0.41,0.16,0.84,1.72,7.67,1.67
+0.32,-0.41,0.16,0.84,1.72,7.67,1.67
+0.32,-0.41,0.16,0.84,1.71,7.66,1.67
+0.32,-0.41,0.16,0.84,1.71,7.66,1.67
+0.32,-0.42,0.16,0.84,1.71,7.66,1.68
+0.32,-0.42,0.16,0.84,1.70,7.66,1.68
+0.32,-0.42,0.16,0.84,1.70,7.65,1.68
+0.32,-0.42,0.16,0.84,1.70,7.65,1.68
+0.31,-0.42,0.16,0.84,1.69,7.65,1.68
+0.31,-0.42,0.16,0.84,1.69,7.65,1.68
+0.31,-0.42,0.16,0.84,1.69,7.65,1.68
+0.31,-0.42,0.16,0.84,1.68,7.64,1.68
+0.31,-0.42,0.16,0.84,1.68,7.64,1.68
+0.31,-0.42,0.16,0.84,1.68,7.64,1.68
+0.31,-0.42,0.15,0.84,1.67,7.64,1.68
+0.31,-0.42,0.15,0.84,1.67,7.63,1.68
+0.31,-0.42,0.15,0.84,1.66,7.63,1.68
+0.31,-0.42,0.15,0.84,1.66,7.63,1.68
+0.31,-0.42,0.15,0.84,1.66,7.63,1.68
+0.31,-0.42,0.15,0.84,1.65,7.63,1.68
+0.31,-0.42,0.15,0.84,1.65,7.62,1.68
+0.30,-0.42,0.15,0.84,1.65,7.62,1.68
+0.30,-0.42,0.15,0.84,1.64,7.62,1.68
+0.30,-0.42,0.15,0.84,1.64,7.62,1.68
+0.30,-0.42,0.15,0.84,1.64,7.61,1.68
+0.30,-0.42,0.15,0.84,1.63,7.61,1.68
+0.30,-0.42,0.15,0.84,1.63,7.61,1.68
+0.30,-0.43,0.15,0.84,1.63,7.61,1.68
+0.30,-0.43,0.15,0.84,1.62,7.61,1.68
+0.30,-0.43,0.15,0.84,1.62,7.60,1.68
+0.30,-0.43,0.15,0.84,1.62,7.60,1.68
+0.30,-0.43,0.15,0.84,1.61,7.60,1.68
+0.30,-0.43,0.15,0.84,1.61,7.60,1.68
+0.29,-0.43,0.15,0.84,1.61,7.59,1.68
+0.29,-0.43,0.15,0.84,1.60,7.59,1.68
+0.29,-0.43,0.15,0.84,1.60,7.59,1.68
+0.29,-0.43,0.15,0.84,1.60,7.59,1.68
+0.29,-0.43,0.15,0.84,1.59,7.58,1.68
+0.29,-0.43,0.15,0.84,1.59,7.58,1.68
+0.29,-0.43,0.15,0.84,1.59,7.58,1.68
+0.29,-0.43,0.15,0.84,1.58,7.58,1.68
+0.29,-0.43,0.15,0.84,1.58,7.58,1.68
+0.29,-0.43,0.15,0.84,1.58,7.57,1.69
+0.29,-0.43,0.15,0.84,1.57,7.57,1.69
+0.29,-0.43,0.15,0.84,1.57,7.57,1.69
+0.28,-0.43,0.15,0.84,1.56,7.57,1.69
+0.28,-0.43,0.15,0.84,1.56,7.56,1.69
+0.28,-0.43,0.15,0.84,1.56,7.56,1.69
+0.28,-0.43,0.15,0.84,1.55,7.56,1.69
+0.28,-0.43,0.14,0.84,1.55,7.56,1.69
+0.28,-0.43,0.14,0.84,1.55,7.55,1.69
+0.28,-0.44,0.14,0.84,1.54,7.55,1.69
+0.28,-0.44,0.14,0.84,1.54,7.55,1.69
+0.28,-0.44,0.14,0.84,1.54,7.55,1.69
+0.28,-0.44,0.14,0.84,1.53,7.54,1.69
+0.28,-0.44,0.14,0.84,1.53,7.54,1.69
+0.28,-0.44,0.14,0.84,1.53,7.54,1.69
+0.27,-0.44,0.14,0.84,1.52,7.54,1.69
+0.27,-0.44,0.14,0.84,1.52,7.53,1.69
+0.27,-0.44,0.14,0.84,1.52,7.53,1.69
+0.27,-0.44,0.14,0.84,1.51,7.53,1.69
+0.27,-0.44,0.14,0.84,1.51,7.53,1.69
+0.27,-0.44,0.14,0.84,1.51,7.52,1.69
+0.27,-0.44,0.14,0.84,1.50,7.52,1.69
+0.27,-0.44,0.14,0.84,1.50,7.52,1.69
+0.27,-0.44,0.14,0.84,1.50,7.52,1.69
+0.27,-0.44,0.14,0.84,1.49,7.51,1.69
+0.27,-0.44,0.14,0.85,1.49,7.51,1.69
+0.27,-0.44,0.14,0.85,1.49,7.51,1.69
+0.26,-0.44,0.14,0.85,1.48,7.51,1.69
+0.26,-0.44,0.14,0.85,1.48,7.50,1.69
+0.26,-0.44,0.14,0.85,1.48,7.50,1.69
+0.26,-0.44,0.14,0.85,1.47,7.50,1.69
+0.26,-0.44,0.14,0.85,1.47,7.50,1.69
+0.26,-0.45,0.14,0.85,1.47,7.49,1.69
+0.26,-0.45,0.14,0.85,1.46,7.49,1.69
+0.26,-0.45,0.14,0.85,1.46,7.49,1.69
+0.26,-0.45,0.14,0.85,1.46,7.49,1.69
+0.26,-0.45,0.14,0.85,1.45,7.48,1.69
+0.26,-0.45,0.14,0.85,1.45,7.48,1.69
+0.26,-0.45,0.14,0.85,1.45,7.48,1.69
+0.25,-0.45,0.13,0.85,1.44,7.48,1.69
+0.25,-0.45,0.13,0.85,1.44,7.47,1.69
+0.25,-0.45,0.13,0.85,1.44,7.47,1.69
+0.25,-0.45,0.13,0.85,1.43,7.47,1.69
+0.25,-0.45,0.13,0.85,1.43,7.47,1.69
+0.25,-0.45,0.13,0.85,1.43,7.46,1.69
+0.25,-0.45,0.13,0.85,1.42,7.46,1.69
+0.25,-0.45,0.13,0.85,1.42,7.46,1.69
+0.25,-0.45,0.13,0.85,1.42,7.46,1.69
+0.25,-0.45,0.13,0.85,1.41,7.45,1.69
+0.25,-0.45,0.13,0.85,1.41,7.45,1.69
+0.25,-0.45,0.13,0.85,1.41,7.45,1.69
+0.25,-0.45,0.13,0.85,1.40,7.45,1.69
+0.24,-0.45,0.13,0.85,1.40,7.44,1.69
+0.24,-0.45,0.13,0.85,1.40,7.44,1.69
+0.24,-0.45,0.13,0.85,1.39,7.44,1.69
+0.24,-0.45,0.13,0.85,1.39,7.43,1.69
+0.24,-0.46,0.13,0.85,1.39,7.43,1.69
+0.24,-0.46,0.13,0.85,1.38,7.43,1.69
+0.24,-0.46,0.13,0.85,1.38,7.43,1.70
+0.24,-0.46,0.13,0.85,1.38,7.42,1.70
+0.24,-0.46,0.13,0.85,1.37,7.42,1.70
+0.24,-0.46,0.13,0.85,1.37,7.42,1.70
+0.24,-0.46,0.13,0.85,1.37,7.42,1.70
+0.24,-0.46,0.13,0.85,1.36,7.41,1.70
+0.23,-0.46,0.13,0.85,1.36,7.41,1.70
+0.23,-0.46,0.13,0.85,1.36,7.41,1.70
+0.23,-0.46,0.13,0.85,1.35,7.41,1.70
+0.23,-0.46,0.13,0.85,1.35,7.40,1.70
+0.23,-0.46,0.13,0.85,1.35,7.40,1.70
+0.23,-0.46,0.13,0.85,1.34,7.40,1.70
+0.23,-0.46,0.12,0.85,1.34,7.39,1.70
+0.23,-0.46,0.12,0.85,1.34,7.39,1.70
+0.23,-0.46,0.12,0.85,1.33,7.39,1.70
+0.23,-0.46,0.12,0.85,1.33,7.39,1.70
+0.23,-0.46,0.12,0.85,1.33,7.38,1.70
+0.23,-0.46,0.12,0.85,1.32,7.38,1.70
+0.22,-0.46,0.12,0.85,1.32,7.38,1.70
+0.22,-0.46,0.12,0.85,1.32,7.38,1.70
+0.22,-0.46,0.12,0.85,1.31,7.37,1.70
+0.22,-0.46,0.12,0.85,1.31,7.37,1.70
+0.22,-0.46,0.12,0.85,1.31,7.37,1.70
+0.22,-0.47,0.12,0.85,1.30,7.36,1.70
+0.22,-0.47,0.12,0.85,1.30,7.36,1.70
+0.22,-0.47,0.12,0.85,1.30,7.36,1.70
+0.22,-0.47,0.12,0.85,1.29,7.36,1.70
+0.22,-0.47,0.12,0.85,1.29,7.35,1.70
+0.22,-0.47,0.12,0.85,1.29,7.35,1.70
+0.22,-0.47,0.12,0.85,1.28,7.35,1.70
+0.21,-0.47,0.12,0.85,1.28,7.34,1.70
+0.21,-0.47,0.12,0.85,1.28,7.34,1.70
+0.21,-0.47,0.12,0.85,1.27,7.34,1.70
+0.21,-0.47,0.12,0.85,1.27,7.34,1.70
+0.21,-0.47,0.12,0.85,1.27,7.33,1.70
+0.21,-0.47,0.12,0.85,1.27,7.33,1.70
+0.21,-0.47,0.12,0.85,1.26,7.33,1.70
+0.21,-0.47,0.12,0.85,1.26,7.32,1.70
+0.21,-0.47,0.12,0.85,1.26,7.32,1.70
+0.21,-0.47,0.12,0.85,1.25,7.32,1.70
+0.21,-0.47,0.11,0.85,1.25,7.32,1.70
+0.21,-0.47,0.11,0.85,1.25,7.31,1.70
+0.20,-0.47,0.11,0.85,1.24,7.31,1.70
+0.20,-0.47,0.11,0.85,1.24,7.31,1.70
+0.20,-0.47,0.11,0.85,1.24,7.30,1.70
+0.20,-0.47,0.11,0.85,1.23,7.30,1.70
+0.20,-0.47,0.11,0.85,1.23,7.30,1.70
+0.20,-0.48,0.11,0.85,1.23,7.30,1.70
+0.20,-0.48,0.11,0.85,1.22,7.29,1.70
+0.20,-0.48,0.11,0.85,1.22,7.29,1.70
+0.20,-0.48,0.11,0.85,1.22,7.29,1.70
+0.20,-0.48,0.11,0.85,1.21,7.28,1.70
+0.20,-0.48,0.11,0.85,1.21,7.28,1.70
+0.20,-0.48,0.11,0.85,1.21,7.28,1.70
+0.20,-0.48,0.11,0.85,1.20,7.27,1.70
+0.19,-0.48,0.11,0.85,1.20,7.27,1.70
+0.19,-0.48,0.11,0.85,1.20,7.27,1.70
+0.19,-0.48,0.11,0.85,1.19,7.27,1.70
+0.19,-0.48,0.11,0.85,1.19,7.26,1.70
+0.19,-0.48,0.11,0.85,1.19,7.26,1.70
+0.19,-0.48,0.11,0.85,1.19,7.26,1.70
+0.19,-0.48,0.11,0.85,1.18,7.25,1.70
+0.19,-0.48,0.11,0.85,1.18,7.25,1.70
+0.19,-0.48,0.11,0.85,1.18,7.25,1.70
+0.19,-0.48,0.11,0.85,1.17,7.24,1.70
+0.19,-0.48,0.11,0.85,1.17,7.24,1.70
+0.19,-0.48,0.11,0.85,1.17,7.24,1.70
+0.18,-0.48,0.10,0.85,1.16,7.24,1.70
+0.18,-0.48,0.10,0.85,1.16,7.23,1.70
+0.18,-0.48,0.10,0.85,1.16,7.23,1.70
+0.18,-0.48,0.10,0.85,1.15,7.23,1.70
+0.18,-0.48,0.10,0.85,1.15,7.22,1.70
+0.18,-0.48,0.10,0.85,1.15,7.22,1.70
+0.18,-0.49,0.10,0.85,1.14,7.22,1.70
+0.18,-0.49,0.10,0.85,1.14,7.21,1.70
+0.18,-0.49,0.10,0.85,1.14,7.21,1.70
+0.18,-0.49,0.10,0.85,1.14,7.21,1.70
+0.18,-0.49,0.10,0.85,1.13,7.21,1.70
+0.18,-0.49,0.10,0.85,1.13,7.20,1.70
+0.17,-0.49,0.10,0.85,1.13,7.20,1.70
+0.17,-0.49,0.10,0.85,1.12,7.20,1.70
+0.17,-0.49,0.10,0.85,1.12,7.19,1.70
+0.17,-0.49,0.10,0.85,1.12,7.19,1.70
+0.17,-0.49,0.10,0.85,1.11,7.19,1.70
+0.17,-0.49,0.10,0.85,1.11,7.18,1.70
+0.17,-0.49,0.10,0.85,1.11,7.18,1.70
+0.17,-0.49,0.10,0.85,1.10,7.18,1.70
+0.17,-0.49,0.10,0.85,1.10,7.17,1.70
+0.17,-0.49,0.10,0.85,1.10,7.17,1.70
+0.17,-0.49,0.10,0.85,1.09,7.17,1.70
+0.17,-0.49,0.10,0.85,1.09,7.16,1.70
+0.16,-0.49,0.10,0.85,1.09,7.16,1.70
+0.16,-0.49,0.10,0.85,1.09,7.16,1.70
+0.16,-0.49,0.09,0.85,1.08,7.16,1.70
+0.16,-0.49,0.09,0.85,1.08,7.15,1.70
+0.16,-0.49,0.09,0.85,1.08,7.15,1.70
+0.16,-0.49,0.09,0.85,1.07,7.15,1.70
+0.16,-0.49,0.09,0.85,1.07,7.14,1.70
+0.16,-0.49,0.09,0.85,1.07,7.14,1.70
+0.16,-0.50,0.09,0.85,1.06,7.14,1.70
+0.16,-0.50,0.09,0.85,1.06,7.13,1.70
+0.16,-0.50,0.09,0.85,1.06,7.13,1.70
+0.16,-0.50,0.09,0.85,1.06,7.13,1.70
+0.16,-0.50,0.09,0.85,1.05,7.12,1.70
+0.15,-0.50,0.09,0.85,1.05,7.12,1.70
+0.15,-0.50,0.09,0.85,1.05,7.12,1.70
+0.15,-0.50,0.09,0.85,1.04,7.11,1.70
+0.15,-0.50,0.09,0.85,1.04,7.11,1.70
+0.15,-0.50,0.09,0.85,1.04,7.11,1.70
+0.15,-0.50,0.09,0.85,1.03,7.10,1.70
+0.15,-0.50,0.09,0.85,1.03,7.10,1.70
+0.15,-0.50,0.09,0.85,1.03,7.10,1.70
+0.15,-0.50,0.09,0.85,1.02,7.09,1.70
+0.15,-0.50,0.09,0.85,1.02,7.09,1.70
+0.15,-0.50,0.09,0.85,1.02,7.09,1.70
+0.15,-0.50,0.09,0.85,1.02,7.08,1.70
+0.14,-0.50,0.09,0.85,1.01,7.08,1.70
+0.14,-0.50,0.09,0.85,1.01,7.08,1.70
+0.14,-0.50,0.08,0.85,1.01,7.07,1.70
+0.14,-0.50,0.08,0.85,1.00,7.07,1.70
+0.14,-0.50,0.08,0.85,1.00,7.07,1.70
+0.14,-0.50,0.08,0.85,1.00,7.07,1.70
+0.14,-0.50,0.08,0.85,0.99,7.06,1.70
+0.14,-0.50,0.08,0.85,0.99,7.06,1.70
+0.14,-0.50,0.08,0.85,0.99,7.06,1.70
+0.14,-0.51,0.08,0.85,0.99,7.05,1.70
+0.14,-0.51,0.08,0.85,0.98,7.05,1.70
+0.14,-0.51,0.08,0.85,0.98,7.05,1.70
+0.13,-0.51,0.08,0.85,0.98,7.04,1.70
+0.13,-0.51,0.08,0.85,0.97,7.04,1.70
+0.13,-0.51,0.08,0.85,0.97,7.04,1.70
+0.13,-0.51,0.08,0.85,0.97,7.03,1.70
+0.13,-0.51,0.08,0.85,0.97,7.03,1.70
+0.13,-0.51,0.08,0.85,0.96,7.03,1.70
+0.13,-0.51,0.08,0.85,0.96,7.02,1.70
+0.13,-0.51,0.08,0.85,0.96,7.02,1.70
+0.13,-0.51,0.08,0.85,0.95,7.02,1.69
+0.13,-0.51,0.08,0.85,0.95,7.01,1.69
+0.13,-0.51,0.08,0.85,0.95,7.01,1.69
+0.13,-0.51,0.08,0.85,0.94,7.00,1.69
+0.13,-0.51,0.08,0.85,0.94,7.00,1.69
+0.12,-0.51,0.08,0.85,0.94,7.00,1.69
+0.12,-0.51,0.07,0.85,0.94,6.99,1.69
+0.12,-0.51,0.07,0.85,0.93,6.99,1.69
+0.12,-0.51,0.07,0.85,0.93,6.99,1.69
+0.12,-0.51,0.07,0.85,0.93,6.98,1.69
+0.12,-0.51,0.07,0.85,0.92,6.98,1.69
+0.12,-0.51,0.07,0.85,0.92,6.98,1.69
+0.12,-0.51,0.07,0.85,0.92,6.97,1.69
+0.12,-0.51,0.07,0.85,0.92,6.97,1.69
+0.12,-0.51,0.07,0.85,0.91,6.97,1.69
+0.12,-0.51,0.07,0.85,0.91,6.96,1.69
+0.12,-0.52,0.07,0.85,0.91,6.96,1.69
+0.11,-0.52,0.07,0.85,0.90,6.96,1.69
+0.11,-0.52,0.07,0.85,0.90,6.95,1.69
+0.11,-0.52,0.07,0.85,0.90,6.95,1.69
+0.11,-0.52,0.07,0.85,0.90,6.95,1.69
+0.11,-0.52,0.07,0.85,0.89,6.94,1.69
+0.11,-0.52,0.07,0.85,0.89,6.94,1.69
+0.11,-0.52,0.07,0.85,0.89,6.94,1.69
+0.11,-0.52,0.07,0.85,0.88,6.93,1.69
+0.11,-0.52,0.07,0.85,0.88,6.93,1.69
+0.11,-0.52,0.07,0.85,0.88,6.93,1.69
+0.11,-0.52,0.07,0.85,0.88,6.92,1.69
+0.11,-0.52,0.07,0.85,0.87,6.92,1.69
+0.11,-0.52,0.06,0.85,0.87,6.92,1.69
+0.10,-0.52,0.06,0.85,0.87,6.91,1.69
+0.10,-0.52,0.06,0.85,0.86,6.91,1.69
+0.10,-0.52,0.06,0.85,0.86,6.90,1.69
+0.10,-0.52,0.06,0.85,0.86,6.90,1.69
+0.10,-0.52,0.06,0.84,0.86,6.90,1.69
+0.10,-0.52,0.06,0.84,0.85,6.89,1.69
+0.10,-0.52,0.06,0.84,0.85,6.89,1.69
+0.10,-0.52,0.06,0.84,0.85,6.89,1.69
+0.10,-0.52,0.06,0.84,0.84,6.88,1.69
+0.10,-0.52,0.06,0.84,0.84,6.88,1.69
+0.10,-0.52,0.06,0.84,0.84,6.88,1.69
+0.10,-0.52,0.06,0.84,0.84,6.87,1.69
+0.09,-0.52,0.06,0.84,0.83,6.87,1.69
+0.09,-0.52,0.06,0.84,0.83,6.87,1.69
+0.09,-0.52,0.06,0.84,0.83,6.86,1.69
+0.09,-0.53,0.06,0.84,0.82,6.86,1.69
+0.09,-0.53,0.06,0.84,0.82,6.85,1.69
+0.09,-0.53,0.06,0.84,0.82,6.85,1.69
+0.09,-0.53,0.06,0.84,0.82,6.85,1.69
+0.09,-0.53,0.06,0.84,0.81,6.84,1.69
+0.09,-0.53,0.06,0.84,0.81,6.84,1.69
+0.09,-0.53,0.05,0.84,0.81,6.84,1.69
+0.09,-0.53,0.05,0.84,0.81,6.83,1.69
+0.09,-0.53,0.05,0.84,0.80,6.83,1.69
+0.09,-0.53,0.05,0.84,0.80,6.83,1.69
+0.08,-0.53,0.05,0.84,0.80,6.82,1.69
+0.08,-0.53,0.05,0.84,0.79,6.82,1.69
+0.08,-0.53,0.05,0.84,0.79,6.81,1.69
+0.08,-0.53,0.05,0.84,0.79,6.81,1.69
+0.08,-0.53,0.05,0.84,0.79,6.81,1.68
+0.08,-0.53,0.05,0.84,0.78,6.80,1.68
+0.08,-0.53,0.05,0.84,0.78,6.80,1.68
+0.08,-0.53,0.05,0.84,0.78,6.80,1.68
+0.08,-0.53,0.05,0.84,0.78,6.79,1.68
+0.08,-0.53,0.05,0.84,0.77,6.79,1.68
+0.08,-0.53,0.05,0.84,0.77,6.79,1.68
+0.08,-0.53,0.05,0.84,0.77,6.78,1.68
+0.08,-0.53,0.05,0.84,0.76,6.78,1.68
+0.07,-0.53,0.05,0.84,0.76,6.77,1.68
+0.07,-0.53,0.05,0.84,0.76,6.77,1.68
+0.07,-0.53,0.05,0.84,0.76,6.77,1.68
+0.07,-0.53,0.05,0.84,0.75,6.76,1.68
+0.07,-0.53,0.05,0.84,0.75,6.76,1.68
+0.07,-0.53,0.04,0.84,0.75,6.76,1.68
+0.07,-0.54,0.04,0.84,0.75,6.75,1.68
+0.07,-0.54,0.04,0.84,0.74,6.75,1.68
+0.07,-0.54,0.04,0.84,0.74,6.74,1.68
+0.07,-0.54,0.04,0.84,0.74,6.74,1.68
+0.07,-0.54,0.04,0.84,0.74,6.74,1.68
+0.07,-0.54,0.04,0.84,0.73,6.73,1.68
+0.06,-0.54,0.04,0.84,0.73,6.73,1.68
+0.06,-0.54,0.04,0.84,0.73,6.73,1.68
+0.06,-0.54,0.04,0.84,0.72,6.72,1.68
+0.06,-0.54,0.04,0.84,0.72,6.72,1.68
+0.06,-0.54,0.04,0.84,0.72,6.71,1.68
+0.06,-0.54,0.04,0.84,0.72,6.71,1.68
+0.06,-0.54,0.04,0.84,0.71,6.71,1.68
+0.06,-0.54,0.04,0.84,0.71,6.70,1.68
+0.06,-0.54,0.04,0.84,0.71,6.70,1.68
+0.06,-0.54,0.04,0.84,0.71,6.70,1.68
+0.06,-0.54,0.04,0.84,0.70,6.69,1.68
+0.06,-0.54,0.04,0.84,0.70,6.69,1.68
+0.06,-0.54,0.04,0.84,0.70,6.68,1.68
+0.05,-0.54,0.04,0.84,0.70,6.68,1.68
+0.05,-0.54,0.03,0.84,0.69,6.68,1.68
+0.05,-0.54,0.03,0.84,0.69,6.67,1.68
+0.05,-0.54,0.03,0.84,0.69,6.67,1.68
+0.05,-0.54,0.03,0.84,0.69,6.67,1.68
+0.05,-0.54,0.03,0.84,0.68,6.66,1.68
+0.05,-0.54,0.03,0.84,0.68,6.66,1.67
+0.05,-0.54,0.03,0.84,0.68,6.65,1.67
+0.05,-0.54,0.03,0.84,0.68,6.65,1.67
+0.05,-0.54,0.03,0.84,0.67,6.65,1.67
+0.05,-0.54,0.03,0.84,0.67,6.64,1.67
+0.05,-0.54,0.03,0.84,0.67,6.64,1.67
+0.05,-0.55,0.03,0.84,0.66,6.63,1.67
+0.04,-0.55,0.03,0.84,0.66,6.63,1.67
+0.04,-0.55,0.03,0.84,0.66,6.63,1.67
+0.04,-0.55,0.03,0.84,0.66,6.62,1.67
+0.04,-0.55,0.03,0.84,0.65,6.62,1.67
+0.04,-0.55,0.03,0.84,0.65,6.61,1.67
+0.04,-0.55,0.03,0.84,0.65,6.61,1.67
+0.04,-0.55,0.03,0.84,0.65,6.61,1.67
+0.04,-0.55,0.03,0.84,0.64,6.60,1.67
+0.04,-0.55,0.03,0.84,0.64,6.60,1.67
+0.04,-0.55,0.02,0.83,0.64,6.60,1.67
+0.04,-0.55,0.02,0.83,0.64,6.59,1.67
+0.04,-0.55,0.02,0.83,0.63,6.59,1.67
+0.04,-0.55,0.02,0.83,0.63,6.58,1.67
+0.03,-0.55,0.02,0.83,0.63,6.58,1.67
+0.03,-0.55,0.02,0.83,0.63,6.58,1.67
+0.03,-0.55,0.02,0.83,0.62,6.57,1.67
+0.03,-0.55,0.02,0.83,0.62,6.57,1.67
+0.03,-0.55,0.02,0.83,0.62,6.56,1.67
+0.03,-0.55,0.02,0.83,0.62,6.56,1.67
+0.03,-0.55,0.02,0.83,0.61,6.56,1.67
+0.03,-0.55,0.02,0.83,0.61,6.55,1.67
+0.03,-0.55,0.02,0.83,0.61,6.55,1.67
+0.03,-0.55,0.02,0.83,0.61,6.54,1.67
+0.03,-0.55,0.02,0.83,0.60,6.54,1.67
+0.03,-0.55,0.02,0.83,0.60,6.54,1.67
+0.03,-0.55,0.02,0.83,0.60,6.53,1.66
+0.02,-0.55,0.02,0.83,0.60,6.53,1.66
+0.02,-0.55,0.02,0.83,0.59,6.52,1.66
+0.02,-0.55,0.02,0.83,0.59,6.52,1.66
+0.02,-0.55,0.01,0.83,0.59,6.52,1.66
+0.02,-0.55,0.01,0.83,0.59,6.51,1.66
+0.02,-0.56,0.01,0.83,0.59,6.51,1.66
+0.02,-0.56,0.01,0.83,0.58,6.50,1.66
+0.02,-0.56,0.01,0.83,0.58,6.50,1.66
+0.02,-0.56,0.01,0.83,0.58,6.50,1.66
+0.02,-0.56,0.01,0.83,0.58,6.49,1.66
+0.02,-0.56,0.01,0.83,0.57,6.49,1.66
+0.02,-0.56,0.01,0.83,0.57,6.48,1.66
+0.02,-0.56,0.01,0.83,0.57,6.48,1.66
+0.01,-0.56,0.01,0.83,0.57,6.48,1.66
+0.01,-0.56,0.01,0.83,0.56,6.47,1.66
+0.01,-0.56,0.01,0.83,0.56,6.47,1.66
+0.01,-0.56,0.01,0.83,0.56,6.46,1.66
+0.01,-0.56,0.01,0.83,0.56,6.46,1.66
+0.01,-0.56,0.01,0.83,0.55,6.46,1.66
+0.01,-0.56,0.01,0.83,0.55,6.45,1.66
+0.01,-0.56,0.01,0.83,0.55,6.45,1.66
+0.01,-0.56,0.01,0.83,0.55,6.44,1.66
+0.01,-0.56,0.01,0.83,0.54,6.44,1.66
+0.01,-0.56,0.00,0.83,0.54,6.44,1.66
+0.01,-0.56,0.00,0.83,0.54,6.43,1.66
+0.01,-0.56,0.00,0.83,0.54,6.43,1.66
+0.00,-0.56,0.00,0.83,0.54,6.42,1.65
+0.00,-0.56,0.00,0.83,0.53,6.42,1.65
+0.00,-0.56,0.00,0.83,0.53,6.41,1.65
+0.00,-0.56,0.00,0.83,0.53,6.41,1.65
+0.00,-0.56,0.00,0.83,0.53,6.41,1.65
+0.00,-0.56,0.00,0.83,0.52,6.40,1.65
+0.00,-0.56,0.00,0.83,0.52,6.40,1.65
+-0.00,-0.56,-0.00,0.83,0.52,6.39,1.65
+-0.00,-0.56,-0.00,0.83,0.52,6.39,1.65
+-0.00,-0.56,-0.00,0.83,0.51,6.39,1.65
+-0.00,-0.56,-0.00,0.83,0.51,6.38,1.65
+-0.00,-0.56,-0.00,0.83,0.51,6.38,1.65
+-0.00,-0.56,-0.00,0.83,0.51,6.37,1.65
+-0.01,-0.57,-0.00,0.82,0.51,6.37,1.65
+-0.01,-0.57,-0.00,0.82,0.50,6.37,1.65
+-0.01,-0.57,-0.00,0.82,0.50,6.36,1.65
+-0.01,-0.57,-0.01,0.82,0.50,6.36,1.65
+-0.01,-0.57,-0.01,0.82,0.50,6.35,1.65
+-0.01,-0.57,-0.01,0.82,0.49,6.35,1.65
+-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65
+-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65
+-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65
+-0.01,-0.57,-0.01,0.82,0.48,6.33,1.65
+-0.01,-0.57,-0.01,0.82,0.48,6.33,1.65
+-0.01,-0.57,-0.01,0.82,0.48,6.32,1.65
+-0.01,-0.57,-0.01,0.82,0.48,6.32,1.64
+-0.01,-0.57,-0.01,0.82,0.48,6.31,1.64
+-0.02,-0.57,-0.01,0.82,0.47,6.31,1.64
+-0.02,-0.57,-0.01,0.82,0.47,6.31,1.64
+-0.02,-0.57,-0.01,0.82,0.47,6.30,1.64
+-0.02,-0.57,-0.01,0.82,0.47,6.30,1.64
+-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64
+-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64
+-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64
+-0.02,-0.57,-0.01,0.82,0.46,6.28,1.64
+-0.02,-0.57,-0.02,0.82,0.46,6.28,1.64
+-0.02,-0.57,-0.02,0.82,0.45,6.27,1.64
+-0.02,-0.57,-0.02,0.82,0.45,6.27,1.64
+-0.02,-0.57,-0.02,0.82,0.45,6.26,1.64
+-0.02,-0.57,-0.02,0.82,0.45,6.26,1.64
+-0.03,-0.57,-0.02,0.82,0.45,6.26,1.64
+-0.03,-0.57,-0.02,0.82,0.44,6.25,1.64
+-0.03,-0.57,-0.02,0.82,0.44,6.25,1.64
+-0.03,-0.57,-0.02,0.82,0.44,6.24,1.64
+-0.03,-0.57,-0.02,0.82,0.44,6.24,1.64
+-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64
+-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64
+-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64
+-0.03,-0.57,-0.02,0.82,0.43,6.22,1.63
+-0.03,-0.58,-0.02,0.82,0.43,6.22,1.63
+-0.03,-0.58,-0.02,0.82,0.42,6.21,1.63
+-0.03,-0.58,-0.02,0.82,0.42,6.21,1.63
+-0.03,-0.58,-0.02,0.82,0.42,6.20,1.63
+-0.03,-0.58,-0.02,0.82,0.42,6.20,1.63
+-0.04,-0.58,-0.03,0.82,0.42,6.20,1.63
+-0.04,-0.58,-0.03,0.82,0.41,6.19,1.63
+-0.04,-0.58,-0.03,0.82,0.41,6.19,1.63
+-0.04,-0.58,-0.03,0.82,0.41,6.18,1.63
+-0.04,-0.58,-0.03,0.82,0.41,6.18,1.63
+-0.04,-0.58,-0.03,0.81,0.41,6.17,1.63
+-0.04,-0.58,-0.03,0.81,0.40,6.17,1.63
+-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63
+-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63
+-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63
+-0.04,-0.58,-0.03,0.81,0.39,6.15,1.63
+-0.04,-0.58,-0.03,0.81,0.39,6.15,1.63
+-0.04,-0.58,-0.03,0.81,0.39,6.14,1.63
+-0.05,-0.58,-0.03,0.81,0.39,6.14,1.63
+-0.05,-0.58,-0.03,0.81,0.39,6.13,1.63
+-0.05,-0.58,-0.03,0.81,0.38,6.13,1.62
+-0.05,-0.58,-0.03,0.81,0.38,6.13,1.62
+-0.05,-0.58,-0.03,0.81,0.38,6.12,1.62
+-0.05,-0.58,-0.04,0.81,0.38,6.12,1.62
+-0.05,-0.58,-0.04,0.81,0.38,6.11,1.62
+-0.05,-0.58,-0.04,0.81,0.37,6.11,1.62
+-0.05,-0.58,-0.04,0.81,0.37,6.10,1.62
+-0.05,-0.58,-0.04,0.81,0.37,6.10,1.62
+-0.05,-0.58,-0.04,0.81,0.37,6.09,1.62
+-0.05,-0.58,-0.04,0.81,0.37,6.09,1.62
+-0.05,-0.58,-0.04,0.81,0.36,6.09,1.62
+-0.05,-0.58,-0.04,0.81,0.36,6.08,1.62
+-0.06,-0.58,-0.04,0.81,0.36,6.08,1.62
+-0.06,-0.58,-0.04,0.81,0.36,6.07,1.62
+-0.06,-0.58,-0.04,0.81,0.36,6.07,1.62
+-0.06,-0.58,-0.04,0.81,0.35,6.06,1.62
+-0.06,-0.58,-0.04,0.81,0.35,6.06,1.62
+-0.06,-0.58,-0.04,0.81,0.35,6.05,1.62
+-0.06,-0.58,-0.04,0.81,0.35,6.05,1.62
+-0.06,-0.59,-0.04,0.81,0.35,6.05,1.62
+-0.06,-0.59,-0.04,0.81,0.35,6.04,1.61
+-0.06,-0.59,-0.04,0.81,0.34,6.04,1.61
+-0.06,-0.59,-0.05,0.81,0.34,6.03,1.61
+-0.06,-0.59,-0.05,0.81,0.34,6.03,1.61
+-0.06,-0.59,-0.05,0.81,0.34,6.02,1.61
+-0.06,-0.59,-0.05,0.81,0.34,6.02,1.61
+-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61
+-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61
+-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61
+-0.07,-0.59,-0.05,0.80,0.33,6.00,1.61
+-0.07,-0.59,-0.05,0.80,0.33,6.00,1.61
+-0.07,-0.59,-0.05,0.80,0.32,5.99,1.61
+-0.07,-0.59,-0.05,0.80,0.32,5.99,1.61
+-0.07,-0.59,-0.05,0.80,0.32,5.98,1.61
+-0.07,-0.59,-0.05,0.80,0.32,5.98,1.61
+-0.07,-0.59,-0.05,0.80,0.32,5.97,1.61
+-0.07,-0.59,-0.05,0.80,0.31,5.97,1.61
+-0.07,-0.59,-0.05,0.80,0.31,5.97,1.61
+-0.07,-0.59,-0.05,0.80,0.31,5.96,1.60
+-0.07,-0.59,-0.06,0.80,0.31,5.96,1.60
+-0.08,-0.59,-0.06,0.80,0.31,5.95,1.60
+-0.08,-0.59,-0.06,0.80,0.31,5.95,1.60
+-0.08,-0.59,-0.06,0.80,0.30,5.94,1.60
+-0.08,-0.59,-0.06,0.80,0.30,5.94,1.60
+-0.08,-0.59,-0.06,0.80,0.30,5.93,1.60
+-0.08,-0.59,-0.06,0.80,0.30,5.93,1.60
+-0.08,-0.59,-0.06,0.80,0.30,5.92,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.92,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.92,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.91,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.91,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.90,1.60
+-0.08,-0.59,-0.06,0.80,0.29,5.90,1.60
+-0.08,-0.59,-0.06,0.80,0.28,5.89,1.60
+-0.09,-0.59,-0.06,0.80,0.28,5.89,1.60
+-0.09,-0.59,-0.06,0.80,0.28,5.88,1.60
+-0.09,-0.59,-0.06,0.80,0.28,5.88,1.59
+-0.09,-0.59,-0.07,0.80,0.28,5.87,1.59
+-0.09,-0.59,-0.07,0.80,0.28,5.87,1.59
+-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59
+-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59
+-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59
+-0.09,-0.59,-0.07,0.80,0.27,5.85,1.59
+-0.09,-0.60,-0.07,0.80,0.27,5.85,1.59
+-0.09,-0.60,-0.07,0.80,0.27,5.84,1.59
+-0.09,-0.60,-0.07,0.79,0.26,5.84,1.59
+-0.09,-0.60,-0.07,0.79,0.26,5.83,1.59
+-0.09,-0.60,-0.07,0.79,0.26,5.83,1.59
+-0.10,-0.60,-0.07,0.79,0.26,5.82,1.59
+-0.10,-0.60,-0.07,0.79,0.26,5.82,1.59
+-0.10,-0.60,-0.07,0.79,0.25,5.81,1.59
+-0.10,-0.60,-0.07,0.79,0.25,5.81,1.59
+-0.10,-0.60,-0.07,0.79,0.25,5.80,1.59
+-0.10,-0.60,-0.07,0.79,0.25,5.80,1.58
+-0.10,-0.60,-0.08,0.79,0.25,5.80,1.58
+-0.10,-0.60,-0.08,0.79,0.25,5.79,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.79,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.78,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.78,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.77,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.77,1.58
+-0.10,-0.60,-0.08,0.79,0.24,5.76,1.58
+-0.11,-0.60,-0.08,0.79,0.24,5.76,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.75,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.75,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.74,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.74,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.73,1.58
+-0.11,-0.60,-0.08,0.79,0.23,5.73,1.58
+-0.11,-0.60,-0.08,0.79,0.22,5.73,1.58
+-0.11,-0.60,-0.08,0.79,0.22,5.72,1.57
+-0.11,-0.60,-0.09,0.79,0.22,5.72,1.57
+-0.11,-0.60,-0.09,0.79,0.22,5.71,1.57
+-0.11,-0.60,-0.09,0.79,0.22,5.71,1.57
+-0.11,-0.60,-0.09,0.79,0.22,5.70,1.57
+-0.11,-0.60,-0.09,0.79,0.21,5.70,1.57
+-0.12,-0.60,-0.09,0.79,0.21,5.69,1.57
+-0.12,-0.60,-0.09,0.79,0.21,5.69,1.57
+-0.12,-0.60,-0.09,0.78,0.21,5.68,1.57
+-0.12,-0.60,-0.09,0.78,0.21,5.68,1.57
+-0.12,-0.60,-0.09,0.78,0.21,5.67,1.57
+-0.12,-0.60,-0.09,0.78,0.21,5.67,1.57
+-0.12,-0.60,-0.09,0.78,0.20,5.66,1.57
+-0.12,-0.60,-0.09,0.78,0.20,5.66,1.57
+-0.12,-0.60,-0.09,0.78,0.20,5.65,1.57
+-0.12,-0.60,-0.09,0.78,0.20,5.65,1.57
+-0.12,-0.60,-0.09,0.78,0.20,5.64,1.56
+-0.12,-0.60,-0.09,0.78,0.20,5.64,1.56
+-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56
+-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56
+-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56
+-0.13,-0.60,-0.10,0.78,0.19,5.62,1.56
+-0.13,-0.60,-0.10,0.78,0.19,5.62,1.56
+-0.13,-0.60,-0.10,0.78,0.19,5.61,1.56
+-0.13,-0.61,-0.10,0.78,0.19,5.61,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.60,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.60,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.59,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.59,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.58,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.58,1.56
+-0.13,-0.61,-0.10,0.78,0.18,5.57,1.55
+-0.13,-0.61,-0.10,0.78,0.17,5.57,1.55
+-0.13,-0.61,-0.10,0.78,0.17,5.56,1.55
+-0.13,-0.61,-0.10,0.78,0.17,5.56,1.55
+-0.13,-0.61,-0.11,0.78,0.17,5.55,1.55
+-0.14,-0.61,-0.11,0.78,0.17,5.55,1.55
+-0.14,-0.61,-0.11,0.78,0.17,5.54,1.55
+-0.14,-0.61,-0.11,0.77,0.17,5.54,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.53,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.53,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.52,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.52,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.51,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.51,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.50,1.55
+-0.14,-0.61,-0.11,0.77,0.16,5.50,1.54
+-0.14,-0.61,-0.11,0.77,0.15,5.50,1.54
+-0.14,-0.61,-0.11,0.77,0.15,5.49,1.54
+-0.14,-0.61,-0.11,0.77,0.15,5.49,1.54
+-0.14,-0.61,-0.11,0.77,0.15,5.48,1.54
+-0.15,-0.61,-0.12,0.77,0.15,5.48,1.54
+-0.15,-0.61,-0.12,0.77,0.15,5.47,1.54
+-0.15,-0.61,-0.12,0.77,0.15,5.47,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.46,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.46,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.45,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.45,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.44,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.44,1.54
+-0.15,-0.61,-0.12,0.77,0.14,5.43,1.53
+-0.15,-0.61,-0.12,0.77,0.14,5.43,1.53
+-0.15,-0.61,-0.12,0.77,0.13,5.42,1.53
+-0.15,-0.61,-0.12,0.77,0.13,5.42,1.53
+-0.15,-0.61,-0.12,0.77,0.13,5.41,1.53
+-0.15,-0.61,-0.12,0.77,0.13,5.41,1.53
+-0.16,-0.61,-0.12,0.77,0.13,5.40,1.53
+-0.16,-0.61,-0.12,0.76,0.13,5.40,1.53
+-0.16,-0.61,-0.13,0.76,0.13,5.39,1.53
+-0.16,-0.61,-0.13,0.76,0.13,5.39,1.53
+-0.16,-0.61,-0.13,0.76,0.12,5.38,1.53
+-0.16,-0.61,-0.13,0.76,0.12,5.38,1.53
+-0.16,-0.61,-0.13,0.76,0.12,5.37,1.53
+-0.16,-0.61,-0.13,0.76,0.12,5.37,1.53
+-0.16,-0.61,-0.13,0.76,0.12,5.36,1.52
+-0.16,-0.61,-0.13,0.76,0.12,5.36,1.52
+-0.16,-0.61,-0.13,0.76,0.12,5.35,1.52
+-0.16,-0.61,-0.13,0.76,0.12,5.35,1.52
+-0.16,-0.61,-0.13,0.76,0.12,5.34,1.52
+-0.16,-0.61,-0.13,0.76,0.11,5.34,1.52
+-0.16,-0.61,-0.13,0.76,0.11,5.33,1.52
+-0.17,-0.61,-0.13,0.76,0.11,5.33,1.52
+-0.17,-0.61,-0.13,0.76,0.11,5.32,1.52
+-0.17,-0.61,-0.13,0.76,0.11,5.32,1.52
+-0.17,-0.61,-0.14,0.76,0.11,5.31,1.52
+-0.17,-0.61,-0.14,0.76,0.11,5.31,1.52
+-0.17,-0.62,-0.14,0.76,0.11,5.30,1.52
+-0.17,-0.62,-0.14,0.76,0.11,5.30,1.52
+-0.17,-0.62,-0.14,0.76,0.10,5.29,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.29,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.28,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.28,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.27,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.27,1.51
+-0.17,-0.62,-0.14,0.76,0.10,5.26,1.51
+-0.17,-0.62,-0.14,0.75,0.10,5.26,1.51
+-0.17,-0.62,-0.14,0.75,0.10,5.25,1.51
+-0.18,-0.62,-0.14,0.75,0.09,5.25,1.51
+-0.18,-0.62,-0.14,0.75,0.09,5.24,1.51
+-0.18,-0.62,-0.14,0.75,0.09,5.24,1.51
+-0.18,-0.62,-0.15,0.75,0.09,5.23,1.51
+-0.18,-0.62,-0.15,0.75,0.09,5.23,1.50
+-0.18,-0.62,-0.15,0.75,0.09,5.22,1.50
+-0.18,-0.62,-0.15,0.75,0.09,5.22,1.50
+-0.18,-0.62,-0.15,0.75,0.09,5.21,1.50
+-0.18,-0.62,-0.15,0.75,0.09,5.21,1.50
+-0.18,-0.62,-0.15,0.75,0.09,5.20,1.50
+-0.18,-0.62,-0.15,0.75,0.08,5.20,1.50
+-0.18,-0.62,-0.15,0.75,0.08,5.19,1.50
+-0.18,-0.62,-0.15,0.75,0.08,5.19,1.50
+-0.18,-0.62,-0.15,0.75,0.08,5.18,1.50
+-0.18,-0.62,-0.15,0.75,0.08,5.18,1.50
+-0.19,-0.62,-0.15,0.75,0.08,5.17,1.50
+-0.19,-0.62,-0.15,0.75,0.08,5.17,1.50
+-0.19,-0.62,-0.15,0.75,0.08,5.16,1.49
+-0.19,-0.62,-0.15,0.75,0.08,5.16,1.49
+-0.19,-0.62,-0.16,0.75,0.08,5.15,1.49
+-0.19,-0.62,-0.16,0.75,0.07,5.15,1.49
+-0.19,-0.62,-0.16,0.75,0.07,5.14,1.49
+-0.19,-0.62,-0.16,0.75,0.07,5.14,1.49
+-0.19,-0.62,-0.16,0.75,0.07,5.13,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.13,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.12,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.12,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.11,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.11,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.10,1.49
+-0.19,-0.62,-0.16,0.74,0.07,5.10,1.48
+-0.20,-0.62,-0.16,0.74,0.06,5.09,1.48
+-0.20,-0.62,-0.16,0.74,0.06,5.09,1.48
+-0.20,-0.62,-0.16,0.74,0.06,5.08,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.08,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.07,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.07,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.06,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.06,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.05,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.05,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.04,1.48
+-0.20,-0.62,-0.17,0.74,0.06,5.04,1.48
+-0.20,-0.62,-0.17,0.74,0.05,5.03,1.47
+-0.20,-0.62,-0.17,0.74,0.05,5.03,1.47
+-0.20,-0.62,-0.17,0.74,0.05,5.02,1.47
+-0.20,-0.62,-0.17,0.74,0.05,5.02,1.47
+-0.21,-0.62,-0.17,0.74,0.05,5.01,1.47
+-0.21,-0.62,-0.17,0.74,0.05,5.00,1.47
+-0.21,-0.62,-0.17,0.73,0.05,5.00,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.99,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.99,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.98,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.98,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.97,1.47
+-0.21,-0.62,-0.18,0.73,0.05,4.97,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.96,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.96,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.95,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.95,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.94,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.94,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.93,1.46
+-0.21,-0.62,-0.18,0.73,0.04,4.93,1.46
+-0.22,-0.62,-0.18,0.73,0.04,4.92,1.46
+-0.22,-0.62,-0.18,0.73,0.04,4.92,1.46
+-0.22,-0.62,-0.19,0.73,0.04,4.91,1.46
+-0.22,-0.62,-0.19,0.73,0.04,4.91,1.45
+-0.22,-0.62,-0.19,0.73,0.04,4.90,1.45
+-0.22,-0.62,-0.19,0.73,0.04,4.90,1.45
+-0.22,-0.62,-0.19,0.73,0.03,4.89,1.45
+-0.22,-0.62,-0.19,0.73,0.03,4.89,1.45
+-0.22,-0.62,-0.19,0.73,0.03,4.88,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.88,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.87,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.87,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.86,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.85,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.85,1.45
+-0.22,-0.62,-0.19,0.72,0.03,4.84,1.44
+-0.22,-0.62,-0.19,0.72,0.03,4.84,1.44
+-0.23,-0.62,-0.20,0.72,0.03,4.83,1.44
+-0.23,-0.62,-0.20,0.72,0.03,4.83,1.44
+-0.23,-0.63,-0.20,0.72,0.03,4.82,1.44
+-0.23,-0.63,-0.20,0.72,0.03,4.82,1.44
+-0.23,-0.63,-0.20,0.72,0.03,4.81,1.44
+-0.23,-0.63,-0.20,0.72,0.03,4.81,1.44
+-0.23,-0.63,-0.20,0.72,0.02,4.80,1.44
+-0.23,-0.63,-0.20,0.72,0.02,4.80,1.44
+-0.23,-0.63,-0.20,0.72,0.02,4.79,1.44
+-0.23,-0.63,-0.20,0.72,0.02,4.79,1.44
+-0.23,-0.63,-0.20,0.72,0.02,4.78,1.43
+-0.23,-0.63,-0.20,0.72,0.02,4.78,1.43
+-0.23,-0.63,-0.20,0.72,0.02,4.77,1.43
+-0.23,-0.63,-0.20,0.72,0.02,4.77,1.43
+-0.23,-0.63,-0.20,0.72,0.02,4.76,1.43
+-0.23,-0.63,-0.21,0.71,0.02,4.76,1.43
+-0.23,-0.63,-0.21,0.71,0.02,4.75,1.43
+-0.24,-0.63,-0.21,0.71,0.02,4.75,1.43
+-0.24,-0.63,-0.21,0.71,0.02,4.74,1.43
+-0.24,-0.63,-0.21,0.71,0.02,4.73,1.43
+-0.24,-0.63,-0.21,0.71,0.02,4.73,1.43
+-0.24,-0.63,-0.21,0.71,0.02,4.72,1.42
+-0.24,-0.63,-0.21,0.71,0.02,4.72,1.42
+-0.24,-0.63,-0.21,0.71,0.02,4.71,1.42
+-0.24,-0.63,-0.21,0.71,0.02,4.71,1.42
+-0.24,-0.63,-0.21,0.71,0.02,4.70,1.42
+-0.24,-0.63,-0.21,0.71,0.01,4.70,1.42
+-0.24,-0.63,-0.21,0.71,0.01,4.69,1.42
+-0.24,-0.63,-0.21,0.71,0.01,4.69,1.42
+-0.24,-0.63,-0.21,0.71,0.01,4.68,1.42
+-0.24,-0.63,-0.22,0.71,0.01,4.68,1.42
+-0.24,-0.63,-0.22,0.71,0.01,4.67,1.42
+-0.24,-0.63,-0.22,0.71,0.01,4.67,1.42
+-0.24,-0.63,-0.22,0.71,0.01,4.66,1.41
+-0.25,-0.63,-0.22,0.71,0.01,4.66,1.41
+-0.25,-0.63,-0.22,0.71,0.01,4.65,1.41
+-0.25,-0.63,-0.22,0.71,0.01,4.65,1.41
+-0.25,-0.63,-0.22,0.71,0.01,4.64,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.63,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.63,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.62,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.62,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.61,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.61,1.41
+-0.25,-0.63,-0.22,0.70,0.01,4.60,1.40
+-0.25,-0.63,-0.22,0.70,0.01,4.60,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.59,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.59,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.58,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.58,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.57,1.40
+-0.25,-0.63,-0.23,0.70,0.01,4.57,1.40
+-0.26,-0.63,-0.23,0.70,0.01,4.56,1.40
+-0.26,-0.63,-0.23,0.70,0.01,4.55,1.40
+-0.26,-0.63,-0.23,0.70,0.01,4.55,1.40
+-0.26,-0.63,-0.23,0.70,0.01,4.54,1.39
+-0.26,-0.63,-0.23,0.70,0.00,4.54,1.39
+-0.26,-0.63,-0.23,0.70,0.00,4.53,1.39
+-0.26,-0.63,-0.23,0.70,0.00,4.53,1.39
+-0.26,-0.63,-0.23,0.70,0.00,4.52,1.39
+-0.26,-0.63,-0.23,0.69,0.00,4.52,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.51,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.51,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.50,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.50,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.49,1.39
+-0.26,-0.63,-0.24,0.69,0.00,4.49,1.38
+-0.26,-0.63,-0.24,0.69,0.00,4.48,1.38
+-0.26,-0.63,-0.24,0.69,0.00,4.48,1.38
+-0.26,-0.63,-0.24,0.69,0.00,4.47,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.46,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.46,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.45,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.45,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.44,1.38
+-0.27,-0.63,-0.24,0.69,0.00,4.44,1.38
+-0.27,-0.63,-0.25,0.69,0.00,4.43,1.38
+-0.27,-0.63,-0.25,0.69,0.00,4.43,1.37
+-0.27,-0.63,-0.25,0.69,0.00,4.42,1.37
+-0.27,-0.63,-0.25,0.69,0.00,4.42,1.37
+-0.27,-0.63,-0.25,0.69,0.00,4.41,1.37
+-0.27,-0.63,-0.25,0.69,0.00,4.41,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.40,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.39,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.39,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.38,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.38,1.37
+-0.27,-0.63,-0.25,0.68,0.00,4.37,1.36
+-0.28,-0.63,-0.25,0.68,0.00,4.37,1.36
+-0.28,-0.63,-0.25,0.68,0.00,4.36,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.36,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.35,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.35,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.34,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.34,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.33,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.32,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.32,1.36
+-0.28,-0.63,-0.26,0.68,0.00,4.31,1.35
+-0.28,-0.63,-0.26,0.68,0.00,4.31,1.35
+-0.28,-0.63,-0.26,0.68,0.00,4.30,1.35
+-0.28,-0.63,-0.26,0.68,0.00,4.30,1.35
+-0.28,-0.63,-0.26,0.68,0.00,4.29,1.35
+-0.28,-0.63,-0.26,0.67,0.00,4.29,1.35
+-0.28,-0.63,-0.26,0.67,0.00,4.28,1.35
+-0.28,-0.63,-0.27,0.67,0.00,4.28,1.35
+-0.28,-0.63,-0.27,0.67,0.00,4.27,1.35
+-0.29,-0.63,-0.27,0.67,0.00,4.27,1.35
+-0.29,-0.63,-0.27,0.67,0.00,4.26,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.25,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.25,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.24,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.24,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.23,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.23,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.22,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.22,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.21,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.21,1.34
+-0.29,-0.63,-0.27,0.67,0.00,4.20,1.33
+-0.29,-0.63,-0.28,0.67,0.00,4.20,1.33
+-0.29,-0.63,-0.28,0.67,0.00,4.19,1.33
+-0.29,-0.63,-0.28,0.67,0.00,4.18,1.33
+-0.29,-0.63,-0.28,0.67,0.00,4.18,1.33
+-0.29,-0.63,-0.28,0.66,0.00,4.17,1.33
+-0.29,-0.63,-0.28,0.66,0.00,4.17,1.33
+-0.30,-0.63,-0.28,0.66,0.00,4.16,1.33
+-0.30,-0.63,-0.28,0.66,0.00,4.16,1.33
+-0.30,-0.63,-0.28,0.66,0.00,4.15,1.33
+-0.30,-0.63,-0.28,0.66,0.00,4.15,1.32
+-0.30,-0.63,-0.28,0.66,0.00,4.14,1.32
+-0.30,-0.63,-0.28,0.66,0.00,4.14,1.32
+-0.30,-0.63,-0.28,0.66,0.00,4.13,1.32
+-0.30,-0.63,-0.28,0.66,0.00,4.12,1.32
+-0.30,-0.63,-0.28,0.66,0.00,4.12,1.32
+-0.30,-0.63,-0.29,0.66,0.00,4.11,1.32
+-0.30,-0.63,-0.29,0.66,0.01,4.11,1.32
+-0.30,-0.63,-0.29,0.66,0.01,4.10,1.32
+-0.30,-0.63,-0.29,0.66,0.01,4.10,1.32
+-0.30,-0.63,-0.29,0.66,0.01,4.09,1.31
+-0.30,-0.63,-0.29,0.66,0.01,4.09,1.31
+-0.30,-0.63,-0.29,0.66,0.01,4.08,1.31
+-0.30,-0.63,-0.29,0.66,0.01,4.08,1.31
+-0.30,-0.63,-0.29,0.66,0.01,4.07,1.31
+-0.30,-0.63,-0.29,0.65,0.01,4.06,1.31
+-0.30,-0.63,-0.29,0.65,0.01,4.06,1.31
+-0.31,-0.63,-0.29,0.65,0.01,4.05,1.31
+-0.31,-0.63,-0.29,0.65,0.01,4.05,1.31
+-0.31,-0.63,-0.29,0.65,0.01,4.04,1.31
+-0.31,-0.63,-0.29,0.65,0.01,4.04,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.03,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.03,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.02,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.02,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.01,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.00,1.30
+-0.31,-0.63,-0.30,0.65,0.01,4.00,1.30
+-0.31,-0.63,-0.30,0.65,0.01,3.99,1.30
+-0.31,-0.63,-0.30,0.65,0.01,3.99,1.30
+-0.31,-0.63,-0.30,0.65,0.01,3.98,1.29
+-0.31,-0.63,-0.30,0.65,0.01,3.98,1.29
+-0.31,-0.63,-0.30,0.65,0.01,3.97,1.29
+-0.31,-0.63,-0.30,0.65,0.01,3.97,1.29
+-0.31,-0.63,-0.30,0.65,0.01,3.96,1.29
+-0.31,-0.63,-0.31,0.64,0.01,3.96,1.29
+-0.31,-0.63,-0.31,0.64,0.02,3.95,1.29
+-0.32,-0.63,-0.31,0.64,0.02,3.94,1.29
+-0.32,-0.63,-0.31,0.64,0.02,3.94,1.29
+-0.32,-0.63,-0.31,0.64,0.02,3.93,1.29
+-0.32,-0.63,-0.31,0.64,0.02,3.93,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.92,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.92,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.91,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.91,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.90,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.90,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.89,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.88,1.28
+-0.32,-0.63,-0.31,0.64,0.02,3.88,1.28
+-0.32,-0.63,-0.32,0.64,0.02,3.87,1.27
+-0.32,-0.63,-0.32,0.64,0.02,3.87,1.27
+-0.32,-0.63,-0.32,0.64,0.02,3.86,1.27
+-0.32,-0.63,-0.32,0.64,0.02,3.86,1.27
+-0.32,-0.63,-0.32,0.64,0.02,3.85,1.27
+-0.32,-0.63,-0.32,0.63,0.02,3.85,1.27
+-0.32,-0.63,-0.32,0.63,0.03,3.84,1.27
+-0.32,-0.63,-0.32,0.63,0.03,3.83,1.27
+-0.33,-0.63,-0.32,0.63,0.03,3.83,1.27
+-0.33,-0.62,-0.32,0.63,0.03,3.82,1.26
+-0.33,-0.62,-0.32,0.63,0.03,3.82,1.26
+-0.33,-0.62,-0.32,0.63,0.03,3.81,1.26
+-0.33,-0.62,-0.32,0.63,0.03,3.81,1.26
+-0.33,-0.62,-0.32,0.63,0.03,3.80,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.80,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.79,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.79,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.78,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.77,1.26
+-0.33,-0.62,-0.33,0.63,0.03,3.77,1.25
+-0.33,-0.62,-0.33,0.63,0.03,3.76,1.25
+-0.33,-0.62,-0.33,0.63,0.03,3.76,1.25
+-0.33,-0.62,-0.33,0.63,0.04,3.75,1.25
+-0.33,-0.62,-0.33,0.63,0.04,3.75,1.25
+-0.33,-0.62,-0.33,0.62,0.04,3.74,1.25
+-0.33,-0.62,-0.33,0.62,0.04,3.74,1.25
+-0.33,-0.62,-0.33,0.62,0.04,3.73,1.25
+-0.33,-0.62,-0.33,0.62,0.04,3.72,1.25
+-0.33,-0.62,-0.33,0.62,0.04,3.72,1.25
+-0.33,-0.62,-0.34,0.62,0.04,3.71,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.71,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.70,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.70,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.69,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.69,1.24
+-0.34,-0.62,-0.34,0.62,0.04,3.68,1.24
+-0.34,-0.62,-0.34,0.62,0.05,3.68,1.24
+-0.34,-0.62,-0.34,0.62,0.05,3.67,1.24
+-0.34,-0.62,-0.34,0.62,0.05,3.66,1.23
+-0.34,-0.62,-0.34,0.62,0.05,3.66,1.23
+-0.34,-0.62,-0.34,0.62,0.05,3.65,1.23
+-0.34,-0.62,-0.34,0.62,0.05,3.65,1.23
+-0.34,-0.62,-0.34,0.62,0.05,3.64,1.23
+-0.34,-0.62,-0.35,0.61,0.05,3.64,1.23
+-0.34,-0.62,-0.35,0.61,0.05,3.63,1.23
+-0.34,-0.62,-0.35,0.61,0.05,3.63,1.23
+-0.34,-0.62,-0.35,0.61,0.05,3.62,1.23
+-0.34,-0.62,-0.35,0.61,0.05,3.61,1.23
+-0.34,-0.62,-0.35,0.61,0.06,3.61,1.22
+-0.34,-0.62,-0.35,0.61,0.06,3.60,1.22
+-0.34,-0.62,-0.35,0.61,0.06,3.60,1.22
+-0.34,-0.62,-0.35,0.61,0.06,3.59,1.22
+-0.34,-0.62,-0.35,0.61,0.06,3.59,1.22
+-0.35,-0.62,-0.35,0.61,0.06,3.58,1.22
+-0.35,-0.62,-0.35,0.61,0.06,3.58,1.22
+-0.35,-0.62,-0.35,0.61,0.06,3.57,1.22
+-0.35,-0.62,-0.35,0.61,0.06,3.57,1.22
+-0.35,-0.62,-0.35,0.61,0.06,3.56,1.21
+-0.35,-0.62,-0.36,0.61,0.06,3.55,1.21
+-0.35,-0.62,-0.36,0.61,0.07,3.55,1.21
+-0.35,-0.62,-0.36,0.61,0.07,3.54,1.21
+-0.35,-0.62,-0.36,0.61,0.07,3.54,1.21
+-0.35,-0.62,-0.36,0.60,0.07,3.53,1.21
+-0.35,-0.62,-0.36,0.60,0.07,3.53,1.21
+-0.35,-0.62,-0.36,0.60,0.07,3.52,1.21
+-0.35,-0.62,-0.36,0.60,0.07,3.52,1.21
+-0.35,-0.62,-0.36,0.60,0.07,3.51,1.20
+-0.35,-0.62,-0.36,0.60,0.07,3.50,1.20
+-0.35,-0.62,-0.36,0.60,0.07,3.50,1.20
+-0.35,-0.62,-0.36,0.60,0.07,3.49,1.20
+-0.35,-0.62,-0.36,0.60,0.08,3.49,1.20
+-0.35,-0.62,-0.36,0.60,0.08,3.48,1.20
+-0.35,-0.62,-0.37,0.60,0.08,3.48,1.20
+-0.35,-0.62,-0.37,0.60,0.08,3.47,1.20
+-0.35,-0.62,-0.37,0.60,0.08,3.47,1.20
+-0.35,-0.62,-0.37,0.60,0.08,3.46,1.20
+-0.36,-0.62,-0.37,0.60,0.08,3.45,1.19
+-0.36,-0.62,-0.37,0.60,0.08,3.45,1.19
+-0.36,-0.62,-0.37,0.60,0.08,3.44,1.19
+-0.36,-0.62,-0.37,0.60,0.08,3.44,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.43,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.43,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.42,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.42,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.41,1.19
+-0.36,-0.62,-0.37,0.59,0.09,3.41,1.18
+-0.36,-0.62,-0.37,0.59,0.09,3.40,1.18
+-0.36,-0.62,-0.38,0.59,0.09,3.39,1.18
+-0.36,-0.62,-0.38,0.59,0.09,3.39,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.38,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.38,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.37,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.37,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.36,1.18
+-0.36,-0.62,-0.38,0.59,0.10,3.36,1.17
+-0.36,-0.62,-0.38,0.59,0.10,3.35,1.17
+-0.36,-0.62,-0.38,0.59,0.10,3.34,1.17
+-0.36,-0.62,-0.38,0.59,0.10,3.34,1.17
+-0.36,-0.62,-0.38,0.59,0.11,3.33,1.17
+-0.36,-0.62,-0.38,0.58,0.11,3.33,1.17
+-0.37,-0.61,-0.38,0.58,0.11,3.32,1.17
+-0.37,-0.61,-0.39,0.58,0.11,3.32,1.17
+-0.37,-0.61,-0.39,0.58,0.11,3.31,1.17
+-0.37,-0.61,-0.39,0.58,0.11,3.31,1.16
+-0.37,-0.61,-0.39,0.58,0.11,3.30,1.16
+-0.37,-0.61,-0.39,0.58,0.11,3.29,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.29,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.28,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.28,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.27,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.27,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.26,1.16
+-0.37,-0.61,-0.39,0.58,0.12,3.26,1.15
+-0.37,-0.61,-0.39,0.58,0.12,3.25,1.15
+-0.37,-0.61,-0.39,0.58,0.13,3.24,1.15
+-0.37,-0.61,-0.39,0.58,0.13,3.24,1.15
+-0.37,-0.61,-0.40,0.58,0.13,3.23,1.15
+-0.37,-0.61,-0.40,0.57,0.13,3.23,1.15
+-0.37,-0.61,-0.40,0.57,0.13,3.22,1.15
+-0.37,-0.61,-0.40,0.57,0.13,3.22,1.15
+-0.37,-0.61,-0.40,0.57,0.13,3.21,1.15
+-0.37,-0.61,-0.40,0.57,0.13,3.21,1.14
+-0.37,-0.61,-0.40,0.57,0.14,3.20,1.14
+-0.37,-0.61,-0.40,0.57,0.14,3.20,1.14
+-0.37,-0.61,-0.40,0.57,0.14,3.19,1.14
+-0.37,-0.61,-0.40,0.57,0.14,3.18,1.14
+-0.38,-0.61,-0.40,0.57,0.14,3.18,1.14
+-0.38,-0.61,-0.40,0.57,0.14,3.17,1.14
+-0.38,-0.61,-0.40,0.57,0.14,3.17,1.14
+-0.38,-0.61,-0.40,0.57,0.15,3.16,1.14
+-0.38,-0.61,-0.41,0.57,0.15,3.16,1.13
+-0.38,-0.61,-0.41,0.57,0.15,3.15,1.13
+-0.38,-0.61,-0.41,0.57,0.15,3.15,1.13
+-0.38,-0.61,-0.41,0.57,0.15,3.14,1.13
+-0.38,-0.61,-0.41,0.57,0.15,3.13,1.13
+-0.38,-0.61,-0.41,0.56,0.15,3.13,1.13
+-0.38,-0.61,-0.41,0.56,0.16,3.12,1.13
+-0.38,-0.61,-0.41,0.56,0.16,3.12,1.13
+-0.38,-0.61,-0.41,0.56,0.16,3.11,1.13
+-0.38,-0.61,-0.41,0.56,0.16,3.11,1.12
+-0.38,-0.61,-0.41,0.56,0.16,3.10,1.12
+-0.38,-0.61,-0.41,0.56,0.16,3.10,1.12
+-0.38,-0.61,-0.41,0.56,0.16,3.09,1.12
+-0.38,-0.61,-0.41,0.56,0.17,3.08,1.12
+-0.38,-0.61,-0.41,0.56,0.17,3.08,1.12
+-0.38,-0.61,-0.42,0.56,0.17,3.07,1.12
+-0.38,-0.61,-0.42,0.56,0.17,3.07,1.12
+-0.38,-0.61,-0.42,0.56,0.17,3.06,1.12
+-0.38,-0.61,-0.42,0.56,0.17,3.06,1.11
+-0.38,-0.61,-0.42,0.56,0.17,3.05,1.11
+-0.38,-0.61,-0.42,0.56,0.18,3.05,1.11
+-0.38,-0.61,-0.42,0.56,0.18,3.04,1.11
+-0.38,-0.61,-0.42,0.55,0.18,3.03,1.11
+-0.39,-0.61,-0.42,0.55,0.18,3.03,1.11
+-0.39,-0.61,-0.42,0.55,0.18,3.02,1.11
+-0.39,-0.61,-0.42,0.55,0.18,3.02,1.11
+-0.39,-0.61,-0.42,0.55,0.18,3.01,1.11
+-0.39,-0.61,-0.42,0.55,0.19,3.01,1.10
+-0.39,-0.60,-0.42,0.55,0.19,3.00,1.10
+-0.39,-0.60,-0.43,0.55,0.19,3.00,1.10
+-0.39,-0.60,-0.43,0.55,0.19,2.99,1.10
+-0.39,-0.60,-0.43,0.55,0.19,2.99,1.10
+-0.39,-0.60,-0.43,0.55,0.19,2.98,1.10
+-0.39,-0.60,-0.43,0.55,0.20,2.97,1.10
+-0.39,-0.60,-0.43,0.55,0.20,2.97,1.10
+-0.39,-0.60,-0.43,0.55,0.20,2.96,1.10
+-0.39,-0.60,-0.43,0.55,0.20,2.96,1.09
+-0.39,-0.60,-0.43,0.55,0.20,2.95,1.09
+-0.39,-0.60,-0.43,0.55,0.20,2.95,1.09
+-0.39,-0.60,-0.43,0.55,0.21,2.94,1.09
+-0.39,-0.60,-0.43,0.54,0.21,2.94,1.09
+-0.39,-0.60,-0.43,0.54,0.21,2.93,1.09
+-0.39,-0.60,-0.43,0.54,0.21,2.92,1.09
+-0.39,-0.60,-0.43,0.54,0.21,2.92,1.09
+-0.39,-0.60,-0.44,0.54,0.21,2.91,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.91,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.90,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.90,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.89,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.89,1.08
+-0.39,-0.60,-0.44,0.54,0.22,2.88,1.08
+-0.40,-0.60,-0.44,0.54,0.23,2.88,1.08
+-0.40,-0.60,-0.44,0.54,0.23,2.87,1.08
+-0.40,-0.60,-0.44,0.54,0.23,2.86,1.07
+-0.40,-0.60,-0.44,0.54,0.23,2.86,1.07
+-0.40,-0.60,-0.44,0.54,0.23,2.85,1.07
+-0.40,-0.60,-0.44,0.54,0.23,2.85,1.07
+-0.40,-0.60,-0.44,0.54,0.24,2.84,1.07
+-0.40,-0.60,-0.45,0.53,0.24,2.84,1.07
+-0.40,-0.60,-0.45,0.53,0.24,2.83,1.07
+-0.40,-0.60,-0.45,0.53,0.24,2.83,1.07
+-0.40,-0.60,-0.45,0.53,0.24,2.82,1.07
+-0.40,-0.60,-0.45,0.53,0.25,2.81,1.06
+-0.40,-0.60,-0.45,0.53,0.25,2.81,1.06
+-0.40,-0.60,-0.45,0.53,0.25,2.80,1.06
+-0.40,-0.60,-0.45,0.53,0.25,2.80,1.06
+-0.40,-0.60,-0.45,0.53,0.25,2.79,1.06
+-0.40,-0.60,-0.45,0.53,0.25,2.79,1.06
+-0.40,-0.60,-0.45,0.53,0.26,2.78,1.06
+-0.40,-0.60,-0.45,0.53,0.26,2.78,1.06
+-0.40,-0.60,-0.45,0.53,0.26,2.77,1.06
+-0.40,-0.60,-0.45,0.53,0.26,2.77,1.05
+-0.40,-0.60,-0.45,0.53,0.26,2.76,1.05
+-0.40,-0.60,-0.46,0.53,0.27,2.75,1.05
+-0.40,-0.59,-0.46,0.53,0.27,2.75,1.05
+-0.40,-0.59,-0.46,0.52,0.27,2.74,1.05
+-0.40,-0.59,-0.46,0.52,0.27,2.74,1.05
+-0.40,-0.59,-0.46,0.52,0.27,2.73,1.05
+-0.40,-0.59,-0.46,0.52,0.27,2.73,1.05
+-0.40,-0.59,-0.46,0.52,0.28,2.72,1.04
+-0.40,-0.59,-0.46,0.52,0.28,2.72,1.04
+-0.40,-0.59,-0.46,0.52,0.28,2.71,1.04
+-0.41,-0.59,-0.46,0.52,0.28,2.70,1.04
+-0.41,-0.59,-0.46,0.52,0.28,2.70,1.04
+-0.41,-0.59,-0.46,0.52,0.29,2.69,1.04
+-0.41,-0.59,-0.46,0.52,0.29,2.69,1.04
+-0.41,-0.59,-0.46,0.52,0.29,2.68,1.04
+-0.41,-0.59,-0.46,0.52,0.29,2.68,1.04
+-0.41,-0.59,-0.47,0.52,0.29,2.67,1.03
+-0.41,-0.59,-0.47,0.52,0.30,2.67,1.03
+-0.41,-0.59,-0.47,0.52,0.30,2.66,1.03
+-0.41,-0.59,-0.47,0.52,0.30,2.66,1.03
+-0.41,-0.59,-0.47,0.51,0.30,2.65,1.03
+-0.41,-0.59,-0.47,0.51,0.30,2.64,1.03
+-0.41,-0.59,-0.47,0.51,0.31,2.64,1.03
+-0.41,-0.59,-0.47,0.51,0.31,2.63,1.03
+-0.41,-0.59,-0.47,0.51,0.31,2.63,1.03
+-0.41,-0.59,-0.47,0.51,0.31,2.62,1.02
+-0.41,-0.59,-0.47,0.51,0.31,2.62,1.02
+-0.41,-0.59,-0.47,0.51,0.32,2.61,1.02
+-0.41,-0.59,-0.47,0.51,0.32,2.61,1.02
+-0.41,-0.59,-0.47,0.51,0.32,2.60,1.02
+-0.41,-0.59,-0.48,0.51,0.32,2.60,1.02
+-0.41,-0.59,-0.48,0.51,0.32,2.59,1.02
+-0.41,-0.59,-0.48,0.51,0.33,2.58,1.02
+-0.41,-0.59,-0.48,0.51,0.33,2.58,1.01
+-0.41,-0.59,-0.48,0.51,0.33,2.57,1.01
+-0.41,-0.59,-0.48,0.51,0.33,2.57,1.01
+-0.41,-0.59,-0.48,0.51,0.34,2.56,1.01
+-0.41,-0.59,-0.48,0.50,0.34,2.56,1.01
+-0.41,-0.59,-0.48,0.50,0.34,2.55,1.01
+-0.41,-0.59,-0.48,0.50,0.34,2.55,1.01
+-0.41,-0.59,-0.48,0.50,0.34,2.54,1.01
+-0.41,-0.59,-0.48,0.50,0.35,2.54,1.01
+-0.41,-0.58,-0.48,0.50,0.35,2.53,1.00
+-0.42,-0.58,-0.48,0.50,0.35,2.52,1.00
+-0.42,-0.58,-0.48,0.50,0.35,2.52,1.00
+-0.42,-0.58,-0.49,0.50,0.35,2.51,1.00
+-0.42,-0.58,-0.49,0.50,0.36,2.51,1.00
+-0.42,-0.58,-0.49,0.50,0.36,2.50,1.00
+-0.42,-0.58,-0.49,0.50,0.36,2.50,1.00
+-0.42,-0.58,-0.49,0.50,0.36,2.49,1.00
+-0.42,-0.58,-0.49,0.50,0.37,2.49,0.99
+-0.42,-0.58,-0.49,0.50,0.37,2.48,0.99
+-0.42,-0.58,-0.49,0.50,0.37,2.48,0.99
+-0.42,-0.58,-0.49,0.50,0.37,2.47,0.99
+-0.42,-0.58,-0.49,0.50,0.37,2.46,0.99
+-0.42,-0.58,-0.49,0.49,0.38,2.46,0.99
+-0.42,-0.58,-0.49,0.49,0.38,2.45,0.99
+-0.42,-0.58,-0.49,0.49,0.38,2.45,0.99
+-0.42,-0.58,-0.49,0.49,0.38,2.44,0.99
+-0.42,-0.58,-0.49,0.49,0.39,2.44,0.98
+-0.42,-0.58,-0.50,0.49,0.39,2.43,0.98
+-0.42,-0.58,-0.50,0.49,0.39,2.43,0.98
+-0.42,-0.58,-0.50,0.49,0.39,2.42,0.98
+-0.42,-0.58,-0.50,0.49,0.39,2.42,0.98
+-0.42,-0.58,-0.50,0.49,0.40,2.41,0.98
+-0.42,-0.58,-0.50,0.49,0.40,2.41,0.98
+-0.42,-0.58,-0.50,0.49,0.40,2.40,0.98
+-0.42,-0.58,-0.50,0.49,0.40,2.39,0.97
+-0.42,-0.58,-0.50,0.49,0.41,2.39,0.97
+-0.42,-0.58,-0.50,0.49,0.41,2.38,0.97
+-0.42,-0.58,-0.50,0.49,0.41,2.38,0.97
+-0.42,-0.58,-0.50,0.49,0.41,2.37,0.97
+-0.42,-0.58,-0.50,0.48,0.41,2.37,0.97
+-0.42,-0.58,-0.50,0.48,0.42,2.36,0.97
+-0.42,-0.58,-0.51,0.48,0.42,2.36,0.97
+-0.42,-0.58,-0.51,0.48,0.42,2.35,0.97
+-0.42,-0.58,-0.51,0.48,0.42,2.35,0.96
+-0.42,-0.58,-0.51,0.48,0.43,2.34,0.96
+-0.42,-0.57,-0.51,0.48,0.43,2.33,0.96
+-0.43,-0.57,-0.51,0.48,0.43,2.33,0.96
+-0.43,-0.57,-0.51,0.48,0.43,2.32,0.96
+-0.43,-0.57,-0.51,0.48,0.44,2.32,0.96
+-0.43,-0.57,-0.51,0.48,0.44,2.31,0.96
+-0.43,-0.57,-0.51,0.48,0.44,2.31,0.96
+-0.43,-0.57,-0.51,0.48,0.44,2.30,0.95
+-0.43,-0.57,-0.51,0.48,0.45,2.30,0.95
+-0.43,-0.57,-0.51,0.48,0.45,2.29,0.95
+-0.43,-0.57,-0.51,0.48,0.45,2.29,0.95
+-0.43,-0.57,-0.51,0.48,0.45,2.28,0.95
+-0.43,-0.57,-0.52,0.47,0.46,2.28,0.95
+-0.43,-0.57,-0.52,0.47,0.46,2.27,0.95
+-0.43,-0.57,-0.52,0.47,0.46,2.26,0.95
+-0.43,-0.57,-0.52,0.47,0.46,2.26,0.95
+-0.43,-0.57,-0.52,0.47,0.47,2.25,0.94
+-0.43,-0.57,-0.52,0.47,0.47,2.25,0.94
+-0.43,-0.57,-0.52,0.47,0.47,2.24,0.94
+-0.43,-0.57,-0.52,0.47,0.47,2.24,0.94
+-0.43,-0.57,-0.52,0.47,0.48,2.23,0.94
+-0.43,-0.57,-0.52,0.47,0.48,2.23,0.94
+-0.43,-0.57,-0.52,0.47,0.48,2.22,0.94
+-0.43,-0.57,-0.52,0.47,0.48,2.22,0.94
+-0.43,-0.57,-0.52,0.47,0.49,2.21,0.93
+-0.43,-0.57,-0.52,0.47,0.49,2.21,0.93
+-0.43,-0.57,-0.52,0.47,0.49,2.20,0.93
+-0.43,-0.57,-0.53,0.47,0.49,2.19,0.93
+-0.43,-0.57,-0.53,0.46,0.50,2.19,0.93
+-0.43,-0.57,-0.53,0.46,0.50,2.18,0.93
+-0.43,-0.57,-0.53,0.46,0.50,2.18,0.93
+-0.43,-0.57,-0.53,0.46,0.50,2.17,0.93
+-0.43,-0.57,-0.53,0.46,0.51,2.17,0.93
+-0.43,-0.56,-0.53,0.46,0.51,2.16,0.92
+-0.43,-0.56,-0.53,0.46,0.51,2.16,0.92
+-0.43,-0.56,-0.53,0.46,0.51,2.15,0.92
+-0.43,-0.56,-0.53,0.46,0.52,2.15,0.92
+-0.43,-0.56,-0.53,0.46,0.52,2.14,0.92
+-0.43,-0.56,-0.53,0.46,0.52,2.14,0.92
+-0.43,-0.56,-0.53,0.46,0.52,2.13,0.92
+-0.43,-0.56,-0.53,0.46,0.53,2.13,0.92
+-0.43,-0.56,-0.53,0.46,0.53,2.12,0.91
+-0.44,-0.56,-0.54,0.46,0.53,2.11,0.91
+-0.44,-0.56,-0.54,0.46,0.53,2.11,0.91
+-0.44,-0.56,-0.54,0.46,0.54,2.10,0.91
+-0.44,-0.56,-0.54,0.45,0.54,2.10,0.91
+-0.44,-0.56,-0.54,0.45,0.54,2.09,0.91
+-0.44,-0.56,-0.54,0.45,0.55,2.09,0.91
+-0.44,-0.56,-0.54,0.45,0.55,2.08,0.91
+-0.44,-0.56,-0.54,0.45,0.55,2.08,0.90
+-0.44,-0.56,-0.54,0.45,0.55,2.07,0.90
+-0.44,-0.56,-0.54,0.45,0.56,2.07,0.90
+-0.44,-0.56,-0.54,0.45,0.56,2.06,0.90
+-0.44,-0.56,-0.54,0.45,0.56,2.06,0.90
+-0.44,-0.56,-0.54,0.45,0.56,2.05,0.90
+-0.44,-0.56,-0.54,0.45,0.57,2.05,0.90
+-0.44,-0.56,-0.54,0.45,0.57,2.04,0.90
+-0.44,-0.56,-0.55,0.45,0.57,2.03,0.90
+-0.44,-0.56,-0.55,0.45,0.58,2.03,0.89
+-0.44,-0.56,-0.55,0.45,0.58,2.02,0.89
+-0.44,-0.56,-0.55,0.45,0.58,2.02,0.89
+-0.44,-0.56,-0.55,0.45,0.58,2.01,0.89
+-0.44,-0.56,-0.55,0.44,0.59,2.01,0.89
+-0.44,-0.55,-0.55,0.44,0.59,2.00,0.89
+-0.44,-0.55,-0.55,0.44,0.59,2.00,0.89
+-0.44,-0.55,-0.55,0.44,0.59,1.99,0.89
+-0.44,-0.55,-0.55,0.44,0.60,1.99,0.88
+-0.44,-0.55,-0.55,0.44,0.60,1.98,0.88
+-0.44,-0.55,-0.55,0.44,0.60,1.98,0.88
+-0.44,-0.55,-0.55,0.44,0.61,1.97,0.88
+-0.44,-0.55,-0.55,0.44,0.61,1.97,0.88
+-0.44,-0.55,-0.55,0.44,0.61,1.96,0.88
+-0.44,-0.55,-0.56,0.44,0.61,1.96,0.88
+-0.44,-0.55,-0.56,0.44,0.62,1.95,0.88
+-0.44,-0.55,-0.56,0.44,0.62,1.94,0.88
+-0.44,-0.55,-0.56,0.44,0.62,1.94,0.87
+-0.44,-0.55,-0.56,0.44,0.63,1.93,0.87
+-0.44,-0.55,-0.56,0.44,0.63,1.93,0.87
+-0.44,-0.55,-0.56,0.44,0.63,1.92,0.87
+-0.44,-0.55,-0.56,0.43,0.63,1.92,0.87
+-0.44,-0.55,-0.56,0.43,0.64,1.91,0.87
+-0.44,-0.55,-0.56,0.43,0.64,1.91,0.87
+-0.44,-0.55,-0.56,0.43,0.64,1.90,0.87
+-0.44,-0.55,-0.56,0.43,0.65,1.90,0.86
+-0.44,-0.55,-0.56,0.43,0.65,1.89,0.86
+-0.44,-0.55,-0.56,0.43,0.65,1.89,0.86
+-0.44,-0.55,-0.56,0.43,0.66,1.88,0.86
+-0.44,-0.55,-0.57,0.43,0.66,1.88,0.86
+-0.44,-0.55,-0.57,0.43,0.66,1.87,0.86
+-0.45,-0.55,-0.57,0.43,0.66,1.87,0.86
+-0.45,-0.55,-0.57,0.43,0.67,1.86,0.86
+-0.45,-0.54,-0.57,0.43,0.67,1.86,0.85
+-0.45,-0.54,-0.57,0.43,0.67,1.85,0.85
+-0.45,-0.54,-0.57,0.43,0.68,1.85,0.85
+-0.45,-0.54,-0.57,0.43,0.68,1.84,0.85
+-0.45,-0.54,-0.57,0.42,0.68,1.83,0.85
+-0.45,-0.54,-0.57,0.42,0.68,1.83,0.85
+-0.45,-0.54,-0.57,0.42,0.69,1.82,0.85
+-0.45,-0.54,-0.57,0.42,0.69,1.82,0.85
+-0.45,-0.54,-0.57,0.42,0.69,1.81,0.85
+-0.45,-0.54,-0.57,0.42,0.70,1.81,0.84
+-0.45,-0.54,-0.57,0.42,0.70,1.80,0.84
+-0.45,-0.54,-0.57,0.42,0.70,1.80,0.84
+-0.45,-0.54,-0.58,0.42,0.71,1.79,0.84
+-0.45,-0.54,-0.58,0.42,0.71,1.79,0.84
+-0.45,-0.54,-0.58,0.42,0.71,1.78,0.84
+-0.45,-0.54,-0.58,0.42,0.72,1.78,0.84
+-0.45,-0.54,-0.58,0.42,0.72,1.77,0.84
+-0.45,-0.54,-0.58,0.42,0.72,1.77,0.83
+-0.45,-0.54,-0.58,0.42,0.72,1.76,0.83
+-0.45,-0.54,-0.58,0.42,0.73,1.76,0.83
+-0.45,-0.54,-0.58,0.42,0.73,1.75,0.83
+-0.45,-0.54,-0.58,0.41,0.73,1.75,0.83
+-0.45,-0.54,-0.58,0.41,0.74,1.74,0.83
+-0.45,-0.54,-0.58,0.41,0.74,1.74,0.83
+-0.45,-0.54,-0.58,0.41,0.74,1.73,0.83
+-0.45,-0.54,-0.58,0.41,0.75,1.73,0.82
+-0.45,-0.53,-0.58,0.41,0.75,1.72,0.82
+-0.45,-0.53,-0.59,0.41,0.75,1.72,0.82
+-0.45,-0.53,-0.59,0.41,0.76,1.71,0.82
+-0.45,-0.53,-0.59,0.41,0.76,1.70,0.82
+-0.45,-0.53,-0.59,0.41,0.76,1.70,0.82
+-0.45,-0.53,-0.59,0.41,0.76,1.69,0.82
+-0.45,-0.53,-0.59,0.41,0.77,1.69,0.82
+-0.45,-0.53,-0.59,0.41,0.77,1.68,0.82
+-0.45,-0.53,-0.59,0.41,0.77,1.68,0.81
+-0.45,-0.53,-0.59,0.41,0.78,1.67,0.81
+-0.45,-0.53,-0.59,0.41,0.78,1.67,0.81
+-0.45,-0.53,-0.59,0.41,0.78,1.66,0.81
+-0.45,-0.53,-0.59,0.40,0.79,1.66,0.81
+-0.45,-0.53,-0.59,0.40,0.79,1.65,0.81
+-0.45,-0.53,-0.59,0.40,0.79,1.65,0.81
+-0.45,-0.53,-0.59,0.40,0.80,1.64,0.81
+-0.45,-0.53,-0.59,0.40,0.80,1.64,0.80
+-0.45,-0.53,-0.60,0.40,0.80,1.63,0.80
+-0.45,-0.53,-0.60,0.40,0.81,1.63,0.80
+-0.45,-0.53,-0.60,0.40,0.81,1.62,0.80
+-0.45,-0.53,-0.60,0.40,0.81,1.62,0.80
+-0.45,-0.53,-0.60,0.40,0.82,1.61,0.80
+-0.45,-0.53,-0.60,0.40,0.82,1.61,0.80
+-0.45,-0.53,-0.60,0.40,0.82,1.60,0.80
+-0.45,-0.53,-0.60,0.40,0.83,1.60,0.79
+-0.45,-0.52,-0.60,0.40,0.83,1.59,0.79
+-0.45,-0.52,-0.60,0.40,0.83,1.59,0.79
+-0.45,-0.52,-0.60,0.40,0.84,1.58,0.79
+-0.45,-0.52,-0.60,0.40,0.84,1.58,0.79
+-0.45,-0.52,-0.60,0.39,0.84,1.57,0.79
+-0.46,-0.52,-0.60,0.39,0.85,1.57,0.79
+-0.46,-0.52,-0.60,0.39,0.85,1.56,0.79
+-0.46,-0.52,-0.61,0.39,0.85,1.56,0.79
+-0.46,-0.52,-0.61,0.39,0.86,1.55,0.78
+-0.46,-0.52,-0.61,0.39,0.86,1.55,0.78
+-0.46,-0.52,-0.61,0.39,0.86,1.54,0.78
+-0.46,-0.52,-0.61,0.39,0.87,1.54,0.78
+-0.46,-0.52,-0.61,0.39,0.87,1.53,0.78
+-0.46,-0.52,-0.61,0.39,0.87,1.53,0.78
+-0.46,-0.52,-0.61,0.39,0.88,1.52,0.78
+-0.46,-0.52,-0.61,0.39,0.88,1.52,0.78
+-0.46,-0.52,-0.61,0.39,0.88,1.51,0.77
+-0.46,-0.52,-0.61,0.39,0.89,1.51,0.77
+-0.46,-0.52,-0.61,0.39,0.89,1.50,0.77
+-0.46,-0.52,-0.61,0.39,0.89,1.49,0.77
+-0.46,-0.52,-0.61,0.38,0.90,1.49,0.77
+-0.46,-0.52,-0.61,0.38,0.90,1.48,0.77
+-0.46,-0.52,-0.61,0.38,0.90,1.48,0.77
+-0.46,-0.52,-0.62,0.38,0.91,1.47,0.77
+-0.46,-0.51,-0.62,0.38,0.91,1.47,0.76
+-0.46,-0.51,-0.62,0.38,0.91,1.46,0.76
+-0.46,-0.51,-0.62,0.38,0.92,1.46,0.76
+-0.46,-0.51,-0.62,0.38,0.92,1.45,0.76
+-0.46,-0.51,-0.62,0.38,0.92,1.45,0.76
+-0.46,-0.51,-0.62,0.38,0.93,1.44,0.76
+-0.46,-0.51,-0.62,0.38,0.93,1.44,0.76
+-0.46,-0.51,-0.62,0.38,0.93,1.43,0.76
+-0.46,-0.51,-0.62,0.38,0.94,1.43,0.76
+-0.46,-0.51,-0.62,0.38,0.94,1.42,0.75
+-0.46,-0.51,-0.62,0.38,0.95,1.42,0.75
+-0.46,-0.51,-0.62,0.38,0.95,1.41,0.75
+-0.46,-0.51,-0.62,0.38,0.95,1.41,0.75
+-0.46,-0.51,-0.62,0.37,0.96,1.40,0.75
+-0.46,-0.51,-0.62,0.37,0.96,1.40,0.75
+-0.46,-0.51,-0.63,0.37,0.96,1.39,0.75
+-0.46,-0.51,-0.63,0.37,0.97,1.39,0.75
+-0.46,-0.51,-0.63,0.37,0.97,1.38,0.74
+-0.46,-0.51,-0.63,0.37,0.97,1.38,0.74
+-0.46,-0.51,-0.63,0.37,0.98,1.37,0.74
+-0.46,-0.51,-0.63,0.37,0.98,1.37,0.74
+-0.46,-0.51,-0.63,0.37,0.98,1.36,0.74
+-0.46,-0.50,-0.63,0.37,0.99,1.36,0.74
+-0.46,-0.50,-0.63,0.37,0.99,1.35,0.74
+-0.46,-0.50,-0.63,0.37,1.00,1.35,0.74
+-0.46,-0.50,-0.63,0.37,1.00,1.34,0.73
+-0.46,-0.50,-0.63,0.37,1.00,1.34,0.73
+-0.46,-0.50,-0.63,0.37,1.01,1.33,0.73
+-0.46,-0.50,-0.63,0.37,1.01,1.33,0.73
+-0.46,-0.50,-0.63,0.37,1.01,1.32,0.73
+-0.46,-0.50,-0.63,0.36,1.02,1.32,0.73
+-0.46,-0.50,-0.64,0.36,1.02,1.31,0.73
+-0.46,-0.50,-0.64,0.36,1.02,1.31,0.73
+-0.46,-0.50,-0.64,0.36,1.03,1.30,0.73
+-0.46,-0.50,-0.64,0.36,1.03,1.30,0.72
+-0.46,-0.50,-0.64,0.36,1.03,1.29,0.72
+-0.46,-0.50,-0.64,0.36,1.04,1.29,0.72
+-0.46,-0.50,-0.64,0.36,1.04,1.28,0.72
+-0.46,-0.50,-0.64,0.36,1.05,1.28,0.72
+-0.46,-0.50,-0.64,0.36,1.05,1.27,0.72
+-0.46,-0.50,-0.64,0.36,1.05,1.27,0.72
+-0.46,-0.50,-0.64,0.36,1.06,1.26,0.72
+-0.46,-0.50,-0.64,0.36,1.06,1.26,0.71
+-0.46,-0.50,-0.64,0.36,1.06,1.26,0.71
+-0.46,-0.49,-0.64,0.36,1.07,1.25,0.71
+-0.46,-0.49,-0.64,0.36,1.07,1.25,0.71
+-0.46,-0.49,-0.64,0.35,1.08,1.24,0.71
+-0.46,-0.49,-0.65,0.35,1.08,1.24,0.71
+-0.46,-0.49,-0.65,0.35,1.08,1.23,0.71
+-0.46,-0.49,-0.65,0.35,1.09,1.23,0.71
+-0.46,-0.49,-0.65,0.35,1.09,1.22,0.71
+-0.46,-0.49,-0.65,0.35,1.09,1.22,0.70
+-0.46,-0.49,-0.65,0.35,1.10,1.21,0.70
+-0.46,-0.49,-0.65,0.35,1.10,1.21,0.70
+-0.46,-0.49,-0.65,0.35,1.11,1.20,0.70
+-0.46,-0.49,-0.65,0.35,1.11,1.20,0.70
+-0.46,-0.49,-0.65,0.35,1.11,1.19,0.70
+-0.46,-0.49,-0.65,0.35,1.12,1.19,0.70
+-0.46,-0.49,-0.65,0.35,1.12,1.18,0.70
+-0.46,-0.49,-0.65,0.35,1.12,1.18,0.69
+-0.46,-0.49,-0.65,0.35,1.13,1.17,0.69
+-0.46,-0.49,-0.65,0.35,1.13,1.17,0.69
+-0.46,-0.49,-0.65,0.35,1.14,1.16,0.69
+-0.46,-0.49,-0.65,0.34,1.14,1.16,0.69
+-0.46,-0.49,-0.66,0.34,1.14,1.15,0.69
+-0.46,-0.48,-0.66,0.34,1.15,1.15,0.69
+-0.47,-0.48,-0.66,0.34,1.15,1.14,0.69
+-0.47,-0.48,-0.66,0.34,1.16,1.14,0.68
+-0.47,-0.48,-0.66,0.34,1.16,1.13,0.68
+-0.47,-0.48,-0.66,0.34,1.16,1.13,0.68
+-0.47,-0.48,-0.66,0.34,1.17,1.12,0.68
+-0.47,-0.48,-0.66,0.34,1.17,1.12,0.68
+-0.47,-0.48,-0.66,0.34,1.17,1.11,0.68
+-0.47,-0.48,-0.66,0.34,1.18,1.11,0.68
+-0.47,-0.48,-0.66,0.34,1.18,1.10,0.68
+-0.47,-0.48,-0.66,0.34,1.19,1.10,0.68
+-0.47,-0.48,-0.66,0.34,1.19,1.09,0.67
+-0.47,-0.48,-0.66,0.34,1.19,1.09,0.67
+-0.47,-0.48,-0.66,0.34,1.20,1.08,0.67
+-0.47,-0.48,-0.66,0.34,1.20,1.08,0.67
+-0.47,-0.48,-0.67,0.33,1.21,1.08,0.67
+-0.47,-0.48,-0.67,0.33,1.21,1.07,0.67
+-0.47,-0.48,-0.67,0.33,1.21,1.07,0.67
+-0.47,-0.48,-0.67,0.33,1.22,1.06,0.67
+-0.47,-0.48,-0.67,0.33,1.22,1.06,0.66
+-0.47,-0.48,-0.67,0.33,1.23,1.05,0.66
+-0.47,-0.47,-0.67,0.33,1.23,1.05,0.66
+-0.47,-0.47,-0.67,0.33,1.23,1.04,0.66
+-0.47,-0.47,-0.67,0.33,1.24,1.04,0.66
+-0.47,-0.47,-0.67,0.33,1.24,1.03,0.66
+-0.47,-0.47,-0.67,0.33,1.25,1.03,0.66
+-0.47,-0.47,-0.67,0.33,1.25,1.02,0.66
+-0.47,-0.47,-0.67,0.33,1.25,1.02,0.66
+-0.47,-0.47,-0.67,0.33,1.26,1.01,0.65
+-0.47,-0.47,-0.67,0.33,1.26,1.01,0.65
+-0.47,-0.47,-0.67,0.33,1.27,1.00,0.65
+-0.47,-0.47,-0.67,0.33,1.27,1.00,0.65
+-0.47,-0.47,-0.68,0.32,1.27,0.99,0.65
+-0.47,-0.47,-0.68,0.32,1.28,0.99,0.65
+-0.47,-0.47,-0.68,0.32,1.28,0.98,0.65
+-0.47,-0.47,-0.68,0.32,1.29,0.98,0.65
+-0.47,-0.47,-0.68,0.32,1.29,0.98,0.64
+-0.47,-0.47,-0.68,0.32,1.29,0.97,0.64
+-0.47,-0.47,-0.68,0.32,1.30,0.97,0.64
+-0.47,-0.47,-0.68,0.32,1.30,0.96,0.64
+-0.47,-0.47,-0.68,0.32,1.31,0.96,0.64
+-0.47,-0.46,-0.68,0.32,1.31,0.95,0.64
+-0.47,-0.46,-0.68,0.32,1.31,0.95,0.64
+-0.47,-0.46,-0.68,0.32,1.32,0.94,0.64
+-0.47,-0.46,-0.68,0.32,1.32,0.94,0.64
+-0.47,-0.46,-0.68,0.32,1.33,0.93,0.63
+-0.47,-0.46,-0.68,0.32,1.33,0.93,0.63
+-0.47,-0.46,-0.68,0.32,1.34,0.92,0.63
+-0.47,-0.46,-0.68,0.32,1.34,0.92,0.63
+-0.47,-0.46,-0.69,0.31,1.34,0.91,0.63
+-0.47,-0.46,-0.69,0.31,1.35,0.91,0.63
+-0.47,-0.46,-0.69,0.31,1.35,0.90,0.63
+-0.47,-0.46,-0.69,0.31,1.36,0.90,0.63
+-0.47,-0.46,-0.69,0.31,1.36,0.90,0.62
+-0.47,-0.46,-0.69,0.31,1.36,0.89,0.62
+-0.47,-0.46,-0.69,0.31,1.37,0.89,0.62
+-0.47,-0.46,-0.69,0.31,1.37,0.88,0.62
+-0.47,-0.46,-0.69,0.31,1.38,0.88,0.62
+-0.47,-0.46,-0.69,0.31,1.38,0.87,0.62
+-0.47,-0.46,-0.69,0.31,1.39,0.87,0.62
+-0.47,-0.45,-0.69,0.31,1.39,0.86,0.62
+-0.47,-0.45,-0.69,0.31,1.39,0.86,0.61
+-0.47,-0.45,-0.69,0.31,1.40,0.85,0.61
+-0.47,-0.45,-0.69,0.31,1.40,0.85,0.61
+-0.47,-0.45,-0.69,0.31,1.41,0.84,0.61
+-0.47,-0.45,-0.69,0.31,1.41,0.84,0.61
+-0.47,-0.45,-0.70,0.30,1.41,0.83,0.61
+-0.47,-0.45,-0.70,0.30,1.42,0.83,0.61
+-0.47,-0.45,-0.70,0.30,1.42,0.83,0.61
+-0.47,-0.45,-0.70,0.30,1.43,0.82,0.61
+-0.47,-0.45,-0.70,0.30,1.43,0.82,0.60
+-0.47,-0.45,-0.70,0.30,1.44,0.81,0.60
+-0.47,-0.45,-0.70,0.30,1.44,0.81,0.60
+-0.47,-0.45,-0.70,0.30,1.44,0.80,0.60
+-0.47,-0.45,-0.70,0.30,1.45,0.80,0.60
+-0.47,-0.45,-0.70,0.30,1.45,0.79,0.60
+-0.47,-0.45,-0.70,0.30,1.46,0.79,0.60
+-0.47,-0.45,-0.70,0.30,1.46,0.78,0.60
+-0.47,-0.45,-0.70,0.30,1.47,0.78,0.60
+-0.47,-0.44,-0.70,0.30,1.47,0.78,0.59
+-0.47,-0.44,-0.70,0.30,1.48,0.77,0.59
+-0.47,-0.44,-0.70,0.30,1.48,0.77,0.59
+-0.47,-0.44,-0.70,0.30,1.48,0.76,0.59
+-0.47,-0.44,-0.71,0.29,1.49,0.76,0.59
+-0.47,-0.44,-0.71,0.29,1.49,0.75,0.59
+-0.47,-0.44,-0.71,0.29,1.50,0.75,0.59
+-0.47,-0.44,-0.71,0.29,1.50,0.74,0.59
+-0.47,-0.44,-0.71,0.29,1.51,0.74,0.58
+-0.47,-0.44,-0.71,0.29,1.51,0.73,0.58
+-0.47,-0.44,-0.71,0.29,1.51,0.73,0.58
+-0.47,-0.44,-0.71,0.29,1.52,0.73,0.58
+-0.47,-0.44,-0.71,0.29,1.52,0.72,0.58
+-0.47,-0.44,-0.71,0.29,1.53,0.72,0.58
+-0.47,-0.44,-0.71,0.29,1.53,0.71,0.58
+-0.47,-0.44,-0.71,0.29,1.54,0.71,0.58
+-0.47,-0.44,-0.71,0.29,1.54,0.70,0.58
+-0.47,-0.44,-0.71,0.29,1.54,0.70,0.57
+-0.47,-0.43,-0.71,0.29,1.55,0.69,0.57
+-0.47,-0.43,-0.71,0.29,1.55,0.69,0.57
+-0.47,-0.43,-0.71,0.29,1.56,0.68,0.57
+-0.47,-0.43,-0.71,0.28,1.56,0.68,0.57
+-0.47,-0.43,-0.72,0.28,1.57,0.68,0.57
+-0.47,-0.43,-0.72,0.28,1.57,0.67,0.57
+-0.47,-0.43,-0.72,0.28,1.58,0.67,0.57
+-0.47,-0.43,-0.72,0.28,1.58,0.66,0.56
+-0.47,-0.43,-0.72,0.28,1.59,0.66,0.56
+-0.47,-0.43,-0.72,0.28,1.59,0.65,0.56
+-0.47,-0.43,-0.72,0.28,1.59,0.65,0.56
+-0.47,-0.43,-0.72,0.28,1.60,0.64,0.56
+-0.47,-0.43,-0.72,0.28,1.60,0.64,0.56
+-0.47,-0.43,-0.72,0.28,1.61,0.64,0.56
+-0.47,-0.43,-0.72,0.28,1.61,0.63,0.56
+-0.47,-0.43,-0.72,0.28,1.62,0.63,0.56
+-0.47,-0.43,-0.72,0.28,1.62,0.62,0.55
+-0.47,-0.43,-0.72,0.28,1.63,0.62,0.55
+-0.47,-0.42,-0.72,0.28,1.63,0.61,0.55
+-0.47,-0.42,-0.72,0.28,1.63,0.61,0.55
+-0.47,-0.42,-0.72,0.27,1.64,0.60,0.55
+-0.47,-0.42,-0.72,0.27,1.64,0.60,0.55
+-0.47,-0.42,-0.73,0.27,1.65,0.60,0.55
+-0.47,-0.42,-0.73,0.27,1.65,0.59,0.55
+-0.47,-0.42,-0.73,0.27,1.66,0.59,0.55
+-0.47,-0.42,-0.73,0.27,1.66,0.58,0.54
+-0.47,-0.42,-0.73,0.27,1.67,0.58,0.54
+-0.47,-0.42,-0.73,0.27,1.67,0.57,0.54
+-0.47,-0.42,-0.73,0.27,1.68,0.57,0.54
+-0.47,-0.42,-0.73,0.27,1.68,0.56,0.54
+-0.47,-0.42,-0.73,0.27,1.68,0.56,0.54
+-0.47,-0.42,-0.73,0.27,1.69,0.56,0.54
+-0.47,-0.42,-0.73,0.27,1.69,0.55,0.54
+-0.47,-0.42,-0.73,0.27,1.70,0.55,0.53
+-0.47,-0.42,-0.73,0.27,1.70,0.54,0.53
+-0.47,-0.41,-0.73,0.27,1.71,0.54,0.53
+-0.47,-0.41,-0.73,0.27,1.71,0.53,0.53
+-0.47,-0.41,-0.73,0.27,1.72,0.53,0.53
+-0.47,-0.41,-0.73,0.26,1.72,0.53,0.53
+-0.47,-0.41,-0.73,0.26,1.73,0.52,0.53
+-0.47,-0.41,-0.74,0.26,1.73,0.52,0.53
+-0.47,-0.41,-0.74,0.26,1.74,0.51,0.53
+-0.47,-0.41,-0.74,0.26,1.74,0.51,0.52
+-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52
+-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52
+-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52
+-0.47,-0.41,-0.74,0.26,1.76,0.49,0.52
+-0.47,-0.41,-0.74,0.26,1.76,0.49,0.52
+-0.47,-0.41,-0.74,0.26,1.77,0.48,0.52
+-0.47,-0.41,-0.74,0.26,1.77,0.48,0.52
+-0.47,-0.41,-0.74,0.26,1.78,0.47,0.52
+-0.47,-0.41,-0.74,0.26,1.78,0.47,0.51
+-0.47,-0.40,-0.74,0.26,1.79,0.47,0.51
+-0.47,-0.40,-0.74,0.26,1.79,0.46,0.51
+-0.47,-0.40,-0.74,0.26,1.80,0.46,0.51
+-0.47,-0.40,-0.74,0.25,1.80,0.45,0.51
+-0.47,-0.40,-0.74,0.25,1.81,0.45,0.51
+-0.47,-0.40,-0.74,0.25,1.81,0.44,0.51
+-0.47,-0.40,-0.74,0.25,1.82,0.44,0.51
+-0.47,-0.40,-0.75,0.25,1.82,0.44,0.50
+-0.47,-0.40,-0.75,0.25,1.83,0.43,0.50
+-0.47,-0.40,-0.75,0.25,1.83,0.43,0.50
+-0.47,-0.40,-0.75,0.25,1.83,0.42,0.50
+-0.47,-0.40,-0.75,0.25,1.84,0.42,0.50
+-0.47,-0.40,-0.75,0.25,1.84,0.41,0.50
+-0.47,-0.40,-0.75,0.25,1.85,0.41,0.50
+-0.47,-0.40,-0.75,0.25,1.85,0.41,0.50
+-0.47,-0.40,-0.75,0.25,1.86,0.40,0.50
+-0.47,-0.40,-0.75,0.25,1.86,0.40,0.49
+-0.47,-0.39,-0.75,0.25,1.87,0.39,0.49
+-0.47,-0.39,-0.75,0.25,1.87,0.39,0.49
+-0.47,-0.39,-0.75,0.25,1.88,0.38,0.49
+-0.47,-0.39,-0.75,0.25,1.88,0.38,0.49
+-0.47,-0.39,-0.75,0.24,1.89,0.38,0.49
+-0.47,-0.39,-0.75,0.24,1.89,0.37,0.49
+-0.47,-0.39,-0.75,0.24,1.90,0.37,0.49
+-0.47,-0.39,-0.75,0.24,1.90,0.36,0.49
+-0.47,-0.39,-0.75,0.24,1.91,0.36,0.48
+-0.47,-0.39,-0.76,0.24,1.91,0.36,0.48
+-0.47,-0.39,-0.76,0.24,1.92,0.35,0.48
+-0.47,-0.39,-0.76,0.24,1.92,0.35,0.48
+-0.47,-0.39,-0.76,0.24,1.93,0.34,0.48
+-0.47,-0.39,-0.76,0.24,1.93,0.34,0.48
+-0.47,-0.39,-0.76,0.24,1.94,0.33,0.48
+-0.47,-0.39,-0.76,0.24,1.94,0.33,0.48
+-0.47,-0.39,-0.76,0.24,1.95,0.33,0.48
+-0.47,-0.38,-0.76,0.24,1.95,0.32,0.47
+-0.47,-0.38,-0.76,0.24,1.96,0.32,0.47
+-0.47,-0.38,-0.76,0.24,1.96,0.31,0.47
+-0.47,-0.38,-0.76,0.24,1.97,0.31,0.47
+-0.47,-0.38,-0.76,0.23,1.97,0.31,0.47
+-0.47,-0.38,-0.76,0.23,1.98,0.30,0.47
+-0.47,-0.38,-0.76,0.23,1.98,0.30,0.47
+-0.47,-0.38,-0.76,0.23,1.99,0.29,0.47
+-0.47,-0.38,-0.76,0.23,1.99,0.29,0.47
+-0.47,-0.38,-0.76,0.23,2.00,0.29,0.46
+-0.47,-0.38,-0.76,0.23,2.00,0.28,0.46
+-0.47,-0.38,-0.77,0.23,2.01,0.28,0.46
+-0.47,-0.38,-0.77,0.23,2.01,0.27,0.46
+-0.47,-0.38,-0.77,0.23,2.02,0.27,0.46
+-0.47,-0.38,-0.77,0.23,2.02,0.26,0.46
+-0.47,-0.38,-0.77,0.23,2.03,0.26,0.46
+-0.47,-0.37,-0.77,0.23,2.03,0.26,0.46
+-0.47,-0.37,-0.77,0.23,2.04,0.25,0.46
+-0.47,-0.37,-0.77,0.23,2.04,0.25,0.45
+-0.47,-0.37,-0.77,0.23,2.05,0.24,0.45
+-0.47,-0.37,-0.77,0.23,2.05,0.24,0.45
+-0.47,-0.37,-0.77,0.23,2.06,0.24,0.45
+-0.47,-0.37,-0.77,0.22,2.06,0.23,0.45
+-0.47,-0.37,-0.77,0.22,2.07,0.23,0.45
+-0.47,-0.37,-0.77,0.22,2.07,0.22,0.45
+-0.47,-0.37,-0.77,0.22,2.08,0.22,0.45
+-0.47,-0.37,-0.77,0.22,2.08,0.22,0.45
+-0.47,-0.37,-0.77,0.22,2.09,0.21,0.44
+-0.47,-0.37,-0.77,0.22,2.09,0.21,0.44
+-0.47,-0.37,-0.77,0.22,2.10,0.20,0.44
+-0.47,-0.37,-0.77,0.22,2.10,0.20,0.44
+-0.47,-0.37,-0.78,0.22,2.11,0.20,0.44
+-0.47,-0.36,-0.78,0.22,2.11,0.19,0.44
+-0.47,-0.36,-0.78,0.22,2.12,0.19,0.44
+-0.47,-0.36,-0.78,0.22,2.12,0.18,0.44
+-0.47,-0.36,-0.78,0.22,2.13,0.18,0.44
+-0.47,-0.36,-0.78,0.22,2.13,0.18,0.43
+-0.47,-0.36,-0.78,0.22,2.14,0.17,0.43
+-0.47,-0.36,-0.78,0.22,2.14,0.17,0.43
+-0.47,-0.36,-0.78,0.22,2.15,0.16,0.43
+-0.47,-0.36,-0.78,0.21,2.15,0.16,0.43
+-0.47,-0.36,-0.78,0.21,2.16,0.16,0.43
+-0.47,-0.36,-0.78,0.21,2.16,0.15,0.43
+-0.47,-0.36,-0.78,0.21,2.17,0.15,0.43
+-0.47,-0.36,-0.78,0.21,2.17,0.15,0.43
+-0.47,-0.36,-0.78,0.21,2.18,0.14,0.42
+-0.47,-0.36,-0.78,0.21,2.18,0.14,0.42
+-0.47,-0.35,-0.78,0.21,2.19,0.13,0.42
+-0.47,-0.35,-0.78,0.21,2.19,0.13,0.42
+-0.47,-0.35,-0.78,0.21,2.20,0.13,0.42
+-0.47,-0.35,-0.78,0.21,2.20,0.12,0.42
+-0.46,-0.35,-0.78,0.21,2.21,0.12,0.42
+-0.46,-0.35,-0.79,0.21,2.21,0.11,0.42
+-0.46,-0.35,-0.79,0.21,2.22,0.11,0.42
+-0.46,-0.35,-0.79,0.21,2.22,0.11,0.41
+-0.46,-0.35,-0.79,0.21,2.23,0.10,0.41
+-0.46,-0.35,-0.79,0.21,2.23,0.10,0.41
+-0.46,-0.35,-0.79,0.21,2.24,0.09,0.41
+-0.46,-0.35,-0.79,0.20,2.24,0.09,0.41
+-0.46,-0.35,-0.79,0.20,2.25,0.09,0.41
+-0.46,-0.35,-0.79,0.20,2.25,0.08,0.41
+-0.46,-0.35,-0.79,0.20,2.26,0.08,0.41
+-0.46,-0.35,-0.79,0.20,2.27,0.08,0.41
+-0.46,-0.34,-0.79,0.20,2.27,0.07,0.40
+-0.46,-0.34,-0.79,0.20,2.28,0.07,0.40
+-0.46,-0.34,-0.79,0.20,2.28,0.06,0.40
+-0.46,-0.34,-0.79,0.20,2.29,0.06,0.40
+-0.46,-0.34,-0.79,0.20,2.29,0.06,0.40
+-0.46,-0.34,-0.79,0.20,2.30,0.05,0.40
+-0.46,-0.34,-0.79,0.20,2.30,0.05,0.40
+-0.46,-0.34,-0.79,0.20,2.31,0.05,0.40
+-0.46,-0.34,-0.79,0.20,2.31,0.04,0.40
+-0.46,-0.34,-0.79,0.20,2.32,0.04,0.39
+-0.46,-0.34,-0.80,0.20,2.32,0.03,0.39
+-0.46,-0.34,-0.80,0.20,2.33,0.03,0.39
+-0.46,-0.34,-0.80,0.20,2.33,0.03,0.39
+-0.46,-0.34,-0.80,0.20,2.34,0.02,0.39
+-0.46,-0.34,-0.80,0.19,2.34,0.02,0.39
+-0.46,-0.33,-0.80,0.19,2.35,0.01,0.39
+-0.46,-0.33,-0.80,0.19,2.35,0.01,0.39
+-0.46,-0.33,-0.80,0.19,2.36,0.01,0.39
+-0.46,-0.33,-0.80,0.19,2.37,0.00,0.38
+-0.46,-0.33,-0.80,0.19,2.37,0.00,0.38
diff --git a/scripts/testv/stvISM1.csv b/scripts/testv/stvISM1.csv
index 8d729654c4cbfbc2034d285f98f1f7824d3a868c..9100a52238a17843ed9bd03fc3ded73440efb2d2 100644
--- a/scripts/testv/stvISM1.csv
+++ b/scripts/testv/stvISM1.csv
@@ -1,1500 +1,1500 @@
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
-19.20,0.00,1.00,0.00,1.00
-24.00,0.00,1.00,0.00,1.00
-28.80,0.00,1.00,0.00,1.00
-33.60,0.00,1.00,0.00,1.00
-38.40,0.00,1.00,0.00,1.00
-43.20,0.00,1.00,0.00,1.00
-48.00,0.00,1.00,0.00,1.00
-52.80,0.00,1.00,0.00,1.00
-57.60,0.00,1.00,0.00,1.00
-62.40,0.00,1.00,0.00,1.00
-67.20,0.00,1.00,0.00,1.00
-72.00,0.00,1.00,0.00,1.00
-76.80,0.00,1.00,0.00,1.00
-81.60,0.00,1.00,0.00,1.00
-86.40,0.00,1.00,0.00,1.00
-91.20,0.00,1.00,0.00,1.00
-96.00,0.00,1.00,0.00,1.00
-100.80,0.00,1.00,0.00,1.00
-105.60,0.00,1.00,0.00,1.00
-110.40,0.00,1.00,0.00,1.00
-115.20,0.00,1.00,0.00,1.00
-120.00,0.00,1.00,0.00,1.00
-124.80,0.00,1.00,0.00,1.00
-129.60,0.00,1.00,0.00,1.00
-134.40,0.00,1.00,0.00,1.00
-139.20,0.00,1.00,0.00,1.00
-144.00,0.00,1.00,0.00,1.00
-148.80,0.00,1.00,0.00,1.00
-153.60,0.00,1.00,0.00,1.00
-158.40,0.00,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
-168.00,0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--163.20,0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
--153.60,0.00,1.00,0.00,1.00
--148.80,0.00,1.00,0.00,1.00
--144.00,0.00,1.00,0.00,1.00
--139.20,0.00,1.00,0.00,1.00
--134.40,0.00,1.00,0.00,1.00
--129.60,0.00,1.00,0.00,1.00
--124.80,0.00,1.00,0.00,1.00
--120.00,0.00,1.00,0.00,1.00
--115.20,0.00,1.00,0.00,1.00
--110.40,0.00,1.00,0.00,1.00
--105.60,0.00,1.00,0.00,1.00
--100.80,0.00,1.00,0.00,1.00
--96.00,0.00,1.00,0.00,1.00
--91.20,0.00,1.00,0.00,1.00
--86.40,0.00,1.00,0.00,1.00
--81.60,0.00,1.00,0.00,1.00
--76.80,0.00,1.00,0.00,1.00
--72.00,0.00,1.00,0.00,1.00
--67.20,0.00,1.00,0.00,1.00
--62.40,0.00,1.00,0.00,1.00
--57.60,0.00,1.00,0.00,1.00
--52.80,0.00,1.00,0.00,1.00
--48.00,0.00,1.00,0.00,1.00
--43.20,0.00,1.00,0.00,1.00
--38.40,0.00,1.00,0.00,1.00
--33.60,0.00,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
-19.20,-0.00,1.00,0.00,1.00
-24.00,-0.00,1.00,0.00,1.00
-28.80,-0.00,1.00,0.00,1.00
-33.60,-4.80,1.00,0.00,1.00
-38.40,-4.80,1.00,0.00,1.00
-43.20,-4.80,1.00,0.00,1.00
-48.00,-4.80,1.00,0.00,1.00
-52.80,-4.80,1.00,0.00,1.00
-57.60,-4.80,1.00,0.00,1.00
-62.40,-4.80,1.00,0.00,1.00
-67.20,-4.80,1.00,0.00,1.00
-72.00,-4.80,1.00,0.00,1.00
-76.80,-4.80,1.00,0.00,1.00
-81.60,-4.80,1.00,0.00,1.00
-86.40,-4.80,1.00,0.00,1.00
-91.20,-4.80,1.00,0.00,1.00
-96.00,-4.80,1.00,0.00,1.00
-100.80,-4.80,1.00,0.00,1.00
-105.60,-4.80,1.00,0.00,1.00
-110.40,-4.80,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
-120.00,-4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
-129.60,-4.80,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
-139.20,-4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
-148.80,-4.80,1.00,0.00,1.00
-153.60,-0.00,1.00,0.00,1.00
-158.40,-0.00,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
-168.00,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--163.20,0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
--153.60,0.00,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
--144.00,4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
--134.40,4.80,1.00,0.00,1.00
--129.60,4.80,1.00,0.00,1.00
--124.80,4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
--115.20,4.80,1.00,0.00,1.00
--110.40,4.80,1.00,0.00,1.00
--105.60,4.80,1.00,0.00,1.00
--100.80,4.80,1.00,0.00,1.00
--96.00,4.80,1.00,0.00,1.00
--91.20,4.80,1.00,0.00,1.00
--86.40,4.80,1.00,0.00,1.00
--81.60,4.80,1.00,0.00,1.00
--76.80,4.80,1.00,0.00,1.00
--72.00,4.80,1.00,0.00,1.00
--67.20,4.80,1.00,0.00,1.00
--62.40,4.80,1.00,0.00,1.00
--57.60,4.80,1.00,0.00,1.00
--52.80,4.80,1.00,0.00,1.00
--48.00,4.80,1.00,0.00,1.00
--43.20,4.80,1.00,0.00,1.00
--38.40,4.80,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
-33.60,-4.80,1.00,0.00,1.00
-38.40,-4.80,1.00,0.00,1.00
-43.20,-4.80,1.00,0.00,1.00
-48.00,-4.80,1.00,0.00,1.00
-52.80,-9.60,1.00,0.00,1.00
-57.60,-9.60,1.00,0.00,1.00
-62.40,-9.60,1.00,0.00,1.00
-67.20,-9.60,1.00,0.00,1.00
-72.00,-9.60,1.00,0.00,1.00
-76.80,-9.60,1.00,0.00,1.00
-81.60,-9.60,1.00,0.00,1.00
-86.40,-9.60,1.00,0.00,1.00
-91.20,-9.60,1.00,0.00,1.00
-96.00,-9.60,1.00,0.00,1.00
-100.80,-9.60,1.00,0.00,1.00
-105.60,-9.60,1.00,0.00,1.00
-110.40,-9.60,1.00,0.00,1.00
-115.20,-9.60,1.00,0.00,1.00
-120.00,-9.60,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
-129.60,-9.60,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
-139.20,-4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
-148.80,-4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-168.00,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--153.60,4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
--144.00,4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
--134.40,4.80,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
--124.80,9.60,1.00,0.00,1.00
--120.00,9.60,1.00,0.00,1.00
--115.20,9.60,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
--105.60,9.60,1.00,0.00,1.00
--100.80,9.60,1.00,0.00,1.00
--96.00,9.60,1.00,0.00,1.00
--91.20,9.60,1.00,0.00,1.00
--86.40,9.60,1.00,0.00,1.00
--81.60,9.60,1.00,0.00,1.00
--76.80,9.60,1.00,0.00,1.00
--72.00,9.60,1.00,0.00,1.00
--67.20,9.60,1.00,0.00,1.00
--62.40,9.60,1.00,0.00,1.00
--57.60,9.60,1.00,0.00,1.00
--52.80,9.60,1.00,0.00,1.00
--48.00,4.80,1.00,0.00,1.00
--43.20,4.80,1.00,0.00,1.00
--38.40,4.80,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
-43.20,-9.60,1.00,0.00,1.00
-48.00,-9.60,1.00,0.00,1.00
-52.80,-9.60,1.00,0.00,1.00
-57.60,-14.40,1.00,0.00,1.00
-62.40,-14.40,1.00,0.00,1.00
-67.20,-14.40,1.00,0.00,1.00
-72.00,-14.40,1.00,0.00,1.00
-76.80,-14.40,1.00,0.00,1.00
-81.60,-14.40,1.00,0.00,1.00
-86.40,-14.40,1.00,0.00,1.00
-91.20,-14.40,1.00,0.00,1.00
-96.00,-14.40,1.00,0.00,1.00
-100.80,-14.40,1.00,0.00,1.00
-105.60,-14.40,1.00,0.00,1.00
-110.40,-14.40,1.00,0.00,1.00
-115.20,-14.40,1.00,0.00,1.00
-120.00,-14.40,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
-129.60,-9.60,1.00,0.00,1.00
-134.40,-9.60,1.00,0.00,1.00
-139.20,-9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
-148.80,-9.60,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--153.60,4.80,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
--144.00,9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
--134.40,9.60,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
--124.80,9.60,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
--115.20,14.40,1.00,0.00,1.00
--110.40,14.40,1.00,0.00,1.00
--105.60,14.40,1.00,0.00,1.00
--100.80,14.40,1.00,0.00,1.00
--96.00,14.40,1.00,0.00,1.00
--91.20,14.40,1.00,0.00,1.00
--86.40,14.40,1.00,0.00,1.00
--81.60,14.40,1.00,0.00,1.00
--76.80,14.40,1.00,0.00,1.00
--72.00,14.40,1.00,0.00,1.00
--67.20,14.40,1.00,0.00,1.00
--62.40,14.40,1.00,0.00,1.00
--57.60,14.40,1.00,0.00,1.00
--52.80,9.60,1.00,0.00,1.00
--48.00,9.60,1.00,0.00,1.00
--43.20,9.60,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
--33.60,9.60,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
-43.20,-14.40,1.00,0.00,1.00
-48.00,-14.40,1.00,0.00,1.00
-52.80,-14.40,1.00,0.00,1.00
-57.60,-14.40,1.00,0.00,1.00
-62.40,-19.20,1.00,0.00,1.00
-67.20,-19.20,1.00,0.00,1.00
-72.00,-19.20,1.00,0.00,1.00
-76.80,-19.20,1.00,0.00,1.00
-81.60,-19.20,1.00,0.00,1.00
-86.40,-19.20,1.00,0.00,1.00
-91.20,-19.20,1.00,0.00,1.00
-96.00,-19.20,1.00,0.00,1.00
-100.80,-19.20,1.00,0.00,1.00
-105.60,-19.20,1.00,0.00,1.00
-110.40,-19.20,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
-120.00,-14.40,1.00,0.00,1.00
-124.80,-14.40,1.00,0.00,1.00
-129.60,-14.40,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
-139.20,-14.40,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
-148.80,-9.60,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--153.60,9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
--144.00,9.60,1.00,0.00,1.00
--139.20,14.40,1.00,0.00,1.00
--134.40,14.40,1.00,0.00,1.00
--129.60,14.40,1.00,0.00,1.00
--124.80,14.40,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
--115.20,19.20,1.00,0.00,1.00
--110.40,19.20,1.00,0.00,1.00
--105.60,19.20,1.00,0.00,1.00
--100.80,19.20,1.00,0.00,1.00
--96.00,19.20,1.00,0.00,1.00
--91.20,19.20,1.00,0.00,1.00
--86.40,19.20,1.00,0.00,1.00
--81.60,19.20,1.00,0.00,1.00
--76.80,19.20,1.00,0.00,1.00
--72.00,19.20,1.00,0.00,1.00
--67.20,19.20,1.00,0.00,1.00
--62.40,19.20,1.00,0.00,1.00
--57.60,14.40,1.00,0.00,1.00
--52.80,14.40,1.00,0.00,1.00
--48.00,14.40,1.00,0.00,1.00
--43.20,14.40,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
--33.60,9.60,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
-38.40,-14.40,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
-48.00,-19.20,1.00,0.00,1.00
-57.60,-19.20,1.00,0.00,1.00
-62.40,-19.20,1.00,0.00,1.00
-67.20,-24.00,1.00,0.00,1.00
-72.00,-24.00,1.00,0.00,1.00
-76.80,-24.00,1.00,0.00,1.00
-81.60,-24.00,1.00,0.00,1.00
-86.40,-24.00,1.00,0.00,1.00
-91.20,-24.00,1.00,0.00,1.00
-96.00,-24.00,1.00,0.00,1.00
-100.80,-24.00,1.00,0.00,1.00
-105.60,-24.00,1.00,0.00,1.00
-110.40,-24.00,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
-120.00,-19.20,1.00,0.00,1.00
-129.60,-19.20,1.00,0.00,1.00
-134.40,-19.20,1.00,0.00,1.00
-139.20,-19.20,1.00,0.00,1.00
-144.00,-14.40,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
-158.40,-9.60,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
--153.60,9.60,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--144.00,14.40,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
--134.40,19.20,1.00,0.00,1.00
--129.60,19.20,1.00,0.00,1.00
--120.00,19.20,1.00,0.00,1.00
--115.20,19.20,1.00,0.00,1.00
--110.40,24.00,1.00,0.00,1.00
--105.60,24.00,1.00,0.00,1.00
--100.80,24.00,1.00,0.00,1.00
--96.00,24.00,1.00,0.00,1.00
--91.20,24.00,1.00,0.00,1.00
--86.40,24.00,1.00,0.00,1.00
--81.60,24.00,1.00,0.00,1.00
--76.80,24.00,1.00,0.00,1.00
--72.00,24.00,1.00,0.00,1.00
--67.20,24.00,1.00,0.00,1.00
--62.40,19.20,1.00,0.00,1.00
--57.60,19.20,1.00,0.00,1.00
--48.00,19.20,1.00,0.00,1.00
--43.20,19.20,1.00,0.00,1.00
--38.40,14.40,1.00,0.00,1.00
--33.60,14.40,1.00,0.00,1.00
--33.60,14.40,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
-28.80,-14.40,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
-38.40,-19.20,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
-48.00,-24.00,1.00,0.00,1.00
-52.80,-24.00,1.00,0.00,1.00
-57.60,-24.00,1.00,0.00,1.00
-62.40,-24.00,1.00,0.00,1.00
-72.00,-28.80,1.00,0.00,1.00
-76.80,-28.80,1.00,0.00,1.00
-81.60,-28.80,1.00,0.00,1.00
-86.40,-28.80,1.00,0.00,1.00
-91.20,-28.80,1.00,0.00,1.00
-96.00,-28.80,1.00,0.00,1.00
-100.80,-28.80,1.00,0.00,1.00
-105.60,-28.80,1.00,0.00,1.00
-115.20,-28.80,1.00,0.00,1.00
-120.00,-24.00,1.00,0.00,1.00
-124.80,-24.00,1.00,0.00,1.00
-129.60,-24.00,1.00,0.00,1.00
-134.40,-24.00,1.00,0.00,1.00
-139.20,-19.20,1.00,0.00,1.00
-144.00,-19.20,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
--134.40,24.00,1.00,0.00,1.00
--129.60,24.00,1.00,0.00,1.00
--124.80,24.00,1.00,0.00,1.00
--120.00,24.00,1.00,0.00,1.00
--115.20,28.80,1.00,0.00,1.00
--105.60,28.80,1.00,0.00,1.00
--100.80,28.80,1.00,0.00,1.00
--96.00,28.80,1.00,0.00,1.00
--91.20,28.80,1.00,0.00,1.00
--86.40,28.80,1.00,0.00,1.00
--81.60,28.80,1.00,0.00,1.00
--76.80,28.80,1.00,0.00,1.00
--72.00,28.80,1.00,0.00,1.00
--62.40,24.00,1.00,0.00,1.00
--57.60,24.00,1.00,0.00,1.00
--52.80,24.00,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
--43.20,19.20,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
--33.60,19.20,1.00,0.00,1.00
--28.80,14.40,1.00,0.00,1.00
--24.00,14.40,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
-28.80,-19.20,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
-38.40,-24.00,1.00,0.00,1.00
-43.20,-24.00,1.00,0.00,1.00
-48.00,-24.00,1.00,0.00,1.00
-52.80,-28.80,1.00,0.00,1.00
-57.60,-28.80,1.00,0.00,1.00
-62.40,-28.80,1.00,0.00,1.00
-67.20,-33.60,1.00,0.00,1.00
-72.00,-33.60,1.00,0.00,1.00
-81.60,-33.60,1.00,0.00,1.00
-86.40,-33.60,1.00,0.00,1.00
-91.20,-33.60,1.00,0.00,1.00
-96.00,-33.60,1.00,0.00,1.00
-100.80,-33.60,1.00,0.00,1.00
-110.40,-33.60,1.00,0.00,1.00
-115.20,-33.60,1.00,0.00,1.00
-120.00,-28.80,1.00,0.00,1.00
-124.80,-28.80,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
-134.40,-24.00,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
-144.00,-19.20,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
--148.80,19.20,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
--139.20,24.00,1.00,0.00,1.00
--134.40,24.00,1.00,0.00,1.00
--129.60,28.80,1.00,0.00,1.00
--124.80,28.80,1.00,0.00,1.00
--120.00,28.80,1.00,0.00,1.00
--115.20,33.60,1.00,0.00,1.00
--110.40,33.60,1.00,0.00,1.00
--100.80,33.60,1.00,0.00,1.00
--96.00,33.60,1.00,0.00,1.00
--91.20,33.60,1.00,0.00,1.00
--86.40,33.60,1.00,0.00,1.00
--81.60,33.60,1.00,0.00,1.00
--72.00,33.60,1.00,0.00,1.00
--67.20,33.60,1.00,0.00,1.00
--62.40,28.80,1.00,0.00,1.00
--57.60,28.80,1.00,0.00,1.00
--52.80,28.80,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
--43.20,24.00,1.00,0.00,1.00
--38.40,24.00,1.00,0.00,1.00
--33.60,19.20,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
--24.00,14.40,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-24.00,-19.20,1.00,0.00,1.00
-28.80,-19.20,1.00,0.00,1.00
-33.60,-24.00,1.00,0.00,1.00
-38.40,-24.00,1.00,0.00,1.00
-43.20,-28.80,1.00,0.00,1.00
-48.00,-28.80,1.00,0.00,1.00
-52.80,-33.60,1.00,0.00,1.00
-57.60,-33.60,1.00,0.00,1.00
-62.40,-33.60,1.00,0.00,1.00
-67.20,-38.40,1.00,0.00,1.00
-72.00,-38.40,1.00,0.00,1.00
-81.60,-38.40,1.00,0.00,1.00
-86.40,-38.40,1.00,0.00,1.00
-91.20,-38.40,1.00,0.00,1.00
-96.00,-38.40,1.00,0.00,1.00
-105.60,-38.40,1.00,0.00,1.00
-110.40,-38.40,1.00,0.00,1.00
-115.20,-33.60,1.00,0.00,1.00
-120.00,-33.60,1.00,0.00,1.00
-124.80,-33.60,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
-134.40,-28.80,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
-144.00,-24.00,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
-153.60,-19.20,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
--148.80,19.20,1.00,0.00,1.00
--144.00,24.00,1.00,0.00,1.00
--139.20,24.00,1.00,0.00,1.00
--134.40,28.80,1.00,0.00,1.00
--129.60,28.80,1.00,0.00,1.00
--124.80,33.60,1.00,0.00,1.00
--120.00,33.60,1.00,0.00,1.00
--115.20,33.60,1.00,0.00,1.00
--110.40,38.40,1.00,0.00,1.00
--105.60,38.40,1.00,0.00,1.00
--96.00,38.40,1.00,0.00,1.00
--91.20,38.40,1.00,0.00,1.00
--86.40,38.40,1.00,0.00,1.00
--81.60,38.40,1.00,0.00,1.00
--72.00,38.40,1.00,0.00,1.00
--67.20,38.40,1.00,0.00,1.00
--62.40,33.60,1.00,0.00,1.00
--57.60,33.60,1.00,0.00,1.00
--52.80,33.60,1.00,0.00,1.00
--48.00,28.80,1.00,0.00,1.00
--43.20,28.80,1.00,0.00,1.00
--38.40,24.00,1.00,0.00,1.00
--33.60,24.00,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-24.00,-19.20,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-28.80,-24.00,1.00,0.00,1.00
-33.60,-28.80,1.00,0.00,1.00
-38.40,-28.80,1.00,0.00,1.00
-43.20,-33.60,1.00,0.00,1.00
-48.00,-33.60,1.00,0.00,1.00
-52.80,-38.40,1.00,0.00,1.00
-62.40,-38.40,1.00,0.00,1.00
-67.20,-38.40,1.00,0.00,1.00
-72.00,-43.20,1.00,0.00,1.00
-76.80,-43.20,1.00,0.00,1.00
-86.40,-43.20,1.00,0.00,1.00
-91.20,-43.20,1.00,0.00,1.00
-96.00,-43.20,1.00,0.00,1.00
-105.60,-43.20,1.00,0.00,1.00
-110.40,-43.20,1.00,0.00,1.00
-115.20,-38.40,1.00,0.00,1.00
-124.80,-38.40,1.00,0.00,1.00
-129.60,-38.40,1.00,0.00,1.00
-134.40,-33.60,1.00,0.00,1.00
-139.20,-33.60,1.00,0.00,1.00
-144.00,-28.80,1.00,0.00,1.00
-148.80,-28.80,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--158.40,19.20,1.00,0.00,1.00
--158.40,19.20,1.00,0.00,1.00
--153.60,24.00,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
--144.00,28.80,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
--134.40,33.60,1.00,0.00,1.00
--129.60,38.40,1.00,0.00,1.00
--124.80,38.40,1.00,0.00,1.00
--115.20,38.40,1.00,0.00,1.00
--110.40,43.20,1.00,0.00,1.00
--105.60,43.20,1.00,0.00,1.00
--96.00,43.20,1.00,0.00,1.00
--91.20,43.20,1.00,0.00,1.00
--86.40,43.20,1.00,0.00,1.00
--76.80,43.20,1.00,0.00,1.00
--72.00,43.20,1.00,0.00,1.00
--67.20,38.40,1.00,0.00,1.00
--62.40,38.40,1.00,0.00,1.00
--52.80,38.40,1.00,0.00,1.00
--48.00,33.60,1.00,0.00,1.00
--43.20,33.60,1.00,0.00,1.00
--38.40,28.80,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
--28.80,24.00,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-19.20,-19.20,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-28.80,-28.80,1.00,0.00,1.00
-33.60,-28.80,1.00,0.00,1.00
-38.40,-33.60,1.00,0.00,1.00
-43.20,-38.40,1.00,0.00,1.00
-48.00,-38.40,1.00,0.00,1.00
-52.80,-43.20,1.00,0.00,1.00
-57.60,-43.20,1.00,0.00,1.00
-62.40,-43.20,1.00,0.00,1.00
-72.00,-48.00,1.00,0.00,1.00
-76.80,-48.00,1.00,0.00,1.00
-86.40,-48.00,1.00,0.00,1.00
-91.20,-48.00,1.00,0.00,1.00
-100.80,-48.00,1.00,0.00,1.00
-105.60,-48.00,1.00,0.00,1.00
-110.40,-48.00,1.00,0.00,1.00
-120.00,-43.20,1.00,0.00,1.00
-124.80,-43.20,1.00,0.00,1.00
-129.60,-38.40,1.00,0.00,1.00
-134.40,-38.40,1.00,0.00,1.00
-139.20,-33.60,1.00,0.00,1.00
-144.00,-33.60,1.00,0.00,1.00
-148.80,-28.80,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
-158.40,-24.00,1.00,0.00,1.00
-163.20,-19.20,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--168.00,14.40,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--163.20,19.20,1.00,0.00,1.00
--158.40,24.00,1.00,0.00,1.00
--153.60,24.00,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
--144.00,33.60,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
--134.40,38.40,1.00,0.00,1.00
--129.60,38.40,1.00,0.00,1.00
--124.80,43.20,1.00,0.00,1.00
--120.00,43.20,1.00,0.00,1.00
--110.40,48.00,1.00,0.00,1.00
--105.60,48.00,1.00,0.00,1.00
--100.80,48.00,1.00,0.00,1.00
--91.20,48.00,1.00,0.00,1.00
--86.40,48.00,1.00,0.00,1.00
--76.80,48.00,1.00,0.00,1.00
--72.00,48.00,1.00,0.00,1.00
--62.40,43.20,1.00,0.00,1.00
--57.60,43.20,1.00,0.00,1.00
--52.80,43.20,1.00,0.00,1.00
--48.00,38.40,1.00,0.00,1.00
--43.20,38.40,1.00,0.00,1.00
--38.40,33.60,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
--28.80,28.80,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--19.20,19.20,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-19.20,-24.00,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-24.00,-28.80,1.00,0.00,1.00
-28.80,-33.60,1.00,0.00,1.00
-33.60,-38.40,1.00,0.00,1.00
-38.40,-38.40,1.00,0.00,1.00
-43.20,-43.20,1.00,0.00,1.00
-48.00,-43.20,1.00,0.00,1.00
-52.80,-48.00,1.00,0.00,1.00
-62.40,-48.00,1.00,0.00,1.00
-67.20,-52.80,1.00,0.00,1.00
-76.80,-52.80,1.00,0.00,1.00
-86.40,-52.80,1.00,0.00,1.00
-91.20,-52.80,1.00,0.00,1.00
-100.80,-52.80,1.00,0.00,1.00
-105.60,-52.80,1.00,0.00,1.00
-115.20,-48.00,1.00,0.00,1.00
-120.00,-48.00,1.00,0.00,1.00
-129.60,-48.00,1.00,0.00,1.00
-134.40,-43.20,1.00,0.00,1.00
-139.20,-43.20,1.00,0.00,1.00
-144.00,-38.40,1.00,0.00,1.00
-148.80,-33.60,1.00,0.00,1.00
-153.60,-33.60,1.00,0.00,1.00
-158.40,-28.80,1.00,0.00,1.00
-158.40,-24.00,1.00,0.00,1.00
-163.20,-19.20,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--168.00,14.40,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--163.20,19.20,1.00,0.00,1.00
--158.40,24.00,1.00,0.00,1.00
--158.40,28.80,1.00,0.00,1.00
--153.60,33.60,1.00,0.00,1.00
--148.80,33.60,1.00,0.00,1.00
--144.00,38.40,1.00,0.00,1.00
--139.20,43.20,1.00,0.00,1.00
--134.40,43.20,1.00,0.00,1.00
--129.60,48.00,1.00,0.00,1.00
--120.00,48.00,1.00,0.00,1.00
--115.20,48.00,1.00,0.00,1.00
--105.60,52.80,1.00,0.00,1.00
--100.80,52.80,1.00,0.00,1.00
--91.20,52.80,1.00,0.00,1.00
--86.40,52.80,1.00,0.00,1.00
--76.80,52.80,1.00,0.00,1.00
--67.20,52.80,1.00,0.00,1.00
--62.40,48.00,1.00,0.00,1.00
--52.80,48.00,1.00,0.00,1.00
--48.00,43.20,1.00,0.00,1.00
--43.20,43.20,1.00,0.00,1.00
--38.40,38.40,1.00,0.00,1.00
--33.60,38.40,1.00,0.00,1.00
--28.80,33.60,1.00,0.00,1.00
--24.00,28.80,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--19.20,24.00,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-19.20,-28.80,1.00,0.00,1.00
-24.00,-33.60,1.00,0.00,1.00
-28.80,-33.60,1.00,0.00,1.00
-28.80,-38.40,1.00,0.00,1.00
-33.60,-43.20,1.00,0.00,1.00
-38.40,-43.20,1.00,0.00,1.00
-48.00,-48.00,1.00,0.00,1.00
-52.80,-52.80,1.00,0.00,1.00
-57.60,-52.80,1.00,0.00,1.00
-67.20,-57.60,1.00,0.00,1.00
-76.80,-57.60,1.00,0.00,1.00
-81.60,-57.60,1.00,0.00,1.00
-91.20,-57.60,1.00,0.00,1.00
-100.80,-57.60,1.00,0.00,1.00
-110.40,-57.60,1.00,0.00,1.00
-115.20,-52.80,1.00,0.00,1.00
-124.80,-52.80,1.00,0.00,1.00
-129.60,-48.00,1.00,0.00,1.00
-139.20,-48.00,1.00,0.00,1.00
-144.00,-43.20,1.00,0.00,1.00
-148.80,-38.40,1.00,0.00,1.00
-153.60,-38.40,1.00,0.00,1.00
-153.60,-33.60,1.00,0.00,1.00
-158.40,-28.80,1.00,0.00,1.00
-163.20,-24.00,1.00,0.00,1.00
-163.20,-24.00,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--163.20,24.00,1.00,0.00,1.00
--163.20,24.00,1.00,0.00,1.00
--158.40,28.80,1.00,0.00,1.00
--153.60,33.60,1.00,0.00,1.00
--153.60,38.40,1.00,0.00,1.00
--148.80,38.40,1.00,0.00,1.00
--144.00,43.20,1.00,0.00,1.00
--139.20,48.00,1.00,0.00,1.00
--129.60,48.00,1.00,0.00,1.00
--124.80,52.80,1.00,0.00,1.00
--115.20,52.80,1.00,0.00,1.00
--110.40,57.60,1.00,0.00,1.00
--100.80,57.60,1.00,0.00,1.00
--91.20,57.60,1.00,0.00,1.00
--81.60,57.60,1.00,0.00,1.00
--76.80,57.60,1.00,0.00,1.00
--67.20,57.60,1.00,0.00,1.00
--57.60,52.80,1.00,0.00,1.00
--52.80,52.80,1.00,0.00,1.00
--48.00,48.00,1.00,0.00,1.00
--38.40,43.20,1.00,0.00,1.00
--33.60,43.20,1.00,0.00,1.00
--28.80,38.40,1.00,0.00,1.00
--28.80,33.60,1.00,0.00,1.00
--24.00,33.60,1.00,0.00,1.00
--19.20,28.80,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-19.20,-28.80,1.00,0.00,1.00
-19.20,-33.60,1.00,0.00,1.00
-24.00,-38.40,1.00,0.00,1.00
-28.80,-43.20,1.00,0.00,1.00
-33.60,-43.20,1.00,0.00,1.00
-38.40,-48.00,1.00,0.00,1.00
-43.20,-52.80,1.00,0.00,1.00
-48.00,-52.80,1.00,0.00,1.00
-52.80,-57.60,1.00,0.00,1.00
-62.40,-57.60,1.00,0.00,1.00
-72.00,-62.40,1.00,0.00,1.00
-81.60,-62.40,1.00,0.00,1.00
-91.20,-62.40,1.00,0.00,1.00
-100.80,-62.40,1.00,0.00,1.00
-110.40,-62.40,1.00,0.00,1.00
-120.00,-57.60,1.00,0.00,1.00
-129.60,-57.60,1.00,0.00,1.00
-134.40,-52.80,1.00,0.00,1.00
-139.20,-48.00,1.00,0.00,1.00
-144.00,-48.00,1.00,0.00,1.00
-148.80,-43.20,1.00,0.00,1.00
-153.60,-38.40,1.00,0.00,1.00
-158.40,-33.60,1.00,0.00,1.00
-163.20,-33.60,1.00,0.00,1.00
-163.20,-28.80,1.00,0.00,1.00
-168.00,-24.00,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--168.00,24.00,1.00,0.00,1.00
--163.20,28.80,1.00,0.00,1.00
--163.20,33.60,1.00,0.00,1.00
--158.40,33.60,1.00,0.00,1.00
--153.60,38.40,1.00,0.00,1.00
--148.80,43.20,1.00,0.00,1.00
--144.00,48.00,1.00,0.00,1.00
--139.20,48.00,1.00,0.00,1.00
--134.40,52.80,1.00,0.00,1.00
--129.60,57.60,1.00,0.00,1.00
--120.00,57.60,1.00,0.00,1.00
--110.40,62.40,1.00,0.00,1.00
--100.80,62.40,1.00,0.00,1.00
--91.20,62.40,1.00,0.00,1.00
--81.60,62.40,1.00,0.00,1.00
--72.00,62.40,1.00,0.00,1.00
--62.40,57.60,1.00,0.00,1.00
--52.80,57.60,1.00,0.00,1.00
--48.00,52.80,1.00,0.00,1.00
--43.20,52.80,1.00,0.00,1.00
--38.40,48.00,1.00,0.00,1.00
--33.60,43.20,1.00,0.00,1.00
--28.80,43.20,1.00,0.00,1.00
--24.00,38.40,1.00,0.00,1.00
--19.20,33.60,1.00,0.00,1.00
--19.20,28.80,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-9.60,-24.00,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-14.40,-28.80,1.00,0.00,1.00
-19.20,-33.60,1.00,0.00,1.00
-19.20,-38.40,1.00,0.00,1.00
-24.00,-43.20,1.00,0.00,1.00
-28.80,-48.00,1.00,0.00,1.00
-33.60,-52.80,1.00,0.00,1.00
-38.40,-52.80,1.00,0.00,1.00
-43.20,-57.60,1.00,0.00,1.00
-48.00,-62.40,1.00,0.00,1.00
-57.60,-62.40,1.00,0.00,1.00
-67.20,-67.20,1.00,0.00,1.00
-81.60,-67.20,1.00,0.00,1.00
-91.20,-67.20,1.00,0.00,1.00
-105.60,-67.20,1.00,0.00,1.00
-115.20,-67.20,1.00,0.00,1.00
-124.80,-62.40,1.00,0.00,1.00
-134.40,-57.60,1.00,0.00,1.00
-139.20,-57.60,1.00,0.00,1.00
-144.00,-52.80,1.00,0.00,1.00
-148.80,-48.00,1.00,0.00,1.00
-153.60,-43.20,1.00,0.00,1.00
-158.40,-43.20,1.00,0.00,1.00
-163.20,-38.40,1.00,0.00,1.00
-163.20,-33.60,1.00,0.00,1.00
-168.00,-28.80,1.00,0.00,1.00
-168.00,-24.00,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--168.00,24.00,1.00,0.00,1.00
--168.00,28.80,1.00,0.00,1.00
--163.20,33.60,1.00,0.00,1.00
--163.20,38.40,1.00,0.00,1.00
--158.40,43.20,1.00,0.00,1.00
--153.60,43.20,1.00,0.00,1.00
--148.80,48.00,1.00,0.00,1.00
--144.00,52.80,1.00,0.00,1.00
--139.20,57.60,1.00,0.00,1.00
--134.40,57.60,1.00,0.00,1.00
--124.80,62.40,1.00,0.00,1.00
--115.20,67.20,1.00,0.00,1.00
--105.60,67.20,1.00,0.00,1.00
--91.20,67.20,1.00,0.00,1.00
--81.60,67.20,1.00,0.00,1.00
--67.20,67.20,1.00,0.00,1.00
--57.60,62.40,1.00,0.00,1.00
--48.00,62.40,1.00,0.00,1.00
--43.20,57.60,1.00,0.00,1.00
--38.40,52.80,1.00,0.00,1.00
--33.60,52.80,1.00,0.00,1.00
--28.80,48.00,1.00,0.00,1.00
--24.00,43.20,1.00,0.00,1.00
--19.20,38.40,1.00,0.00,1.00
--19.20,33.60,1.00,0.00,1.00
--14.40,28.80,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--9.60,24.00,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-9.60,-24.00,1.00,0.00,1.00
-9.60,-28.80,1.00,0.00,1.00
-9.60,-33.60,1.00,0.00,1.00
-14.40,-38.40,1.00,0.00,1.00
-14.40,-38.40,1.00,0.00,1.00
-19.20,-43.20,1.00,0.00,1.00
-24.00,-48.00,1.00,0.00,1.00
-24.00,-52.80,1.00,0.00,1.00
-28.80,-57.60,1.00,0.00,1.00
-38.40,-62.40,1.00,0.00,1.00
-43.20,-62.40,1.00,0.00,1.00
-52.80,-67.20,1.00,0.00,1.00
-62.40,-72.00,1.00,0.00,1.00
-76.80,-72.00,1.00,0.00,1.00
-96.00,-72.00,1.00,0.00,1.00
-110.40,-72.00,1.00,0.00,1.00
-120.00,-67.20,1.00,0.00,1.00
-134.40,-67.20,1.00,0.00,1.00
-139.20,-62.40,1.00,0.00,1.00
-148.80,-57.60,1.00,0.00,1.00
-153.60,-57.60,1.00,0.00,1.00
-158.40,-52.80,1.00,0.00,1.00
-158.40,-48.00,1.00,0.00,1.00
-163.20,-43.20,1.00,0.00,1.00
-163.20,-38.40,1.00,0.00,1.00
-168.00,-33.60,1.00,0.00,1.00
-168.00,-28.80,1.00,0.00,1.00
-172.80,-24.00,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--172.80,24.00,1.00,0.00,1.00
--168.00,28.80,1.00,0.00,1.00
--168.00,33.60,1.00,0.00,1.00
--163.20,38.40,1.00,0.00,1.00
--163.20,43.20,1.00,0.00,1.00
--158.40,48.00,1.00,0.00,1.00
--158.40,52.80,1.00,0.00,1.00
--153.60,57.60,1.00,0.00,1.00
--148.80,57.60,1.00,0.00,1.00
--139.20,62.40,1.00,0.00,1.00
--134.40,67.20,1.00,0.00,1.00
--120.00,67.20,1.00,0.00,1.00
--110.40,72.00,1.00,0.00,1.00
--96.00,72.00,1.00,0.00,1.00
--76.80,72.00,1.00,0.00,1.00
--62.40,72.00,1.00,0.00,1.00
--52.80,67.20,1.00,0.00,1.00
--43.20,62.40,1.00,0.00,1.00
--38.40,62.40,1.00,0.00,1.00
--28.80,57.60,1.00,0.00,1.00
--24.00,52.80,1.00,0.00,1.00
--24.00,48.00,1.00,0.00,1.00
--19.20,43.20,1.00,0.00,1.00
--14.40,38.40,1.00,0.00,1.00
--14.40,38.40,1.00,0.00,1.00
--9.60,33.60,1.00,0.00,1.00
--9.60,28.80,1.00,0.00,1.00
--9.60,24.00,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-4.80,-24.00,1.00,0.00,1.00
-4.80,-28.80,1.00,0.00,1.00
-9.60,-33.60,1.00,0.00,1.00
-9.60,-38.40,1.00,0.00,1.00
-14.40,-43.20,1.00,0.00,1.00
-14.40,-48.00,1.00,0.00,1.00
-14.40,-52.80,1.00,0.00,1.00
-19.20,-57.60,1.00,0.00,1.00
-24.00,-57.60,1.00,0.00,1.00
-28.80,-62.40,1.00,0.00,1.00
-33.60,-67.20,1.00,0.00,1.00
-43.20,-72.00,1.00,0.00,1.00
-57.60,-72.00,1.00,0.00,1.00
-76.80,-76.80,1.00,0.00,1.00
-96.00,-76.80,1.00,0.00,1.00
-115.20,-76.80,1.00,0.00,1.00
-129.60,-72.00,1.00,0.00,1.00
-139.20,-72.00,1.00,0.00,1.00
-148.80,-67.20,1.00,0.00,1.00
-153.60,-62.40,1.00,0.00,1.00
-158.40,-57.60,1.00,0.00,1.00
-163.20,-52.80,1.00,0.00,1.00
-163.20,-48.00,1.00,0.00,1.00
-168.00,-43.20,1.00,0.00,1.00
-168.00,-38.40,1.00,0.00,1.00
-172.80,-33.60,1.00,0.00,1.00
-172.80,-28.80,1.00,0.00,1.00
-172.80,-24.00,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--172.80,24.00,1.00,0.00,1.00
--172.80,28.80,1.00,0.00,1.00
--172.80,33.60,1.00,0.00,1.00
--168.00,38.40,1.00,0.00,1.00
--168.00,43.20,1.00,0.00,1.00
--163.20,48.00,1.00,0.00,1.00
--163.20,52.80,1.00,0.00,1.00
--158.40,57.60,1.00,0.00,1.00
--153.60,62.40,1.00,0.00,1.00
--148.80,67.20,1.00,0.00,1.00
--139.20,72.00,1.00,0.00,1.00
--129.60,72.00,1.00,0.00,1.00
--115.20,76.80,1.00,0.00,1.00
--96.00,76.80,1.00,0.00,1.00
--76.80,76.80,1.00,0.00,1.00
--57.60,72.00,1.00,0.00,1.00
--43.20,72.00,1.00,0.00,1.00
--33.60,67.20,1.00,0.00,1.00
--28.80,62.40,1.00,0.00,1.00
--24.00,57.60,1.00,0.00,1.00
--19.20,57.60,1.00,0.00,1.00
--14.40,52.80,1.00,0.00,1.00
--14.40,48.00,1.00,0.00,1.00
--14.40,43.20,1.00,0.00,1.00
--9.60,38.40,1.00,0.00,1.00
--9.60,33.60,1.00,0.00,1.00
--4.80,28.80,1.00,0.00,1.00
--4.80,24.00,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-14.40,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-4.80,-24.00,1.00,0.00,1.00
-4.80,-28.80,1.00,0.00,1.00
-4.80,-33.60,1.00,0.00,1.00
-4.80,-38.40,1.00,0.00,1.00
-9.60,-43.20,1.00,0.00,1.00
-9.60,-48.00,1.00,0.00,1.00
-9.60,-52.80,1.00,0.00,1.00
-14.40,-57.60,1.00,0.00,1.00
-14.40,-62.40,1.00,0.00,1.00
-19.20,-67.20,1.00,0.00,1.00
-24.00,-72.00,1.00,0.00,1.00
-33.60,-72.00,1.00,0.00,1.00
-43.20,-76.80,1.00,0.00,1.00
-67.20,-81.60,1.00,0.00,1.00
-96.00,-81.60,1.00,0.00,1.00
-124.80,-81.60,1.00,0.00,1.00
-144.00,-76.80,1.00,0.00,1.00
-153.60,-72.00,1.00,0.00,1.00
-158.40,-67.20,1.00,0.00,1.00
-163.20,-62.40,1.00,0.00,1.00
-168.00,-57.60,1.00,0.00,1.00
-168.00,-52.80,1.00,0.00,1.00
-168.00,-48.00,1.00,0.00,1.00
-172.80,-43.20,1.00,0.00,1.00
-172.80,-38.40,1.00,0.00,1.00
-172.80,-33.60,1.00,0.00,1.00
-172.80,-28.80,1.00,0.00,1.00
-177.60,-24.00,1.00,0.00,1.00
-177.60,-19.20,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--177.60,19.20,1.00,0.00,1.00
--177.60,24.00,1.00,0.00,1.00
--172.80,28.80,1.00,0.00,1.00
--172.80,33.60,1.00,0.00,1.00
--172.80,38.40,1.00,0.00,1.00
--172.80,43.20,1.00,0.00,1.00
--168.00,48.00,1.00,0.00,1.00
--168.00,52.80,1.00,0.00,1.00
--168.00,57.60,1.00,0.00,1.00
--163.20,62.40,1.00,0.00,1.00
--158.40,67.20,1.00,0.00,1.00
--153.60,72.00,1.00,0.00,1.00
--144.00,76.80,1.00,0.00,1.00
--124.80,81.60,1.00,0.00,1.00
--96.00,81.60,1.00,0.00,1.00
--67.20,81.60,1.00,0.00,1.00
--43.20,76.80,1.00,0.00,1.00
--33.60,72.00,1.00,0.00,1.00
--24.00,72.00,1.00,0.00,1.00
--19.20,67.20,1.00,0.00,1.00
--14.40,62.40,1.00,0.00,1.00
--14.40,57.60,1.00,0.00,1.00
--9.60,52.80,1.00,0.00,1.00
--9.60,48.00,1.00,0.00,1.00
--9.60,43.20,1.00,0.00,1.00
--4.80,38.40,1.00,0.00,1.00
--4.80,33.60,1.00,0.00,1.00
--4.80,28.80,1.00,0.00,1.00
--4.80,24.00,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--0.00,14.40,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-14.40,1.00,0.00,1.00
-0.00,-19.20,1.00,0.00,1.00
-0.00,-24.00,1.00,0.00,1.00
-0.00,-28.80,1.00,0.00,1.00
-0.00,-33.60,1.00,0.00,1.00
-4.80,-38.40,1.00,0.00,1.00
-4.80,-43.20,1.00,0.00,1.00
-4.80,-48.00,1.00,0.00,1.00
-4.80,-52.80,1.00,0.00,1.00
-4.80,-57.60,1.00,0.00,1.00
-4.80,-62.40,1.00,0.00,1.00
-9.60,-67.20,1.00,0.00,1.00
-9.60,-72.00,1.00,0.00,1.00
-14.40,-76.80,1.00,0.00,1.00
-24.00,-81.60,1.00,0.00,1.00
-43.20,-86.40,1.00,0.00,1.00
-110.40,-86.40,1.00,0.00,1.00
-148.80,-81.60,1.00,0.00,1.00
-163.20,-76.80,1.00,0.00,1.00
-168.00,-72.00,1.00,0.00,1.00
-172.80,-67.20,1.00,0.00,1.00
-172.80,-62.40,1.00,0.00,1.00
-172.80,-57.60,1.00,0.00,1.00
-172.80,-52.80,1.00,0.00,1.00
-177.60,-48.00,1.00,0.00,1.00
-177.60,-43.20,1.00,0.00,1.00
-177.60,-38.40,1.00,0.00,1.00
-177.60,-33.60,1.00,0.00,1.00
-177.60,-28.80,1.00,0.00,1.00
-177.60,-24.00,1.00,0.00,1.00
-177.60,-19.20,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--177.60,19.20,1.00,0.00,1.00
--177.60,24.00,1.00,0.00,1.00
--177.60,28.80,1.00,0.00,1.00
--177.60,33.60,1.00,0.00,1.00
--177.60,38.40,1.00,0.00,1.00
--177.60,43.20,1.00,0.00,1.00
--177.60,48.00,1.00,0.00,1.00
--172.80,52.80,1.00,0.00,1.00
--172.80,57.60,1.00,0.00,1.00
--172.80,62.40,1.00,0.00,1.00
--172.80,67.20,1.00,0.00,1.00
--168.00,72.00,1.00,0.00,1.00
--163.20,76.80,1.00,0.00,1.00
--148.80,81.60,1.00,0.00,1.00
--110.40,86.40,1.00,0.00,1.00
--43.20,86.40,1.00,0.00,1.00
--24.00,81.60,1.00,0.00,1.00
--14.40,76.80,1.00,0.00,1.00
--9.60,72.00,1.00,0.00,1.00
--9.60,67.20,1.00,0.00,1.00
--4.80,62.40,1.00,0.00,1.00
--4.80,57.60,1.00,0.00,1.00
--4.80,52.80,1.00,0.00,1.00
--4.80,48.00,1.00,0.00,1.00
--4.80,43.20,1.00,0.00,1.00
--4.80,38.40,1.00,0.00,1.00
--0.00,33.60,1.00,0.00,1.00
--0.00,28.80,1.00,0.00,1.00
--0.00,24.00,1.00,0.00,1.00
--0.00,19.20,1.00,0.00,1.00
--0.00,14.40,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
--0.00,-9.60,1.00,0.00,1.00
--0.00,-14.40,1.00,0.00,1.00
--0.00,-19.20,1.00,0.00,1.00
--0.00,-24.00,1.00,0.00,1.00
--0.00,-28.80,1.00,0.00,1.00
--0.00,-33.60,1.00,0.00,1.00
--0.00,-38.40,1.00,0.00,1.00
--0.00,-43.20,1.00,0.00,1.00
--0.00,-48.00,1.00,0.00,1.00
--0.00,-52.80,1.00,0.00,1.00
--0.00,-57.60,1.00,0.00,1.00
--0.00,-62.40,1.00,0.00,1.00
--4.80,-67.20,1.00,0.00,1.00
--4.80,-72.00,1.00,0.00,1.00
--4.80,-76.80,1.00,0.00,1.00
--9.60,-81.60,1.00,0.00,1.00
--19.20,-86.40,1.00,0.00,1.00
--134.40,-86.40,1.00,0.00,1.00
--168.00,-81.60,1.00,0.00,1.00
--172.80,-76.80,1.00,0.00,1.00
--177.60,-72.00,1.00,0.00,1.00
--177.60,-67.20,1.00,0.00,1.00
--177.60,-62.40,1.00,0.00,1.00
--177.60,-57.60,1.00,0.00,1.00
--177.60,-52.80,1.00,0.00,1.00
--177.60,-48.00,1.00,0.00,1.00
--177.60,-43.20,1.00,0.00,1.00
--177.60,-38.40,1.00,0.00,1.00
--177.60,-33.60,1.00,0.00,1.00
--177.60,-28.80,1.00,0.00,1.00
--177.60,-24.00,1.00,0.00,1.00
--177.60,-19.20,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,19.20,1.00,0.00,1.00
-177.60,24.00,1.00,0.00,1.00
-177.60,28.80,1.00,0.00,1.00
-177.60,33.60,1.00,0.00,1.00
-177.60,38.40,1.00,0.00,1.00
-177.60,43.20,1.00,0.00,1.00
-177.60,48.00,1.00,0.00,1.00
-177.60,52.80,1.00,0.00,1.00
-177.60,57.60,1.00,0.00,1.00
-177.60,62.40,1.00,0.00,1.00
-177.60,67.20,1.00,0.00,1.00
-177.60,72.00,1.00,0.00,1.00
-172.80,76.80,1.00,0.00,1.00
-168.00,81.60,1.00,0.00,1.00
-134.40,86.40,1.00,0.00,1.00
-19.20,86.40,1.00,0.00,1.00
-9.60,81.60,1.00,0.00,1.00
-4.80,76.80,1.00,0.00,1.00
-4.80,72.00,1.00,0.00,1.00
-4.80,67.20,1.00,0.00,1.00
-0.00,62.40,1.00,0.00,1.00
-0.00,57.60,1.00,0.00,1.00
-0.00,52.80,1.00,0.00,1.00
-0.00,48.00,1.00,0.00,1.00
-0.00,43.20,1.00,0.00,1.00
-0.00,38.40,1.00,0.00,1.00
-0.00,33.60,1.00,0.00,1.00
-0.00,28.80,1.00,0.00,1.00
-0.00,24.00,1.00,0.00,1.00
-0.00,19.20,1.00,0.00,1.00
-0.00,14.40,1.00,0.00,1.00
-0.00,9.60,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
+0.00,0.00,0.00,0.00,1.00,0.00,0.00,0
+4.80,0.00,0.02,0.00,1.00,0.00,-4.80,0
+9.60,0.00,0.04,0.00,1.00,0.00,4.80,0
+14.40,0.00,0.06,0.00,1.00,0.00,-9.60,0
+19.20,0.00,0.09,0.00,1.00,0.00,14.40,0
+24.00,0.00,0.11,0.00,1.00,0.00,-14.40,0
+28.80,0.00,0.13,0.00,1.00,0.00,19.20,0
+33.60,0.00,0.15,0.00,1.00,0.00,-24.00,0
+38.40,0.00,0.17,0.00,1.00,0.00,24.00,0
+43.20,0.00,0.19,0.00,1.00,0.00,-28.80,0
+48.00,0.00,0.21,0.00,1.00,0.00,33.60,0
+52.80,0.00,0.23,0.00,1.00,0.00,-33.60,0
+57.60,0.00,0.26,0.00,1.00,0.00,38.40,0
+62.40,0.00,0.28,0.00,1.00,4.80,-38.40,0
+67.20,0.00,0.30,0.00,1.00,4.80,38.40,0
+72.00,0.00,0.32,0.00,1.00,4.80,-43.20,0
+76.80,0.00,0.34,0.00,1.00,9.60,43.20,0
+81.60,0.00,0.36,0.00,1.00,19.20,-43.20,0
+86.40,0.00,0.38,0.00,1.00,134.40,43.20,0
+91.20,0.00,0.41,0.00,1.00,168.00,-43.20,0
+96.00,0.00,0.43,0.00,1.00,172.80,43.20,0
+100.80,0.00,0.45,0.00,1.00,177.60,-43.20,0
+105.60,0.00,0.47,0.00,1.00,177.60,43.20,0
+110.40,0.00,0.49,0.00,1.00,177.60,-43.20,0
+115.20,0.00,0.51,0.00,1.00,177.60,38.40,0
+120.00,0.00,0.53,0.00,1.00,177.60,-38.40,0
+124.80,0.00,0.56,0.00,1.00,177.60,33.60,0
+129.60,0.00,0.58,0.00,1.00,177.60,-33.60,0
+134.40,0.00,0.60,0.00,1.00,177.60,28.80,0
+139.20,0.00,0.62,0.00,1.00,177.60,-28.80,0
+144.00,0.00,0.64,0.00,1.00,177.60,24.00,0
+148.80,0.00,0.66,0.00,1.00,177.60,-19.20,0
+153.60,0.00,0.68,0.00,1.00,177.60,19.20,0
+158.40,0.00,0.70,0.00,1.00,177.60,-14.40,0
+163.20,0.00,0.73,0.00,1.00,177.60,9.60,0
+168.00,0.00,0.75,0.00,1.00,177.60,-9.60,0
+172.80,0.00,0.77,0.00,1.00,177.60,4.80,0
+177.60,0.00,0.79,0.00,1.00,-177.60,-0.00,0
+-177.60,0.00,0.81,0.00,1.00,-177.60,-0.00,0
+-172.80,0.00,0.83,0.00,1.00,-177.60,4.80,0
+-168.00,0.00,0.85,0.00,1.00,-177.60,-9.60,0
+-163.20,0.00,0.88,0.00,1.00,-177.60,9.60,0
+-158.40,0.00,0.90,0.00,1.00,-177.60,-14.40,0
+-153.60,0.00,0.92,0.00,1.00,-177.60,19.20,0
+-148.80,0.00,0.94,0.00,1.00,-177.60,-19.20,0
+-144.00,0.00,0.96,0.00,1.00,-177.60,24.00,0
+-139.20,0.00,0.98,0.00,1.00,-177.60,-28.80,0
+-134.40,0.00,1.00,0.00,1.00,-177.60,28.80,0
+-129.60,0.00,1.03,0.00,1.00,-177.60,-33.60,0
+-124.80,0.00,1.05,0.00,1.00,-177.60,33.60,0
+-120.00,0.00,1.07,0.00,1.00,-177.60,-38.40,0
+-115.20,0.00,1.09,0.00,1.00,-177.60,38.40,0
+-110.40,0.00,1.11,0.00,1.00,-177.60,-43.20,0
+-105.60,0.00,1.13,0.00,1.00,-172.80,43.20,0
+-100.80,0.00,1.15,0.00,1.00,-168.00,-43.20,0
+-96.00,0.00,1.17,0.00,1.00,-134.40,43.20,0
+-91.20,0.00,1.20,0.00,1.00,-19.20,-43.20,0
+-86.40,0.00,1.22,0.00,1.00,-9.60,43.20,0
+-81.60,0.00,1.24,0.00,1.00,-4.80,-43.20,0
+-76.80,0.00,1.26,0.00,1.00,-4.80,43.20,0
+-72.00,0.00,1.28,0.00,1.00,-4.80,-43.20,0
+-67.20,0.00,1.30,0.00,1.00,-0.00,38.40,0
+-62.40,0.00,1.32,0.00,1.00,-0.00,-38.40,0
+-57.60,0.00,1.35,0.00,1.00,-0.00,38.40,0
+-52.80,0.00,1.37,0.00,1.00,-0.00,-33.60,0
+-48.00,0.00,1.39,0.00,1.00,-0.00,33.60,0
+-43.20,0.00,1.41,0.00,1.00,-0.00,-28.80,0
+-38.40,0.00,1.43,0.00,1.00,-0.00,24.00,0
+-33.60,0.00,1.45,0.00,1.00,-0.00,-24.00,0
+-28.80,0.00,1.47,0.00,1.00,-0.00,19.20,0
+-24.00,0.00,1.50,0.00,1.00,-0.00,-14.40,0
+-19.20,0.00,1.52,0.00,1.00,-0.00,14.40,0
+-14.40,0.00,1.54,0.00,1.00,-0.00,-9.60,0
+-9.60,0.00,1.56,0.00,1.00,-0.00,4.80,0
+-4.80,0.00,1.58,0.00,1.00,-0.00,-4.80,0
+0.00,0.00,1.60,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80,0
+9.60,-0.00,1.64,0.00,1.00,-0.00,4.80,0
+14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60,0
+19.20,-0.00,1.69,0.00,1.00,-0.00,14.40,0
+24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40,0
+28.80,-0.00,1.73,0.00,1.00,-0.00,19.20,0
+33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20,0
+38.40,-4.80,1.77,0.00,1.00,-4.80,24.00,0
+43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00,0
+48.00,-4.80,1.82,0.00,1.00,-4.80,28.80,0
+52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80,0
+57.60,-4.80,1.86,0.00,1.00,-4.80,33.60,0
+62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60,0
+67.20,-4.80,1.90,0.00,1.00,-9.60,38.40,0
+72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40,0
+76.80,-4.80,1.94,0.00,1.00,-24.00,38.40,0
+81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40,0
+86.40,-4.80,1.99,0.00,1.00,-110.40,38.40,0
+91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40,0
+96.00,-4.80,2.03,0.00,1.00,-163.20,38.40,0
+100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40,0
+105.60,-4.80,2.07,0.00,1.00,-172.80,38.40,0
+110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40,0
+115.20,-4.80,2.11,0.00,1.00,-172.80,33.60,0
+120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60,0
+124.80,-4.80,2.16,0.00,1.00,-177.60,33.60,0
+129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80,0
+134.40,-4.80,2.20,0.00,1.00,-177.60,28.80,0
+139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00,0
+144.00,-4.80,2.24,0.00,1.00,-177.60,24.00,0
+148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20,0
+153.60,-0.00,2.29,0.00,1.00,-177.60,14.40,0
+158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40,0
+163.20,-0.00,2.33,0.00,1.00,-177.60,9.60,0
+168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60,0
+172.80,-0.00,2.37,0.00,1.00,-177.60,4.80,0
+177.60,-0.00,2.39,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,2.41,0.00,1.00,177.60,-0.00,0
+-172.80,0.00,2.44,0.00,1.00,177.60,4.80,0
+-168.00,0.00,2.46,0.00,1.00,177.60,-9.60,0
+-163.20,0.00,2.48,0.00,1.00,177.60,9.60,0
+-158.40,0.00,2.50,0.00,1.00,177.60,-14.40,0
+-153.60,0.00,2.52,0.00,1.00,177.60,14.40,0
+-148.80,4.80,2.54,0.00,1.00,177.60,-19.20,0
+-144.00,4.80,2.56,0.00,1.00,177.60,24.00,0
+-139.20,4.80,2.58,0.00,1.00,177.60,-24.00,0
+-134.40,4.80,2.61,0.00,1.00,177.60,28.80,0
+-129.60,4.80,2.63,0.00,1.00,172.80,-28.80,0
+-124.80,4.80,2.65,0.00,1.00,172.80,33.60,0
+-120.00,4.80,2.67,0.00,1.00,172.80,-33.60,0
+-115.20,4.80,2.69,0.00,1.00,172.80,33.60,0
+-110.40,4.80,2.71,0.00,1.00,168.00,-38.40,0
+-105.60,4.80,2.73,0.00,1.00,163.20,38.40,0
+-100.80,4.80,2.76,0.00,1.00,148.80,-38.40,0
+-96.00,4.80,2.78,0.00,1.00,110.40,38.40,0
+-91.20,4.80,2.80,0.00,1.00,43.20,-38.40,0
+-86.40,4.80,2.82,0.00,1.00,24.00,38.40,0
+-81.60,4.80,2.84,0.00,1.00,14.40,-38.40,0
+-76.80,4.80,2.86,0.00,1.00,9.60,38.40,0
+-72.00,4.80,2.88,0.00,1.00,9.60,-38.40,0
+-67.20,4.80,2.91,0.00,1.00,4.80,38.40,0
+-62.40,4.80,2.93,0.00,1.00,4.80,-33.60,0
+-57.60,4.80,2.95,0.00,1.00,4.80,33.60,0
+-52.80,4.80,2.97,0.00,1.00,4.80,-28.80,0
+-48.00,4.80,2.99,0.00,1.00,4.80,28.80,0
+-43.20,4.80,3.01,0.00,1.00,4.80,-24.00,0
+-38.40,4.80,3.03,0.00,1.00,0.00,24.00,0
+-33.60,4.80,3.05,0.00,1.00,0.00,-19.20,0
+-28.80,0.00,3.08,0.00,1.00,0.00,19.20,0
+-24.00,0.00,3.10,0.00,1.00,0.00,-14.40,0
+-19.20,0.00,3.12,0.00,1.00,0.00,14.40,0
+-14.40,0.00,3.14,0.00,1.00,0.00,-9.60,0
+-9.60,0.00,3.16,0.00,1.00,0.00,4.80,0
+-4.80,0.00,3.18,0.00,1.00,0.00,-4.80,0
+0.00,0.00,3.20,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80,0
+9.60,-0.00,3.25,0.00,1.00,-0.00,4.80,0
+14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60,0
+19.20,-4.80,3.29,0.00,1.00,-4.80,9.60,0
+24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40,0
+28.80,-4.80,3.33,0.00,1.00,-4.80,14.40,0
+33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20,0
+38.40,-4.80,3.38,0.00,1.00,-9.60,19.20,0
+43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00,0
+48.00,-4.80,3.42,0.00,1.00,-9.60,24.00,0
+52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80,0
+57.60,-9.60,3.46,0.00,1.00,-14.40,28.80,0
+62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80,0
+67.20,-9.60,3.50,0.00,1.00,-24.00,33.60,0
+72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60,0
+76.80,-9.60,3.55,0.00,1.00,-43.20,33.60,0
+81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60,0
+86.40,-9.60,3.59,0.00,1.00,-96.00,33.60,0
+91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60,0
+96.00,-9.60,3.63,0.00,1.00,-144.00,33.60,0
+100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60,0
+105.60,-9.60,3.67,0.00,1.00,-158.40,33.60,0
+110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60,0
+115.20,-9.60,3.72,0.00,1.00,-168.00,33.60,0
+120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80,0
+124.80,-9.60,3.76,0.00,1.00,-168.00,28.80,0
+129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80,0
+134.40,-4.80,3.80,0.00,1.00,-172.80,24.00,0
+139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00,0
+144.00,-4.80,3.85,0.00,1.00,-172.80,19.20,0
+148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20,0
+153.60,-4.80,3.89,0.00,1.00,-177.60,14.40,0
+158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40,0
+163.20,-4.80,3.93,0.00,1.00,-177.60,9.60,0
+168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80,0
+172.80,-0.00,3.97,0.00,1.00,-177.60,4.80,0
+177.60,-0.00,3.99,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,4.02,0.00,1.00,177.60,-0.00,0
+-172.80,0.00,4.04,0.00,1.00,177.60,4.80,0
+-168.00,0.00,4.06,0.00,1.00,177.60,-4.80,0
+-163.20,4.80,4.08,0.00,1.00,177.60,9.60,0
+-158.40,4.80,4.10,0.00,1.00,177.60,-14.40,0
+-153.60,4.80,4.12,0.00,1.00,172.80,14.40,0
+-148.80,4.80,4.14,0.00,1.00,172.80,-19.20,0
+-144.00,4.80,4.17,0.00,1.00,172.80,19.20,0
+-139.20,4.80,4.19,0.00,1.00,172.80,-24.00,0
+-134.40,4.80,4.21,0.00,1.00,168.00,24.00,0
+-129.60,9.60,4.23,0.00,1.00,168.00,-28.80,0
+-124.80,9.60,4.25,0.00,1.00,168.00,28.80,0
+-120.00,9.60,4.27,0.00,1.00,163.20,-28.80,0
+-115.20,9.60,4.29,0.00,1.00,158.40,33.60,0
+-110.40,9.60,4.32,0.00,1.00,153.60,-33.60,0
+-105.60,9.60,4.34,0.00,1.00,144.00,33.60,0
+-100.80,9.60,4.36,0.00,1.00,124.80,-33.60,0
+-96.00,9.60,4.38,0.00,1.00,96.00,33.60,0
+-91.20,9.60,4.40,0.00,1.00,67.20,-33.60,0
+-86.40,9.60,4.42,0.00,1.00,43.20,33.60,0
+-81.60,9.60,4.44,0.00,1.00,33.60,-33.60,0
+-76.80,9.60,4.46,0.00,1.00,24.00,33.60,0
+-72.00,9.60,4.49,0.00,1.00,19.20,-33.60,0
+-67.20,9.60,4.51,0.00,1.00,14.40,33.60,0
+-62.40,9.60,4.53,0.00,1.00,14.40,-28.80,0
+-57.60,9.60,4.55,0.00,1.00,9.60,28.80,0
+-52.80,9.60,4.57,0.00,1.00,9.60,-28.80,0
+-48.00,4.80,4.59,0.00,1.00,9.60,24.00,0
+-43.20,4.80,4.61,0.00,1.00,4.80,-24.00,0
+-38.40,4.80,4.64,0.00,1.00,4.80,19.20,0
+-33.60,4.80,4.66,0.00,1.00,4.80,-19.20,0
+-28.80,4.80,4.68,0.00,1.00,4.80,14.40,0
+-24.00,4.80,4.70,0.00,1.00,4.80,-14.40,0
+-19.20,4.80,4.72,0.00,1.00,0.00,9.60,0
+-14.40,0.00,4.74,0.00,1.00,0.00,-9.60,0
+-9.60,0.00,4.76,0.00,1.00,0.00,4.80,0
+-4.80,0.00,4.79,0.00,1.00,0.00,-4.80,0
+0.00,0.00,4.81,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80,0
+9.60,-0.00,4.85,0.00,1.00,-4.80,4.80,0
+14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60,0
+19.20,-4.80,4.89,0.00,1.00,-4.80,9.60,0
+24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60,0
+28.80,-4.80,4.93,0.00,1.00,-9.60,14.40,0
+33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40,0
+38.40,-9.60,4.98,0.00,1.00,-14.40,19.20,0
+43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20,0
+48.00,-9.60,5.02,0.00,1.00,-14.40,24.00,0
+52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00,0
+57.60,-14.40,5.06,0.00,1.00,-24.00,24.00,0
+62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80,0
+67.20,-14.40,5.11,0.00,1.00,-33.60,28.80,0
+72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80,0
+76.80,-14.40,5.15,0.00,1.00,-57.60,28.80,0
+81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80,0
+86.40,-14.40,5.19,0.00,1.00,-96.00,28.80,0
+91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80,0
+96.00,-14.40,5.23,0.00,1.00,-129.60,28.80,0
+100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80,0
+105.60,-14.40,5.28,0.00,1.00,-148.80,28.80,0
+110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80,0
+115.20,-14.40,5.32,0.00,1.00,-158.40,28.80,0
+120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00,0
+124.80,-9.60,5.36,0.00,1.00,-163.20,24.00,0
+129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00,0
+134.40,-9.60,5.40,0.00,1.00,-168.00,19.20,0
+139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20,0
+144.00,-9.60,5.45,0.00,1.00,-172.80,19.20,0
+148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40,0
+153.60,-4.80,5.49,0.00,1.00,-172.80,14.40,0
+158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60,0
+163.20,-4.80,5.53,0.00,1.00,-177.60,9.60,0
+168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80,0
+172.80,-0.00,5.58,0.00,1.00,-177.60,4.80,0
+177.60,-0.00,5.60,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,5.62,0.00,1.00,177.60,-0.00,0
+-172.80,0.00,5.64,0.00,1.00,177.60,4.80,0
+-168.00,4.80,5.66,0.00,1.00,177.60,-4.80,0
+-163.20,4.80,5.68,0.00,1.00,172.80,9.60,0
+-158.40,4.80,5.70,0.00,1.00,172.80,-9.60,0
+-153.60,4.80,5.72,0.00,1.00,172.80,14.40,0
+-148.80,9.60,5.75,0.00,1.00,172.80,-14.40,0
+-144.00,9.60,5.77,0.00,1.00,168.00,19.20,0
+-139.20,9.60,5.79,0.00,1.00,168.00,-19.20,0
+-134.40,9.60,5.81,0.00,1.00,163.20,19.20,0
+-129.60,9.60,5.83,0.00,1.00,163.20,-24.00,0
+-124.80,9.60,5.85,0.00,1.00,158.40,24.00,0
+-120.00,14.40,5.87,0.00,1.00,153.60,-24.00,0
+-115.20,14.40,5.90,0.00,1.00,148.80,28.80,0
+-110.40,14.40,5.92,0.00,1.00,139.20,-28.80,0
+-105.60,14.40,5.94,0.00,1.00,129.60,28.80,0
+-100.80,14.40,5.96,0.00,1.00,115.20,-28.80,0
+-96.00,14.40,5.98,0.00,1.00,96.00,28.80,0
+-91.20,14.40,6.00,0.00,1.00,76.80,-28.80,0
+-86.40,14.40,6.02,0.00,1.00,57.60,28.80,0
+-81.60,14.40,6.05,0.00,1.00,43.20,-28.80,0
+-76.80,14.40,6.07,0.00,1.00,33.60,28.80,0
+-72.00,14.40,6.09,0.00,1.00,28.80,-28.80,0
+-67.20,14.40,6.11,0.00,1.00,24.00,28.80,0
+-62.40,14.40,6.13,0.00,1.00,19.20,-28.80,0
+-57.60,14.40,6.15,0.00,1.00,14.40,24.00,0
+-52.80,9.60,6.17,0.00,1.00,14.40,-24.00,0
+-48.00,9.60,6.19,0.00,1.00,14.40,24.00,0
+-43.20,9.60,6.22,0.00,1.00,9.60,-19.20,0
+-38.40,9.60,6.24,0.00,1.00,9.60,19.20,0
+-33.60,9.60,6.26,0.00,1.00,4.80,-14.40,0
+-28.80,4.80,6.28,0.00,1.00,4.80,14.40,0
+-24.00,4.80,6.30,0.00,1.00,4.80,-9.60,0
+-19.20,4.80,6.32,0.00,1.00,4.80,9.60,0
+-14.40,4.80,6.34,0.00,1.00,0.00,-9.60,0
+-9.60,0.00,6.37,0.00,1.00,0.00,4.80,0
+-4.80,0.00,6.39,0.00,1.00,0.00,-4.80,0
+0.00,0.00,6.41,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00,0
+9.60,-4.80,6.45,0.00,1.00,-4.80,4.80,0
+14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80,0
+19.20,-4.80,6.49,0.00,1.00,-9.60,9.60,0
+24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60,0
+28.80,-9.60,6.54,0.00,1.00,-9.60,14.40,0
+33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40,0
+38.40,-9.60,6.58,0.00,1.00,-14.40,14.40,0
+43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20,0
+48.00,-14.40,6.62,0.00,1.00,-24.00,19.20,0
+52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20,0
+57.60,-14.40,6.66,0.00,1.00,-28.80,19.20,0
+62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00,0
+67.20,-19.20,6.71,0.00,1.00,-43.20,24.00,0
+72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00,0
+76.80,-19.20,6.75,0.00,1.00,-62.40,24.00,0
+81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00,0
+86.40,-19.20,6.79,0.00,1.00,-96.00,24.00,0
+91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00,0
+96.00,-19.20,6.84,0.00,1.00,-120.00,24.00,0
+100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00,0
+105.60,-19.20,6.88,0.00,1.00,-139.20,24.00,0
+110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00,0
+115.20,-19.20,6.92,0.00,1.00,-153.60,24.00,0
+120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00,0
+124.80,-14.40,6.96,0.00,1.00,-158.40,19.20,0
+129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20,0
+134.40,-14.40,7.01,0.00,1.00,-163.20,19.20,0
+139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40,0
+144.00,-9.60,7.05,0.00,1.00,-168.00,14.40,0
+148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40,0
+153.60,-9.60,7.09,0.00,1.00,-172.80,9.60,0
+158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60,0
+163.20,-4.80,7.13,0.00,1.00,-177.60,9.60,0
+168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80,0
+172.80,-0.00,7.18,0.00,1.00,-177.60,4.80,0
+177.60,-0.00,7.20,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,7.22,0.00,1.00,177.60,-0.00,0
+-172.80,0.00,7.24,0.00,1.00,177.60,4.80,0
+-168.00,4.80,7.26,0.00,1.00,172.80,-4.80,0
+-163.20,4.80,7.28,0.00,1.00,172.80,9.60,0
+-158.40,4.80,7.31,0.00,1.00,172.80,-9.60,0
+-153.60,9.60,7.33,0.00,1.00,168.00,9.60,0
+-148.80,9.60,7.35,0.00,1.00,168.00,-14.40,0
+-144.00,9.60,7.37,0.00,1.00,163.20,14.40,0
+-139.20,14.40,7.39,0.00,1.00,163.20,-14.40,0
+-134.40,14.40,7.41,0.00,1.00,158.40,19.20,0
+-129.60,14.40,7.43,0.00,1.00,158.40,-19.20,0
+-124.80,14.40,7.46,0.00,1.00,153.60,19.20,0
+-120.00,14.40,7.48,0.00,1.00,148.80,-24.00,0
+-115.20,19.20,7.50,0.00,1.00,139.20,24.00,0
+-110.40,19.20,7.52,0.00,1.00,134.40,-24.00,0
+-105.60,19.20,7.54,0.00,1.00,120.00,24.00,0
+-100.80,19.20,7.56,0.00,1.00,110.40,-24.00,0
+-96.00,19.20,7.58,0.00,1.00,96.00,24.00,0
+-91.20,19.20,7.60,0.00,1.00,76.80,-24.00,0
+-86.40,19.20,7.63,0.00,1.00,62.40,24.00,0
+-81.60,19.20,7.65,0.00,1.00,52.80,-24.00,0
+-76.80,19.20,7.67,0.00,1.00,43.20,24.00,0
+-72.00,19.20,7.69,0.00,1.00,38.40,-24.00,0
+-67.20,19.20,7.71,0.00,1.00,28.80,24.00,0
+-62.40,19.20,7.73,0.00,1.00,24.00,-24.00,0
+-57.60,14.40,7.75,0.00,1.00,24.00,19.20,0
+-52.80,14.40,7.78,0.00,1.00,19.20,-19.20,0
+-48.00,14.40,7.80,0.00,1.00,14.40,19.20,0
+-43.20,14.40,7.82,0.00,1.00,14.40,-19.20,0
+-38.40,9.60,7.84,0.00,1.00,9.60,14.40,0
+-33.60,9.60,7.86,0.00,1.00,9.60,-14.40,0
+-28.80,9.60,7.88,0.00,1.00,9.60,14.40,0
+-24.00,9.60,7.90,0.00,1.00,4.80,-9.60,0
+-19.20,4.80,7.93,0.00,1.00,4.80,9.60,0
+-14.40,4.80,7.95,0.00,1.00,4.80,-4.80,0
+-9.60,4.80,7.97,0.00,1.00,0.00,4.80,0
+-4.80,0.00,7.99,0.00,1.00,0.00,-0.00,0
+0.00,0.00,8.01,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00,0
+9.60,-4.80,8.05,0.00,1.00,-4.80,4.80,0
+14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80,0
+19.20,-9.60,8.10,0.00,1.00,-9.60,4.80,0
+24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60,0
+28.80,-9.60,8.14,0.00,1.00,-14.40,9.60,0
+33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60,0
+33.60,-14.40,8.18,0.00,1.00,-19.20,14.40,0
+38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40,0
+43.20,-19.20,8.22,0.00,1.00,-28.80,14.40,0
+48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40,0
+57.60,-19.20,8.27,0.00,1.00,-38.40,19.20,0
+62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20,0
+67.20,-24.00,8.31,0.00,1.00,-48.00,19.20,0
+72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20,0
+76.80,-24.00,8.35,0.00,1.00,-67.20,19.20,0
+81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20,0
+86.40,-24.00,8.40,0.00,1.00,-91.20,19.20,0
+91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20,0
+96.00,-24.00,8.44,0.00,1.00,-115.20,19.20,0
+100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20,0
+105.60,-24.00,8.48,0.00,1.00,-134.40,19.20,0
+110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20,0
+115.20,-19.20,8.52,0.00,1.00,-144.00,19.20,0
+120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20,0
+129.60,-19.20,8.57,0.00,1.00,-153.60,19.20,0
+134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40,0
+139.20,-19.20,8.61,0.00,1.00,-163.20,14.40,0
+144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40,0
+148.80,-14.40,8.65,0.00,1.00,-168.00,14.40,0
+148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60,0
+153.60,-9.60,8.69,0.00,1.00,-172.80,9.60,0
+158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60,0
+163.20,-4.80,8.74,0.00,1.00,-177.60,4.80,0
+168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80,0
+172.80,-4.80,8.78,0.00,1.00,-177.60,4.80,0
+177.60,-0.00,8.80,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,8.82,0.00,1.00,177.60,-0.00,0
+-172.80,4.80,8.84,0.00,1.00,177.60,4.80,0
+-168.00,4.80,8.87,0.00,1.00,172.80,-4.80,0
+-163.20,4.80,8.89,0.00,1.00,172.80,4.80,0
+-158.40,9.60,8.91,0.00,1.00,168.00,-9.60,0
+-153.60,9.60,8.93,0.00,1.00,168.00,9.60,0
+-148.80,14.40,8.95,0.00,1.00,163.20,-9.60,0
+-148.80,14.40,8.97,0.00,1.00,163.20,14.40,0
+-144.00,14.40,8.99,0.00,1.00,158.40,-14.40,0
+-139.20,19.20,9.01,0.00,1.00,153.60,14.40,0
+-134.40,19.20,9.04,0.00,1.00,148.80,-14.40,0
+-129.60,19.20,9.06,0.00,1.00,144.00,19.20,0
+-120.00,19.20,9.08,0.00,1.00,139.20,-19.20,0
+-115.20,19.20,9.10,0.00,1.00,134.40,19.20,0
+-110.40,24.00,9.12,0.00,1.00,124.80,-19.20,0
+-105.60,24.00,9.14,0.00,1.00,115.20,19.20,0
+-100.80,24.00,9.16,0.00,1.00,105.60,-19.20,0
+-96.00,24.00,9.19,0.00,1.00,91.20,19.20,0
+-91.20,24.00,9.21,0.00,1.00,81.60,-19.20,0
+-86.40,24.00,9.23,0.00,1.00,67.20,19.20,0
+-81.60,24.00,9.25,0.00,1.00,57.60,-19.20,0
+-76.80,24.00,9.27,0.00,1.00,48.00,19.20,0
+-72.00,24.00,9.29,0.00,1.00,43.20,-19.20,0
+-67.20,24.00,9.31,0.00,1.00,38.40,19.20,0
+-62.40,19.20,9.34,0.00,1.00,33.60,-19.20,0
+-57.60,19.20,9.36,0.00,1.00,28.80,19.20,0
+-48.00,19.20,9.38,0.00,1.00,24.00,-14.40,0
+-43.20,19.20,9.40,0.00,1.00,19.20,14.40,0
+-38.40,14.40,9.42,0.00,1.00,19.20,-14.40,0
+-33.60,14.40,9.44,0.00,1.00,14.40,14.40,0
+-33.60,14.40,9.46,0.00,1.00,14.40,-9.60,0
+-28.80,9.60,9.48,0.00,1.00,9.60,9.60,0
+-24.00,9.60,9.51,0.00,1.00,9.60,-9.60,0
+-19.20,9.60,9.53,0.00,1.00,4.80,4.80,0
+-14.40,4.80,9.55,0.00,1.00,4.80,-4.80,0
+-9.60,4.80,9.57,0.00,1.00,0.00,4.80,0
+-4.80,0.00,9.59,0.00,1.00,0.00,-0.00,0
+0.00,0.00,9.61,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00,0
+9.60,-4.80,9.66,0.00,1.00,-4.80,4.80,0
+14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80,0
+19.20,-9.60,9.70,0.00,1.00,-9.60,4.80,0
+19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80,0
+24.00,-14.40,9.74,0.00,1.00,-19.20,9.60,0
+28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60,0
+33.60,-19.20,9.78,0.00,1.00,-24.00,9.60,0
+38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60,0
+43.20,-19.20,9.83,0.00,1.00,-33.60,9.60,0
+48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40,0
+52.80,-24.00,9.87,0.00,1.00,-43.20,14.40,0
+57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40,0
+62.40,-24.00,9.91,0.00,1.00,-52.80,14.40,0
+72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40,0
+76.80,-28.80,9.95,0.00,1.00,-72.00,14.40,0
+81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40,0
+86.40,-28.80,10.00,0.00,1.00,-91.20,14.40,0
+91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40,0
+96.00,-28.80,10.04,0.00,1.00,-110.40,14.40,0
+100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40,0
+105.60,-28.80,10.08,0.00,1.00,-129.60,14.40,0
+115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40,0
+120.00,-24.00,10.13,0.00,1.00,-139.20,14.40,0
+124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40,0
+129.60,-24.00,10.17,0.00,1.00,-148.80,14.40,0
+134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40,0
+139.20,-19.20,10.21,0.00,1.00,-158.40,9.60,0
+144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60,0
+148.80,-14.40,10.25,0.00,1.00,-163.20,9.60,0
+153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60,0
+158.40,-14.40,10.30,0.00,1.00,-168.00,4.80,0
+163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80,0
+163.20,-9.60,10.34,0.00,1.00,-172.80,4.80,0
+168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80,0
+172.80,-4.80,10.38,0.00,1.00,-177.60,0.00,0
+177.60,-0.00,10.40,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,10.42,0.00,1.00,177.60,-0.00,0
+-172.80,4.80,10.45,0.00,1.00,172.80,0.00,0
+-168.00,4.80,10.47,0.00,1.00,172.80,-4.80,0
+-163.20,9.60,10.49,0.00,1.00,168.00,4.80,0
+-163.20,9.60,10.51,0.00,1.00,168.00,-4.80,0
+-158.40,14.40,10.53,0.00,1.00,163.20,4.80,0
+-153.60,14.40,10.55,0.00,1.00,163.20,-9.60,0
+-148.80,14.40,10.57,0.00,1.00,158.40,9.60,0
+-144.00,19.20,10.60,0.00,1.00,153.60,-9.60,0
+-139.20,19.20,10.62,0.00,1.00,148.80,9.60,0
+-134.40,24.00,10.64,0.00,1.00,144.00,-14.40,0
+-129.60,24.00,10.66,0.00,1.00,139.20,14.40,0
+-124.80,24.00,10.68,0.00,1.00,134.40,-14.40,0
+-120.00,24.00,10.70,0.00,1.00,129.60,14.40,0
+-115.20,28.80,10.72,0.00,1.00,120.00,-14.40,0
+-105.60,28.80,10.74,0.00,1.00,110.40,14.40,0
+-100.80,28.80,10.77,0.00,1.00,100.80,-14.40,0
+-96.00,28.80,10.79,0.00,1.00,91.20,14.40,0
+-91.20,28.80,10.81,0.00,1.00,81.60,-14.40,0
+-86.40,28.80,10.83,0.00,1.00,72.00,14.40,0
+-81.60,28.80,10.85,0.00,1.00,62.40,-14.40,0
+-76.80,28.80,10.87,0.00,1.00,52.80,14.40,0
+-72.00,28.80,10.89,0.00,1.00,48.00,-14.40,0
+-62.40,24.00,10.92,0.00,1.00,43.20,14.40,0
+-57.60,24.00,10.94,0.00,1.00,38.40,-14.40,0
+-52.80,24.00,10.96,0.00,1.00,33.60,14.40,0
+-48.00,24.00,10.98,0.00,1.00,28.80,-14.40,0
+-43.20,19.20,11.00,0.00,1.00,24.00,9.60,0
+-38.40,19.20,11.02,0.00,1.00,19.20,-9.60,0
+-33.60,19.20,11.04,0.00,1.00,19.20,9.60,0
+-28.80,14.40,11.07,0.00,1.00,14.40,-9.60,0
+-24.00,14.40,11.09,0.00,1.00,9.60,9.60,0
+-19.20,9.60,11.11,0.00,1.00,9.60,-4.80,0
+-19.20,9.60,11.13,0.00,1.00,4.80,4.80,0
+-14.40,4.80,11.15,0.00,1.00,4.80,-4.80,0
+-9.60,4.80,11.17,0.00,1.00,0.00,4.80,0
+-4.80,0.00,11.19,0.00,1.00,0.00,-0.00,0
+0.00,0.00,11.21,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00,0
+9.60,-4.80,11.26,0.00,1.00,-9.60,0.00,0
+14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80,0
+14.40,-9.60,11.30,0.00,1.00,-14.40,4.80,0
+19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80,0
+24.00,-14.40,11.34,0.00,1.00,-19.20,4.80,0
+28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80,0
+33.60,-19.20,11.39,0.00,1.00,-28.80,4.80,0
+38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60,0
+43.20,-24.00,11.43,0.00,1.00,-33.60,9.60,0
+48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60,0
+52.80,-28.80,11.47,0.00,1.00,-48.00,9.60,0
+57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60,0
+62.40,-28.80,11.51,0.00,1.00,-57.60,9.60,0
+67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60,0
+72.00,-33.60,11.56,0.00,1.00,-76.80,9.60,0
+81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60,0
+86.40,-33.60,11.60,0.00,1.00,-91.20,9.60,0
+91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60,0
+96.00,-33.60,11.64,0.00,1.00,-110.40,9.60,0
+100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60,0
+110.40,-33.60,11.68,0.00,1.00,-124.80,9.60,0
+115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60,0
+120.00,-28.80,11.73,0.00,1.00,-139.20,9.60,0
+124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60,0
+129.60,-28.80,11.77,0.00,1.00,-148.80,9.60,0
+134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60,0
+139.20,-24.00,11.81,0.00,1.00,-153.60,9.60,0
+144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60,0
+148.80,-19.20,11.86,0.00,1.00,-163.20,4.80,0
+153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80,0
+158.40,-14.40,11.90,0.00,1.00,-168.00,4.80,0
+163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80,0
+168.00,-9.60,11.94,0.00,1.00,-172.80,4.80,0
+168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00,0
+172.80,-4.80,11.98,0.00,1.00,-177.60,0.00,0
+177.60,-0.00,12.01,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,12.03,0.00,1.00,177.60,-0.00,0
+-172.80,4.80,12.05,0.00,1.00,172.80,0.00,0
+-168.00,4.80,12.07,0.00,1.00,172.80,-0.00,0
+-168.00,9.60,12.09,0.00,1.00,168.00,4.80,0
+-163.20,9.60,12.11,0.00,1.00,163.20,-4.80,0
+-158.40,14.40,12.13,0.00,1.00,163.20,4.80,0
+-153.60,14.40,12.15,0.00,1.00,158.40,-4.80,0
+-148.80,19.20,12.18,0.00,1.00,153.60,4.80,0
+-144.00,19.20,12.20,0.00,1.00,153.60,-9.60,0
+-139.20,24.00,12.22,0.00,1.00,148.80,9.60,0
+-134.40,24.00,12.24,0.00,1.00,144.00,-9.60,0
+-129.60,28.80,12.26,0.00,1.00,139.20,9.60,0
+-124.80,28.80,12.28,0.00,1.00,129.60,-9.60,0
+-120.00,28.80,12.30,0.00,1.00,124.80,9.60,0
+-115.20,33.60,12.33,0.00,1.00,115.20,-9.60,0
+-110.40,33.60,12.35,0.00,1.00,110.40,9.60,0
+-100.80,33.60,12.37,0.00,1.00,100.80,-9.60,0
+-96.00,33.60,12.39,0.00,1.00,91.20,9.60,0
+-91.20,33.60,12.41,0.00,1.00,81.60,-9.60,0
+-86.40,33.60,12.43,0.00,1.00,76.80,9.60,0
+-81.60,33.60,12.45,0.00,1.00,67.20,-9.60,0
+-72.00,33.60,12.48,0.00,1.00,57.60,9.60,0
+-67.20,33.60,12.50,0.00,1.00,52.80,-9.60,0
+-62.40,28.80,12.52,0.00,1.00,48.00,9.60,0
+-57.60,28.80,12.54,0.00,1.00,38.40,-9.60,0
+-52.80,28.80,12.56,0.00,1.00,33.60,9.60,0
+-48.00,24.00,12.58,0.00,1.00,28.80,-9.60,0
+-43.20,24.00,12.60,0.00,1.00,28.80,9.60,0
+-38.40,24.00,12.62,0.00,1.00,24.00,-9.60,0
+-33.60,19.20,12.65,0.00,1.00,19.20,4.80,0
+-28.80,19.20,12.67,0.00,1.00,14.40,-4.80,0
+-24.00,14.40,12.69,0.00,1.00,14.40,4.80,0
+-19.20,14.40,12.71,0.00,1.00,9.60,-4.80,0
+-14.40,9.60,12.73,0.00,1.00,9.60,4.80,0
+-14.40,9.60,12.75,0.00,1.00,4.80,-4.80,0
+-9.60,4.80,12.77,0.00,1.00,4.80,0.00,0
+-4.80,4.80,12.80,0.00,1.00,0.00,-0.00,0
+0.00,0.00,12.82,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00,0
+9.60,-4.80,12.86,0.00,1.00,-9.60,0.00,0
+9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00,0
+14.40,-9.60,12.90,0.00,1.00,-14.40,0.00,0
+19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80,0
+24.00,-19.20,12.95,0.00,1.00,-24.00,4.80,0
+28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80,0
+33.60,-24.00,12.99,0.00,1.00,-28.80,4.80,0
+38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80,0
+43.20,-28.80,13.03,0.00,1.00,-38.40,4.80,0
+48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80,0
+52.80,-33.60,13.07,0.00,1.00,-48.00,4.80,0
+57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80,0
+62.40,-33.60,13.12,0.00,1.00,-62.40,4.80,0
+67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80,0
+72.00,-38.40,13.16,0.00,1.00,-76.80,4.80,0
+81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80,0
+86.40,-38.40,13.20,0.00,1.00,-91.20,4.80,0
+91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80,0
+96.00,-38.40,13.24,0.00,1.00,-105.60,4.80,0
+105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80,0
+110.40,-38.40,13.29,0.00,1.00,-120.00,4.80,0
+115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80,0
+120.00,-33.60,13.33,0.00,1.00,-134.40,4.80,0
+124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80,0
+129.60,-28.80,13.37,0.00,1.00,-144.00,4.80,0
+134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80,0
+139.20,-24.00,13.42,0.00,1.00,-153.60,4.80,0
+144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80,0
+148.80,-19.20,13.46,0.00,1.00,-158.40,4.80,0
+153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80,0
+158.40,-14.40,13.50,0.00,1.00,-168.00,4.80,0
+163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80,0
+168.00,-9.60,13.54,0.00,1.00,-172.80,0.00,0
+172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00,0
+172.80,-4.80,13.59,0.00,1.00,-177.60,0.00,0
+177.60,-0.00,13.61,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,13.63,0.00,1.00,177.60,-0.00,0
+-172.80,4.80,13.65,0.00,1.00,172.80,0.00,0
+-172.80,9.60,13.67,0.00,1.00,168.00,-0.00,0
+-168.00,9.60,13.69,0.00,1.00,168.00,0.00,0
+-163.20,14.40,13.71,0.00,1.00,163.20,-4.80,0
+-158.40,14.40,13.74,0.00,1.00,158.40,4.80,0
+-153.60,19.20,13.76,0.00,1.00,158.40,-4.80,0
+-148.80,19.20,13.78,0.00,1.00,153.60,4.80,0
+-144.00,24.00,13.80,0.00,1.00,148.80,-4.80,0
+-139.20,24.00,13.82,0.00,1.00,144.00,4.80,0
+-134.40,28.80,13.84,0.00,1.00,139.20,-4.80,0
+-129.60,28.80,13.86,0.00,1.00,134.40,4.80,0
+-124.80,33.60,13.89,0.00,1.00,129.60,-4.80,0
+-120.00,33.60,13.91,0.00,1.00,120.00,4.80,0
+-115.20,33.60,13.93,0.00,1.00,115.20,-4.80,0
+-110.40,38.40,13.95,0.00,1.00,105.60,4.80,0
+-105.60,38.40,13.97,0.00,1.00,100.80,-4.80,0
+-96.00,38.40,13.99,0.00,1.00,91.20,4.80,0
+-91.20,38.40,14.01,0.00,1.00,86.40,-4.80,0
+-86.40,38.40,14.03,0.00,1.00,76.80,4.80,0
+-81.60,38.40,14.06,0.00,1.00,67.20,-4.80,0
+-72.00,38.40,14.08,0.00,1.00,62.40,4.80,0
+-67.20,38.40,14.10,0.00,1.00,52.80,-4.80,0
+-62.40,33.60,14.12,0.00,1.00,48.00,4.80,0
+-57.60,33.60,14.14,0.00,1.00,43.20,-4.80,0
+-52.80,33.60,14.16,0.00,1.00,38.40,4.80,0
+-48.00,28.80,14.18,0.00,1.00,33.60,-4.80,0
+-43.20,28.80,14.21,0.00,1.00,28.80,4.80,0
+-38.40,24.00,14.23,0.00,1.00,24.00,-4.80,0
+-33.60,24.00,14.25,0.00,1.00,24.00,4.80,0
+-28.80,19.20,14.27,0.00,1.00,19.20,-4.80,0
+-24.00,19.20,14.29,0.00,1.00,14.40,4.80,0
+-19.20,14.40,14.31,0.00,1.00,9.60,-4.80,0
+-14.40,9.60,14.33,0.00,1.00,9.60,0.00,0
+-9.60,9.60,14.36,0.00,1.00,4.80,-0.00,0
+-9.60,4.80,14.38,0.00,1.00,4.80,0.00,0
+-4.80,4.80,14.40,0.00,1.00,0.00,-0.00,0
+0.00,0.00,14.42,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00,0
+4.80,-4.80,14.46,0.00,1.00,-9.60,0.00,0
+9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00,0
+14.40,-14.40,14.50,0.00,1.00,-14.40,0.00,0
+19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00,0
+24.00,-19.20,14.55,0.00,1.00,-24.00,0.00,0
+24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00,0
+28.80,-24.00,14.59,0.00,1.00,-33.60,0.00,0
+33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00,0
+38.40,-28.80,14.63,0.00,1.00,-43.20,0.00,0
+43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00,0
+48.00,-33.60,14.68,0.00,1.00,-52.80,0.00,0
+52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00,0
+62.40,-38.40,14.72,0.00,1.00,-62.40,0.00,0
+67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00,0
+72.00,-43.20,14.76,0.00,1.00,-76.80,0.00,0
+76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00,0
+86.40,-43.20,14.80,0.00,1.00,-91.20,0.00,0
+91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00,0
+96.00,-43.20,14.85,0.00,1.00,-105.60,0.00,0
+105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00,0
+110.40,-43.20,14.89,0.00,1.00,-120.00,0.00,0
+115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00,0
+124.80,-38.40,14.93,0.00,1.00,-129.60,0.00,0
+129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00,0
+134.40,-33.60,14.97,0.00,1.00,-139.20,0.00,0
+139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00,0
+144.00,-28.80,15.02,0.00,1.00,-148.80,0.00,0
+148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00,0
+153.60,-24.00,15.06,0.00,1.00,-158.40,0.00,0
+158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00,0
+158.40,-19.20,15.10,0.00,1.00,-163.20,0.00,0
+163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00,0
+168.00,-9.60,15.15,0.00,1.00,-172.80,0.00,0
+172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00,0
+172.80,-4.80,15.19,0.00,1.00,-177.60,0.00,0
+177.60,-0.00,15.21,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,15.23,0.00,1.00,172.80,-0.00,0
+-172.80,4.80,15.25,0.00,1.00,172.80,0.00,0
+-172.80,9.60,15.27,0.00,1.00,168.00,-0.00,0
+-168.00,9.60,15.30,0.00,1.00,163.20,0.00,0
+-163.20,14.40,15.32,0.00,1.00,163.20,-0.00,0
+-158.40,19.20,15.34,0.00,1.00,158.40,0.00,0
+-158.40,19.20,15.36,0.00,1.00,153.60,-0.00,0
+-153.60,24.00,15.38,0.00,1.00,148.80,0.00,0
+-148.80,28.80,15.40,0.00,1.00,144.00,-0.00,0
+-144.00,28.80,15.42,0.00,1.00,139.20,0.00,0
+-139.20,33.60,15.44,0.00,1.00,134.40,-0.00,0
+-134.40,33.60,15.47,0.00,1.00,129.60,0.00,0
+-129.60,38.40,15.49,0.00,1.00,124.80,-0.00,0
+-124.80,38.40,15.51,0.00,1.00,120.00,0.00,0
+-115.20,38.40,15.53,0.00,1.00,110.40,-0.00,0
+-110.40,43.20,15.55,0.00,1.00,105.60,0.00,0
+-105.60,43.20,15.57,0.00,1.00,100.80,-0.00,0
+-96.00,43.20,15.59,0.00,1.00,91.20,0.00,0
+-91.20,43.20,15.62,0.00,1.00,86.40,-0.00,0
+-86.40,43.20,15.64,0.00,1.00,76.80,0.00,0
+-76.80,43.20,15.66,0.00,1.00,72.00,-0.00,0
+-72.00,43.20,15.68,0.00,1.00,62.40,0.00,0
+-67.20,38.40,15.70,0.00,1.00,57.60,-0.00,0
+-62.40,38.40,15.72,0.00,1.00,52.80,0.00,0
+-52.80,38.40,15.74,0.00,1.00,48.00,-0.00,0
+-48.00,33.60,15.77,0.00,1.00,43.20,0.00,0
+-43.20,33.60,15.79,0.00,1.00,38.40,-0.00,0
+-38.40,28.80,15.81,0.00,1.00,33.60,0.00,0
+-33.60,28.80,15.83,0.00,1.00,28.80,-0.00,0
+-28.80,24.00,15.85,0.00,1.00,24.00,0.00,0
+-24.00,24.00,15.87,0.00,1.00,19.20,-0.00,0
+-24.00,19.20,15.89,0.00,1.00,14.40,0.00,0
+-19.20,14.40,15.91,0.00,1.00,14.40,-0.00,0
+-14.40,14.40,15.94,0.00,1.00,9.60,0.00,0
+-9.60,9.60,15.96,0.00,1.00,4.80,-0.00,0
+-4.80,4.80,15.98,0.00,1.00,4.80,0.00,0
+-4.80,4.80,16.00,0.00,1.00,0.00,-0.00,0
+0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,15.98,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00,0
+9.60,-9.60,15.94,0.00,1.00,-14.40,0.00,0
+14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00,0
+14.40,-19.20,15.89,0.00,1.00,-24.00,0.00,0
+19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00,0
+24.00,-24.00,15.85,0.00,1.00,-28.80,0.00,0
+28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00,0
+33.60,-28.80,15.81,0.00,1.00,-38.40,0.00,0
+38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00,0
+43.20,-38.40,15.77,0.00,1.00,-48.00,0.00,0
+48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80,0
+52.80,-43.20,15.72,0.00,1.00,-62.40,4.80,0
+57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80,0
+62.40,-43.20,15.68,0.00,1.00,-72.00,4.80,0
+72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80,0
+76.80,-48.00,15.64,0.00,1.00,-86.40,4.80,0
+86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80,0
+91.20,-48.00,15.59,0.00,1.00,-96.00,4.80,0
+100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80,0
+105.60,-48.00,15.55,0.00,1.00,-110.40,4.80,0
+110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80,0
+120.00,-43.20,15.51,0.00,1.00,-124.80,4.80,0
+124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80,0
+129.60,-38.40,15.47,0.00,1.00,-134.40,4.80,0
+134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80,0
+139.20,-33.60,15.42,0.00,1.00,-144.00,0.00,0
+144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00,0
+148.80,-28.80,15.38,0.00,1.00,-153.60,0.00,0
+153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00,0
+158.40,-24.00,15.34,0.00,1.00,-158.40,0.00,0
+163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00,0
+163.20,-14.40,15.30,0.00,1.00,-168.00,0.00,0
+168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00,0
+172.80,-9.60,15.25,0.00,1.00,-172.80,0.00,0
+172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00,0
+177.60,-0.00,15.21,0.00,1.00,177.60,0.00,0
+-177.60,0.00,15.19,0.00,1.00,172.80,0.00,0
+-172.80,4.80,15.17,0.00,1.00,172.80,-0.00,0
+-172.80,9.60,15.15,0.00,1.00,168.00,0.00,0
+-168.00,14.40,15.12,0.00,1.00,163.20,-0.00,0
+-163.20,14.40,15.10,0.00,1.00,158.40,0.00,0
+-163.20,19.20,15.08,0.00,1.00,158.40,-0.00,0
+-158.40,24.00,15.06,0.00,1.00,153.60,0.00,0
+-153.60,24.00,15.04,0.00,1.00,148.80,-0.00,0
+-148.80,28.80,15.02,0.00,1.00,144.00,0.00,0
+-144.00,33.60,15.00,0.00,1.00,139.20,-0.00,0
+-139.20,33.60,14.97,0.00,1.00,134.40,0.00,0
+-134.40,38.40,14.95,0.00,1.00,129.60,-4.80,0
+-129.60,38.40,14.93,0.00,1.00,124.80,4.80,0
+-124.80,43.20,14.91,0.00,1.00,115.20,-4.80,0
+-120.00,43.20,14.89,0.00,1.00,110.40,4.80,0
+-110.40,48.00,14.87,0.00,1.00,105.60,-4.80,0
+-105.60,48.00,14.85,0.00,1.00,96.00,4.80,0
+-100.80,48.00,14.83,0.00,1.00,91.20,-4.80,0
+-91.20,48.00,14.80,0.00,1.00,86.40,4.80,0
+-86.40,48.00,14.78,0.00,1.00,76.80,-4.80,0
+-76.80,48.00,14.76,0.00,1.00,72.00,4.80,0
+-72.00,48.00,14.74,0.00,1.00,67.20,-4.80,0
+-62.40,43.20,14.72,0.00,1.00,62.40,4.80,0
+-57.60,43.20,14.70,0.00,1.00,52.80,-4.80,0
+-52.80,43.20,14.68,0.00,1.00,48.00,4.80,0
+-48.00,38.40,14.65,0.00,1.00,43.20,-4.80,0
+-43.20,38.40,14.63,0.00,1.00,38.40,0.00,0
+-38.40,33.60,14.61,0.00,1.00,33.60,-0.00,0
+-33.60,28.80,14.59,0.00,1.00,28.80,0.00,0
+-28.80,28.80,14.57,0.00,1.00,24.00,-0.00,0
+-24.00,24.00,14.55,0.00,1.00,24.00,0.00,0
+-19.20,19.20,14.53,0.00,1.00,19.20,-0.00,0
+-14.40,19.20,14.50,0.00,1.00,14.40,0.00,0
+-14.40,14.40,14.48,0.00,1.00,9.60,-0.00,0
+-9.60,9.60,14.46,0.00,1.00,4.80,0.00,0
+-4.80,4.80,14.44,0.00,1.00,4.80,-0.00,0
+-4.80,4.80,14.42,0.00,1.00,0.00,0.00,0
+0.00,0.00,14.40,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,14.38,0.00,1.00,-9.60,0.00,0
+4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00,0
+9.60,-9.60,14.33,0.00,1.00,-14.40,0.00,0
+9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80,0
+14.40,-19.20,14.29,0.00,1.00,-24.00,4.80,0
+19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80,0
+24.00,-24.00,14.25,0.00,1.00,-33.60,4.80,0
+24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80,0
+28.80,-33.60,14.21,0.00,1.00,-43.20,4.80,0
+33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80,0
+38.40,-38.40,14.16,0.00,1.00,-52.80,4.80,0
+43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80,0
+48.00,-43.20,14.12,0.00,1.00,-62.40,4.80,0
+52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80,0
+62.40,-48.00,14.08,0.00,1.00,-72.00,9.60,0
+67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60,0
+76.80,-52.80,14.03,0.00,1.00,-86.40,9.60,0
+86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60,0
+91.20,-52.80,13.99,0.00,1.00,-96.00,9.60,0
+100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60,0
+105.60,-52.80,13.95,0.00,1.00,-110.40,9.60,0
+115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60,0
+120.00,-48.00,13.91,0.00,1.00,-120.00,9.60,0
+129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80,0
+134.40,-43.20,13.86,0.00,1.00,-129.60,4.80,0
+139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80,0
+144.00,-38.40,13.82,0.00,1.00,-139.20,4.80,0
+148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80,0
+153.60,-33.60,13.78,0.00,1.00,-148.80,4.80,0
+158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80,0
+158.40,-24.00,13.74,0.00,1.00,-158.40,4.80,0
+163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80,0
+168.00,-19.20,13.69,0.00,1.00,-168.00,4.80,0
+168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00,0
+172.80,-9.60,13.65,0.00,1.00,-172.80,0.00,0
+177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00,0
+177.60,-0.00,13.61,0.00,1.00,177.60,0.00,0
+-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0
+-177.60,4.80,13.56,0.00,1.00,172.80,-0.00,0
+-172.80,9.60,13.54,0.00,1.00,168.00,0.00,0
+-168.00,14.40,13.52,0.00,1.00,163.20,-0.00,0
+-168.00,19.20,13.50,0.00,1.00,158.40,4.80,0
+-163.20,19.20,13.48,0.00,1.00,153.60,-4.80,0
+-158.40,24.00,13.46,0.00,1.00,148.80,4.80,0
+-158.40,28.80,13.44,0.00,1.00,144.00,-4.80,0
+-153.60,33.60,13.42,0.00,1.00,139.20,4.80,0
+-148.80,33.60,13.39,0.00,1.00,134.40,-4.80,0
+-144.00,38.40,13.37,0.00,1.00,129.60,4.80,0
+-139.20,43.20,13.35,0.00,1.00,124.80,-4.80,0
+-134.40,43.20,13.33,0.00,1.00,120.00,4.80,0
+-129.60,48.00,13.31,0.00,1.00,115.20,-4.80,0
+-120.00,48.00,13.29,0.00,1.00,110.40,9.60,0
+-115.20,48.00,13.27,0.00,1.00,105.60,-9.60,0
+-105.60,52.80,13.24,0.00,1.00,96.00,9.60,0
+-100.80,52.80,13.22,0.00,1.00,91.20,-9.60,0
+-91.20,52.80,13.20,0.00,1.00,86.40,9.60,0
+-86.40,52.80,13.18,0.00,1.00,81.60,-9.60,0
+-76.80,52.80,13.16,0.00,1.00,72.00,9.60,0
+-67.20,52.80,13.14,0.00,1.00,67.20,-9.60,0
+-62.40,48.00,13.12,0.00,1.00,62.40,9.60,0
+-52.80,48.00,13.09,0.00,1.00,57.60,-4.80,0
+-48.00,43.20,13.07,0.00,1.00,52.80,4.80,0
+-43.20,43.20,13.05,0.00,1.00,48.00,-4.80,0
+-38.40,38.40,13.03,0.00,1.00,43.20,4.80,0
+-33.60,38.40,13.01,0.00,1.00,38.40,-4.80,0
+-28.80,33.60,12.99,0.00,1.00,33.60,4.80,0
+-24.00,28.80,12.97,0.00,1.00,28.80,-4.80,0
+-24.00,24.00,12.95,0.00,1.00,24.00,4.80,0
+-19.20,24.00,12.92,0.00,1.00,19.20,-4.80,0
+-14.40,19.20,12.90,0.00,1.00,14.40,4.80,0
+-9.60,14.40,12.88,0.00,1.00,9.60,-4.80,0
+-9.60,9.60,12.86,0.00,1.00,9.60,0.00,0
+-4.80,9.60,12.84,0.00,1.00,4.80,-0.00,0
+-4.80,4.80,12.82,0.00,1.00,0.00,0.00,0
+0.00,0.00,12.80,0.00,1.00,-4.80,0.00,0
+4.80,-4.80,12.77,0.00,1.00,-9.60,0.00,0
+4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00,0
+9.60,-14.40,12.73,0.00,1.00,-14.40,4.80,0
+9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80,0
+14.40,-19.20,12.69,0.00,1.00,-24.00,4.80,0
+14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80,0
+19.20,-28.80,12.65,0.00,1.00,-33.60,4.80,0
+24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60,0
+28.80,-33.60,12.60,0.00,1.00,-43.20,9.60,0
+28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60,0
+33.60,-43.20,12.56,0.00,1.00,-52.80,9.60,0
+38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60,0
+48.00,-48.00,12.52,0.00,1.00,-62.40,9.60,0
+52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60,0
+57.60,-52.80,12.48,0.00,1.00,-72.00,9.60,0
+67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40,0
+76.80,-57.60,12.43,0.00,1.00,-86.40,14.40,0
+81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40,0
+91.20,-57.60,12.39,0.00,1.00,-96.00,14.40,0
+100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40,0
+110.40,-57.60,12.35,0.00,1.00,-110.40,14.40,0
+115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40,0
+124.80,-52.80,12.30,0.00,1.00,-120.00,9.60,0
+129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60,0
+139.20,-48.00,12.26,0.00,1.00,-129.60,9.60,0
+144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60,0
+148.80,-38.40,12.22,0.00,1.00,-139.20,9.60,0
+153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60,0
+153.60,-33.60,12.18,0.00,1.00,-148.80,9.60,0
+158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60,0
+163.20,-24.00,12.13,0.00,1.00,-158.40,4.80,0
+163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80,0
+168.00,-19.20,12.09,0.00,1.00,-168.00,4.80,0
+172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80,0
+172.80,-9.60,12.05,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00,0
+177.60,-0.00,12.01,0.00,1.00,177.60,0.00,0
+-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0
+-177.60,4.80,11.96,0.00,1.00,168.00,-0.00,0
+-172.80,9.60,11.94,0.00,1.00,168.00,4.80,0
+-172.80,14.40,11.92,0.00,1.00,163.20,-4.80,0
+-168.00,19.20,11.90,0.00,1.00,158.40,4.80,0
+-163.20,24.00,11.88,0.00,1.00,153.60,-4.80,0
+-163.20,24.00,11.86,0.00,1.00,148.80,4.80,0
+-158.40,28.80,11.83,0.00,1.00,144.00,-9.60,0
+-153.60,33.60,11.81,0.00,1.00,139.20,9.60,0
+-153.60,38.40,11.79,0.00,1.00,134.40,-9.60,0
+-148.80,38.40,11.77,0.00,1.00,129.60,9.60,0
+-144.00,43.20,11.75,0.00,1.00,124.80,-9.60,0
+-139.20,48.00,11.73,0.00,1.00,120.00,9.60,0
+-129.60,48.00,11.71,0.00,1.00,115.20,-9.60,0
+-124.80,52.80,11.68,0.00,1.00,110.40,9.60,0
+-115.20,52.80,11.66,0.00,1.00,100.80,-14.40,0
+-110.40,57.60,11.64,0.00,1.00,96.00,14.40,0
+-100.80,57.60,11.62,0.00,1.00,91.20,-14.40,0
+-91.20,57.60,11.60,0.00,1.00,86.40,14.40,0
+-81.60,57.60,11.58,0.00,1.00,81.60,-14.40,0
+-76.80,57.60,11.56,0.00,1.00,72.00,14.40,0
+-67.20,57.60,11.54,0.00,1.00,67.20,-14.40,0
+-57.60,52.80,11.51,0.00,1.00,62.40,9.60,0
+-52.80,52.80,11.49,0.00,1.00,57.60,-9.60,0
+-48.00,48.00,11.47,0.00,1.00,52.80,9.60,0
+-38.40,43.20,11.45,0.00,1.00,48.00,-9.60,0
+-33.60,43.20,11.43,0.00,1.00,43.20,9.60,0
+-28.80,38.40,11.41,0.00,1.00,38.40,-9.60,0
+-28.80,33.60,11.39,0.00,1.00,33.60,9.60,0
+-24.00,33.60,11.36,0.00,1.00,28.80,-9.60,0
+-19.20,28.80,11.34,0.00,1.00,24.00,4.80,0
+-14.40,24.00,11.32,0.00,1.00,19.20,-4.80,0
+-14.40,19.20,11.30,0.00,1.00,14.40,4.80,0
+-9.60,14.40,11.28,0.00,1.00,14.40,-4.80,0
+-9.60,14.40,11.26,0.00,1.00,9.60,4.80,0
+-4.80,9.60,11.24,0.00,1.00,4.80,-0.00,0
+-4.80,4.80,11.21,0.00,1.00,0.00,0.00,0
+0.00,0.00,11.19,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,11.17,0.00,1.00,-9.60,0.00,0
+4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80,0
+4.80,-14.40,11.13,0.00,1.00,-19.20,4.80,0
+9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80,0
+9.60,-19.20,11.09,0.00,1.00,-24.00,4.80,0
+14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60,0
+19.20,-28.80,11.04,0.00,1.00,-33.60,9.60,0
+19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60,0
+24.00,-38.40,11.00,0.00,1.00,-43.20,9.60,0
+28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40,0
+33.60,-43.20,10.96,0.00,1.00,-52.80,14.40,0
+38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40,0
+43.20,-52.80,10.92,0.00,1.00,-62.40,14.40,0
+48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40,0
+52.80,-57.60,10.87,0.00,1.00,-76.80,14.40,0
+62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20,0
+72.00,-62.40,10.83,0.00,1.00,-86.40,19.20,0
+81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20,0
+91.20,-62.40,10.79,0.00,1.00,-96.00,19.20,0
+100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20,0
+110.40,-62.40,10.74,0.00,1.00,-105.60,19.20,0
+120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40,0
+129.60,-57.60,10.70,0.00,1.00,-120.00,14.40,0
+134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40,0
+139.20,-48.00,10.66,0.00,1.00,-129.60,14.40,0
+144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40,0
+148.80,-43.20,10.62,0.00,1.00,-139.20,14.40,0
+153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40,0
+158.40,-33.60,10.57,0.00,1.00,-148.80,9.60,0
+163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60,0
+163.20,-28.80,10.53,0.00,1.00,-158.40,9.60,0
+168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60,0
+168.00,-19.20,10.49,0.00,1.00,-163.20,4.80,0
+172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80,0
+172.80,-9.60,10.45,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00,0
+177.60,-0.00,10.40,0.00,1.00,177.60,0.00,0
+-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0
+-177.60,4.80,10.36,0.00,1.00,168.00,-0.00,0
+-172.80,9.60,10.34,0.00,1.00,163.20,4.80,0
+-172.80,14.40,10.32,0.00,1.00,163.20,-4.80,0
+-168.00,19.20,10.30,0.00,1.00,158.40,4.80,0
+-168.00,24.00,10.28,0.00,1.00,153.60,-9.60,0
+-163.20,28.80,10.25,0.00,1.00,148.80,9.60,0
+-163.20,33.60,10.23,0.00,1.00,144.00,-9.60,0
+-158.40,33.60,10.21,0.00,1.00,139.20,9.60,0
+-153.60,38.40,10.19,0.00,1.00,134.40,-14.40,0
+-148.80,43.20,10.17,0.00,1.00,129.60,14.40,0
+-144.00,48.00,10.15,0.00,1.00,124.80,-14.40,0
+-139.20,48.00,10.13,0.00,1.00,120.00,14.40,0
+-134.40,52.80,10.10,0.00,1.00,115.20,-14.40,0
+-129.60,57.60,10.08,0.00,1.00,105.60,14.40,0
+-120.00,57.60,10.06,0.00,1.00,100.80,-14.40,0
+-110.40,62.40,10.04,0.00,1.00,96.00,19.20,0
+-100.80,62.40,10.02,0.00,1.00,91.20,-19.20,0
+-91.20,62.40,10.00,0.00,1.00,86.40,19.20,0
+-81.60,62.40,9.98,0.00,1.00,81.60,-19.20,0
+-72.00,62.40,9.95,0.00,1.00,76.80,19.20,0
+-62.40,57.60,9.93,0.00,1.00,72.00,-19.20,0
+-52.80,57.60,9.91,0.00,1.00,62.40,14.40,0
+-48.00,52.80,9.89,0.00,1.00,57.60,-14.40,0
+-43.20,52.80,9.87,0.00,1.00,52.80,14.40,0
+-38.40,48.00,9.85,0.00,1.00,48.00,-14.40,0
+-33.60,43.20,9.83,0.00,1.00,43.20,14.40,0
+-28.80,43.20,9.81,0.00,1.00,38.40,-14.40,0
+-24.00,38.40,9.78,0.00,1.00,33.60,9.60,0
+-19.20,33.60,9.76,0.00,1.00,28.80,-9.60,0
+-19.20,28.80,9.74,0.00,1.00,24.00,9.60,0
+-14.40,24.00,9.72,0.00,1.00,19.20,-9.60,0
+-9.60,19.20,9.70,0.00,1.00,19.20,4.80,0
+-9.60,19.20,9.68,0.00,1.00,14.40,-4.80,0
+-4.80,14.40,9.66,0.00,1.00,9.60,4.80,0
+-4.80,9.60,9.63,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,9.61,0.00,1.00,0.00,0.00,0
+0.00,0.00,9.59,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,9.57,0.00,1.00,-9.60,0.00,0
+4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80,0
+4.80,-14.40,9.53,0.00,1.00,-19.20,4.80,0
+9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80,0
+9.60,-24.00,9.48,0.00,1.00,-28.80,9.60,0
+14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60,0
+14.40,-28.80,9.44,0.00,1.00,-33.60,14.40,0
+19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40,0
+19.20,-38.40,9.40,0.00,1.00,-43.20,14.40,0
+24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40,0
+28.80,-48.00,9.36,0.00,1.00,-57.60,19.20,0
+33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20,0
+38.40,-52.80,9.31,0.00,1.00,-67.20,19.20,0
+43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20,0
+48.00,-62.40,9.27,0.00,1.00,-76.80,19.20,0
+57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20,0
+67.20,-67.20,9.23,0.00,1.00,-86.40,24.00,0
+81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00,0
+91.20,-67.20,9.19,0.00,1.00,-96.00,24.00,0
+105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00,0
+115.20,-67.20,9.14,0.00,1.00,-105.60,24.00,0
+124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20,0
+134.40,-57.60,9.10,0.00,1.00,-115.20,19.20,0
+139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20,0
+144.00,-52.80,9.06,0.00,1.00,-129.60,19.20,0
+148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20,0
+153.60,-43.20,9.01,0.00,1.00,-139.20,19.20,0
+158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40,0
+163.20,-38.40,8.97,0.00,1.00,-148.80,14.40,0
+163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40,0
+168.00,-28.80,8.93,0.00,1.00,-153.60,9.60,0
+168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60,0
+172.80,-19.20,8.89,0.00,1.00,-163.20,9.60,0
+172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80,0
+177.60,-9.60,8.84,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80,0
+177.60,-0.00,8.80,0.00,1.00,177.60,0.00,0
+-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0
+-177.60,4.80,8.76,0.00,1.00,168.00,-4.80,0
+-177.60,9.60,8.74,0.00,1.00,163.20,4.80,0
+-172.80,14.40,8.72,0.00,1.00,158.40,-4.80,0
+-172.80,19.20,8.69,0.00,1.00,153.60,9.60,0
+-168.00,24.00,8.67,0.00,1.00,148.80,-9.60,0
+-168.00,28.80,8.65,0.00,1.00,148.80,9.60,0
+-163.20,33.60,8.63,0.00,1.00,144.00,-14.40,0
+-163.20,38.40,8.61,0.00,1.00,139.20,14.40,0
+-158.40,43.20,8.59,0.00,1.00,134.40,-14.40,0
+-153.60,43.20,8.57,0.00,1.00,129.60,19.20,0
+-148.80,48.00,8.54,0.00,1.00,120.00,-19.20,0
+-144.00,52.80,8.52,0.00,1.00,115.20,19.20,0
+-139.20,57.60,8.50,0.00,1.00,110.40,-19.20,0
+-134.40,57.60,8.48,0.00,1.00,105.60,19.20,0
+-124.80,62.40,8.46,0.00,1.00,100.80,-19.20,0
+-115.20,67.20,8.44,0.00,1.00,96.00,24.00,0
+-105.60,67.20,8.42,0.00,1.00,91.20,-24.00,0
+-91.20,67.20,8.40,0.00,1.00,86.40,24.00,0
+-81.60,67.20,8.37,0.00,1.00,81.60,-24.00,0
+-67.20,67.20,8.35,0.00,1.00,76.80,24.00,0
+-57.60,62.40,8.33,0.00,1.00,72.00,-19.20,0
+-48.00,62.40,8.31,0.00,1.00,67.20,19.20,0
+-43.20,57.60,8.29,0.00,1.00,62.40,-19.20,0
+-38.40,52.80,8.27,0.00,1.00,57.60,19.20,0
+-33.60,52.80,8.25,0.00,1.00,48.00,-19.20,0
+-28.80,48.00,8.22,0.00,1.00,43.20,19.20,0
+-24.00,43.20,8.20,0.00,1.00,38.40,-14.40,0
+-19.20,38.40,8.18,0.00,1.00,33.60,14.40,0
+-19.20,33.60,8.16,0.00,1.00,33.60,-14.40,0
+-14.40,28.80,8.14,0.00,1.00,28.80,14.40,0
+-14.40,24.00,8.12,0.00,1.00,24.00,-9.60,0
+-9.60,24.00,8.10,0.00,1.00,19.20,9.60,0
+-9.60,19.20,8.07,0.00,1.00,14.40,-4.80,0
+-4.80,14.40,8.05,0.00,1.00,9.60,4.80,0
+-4.80,9.60,8.03,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,8.01,0.00,1.00,0.00,0.00,0
+0.00,0.00,7.99,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,7.97,0.00,1.00,-9.60,0.00,0
+4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80,0
+4.80,-14.40,7.93,0.00,1.00,-19.20,4.80,0
+4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60,0
+9.60,-24.00,7.88,0.00,1.00,-28.80,9.60,0
+9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40,0
+9.60,-33.60,7.84,0.00,1.00,-38.40,14.40,0
+14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40,0
+14.40,-38.40,7.80,0.00,1.00,-48.00,19.20,0
+19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20,0
+24.00,-48.00,7.75,0.00,1.00,-57.60,19.20,0
+24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00,0
+28.80,-57.60,7.71,0.00,1.00,-67.20,24.00,0
+38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00,0
+43.20,-62.40,7.67,0.00,1.00,-76.80,24.00,0
+52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00,0
+62.40,-72.00,7.63,0.00,1.00,-86.40,28.80,0
+76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80,0
+96.00,-72.00,7.58,0.00,1.00,-96.00,28.80,0
+110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80,0
+120.00,-67.20,7.54,0.00,1.00,-105.60,28.80,0
+134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00,0
+139.20,-62.40,7.50,0.00,1.00,-115.20,24.00,0
+148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00,0
+153.60,-57.60,7.46,0.00,1.00,-124.80,24.00,0
+158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00,0
+158.40,-48.00,7.41,0.00,1.00,-134.40,19.20,0
+163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20,0
+163.20,-38.40,7.37,0.00,1.00,-144.00,19.20,0
+168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40,0
+168.00,-28.80,7.33,0.00,1.00,-153.60,14.40,0
+172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60,0
+172.80,-19.20,7.28,0.00,1.00,-163.20,9.60,0
+172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60,0
+177.60,-9.60,7.24,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80,0
+177.60,-0.00,7.20,0.00,1.00,177.60,0.00,0
+-177.60,0.00,7.18,0.00,1.00,172.80,0.00,0
+-177.60,4.80,7.16,0.00,1.00,168.00,-4.80,0
+-177.60,9.60,7.13,0.00,1.00,163.20,4.80,0
+-172.80,14.40,7.11,0.00,1.00,158.40,-9.60,0
+-172.80,19.20,7.09,0.00,1.00,153.60,9.60,0
+-172.80,24.00,7.07,0.00,1.00,148.80,-9.60,0
+-168.00,28.80,7.05,0.00,1.00,144.00,14.40,0
+-168.00,33.60,7.03,0.00,1.00,139.20,-14.40,0
+-163.20,38.40,7.01,0.00,1.00,134.40,19.20,0
+-163.20,43.20,6.99,0.00,1.00,129.60,-19.20,0
+-158.40,48.00,6.96,0.00,1.00,124.80,19.20,0
+-158.40,52.80,6.94,0.00,1.00,120.00,-24.00,0
+-153.60,57.60,6.92,0.00,1.00,115.20,24.00,0
+-148.80,57.60,6.90,0.00,1.00,110.40,-24.00,0
+-139.20,62.40,6.88,0.00,1.00,105.60,24.00,0
+-134.40,67.20,6.86,0.00,1.00,100.80,-24.00,0
+-120.00,67.20,6.84,0.00,1.00,96.00,28.80,0
+-110.40,72.00,6.81,0.00,1.00,91.20,-28.80,0
+-96.00,72.00,6.79,0.00,1.00,86.40,28.80,0
+-76.80,72.00,6.77,0.00,1.00,81.60,-28.80,0
+-62.40,72.00,6.75,0.00,1.00,76.80,28.80,0
+-52.80,67.20,6.73,0.00,1.00,72.00,-24.00,0
+-43.20,62.40,6.71,0.00,1.00,67.20,24.00,0
+-38.40,62.40,6.69,0.00,1.00,62.40,-24.00,0
+-28.80,57.60,6.66,0.00,1.00,57.60,24.00,0
+-24.00,52.80,6.64,0.00,1.00,52.80,-24.00,0
+-24.00,48.00,6.62,0.00,1.00,48.00,19.20,0
+-19.20,43.20,6.60,0.00,1.00,43.20,-19.20,0
+-14.40,38.40,6.58,0.00,1.00,38.40,19.20,0
+-14.40,38.40,6.56,0.00,1.00,33.60,-14.40,0
+-9.60,33.60,6.54,0.00,1.00,28.80,14.40,0
+-9.60,28.80,6.52,0.00,1.00,24.00,-14.40,0
+-9.60,24.00,6.49,0.00,1.00,19.20,9.60,0
+-4.80,19.20,6.47,0.00,1.00,14.40,-9.60,0
+-4.80,14.40,6.45,0.00,1.00,9.60,4.80,0
+-4.80,9.60,6.43,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,6.41,0.00,1.00,0.00,0.00,0
+0.00,0.00,6.39,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,6.37,0.00,1.00,-9.60,4.80,0
+0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80,0
+4.80,-14.40,6.32,0.00,1.00,-19.20,9.60,0
+4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60,0
+4.80,-24.00,6.28,0.00,1.00,-28.80,14.40,0
+4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40,0
+9.60,-33.60,6.24,0.00,1.00,-38.40,19.20,0
+9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20,0
+14.40,-43.20,6.19,0.00,1.00,-48.00,19.20,0
+14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00,0
+14.40,-52.80,6.15,0.00,1.00,-57.60,24.00,0
+19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80,0
+24.00,-57.60,6.11,0.00,1.00,-67.20,28.80,0
+28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80,0
+33.60,-67.20,6.07,0.00,1.00,-76.80,28.80,0
+43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80,0
+57.60,-72.00,6.02,0.00,1.00,-86.40,33.60,0
+76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60,0
+96.00,-76.80,5.98,0.00,1.00,-96.00,33.60,0
+115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60,0
+129.60,-72.00,5.94,0.00,1.00,-105.60,28.80,0
+139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80,0
+148.80,-67.20,5.90,0.00,1.00,-115.20,28.80,0
+153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80,0
+158.40,-57.60,5.85,0.00,1.00,-124.80,28.80,0
+163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00,0
+163.20,-48.00,5.81,0.00,1.00,-134.40,24.00,0
+168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00,0
+168.00,-38.40,5.77,0.00,1.00,-144.00,19.20,0
+172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20,0
+172.80,-28.80,5.72,0.00,1.00,-153.60,14.40,0
+172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40,0
+172.80,-19.20,5.68,0.00,1.00,-163.20,9.60,0
+177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60,0
+177.60,-9.60,5.64,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80,0
+177.60,-0.00,5.60,0.00,1.00,177.60,0.00,0
+-177.60,0.00,5.58,0.00,1.00,172.80,0.00,0
+-177.60,4.80,5.55,0.00,1.00,168.00,-4.80,0
+-177.60,9.60,5.53,0.00,1.00,163.20,4.80,0
+-177.60,14.40,5.51,0.00,1.00,158.40,-9.60,0
+-172.80,19.20,5.49,0.00,1.00,153.60,9.60,0
+-172.80,24.00,5.47,0.00,1.00,148.80,-14.40,0
+-172.80,28.80,5.45,0.00,1.00,144.00,14.40,0
+-172.80,33.60,5.43,0.00,1.00,139.20,-19.20,0
+-168.00,38.40,5.40,0.00,1.00,134.40,19.20,0
+-168.00,43.20,5.38,0.00,1.00,129.60,-24.00,0
+-163.20,48.00,5.36,0.00,1.00,124.80,24.00,0
+-163.20,52.80,5.34,0.00,1.00,120.00,-24.00,0
+-158.40,57.60,5.32,0.00,1.00,115.20,28.80,0
+-153.60,62.40,5.30,0.00,1.00,110.40,-28.80,0
+-148.80,67.20,5.28,0.00,1.00,105.60,28.80,0
+-139.20,72.00,5.26,0.00,1.00,100.80,-28.80,0
+-129.60,72.00,5.23,0.00,1.00,96.00,28.80,0
+-115.20,76.80,5.21,0.00,1.00,91.20,-33.60,0
+-96.00,76.80,5.19,0.00,1.00,86.40,33.60,0
+-76.80,76.80,5.17,0.00,1.00,81.60,-33.60,0
+-57.60,72.00,5.15,0.00,1.00,76.80,33.60,0
+-43.20,72.00,5.13,0.00,1.00,72.00,-28.80,0
+-33.60,67.20,5.11,0.00,1.00,67.20,28.80,0
+-28.80,62.40,5.08,0.00,1.00,62.40,-28.80,0
+-24.00,57.60,5.06,0.00,1.00,57.60,28.80,0
+-19.20,57.60,5.04,0.00,1.00,52.80,-28.80,0
+-14.40,52.80,5.02,0.00,1.00,48.00,24.00,0
+-14.40,48.00,5.00,0.00,1.00,43.20,-24.00,0
+-14.40,43.20,4.98,0.00,1.00,38.40,19.20,0
+-9.60,38.40,4.96,0.00,1.00,33.60,-19.20,0
+-9.60,33.60,4.93,0.00,1.00,28.80,19.20,0
+-4.80,28.80,4.91,0.00,1.00,24.00,-14.40,0
+-4.80,24.00,4.89,0.00,1.00,19.20,14.40,0
+-4.80,19.20,4.87,0.00,1.00,14.40,-9.60,0
+-4.80,14.40,4.85,0.00,1.00,9.60,9.60,0
+-0.00,9.60,4.83,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,4.81,0.00,1.00,0.00,4.80,0
+0.00,0.00,4.79,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,4.76,0.00,1.00,-9.60,4.80,0
+0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80,0
+0.00,-14.40,4.72,0.00,1.00,-19.20,9.60,0
+4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60,0
+4.80,-24.00,4.68,0.00,1.00,-28.80,14.40,0
+4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40,0
+4.80,-33.60,4.64,0.00,1.00,-38.40,19.20,0
+4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00,0
+9.60,-43.20,4.59,0.00,1.00,-48.00,24.00,0
+9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00,0
+9.60,-52.80,4.55,0.00,1.00,-57.60,28.80,0
+14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80,0
+14.40,-62.40,4.51,0.00,1.00,-67.20,33.60,0
+19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60,0
+24.00,-72.00,4.46,0.00,1.00,-76.80,33.60,0
+33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60,0
+43.20,-76.80,4.42,0.00,1.00,-86.40,38.40,0
+67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40,0
+96.00,-81.60,4.38,0.00,1.00,-96.00,38.40,0
+124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40,0
+144.00,-76.80,4.34,0.00,1.00,-105.60,33.60,0
+153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60,0
+158.40,-67.20,4.29,0.00,1.00,-115.20,33.60,0
+163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60,0
+168.00,-57.60,4.25,0.00,1.00,-124.80,28.80,0
+168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80,0
+168.00,-48.00,4.21,0.00,1.00,-134.40,28.80,0
+172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00,0
+172.80,-38.40,4.17,0.00,1.00,-144.00,24.00,0
+172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20,0
+172.80,-28.80,4.12,0.00,1.00,-153.60,19.20,0
+177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40,0
+177.60,-19.20,4.08,0.00,1.00,-163.20,14.40,0
+177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60,0
+177.60,-9.60,4.04,0.00,1.00,-172.80,4.80,0
+177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80,0
+177.60,-0.00,3.99,0.00,1.00,177.60,0.00,0
+-177.60,0.00,3.97,0.00,1.00,172.80,0.00,0
+-177.60,4.80,3.95,0.00,1.00,168.00,-4.80,0
+-177.60,9.60,3.93,0.00,1.00,163.20,4.80,0
+-177.60,14.40,3.91,0.00,1.00,158.40,-9.60,0
+-177.60,19.20,3.89,0.00,1.00,153.60,14.40,0
+-177.60,24.00,3.87,0.00,1.00,148.80,-14.40,0
+-172.80,28.80,3.85,0.00,1.00,144.00,19.20,0
+-172.80,33.60,3.82,0.00,1.00,139.20,-19.20,0
+-172.80,38.40,3.80,0.00,1.00,134.40,24.00,0
+-172.80,43.20,3.78,0.00,1.00,129.60,-24.00,0
+-168.00,48.00,3.76,0.00,1.00,124.80,28.80,0
+-168.00,52.80,3.74,0.00,1.00,120.00,-28.80,0
+-168.00,57.60,3.72,0.00,1.00,115.20,28.80,0
+-163.20,62.40,3.70,0.00,1.00,110.40,-33.60,0
+-158.40,67.20,3.67,0.00,1.00,105.60,33.60,0
+-153.60,72.00,3.65,0.00,1.00,100.80,-33.60,0
+-144.00,76.80,3.63,0.00,1.00,96.00,33.60,0
+-124.80,81.60,3.61,0.00,1.00,91.20,-38.40,0
+-96.00,81.60,3.59,0.00,1.00,86.40,38.40,0
+-67.20,81.60,3.57,0.00,1.00,81.60,-38.40,0
+-43.20,76.80,3.55,0.00,1.00,76.80,38.40,0
+-33.60,72.00,3.52,0.00,1.00,72.00,-33.60,0
+-24.00,72.00,3.50,0.00,1.00,67.20,33.60,0
+-19.20,67.20,3.48,0.00,1.00,62.40,-33.60,0
+-14.40,62.40,3.46,0.00,1.00,57.60,33.60,0
+-14.40,57.60,3.44,0.00,1.00,52.80,-28.80,0
+-9.60,52.80,3.42,0.00,1.00,48.00,28.80,0
+-9.60,48.00,3.40,0.00,1.00,43.20,-24.00,0
+-9.60,43.20,3.38,0.00,1.00,38.40,24.00,0
+-4.80,38.40,3.35,0.00,1.00,33.60,-24.00,0
+-4.80,33.60,3.33,0.00,1.00,28.80,19.20,0
+-4.80,28.80,3.31,0.00,1.00,24.00,-14.40,0
+-4.80,24.00,3.29,0.00,1.00,19.20,14.40,0
+-4.80,19.20,3.27,0.00,1.00,14.40,-9.60,0
+-0.00,14.40,3.25,0.00,1.00,9.60,9.60,0
+-0.00,9.60,3.23,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,3.20,0.00,1.00,0.00,4.80,0
+0.00,0.00,3.18,0.00,1.00,-4.80,0.00,0
+0.00,-4.80,3.16,0.00,1.00,-9.60,4.80,0
+0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80,0
+0.00,-14.40,3.12,0.00,1.00,-19.20,9.60,0
+0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40,0
+0.00,-24.00,3.08,0.00,1.00,-28.80,14.40,0
+0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20,0
+0.00,-33.60,3.03,0.00,1.00,-38.40,19.20,0
+4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00,0
+4.80,-43.20,2.99,0.00,1.00,-48.00,28.80,0
+4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80,0
+4.80,-52.80,2.95,0.00,1.00,-57.60,33.60,0
+4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60,0
+4.80,-62.40,2.91,0.00,1.00,-67.20,33.60,0
+9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40,0
+9.60,-72.00,2.86,0.00,1.00,-76.80,38.40,0
+14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40,0
+24.00,-81.60,2.82,0.00,1.00,-86.40,43.20,0
+43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20,0
+110.40,-86.40,2.78,0.00,1.00,-96.00,43.20,0
+148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20,0
+163.20,-76.80,2.73,0.00,1.00,-105.60,38.40,0
+168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40,0
+172.80,-67.20,2.69,0.00,1.00,-115.20,38.40,0
+172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40,0
+172.80,-57.60,2.65,0.00,1.00,-124.80,33.60,0
+172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60,0
+177.60,-48.00,2.61,0.00,1.00,-134.40,28.80,0
+177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80,0
+177.60,-38.40,2.56,0.00,1.00,-144.00,24.00,0
+177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00,0
+177.60,-28.80,2.52,0.00,1.00,-153.60,19.20,0
+177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20,0
+177.60,-19.20,2.48,0.00,1.00,-163.20,14.40,0
+177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60,0
+177.60,-9.60,2.44,0.00,1.00,-172.80,9.60,0
+177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80,0
+177.60,-0.00,2.39,0.00,1.00,177.60,0.00,0
+-177.60,0.00,2.37,0.00,1.00,172.80,0.00,0
+-177.60,4.80,2.35,0.00,1.00,168.00,-4.80,0
+-177.60,9.60,2.33,0.00,1.00,163.20,9.60,0
+-177.60,14.40,2.31,0.00,1.00,158.40,-9.60,0
+-177.60,19.20,2.29,0.00,1.00,153.60,14.40,0
+-177.60,24.00,2.26,0.00,1.00,148.80,-19.20,0
+-177.60,28.80,2.24,0.00,1.00,144.00,19.20,0
+-177.60,33.60,2.22,0.00,1.00,139.20,-24.00,0
+-177.60,38.40,2.20,0.00,1.00,134.40,24.00,0
+-177.60,43.20,2.18,0.00,1.00,129.60,-28.80,0
+-177.60,48.00,2.16,0.00,1.00,124.80,28.80,0
+-172.80,52.80,2.14,0.00,1.00,120.00,-33.60,0
+-172.80,57.60,2.11,0.00,1.00,115.20,33.60,0
+-172.80,62.40,2.09,0.00,1.00,110.40,-38.40,0
+-172.80,67.20,2.07,0.00,1.00,105.60,38.40,0
+-168.00,72.00,2.05,0.00,1.00,100.80,-38.40,0
+-163.20,76.80,2.03,0.00,1.00,96.00,38.40,0
+-148.80,81.60,2.01,0.00,1.00,91.20,-43.20,0
+-110.40,86.40,1.99,0.00,1.00,86.40,43.20,0
+-43.20,86.40,1.97,0.00,1.00,81.60,-43.20,0
+-24.00,81.60,1.94,0.00,1.00,76.80,43.20,0
+-14.40,76.80,1.92,0.00,1.00,72.00,-38.40,0
+-9.60,72.00,1.90,0.00,1.00,67.20,38.40,0
+-9.60,67.20,1.88,0.00,1.00,62.40,-38.40,0
+-4.80,62.40,1.86,0.00,1.00,57.60,33.60,0
+-4.80,57.60,1.84,0.00,1.00,52.80,-33.60,0
+-4.80,52.80,1.82,0.00,1.00,48.00,33.60,0
+-4.80,48.00,1.79,0.00,1.00,43.20,-28.80,0
+-4.80,43.20,1.77,0.00,1.00,38.40,28.80,0
+-4.80,38.40,1.75,0.00,1.00,33.60,-24.00,0
+-0.00,33.60,1.73,0.00,1.00,28.80,19.20,0
+-0.00,28.80,1.71,0.00,1.00,24.00,-19.20,0
+-0.00,24.00,1.69,0.00,1.00,19.20,14.40,0
+-0.00,19.20,1.67,0.00,1.00,14.40,-14.40,0
+-0.00,14.40,1.64,0.00,1.00,9.60,9.60,0
+-0.00,9.60,1.62,0.00,1.00,4.80,-4.80,0
+-0.00,4.80,1.60,0.00,1.00,0.00,4.80,0
+-0.00,0.00,1.58,0.00,1.00,-4.80,0.00,0
+-0.00,-4.80,1.56,0.00,1.00,-9.60,4.80,0
+-0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80,0
+-0.00,-14.40,1.52,0.00,1.00,-19.20,9.60,0
+-0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40,0
+-0.00,-24.00,1.47,0.00,1.00,-28.80,19.20,0
+-0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20,0
+-0.00,-33.60,1.43,0.00,1.00,-38.40,24.00,0
+-0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80,0
+-0.00,-43.20,1.39,0.00,1.00,-48.00,28.80,0
+-0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60,0
+-0.00,-52.80,1.35,0.00,1.00,-57.60,33.60,0
+-0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40,0
+-0.00,-62.40,1.30,0.00,1.00,-67.20,38.40,0
+-4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20,0
+-4.80,-72.00,1.26,0.00,1.00,-76.80,43.20,0
+-4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20,0
+-9.60,-81.60,1.22,0.00,1.00,-86.40,43.20,0
+-19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00,0
+-134.40,-86.40,1.17,0.00,1.00,-96.00,48.00,0
+-168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00,0
+-172.80,-76.80,1.13,0.00,1.00,-105.60,43.20,0
+-177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20,0
+-177.60,-67.20,1.09,0.00,1.00,-115.20,43.20,0
+-177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40,0
+-177.60,-57.60,1.05,0.00,1.00,-124.80,38.40,0
+-177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40,0
+-177.60,-48.00,1.00,0.00,1.00,-134.40,33.60,0
+-177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80,0
+-177.60,-38.40,0.96,0.00,1.00,-144.00,28.80,0
+-177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00,0
+-177.60,-28.80,0.92,0.00,1.00,-153.60,24.00,0
+-177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20,0
+-177.60,-19.20,0.88,0.00,1.00,-163.20,14.40,0
+-177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40,0
+-177.60,-9.60,0.83,0.00,1.00,-172.80,9.60,0
+-177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80,0
+-177.60,-0.00,0.79,0.00,1.00,177.60,0.00,0
+177.60,0.00,0.77,0.00,1.00,172.80,0.00,0
+177.60,4.80,0.75,0.00,1.00,168.00,-4.80,0
+177.60,9.60,0.73,0.00,1.00,163.20,9.60,0
+177.60,14.40,0.70,0.00,1.00,158.40,-14.40,0
+177.60,19.20,0.68,0.00,1.00,153.60,14.40,0
+177.60,24.00,0.66,0.00,1.00,148.80,-19.20,0
+177.60,28.80,0.64,0.00,1.00,144.00,24.00,0
+177.60,33.60,0.62,0.00,1.00,139.20,-24.00,0
+177.60,38.40,0.60,0.00,1.00,134.40,28.80,0
+177.60,43.20,0.58,0.00,1.00,129.60,-28.80,0
+177.60,48.00,0.56,0.00,1.00,124.80,33.60,0
+177.60,52.80,0.53,0.00,1.00,120.00,-38.40,0
+177.60,57.60,0.51,0.00,1.00,115.20,38.40,0
+177.60,62.40,0.49,0.00,1.00,110.40,-38.40,0
+177.60,67.20,0.47,0.00,1.00,105.60,43.20,0
+177.60,72.00,0.45,0.00,1.00,100.80,-43.20,0
+172.80,76.80,0.43,0.00,1.00,96.00,43.20,0
+168.00,81.60,0.41,0.00,1.00,91.20,-48.00,0
+134.40,86.40,0.38,0.00,1.00,86.40,48.00,0
+19.20,86.40,0.36,0.00,1.00,81.60,-48.00,0
+9.60,81.60,0.34,0.00,1.00,76.80,43.20,0
+4.80,76.80,0.32,0.00,1.00,72.00,-43.20,0
+4.80,72.00,0.30,0.00,1.00,67.20,43.20,0
+4.80,67.20,0.28,0.00,1.00,62.40,-43.20,0
+0.00,62.40,0.26,0.00,1.00,57.60,38.40,0
+0.00,57.60,0.23,0.00,1.00,52.80,-38.40,0
+0.00,52.80,0.21,0.00,1.00,48.00,33.60,0
+0.00,48.00,0.19,0.00,1.00,43.20,-33.60,0
+0.00,43.20,0.17,0.00,1.00,38.40,28.80,0
+0.00,38.40,0.15,0.00,1.00,33.60,-28.80,0
+0.00,33.60,0.13,0.00,1.00,28.80,24.00,0
+0.00,28.80,0.11,0.00,1.00,24.00,-19.20,0
+0.00,24.00,0.09,0.00,1.00,19.20,19.20,0
+0.00,19.20,0.06,0.00,1.00,14.40,-14.40,0
+0.00,14.40,0.04,0.00,1.00,9.60,9.60,0
+0.00,9.60,0.02,0.00,1.00,4.80,-4.80,0
+0.00,4.80,0.00,0.00,1.00,0.00,4.80,0
diff --git a/scripts/testv/stvISM2.csv b/scripts/testv/stvISM2.csv
index dcd3fee39c2a449df4d955626a7148aaecba3fab..f5c6b1f25e71755e1b34e7ce7f6a8913f3e1a85f 100644
--- a/scripts/testv/stvISM2.csv
+++ b/scripts/testv/stvISM2.csv
@@ -1,1500 +1,1500 @@
-0.00,4.80,1.00,0.00,1.00
-0.00,9.60,1.00,0.00,1.00
-0.00,14.40,1.00,0.00,1.00
-0.00,19.20,1.00,0.00,1.00
-0.00,24.00,1.00,0.00,1.00
-0.00,28.80,1.00,0.00,1.00
-0.00,33.60,1.00,0.00,1.00
-0.00,38.40,1.00,0.00,1.00
-0.00,43.20,1.00,0.00,1.00
-0.00,48.00,1.00,0.00,1.00
-0.00,52.80,1.00,0.00,1.00
-0.00,57.60,1.00,0.00,1.00
-0.00,62.40,1.00,0.00,1.00
-4.80,67.20,1.00,0.00,1.00
-4.80,72.00,1.00,0.00,1.00
-4.80,76.80,1.00,0.00,1.00
-9.60,81.60,1.00,0.00,1.00
-19.20,86.40,1.00,0.00,1.00
-134.40,86.40,1.00,0.00,1.00
-168.00,81.60,1.00,0.00,1.00
-172.80,76.80,1.00,0.00,1.00
-177.60,72.00,1.00,0.00,1.00
-177.60,67.20,1.00,0.00,1.00
-177.60,62.40,1.00,0.00,1.00
-177.60,57.60,1.00,0.00,1.00
-177.60,52.80,1.00,0.00,1.00
-177.60,48.00,1.00,0.00,1.00
-177.60,43.20,1.00,0.00,1.00
-177.60,38.40,1.00,0.00,1.00
-177.60,33.60,1.00,0.00,1.00
-177.60,28.80,1.00,0.00,1.00
-177.60,24.00,1.00,0.00,1.00
-177.60,19.20,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--177.60,-19.20,1.00,0.00,1.00
--177.60,-24.00,1.00,0.00,1.00
--177.60,-28.80,1.00,0.00,1.00
--177.60,-33.60,1.00,0.00,1.00
--177.60,-38.40,1.00,0.00,1.00
--177.60,-43.20,1.00,0.00,1.00
--177.60,-48.00,1.00,0.00,1.00
--177.60,-52.80,1.00,0.00,1.00
--177.60,-57.60,1.00,0.00,1.00
--177.60,-62.40,1.00,0.00,1.00
--177.60,-67.20,1.00,0.00,1.00
--177.60,-72.00,1.00,0.00,1.00
--172.80,-76.80,1.00,0.00,1.00
--168.00,-81.60,1.00,0.00,1.00
--134.40,-86.40,1.00,0.00,1.00
--19.20,-86.40,1.00,0.00,1.00
--9.60,-81.60,1.00,0.00,1.00
--4.80,-76.80,1.00,0.00,1.00
--4.80,-72.00,1.00,0.00,1.00
--4.80,-67.20,1.00,0.00,1.00
--0.00,-62.40,1.00,0.00,1.00
--0.00,-57.60,1.00,0.00,1.00
--0.00,-52.80,1.00,0.00,1.00
--0.00,-48.00,1.00,0.00,1.00
--0.00,-43.20,1.00,0.00,1.00
--0.00,-38.40,1.00,0.00,1.00
--0.00,-33.60,1.00,0.00,1.00
--0.00,-28.80,1.00,0.00,1.00
--0.00,-24.00,1.00,0.00,1.00
--0.00,-19.20,1.00,0.00,1.00
--0.00,-14.40,1.00,0.00,1.00
--0.00,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,14.40,1.00,0.00,1.00
--0.00,19.20,1.00,0.00,1.00
--0.00,24.00,1.00,0.00,1.00
--0.00,28.80,1.00,0.00,1.00
--0.00,33.60,1.00,0.00,1.00
--4.80,38.40,1.00,0.00,1.00
--4.80,43.20,1.00,0.00,1.00
--4.80,48.00,1.00,0.00,1.00
--4.80,52.80,1.00,0.00,1.00
--4.80,57.60,1.00,0.00,1.00
--4.80,62.40,1.00,0.00,1.00
--9.60,67.20,1.00,0.00,1.00
--9.60,72.00,1.00,0.00,1.00
--14.40,76.80,1.00,0.00,1.00
--24.00,81.60,1.00,0.00,1.00
--43.20,86.40,1.00,0.00,1.00
--110.40,86.40,1.00,0.00,1.00
--148.80,81.60,1.00,0.00,1.00
--163.20,76.80,1.00,0.00,1.00
--168.00,72.00,1.00,0.00,1.00
--172.80,67.20,1.00,0.00,1.00
--172.80,62.40,1.00,0.00,1.00
--172.80,57.60,1.00,0.00,1.00
--172.80,52.80,1.00,0.00,1.00
--177.60,48.00,1.00,0.00,1.00
--177.60,43.20,1.00,0.00,1.00
--177.60,38.40,1.00,0.00,1.00
--177.60,33.60,1.00,0.00,1.00
--177.60,28.80,1.00,0.00,1.00
--177.60,24.00,1.00,0.00,1.00
--177.60,19.20,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-177.60,-19.20,1.00,0.00,1.00
-177.60,-24.00,1.00,0.00,1.00
-177.60,-28.80,1.00,0.00,1.00
-177.60,-33.60,1.00,0.00,1.00
-177.60,-38.40,1.00,0.00,1.00
-177.60,-43.20,1.00,0.00,1.00
-177.60,-48.00,1.00,0.00,1.00
-172.80,-52.80,1.00,0.00,1.00
-172.80,-57.60,1.00,0.00,1.00
-172.80,-62.40,1.00,0.00,1.00
-172.80,-67.20,1.00,0.00,1.00
-168.00,-72.00,1.00,0.00,1.00
-163.20,-76.80,1.00,0.00,1.00
-148.80,-81.60,1.00,0.00,1.00
-110.40,-86.40,1.00,0.00,1.00
-43.20,-86.40,1.00,0.00,1.00
-24.00,-81.60,1.00,0.00,1.00
-14.40,-76.80,1.00,0.00,1.00
-9.60,-72.00,1.00,0.00,1.00
-9.60,-67.20,1.00,0.00,1.00
-4.80,-62.40,1.00,0.00,1.00
-4.80,-57.60,1.00,0.00,1.00
-4.80,-52.80,1.00,0.00,1.00
-4.80,-48.00,1.00,0.00,1.00
-4.80,-43.20,1.00,0.00,1.00
-4.80,-38.40,1.00,0.00,1.00
-0.00,-33.60,1.00,0.00,1.00
-0.00,-28.80,1.00,0.00,1.00
-0.00,-24.00,1.00,0.00,1.00
-0.00,-19.20,1.00,0.00,1.00
-0.00,-14.40,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,14.40,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--4.80,24.00,1.00,0.00,1.00
--4.80,28.80,1.00,0.00,1.00
--4.80,33.60,1.00,0.00,1.00
--4.80,38.40,1.00,0.00,1.00
--9.60,43.20,1.00,0.00,1.00
--9.60,48.00,1.00,0.00,1.00
--9.60,52.80,1.00,0.00,1.00
--14.40,57.60,1.00,0.00,1.00
--14.40,62.40,1.00,0.00,1.00
--19.20,67.20,1.00,0.00,1.00
--24.00,72.00,1.00,0.00,1.00
--33.60,72.00,1.00,0.00,1.00
--43.20,76.80,1.00,0.00,1.00
--67.20,81.60,1.00,0.00,1.00
--96.00,81.60,1.00,0.00,1.00
--124.80,81.60,1.00,0.00,1.00
--144.00,76.80,1.00,0.00,1.00
--153.60,72.00,1.00,0.00,1.00
--158.40,67.20,1.00,0.00,1.00
--163.20,62.40,1.00,0.00,1.00
--168.00,57.60,1.00,0.00,1.00
--168.00,52.80,1.00,0.00,1.00
--168.00,48.00,1.00,0.00,1.00
--172.80,43.20,1.00,0.00,1.00
--172.80,38.40,1.00,0.00,1.00
--172.80,33.60,1.00,0.00,1.00
--172.80,28.80,1.00,0.00,1.00
--177.60,24.00,1.00,0.00,1.00
--177.60,19.20,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-177.60,-19.20,1.00,0.00,1.00
-177.60,-24.00,1.00,0.00,1.00
-172.80,-28.80,1.00,0.00,1.00
-172.80,-33.60,1.00,0.00,1.00
-172.80,-38.40,1.00,0.00,1.00
-172.80,-43.20,1.00,0.00,1.00
-168.00,-48.00,1.00,0.00,1.00
-168.00,-52.80,1.00,0.00,1.00
-168.00,-57.60,1.00,0.00,1.00
-163.20,-62.40,1.00,0.00,1.00
-158.40,-67.20,1.00,0.00,1.00
-153.60,-72.00,1.00,0.00,1.00
-144.00,-76.80,1.00,0.00,1.00
-124.80,-81.60,1.00,0.00,1.00
-96.00,-81.60,1.00,0.00,1.00
-67.20,-81.60,1.00,0.00,1.00
-43.20,-76.80,1.00,0.00,1.00
-33.60,-72.00,1.00,0.00,1.00
-24.00,-72.00,1.00,0.00,1.00
-19.20,-67.20,1.00,0.00,1.00
-14.40,-62.40,1.00,0.00,1.00
-14.40,-57.60,1.00,0.00,1.00
-9.60,-52.80,1.00,0.00,1.00
-9.60,-48.00,1.00,0.00,1.00
-9.60,-43.20,1.00,0.00,1.00
-4.80,-38.40,1.00,0.00,1.00
-4.80,-33.60,1.00,0.00,1.00
-4.80,-28.80,1.00,0.00,1.00
-4.80,-24.00,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-0.00,-14.40,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--4.80,24.00,1.00,0.00,1.00
--4.80,28.80,1.00,0.00,1.00
--9.60,33.60,1.00,0.00,1.00
--9.60,38.40,1.00,0.00,1.00
--14.40,43.20,1.00,0.00,1.00
--14.40,48.00,1.00,0.00,1.00
--14.40,52.80,1.00,0.00,1.00
--19.20,57.60,1.00,0.00,1.00
--24.00,57.60,1.00,0.00,1.00
--28.80,62.40,1.00,0.00,1.00
--33.60,67.20,1.00,0.00,1.00
--43.20,72.00,1.00,0.00,1.00
--57.60,72.00,1.00,0.00,1.00
--76.80,76.80,1.00,0.00,1.00
--96.00,76.80,1.00,0.00,1.00
--115.20,76.80,1.00,0.00,1.00
--129.60,72.00,1.00,0.00,1.00
--139.20,72.00,1.00,0.00,1.00
--148.80,67.20,1.00,0.00,1.00
--153.60,62.40,1.00,0.00,1.00
--158.40,57.60,1.00,0.00,1.00
--163.20,52.80,1.00,0.00,1.00
--163.20,48.00,1.00,0.00,1.00
--168.00,43.20,1.00,0.00,1.00
--168.00,38.40,1.00,0.00,1.00
--172.80,33.60,1.00,0.00,1.00
--172.80,28.80,1.00,0.00,1.00
--172.80,24.00,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--177.60,14.40,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-177.60,-14.40,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-172.80,-24.00,1.00,0.00,1.00
-172.80,-28.80,1.00,0.00,1.00
-172.80,-33.60,1.00,0.00,1.00
-168.00,-38.40,1.00,0.00,1.00
-168.00,-43.20,1.00,0.00,1.00
-163.20,-48.00,1.00,0.00,1.00
-163.20,-52.80,1.00,0.00,1.00
-158.40,-57.60,1.00,0.00,1.00
-153.60,-62.40,1.00,0.00,1.00
-148.80,-67.20,1.00,0.00,1.00
-139.20,-72.00,1.00,0.00,1.00
-129.60,-72.00,1.00,0.00,1.00
-115.20,-76.80,1.00,0.00,1.00
-96.00,-76.80,1.00,0.00,1.00
-76.80,-76.80,1.00,0.00,1.00
-57.60,-72.00,1.00,0.00,1.00
-43.20,-72.00,1.00,0.00,1.00
-33.60,-67.20,1.00,0.00,1.00
-28.80,-62.40,1.00,0.00,1.00
-24.00,-57.60,1.00,0.00,1.00
-19.20,-57.60,1.00,0.00,1.00
-14.40,-52.80,1.00,0.00,1.00
-14.40,-48.00,1.00,0.00,1.00
-14.40,-43.20,1.00,0.00,1.00
-9.60,-38.40,1.00,0.00,1.00
-9.60,-33.60,1.00,0.00,1.00
-4.80,-28.80,1.00,0.00,1.00
-4.80,-24.00,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--4.80,19.20,1.00,0.00,1.00
--9.60,24.00,1.00,0.00,1.00
--9.60,28.80,1.00,0.00,1.00
--9.60,33.60,1.00,0.00,1.00
--14.40,38.40,1.00,0.00,1.00
--14.40,38.40,1.00,0.00,1.00
--19.20,43.20,1.00,0.00,1.00
--24.00,48.00,1.00,0.00,1.00
--24.00,52.80,1.00,0.00,1.00
--28.80,57.60,1.00,0.00,1.00
--38.40,62.40,1.00,0.00,1.00
--43.20,62.40,1.00,0.00,1.00
--52.80,67.20,1.00,0.00,1.00
--62.40,72.00,1.00,0.00,1.00
--76.80,72.00,1.00,0.00,1.00
--96.00,72.00,1.00,0.00,1.00
--110.40,72.00,1.00,0.00,1.00
--120.00,67.20,1.00,0.00,1.00
--134.40,67.20,1.00,0.00,1.00
--139.20,62.40,1.00,0.00,1.00
--148.80,57.60,1.00,0.00,1.00
--153.60,57.60,1.00,0.00,1.00
--158.40,52.80,1.00,0.00,1.00
--158.40,48.00,1.00,0.00,1.00
--163.20,43.20,1.00,0.00,1.00
--163.20,38.40,1.00,0.00,1.00
--168.00,33.60,1.00,0.00,1.00
--168.00,28.80,1.00,0.00,1.00
--172.80,24.00,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-172.80,-24.00,1.00,0.00,1.00
-168.00,-28.80,1.00,0.00,1.00
-168.00,-33.60,1.00,0.00,1.00
-163.20,-38.40,1.00,0.00,1.00
-163.20,-43.20,1.00,0.00,1.00
-158.40,-48.00,1.00,0.00,1.00
-158.40,-52.80,1.00,0.00,1.00
-153.60,-57.60,1.00,0.00,1.00
-148.80,-57.60,1.00,0.00,1.00
-139.20,-62.40,1.00,0.00,1.00
-134.40,-67.20,1.00,0.00,1.00
-120.00,-67.20,1.00,0.00,1.00
-110.40,-72.00,1.00,0.00,1.00
-96.00,-72.00,1.00,0.00,1.00
-76.80,-72.00,1.00,0.00,1.00
-62.40,-72.00,1.00,0.00,1.00
-52.80,-67.20,1.00,0.00,1.00
-43.20,-62.40,1.00,0.00,1.00
-38.40,-62.40,1.00,0.00,1.00
-28.80,-57.60,1.00,0.00,1.00
-24.00,-52.80,1.00,0.00,1.00
-24.00,-48.00,1.00,0.00,1.00
-19.20,-43.20,1.00,0.00,1.00
-14.40,-38.40,1.00,0.00,1.00
-14.40,-38.40,1.00,0.00,1.00
-9.60,-33.60,1.00,0.00,1.00
-9.60,-28.80,1.00,0.00,1.00
-9.60,-24.00,1.00,0.00,1.00
-4.80,-19.20,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--9.60,24.00,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--14.40,28.80,1.00,0.00,1.00
--19.20,33.60,1.00,0.00,1.00
--19.20,38.40,1.00,0.00,1.00
--24.00,43.20,1.00,0.00,1.00
--28.80,48.00,1.00,0.00,1.00
--33.60,52.80,1.00,0.00,1.00
--38.40,52.80,1.00,0.00,1.00
--43.20,57.60,1.00,0.00,1.00
--48.00,62.40,1.00,0.00,1.00
--57.60,62.40,1.00,0.00,1.00
--67.20,67.20,1.00,0.00,1.00
--81.60,67.20,1.00,0.00,1.00
--91.20,67.20,1.00,0.00,1.00
--105.60,67.20,1.00,0.00,1.00
--115.20,67.20,1.00,0.00,1.00
--124.80,62.40,1.00,0.00,1.00
--134.40,57.60,1.00,0.00,1.00
--139.20,57.60,1.00,0.00,1.00
--144.00,52.80,1.00,0.00,1.00
--148.80,48.00,1.00,0.00,1.00
--153.60,43.20,1.00,0.00,1.00
--158.40,43.20,1.00,0.00,1.00
--163.20,38.40,1.00,0.00,1.00
--163.20,33.60,1.00,0.00,1.00
--168.00,28.80,1.00,0.00,1.00
--168.00,24.00,1.00,0.00,1.00
--172.80,19.20,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--177.60,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-177.60,-9.60,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-172.80,-19.20,1.00,0.00,1.00
-168.00,-24.00,1.00,0.00,1.00
-168.00,-28.80,1.00,0.00,1.00
-163.20,-33.60,1.00,0.00,1.00
-163.20,-38.40,1.00,0.00,1.00
-158.40,-43.20,1.00,0.00,1.00
-153.60,-43.20,1.00,0.00,1.00
-148.80,-48.00,1.00,0.00,1.00
-144.00,-52.80,1.00,0.00,1.00
-139.20,-57.60,1.00,0.00,1.00
-134.40,-57.60,1.00,0.00,1.00
-124.80,-62.40,1.00,0.00,1.00
-115.20,-67.20,1.00,0.00,1.00
-105.60,-67.20,1.00,0.00,1.00
-91.20,-67.20,1.00,0.00,1.00
-81.60,-67.20,1.00,0.00,1.00
-67.20,-67.20,1.00,0.00,1.00
-57.60,-62.40,1.00,0.00,1.00
-48.00,-62.40,1.00,0.00,1.00
-43.20,-57.60,1.00,0.00,1.00
-38.40,-52.80,1.00,0.00,1.00
-33.60,-52.80,1.00,0.00,1.00
-28.80,-48.00,1.00,0.00,1.00
-24.00,-43.20,1.00,0.00,1.00
-19.20,-38.40,1.00,0.00,1.00
-19.20,-33.60,1.00,0.00,1.00
-14.40,-28.80,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-9.60,-24.00,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--4.80,14.40,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--9.60,19.20,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--19.20,28.80,1.00,0.00,1.00
--19.20,33.60,1.00,0.00,1.00
--24.00,38.40,1.00,0.00,1.00
--28.80,43.20,1.00,0.00,1.00
--33.60,43.20,1.00,0.00,1.00
--38.40,48.00,1.00,0.00,1.00
--43.20,52.80,1.00,0.00,1.00
--48.00,52.80,1.00,0.00,1.00
--52.80,57.60,1.00,0.00,1.00
--62.40,57.60,1.00,0.00,1.00
--72.00,62.40,1.00,0.00,1.00
--81.60,62.40,1.00,0.00,1.00
--91.20,62.40,1.00,0.00,1.00
--100.80,62.40,1.00,0.00,1.00
--110.40,62.40,1.00,0.00,1.00
--120.00,57.60,1.00,0.00,1.00
--129.60,57.60,1.00,0.00,1.00
--134.40,52.80,1.00,0.00,1.00
--139.20,48.00,1.00,0.00,1.00
--144.00,48.00,1.00,0.00,1.00
--148.80,43.20,1.00,0.00,1.00
--153.60,38.40,1.00,0.00,1.00
--158.40,33.60,1.00,0.00,1.00
--163.20,33.60,1.00,0.00,1.00
--163.20,28.80,1.00,0.00,1.00
--168.00,24.00,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-168.00,-24.00,1.00,0.00,1.00
-163.20,-28.80,1.00,0.00,1.00
-163.20,-33.60,1.00,0.00,1.00
-158.40,-33.60,1.00,0.00,1.00
-153.60,-38.40,1.00,0.00,1.00
-148.80,-43.20,1.00,0.00,1.00
-144.00,-48.00,1.00,0.00,1.00
-139.20,-48.00,1.00,0.00,1.00
-134.40,-52.80,1.00,0.00,1.00
-129.60,-57.60,1.00,0.00,1.00
-120.00,-57.60,1.00,0.00,1.00
-110.40,-62.40,1.00,0.00,1.00
-100.80,-62.40,1.00,0.00,1.00
-91.20,-62.40,1.00,0.00,1.00
-81.60,-62.40,1.00,0.00,1.00
-72.00,-62.40,1.00,0.00,1.00
-62.40,-57.60,1.00,0.00,1.00
-52.80,-57.60,1.00,0.00,1.00
-48.00,-52.80,1.00,0.00,1.00
-43.20,-52.80,1.00,0.00,1.00
-38.40,-48.00,1.00,0.00,1.00
-33.60,-43.20,1.00,0.00,1.00
-28.80,-43.20,1.00,0.00,1.00
-24.00,-38.40,1.00,0.00,1.00
-19.20,-33.60,1.00,0.00,1.00
-19.20,-28.80,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-9.60,-19.20,1.00,0.00,1.00
-4.80,-14.40,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--14.40,24.00,1.00,0.00,1.00
--19.20,28.80,1.00,0.00,1.00
--24.00,33.60,1.00,0.00,1.00
--28.80,33.60,1.00,0.00,1.00
--28.80,38.40,1.00,0.00,1.00
--33.60,43.20,1.00,0.00,1.00
--38.40,43.20,1.00,0.00,1.00
--48.00,48.00,1.00,0.00,1.00
--52.80,52.80,1.00,0.00,1.00
--57.60,52.80,1.00,0.00,1.00
--67.20,57.60,1.00,0.00,1.00
--76.80,57.60,1.00,0.00,1.00
--81.60,57.60,1.00,0.00,1.00
--91.20,57.60,1.00,0.00,1.00
--100.80,57.60,1.00,0.00,1.00
--110.40,57.60,1.00,0.00,1.00
--115.20,52.80,1.00,0.00,1.00
--124.80,52.80,1.00,0.00,1.00
--129.60,48.00,1.00,0.00,1.00
--139.20,48.00,1.00,0.00,1.00
--144.00,43.20,1.00,0.00,1.00
--148.80,38.40,1.00,0.00,1.00
--153.60,38.40,1.00,0.00,1.00
--153.60,33.60,1.00,0.00,1.00
--158.40,28.80,1.00,0.00,1.00
--163.20,24.00,1.00,0.00,1.00
--163.20,24.00,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--172.80,14.40,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-172.80,-14.40,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-163.20,-24.00,1.00,0.00,1.00
-163.20,-24.00,1.00,0.00,1.00
-158.40,-28.80,1.00,0.00,1.00
-153.60,-33.60,1.00,0.00,1.00
-153.60,-38.40,1.00,0.00,1.00
-148.80,-38.40,1.00,0.00,1.00
-144.00,-43.20,1.00,0.00,1.00
-139.20,-48.00,1.00,0.00,1.00
-129.60,-48.00,1.00,0.00,1.00
-124.80,-52.80,1.00,0.00,1.00
-115.20,-52.80,1.00,0.00,1.00
-110.40,-57.60,1.00,0.00,1.00
-100.80,-57.60,1.00,0.00,1.00
-91.20,-57.60,1.00,0.00,1.00
-81.60,-57.60,1.00,0.00,1.00
-76.80,-57.60,1.00,0.00,1.00
-67.20,-57.60,1.00,0.00,1.00
-57.60,-52.80,1.00,0.00,1.00
-52.80,-52.80,1.00,0.00,1.00
-48.00,-48.00,1.00,0.00,1.00
-38.40,-43.20,1.00,0.00,1.00
-33.60,-43.20,1.00,0.00,1.00
-28.80,-38.40,1.00,0.00,1.00
-28.80,-33.60,1.00,0.00,1.00
-24.00,-33.60,1.00,0.00,1.00
-19.20,-28.80,1.00,0.00,1.00
-14.40,-24.00,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,9.60,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--9.60,14.40,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--19.20,24.00,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--24.00,28.80,1.00,0.00,1.00
--28.80,33.60,1.00,0.00,1.00
--33.60,38.40,1.00,0.00,1.00
--38.40,38.40,1.00,0.00,1.00
--43.20,43.20,1.00,0.00,1.00
--48.00,43.20,1.00,0.00,1.00
--52.80,48.00,1.00,0.00,1.00
--62.40,48.00,1.00,0.00,1.00
--67.20,52.80,1.00,0.00,1.00
--76.80,52.80,1.00,0.00,1.00
--86.40,52.80,1.00,0.00,1.00
--91.20,52.80,1.00,0.00,1.00
--100.80,52.80,1.00,0.00,1.00
--105.60,52.80,1.00,0.00,1.00
--115.20,48.00,1.00,0.00,1.00
--120.00,48.00,1.00,0.00,1.00
--129.60,48.00,1.00,0.00,1.00
--134.40,43.20,1.00,0.00,1.00
--139.20,43.20,1.00,0.00,1.00
--144.00,38.40,1.00,0.00,1.00
--148.80,33.60,1.00,0.00,1.00
--153.60,33.60,1.00,0.00,1.00
--158.40,28.80,1.00,0.00,1.00
--158.40,24.00,1.00,0.00,1.00
--163.20,19.20,1.00,0.00,1.00
--168.00,19.20,1.00,0.00,1.00
--168.00,14.40,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-177.60,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
-168.00,-19.20,1.00,0.00,1.00
-163.20,-19.20,1.00,0.00,1.00
-158.40,-24.00,1.00,0.00,1.00
-158.40,-28.80,1.00,0.00,1.00
-153.60,-33.60,1.00,0.00,1.00
-148.80,-33.60,1.00,0.00,1.00
-144.00,-38.40,1.00,0.00,1.00
-139.20,-43.20,1.00,0.00,1.00
-134.40,-43.20,1.00,0.00,1.00
-129.60,-48.00,1.00,0.00,1.00
-120.00,-48.00,1.00,0.00,1.00
-115.20,-48.00,1.00,0.00,1.00
-105.60,-52.80,1.00,0.00,1.00
-100.80,-52.80,1.00,0.00,1.00
-91.20,-52.80,1.00,0.00,1.00
-86.40,-52.80,1.00,0.00,1.00
-76.80,-52.80,1.00,0.00,1.00
-67.20,-52.80,1.00,0.00,1.00
-62.40,-48.00,1.00,0.00,1.00
-52.80,-48.00,1.00,0.00,1.00
-48.00,-43.20,1.00,0.00,1.00
-43.20,-43.20,1.00,0.00,1.00
-38.40,-38.40,1.00,0.00,1.00
-33.60,-38.40,1.00,0.00,1.00
-28.80,-33.60,1.00,0.00,1.00
-24.00,-28.80,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-19.20,-24.00,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-4.80,-9.60,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
--14.40,19.20,1.00,0.00,1.00
--19.20,19.20,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--28.80,28.80,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
--38.40,33.60,1.00,0.00,1.00
--43.20,38.40,1.00,0.00,1.00
--48.00,38.40,1.00,0.00,1.00
--52.80,43.20,1.00,0.00,1.00
--57.60,43.20,1.00,0.00,1.00
--62.40,43.20,1.00,0.00,1.00
--72.00,48.00,1.00,0.00,1.00
--76.80,48.00,1.00,0.00,1.00
--86.40,48.00,1.00,0.00,1.00
--91.20,48.00,1.00,0.00,1.00
--100.80,48.00,1.00,0.00,1.00
--105.60,48.00,1.00,0.00,1.00
--110.40,48.00,1.00,0.00,1.00
--120.00,43.20,1.00,0.00,1.00
--124.80,43.20,1.00,0.00,1.00
--129.60,38.40,1.00,0.00,1.00
--134.40,38.40,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
--144.00,33.60,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
--153.60,24.00,1.00,0.00,1.00
--158.40,24.00,1.00,0.00,1.00
--163.20,19.20,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--168.00,14.40,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-163.20,-19.20,1.00,0.00,1.00
-158.40,-24.00,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
-148.80,-28.80,1.00,0.00,1.00
-144.00,-33.60,1.00,0.00,1.00
-139.20,-33.60,1.00,0.00,1.00
-134.40,-38.40,1.00,0.00,1.00
-129.60,-38.40,1.00,0.00,1.00
-124.80,-43.20,1.00,0.00,1.00
-120.00,-43.20,1.00,0.00,1.00
-110.40,-48.00,1.00,0.00,1.00
-105.60,-48.00,1.00,0.00,1.00
-100.80,-48.00,1.00,0.00,1.00
-91.20,-48.00,1.00,0.00,1.00
-86.40,-48.00,1.00,0.00,1.00
-76.80,-48.00,1.00,0.00,1.00
-72.00,-48.00,1.00,0.00,1.00
-62.40,-43.20,1.00,0.00,1.00
-57.60,-43.20,1.00,0.00,1.00
-52.80,-43.20,1.00,0.00,1.00
-48.00,-38.40,1.00,0.00,1.00
-43.20,-38.40,1.00,0.00,1.00
-38.40,-33.60,1.00,0.00,1.00
-33.60,-28.80,1.00,0.00,1.00
-28.80,-28.80,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-19.20,-19.20,1.00,0.00,1.00
-14.40,-19.20,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
--28.80,24.00,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
--38.40,28.80,1.00,0.00,1.00
--43.20,33.60,1.00,0.00,1.00
--48.00,33.60,1.00,0.00,1.00
--52.80,38.40,1.00,0.00,1.00
--62.40,38.40,1.00,0.00,1.00
--67.20,38.40,1.00,0.00,1.00
--72.00,43.20,1.00,0.00,1.00
--76.80,43.20,1.00,0.00,1.00
--86.40,43.20,1.00,0.00,1.00
--91.20,43.20,1.00,0.00,1.00
--96.00,43.20,1.00,0.00,1.00
--105.60,43.20,1.00,0.00,1.00
--110.40,43.20,1.00,0.00,1.00
--115.20,38.40,1.00,0.00,1.00
--124.80,38.40,1.00,0.00,1.00
--129.60,38.40,1.00,0.00,1.00
--134.40,33.60,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
--144.00,28.80,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
--153.60,24.00,1.00,0.00,1.00
--158.40,19.20,1.00,0.00,1.00
--158.40,19.20,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
-148.80,-28.80,1.00,0.00,1.00
-144.00,-28.80,1.00,0.00,1.00
-139.20,-33.60,1.00,0.00,1.00
-134.40,-33.60,1.00,0.00,1.00
-129.60,-38.40,1.00,0.00,1.00
-124.80,-38.40,1.00,0.00,1.00
-115.20,-38.40,1.00,0.00,1.00
-110.40,-43.20,1.00,0.00,1.00
-105.60,-43.20,1.00,0.00,1.00
-96.00,-43.20,1.00,0.00,1.00
-91.20,-43.20,1.00,0.00,1.00
-86.40,-43.20,1.00,0.00,1.00
-76.80,-43.20,1.00,0.00,1.00
-72.00,-43.20,1.00,0.00,1.00
-67.20,-38.40,1.00,0.00,1.00
-62.40,-38.40,1.00,0.00,1.00
-52.80,-38.40,1.00,0.00,1.00
-48.00,-33.60,1.00,0.00,1.00
-43.20,-33.60,1.00,0.00,1.00
-38.40,-28.80,1.00,0.00,1.00
-33.60,-28.80,1.00,0.00,1.00
-28.80,-24.00,1.00,0.00,1.00
-24.00,-24.00,1.00,0.00,1.00
-24.00,-19.20,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
--33.60,24.00,1.00,0.00,1.00
--38.40,24.00,1.00,0.00,1.00
--43.20,28.80,1.00,0.00,1.00
--48.00,28.80,1.00,0.00,1.00
--52.80,33.60,1.00,0.00,1.00
--57.60,33.60,1.00,0.00,1.00
--62.40,33.60,1.00,0.00,1.00
--67.20,38.40,1.00,0.00,1.00
--72.00,38.40,1.00,0.00,1.00
--81.60,38.40,1.00,0.00,1.00
--86.40,38.40,1.00,0.00,1.00
--91.20,38.40,1.00,0.00,1.00
--96.00,38.40,1.00,0.00,1.00
--105.60,38.40,1.00,0.00,1.00
--110.40,38.40,1.00,0.00,1.00
--115.20,33.60,1.00,0.00,1.00
--120.00,33.60,1.00,0.00,1.00
--124.80,33.60,1.00,0.00,1.00
--129.60,28.80,1.00,0.00,1.00
--134.40,28.80,1.00,0.00,1.00
--139.20,24.00,1.00,0.00,1.00
--144.00,24.00,1.00,0.00,1.00
--148.80,19.20,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-172.80,-9.60,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-153.60,-19.20,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
-144.00,-24.00,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
-134.40,-28.80,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
-124.80,-33.60,1.00,0.00,1.00
-120.00,-33.60,1.00,0.00,1.00
-115.20,-33.60,1.00,0.00,1.00
-110.40,-38.40,1.00,0.00,1.00
-105.60,-38.40,1.00,0.00,1.00
-96.00,-38.40,1.00,0.00,1.00
-91.20,-38.40,1.00,0.00,1.00
-86.40,-38.40,1.00,0.00,1.00
-81.60,-38.40,1.00,0.00,1.00
-72.00,-38.40,1.00,0.00,1.00
-67.20,-38.40,1.00,0.00,1.00
-62.40,-33.60,1.00,0.00,1.00
-57.60,-33.60,1.00,0.00,1.00
-52.80,-33.60,1.00,0.00,1.00
-48.00,-28.80,1.00,0.00,1.00
-43.20,-28.80,1.00,0.00,1.00
-38.40,-24.00,1.00,0.00,1.00
-33.60,-24.00,1.00,0.00,1.00
-28.80,-19.20,1.00,0.00,1.00
-24.00,-19.20,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-9.60,-9.60,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
--24.00,14.40,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
--33.60,19.20,1.00,0.00,1.00
--38.40,24.00,1.00,0.00,1.00
--43.20,24.00,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
--52.80,28.80,1.00,0.00,1.00
--57.60,28.80,1.00,0.00,1.00
--62.40,28.80,1.00,0.00,1.00
--67.20,33.60,1.00,0.00,1.00
--72.00,33.60,1.00,0.00,1.00
--81.60,33.60,1.00,0.00,1.00
--86.40,33.60,1.00,0.00,1.00
--91.20,33.60,1.00,0.00,1.00
--96.00,33.60,1.00,0.00,1.00
--100.80,33.60,1.00,0.00,1.00
--110.40,33.60,1.00,0.00,1.00
--115.20,33.60,1.00,0.00,1.00
--120.00,28.80,1.00,0.00,1.00
--124.80,28.80,1.00,0.00,1.00
--129.60,28.80,1.00,0.00,1.00
--134.40,24.00,1.00,0.00,1.00
--139.20,24.00,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
--148.80,19.20,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
-144.00,-19.20,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
-134.40,-24.00,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
-124.80,-28.80,1.00,0.00,1.00
-120.00,-28.80,1.00,0.00,1.00
-115.20,-33.60,1.00,0.00,1.00
-110.40,-33.60,1.00,0.00,1.00
-100.80,-33.60,1.00,0.00,1.00
-96.00,-33.60,1.00,0.00,1.00
-91.20,-33.60,1.00,0.00,1.00
-86.40,-33.60,1.00,0.00,1.00
-81.60,-33.60,1.00,0.00,1.00
-72.00,-33.60,1.00,0.00,1.00
-67.20,-33.60,1.00,0.00,1.00
-62.40,-28.80,1.00,0.00,1.00
-57.60,-28.80,1.00,0.00,1.00
-52.80,-28.80,1.00,0.00,1.00
-48.00,-24.00,1.00,0.00,1.00
-43.20,-24.00,1.00,0.00,1.00
-38.40,-24.00,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
-28.80,-19.20,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
-19.20,-14.40,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--24.00,14.40,1.00,0.00,1.00
--28.80,14.40,1.00,0.00,1.00
--33.60,19.20,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
--43.20,19.20,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
--52.80,24.00,1.00,0.00,1.00
--57.60,24.00,1.00,0.00,1.00
--62.40,24.00,1.00,0.00,1.00
--72.00,28.80,1.00,0.00,1.00
--76.80,28.80,1.00,0.00,1.00
--81.60,28.80,1.00,0.00,1.00
--86.40,28.80,1.00,0.00,1.00
--91.20,28.80,1.00,0.00,1.00
--96.00,28.80,1.00,0.00,1.00
--100.80,28.80,1.00,0.00,1.00
--105.60,28.80,1.00,0.00,1.00
--115.20,28.80,1.00,0.00,1.00
--120.00,24.00,1.00,0.00,1.00
--124.80,24.00,1.00,0.00,1.00
--129.60,24.00,1.00,0.00,1.00
--134.40,24.00,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-144.00,-19.20,1.00,0.00,1.00
-139.20,-19.20,1.00,0.00,1.00
-134.40,-24.00,1.00,0.00,1.00
-129.60,-24.00,1.00,0.00,1.00
-124.80,-24.00,1.00,0.00,1.00
-120.00,-24.00,1.00,0.00,1.00
-115.20,-28.80,1.00,0.00,1.00
-105.60,-28.80,1.00,0.00,1.00
-100.80,-28.80,1.00,0.00,1.00
-96.00,-28.80,1.00,0.00,1.00
-91.20,-28.80,1.00,0.00,1.00
-86.40,-28.80,1.00,0.00,1.00
-81.60,-28.80,1.00,0.00,1.00
-76.80,-28.80,1.00,0.00,1.00
-72.00,-28.80,1.00,0.00,1.00
-62.40,-24.00,1.00,0.00,1.00
-57.60,-24.00,1.00,0.00,1.00
-52.80,-24.00,1.00,0.00,1.00
-48.00,-24.00,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
-38.40,-19.20,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
-28.80,-14.40,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
--33.60,14.40,1.00,0.00,1.00
--33.60,14.40,1.00,0.00,1.00
--38.40,14.40,1.00,0.00,1.00
--43.20,19.20,1.00,0.00,1.00
--48.00,19.20,1.00,0.00,1.00
--57.60,19.20,1.00,0.00,1.00
--62.40,19.20,1.00,0.00,1.00
--67.20,24.00,1.00,0.00,1.00
--72.00,24.00,1.00,0.00,1.00
--76.80,24.00,1.00,0.00,1.00
--81.60,24.00,1.00,0.00,1.00
--86.40,24.00,1.00,0.00,1.00
--91.20,24.00,1.00,0.00,1.00
--96.00,24.00,1.00,0.00,1.00
--100.80,24.00,1.00,0.00,1.00
--105.60,24.00,1.00,0.00,1.00
--110.40,24.00,1.00,0.00,1.00
--115.20,19.20,1.00,0.00,1.00
--120.00,19.20,1.00,0.00,1.00
--129.60,19.20,1.00,0.00,1.00
--134.40,19.20,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
--144.00,14.40,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
--153.60,9.60,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--172.80,4.80,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-158.40,-9.60,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
-144.00,-14.40,1.00,0.00,1.00
-139.20,-19.20,1.00,0.00,1.00
-134.40,-19.20,1.00,0.00,1.00
-129.60,-19.20,1.00,0.00,1.00
-120.00,-19.20,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
-110.40,-24.00,1.00,0.00,1.00
-105.60,-24.00,1.00,0.00,1.00
-100.80,-24.00,1.00,0.00,1.00
-96.00,-24.00,1.00,0.00,1.00
-91.20,-24.00,1.00,0.00,1.00
-86.40,-24.00,1.00,0.00,1.00
-81.60,-24.00,1.00,0.00,1.00
-76.80,-24.00,1.00,0.00,1.00
-72.00,-24.00,1.00,0.00,1.00
-67.20,-24.00,1.00,0.00,1.00
-62.40,-19.20,1.00,0.00,1.00
-57.60,-19.20,1.00,0.00,1.00
-48.00,-19.20,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
-38.40,-14.40,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
--33.60,9.60,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
--43.20,14.40,1.00,0.00,1.00
--48.00,14.40,1.00,0.00,1.00
--52.80,14.40,1.00,0.00,1.00
--57.60,14.40,1.00,0.00,1.00
--62.40,19.20,1.00,0.00,1.00
--67.20,19.20,1.00,0.00,1.00
--72.00,19.20,1.00,0.00,1.00
--76.80,19.20,1.00,0.00,1.00
--81.60,19.20,1.00,0.00,1.00
--86.40,19.20,1.00,0.00,1.00
--91.20,19.20,1.00,0.00,1.00
--96.00,19.20,1.00,0.00,1.00
--100.80,19.20,1.00,0.00,1.00
--105.60,19.20,1.00,0.00,1.00
--110.40,19.20,1.00,0.00,1.00
--115.20,19.20,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
--124.80,14.40,1.00,0.00,1.00
--129.60,14.40,1.00,0.00,1.00
--134.40,14.40,1.00,0.00,1.00
--139.20,14.40,1.00,0.00,1.00
--144.00,9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
--153.60,9.60,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
-148.80,-9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
-139.20,-14.40,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
-129.60,-14.40,1.00,0.00,1.00
-124.80,-14.40,1.00,0.00,1.00
-120.00,-14.40,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
-110.40,-19.20,1.00,0.00,1.00
-105.60,-19.20,1.00,0.00,1.00
-100.80,-19.20,1.00,0.00,1.00
-96.00,-19.20,1.00,0.00,1.00
-91.20,-19.20,1.00,0.00,1.00
-86.40,-19.20,1.00,0.00,1.00
-81.60,-19.20,1.00,0.00,1.00
-76.80,-19.20,1.00,0.00,1.00
-72.00,-19.20,1.00,0.00,1.00
-67.20,-19.20,1.00,0.00,1.00
-62.40,-19.20,1.00,0.00,1.00
-57.60,-14.40,1.00,0.00,1.00
-52.80,-14.40,1.00,0.00,1.00
-48.00,-14.40,1.00,0.00,1.00
-43.20,-14.40,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
--33.60,9.60,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
--43.20,9.60,1.00,0.00,1.00
--48.00,9.60,1.00,0.00,1.00
--52.80,9.60,1.00,0.00,1.00
--57.60,14.40,1.00,0.00,1.00
--62.40,14.40,1.00,0.00,1.00
--67.20,14.40,1.00,0.00,1.00
--72.00,14.40,1.00,0.00,1.00
--76.80,14.40,1.00,0.00,1.00
--81.60,14.40,1.00,0.00,1.00
--86.40,14.40,1.00,0.00,1.00
--91.20,14.40,1.00,0.00,1.00
--96.00,14.40,1.00,0.00,1.00
--100.80,14.40,1.00,0.00,1.00
--105.60,14.40,1.00,0.00,1.00
--110.40,14.40,1.00,0.00,1.00
--115.20,14.40,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
--124.80,9.60,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
--134.40,9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
--144.00,9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
--153.60,4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-168.00,-4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
-148.80,-9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
-139.20,-9.60,1.00,0.00,1.00
-134.40,-9.60,1.00,0.00,1.00
-129.60,-9.60,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
-120.00,-14.40,1.00,0.00,1.00
-115.20,-14.40,1.00,0.00,1.00
-110.40,-14.40,1.00,0.00,1.00
-105.60,-14.40,1.00,0.00,1.00
-100.80,-14.40,1.00,0.00,1.00
-96.00,-14.40,1.00,0.00,1.00
-91.20,-14.40,1.00,0.00,1.00
-86.40,-14.40,1.00,0.00,1.00
-81.60,-14.40,1.00,0.00,1.00
-76.80,-14.40,1.00,0.00,1.00
-72.00,-14.40,1.00,0.00,1.00
-67.20,-14.40,1.00,0.00,1.00
-62.40,-14.40,1.00,0.00,1.00
-57.60,-14.40,1.00,0.00,1.00
-52.80,-9.60,1.00,0.00,1.00
-48.00,-9.60,1.00,0.00,1.00
-43.20,-9.60,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
--38.40,4.80,1.00,0.00,1.00
--43.20,4.80,1.00,0.00,1.00
--48.00,4.80,1.00,0.00,1.00
--52.80,9.60,1.00,0.00,1.00
--57.60,9.60,1.00,0.00,1.00
--62.40,9.60,1.00,0.00,1.00
--67.20,9.60,1.00,0.00,1.00
--72.00,9.60,1.00,0.00,1.00
--76.80,9.60,1.00,0.00,1.00
--81.60,9.60,1.00,0.00,1.00
--86.40,9.60,1.00,0.00,1.00
--91.20,9.60,1.00,0.00,1.00
--96.00,9.60,1.00,0.00,1.00
--100.80,9.60,1.00,0.00,1.00
--105.60,9.60,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
--115.20,9.60,1.00,0.00,1.00
--120.00,9.60,1.00,0.00,1.00
--124.80,9.60,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
--134.40,4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
--144.00,4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
--153.60,4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
--163.20,4.80,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-168.00,-0.00,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
-158.40,-4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
-148.80,-4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
-139.20,-4.80,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
-129.60,-9.60,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
-120.00,-9.60,1.00,0.00,1.00
-115.20,-9.60,1.00,0.00,1.00
-110.40,-9.60,1.00,0.00,1.00
-105.60,-9.60,1.00,0.00,1.00
-100.80,-9.60,1.00,0.00,1.00
-96.00,-9.60,1.00,0.00,1.00
-91.20,-9.60,1.00,0.00,1.00
-86.40,-9.60,1.00,0.00,1.00
-81.60,-9.60,1.00,0.00,1.00
-76.80,-9.60,1.00,0.00,1.00
-72.00,-9.60,1.00,0.00,1.00
-67.20,-9.60,1.00,0.00,1.00
-62.40,-9.60,1.00,0.00,1.00
-57.60,-9.60,1.00,0.00,1.00
-52.80,-9.60,1.00,0.00,1.00
-48.00,-4.80,1.00,0.00,1.00
-43.20,-4.80,1.00,0.00,1.00
-38.40,-4.80,1.00,0.00,1.00
-33.60,-4.80,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
--38.40,4.80,1.00,0.00,1.00
--43.20,4.80,1.00,0.00,1.00
--48.00,4.80,1.00,0.00,1.00
--52.80,4.80,1.00,0.00,1.00
--57.60,4.80,1.00,0.00,1.00
--62.40,4.80,1.00,0.00,1.00
--67.20,4.80,1.00,0.00,1.00
--72.00,4.80,1.00,0.00,1.00
--76.80,4.80,1.00,0.00,1.00
--81.60,4.80,1.00,0.00,1.00
--86.40,4.80,1.00,0.00,1.00
--91.20,4.80,1.00,0.00,1.00
--96.00,4.80,1.00,0.00,1.00
--100.80,4.80,1.00,0.00,1.00
--105.60,4.80,1.00,0.00,1.00
--110.40,4.80,1.00,0.00,1.00
--115.20,4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
--124.80,4.80,1.00,0.00,1.00
--129.60,4.80,1.00,0.00,1.00
--134.40,4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
--144.00,4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
--153.60,0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
--163.20,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-168.00,-0.00,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
-158.40,-0.00,1.00,0.00,1.00
-153.60,-0.00,1.00,0.00,1.00
-148.80,-4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
-139.20,-4.80,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
-129.60,-4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
-120.00,-4.80,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
-110.40,-4.80,1.00,0.00,1.00
-105.60,-4.80,1.00,0.00,1.00
-100.80,-4.80,1.00,0.00,1.00
-96.00,-4.80,1.00,0.00,1.00
-91.20,-4.80,1.00,0.00,1.00
-86.40,-4.80,1.00,0.00,1.00
-81.60,-4.80,1.00,0.00,1.00
-76.80,-4.80,1.00,0.00,1.00
-72.00,-4.80,1.00,0.00,1.00
-67.20,-4.80,1.00,0.00,1.00
-62.40,-4.80,1.00,0.00,1.00
-57.60,-4.80,1.00,0.00,1.00
-52.80,-4.80,1.00,0.00,1.00
-48.00,-4.80,1.00,0.00,1.00
-43.20,-4.80,1.00,0.00,1.00
-38.40,-4.80,1.00,0.00,1.00
-33.60,-4.80,1.00,0.00,1.00
-28.80,-0.00,1.00,0.00,1.00
-24.00,-0.00,1.00,0.00,1.00
-19.20,-0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
--33.60,0.00,1.00,0.00,1.00
--38.40,0.00,1.00,0.00,1.00
--43.20,0.00,1.00,0.00,1.00
--48.00,0.00,1.00,0.00,1.00
--52.80,0.00,1.00,0.00,1.00
--57.60,0.00,1.00,0.00,1.00
--62.40,0.00,1.00,0.00,1.00
--67.20,0.00,1.00,0.00,1.00
--72.00,0.00,1.00,0.00,1.00
--76.80,0.00,1.00,0.00,1.00
--81.60,0.00,1.00,0.00,1.00
--86.40,0.00,1.00,0.00,1.00
--91.20,0.00,1.00,0.00,1.00
--96.00,0.00,1.00,0.00,1.00
--100.80,0.00,1.00,0.00,1.00
--105.60,0.00,1.00,0.00,1.00
--110.40,0.00,1.00,0.00,1.00
--115.20,0.00,1.00,0.00,1.00
--120.00,0.00,1.00,0.00,1.00
--124.80,0.00,1.00,0.00,1.00
--129.60,0.00,1.00,0.00,1.00
--134.40,0.00,1.00,0.00,1.00
--139.20,0.00,1.00,0.00,1.00
--144.00,0.00,1.00,0.00,1.00
--148.80,0.00,1.00,0.00,1.00
--153.60,0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
--163.20,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-168.00,0.00,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
-158.40,0.00,1.00,0.00,1.00
-153.60,0.00,1.00,0.00,1.00
-148.80,0.00,1.00,0.00,1.00
-144.00,0.00,1.00,0.00,1.00
-139.20,0.00,1.00,0.00,1.00
-134.40,0.00,1.00,0.00,1.00
-129.60,0.00,1.00,0.00,1.00
-124.80,0.00,1.00,0.00,1.00
-120.00,0.00,1.00,0.00,1.00
-115.20,0.00,1.00,0.00,1.00
-110.40,0.00,1.00,0.00,1.00
-105.60,0.00,1.00,0.00,1.00
-100.80,0.00,1.00,0.00,1.00
-96.00,0.00,1.00,0.00,1.00
-91.20,0.00,1.00,0.00,1.00
-86.40,0.00,1.00,0.00,1.00
-81.60,0.00,1.00,0.00,1.00
-76.80,0.00,1.00,0.00,1.00
-72.00,0.00,1.00,0.00,1.00
-67.20,0.00,1.00,0.00,1.00
-62.40,0.00,1.00,0.00,1.00
-57.60,0.00,1.00,0.00,1.00
-52.80,0.00,1.00,0.00,1.00
-48.00,0.00,1.00,0.00,1.00
-43.20,0.00,1.00,0.00,1.00
-38.40,0.00,1.00,0.00,1.00
-33.60,0.00,1.00,0.00,1.00
-28.80,0.00,1.00,0.00,1.00
-24.00,0.00,1.00,0.00,1.00
-19.20,0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
+0.00,4.80,16.00,0.00,1.00,0.00,0.00,0
+0.00,9.60,15.98,0.00,1.00,-177.60,4.80,0
+0.00,14.40,15.96,0.00,1.00,4.80,9.60,0
+0.00,19.20,15.94,0.00,1.00,-168.00,14.40,0
+0.00,24.00,15.91,0.00,1.00,14.40,19.20,0
+0.00,28.80,15.89,0.00,1.00,-163.20,24.00,0
+0.00,33.60,15.87,0.00,1.00,19.20,28.80,0
+0.00,38.40,15.85,0.00,1.00,-153.60,33.60,0
+0.00,43.20,15.83,0.00,1.00,28.80,38.40,0
+0.00,48.00,15.81,0.00,1.00,-148.80,43.20,0
+0.00,52.80,15.79,0.00,1.00,38.40,48.00,0
+0.00,57.60,15.77,0.00,1.00,-139.20,52.80,0
+0.00,62.40,15.74,0.00,1.00,48.00,57.60,0
+4.80,67.20,15.72,0.00,1.00,-124.80,62.40,0
+4.80,72.00,15.70,0.00,1.00,57.60,67.20,0
+4.80,76.80,15.68,0.00,1.00,-115.20,72.00,0
+9.60,81.60,15.66,0.00,1.00,72.00,76.80,0
+19.20,86.40,15.64,0.00,1.00,-100.80,81.60,0
+134.40,86.40,15.62,0.00,1.00,86.40,86.40,0
+168.00,81.60,15.59,0.00,1.00,-86.40,89.20,0
+172.80,76.80,15.57,0.00,1.00,100.80,86.40,0
+177.60,72.00,15.55,0.00,1.00,-76.80,81.60,0
+177.60,67.20,15.53,0.00,1.00,110.40,76.80,0
+177.60,62.40,15.51,0.00,1.00,-62.40,72.00,0
+177.60,57.60,15.49,0.00,1.00,124.80,67.20,0
+177.60,52.80,15.47,0.00,1.00,-52.80,62.40,0
+177.60,48.00,15.44,0.00,1.00,134.40,57.60,0
+177.60,43.20,15.42,0.00,1.00,-38.40,52.80,0
+177.60,38.40,15.40,0.00,1.00,144.00,48.00,0
+177.60,33.60,15.38,0.00,1.00,-33.60,43.20,0
+177.60,28.80,15.36,0.00,1.00,153.60,38.40,0
+177.60,24.00,15.34,0.00,1.00,-24.00,33.60,0
+177.60,19.20,15.32,0.00,1.00,158.40,28.80,0
+177.60,14.40,15.30,0.00,1.00,-14.40,24.00,0
+177.60,9.60,15.27,0.00,1.00,168.00,19.20,0
+177.60,4.80,15.25,0.00,1.00,-9.60,14.40,0
+177.60,0.00,15.23,0.00,1.00,172.80,9.60,0
+-177.60,-0.00,15.21,0.00,1.00,-0.00,4.80,0
+-177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00,0
+-177.60,-9.60,15.17,0.00,1.00,4.80,-4.80,0
+-177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60,0
+-177.60,-19.20,15.12,0.00,1.00,14.40,-14.40,0
+-177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20,0
+-177.60,-28.80,15.08,0.00,1.00,19.20,-24.00,0
+-177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80,0
+-177.60,-38.40,15.04,0.00,1.00,28.80,-33.60,0
+-177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40,0
+-177.60,-48.00,15.00,0.00,1.00,33.60,-48.00,0
+-177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00,0
+-177.60,-57.60,14.95,0.00,1.00,43.20,-52.80,0
+-177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60,0
+-177.60,-67.20,14.91,0.00,1.00,57.60,-62.40,0
+-177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20,0
+-172.80,-76.80,14.87,0.00,1.00,67.20,-76.80,0
+-168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80,0
+-134.40,-86.40,14.83,0.00,1.00,81.60,-86.40,0
+-19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20,0
+-9.60,-81.60,14.78,0.00,1.00,96.00,-86.40,0
+-4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60,0
+-4.80,-72.00,14.74,0.00,1.00,110.40,-76.80,0
+-4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00,0
+-0.00,-62.40,14.70,0.00,1.00,120.00,-67.20,0
+-0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40,0
+-0.00,-52.80,14.65,0.00,1.00,129.60,-57.60,0
+-0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80,0
+-0.00,-43.20,14.61,0.00,1.00,144.00,-48.00,0
+-0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20,0
+-0.00,-33.60,14.57,0.00,1.00,148.80,-38.40,0
+-0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60,0
+-0.00,-24.00,14.53,0.00,1.00,158.40,-28.80,0
+-0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00,0
+-0.00,-14.40,14.48,0.00,1.00,168.00,-19.20,0
+-0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40,0
+-0.00,-4.80,14.44,0.00,1.00,172.80,-9.60,0
+-0.00,0.00,14.42,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,14.40,0.00,1.00,0.00,0.00,0
+-0.00,9.60,14.38,0.00,1.00,-177.60,4.80,0
+-0.00,14.40,14.36,0.00,1.00,9.60,9.60,0
+-0.00,19.20,14.33,0.00,1.00,-168.00,14.40,0
+-0.00,24.00,14.31,0.00,1.00,14.40,19.20,0
+-0.00,28.80,14.29,0.00,1.00,-163.20,24.00,0
+-0.00,33.60,14.27,0.00,1.00,24.00,28.80,0
+-4.80,38.40,14.25,0.00,1.00,-153.60,33.60,0
+-4.80,43.20,14.23,0.00,1.00,28.80,38.40,0
+-4.80,48.00,14.21,0.00,1.00,-144.00,43.20,0
+-4.80,52.80,14.18,0.00,1.00,38.40,48.00,0
+-4.80,57.60,14.16,0.00,1.00,-134.40,52.80,0
+-4.80,62.40,14.14,0.00,1.00,48.00,57.60,0
+-9.60,67.20,14.12,0.00,1.00,-124.80,62.40,0
+-9.60,72.00,14.10,0.00,1.00,62.40,67.20,0
+-14.40,76.80,14.08,0.00,1.00,-115.20,72.00,0
+-24.00,81.60,14.06,0.00,1.00,72.00,76.80,0
+-43.20,86.40,14.03,0.00,1.00,-100.80,81.60,0
+-110.40,86.40,14.01,0.00,1.00,86.40,86.40,0
+-148.80,81.60,13.99,0.00,1.00,-86.40,86.40,0
+-163.20,76.80,13.97,0.00,1.00,96.00,81.60,0
+-168.00,72.00,13.95,0.00,1.00,-76.80,76.80,0
+-172.80,67.20,13.93,0.00,1.00,110.40,72.00,0
+-172.80,62.40,13.91,0.00,1.00,-62.40,67.20,0
+-172.80,57.60,13.89,0.00,1.00,120.00,62.40,0
+-172.80,52.80,13.86,0.00,1.00,-52.80,57.60,0
+-177.60,48.00,13.84,0.00,1.00,134.40,52.80,0
+-177.60,43.20,13.82,0.00,1.00,-43.20,48.00,0
+-177.60,38.40,13.80,0.00,1.00,144.00,43.20,0
+-177.60,33.60,13.78,0.00,1.00,-33.60,38.40,0
+-177.60,28.80,13.76,0.00,1.00,148.80,33.60,0
+-177.60,24.00,13.74,0.00,1.00,-24.00,28.80,0
+-177.60,19.20,13.71,0.00,1.00,158.40,24.00,0
+-177.60,14.40,13.69,0.00,1.00,-19.20,19.20,0
+-177.60,9.60,13.67,0.00,1.00,168.00,14.40,0
+-177.60,4.80,13.65,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,13.63,0.00,1.00,172.80,4.80,0
+177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00,0
+177.60,-9.60,13.56,0.00,1.00,4.80,-4.80,0
+177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60,0
+177.60,-19.20,13.52,0.00,1.00,14.40,-14.40,0
+177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20,0
+177.60,-28.80,13.48,0.00,1.00,19.20,-24.00,0
+177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80,0
+177.60,-38.40,13.44,0.00,1.00,28.80,-33.60,0
+177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40,0
+177.60,-48.00,13.39,0.00,1.00,38.40,-43.20,0
+172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00,0
+172.80,-57.60,13.35,0.00,1.00,48.00,-52.80,0
+172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60,0
+172.80,-67.20,13.31,0.00,1.00,57.60,-62.40,0
+168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20,0
+163.20,-76.80,13.27,0.00,1.00,72.00,-72.00,0
+148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80,0
+110.40,-86.40,13.22,0.00,1.00,81.60,-81.60,0
+43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40,0
+24.00,-81.60,13.18,0.00,1.00,96.00,-86.40,0
+14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60,0
+9.60,-72.00,13.14,0.00,1.00,105.60,-76.80,0
+9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00,0
+4.80,-62.40,13.09,0.00,1.00,120.00,-67.20,0
+4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40,0
+4.80,-52.80,13.05,0.00,1.00,129.60,-57.60,0
+4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80,0
+4.80,-43.20,13.01,0.00,1.00,139.20,-48.00,0
+4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20,0
+0.00,-33.60,12.97,0.00,1.00,148.80,-38.40,0
+0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60,0
+0.00,-24.00,12.92,0.00,1.00,158.40,-28.80,0
+0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00,0
+0.00,-14.40,12.88,0.00,1.00,163.20,-19.20,0
+0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40,0
+0.00,-4.80,12.84,0.00,1.00,172.80,-9.60,0
+0.00,0.00,12.82,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,12.80,0.00,1.00,0.00,0.00,0
+-0.00,9.60,12.77,0.00,1.00,-177.60,4.80,0
+-0.00,14.40,12.75,0.00,1.00,9.60,9.60,0
+-4.80,19.20,12.73,0.00,1.00,-168.00,14.40,0
+-4.80,24.00,12.71,0.00,1.00,14.40,19.20,0
+-4.80,28.80,12.69,0.00,1.00,-158.40,24.00,0
+-4.80,33.60,12.67,0.00,1.00,24.00,28.80,0
+-4.80,38.40,12.65,0.00,1.00,-153.60,33.60,0
+-9.60,43.20,12.62,0.00,1.00,33.60,38.40,0
+-9.60,48.00,12.60,0.00,1.00,-144.00,43.20,0
+-9.60,52.80,12.58,0.00,1.00,43.20,48.00,0
+-14.40,57.60,12.56,0.00,1.00,-134.40,52.80,0
+-14.40,62.40,12.54,0.00,1.00,52.80,57.60,0
+-19.20,67.20,12.52,0.00,1.00,-124.80,62.40,0
+-24.00,72.00,12.50,0.00,1.00,62.40,67.20,0
+-33.60,72.00,12.48,0.00,1.00,-110.40,72.00,0
+-43.20,76.80,12.45,0.00,1.00,72.00,72.00,0
+-67.20,81.60,12.43,0.00,1.00,-100.80,76.80,0
+-96.00,81.60,12.41,0.00,1.00,86.40,81.60,0
+-124.80,81.60,12.39,0.00,1.00,-86.40,81.60,0
+-144.00,76.80,12.37,0.00,1.00,96.00,76.80,0
+-153.60,72.00,12.35,0.00,1.00,-76.80,76.80,0
+-158.40,67.20,12.33,0.00,1.00,110.40,72.00,0
+-163.20,62.40,12.30,0.00,1.00,-67.20,67.20,0
+-168.00,57.60,12.28,0.00,1.00,120.00,62.40,0
+-168.00,52.80,12.26,0.00,1.00,-52.80,57.60,0
+-168.00,48.00,12.24,0.00,1.00,129.60,52.80,0
+-172.80,43.20,12.22,0.00,1.00,-43.20,48.00,0
+-172.80,38.40,12.20,0.00,1.00,139.20,43.20,0
+-172.80,33.60,12.18,0.00,1.00,-33.60,38.40,0
+-172.80,28.80,12.15,0.00,1.00,148.80,33.60,0
+-177.60,24.00,12.13,0.00,1.00,-24.00,28.80,0
+-177.60,19.20,12.11,0.00,1.00,158.40,24.00,0
+-177.60,14.40,12.09,0.00,1.00,-19.20,19.20,0
+-177.60,9.60,12.07,0.00,1.00,168.00,14.40,0
+-177.60,4.80,12.05,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,12.03,0.00,1.00,172.80,4.80,0
+177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00,0
+177.60,-9.60,11.96,0.00,1.00,4.80,-4.80,0
+177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60,0
+177.60,-19.20,11.92,0.00,1.00,14.40,-14.40,0
+177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20,0
+172.80,-28.80,11.88,0.00,1.00,24.00,-24.00,0
+172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80,0
+172.80,-38.40,11.83,0.00,1.00,28.80,-33.60,0
+172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40,0
+168.00,-48.00,11.79,0.00,1.00,38.40,-43.20,0
+168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00,0
+168.00,-57.60,11.75,0.00,1.00,48.00,-52.80,0
+163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60,0
+158.40,-67.20,11.71,0.00,1.00,62.40,-62.40,0
+153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20,0
+144.00,-76.80,11.66,0.00,1.00,72.00,-72.00,0
+124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80,0
+96.00,-81.60,11.62,0.00,1.00,81.60,-76.80,0
+67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60,0
+43.20,-76.80,11.58,0.00,1.00,96.00,-81.60,0
+33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80,0
+24.00,-72.00,11.54,0.00,1.00,105.60,-72.00,0
+19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00,0
+14.40,-62.40,11.49,0.00,1.00,115.20,-67.20,0
+14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40,0
+9.60,-52.80,11.45,0.00,1.00,129.60,-57.60,0
+9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80,0
+9.60,-43.20,11.41,0.00,1.00,139.20,-48.00,0
+4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20,0
+4.80,-33.60,11.36,0.00,1.00,148.80,-38.40,0
+4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60,0
+4.80,-24.00,11.32,0.00,1.00,153.60,-28.80,0
+4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00,0
+0.00,-14.40,11.28,0.00,1.00,163.20,-19.20,0
+0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40,0
+0.00,-4.80,11.24,0.00,1.00,172.80,-9.60,0
+0.00,0.00,11.21,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,11.19,0.00,1.00,0.00,0.00,0
+-0.00,9.60,11.17,0.00,1.00,-177.60,4.80,0
+-4.80,14.40,11.15,0.00,1.00,9.60,9.60,0
+-4.80,19.20,11.13,0.00,1.00,-168.00,14.40,0
+-4.80,24.00,11.11,0.00,1.00,14.40,19.20,0
+-4.80,28.80,11.09,0.00,1.00,-158.40,24.00,0
+-9.60,33.60,11.07,0.00,1.00,24.00,28.80,0
+-9.60,38.40,11.04,0.00,1.00,-148.80,33.60,0
+-14.40,43.20,11.02,0.00,1.00,33.60,38.40,0
+-14.40,48.00,11.00,0.00,1.00,-139.20,43.20,0
+-14.40,52.80,10.98,0.00,1.00,43.20,48.00,0
+-19.20,57.60,10.96,0.00,1.00,-129.60,52.80,0
+-24.00,57.60,10.94,0.00,1.00,52.80,52.80,0
+-28.80,62.40,10.92,0.00,1.00,-120.00,57.60,0
+-33.60,67.20,10.89,0.00,1.00,62.40,62.40,0
+-43.20,72.00,10.87,0.00,1.00,-110.40,67.20,0
+-57.60,72.00,10.85,0.00,1.00,76.80,72.00,0
+-76.80,76.80,10.83,0.00,1.00,-100.80,72.00,0
+-96.00,76.80,10.81,0.00,1.00,86.40,76.80,0
+-115.20,76.80,10.79,0.00,1.00,-86.40,76.80,0
+-129.60,72.00,10.77,0.00,1.00,96.00,76.80,0
+-139.20,72.00,10.74,0.00,1.00,-76.80,72.00,0
+-148.80,67.20,10.72,0.00,1.00,105.60,67.20,0
+-153.60,62.40,10.70,0.00,1.00,-67.20,67.20,0
+-158.40,57.60,10.68,0.00,1.00,120.00,62.40,0
+-163.20,52.80,10.66,0.00,1.00,-57.60,57.60,0
+-163.20,48.00,10.64,0.00,1.00,129.60,52.80,0
+-168.00,43.20,10.62,0.00,1.00,-48.00,48.00,0
+-168.00,38.40,10.60,0.00,1.00,139.20,43.20,0
+-172.80,33.60,10.57,0.00,1.00,-38.40,38.40,0
+-172.80,28.80,10.55,0.00,1.00,148.80,33.60,0
+-172.80,24.00,10.53,0.00,1.00,-28.80,28.80,0
+-172.80,19.20,10.51,0.00,1.00,158.40,24.00,0
+-177.60,14.40,10.49,0.00,1.00,-19.20,19.20,0
+-177.60,9.60,10.47,0.00,1.00,163.20,14.40,0
+-177.60,4.80,10.45,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,10.42,0.00,1.00,172.80,4.80,0
+177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00,0
+177.60,-9.60,10.36,0.00,1.00,4.80,-4.80,0
+177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60,0
+172.80,-19.20,10.32,0.00,1.00,14.40,-14.40,0
+172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20,0
+172.80,-28.80,10.28,0.00,1.00,24.00,-24.00,0
+172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80,0
+168.00,-38.40,10.23,0.00,1.00,33.60,-33.60,0
+168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40,0
+163.20,-48.00,10.19,0.00,1.00,43.20,-43.20,0
+163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00,0
+158.40,-57.60,10.15,0.00,1.00,52.80,-52.80,0
+153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60,0
+148.80,-67.20,10.10,0.00,1.00,62.40,-62.40,0
+139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20,0
+129.60,-72.00,10.06,0.00,1.00,72.00,-67.20,0
+115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00,0
+96.00,-76.80,10.02,0.00,1.00,81.60,-76.80,0
+76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80,0
+57.60,-72.00,9.98,0.00,1.00,96.00,-76.80,0
+43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00,0
+33.60,-67.20,9.93,0.00,1.00,105.60,-72.00,0
+28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20,0
+24.00,-57.60,9.89,0.00,1.00,115.20,-62.40,0
+19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60,0
+14.40,-52.80,9.85,0.00,1.00,124.80,-52.80,0
+14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80,0
+14.40,-43.20,9.81,0.00,1.00,134.40,-48.00,0
+9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20,0
+9.60,-33.60,9.76,0.00,1.00,144.00,-38.40,0
+4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60,0
+4.80,-24.00,9.72,0.00,1.00,153.60,-28.80,0
+4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00,0
+4.80,-14.40,9.68,0.00,1.00,163.20,-19.20,0
+0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40,0
+0.00,-4.80,9.63,0.00,1.00,172.80,-9.60,0
+0.00,0.00,9.61,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,9.59,0.00,1.00,0.00,0.00,0
+-4.80,9.60,9.57,0.00,1.00,-177.60,4.80,0
+-4.80,14.40,9.55,0.00,1.00,9.60,9.60,0
+-4.80,19.20,9.53,0.00,1.00,-168.00,14.40,0
+-9.60,24.00,9.51,0.00,1.00,19.20,19.20,0
+-9.60,28.80,9.48,0.00,1.00,-158.40,24.00,0
+-9.60,33.60,9.46,0.00,1.00,24.00,28.80,0
+-14.40,38.40,9.44,0.00,1.00,-148.80,33.60,0
+-14.40,38.40,9.42,0.00,1.00,33.60,33.60,0
+-19.20,43.20,9.40,0.00,1.00,-139.20,38.40,0
+-24.00,48.00,9.38,0.00,1.00,43.20,43.20,0
+-24.00,52.80,9.36,0.00,1.00,-129.60,48.00,0
+-28.80,57.60,9.34,0.00,1.00,52.80,52.80,0
+-38.40,62.40,9.31,0.00,1.00,-120.00,57.60,0
+-43.20,62.40,9.29,0.00,1.00,67.20,62.40,0
+-52.80,67.20,9.27,0.00,1.00,-110.40,62.40,0
+-62.40,72.00,9.25,0.00,1.00,76.80,67.20,0
+-76.80,72.00,9.23,0.00,1.00,-100.80,67.20,0
+-96.00,72.00,9.21,0.00,1.00,86.40,72.00,0
+-110.40,72.00,9.19,0.00,1.00,-86.40,72.00,0
+-120.00,67.20,9.16,0.00,1.00,96.00,72.00,0
+-134.40,67.20,9.14,0.00,1.00,-76.80,67.20,0
+-139.20,62.40,9.12,0.00,1.00,105.60,67.20,0
+-148.80,57.60,9.10,0.00,1.00,-67.20,62.40,0
+-153.60,57.60,9.08,0.00,1.00,115.20,57.60,0
+-158.40,52.80,9.06,0.00,1.00,-57.60,52.80,0
+-158.40,48.00,9.04,0.00,1.00,129.60,52.80,0
+-163.20,43.20,9.01,0.00,1.00,-48.00,48.00,0
+-163.20,38.40,8.99,0.00,1.00,139.20,43.20,0
+-168.00,33.60,8.97,0.00,1.00,-38.40,38.40,0
+-168.00,28.80,8.95,0.00,1.00,148.80,33.60,0
+-172.80,24.00,8.93,0.00,1.00,-28.80,28.80,0
+-172.80,19.20,8.91,0.00,1.00,153.60,24.00,0
+-172.80,14.40,8.89,0.00,1.00,-19.20,19.20,0
+-177.60,9.60,8.87,0.00,1.00,163.20,14.40,0
+-177.60,4.80,8.84,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,8.82,0.00,1.00,172.80,4.80,0
+177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00,0
+177.60,-9.60,8.76,0.00,1.00,4.80,-4.80,0
+172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60,0
+172.80,-19.20,8.72,0.00,1.00,14.40,-14.40,0
+172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20,0
+168.00,-28.80,8.67,0.00,1.00,24.00,-24.00,0
+168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80,0
+163.20,-38.40,8.63,0.00,1.00,33.60,-33.60,0
+163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40,0
+158.40,-48.00,8.59,0.00,1.00,43.20,-43.20,0
+158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00,0
+153.60,-57.60,8.54,0.00,1.00,52.80,-52.80,0
+148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80,0
+139.20,-62.40,8.50,0.00,1.00,62.40,-57.60,0
+134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40,0
+120.00,-67.20,8.46,0.00,1.00,72.00,-67.20,0
+110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20,0
+96.00,-72.00,8.42,0.00,1.00,81.60,-72.00,0
+76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00,0
+62.40,-72.00,8.37,0.00,1.00,96.00,-72.00,0
+52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20,0
+43.20,-62.40,8.33,0.00,1.00,105.60,-67.20,0
+38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40,0
+28.80,-57.60,8.29,0.00,1.00,115.20,-62.40,0
+24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60,0
+24.00,-48.00,8.25,0.00,1.00,124.80,-52.80,0
+19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00,0
+14.40,-38.40,8.20,0.00,1.00,134.40,-43.20,0
+14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40,0
+9.60,-33.60,8.16,0.00,1.00,144.00,-33.60,0
+9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60,0
+9.60,-24.00,8.12,0.00,1.00,153.60,-28.80,0
+4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00,0
+4.80,-14.40,8.07,0.00,1.00,163.20,-19.20,0
+4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40,0
+0.00,-4.80,8.03,0.00,1.00,172.80,-9.60,0
+0.00,0.00,8.01,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,7.99,0.00,1.00,0.00,0.00,0
+-4.80,9.60,7.97,0.00,1.00,-177.60,4.80,0
+-4.80,14.40,7.95,0.00,1.00,9.60,9.60,0
+-9.60,19.20,7.93,0.00,1.00,-168.00,14.40,0
+-9.60,24.00,7.90,0.00,1.00,19.20,19.20,0
+-14.40,24.00,7.88,0.00,1.00,-158.40,24.00,0
+-14.40,28.80,7.86,0.00,1.00,28.80,24.00,0
+-19.20,33.60,7.84,0.00,1.00,-148.80,28.80,0
+-19.20,38.40,7.82,0.00,1.00,38.40,33.60,0
+-24.00,43.20,7.80,0.00,1.00,-139.20,38.40,0
+-28.80,48.00,7.78,0.00,1.00,48.00,43.20,0
+-33.60,52.80,7.75,0.00,1.00,-129.60,48.00,0
+-38.40,52.80,7.73,0.00,1.00,57.60,52.80,0
+-43.20,57.60,7.71,0.00,1.00,-120.00,52.80,0
+-48.00,62.40,7.69,0.00,1.00,67.20,57.60,0
+-57.60,62.40,7.67,0.00,1.00,-110.40,62.40,0
+-67.20,67.20,7.65,0.00,1.00,76.80,62.40,0
+-81.60,67.20,7.63,0.00,1.00,-100.80,62.40,0
+-91.20,67.20,7.60,0.00,1.00,86.40,67.20,0
+-105.60,67.20,7.58,0.00,1.00,-86.40,67.20,0
+-115.20,67.20,7.56,0.00,1.00,96.00,67.20,0
+-124.80,62.40,7.54,0.00,1.00,-76.80,62.40,0
+-134.40,57.60,7.52,0.00,1.00,105.60,62.40,0
+-139.20,57.60,7.50,0.00,1.00,-67.20,57.60,0
+-144.00,52.80,7.48,0.00,1.00,115.20,57.60,0
+-148.80,48.00,7.46,0.00,1.00,-57.60,52.80,0
+-153.60,43.20,7.43,0.00,1.00,124.80,48.00,0
+-158.40,43.20,7.41,0.00,1.00,-48.00,43.20,0
+-163.20,38.40,7.39,0.00,1.00,134.40,38.40,0
+-163.20,33.60,7.37,0.00,1.00,-38.40,38.40,0
+-168.00,28.80,7.35,0.00,1.00,144.00,33.60,0
+-168.00,24.00,7.33,0.00,1.00,-28.80,28.80,0
+-172.80,19.20,7.31,0.00,1.00,153.60,24.00,0
+-172.80,14.40,7.28,0.00,1.00,-19.20,19.20,0
+-177.60,9.60,7.26,0.00,1.00,163.20,14.40,0
+-177.60,4.80,7.24,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,7.22,0.00,1.00,172.80,4.80,0
+177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00,0
+177.60,-9.60,7.16,0.00,1.00,4.80,-4.80,0
+172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60,0
+172.80,-19.20,7.11,0.00,1.00,14.40,-14.40,0
+168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20,0
+168.00,-28.80,7.07,0.00,1.00,24.00,-24.00,0
+163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80,0
+163.20,-38.40,7.03,0.00,1.00,33.60,-33.60,0
+158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40,0
+153.60,-43.20,6.99,0.00,1.00,43.20,-38.40,0
+148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20,0
+144.00,-52.80,6.94,0.00,1.00,52.80,-48.00,0
+139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80,0
+134.40,-57.60,6.90,0.00,1.00,62.40,-57.60,0
+124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60,0
+115.20,-67.20,6.86,0.00,1.00,72.00,-62.40,0
+105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40,0
+91.20,-67.20,6.81,0.00,1.00,81.60,-67.20,0
+81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20,0
+67.20,-67.20,6.77,0.00,1.00,96.00,-67.20,0
+57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40,0
+48.00,-62.40,6.73,0.00,1.00,105.60,-62.40,0
+43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40,0
+38.40,-52.80,6.69,0.00,1.00,115.20,-57.60,0
+33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80,0
+28.80,-48.00,6.64,0.00,1.00,124.80,-52.80,0
+24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00,0
+19.20,-38.40,6.60,0.00,1.00,134.40,-43.20,0
+19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40,0
+14.40,-28.80,6.56,0.00,1.00,144.00,-33.60,0
+14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80,0
+9.60,-24.00,6.52,0.00,1.00,153.60,-24.00,0
+9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00,0
+4.80,-14.40,6.47,0.00,1.00,163.20,-19.20,0
+4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40,0
+0.00,-4.80,6.43,0.00,1.00,172.80,-9.60,0
+0.00,0.00,6.41,0.00,1.00,-4.80,-4.80,0
+-0.00,4.80,6.39,0.00,1.00,0.00,0.00,0
+-4.80,9.60,6.37,0.00,1.00,-177.60,4.80,0
+-4.80,14.40,6.34,0.00,1.00,9.60,9.60,0
+-9.60,19.20,6.32,0.00,1.00,-168.00,14.40,0
+-9.60,19.20,6.30,0.00,1.00,19.20,14.40,0
+-14.40,24.00,6.28,0.00,1.00,-158.40,19.20,0
+-19.20,28.80,6.26,0.00,1.00,28.80,24.00,0
+-19.20,33.60,6.24,0.00,1.00,-148.80,28.80,0
+-24.00,38.40,6.22,0.00,1.00,38.40,33.60,0
+-28.80,43.20,6.19,0.00,1.00,-139.20,38.40,0
+-33.60,43.20,6.17,0.00,1.00,48.00,38.40,0
+-38.40,48.00,6.15,0.00,1.00,-129.60,43.20,0
+-43.20,52.80,6.13,0.00,1.00,57.60,48.00,0
+-48.00,52.80,6.11,0.00,1.00,-120.00,52.80,0
+-52.80,57.60,6.09,0.00,1.00,67.20,52.80,0
+-62.40,57.60,6.07,0.00,1.00,-110.40,57.60,0
+-72.00,62.40,6.05,0.00,1.00,76.80,57.60,0
+-81.60,62.40,6.02,0.00,1.00,-100.80,62.40,0
+-91.20,62.40,6.00,0.00,1.00,86.40,62.40,0
+-100.80,62.40,5.98,0.00,1.00,-86.40,62.40,0
+-110.40,62.40,5.96,0.00,1.00,96.00,62.40,0
+-120.00,57.60,5.94,0.00,1.00,-76.80,57.60,0
+-129.60,57.60,5.92,0.00,1.00,105.60,57.60,0
+-134.40,52.80,5.90,0.00,1.00,-67.20,57.60,0
+-139.20,48.00,5.87,0.00,1.00,115.20,52.80,0
+-144.00,48.00,5.85,0.00,1.00,-57.60,48.00,0
+-148.80,43.20,5.83,0.00,1.00,124.80,48.00,0
+-153.60,38.40,5.81,0.00,1.00,-48.00,43.20,0
+-158.40,33.60,5.79,0.00,1.00,134.40,38.40,0
+-163.20,33.60,5.77,0.00,1.00,-38.40,33.60,0
+-163.20,28.80,5.75,0.00,1.00,144.00,28.80,0
+-168.00,24.00,5.72,0.00,1.00,-28.80,28.80,0
+-168.00,19.20,5.70,0.00,1.00,153.60,24.00,0
+-172.80,14.40,5.68,0.00,1.00,-19.20,19.20,0
+-172.80,9.60,5.66,0.00,1.00,163.20,14.40,0
+-177.60,4.80,5.64,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,5.62,0.00,1.00,172.80,4.80,0
+177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,5.55,0.00,1.00,4.80,-4.80,0
+172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60,0
+168.00,-19.20,5.51,0.00,1.00,14.40,-14.40,0
+168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20,0
+163.20,-28.80,5.47,0.00,1.00,24.00,-24.00,0
+163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80,0
+158.40,-33.60,5.43,0.00,1.00,33.60,-28.80,0
+153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60,0
+148.80,-43.20,5.38,0.00,1.00,43.20,-38.40,0
+144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20,0
+139.20,-48.00,5.34,0.00,1.00,52.80,-48.00,0
+134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00,0
+129.60,-57.60,5.30,0.00,1.00,62.40,-52.80,0
+120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60,0
+110.40,-62.40,5.26,0.00,1.00,72.00,-57.60,0
+100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60,0
+91.20,-62.40,5.21,0.00,1.00,81.60,-62.40,0
+81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40,0
+72.00,-62.40,5.17,0.00,1.00,96.00,-62.40,0
+62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40,0
+52.80,-57.60,5.13,0.00,1.00,105.60,-57.60,0
+48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60,0
+43.20,-52.80,5.08,0.00,1.00,115.20,-52.80,0
+38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80,0
+33.60,-43.20,5.04,0.00,1.00,124.80,-48.00,0
+28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20,0
+24.00,-38.40,5.00,0.00,1.00,134.40,-38.40,0
+19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40,0
+19.20,-28.80,4.96,0.00,1.00,144.00,-33.60,0
+14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80,0
+9.60,-19.20,4.91,0.00,1.00,153.60,-24.00,0
+9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20,0
+4.80,-14.40,4.87,0.00,1.00,163.20,-14.40,0
+4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40,0
+0.00,-4.80,4.83,0.00,1.00,172.80,-9.60,0
+0.00,0.00,4.81,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,4.79,0.00,1.00,0.00,0.00,0
+-4.80,9.60,4.76,0.00,1.00,-177.60,4.80,0
+-9.60,14.40,4.74,0.00,1.00,9.60,9.60,0
+-9.60,14.40,4.72,0.00,1.00,-168.00,9.60,0
+-14.40,19.20,4.70,0.00,1.00,19.20,14.40,0
+-14.40,24.00,4.68,0.00,1.00,-158.40,19.20,0
+-19.20,28.80,4.66,0.00,1.00,28.80,24.00,0
+-24.00,33.60,4.64,0.00,1.00,-148.80,28.80,0
+-28.80,33.60,4.61,0.00,1.00,38.40,28.80,0
+-28.80,38.40,4.59,0.00,1.00,-139.20,33.60,0
+-33.60,43.20,4.57,0.00,1.00,48.00,38.40,0
+-38.40,43.20,4.55,0.00,1.00,-129.60,43.20,0
+-48.00,48.00,4.53,0.00,1.00,57.60,43.20,0
+-52.80,52.80,4.51,0.00,1.00,-120.00,48.00,0
+-57.60,52.80,4.49,0.00,1.00,67.20,48.00,0
+-67.20,57.60,4.46,0.00,1.00,-110.40,52.80,0
+-76.80,57.60,4.44,0.00,1.00,76.80,52.80,0
+-81.60,57.60,4.42,0.00,1.00,-100.80,57.60,0
+-91.20,57.60,4.40,0.00,1.00,86.40,57.60,0
+-100.80,57.60,4.38,0.00,1.00,-86.40,57.60,0
+-110.40,57.60,4.36,0.00,1.00,96.00,57.60,0
+-115.20,52.80,4.34,0.00,1.00,-76.80,52.80,0
+-124.80,52.80,4.32,0.00,1.00,105.60,52.80,0
+-129.60,48.00,4.29,0.00,1.00,-67.20,52.80,0
+-139.20,48.00,4.27,0.00,1.00,115.20,48.00,0
+-144.00,43.20,4.25,0.00,1.00,-57.60,48.00,0
+-148.80,38.40,4.23,0.00,1.00,124.80,43.20,0
+-153.60,38.40,4.21,0.00,1.00,-48.00,38.40,0
+-153.60,33.60,4.19,0.00,1.00,134.40,38.40,0
+-158.40,28.80,4.17,0.00,1.00,-38.40,33.60,0
+-163.20,24.00,4.14,0.00,1.00,144.00,28.80,0
+-163.20,24.00,4.12,0.00,1.00,-28.80,24.00,0
+-168.00,19.20,4.10,0.00,1.00,153.60,24.00,0
+-172.80,14.40,4.08,0.00,1.00,-19.20,19.20,0
+-172.80,9.60,4.06,0.00,1.00,163.20,14.40,0
+-177.60,4.80,4.04,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,4.02,0.00,1.00,172.80,4.80,0
+177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,3.95,0.00,1.00,4.80,-4.80,0
+172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60,0
+168.00,-19.20,3.91,0.00,1.00,14.40,-14.40,0
+163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20,0
+163.20,-24.00,3.87,0.00,1.00,24.00,-24.00,0
+158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00,0
+153.60,-33.60,3.82,0.00,1.00,33.60,-28.80,0
+153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60,0
+148.80,-38.40,3.78,0.00,1.00,43.20,-38.40,0
+144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40,0
+139.20,-48.00,3.74,0.00,1.00,52.80,-43.20,0
+129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00,0
+124.80,-52.80,3.70,0.00,1.00,62.40,-48.00,0
+115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80,0
+110.40,-57.60,3.65,0.00,1.00,72.00,-52.80,0
+100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80,0
+91.20,-57.60,3.61,0.00,1.00,81.60,-57.60,0
+81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60,0
+76.80,-57.60,3.57,0.00,1.00,96.00,-57.60,0
+67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60,0
+57.60,-52.80,3.52,0.00,1.00,105.60,-52.80,0
+52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80,0
+48.00,-48.00,3.48,0.00,1.00,115.20,-48.00,0
+38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00,0
+33.60,-43.20,3.44,0.00,1.00,124.80,-43.20,0
+28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20,0
+28.80,-33.60,3.40,0.00,1.00,134.40,-38.40,0
+24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60,0
+19.20,-28.80,3.35,0.00,1.00,144.00,-28.80,0
+14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80,0
+14.40,-19.20,3.31,0.00,1.00,153.60,-24.00,0
+9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20,0
+9.60,-14.40,3.27,0.00,1.00,163.20,-14.40,0
+4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,3.23,0.00,1.00,172.80,-9.60,0
+0.00,0.00,3.20,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,3.18,0.00,1.00,0.00,0.00,0
+-4.80,9.60,3.16,0.00,1.00,-177.60,4.80,0
+-9.60,9.60,3.14,0.00,1.00,9.60,9.60,0
+-9.60,14.40,3.12,0.00,1.00,-168.00,9.60,0
+-14.40,19.20,3.10,0.00,1.00,19.20,14.40,0
+-19.20,24.00,3.08,0.00,1.00,-158.40,19.20,0
+-24.00,24.00,3.05,0.00,1.00,28.80,24.00,0
+-24.00,28.80,3.03,0.00,1.00,-148.80,24.00,0
+-28.80,33.60,3.01,0.00,1.00,38.40,28.80,0
+-33.60,38.40,2.99,0.00,1.00,-139.20,33.60,0
+-38.40,38.40,2.97,0.00,1.00,48.00,33.60,0
+-43.20,43.20,2.95,0.00,1.00,-129.60,38.40,0
+-48.00,43.20,2.93,0.00,1.00,57.60,43.20,0
+-52.80,48.00,2.91,0.00,1.00,-120.00,43.20,0
+-62.40,48.00,2.88,0.00,1.00,67.20,48.00,0
+-67.20,52.80,2.86,0.00,1.00,-110.40,48.00,0
+-76.80,52.80,2.84,0.00,1.00,76.80,48.00,0
+-86.40,52.80,2.82,0.00,1.00,-100.80,52.80,0
+-91.20,52.80,2.80,0.00,1.00,86.40,52.80,0
+-100.80,52.80,2.78,0.00,1.00,-86.40,52.80,0
+-105.60,52.80,2.76,0.00,1.00,96.00,52.80,0
+-115.20,48.00,2.73,0.00,1.00,-76.80,48.00,0
+-120.00,48.00,2.71,0.00,1.00,105.60,48.00,0
+-129.60,48.00,2.69,0.00,1.00,-67.20,48.00,0
+-134.40,43.20,2.67,0.00,1.00,115.20,43.20,0
+-139.20,43.20,2.65,0.00,1.00,-57.60,43.20,0
+-144.00,38.40,2.63,0.00,1.00,124.80,38.40,0
+-148.80,33.60,2.61,0.00,1.00,-48.00,38.40,0
+-153.60,33.60,2.58,0.00,1.00,134.40,33.60,0
+-158.40,28.80,2.56,0.00,1.00,-38.40,28.80,0
+-158.40,24.00,2.54,0.00,1.00,144.00,28.80,0
+-163.20,19.20,2.52,0.00,1.00,-28.80,24.00,0
+-168.00,19.20,2.50,0.00,1.00,153.60,19.20,0
+-168.00,14.40,2.48,0.00,1.00,-19.20,14.40,0
+-172.80,9.60,2.46,0.00,1.00,163.20,14.40,0
+-177.60,4.80,2.44,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,2.41,0.00,1.00,172.80,4.80,0
+177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0
+177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,2.35,0.00,1.00,4.80,-4.80,0
+168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60,0
+168.00,-19.20,2.31,0.00,1.00,14.40,-14.40,0
+163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40,0
+158.40,-24.00,2.26,0.00,1.00,24.00,-19.20,0
+158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00,0
+153.60,-33.60,2.22,0.00,1.00,33.60,-28.80,0
+148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80,0
+144.00,-38.40,2.18,0.00,1.00,43.20,-33.60,0
+139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40,0
+134.40,-43.20,2.14,0.00,1.00,52.80,-38.40,0
+129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20,0
+120.00,-48.00,2.09,0.00,1.00,62.40,-43.20,0
+115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00,0
+105.60,-52.80,2.05,0.00,1.00,72.00,-48.00,0
+100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00,0
+91.20,-52.80,2.01,0.00,1.00,81.60,-52.80,0
+86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80,0
+76.80,-52.80,1.97,0.00,1.00,96.00,-52.80,0
+67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80,0
+62.40,-48.00,1.92,0.00,1.00,105.60,-48.00,0
+52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00,0
+48.00,-43.20,1.88,0.00,1.00,115.20,-48.00,0
+43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20,0
+38.40,-38.40,1.84,0.00,1.00,124.80,-43.20,0
+33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40,0
+28.80,-33.60,1.79,0.00,1.00,134.40,-33.60,0
+24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60,0
+24.00,-24.00,1.75,0.00,1.00,144.00,-28.80,0
+19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00,0
+14.40,-19.20,1.71,0.00,1.00,153.60,-24.00,0
+9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20,0
+9.60,-9.60,1.67,0.00,1.00,163.20,-14.40,0
+4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,1.62,0.00,1.00,172.80,-9.60,0
+0.00,0.00,1.60,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,1.58,0.00,1.00,0.00,0.00,0
+-4.80,4.80,1.56,0.00,1.00,-177.60,4.80,0
+-9.60,9.60,1.54,0.00,1.00,9.60,4.80,0
+-14.40,14.40,1.52,0.00,1.00,-168.00,9.60,0
+-14.40,19.20,1.50,0.00,1.00,19.20,14.40,0
+-19.20,19.20,1.47,0.00,1.00,-158.40,19.20,0
+-24.00,24.00,1.45,0.00,1.00,28.80,19.20,0
+-28.80,28.80,1.43,0.00,1.00,-148.80,24.00,0
+-33.60,28.80,1.41,0.00,1.00,38.40,28.80,0
+-38.40,33.60,1.39,0.00,1.00,-139.20,28.80,0
+-43.20,38.40,1.37,0.00,1.00,48.00,33.60,0
+-48.00,38.40,1.35,0.00,1.00,-129.60,33.60,0
+-52.80,43.20,1.32,0.00,1.00,57.60,38.40,0
+-57.60,43.20,1.30,0.00,1.00,-120.00,38.40,0
+-62.40,43.20,1.28,0.00,1.00,67.20,43.20,0
+-72.00,48.00,1.26,0.00,1.00,-110.40,43.20,0
+-76.80,48.00,1.24,0.00,1.00,76.80,43.20,0
+-86.40,48.00,1.22,0.00,1.00,-100.80,48.00,0
+-91.20,48.00,1.20,0.00,1.00,86.40,48.00,0
+-100.80,48.00,1.17,0.00,1.00,-86.40,48.00,0
+-105.60,48.00,1.15,0.00,1.00,96.00,48.00,0
+-110.40,48.00,1.13,0.00,1.00,-76.80,48.00,0
+-120.00,43.20,1.11,0.00,1.00,105.60,43.20,0
+-124.80,43.20,1.09,0.00,1.00,-67.20,43.20,0
+-129.60,38.40,1.07,0.00,1.00,115.20,43.20,0
+-134.40,38.40,1.05,0.00,1.00,-57.60,38.40,0
+-139.20,33.60,1.03,0.00,1.00,124.80,38.40,0
+-144.00,33.60,1.00,0.00,1.00,-48.00,33.60,0
+-148.80,28.80,0.98,0.00,1.00,134.40,33.60,0
+-153.60,24.00,0.96,0.00,1.00,-38.40,28.80,0
+-158.40,24.00,0.94,0.00,1.00,144.00,24.00,0
+-163.20,19.20,0.92,0.00,1.00,-28.80,24.00,0
+-163.20,14.40,0.90,0.00,1.00,153.60,19.20,0
+-168.00,14.40,0.88,0.00,1.00,-19.20,14.40,0
+-172.80,9.60,0.85,0.00,1.00,163.20,14.40,0
+-172.80,4.80,0.83,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,0.81,0.00,1.00,172.80,4.80,0
+177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,0.75,0.00,1.00,4.80,-4.80,0
+168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60,0
+163.20,-14.40,0.70,0.00,1.00,14.40,-14.40,0
+163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40,0
+158.40,-24.00,0.66,0.00,1.00,24.00,-19.20,0
+153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00,0
+148.80,-28.80,0.62,0.00,1.00,33.60,-24.00,0
+144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80,0
+139.20,-33.60,0.58,0.00,1.00,43.20,-33.60,0
+134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60,0
+129.60,-38.40,0.53,0.00,1.00,52.80,-38.40,0
+124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40,0
+120.00,-43.20,0.49,0.00,1.00,62.40,-43.20,0
+110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20,0
+105.60,-48.00,0.45,0.00,1.00,72.00,-43.20,0
+100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00,0
+91.20,-48.00,0.41,0.00,1.00,81.60,-48.00,0
+86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00,0
+76.80,-48.00,0.36,0.00,1.00,96.00,-48.00,0
+72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00,0
+62.40,-43.20,0.32,0.00,1.00,105.60,-43.20,0
+57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20,0
+52.80,-43.20,0.28,0.00,1.00,115.20,-43.20,0
+48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40,0
+43.20,-38.40,0.23,0.00,1.00,124.80,-38.40,0
+38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60,0
+33.60,-28.80,0.19,0.00,1.00,134.40,-33.60,0
+28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80,0
+24.00,-24.00,0.15,0.00,1.00,144.00,-28.80,0
+19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00,0
+14.40,-19.20,0.11,0.00,1.00,153.60,-19.20,0
+14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20,0
+9.60,-9.60,0.06,0.00,1.00,163.20,-14.40,0
+4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,0.02,0.00,1.00,172.80,-4.80,0
+0.00,0.00,0.00,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,0.00,0.00,1.00,0.00,0.00,0
+-4.80,4.80,0.02,0.00,1.00,-177.60,4.80,0
+-9.60,9.60,0.04,0.00,1.00,9.60,4.80,0
+-14.40,14.40,0.06,0.00,1.00,-168.00,9.60,0
+-19.20,14.40,0.09,0.00,1.00,19.20,14.40,0
+-24.00,19.20,0.11,0.00,1.00,-158.40,14.40,0
+-24.00,24.00,0.13,0.00,1.00,28.80,19.20,0
+-28.80,24.00,0.15,0.00,1.00,-148.80,24.00,0
+-33.60,28.80,0.17,0.00,1.00,38.40,24.00,0
+-38.40,28.80,0.19,0.00,1.00,-139.20,28.80,0
+-43.20,33.60,0.21,0.00,1.00,48.00,28.80,0
+-48.00,33.60,0.23,0.00,1.00,-129.60,33.60,0
+-52.80,38.40,0.26,0.00,1.00,57.60,33.60,0
+-62.40,38.40,0.28,0.00,1.00,-120.00,38.40,0
+-67.20,38.40,0.30,0.00,1.00,67.20,38.40,0
+-72.00,43.20,0.32,0.00,1.00,-110.40,38.40,0
+-76.80,43.20,0.34,0.00,1.00,76.80,38.40,0
+-86.40,43.20,0.36,0.00,1.00,-100.80,43.20,0
+-91.20,43.20,0.38,0.00,1.00,86.40,43.20,0
+-96.00,43.20,0.41,0.00,1.00,-86.40,43.20,0
+-105.60,43.20,0.43,0.00,1.00,96.00,43.20,0
+-110.40,43.20,0.45,0.00,1.00,-76.80,43.20,0
+-115.20,38.40,0.47,0.00,1.00,105.60,38.40,0
+-124.80,38.40,0.49,0.00,1.00,-67.20,38.40,0
+-129.60,38.40,0.51,0.00,1.00,115.20,38.40,0
+-134.40,33.60,0.53,0.00,1.00,-57.60,33.60,0
+-139.20,33.60,0.56,0.00,1.00,124.80,33.60,0
+-144.00,28.80,0.58,0.00,1.00,-48.00,28.80,0
+-148.80,28.80,0.60,0.00,1.00,134.40,28.80,0
+-153.60,24.00,0.62,0.00,1.00,-38.40,24.00,0
+-158.40,19.20,0.64,0.00,1.00,144.00,24.00,0
+-158.40,19.20,0.66,0.00,1.00,-28.80,19.20,0
+-163.20,14.40,0.68,0.00,1.00,153.60,19.20,0
+-168.00,9.60,0.70,0.00,1.00,-19.20,14.40,0
+-172.80,9.60,0.73,0.00,1.00,163.20,9.60,0
+-172.80,4.80,0.75,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,0.77,0.00,1.00,172.80,4.80,0
+177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,0.83,0.00,1.00,4.80,-4.80,0
+168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60,0
+163.20,-14.40,0.88,0.00,1.00,14.40,-9.60,0
+158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40,0
+158.40,-19.20,0.92,0.00,1.00,24.00,-19.20,0
+153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20,0
+148.80,-28.80,0.96,0.00,1.00,33.60,-24.00,0
+144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00,0
+139.20,-33.60,1.00,0.00,1.00,43.20,-28.80,0
+134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80,0
+129.60,-38.40,1.05,0.00,1.00,52.80,-33.60,0
+124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60,0
+115.20,-38.40,1.09,0.00,1.00,62.40,-38.40,0
+110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40,0
+105.60,-43.20,1.13,0.00,1.00,72.00,-38.40,0
+96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20,0
+91.20,-43.20,1.17,0.00,1.00,81.60,-43.20,0
+86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20,0
+76.80,-43.20,1.22,0.00,1.00,96.00,-43.20,0
+72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20,0
+67.20,-38.40,1.26,0.00,1.00,105.60,-38.40,0
+62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40,0
+52.80,-38.40,1.30,0.00,1.00,115.20,-38.40,0
+48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40,0
+43.20,-33.60,1.35,0.00,1.00,124.80,-33.60,0
+38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60,0
+33.60,-28.80,1.39,0.00,1.00,134.40,-28.80,0
+28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80,0
+24.00,-24.00,1.43,0.00,1.00,144.00,-24.00,0
+24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00,0
+19.20,-14.40,1.47,0.00,1.00,153.60,-19.20,0
+14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40,0
+9.60,-9.60,1.52,0.00,1.00,163.20,-14.40,0
+4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,1.56,0.00,1.00,172.80,-4.80,0
+0.00,0.00,1.58,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,1.60,0.00,1.00,0.00,0.00,0
+-9.60,4.80,1.62,0.00,1.00,-177.60,4.80,0
+-9.60,9.60,1.64,0.00,1.00,9.60,4.80,0
+-14.40,9.60,1.67,0.00,1.00,-168.00,9.60,0
+-19.20,14.40,1.69,0.00,1.00,19.20,9.60,0
+-24.00,19.20,1.71,0.00,1.00,-158.40,14.40,0
+-28.80,19.20,1.73,0.00,1.00,28.80,19.20,0
+-33.60,24.00,1.75,0.00,1.00,-148.80,19.20,0
+-38.40,24.00,1.77,0.00,1.00,38.40,24.00,0
+-43.20,28.80,1.79,0.00,1.00,-139.20,24.00,0
+-48.00,28.80,1.82,0.00,1.00,48.00,28.80,0
+-52.80,33.60,1.84,0.00,1.00,-129.60,28.80,0
+-57.60,33.60,1.86,0.00,1.00,57.60,28.80,0
+-62.40,33.60,1.88,0.00,1.00,-120.00,33.60,0
+-67.20,38.40,1.90,0.00,1.00,67.20,33.60,0
+-72.00,38.40,1.92,0.00,1.00,-110.40,33.60,0
+-81.60,38.40,1.94,0.00,1.00,76.80,38.40,0
+-86.40,38.40,1.97,0.00,1.00,-100.80,38.40,0
+-91.20,38.40,1.99,0.00,1.00,86.40,38.40,0
+-96.00,38.40,2.01,0.00,1.00,-86.40,38.40,0
+-105.60,38.40,2.03,0.00,1.00,96.00,38.40,0
+-110.40,38.40,2.05,0.00,1.00,-76.80,38.40,0
+-115.20,33.60,2.07,0.00,1.00,105.60,33.60,0
+-120.00,33.60,2.09,0.00,1.00,-67.20,33.60,0
+-124.80,33.60,2.11,0.00,1.00,115.20,33.60,0
+-129.60,28.80,2.14,0.00,1.00,-57.60,33.60,0
+-134.40,28.80,2.16,0.00,1.00,124.80,28.80,0
+-139.20,24.00,2.18,0.00,1.00,-48.00,28.80,0
+-144.00,24.00,2.20,0.00,1.00,134.40,24.00,0
+-148.80,19.20,2.22,0.00,1.00,-38.40,24.00,0
+-153.60,19.20,2.24,0.00,1.00,144.00,19.20,0
+-158.40,14.40,2.26,0.00,1.00,-28.80,19.20,0
+-163.20,14.40,2.29,0.00,1.00,153.60,14.40,0
+-168.00,9.60,2.31,0.00,1.00,-19.20,14.40,0
+-172.80,9.60,2.33,0.00,1.00,163.20,9.60,0
+-172.80,4.80,2.35,0.00,1.00,-9.60,9.60,0
+-177.60,0.00,2.37,0.00,1.00,172.80,4.80,0
+177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00,0
+172.80,-9.60,2.44,0.00,1.00,4.80,-4.80,0
+168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60,0
+163.20,-14.40,2.48,0.00,1.00,14.40,-9.60,0
+158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40,0
+153.60,-19.20,2.52,0.00,1.00,24.00,-14.40,0
+148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20,0
+144.00,-24.00,2.56,0.00,1.00,33.60,-19.20,0
+139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00,0
+134.40,-28.80,2.61,0.00,1.00,43.20,-24.00,0
+129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80,0
+124.80,-33.60,2.65,0.00,1.00,52.80,-28.80,0
+120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60,0
+115.20,-33.60,2.69,0.00,1.00,62.40,-33.60,0
+110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60,0
+105.60,-38.40,2.73,0.00,1.00,72.00,-33.60,0
+96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40,0
+91.20,-38.40,2.78,0.00,1.00,81.60,-38.40,0
+86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40,0
+81.60,-38.40,2.82,0.00,1.00,96.00,-38.40,0
+72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40,0
+67.20,-38.40,2.86,0.00,1.00,105.60,-38.40,0
+62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60,0
+57.60,-33.60,2.91,0.00,1.00,115.20,-33.60,0
+52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60,0
+48.00,-28.80,2.95,0.00,1.00,124.80,-28.80,0
+43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80,0
+38.40,-24.00,2.99,0.00,1.00,134.40,-28.80,0
+33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00,0
+28.80,-19.20,3.03,0.00,1.00,144.00,-24.00,0
+24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20,0
+19.20,-14.40,3.08,0.00,1.00,153.60,-19.20,0
+14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40,0
+9.60,-9.60,3.12,0.00,1.00,163.20,-9.60,0
+9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,3.16,0.00,1.00,172.80,-4.80,0
+0.00,0.00,3.18,0.00,1.00,-4.80,-4.80,0
+-4.80,4.80,3.20,0.00,1.00,0.00,0.00,0
+-9.60,4.80,3.23,0.00,1.00,-177.60,4.80,0
+-14.40,9.60,3.25,0.00,1.00,9.60,4.80,0
+-14.40,9.60,3.27,0.00,1.00,-168.00,9.60,0
+-19.20,14.40,3.29,0.00,1.00,19.20,9.60,0
+-24.00,14.40,3.31,0.00,1.00,-158.40,14.40,0
+-28.80,19.20,3.33,0.00,1.00,28.80,14.40,0
+-33.60,19.20,3.35,0.00,1.00,-148.80,19.20,0
+-38.40,24.00,3.38,0.00,1.00,38.40,19.20,0
+-43.20,24.00,3.40,0.00,1.00,-139.20,19.20,0
+-48.00,24.00,3.42,0.00,1.00,48.00,24.00,0
+-52.80,28.80,3.44,0.00,1.00,-129.60,24.00,0
+-57.60,28.80,3.46,0.00,1.00,57.60,28.80,0
+-62.40,28.80,3.48,0.00,1.00,-120.00,28.80,0
+-67.20,33.60,3.50,0.00,1.00,67.20,28.80,0
+-72.00,33.60,3.52,0.00,1.00,-110.40,28.80,0
+-81.60,33.60,3.55,0.00,1.00,76.80,33.60,0
+-86.40,33.60,3.57,0.00,1.00,-100.80,33.60,0
+-91.20,33.60,3.59,0.00,1.00,86.40,33.60,0
+-96.00,33.60,3.61,0.00,1.00,-86.40,33.60,0
+-100.80,33.60,3.63,0.00,1.00,96.00,33.60,0
+-110.40,33.60,3.65,0.00,1.00,-76.80,33.60,0
+-115.20,33.60,3.67,0.00,1.00,105.60,28.80,0
+-120.00,28.80,3.70,0.00,1.00,-67.20,28.80,0
+-124.80,28.80,3.72,0.00,1.00,115.20,28.80,0
+-129.60,28.80,3.74,0.00,1.00,-57.60,28.80,0
+-134.40,24.00,3.76,0.00,1.00,124.80,24.00,0
+-139.20,24.00,3.78,0.00,1.00,-48.00,24.00,0
+-144.00,19.20,3.80,0.00,1.00,134.40,24.00,0
+-148.80,19.20,3.82,0.00,1.00,-38.40,19.20,0
+-153.60,14.40,3.85,0.00,1.00,144.00,19.20,0
+-158.40,14.40,3.87,0.00,1.00,-28.80,14.40,0
+-163.20,9.60,3.89,0.00,1.00,153.60,14.40,0
+-168.00,9.60,3.91,0.00,1.00,-19.20,9.60,0
+-168.00,4.80,3.93,0.00,1.00,163.20,9.60,0
+-172.80,4.80,3.95,0.00,1.00,-9.60,4.80,0
+-177.60,0.00,3.97,0.00,1.00,172.80,4.80,0
+177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00,0
+168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0
+168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80,0
+163.20,-9.60,4.08,0.00,1.00,14.40,-9.60,0
+158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60,0
+153.60,-14.40,4.12,0.00,1.00,24.00,-14.40,0
+148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40,0
+144.00,-19.20,4.17,0.00,1.00,33.60,-19.20,0
+139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20,0
+134.40,-24.00,4.21,0.00,1.00,43.20,-24.00,0
+129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00,0
+124.80,-28.80,4.25,0.00,1.00,52.80,-24.00,0
+120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80,0
+115.20,-33.60,4.29,0.00,1.00,62.40,-28.80,0
+110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80,0
+100.80,-33.60,4.34,0.00,1.00,72.00,-28.80,0
+96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60,0
+91.20,-33.60,4.38,0.00,1.00,81.60,-33.60,0
+86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60,0
+81.60,-33.60,4.42,0.00,1.00,96.00,-33.60,0
+72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60,0
+67.20,-33.60,4.46,0.00,1.00,105.60,-33.60,0
+62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80,0
+57.60,-28.80,4.51,0.00,1.00,115.20,-28.80,0
+52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80,0
+48.00,-24.00,4.55,0.00,1.00,124.80,-28.80,0
+43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00,0
+38.40,-24.00,4.59,0.00,1.00,134.40,-24.00,0
+33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20,0
+28.80,-19.20,4.64,0.00,1.00,144.00,-19.20,0
+24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20,0
+19.20,-14.40,4.68,0.00,1.00,153.60,-14.40,0
+14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40,0
+14.40,-9.60,4.72,0.00,1.00,163.20,-9.60,0
+9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60,0
+4.80,-4.80,4.76,0.00,1.00,172.80,-4.80,0
+0.00,0.00,4.79,0.00,1.00,-4.80,-4.80,0
+-4.80,0.00,4.81,0.00,1.00,0.00,0.00,0
+-9.60,4.80,4.83,0.00,1.00,-177.60,0.00,0
+-14.40,4.80,4.85,0.00,1.00,9.60,4.80,0
+-19.20,9.60,4.87,0.00,1.00,-168.00,4.80,0
+-19.20,9.60,4.89,0.00,1.00,19.20,9.60,0
+-24.00,14.40,4.91,0.00,1.00,-158.40,9.60,0
+-28.80,14.40,4.93,0.00,1.00,28.80,14.40,0
+-33.60,19.20,4.96,0.00,1.00,-148.80,14.40,0
+-38.40,19.20,4.98,0.00,1.00,38.40,14.40,0
+-43.20,19.20,5.00,0.00,1.00,-139.20,19.20,0
+-48.00,24.00,5.02,0.00,1.00,48.00,19.20,0
+-52.80,24.00,5.04,0.00,1.00,-129.60,24.00,0
+-57.60,24.00,5.06,0.00,1.00,57.60,24.00,0
+-62.40,24.00,5.08,0.00,1.00,-120.00,24.00,0
+-72.00,28.80,5.11,0.00,1.00,67.20,24.00,0
+-76.80,28.80,5.13,0.00,1.00,-110.40,24.00,0
+-81.60,28.80,5.15,0.00,1.00,76.80,28.80,0
+-86.40,28.80,5.17,0.00,1.00,-100.80,28.80,0
+-91.20,28.80,5.19,0.00,1.00,86.40,28.80,0
+-96.00,28.80,5.21,0.00,1.00,-86.40,28.80,0
+-100.80,28.80,5.23,0.00,1.00,96.00,28.80,0
+-105.60,28.80,5.26,0.00,1.00,-76.80,28.80,0
+-115.20,28.80,5.28,0.00,1.00,105.60,28.80,0
+-120.00,24.00,5.30,0.00,1.00,-67.20,24.00,0
+-124.80,24.00,5.32,0.00,1.00,115.20,24.00,0
+-129.60,24.00,5.34,0.00,1.00,-57.60,24.00,0
+-134.40,24.00,5.36,0.00,1.00,124.80,24.00,0
+-139.20,19.20,5.38,0.00,1.00,-48.00,19.20,0
+-144.00,19.20,5.40,0.00,1.00,134.40,19.20,0
+-148.80,14.40,5.43,0.00,1.00,-38.40,19.20,0
+-153.60,14.40,5.45,0.00,1.00,144.00,14.40,0
+-158.40,14.40,5.47,0.00,1.00,-28.80,14.40,0
+-163.20,9.60,5.49,0.00,1.00,153.60,9.60,0
+-163.20,9.60,5.51,0.00,1.00,-19.20,9.60,0
+-168.00,4.80,5.53,0.00,1.00,163.20,9.60,0
+-172.80,4.80,5.55,0.00,1.00,-9.60,4.80,0
+-177.60,0.00,5.58,0.00,1.00,172.80,4.80,0
+177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00,0
+168.00,-4.80,5.64,0.00,1.00,4.80,-4.80,0
+163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80,0
+163.20,-9.60,5.68,0.00,1.00,14.40,-9.60,0
+158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60,0
+153.60,-14.40,5.72,0.00,1.00,24.00,-9.60,0
+148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40,0
+144.00,-19.20,5.77,0.00,1.00,33.60,-14.40,0
+139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20,0
+134.40,-24.00,5.81,0.00,1.00,43.20,-19.20,0
+129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20,0
+124.80,-24.00,5.85,0.00,1.00,52.80,-24.00,0
+120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00,0
+115.20,-28.80,5.90,0.00,1.00,62.40,-24.00,0
+105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00,0
+100.80,-28.80,5.94,0.00,1.00,72.00,-28.80,0
+96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80,0
+91.20,-28.80,5.98,0.00,1.00,81.60,-28.80,0
+86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80,0
+81.60,-28.80,6.02,0.00,1.00,96.00,-28.80,0
+76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80,0
+72.00,-28.80,6.07,0.00,1.00,105.60,-28.80,0
+62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00,0
+57.60,-24.00,6.11,0.00,1.00,115.20,-24.00,0
+52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00,0
+48.00,-24.00,6.15,0.00,1.00,124.80,-24.00,0
+43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00,0
+38.40,-19.20,6.19,0.00,1.00,134.40,-19.20,0
+33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20,0
+28.80,-14.40,6.24,0.00,1.00,144.00,-14.40,0
+24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40,0
+19.20,-9.60,6.28,0.00,1.00,153.60,-14.40,0
+19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60,0
+14.40,-4.80,6.32,0.00,1.00,163.20,-9.60,0
+9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80,0
+4.80,-0.00,6.37,0.00,1.00,172.80,-4.80,0
+0.00,0.00,6.39,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,6.41,0.00,1.00,0.00,0.00,0
+-9.60,4.80,6.43,0.00,1.00,-177.60,0.00,0
+-14.40,4.80,6.45,0.00,1.00,9.60,4.80,0
+-19.20,9.60,6.47,0.00,1.00,-168.00,4.80,0
+-24.00,9.60,6.49,0.00,1.00,19.20,9.60,0
+-28.80,9.60,6.52,0.00,1.00,-158.40,9.60,0
+-33.60,14.40,6.54,0.00,1.00,28.80,9.60,0
+-33.60,14.40,6.56,0.00,1.00,-148.80,14.40,0
+-38.40,14.40,6.58,0.00,1.00,38.40,14.40,0
+-43.20,19.20,6.60,0.00,1.00,-139.20,14.40,0
+-48.00,19.20,6.62,0.00,1.00,48.00,14.40,0
+-57.60,19.20,6.64,0.00,1.00,-129.60,19.20,0
+-62.40,19.20,6.66,0.00,1.00,57.60,19.20,0
+-67.20,24.00,6.69,0.00,1.00,-120.00,19.20,0
+-72.00,24.00,6.71,0.00,1.00,67.20,19.20,0
+-76.80,24.00,6.73,0.00,1.00,-110.40,24.00,0
+-81.60,24.00,6.75,0.00,1.00,76.80,24.00,0
+-86.40,24.00,6.77,0.00,1.00,-100.80,24.00,0
+-91.20,24.00,6.79,0.00,1.00,86.40,24.00,0
+-96.00,24.00,6.81,0.00,1.00,-86.40,24.00,0
+-100.80,24.00,6.84,0.00,1.00,96.00,24.00,0
+-105.60,24.00,6.86,0.00,1.00,-76.80,24.00,0
+-110.40,24.00,6.88,0.00,1.00,105.60,24.00,0
+-115.20,19.20,6.90,0.00,1.00,-67.20,19.20,0
+-120.00,19.20,6.92,0.00,1.00,115.20,19.20,0
+-129.60,19.20,6.94,0.00,1.00,-57.60,19.20,0
+-134.40,19.20,6.96,0.00,1.00,124.80,19.20,0
+-139.20,19.20,6.99,0.00,1.00,-48.00,19.20,0
+-144.00,14.40,7.01,0.00,1.00,134.40,14.40,0
+-148.80,14.40,7.03,0.00,1.00,-38.40,14.40,0
+-148.80,14.40,7.05,0.00,1.00,144.00,14.40,0
+-153.60,9.60,7.07,0.00,1.00,-28.80,9.60,0
+-158.40,9.60,7.09,0.00,1.00,153.60,9.60,0
+-163.20,4.80,7.11,0.00,1.00,-19.20,9.60,0
+-168.00,4.80,7.13,0.00,1.00,163.20,4.80,0
+-172.80,4.80,7.16,0.00,1.00,-9.60,4.80,0
+-177.60,0.00,7.18,0.00,1.00,172.80,4.80,0
+177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0
+172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00,0
+168.00,-4.80,7.24,0.00,1.00,4.80,-4.80,0
+163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80,0
+158.40,-9.60,7.28,0.00,1.00,14.40,-4.80,0
+153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60,0
+148.80,-14.40,7.33,0.00,1.00,24.00,-9.60,0
+148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60,0
+144.00,-14.40,7.37,0.00,1.00,33.60,-14.40,0
+139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40,0
+134.40,-19.20,7.41,0.00,1.00,43.20,-14.40,0
+129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20,0
+120.00,-19.20,7.46,0.00,1.00,52.80,-19.20,0
+115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20,0
+110.40,-24.00,7.50,0.00,1.00,62.40,-19.20,0
+105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20,0
+100.80,-24.00,7.54,0.00,1.00,72.00,-24.00,0
+96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00,0
+91.20,-24.00,7.58,0.00,1.00,81.60,-24.00,0
+86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00,0
+81.60,-24.00,7.63,0.00,1.00,96.00,-24.00,0
+76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00,0
+72.00,-24.00,7.67,0.00,1.00,105.60,-24.00,0
+67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00,0
+62.40,-19.20,7.71,0.00,1.00,115.20,-19.20,0
+57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20,0
+48.00,-19.20,7.75,0.00,1.00,124.80,-19.20,0
+43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20,0
+38.40,-14.40,7.80,0.00,1.00,134.40,-14.40,0
+33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40,0
+33.60,-14.40,7.84,0.00,1.00,144.00,-14.40,0
+28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40,0
+24.00,-9.60,7.88,0.00,1.00,153.60,-9.60,0
+19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60,0
+14.40,-4.80,7.93,0.00,1.00,163.20,-9.60,0
+9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80,0
+4.80,-0.00,7.97,0.00,1.00,172.80,-4.80,0
+0.00,0.00,7.99,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,8.01,0.00,1.00,0.00,0.00,0
+-9.60,4.80,8.03,0.00,1.00,-177.60,0.00,0
+-14.40,4.80,8.05,0.00,1.00,9.60,4.80,0
+-19.20,4.80,8.07,0.00,1.00,-168.00,4.80,0
+-24.00,9.60,8.10,0.00,1.00,19.20,4.80,0
+-28.80,9.60,8.12,0.00,1.00,-158.40,9.60,0
+-33.60,9.60,8.14,0.00,1.00,24.00,9.60,0
+-38.40,9.60,8.16,0.00,1.00,-148.80,9.60,0
+-43.20,14.40,8.18,0.00,1.00,33.60,9.60,0
+-48.00,14.40,8.20,0.00,1.00,-139.20,14.40,0
+-52.80,14.40,8.22,0.00,1.00,43.20,14.40,0
+-57.60,14.40,8.25,0.00,1.00,-129.60,14.40,0
+-62.40,19.20,8.27,0.00,1.00,52.80,14.40,0
+-67.20,19.20,8.29,0.00,1.00,-120.00,14.40,0
+-72.00,19.20,8.31,0.00,1.00,62.40,14.40,0
+-76.80,19.20,8.33,0.00,1.00,-110.40,19.20,0
+-81.60,19.20,8.35,0.00,1.00,76.80,19.20,0
+-86.40,19.20,8.37,0.00,1.00,-100.80,19.20,0
+-91.20,19.20,8.40,0.00,1.00,86.40,19.20,0
+-96.00,19.20,8.42,0.00,1.00,-86.40,19.20,0
+-100.80,19.20,8.44,0.00,1.00,96.00,19.20,0
+-105.60,19.20,8.46,0.00,1.00,-76.80,19.20,0
+-110.40,19.20,8.48,0.00,1.00,105.60,19.20,0
+-115.20,19.20,8.50,0.00,1.00,-67.20,19.20,0
+-120.00,14.40,8.52,0.00,1.00,120.00,14.40,0
+-124.80,14.40,8.54,0.00,1.00,-57.60,14.40,0
+-129.60,14.40,8.57,0.00,1.00,129.60,14.40,0
+-134.40,14.40,8.59,0.00,1.00,-48.00,14.40,0
+-139.20,14.40,8.61,0.00,1.00,139.20,14.40,0
+-144.00,9.60,8.63,0.00,1.00,-38.40,9.60,0
+-148.80,9.60,8.65,0.00,1.00,148.80,9.60,0
+-153.60,9.60,8.67,0.00,1.00,-28.80,9.60,0
+-158.40,4.80,8.69,0.00,1.00,158.40,9.60,0
+-163.20,4.80,8.72,0.00,1.00,-19.20,4.80,0
+-168.00,4.80,8.74,0.00,1.00,163.20,4.80,0
+-172.80,0.00,8.76,0.00,1.00,-9.60,4.80,0
+-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0
+177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0
+172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00,0
+168.00,-4.80,8.84,0.00,1.00,4.80,-0.00,0
+163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80,0
+158.40,-4.80,8.89,0.00,1.00,14.40,-4.80,0
+153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80,0
+148.80,-9.60,8.93,0.00,1.00,24.00,-9.60,0
+144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60,0
+139.20,-14.40,8.97,0.00,1.00,33.60,-9.60,0
+134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60,0
+129.60,-14.40,9.01,0.00,1.00,43.20,-14.40,0
+124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40,0
+120.00,-14.40,9.06,0.00,1.00,52.80,-14.40,0
+115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40,0
+110.40,-19.20,9.10,0.00,1.00,62.40,-14.40,0
+105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20,0
+100.80,-19.20,9.14,0.00,1.00,72.00,-19.20,0
+96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20,0
+91.20,-19.20,9.19,0.00,1.00,81.60,-19.20,0
+86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20,0
+81.60,-19.20,9.23,0.00,1.00,96.00,-19.20,0
+76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20,0
+72.00,-19.20,9.27,0.00,1.00,105.60,-19.20,0
+67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20,0
+62.40,-19.20,9.31,0.00,1.00,115.20,-14.40,0
+57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40,0
+52.80,-14.40,9.36,0.00,1.00,124.80,-14.40,0
+48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40,0
+43.20,-14.40,9.40,0.00,1.00,134.40,-14.40,0
+38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40,0
+33.60,-9.60,9.44,0.00,1.00,144.00,-9.60,0
+28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60,0
+24.00,-9.60,9.48,0.00,1.00,153.60,-9.60,0
+19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60,0
+14.40,-4.80,9.53,0.00,1.00,163.20,-4.80,0
+9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80,0
+4.80,-0.00,9.57,0.00,1.00,172.80,-4.80,0
+0.00,0.00,9.59,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,9.61,0.00,1.00,0.00,0.00,0
+-9.60,0.00,9.63,0.00,1.00,-177.60,0.00,0
+-14.40,4.80,9.66,0.00,1.00,9.60,0.00,0
+-19.20,4.80,9.68,0.00,1.00,-168.00,4.80,0
+-24.00,4.80,9.70,0.00,1.00,14.40,4.80,0
+-28.80,4.80,9.72,0.00,1.00,-158.40,4.80,0
+-33.60,9.60,9.74,0.00,1.00,24.00,4.80,0
+-38.40,9.60,9.76,0.00,1.00,-148.80,9.60,0
+-43.20,9.60,9.78,0.00,1.00,33.60,9.60,0
+-48.00,9.60,9.81,0.00,1.00,-139.20,9.60,0
+-52.80,9.60,9.83,0.00,1.00,43.20,9.60,0
+-57.60,14.40,9.85,0.00,1.00,-129.60,9.60,0
+-62.40,14.40,9.87,0.00,1.00,52.80,9.60,0
+-67.20,14.40,9.89,0.00,1.00,-120.00,9.60,0
+-72.00,14.40,9.91,0.00,1.00,62.40,14.40,0
+-76.80,14.40,9.93,0.00,1.00,-110.40,14.40,0
+-81.60,14.40,9.95,0.00,1.00,76.80,14.40,0
+-86.40,14.40,9.98,0.00,1.00,-100.80,14.40,0
+-91.20,14.40,10.00,0.00,1.00,86.40,14.40,0
+-96.00,14.40,10.02,0.00,1.00,-86.40,14.40,0
+-100.80,14.40,10.04,0.00,1.00,96.00,14.40,0
+-105.60,14.40,10.06,0.00,1.00,-76.80,14.40,0
+-110.40,14.40,10.08,0.00,1.00,110.40,14.40,0
+-115.20,14.40,10.10,0.00,1.00,-67.20,14.40,0
+-120.00,14.40,10.13,0.00,1.00,120.00,9.60,0
+-124.80,9.60,10.15,0.00,1.00,-57.60,9.60,0
+-129.60,9.60,10.17,0.00,1.00,129.60,9.60,0
+-134.40,9.60,10.19,0.00,1.00,-48.00,9.60,0
+-139.20,9.60,10.21,0.00,1.00,139.20,9.60,0
+-144.00,9.60,10.23,0.00,1.00,-38.40,9.60,0
+-148.80,9.60,10.25,0.00,1.00,148.80,9.60,0
+-153.60,4.80,10.28,0.00,1.00,-28.80,4.80,0
+-158.40,4.80,10.30,0.00,1.00,158.40,4.80,0
+-163.20,4.80,10.32,0.00,1.00,-19.20,4.80,0
+-168.00,4.80,10.34,0.00,1.00,168.00,4.80,0
+-172.80,0.00,10.36,0.00,1.00,-9.60,4.80,0
+-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0
+177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0
+172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00,0
+168.00,-4.80,10.45,0.00,1.00,4.80,-0.00,0
+163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80,0
+158.40,-4.80,10.49,0.00,1.00,14.40,-4.80,0
+153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80,0
+148.80,-9.60,10.53,0.00,1.00,24.00,-4.80,0
+144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80,0
+139.20,-9.60,10.57,0.00,1.00,33.60,-9.60,0
+134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60,0
+129.60,-9.60,10.62,0.00,1.00,43.20,-9.60,0
+124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60,0
+120.00,-14.40,10.66,0.00,1.00,52.80,-9.60,0
+115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60,0
+110.40,-14.40,10.70,0.00,1.00,62.40,-9.60,0
+105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40,0
+100.80,-14.40,10.74,0.00,1.00,72.00,-14.40,0
+96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40,0
+91.20,-14.40,10.79,0.00,1.00,81.60,-14.40,0
+86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40,0
+81.60,-14.40,10.83,0.00,1.00,96.00,-14.40,0
+76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40,0
+72.00,-14.40,10.87,0.00,1.00,105.60,-14.40,0
+67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40,0
+62.40,-14.40,10.92,0.00,1.00,115.20,-14.40,0
+57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60,0
+52.80,-9.60,10.96,0.00,1.00,124.80,-9.60,0
+48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60,0
+43.20,-9.60,11.00,0.00,1.00,134.40,-9.60,0
+38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60,0
+33.60,-9.60,11.04,0.00,1.00,144.00,-9.60,0
+28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60,0
+24.00,-4.80,11.09,0.00,1.00,153.60,-4.80,0
+19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80,0
+14.40,-4.80,11.13,0.00,1.00,163.20,-4.80,0
+9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80,0
+4.80,-0.00,11.17,0.00,1.00,172.80,-0.00,0
+0.00,0.00,11.19,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,11.21,0.00,1.00,0.00,0.00,0
+-9.60,0.00,11.24,0.00,1.00,-177.60,0.00,0
+-14.40,0.00,11.26,0.00,1.00,9.60,0.00,0
+-19.20,4.80,11.28,0.00,1.00,-168.00,0.00,0
+-24.00,4.80,11.30,0.00,1.00,14.40,4.80,0
+-28.80,4.80,11.32,0.00,1.00,-158.40,4.80,0
+-33.60,4.80,11.34,0.00,1.00,24.00,4.80,0
+-38.40,4.80,11.36,0.00,1.00,-153.60,4.80,0
+-43.20,4.80,11.39,0.00,1.00,33.60,4.80,0
+-48.00,4.80,11.41,0.00,1.00,-144.00,4.80,0
+-52.80,9.60,11.43,0.00,1.00,43.20,4.80,0
+-57.60,9.60,11.45,0.00,1.00,-134.40,4.80,0
+-62.40,9.60,11.47,0.00,1.00,52.80,4.80,0
+-67.20,9.60,11.49,0.00,1.00,-124.80,9.60,0
+-72.00,9.60,11.51,0.00,1.00,62.40,9.60,0
+-76.80,9.60,11.54,0.00,1.00,-110.40,9.60,0
+-81.60,9.60,11.56,0.00,1.00,72.00,9.60,0
+-86.40,9.60,11.58,0.00,1.00,-100.80,9.60,0
+-91.20,9.60,11.60,0.00,1.00,86.40,9.60,0
+-96.00,9.60,11.62,0.00,1.00,-86.40,9.60,0
+-100.80,9.60,11.64,0.00,1.00,96.00,9.60,0
+-105.60,9.60,11.66,0.00,1.00,-76.80,9.60,0
+-110.40,9.60,11.68,0.00,1.00,110.40,9.60,0
+-115.20,9.60,11.71,0.00,1.00,-67.20,9.60,0
+-120.00,9.60,11.73,0.00,1.00,120.00,9.60,0
+-124.80,9.60,11.75,0.00,1.00,-52.80,9.60,0
+-129.60,9.60,11.77,0.00,1.00,129.60,4.80,0
+-134.40,4.80,11.79,0.00,1.00,-43.20,4.80,0
+-139.20,4.80,11.81,0.00,1.00,139.20,4.80,0
+-144.00,4.80,11.83,0.00,1.00,-33.60,4.80,0
+-148.80,4.80,11.86,0.00,1.00,148.80,4.80,0
+-153.60,4.80,11.88,0.00,1.00,-24.00,4.80,0
+-158.40,4.80,11.90,0.00,1.00,158.40,4.80,0
+-163.20,4.80,11.92,0.00,1.00,-19.20,4.80,0
+-168.00,0.00,11.94,0.00,1.00,168.00,4.80,0
+-172.80,0.00,11.96,0.00,1.00,-9.60,0.00,0
+-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0
+177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0
+172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00,0
+168.00,-0.00,12.05,0.00,1.00,4.80,-0.00,0
+163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00,0
+158.40,-4.80,12.09,0.00,1.00,14.40,-4.80,0
+153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80,0
+148.80,-4.80,12.13,0.00,1.00,24.00,-4.80,0
+144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80,0
+139.20,-4.80,12.18,0.00,1.00,28.80,-4.80,0
+134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80,0
+129.60,-9.60,12.22,0.00,1.00,38.40,-4.80,0
+124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80,0
+120.00,-9.60,12.26,0.00,1.00,48.00,-4.80,0
+115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60,0
+110.40,-9.60,12.30,0.00,1.00,57.60,-9.60,0
+105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60,0
+100.80,-9.60,12.35,0.00,1.00,72.00,-9.60,0
+96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60,0
+91.20,-9.60,12.39,0.00,1.00,81.60,-9.60,0
+86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60,0
+81.60,-9.60,12.43,0.00,1.00,96.00,-9.60,0
+76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60,0
+72.00,-9.60,12.48,0.00,1.00,105.60,-9.60,0
+67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60,0
+62.40,-9.60,12.52,0.00,1.00,120.00,-9.60,0
+57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60,0
+52.80,-9.60,12.56,0.00,1.00,129.60,-4.80,0
+48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80,0
+43.20,-4.80,12.60,0.00,1.00,139.20,-4.80,0
+38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80,0
+33.60,-4.80,12.65,0.00,1.00,148.80,-4.80,0
+28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80,0
+24.00,-4.80,12.69,0.00,1.00,158.40,-4.80,0
+19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80,0
+14.40,-0.00,12.73,0.00,1.00,163.20,-4.80,0
+9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00,0
+4.80,-0.00,12.77,0.00,1.00,172.80,-0.00,0
+0.00,0.00,12.80,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,12.82,0.00,1.00,0.00,0.00,0
+-9.60,0.00,12.84,0.00,1.00,-177.60,0.00,0
+-14.40,0.00,12.86,0.00,1.00,9.60,0.00,0
+-19.20,0.00,12.88,0.00,1.00,-168.00,0.00,0
+-24.00,0.00,12.90,0.00,1.00,14.40,0.00,0
+-28.80,0.00,12.92,0.00,1.00,-163.20,0.00,0
+-33.60,4.80,12.95,0.00,1.00,24.00,0.00,0
+-38.40,4.80,12.97,0.00,1.00,-153.60,0.00,0
+-43.20,4.80,12.99,0.00,1.00,28.80,0.00,0
+-48.00,4.80,13.01,0.00,1.00,-144.00,4.80,0
+-52.80,4.80,13.03,0.00,1.00,38.40,4.80,0
+-57.60,4.80,13.05,0.00,1.00,-134.40,4.80,0
+-62.40,4.80,13.07,0.00,1.00,48.00,4.80,0
+-67.20,4.80,13.09,0.00,1.00,-124.80,4.80,0
+-72.00,4.80,13.12,0.00,1.00,62.40,4.80,0
+-76.80,4.80,13.14,0.00,1.00,-115.20,4.80,0
+-81.60,4.80,13.16,0.00,1.00,72.00,4.80,0
+-86.40,4.80,13.18,0.00,1.00,-100.80,4.80,0
+-91.20,4.80,13.20,0.00,1.00,86.40,4.80,0
+-96.00,4.80,13.22,0.00,1.00,-86.40,4.80,0
+-100.80,4.80,13.24,0.00,1.00,96.00,4.80,0
+-105.60,4.80,13.27,0.00,1.00,-76.80,4.80,0
+-110.40,4.80,13.29,0.00,1.00,110.40,4.80,0
+-115.20,4.80,13.31,0.00,1.00,-62.40,4.80,0
+-120.00,4.80,13.33,0.00,1.00,120.00,4.80,0
+-124.80,4.80,13.35,0.00,1.00,-52.80,4.80,0
+-129.60,4.80,13.37,0.00,1.00,134.40,4.80,0
+-134.40,4.80,13.39,0.00,1.00,-43.20,4.80,0
+-139.20,4.80,13.42,0.00,1.00,144.00,4.80,0
+-144.00,4.80,13.44,0.00,1.00,-33.60,0.00,0
+-148.80,4.80,13.46,0.00,1.00,153.60,0.00,0
+-153.60,0.00,13.48,0.00,1.00,-24.00,0.00,0
+-158.40,0.00,13.50,0.00,1.00,158.40,0.00,0
+-163.20,0.00,13.52,0.00,1.00,-14.40,0.00,0
+-168.00,0.00,13.54,0.00,1.00,168.00,0.00,0
+-172.80,0.00,13.56,0.00,1.00,-9.60,0.00,0
+-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0
+177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0
+172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00,0
+168.00,-0.00,13.65,0.00,1.00,4.80,-0.00,0
+163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00,0
+158.40,-0.00,13.69,0.00,1.00,14.40,-0.00,0
+153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00,0
+148.80,-4.80,13.74,0.00,1.00,19.20,-0.00,0
+144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00,0
+139.20,-4.80,13.78,0.00,1.00,28.80,-0.00,0
+134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00,0
+129.60,-4.80,13.82,0.00,1.00,38.40,-4.80,0
+124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80,0
+120.00,-4.80,13.86,0.00,1.00,48.00,-4.80,0
+115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80,0
+110.40,-4.80,13.91,0.00,1.00,57.60,-4.80,0
+105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80,0
+100.80,-4.80,13.95,0.00,1.00,67.20,-4.80,0
+96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80,0
+91.20,-4.80,13.99,0.00,1.00,81.60,-4.80,0
+86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80,0
+81.60,-4.80,14.03,0.00,1.00,96.00,-4.80,0
+76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80,0
+72.00,-4.80,14.08,0.00,1.00,105.60,-4.80,0
+67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80,0
+62.40,-4.80,14.12,0.00,1.00,120.00,-4.80,0
+57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80,0
+52.80,-4.80,14.16,0.00,1.00,129.60,-4.80,0
+48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80,0
+43.20,-4.80,14.21,0.00,1.00,139.20,-4.80,0
+38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80,0
+33.60,-4.80,14.25,0.00,1.00,148.80,-0.00,0
+28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00,0
+24.00,-0.00,14.29,0.00,1.00,158.40,-0.00,0
+19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00,0
+14.40,-0.00,14.33,0.00,1.00,163.20,-0.00,0
+9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00,0
+4.80,-0.00,14.38,0.00,1.00,172.80,-0.00,0
+0.00,0.00,14.40,0.00,1.00,-4.80,-0.00,0
+-4.80,0.00,14.42,0.00,1.00,0.00,0.00,0
+-9.60,0.00,14.44,0.00,1.00,-177.60,-0.00,0
+-14.40,0.00,14.46,0.00,1.00,4.80,-0.00,0
+-19.20,0.00,14.48,0.00,1.00,-168.00,-0.00,0
+-24.00,0.00,14.50,0.00,1.00,14.40,-0.00,0
+-28.80,0.00,14.53,0.00,1.00,-163.20,-0.00,0
+-33.60,0.00,14.55,0.00,1.00,19.20,-0.00,0
+-38.40,0.00,14.57,0.00,1.00,-153.60,-0.00,0
+-43.20,0.00,14.59,0.00,1.00,28.80,-0.00,0
+-48.00,0.00,14.61,0.00,1.00,-148.80,-0.00,0
+-52.80,0.00,14.63,0.00,1.00,38.40,-0.00,0
+-57.60,0.00,14.65,0.00,1.00,-139.20,-0.00,0
+-62.40,0.00,14.68,0.00,1.00,48.00,-0.00,0
+-67.20,0.00,14.70,0.00,1.00,-124.80,-0.00,0
+-72.00,0.00,14.72,0.00,1.00,57.60,-0.00,0
+-76.80,0.00,14.74,0.00,1.00,-115.20,-0.00,0
+-81.60,0.00,14.76,0.00,1.00,72.00,-0.00,0
+-86.40,0.00,14.78,0.00,1.00,-100.80,-0.00,0
+-91.20,0.00,14.80,0.00,1.00,86.40,-0.00,0
+-96.00,0.00,14.83,0.00,1.00,-86.40,-0.00,0
+-100.80,0.00,14.85,0.00,1.00,100.80,-0.00,0
+-105.60,0.00,14.87,0.00,1.00,-76.80,-0.00,0
+-110.40,0.00,14.89,0.00,1.00,110.40,-0.00,0
+-115.20,0.00,14.91,0.00,1.00,-62.40,-0.00,0
+-120.00,0.00,14.93,0.00,1.00,124.80,-0.00,0
+-124.80,0.00,14.95,0.00,1.00,-48.00,-0.00,0
+-129.60,0.00,14.97,0.00,1.00,134.40,-0.00,0
+-134.40,0.00,15.00,0.00,1.00,-38.40,-0.00,0
+-139.20,0.00,15.02,0.00,1.00,144.00,-0.00,0
+-144.00,0.00,15.04,0.00,1.00,-28.80,-0.00,0
+-148.80,0.00,15.06,0.00,1.00,153.60,-0.00,0
+-153.60,0.00,15.08,0.00,1.00,-24.00,-0.00,0
+-158.40,0.00,15.10,0.00,1.00,163.20,-0.00,0
+-163.20,0.00,15.12,0.00,1.00,-14.40,-0.00,0
+-168.00,0.00,15.15,0.00,1.00,168.00,-0.00,0
+-172.80,0.00,15.17,0.00,1.00,-9.60,-0.00,0
+-177.60,0.00,15.19,0.00,1.00,172.80,-0.00,0
+177.60,0.00,15.21,0.00,1.00,-0.00,-0.00,0
+172.80,0.00,15.23,0.00,1.00,-177.60,0.00,0
+168.00,0.00,15.25,0.00,1.00,4.80,0.00,0
+163.20,0.00,15.27,0.00,1.00,-172.80,0.00,0
+158.40,0.00,15.30,0.00,1.00,9.60,0.00,0
+153.60,0.00,15.32,0.00,1.00,-163.20,0.00,0
+148.80,0.00,15.34,0.00,1.00,19.20,0.00,0
+144.00,0.00,15.36,0.00,1.00,-158.40,0.00,0
+139.20,0.00,15.38,0.00,1.00,28.80,0.00,0
+134.40,0.00,15.40,0.00,1.00,-148.80,0.00,0
+129.60,0.00,15.42,0.00,1.00,33.60,0.00,0
+124.80,0.00,15.44,0.00,1.00,-139.20,0.00,0
+120.00,0.00,15.47,0.00,1.00,43.20,0.00,0
+115.20,0.00,15.49,0.00,1.00,-129.60,0.00,0
+110.40,0.00,15.51,0.00,1.00,57.60,0.00,0
+105.60,0.00,15.53,0.00,1.00,-120.00,0.00,0
+100.80,0.00,15.55,0.00,1.00,67.20,0.00,0
+96.00,0.00,15.57,0.00,1.00,-105.60,0.00,0
+91.20,0.00,15.59,0.00,1.00,81.60,0.00,0
+86.40,0.00,15.62,0.00,1.00,-91.20,0.00,0
+81.60,0.00,15.64,0.00,1.00,96.00,0.00,0
+76.80,0.00,15.66,0.00,1.00,-76.80,0.00,0
+72.00,0.00,15.68,0.00,1.00,110.40,0.00,0
+67.20,0.00,15.70,0.00,1.00,-67.20,0.00,0
+62.40,0.00,15.72,0.00,1.00,120.00,0.00,0
+57.60,0.00,15.74,0.00,1.00,-52.80,0.00,0
+52.80,0.00,15.77,0.00,1.00,134.40,0.00,0
+48.00,0.00,15.79,0.00,1.00,-43.20,0.00,0
+43.20,0.00,15.81,0.00,1.00,144.00,0.00,0
+38.40,0.00,15.83,0.00,1.00,-33.60,0.00,0
+33.60,0.00,15.85,0.00,1.00,153.60,0.00,0
+28.80,0.00,15.87,0.00,1.00,-24.00,0.00,0
+24.00,0.00,15.89,0.00,1.00,158.40,0.00,0
+19.20,0.00,15.91,0.00,1.00,-19.20,0.00,0
+14.40,0.00,15.94,0.00,1.00,168.00,0.00,0
+9.60,0.00,15.96,0.00,1.00,-9.60,0.00,0
+4.80,0.00,15.98,0.00,1.00,172.80,0.00,0
+0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0
diff --git a/scripts/testv/stvISM3.csv b/scripts/testv/stvISM3.csv
index d2474d78fd398460c53b0715771184a40bbbd60c..14eee9b693b536fa2fd22d2813d7f588b8930b06 100644
--- a/scripts/testv/stvISM3.csv
+++ b/scripts/testv/stvISM3.csv
@@ -1,1500 +1,1500 @@
-0.00,0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
-14.40,14.40,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
-19.20,19.20,1.00,0.00,1.00
--153.60,-24.00,1.00,0.00,1.00
-28.80,24.00,1.00,0.00,1.00
--148.80,-28.80,1.00,0.00,1.00
-38.40,33.60,1.00,0.00,1.00
--139.20,-33.60,1.00,0.00,1.00
-48.00,38.40,1.00,0.00,1.00
--124.80,-38.40,1.00,0.00,1.00
-57.60,38.40,1.00,0.00,1.00
--115.20,-43.20,1.00,0.00,1.00
-72.00,43.20,1.00,0.00,1.00
--100.80,-43.20,1.00,0.00,1.00
-86.40,43.20,1.00,0.00,1.00
--86.40,-43.20,1.00,0.00,1.00
-100.80,43.20,1.00,0.00,1.00
--76.80,-43.20,1.00,0.00,1.00
-110.40,43.20,1.00,0.00,1.00
--62.40,-43.20,1.00,0.00,1.00
-124.80,38.40,1.00,0.00,1.00
--52.80,-38.40,1.00,0.00,1.00
-134.40,33.60,1.00,0.00,1.00
--38.40,-33.60,1.00,0.00,1.00
-144.00,28.80,1.00,0.00,1.00
--33.60,-28.80,1.00,0.00,1.00
-153.60,24.00,1.00,0.00,1.00
--24.00,-19.20,1.00,0.00,1.00
-158.40,19.20,1.00,0.00,1.00
--14.40,-14.40,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
-19.20,19.20,1.00,0.00,1.00
--158.40,-19.20,1.00,0.00,1.00
-28.80,24.00,1.00,0.00,1.00
--148.80,-28.80,1.00,0.00,1.00
-33.60,28.80,1.00,0.00,1.00
--139.20,-33.60,1.00,0.00,1.00
-43.20,33.60,1.00,0.00,1.00
--129.60,-38.40,1.00,0.00,1.00
-57.60,38.40,1.00,0.00,1.00
--120.00,-43.20,1.00,0.00,1.00
-67.20,43.20,1.00,0.00,1.00
--105.60,-43.20,1.00,0.00,1.00
-81.60,43.20,1.00,0.00,1.00
--91.20,-43.20,1.00,0.00,1.00
-96.00,43.20,1.00,0.00,1.00
--76.80,-43.20,1.00,0.00,1.00
-110.40,43.20,1.00,0.00,1.00
--67.20,-43.20,1.00,0.00,1.00
-120.00,38.40,1.00,0.00,1.00
--52.80,-38.40,1.00,0.00,1.00
-129.60,38.40,1.00,0.00,1.00
--43.20,-33.60,1.00,0.00,1.00
-144.00,33.60,1.00,0.00,1.00
--33.60,-28.80,1.00,0.00,1.00
-148.80,24.00,1.00,0.00,1.00
--24.00,-24.00,1.00,0.00,1.00
-158.40,19.20,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
-168.00,14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
-14.40,14.40,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
-24.00,19.20,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
-28.80,24.00,1.00,0.00,1.00
--144.00,-24.00,1.00,0.00,1.00
-38.40,28.80,1.00,0.00,1.00
--134.40,-28.80,1.00,0.00,1.00
-48.00,33.60,1.00,0.00,1.00
--124.80,-33.60,1.00,0.00,1.00
-62.40,38.40,1.00,0.00,1.00
--115.20,-38.40,1.00,0.00,1.00
-72.00,38.40,1.00,0.00,1.00
--100.80,-38.40,1.00,0.00,1.00
-86.40,38.40,1.00,0.00,1.00
--86.40,-38.40,1.00,0.00,1.00
-96.00,38.40,1.00,0.00,1.00
--76.80,-38.40,1.00,0.00,1.00
-110.40,38.40,1.00,0.00,1.00
--62.40,-38.40,1.00,0.00,1.00
-120.00,33.60,1.00,0.00,1.00
--52.80,-33.60,1.00,0.00,1.00
-134.40,33.60,1.00,0.00,1.00
--43.20,-28.80,1.00,0.00,1.00
-144.00,28.80,1.00,0.00,1.00
--33.60,-24.00,1.00,0.00,1.00
-148.80,24.00,1.00,0.00,1.00
--24.00,-19.20,1.00,0.00,1.00
-158.40,14.40,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
-19.20,14.40,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
-28.80,24.00,1.00,0.00,1.00
--148.80,-24.00,1.00,0.00,1.00
-38.40,28.80,1.00,0.00,1.00
--139.20,-28.80,1.00,0.00,1.00
-48.00,33.60,1.00,0.00,1.00
--124.80,-33.60,1.00,0.00,1.00
-57.60,33.60,1.00,0.00,1.00
--115.20,-38.40,1.00,0.00,1.00
-72.00,38.40,1.00,0.00,1.00
--105.60,-38.40,1.00,0.00,1.00
-81.60,38.40,1.00,0.00,1.00
--91.20,-38.40,1.00,0.00,1.00
-96.00,38.40,1.00,0.00,1.00
--76.80,-38.40,1.00,0.00,1.00
-105.60,38.40,1.00,0.00,1.00
--67.20,-38.40,1.00,0.00,1.00
-120.00,38.40,1.00,0.00,1.00
--57.60,-33.60,1.00,0.00,1.00
-129.60,33.60,1.00,0.00,1.00
--43.20,-28.80,1.00,0.00,1.00
-139.20,28.80,1.00,0.00,1.00
--33.60,-24.00,1.00,0.00,1.00
-148.80,24.00,1.00,0.00,1.00
--28.80,-19.20,1.00,0.00,1.00
-158.40,19.20,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
-163.20,14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--158.40,-14.40,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
-33.60,19.20,1.00,0.00,1.00
--144.00,-24.00,1.00,0.00,1.00
-43.20,24.00,1.00,0.00,1.00
--134.40,-28.80,1.00,0.00,1.00
-52.80,28.80,1.00,0.00,1.00
--124.80,-28.80,1.00,0.00,1.00
-62.40,33.60,1.00,0.00,1.00
--110.40,-33.60,1.00,0.00,1.00
-72.00,33.60,1.00,0.00,1.00
--100.80,-33.60,1.00,0.00,1.00
-86.40,33.60,1.00,0.00,1.00
--86.40,-33.60,1.00,0.00,1.00
-96.00,33.60,1.00,0.00,1.00
--76.80,-33.60,1.00,0.00,1.00
-110.40,33.60,1.00,0.00,1.00
--67.20,-33.60,1.00,0.00,1.00
-120.00,33.60,1.00,0.00,1.00
--52.80,-28.80,1.00,0.00,1.00
-129.60,28.80,1.00,0.00,1.00
--43.20,-28.80,1.00,0.00,1.00
-139.20,24.00,1.00,0.00,1.00
--33.60,-24.00,1.00,0.00,1.00
-148.80,19.20,1.00,0.00,1.00
--24.00,-19.20,1.00,0.00,1.00
-158.40,14.40,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
-28.80,19.20,1.00,0.00,1.00
--144.00,-24.00,1.00,0.00,1.00
-38.40,24.00,1.00,0.00,1.00
--134.40,-28.80,1.00,0.00,1.00
-48.00,28.80,1.00,0.00,1.00
--124.80,-28.80,1.00,0.00,1.00
-62.40,33.60,1.00,0.00,1.00
--115.20,-33.60,1.00,0.00,1.00
-72.00,33.60,1.00,0.00,1.00
--100.80,-33.60,1.00,0.00,1.00
-81.60,33.60,1.00,0.00,1.00
--91.20,-33.60,1.00,0.00,1.00
-96.00,33.60,1.00,0.00,1.00
--81.60,-33.60,1.00,0.00,1.00
-105.60,33.60,1.00,0.00,1.00
--67.20,-33.60,1.00,0.00,1.00
-115.20,33.60,1.00,0.00,1.00
--57.60,-28.80,1.00,0.00,1.00
-129.60,28.80,1.00,0.00,1.00
--48.00,-28.80,1.00,0.00,1.00
-139.20,24.00,1.00,0.00,1.00
--38.40,-24.00,1.00,0.00,1.00
-148.80,19.20,1.00,0.00,1.00
--28.80,-19.20,1.00,0.00,1.00
-153.60,14.40,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
--148.80,-14.40,1.00,0.00,1.00
-33.60,19.20,1.00,0.00,1.00
--139.20,-19.20,1.00,0.00,1.00
-43.20,24.00,1.00,0.00,1.00
--129.60,-24.00,1.00,0.00,1.00
-52.80,24.00,1.00,0.00,1.00
--120.00,-28.80,1.00,0.00,1.00
-62.40,28.80,1.00,0.00,1.00
--110.40,-28.80,1.00,0.00,1.00
-76.80,28.80,1.00,0.00,1.00
--100.80,-28.80,1.00,0.00,1.00
-86.40,28.80,1.00,0.00,1.00
--86.40,-28.80,1.00,0.00,1.00
-96.00,28.80,1.00,0.00,1.00
--76.80,-28.80,1.00,0.00,1.00
-105.60,28.80,1.00,0.00,1.00
--67.20,-28.80,1.00,0.00,1.00
-120.00,28.80,1.00,0.00,1.00
--57.60,-24.00,1.00,0.00,1.00
-129.60,24.00,1.00,0.00,1.00
--48.00,-24.00,1.00,0.00,1.00
-139.20,19.20,1.00,0.00,1.00
--38.40,-19.20,1.00,0.00,1.00
-148.80,19.20,1.00,0.00,1.00
--28.80,-14.40,1.00,0.00,1.00
-158.40,14.40,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--163.20,-9.60,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
--153.60,-14.40,1.00,0.00,1.00
-33.60,19.20,1.00,0.00,1.00
--144.00,-19.20,1.00,0.00,1.00
-43.20,19.20,1.00,0.00,1.00
--134.40,-24.00,1.00,0.00,1.00
-52.80,24.00,1.00,0.00,1.00
--124.80,-24.00,1.00,0.00,1.00
-62.40,28.80,1.00,0.00,1.00
--115.20,-28.80,1.00,0.00,1.00
-72.00,28.80,1.00,0.00,1.00
--100.80,-28.80,1.00,0.00,1.00
-81.60,28.80,1.00,0.00,1.00
--91.20,-28.80,1.00,0.00,1.00
-96.00,28.80,1.00,0.00,1.00
--81.60,-28.80,1.00,0.00,1.00
-105.60,28.80,1.00,0.00,1.00
--67.20,-28.80,1.00,0.00,1.00
-115.20,28.80,1.00,0.00,1.00
--57.60,-28.80,1.00,0.00,1.00
-124.80,24.00,1.00,0.00,1.00
--48.00,-24.00,1.00,0.00,1.00
-134.40,24.00,1.00,0.00,1.00
--38.40,-19.20,1.00,0.00,1.00
-144.00,19.20,1.00,0.00,1.00
--28.80,-14.40,1.00,0.00,1.00
-153.60,14.40,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
--14.40,-9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-19.20,9.60,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
--148.80,-14.40,1.00,0.00,1.00
-33.60,14.40,1.00,0.00,1.00
--139.20,-19.20,1.00,0.00,1.00
-43.20,19.20,1.00,0.00,1.00
--129.60,-19.20,1.00,0.00,1.00
-52.80,19.20,1.00,0.00,1.00
--120.00,-24.00,1.00,0.00,1.00
-67.20,24.00,1.00,0.00,1.00
--110.40,-24.00,1.00,0.00,1.00
-76.80,24.00,1.00,0.00,1.00
--100.80,-24.00,1.00,0.00,1.00
-86.40,24.00,1.00,0.00,1.00
--86.40,-24.00,1.00,0.00,1.00
-96.00,24.00,1.00,0.00,1.00
--76.80,-24.00,1.00,0.00,1.00
-105.60,24.00,1.00,0.00,1.00
--67.20,-24.00,1.00,0.00,1.00
-115.20,24.00,1.00,0.00,1.00
--57.60,-24.00,1.00,0.00,1.00
-129.60,19.20,1.00,0.00,1.00
--48.00,-19.20,1.00,0.00,1.00
-139.20,19.20,1.00,0.00,1.00
--38.40,-14.40,1.00,0.00,1.00
-148.80,14.40,1.00,0.00,1.00
--28.80,-14.40,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
-24.00,9.60,1.00,0.00,1.00
--153.60,-14.40,1.00,0.00,1.00
-33.60,14.40,1.00,0.00,1.00
--144.00,-14.40,1.00,0.00,1.00
-43.20,19.20,1.00,0.00,1.00
--134.40,-19.20,1.00,0.00,1.00
-52.80,19.20,1.00,0.00,1.00
--124.80,-24.00,1.00,0.00,1.00
-62.40,24.00,1.00,0.00,1.00
--110.40,-24.00,1.00,0.00,1.00
-72.00,24.00,1.00,0.00,1.00
--100.80,-24.00,1.00,0.00,1.00
-81.60,24.00,1.00,0.00,1.00
--91.20,-24.00,1.00,0.00,1.00
-96.00,24.00,1.00,0.00,1.00
--81.60,-24.00,1.00,0.00,1.00
-105.60,24.00,1.00,0.00,1.00
--72.00,-24.00,1.00,0.00,1.00
-115.20,24.00,1.00,0.00,1.00
--57.60,-24.00,1.00,0.00,1.00
-124.80,19.20,1.00,0.00,1.00
--48.00,-19.20,1.00,0.00,1.00
-134.40,19.20,1.00,0.00,1.00
--38.40,-19.20,1.00,0.00,1.00
-144.00,14.40,1.00,0.00,1.00
--28.80,-14.40,1.00,0.00,1.00
-153.60,14.40,1.00,0.00,1.00
--24.00,-9.60,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
-28.80,9.60,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
-38.40,14.40,1.00,0.00,1.00
--139.20,-14.40,1.00,0.00,1.00
-48.00,14.40,1.00,0.00,1.00
--129.60,-14.40,1.00,0.00,1.00
-57.60,19.20,1.00,0.00,1.00
--120.00,-19.20,1.00,0.00,1.00
-67.20,19.20,1.00,0.00,1.00
--110.40,-19.20,1.00,0.00,1.00
-76.80,19.20,1.00,0.00,1.00
--100.80,-19.20,1.00,0.00,1.00
-86.40,19.20,1.00,0.00,1.00
--86.40,-19.20,1.00,0.00,1.00
-96.00,19.20,1.00,0.00,1.00
--76.80,-19.20,1.00,0.00,1.00
-105.60,19.20,1.00,0.00,1.00
--67.20,-19.20,1.00,0.00,1.00
-115.20,19.20,1.00,0.00,1.00
--57.60,-19.20,1.00,0.00,1.00
-124.80,19.20,1.00,0.00,1.00
--48.00,-14.40,1.00,0.00,1.00
-134.40,14.40,1.00,0.00,1.00
--38.40,-14.40,1.00,0.00,1.00
-144.00,14.40,1.00,0.00,1.00
--28.80,-9.60,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
-24.00,9.60,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
-33.60,14.40,1.00,0.00,1.00
--139.20,-14.40,1.00,0.00,1.00
-43.20,14.40,1.00,0.00,1.00
--129.60,-14.40,1.00,0.00,1.00
-52.80,19.20,1.00,0.00,1.00
--120.00,-19.20,1.00,0.00,1.00
-62.40,19.20,1.00,0.00,1.00
--110.40,-19.20,1.00,0.00,1.00
-72.00,19.20,1.00,0.00,1.00
--100.80,-19.20,1.00,0.00,1.00
-81.60,19.20,1.00,0.00,1.00
--91.20,-19.20,1.00,0.00,1.00
-96.00,19.20,1.00,0.00,1.00
--81.60,-19.20,1.00,0.00,1.00
-105.60,19.20,1.00,0.00,1.00
--72.00,-19.20,1.00,0.00,1.00
-115.20,19.20,1.00,0.00,1.00
--62.40,-19.20,1.00,0.00,1.00
-124.80,19.20,1.00,0.00,1.00
--52.80,-14.40,1.00,0.00,1.00
-134.40,14.40,1.00,0.00,1.00
--43.20,-14.40,1.00,0.00,1.00
-144.00,14.40,1.00,0.00,1.00
--33.60,-9.60,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
--24.00,-9.60,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-28.80,9.60,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
-38.40,9.60,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
-48.00,9.60,1.00,0.00,1.00
--129.60,-14.40,1.00,0.00,1.00
-57.60,14.40,1.00,0.00,1.00
--120.00,-14.40,1.00,0.00,1.00
-67.20,14.40,1.00,0.00,1.00
--110.40,-14.40,1.00,0.00,1.00
-76.80,14.40,1.00,0.00,1.00
--100.80,-14.40,1.00,0.00,1.00
-86.40,14.40,1.00,0.00,1.00
--86.40,-14.40,1.00,0.00,1.00
-96.00,14.40,1.00,0.00,1.00
--76.80,-14.40,1.00,0.00,1.00
-105.60,14.40,1.00,0.00,1.00
--67.20,-14.40,1.00,0.00,1.00
-115.20,14.40,1.00,0.00,1.00
--57.60,-14.40,1.00,0.00,1.00
-124.80,14.40,1.00,0.00,1.00
--48.00,-14.40,1.00,0.00,1.00
-134.40,9.60,1.00,0.00,1.00
--38.40,-9.60,1.00,0.00,1.00
-144.00,9.60,1.00,0.00,1.00
--28.80,-9.60,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-24.00,4.80,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
-33.60,9.60,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
-43.20,9.60,1.00,0.00,1.00
--129.60,-14.40,1.00,0.00,1.00
-52.80,14.40,1.00,0.00,1.00
--120.00,-14.40,1.00,0.00,1.00
-62.40,14.40,1.00,0.00,1.00
--110.40,-14.40,1.00,0.00,1.00
-72.00,14.40,1.00,0.00,1.00
--100.80,-14.40,1.00,0.00,1.00
-81.60,14.40,1.00,0.00,1.00
--91.20,-14.40,1.00,0.00,1.00
-96.00,14.40,1.00,0.00,1.00
--81.60,-14.40,1.00,0.00,1.00
-105.60,14.40,1.00,0.00,1.00
--72.00,-14.40,1.00,0.00,1.00
-115.20,14.40,1.00,0.00,1.00
--62.40,-14.40,1.00,0.00,1.00
-124.80,14.40,1.00,0.00,1.00
--52.80,-14.40,1.00,0.00,1.00
-134.40,9.60,1.00,0.00,1.00
--43.20,-9.60,1.00,0.00,1.00
-144.00,9.60,1.00,0.00,1.00
--33.60,-9.60,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
--24.00,-4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-28.80,4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
-38.40,4.80,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
-48.00,9.60,1.00,0.00,1.00
--129.60,-9.60,1.00,0.00,1.00
-57.60,9.60,1.00,0.00,1.00
--120.00,-9.60,1.00,0.00,1.00
-67.20,9.60,1.00,0.00,1.00
--110.40,-9.60,1.00,0.00,1.00
-76.80,9.60,1.00,0.00,1.00
--100.80,-9.60,1.00,0.00,1.00
-86.40,9.60,1.00,0.00,1.00
--86.40,-9.60,1.00,0.00,1.00
-96.00,9.60,1.00,0.00,1.00
--76.80,-9.60,1.00,0.00,1.00
-105.60,9.60,1.00,0.00,1.00
--67.20,-9.60,1.00,0.00,1.00
-115.20,9.60,1.00,0.00,1.00
--57.60,-9.60,1.00,0.00,1.00
-124.80,9.60,1.00,0.00,1.00
--48.00,-9.60,1.00,0.00,1.00
-134.40,9.60,1.00,0.00,1.00
--38.40,-9.60,1.00,0.00,1.00
-144.00,4.80,1.00,0.00,1.00
--28.80,-4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-24.00,4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
-33.60,4.80,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
-43.20,9.60,1.00,0.00,1.00
--129.60,-9.60,1.00,0.00,1.00
-52.80,9.60,1.00,0.00,1.00
--120.00,-9.60,1.00,0.00,1.00
-62.40,9.60,1.00,0.00,1.00
--110.40,-9.60,1.00,0.00,1.00
-72.00,9.60,1.00,0.00,1.00
--100.80,-9.60,1.00,0.00,1.00
-81.60,9.60,1.00,0.00,1.00
--91.20,-9.60,1.00,0.00,1.00
-96.00,9.60,1.00,0.00,1.00
--81.60,-9.60,1.00,0.00,1.00
-105.60,9.60,1.00,0.00,1.00
--72.00,-9.60,1.00,0.00,1.00
-115.20,9.60,1.00,0.00,1.00
--62.40,-9.60,1.00,0.00,1.00
-124.80,9.60,1.00,0.00,1.00
--52.80,-9.60,1.00,0.00,1.00
-134.40,9.60,1.00,0.00,1.00
--43.20,-9.60,1.00,0.00,1.00
-144.00,4.80,1.00,0.00,1.00
--33.60,-4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
--24.00,-4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
-19.20,0.00,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-28.80,4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
-38.40,4.80,1.00,0.00,1.00
--139.20,-4.80,1.00,0.00,1.00
-48.00,4.80,1.00,0.00,1.00
--129.60,-4.80,1.00,0.00,1.00
-57.60,4.80,1.00,0.00,1.00
--120.00,-4.80,1.00,0.00,1.00
-67.20,4.80,1.00,0.00,1.00
--110.40,-4.80,1.00,0.00,1.00
-76.80,4.80,1.00,0.00,1.00
--100.80,-4.80,1.00,0.00,1.00
-86.40,4.80,1.00,0.00,1.00
--86.40,-4.80,1.00,0.00,1.00
-96.00,4.80,1.00,0.00,1.00
--76.80,-4.80,1.00,0.00,1.00
-105.60,4.80,1.00,0.00,1.00
--67.20,-4.80,1.00,0.00,1.00
-115.20,4.80,1.00,0.00,1.00
--57.60,-4.80,1.00,0.00,1.00
-124.80,4.80,1.00,0.00,1.00
--48.00,-4.80,1.00,0.00,1.00
-134.40,4.80,1.00,0.00,1.00
--38.40,-4.80,1.00,0.00,1.00
-144.00,4.80,1.00,0.00,1.00
--28.80,-4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
-24.00,4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
-33.60,4.80,1.00,0.00,1.00
--139.20,-4.80,1.00,0.00,1.00
-43.20,4.80,1.00,0.00,1.00
--129.60,-4.80,1.00,0.00,1.00
-52.80,4.80,1.00,0.00,1.00
--120.00,-4.80,1.00,0.00,1.00
-62.40,4.80,1.00,0.00,1.00
--110.40,-4.80,1.00,0.00,1.00
-72.00,4.80,1.00,0.00,1.00
--100.80,-4.80,1.00,0.00,1.00
-81.60,4.80,1.00,0.00,1.00
--91.20,-4.80,1.00,0.00,1.00
-96.00,4.80,1.00,0.00,1.00
--81.60,-4.80,1.00,0.00,1.00
-105.60,4.80,1.00,0.00,1.00
--72.00,-4.80,1.00,0.00,1.00
-115.20,4.80,1.00,0.00,1.00
--62.40,-4.80,1.00,0.00,1.00
-124.80,4.80,1.00,0.00,1.00
--52.80,-4.80,1.00,0.00,1.00
-134.40,4.80,1.00,0.00,1.00
--43.20,-4.80,1.00,0.00,1.00
-144.00,4.80,1.00,0.00,1.00
--33.60,-4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
--24.00,-4.80,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
--14.40,-0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
-19.20,0.00,1.00,0.00,1.00
--158.40,-0.00,1.00,0.00,1.00
-28.80,0.00,1.00,0.00,1.00
--148.80,-0.00,1.00,0.00,1.00
-38.40,0.00,1.00,0.00,1.00
--139.20,-0.00,1.00,0.00,1.00
-48.00,0.00,1.00,0.00,1.00
--129.60,-0.00,1.00,0.00,1.00
-57.60,0.00,1.00,0.00,1.00
--120.00,-0.00,1.00,0.00,1.00
-67.20,0.00,1.00,0.00,1.00
--110.40,-0.00,1.00,0.00,1.00
-76.80,0.00,1.00,0.00,1.00
--100.80,-0.00,1.00,0.00,1.00
-86.40,0.00,1.00,0.00,1.00
--86.40,-0.00,1.00,0.00,1.00
-96.00,0.00,1.00,0.00,1.00
--76.80,-0.00,1.00,0.00,1.00
-105.60,0.00,1.00,0.00,1.00
--67.20,-0.00,1.00,0.00,1.00
-115.20,0.00,1.00,0.00,1.00
--57.60,-0.00,1.00,0.00,1.00
-124.80,0.00,1.00,0.00,1.00
--48.00,-0.00,1.00,0.00,1.00
-134.40,0.00,1.00,0.00,1.00
--38.40,-0.00,1.00,0.00,1.00
-144.00,0.00,1.00,0.00,1.00
--28.80,-0.00,1.00,0.00,1.00
-153.60,0.00,1.00,0.00,1.00
--19.20,-0.00,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--0.00,-0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
--158.40,-0.00,1.00,0.00,1.00
-24.00,0.00,1.00,0.00,1.00
--148.80,-0.00,1.00,0.00,1.00
-33.60,0.00,1.00,0.00,1.00
--139.20,-0.00,1.00,0.00,1.00
-43.20,0.00,1.00,0.00,1.00
--129.60,-0.00,1.00,0.00,1.00
-52.80,0.00,1.00,0.00,1.00
--120.00,-0.00,1.00,0.00,1.00
-62.40,0.00,1.00,0.00,1.00
--110.40,-0.00,1.00,0.00,1.00
-72.00,0.00,1.00,0.00,1.00
--100.80,-0.00,1.00,0.00,1.00
-81.60,0.00,1.00,0.00,1.00
--91.20,-0.00,1.00,0.00,1.00
-96.00,0.00,1.00,0.00,1.00
--81.60,-0.00,1.00,0.00,1.00
-105.60,0.00,1.00,0.00,1.00
--72.00,-0.00,1.00,0.00,1.00
-115.20,0.00,1.00,0.00,1.00
--62.40,-0.00,1.00,0.00,1.00
-124.80,0.00,1.00,0.00,1.00
--52.80,-0.00,1.00,0.00,1.00
-134.40,0.00,1.00,0.00,1.00
--43.20,-0.00,1.00,0.00,1.00
-144.00,0.00,1.00,0.00,1.00
--33.60,-0.00,1.00,0.00,1.00
-153.60,0.00,1.00,0.00,1.00
--24.00,-0.00,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
--14.40,-0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
-19.20,-0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
-28.80,-0.00,1.00,0.00,1.00
--148.80,0.00,1.00,0.00,1.00
-38.40,-0.00,1.00,0.00,1.00
--139.20,0.00,1.00,0.00,1.00
-48.00,-0.00,1.00,0.00,1.00
--129.60,0.00,1.00,0.00,1.00
-57.60,-4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
-67.20,-4.80,1.00,0.00,1.00
--110.40,4.80,1.00,0.00,1.00
-76.80,-4.80,1.00,0.00,1.00
--100.80,4.80,1.00,0.00,1.00
-86.40,-4.80,1.00,0.00,1.00
--86.40,4.80,1.00,0.00,1.00
-96.00,-4.80,1.00,0.00,1.00
--76.80,4.80,1.00,0.00,1.00
-105.60,-4.80,1.00,0.00,1.00
--67.20,4.80,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
--57.60,4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
--48.00,0.00,1.00,0.00,1.00
-134.40,-0.00,1.00,0.00,1.00
--38.40,0.00,1.00,0.00,1.00
-144.00,-0.00,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
-153.60,-0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
-24.00,-0.00,1.00,0.00,1.00
--148.80,0.00,1.00,0.00,1.00
-33.60,-0.00,1.00,0.00,1.00
--139.20,0.00,1.00,0.00,1.00
-43.20,-0.00,1.00,0.00,1.00
--129.60,0.00,1.00,0.00,1.00
-52.80,-4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
-62.40,-4.80,1.00,0.00,1.00
--110.40,4.80,1.00,0.00,1.00
-72.00,-4.80,1.00,0.00,1.00
--100.80,4.80,1.00,0.00,1.00
-81.60,-4.80,1.00,0.00,1.00
--91.20,4.80,1.00,0.00,1.00
-96.00,-4.80,1.00,0.00,1.00
--81.60,4.80,1.00,0.00,1.00
-105.60,-4.80,1.00,0.00,1.00
--72.00,4.80,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
--62.40,4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
--52.80,0.00,1.00,0.00,1.00
-134.40,-0.00,1.00,0.00,1.00
--43.20,0.00,1.00,0.00,1.00
-144.00,-0.00,1.00,0.00,1.00
--33.60,0.00,1.00,0.00,1.00
-153.60,-0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
-38.40,-4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
-48.00,-4.80,1.00,0.00,1.00
--129.60,4.80,1.00,0.00,1.00
-57.60,-4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
-67.20,-4.80,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
-76.80,-9.60,1.00,0.00,1.00
--100.80,9.60,1.00,0.00,1.00
-86.40,-9.60,1.00,0.00,1.00
--86.40,9.60,1.00,0.00,1.00
-96.00,-9.60,1.00,0.00,1.00
--76.80,9.60,1.00,0.00,1.00
-105.60,-9.60,1.00,0.00,1.00
--67.20,9.60,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
--57.60,4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
--48.00,4.80,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
--38.40,4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
-33.60,-4.80,1.00,0.00,1.00
--139.20,4.80,1.00,0.00,1.00
-43.20,-4.80,1.00,0.00,1.00
--129.60,4.80,1.00,0.00,1.00
-52.80,-4.80,1.00,0.00,1.00
--120.00,4.80,1.00,0.00,1.00
-62.40,-4.80,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
-72.00,-9.60,1.00,0.00,1.00
--100.80,9.60,1.00,0.00,1.00
-81.60,-9.60,1.00,0.00,1.00
--91.20,9.60,1.00,0.00,1.00
-96.00,-9.60,1.00,0.00,1.00
--81.60,9.60,1.00,0.00,1.00
-105.60,-9.60,1.00,0.00,1.00
--72.00,9.60,1.00,0.00,1.00
-115.20,-4.80,1.00,0.00,1.00
--62.40,4.80,1.00,0.00,1.00
-124.80,-4.80,1.00,0.00,1.00
--52.80,4.80,1.00,0.00,1.00
-134.40,-4.80,1.00,0.00,1.00
--43.20,4.80,1.00,0.00,1.00
-144.00,-4.80,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-28.80,-4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
-48.00,-9.60,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
-57.60,-9.60,1.00,0.00,1.00
--120.00,9.60,1.00,0.00,1.00
-67.20,-9.60,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
-76.80,-14.40,1.00,0.00,1.00
--100.80,14.40,1.00,0.00,1.00
-86.40,-14.40,1.00,0.00,1.00
--86.40,14.40,1.00,0.00,1.00
-96.00,-14.40,1.00,0.00,1.00
--76.80,14.40,1.00,0.00,1.00
-105.60,-14.40,1.00,0.00,1.00
--67.20,9.60,1.00,0.00,1.00
-115.20,-9.60,1.00,0.00,1.00
--57.60,9.60,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
--48.00,9.60,1.00,0.00,1.00
-134.40,-9.60,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
--28.80,4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-24.00,-4.80,1.00,0.00,1.00
--148.80,4.80,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
-43.20,-9.60,1.00,0.00,1.00
--129.60,9.60,1.00,0.00,1.00
-52.80,-9.60,1.00,0.00,1.00
--120.00,9.60,1.00,0.00,1.00
-62.40,-9.60,1.00,0.00,1.00
--110.40,9.60,1.00,0.00,1.00
-72.00,-14.40,1.00,0.00,1.00
--100.80,14.40,1.00,0.00,1.00
-81.60,-14.40,1.00,0.00,1.00
--91.20,14.40,1.00,0.00,1.00
-96.00,-14.40,1.00,0.00,1.00
--81.60,14.40,1.00,0.00,1.00
-105.60,-14.40,1.00,0.00,1.00
--72.00,9.60,1.00,0.00,1.00
-115.20,-9.60,1.00,0.00,1.00
--62.40,9.60,1.00,0.00,1.00
-124.80,-9.60,1.00,0.00,1.00
--52.80,9.60,1.00,0.00,1.00
-134.40,-9.60,1.00,0.00,1.00
--43.20,9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
--33.60,4.80,1.00,0.00,1.00
-153.60,-4.80,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
-38.40,-9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
-48.00,-14.40,1.00,0.00,1.00
--129.60,14.40,1.00,0.00,1.00
-57.60,-14.40,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
-67.20,-14.40,1.00,0.00,1.00
--110.40,14.40,1.00,0.00,1.00
-76.80,-19.20,1.00,0.00,1.00
--100.80,19.20,1.00,0.00,1.00
-86.40,-19.20,1.00,0.00,1.00
--86.40,19.20,1.00,0.00,1.00
-96.00,-19.20,1.00,0.00,1.00
--76.80,19.20,1.00,0.00,1.00
-105.60,-14.40,1.00,0.00,1.00
--67.20,14.40,1.00,0.00,1.00
-115.20,-14.40,1.00,0.00,1.00
--57.60,14.40,1.00,0.00,1.00
-124.80,-14.40,1.00,0.00,1.00
--48.00,14.40,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
--38.40,9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
--19.20,4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
--158.40,4.80,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
-33.60,-9.60,1.00,0.00,1.00
--139.20,9.60,1.00,0.00,1.00
-43.20,-14.40,1.00,0.00,1.00
--129.60,14.40,1.00,0.00,1.00
-52.80,-14.40,1.00,0.00,1.00
--120.00,14.40,1.00,0.00,1.00
-62.40,-14.40,1.00,0.00,1.00
--110.40,14.40,1.00,0.00,1.00
-72.00,-14.40,1.00,0.00,1.00
--100.80,19.20,1.00,0.00,1.00
-81.60,-19.20,1.00,0.00,1.00
--91.20,19.20,1.00,0.00,1.00
-96.00,-19.20,1.00,0.00,1.00
--81.60,19.20,1.00,0.00,1.00
-105.60,-19.20,1.00,0.00,1.00
--72.00,14.40,1.00,0.00,1.00
-115.20,-14.40,1.00,0.00,1.00
--62.40,14.40,1.00,0.00,1.00
-124.80,-14.40,1.00,0.00,1.00
--52.80,14.40,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
--43.20,9.60,1.00,0.00,1.00
-144.00,-9.60,1.00,0.00,1.00
--33.60,9.60,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
--24.00,4.80,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-19.20,-4.80,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
-28.80,-9.60,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
-38.40,-14.40,1.00,0.00,1.00
--139.20,14.40,1.00,0.00,1.00
-48.00,-14.40,1.00,0.00,1.00
--129.60,19.20,1.00,0.00,1.00
-57.60,-19.20,1.00,0.00,1.00
--120.00,19.20,1.00,0.00,1.00
-67.20,-19.20,1.00,0.00,1.00
--110.40,19.20,1.00,0.00,1.00
-76.80,-19.20,1.00,0.00,1.00
--100.80,24.00,1.00,0.00,1.00
-86.40,-24.00,1.00,0.00,1.00
--86.40,24.00,1.00,0.00,1.00
-96.00,-24.00,1.00,0.00,1.00
--76.80,24.00,1.00,0.00,1.00
-105.60,-19.20,1.00,0.00,1.00
--67.20,19.20,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
--57.60,19.20,1.00,0.00,1.00
-124.80,-19.20,1.00,0.00,1.00
--48.00,19.20,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
--38.40,14.40,1.00,0.00,1.00
-144.00,-14.40,1.00,0.00,1.00
--28.80,9.60,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-4.80,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
--148.80,9.60,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
--139.20,14.40,1.00,0.00,1.00
-43.20,-14.40,1.00,0.00,1.00
--129.60,19.20,1.00,0.00,1.00
-52.80,-19.20,1.00,0.00,1.00
--120.00,19.20,1.00,0.00,1.00
-62.40,-19.20,1.00,0.00,1.00
--110.40,19.20,1.00,0.00,1.00
-72.00,-19.20,1.00,0.00,1.00
--100.80,24.00,1.00,0.00,1.00
-81.60,-24.00,1.00,0.00,1.00
--91.20,24.00,1.00,0.00,1.00
-96.00,-24.00,1.00,0.00,1.00
--81.60,24.00,1.00,0.00,1.00
-105.60,-19.20,1.00,0.00,1.00
--72.00,19.20,1.00,0.00,1.00
-115.20,-19.20,1.00,0.00,1.00
--62.40,19.20,1.00,0.00,1.00
-124.80,-19.20,1.00,0.00,1.00
--52.80,19.20,1.00,0.00,1.00
-134.40,-14.40,1.00,0.00,1.00
--43.20,14.40,1.00,0.00,1.00
-144.00,-14.40,1.00,0.00,1.00
--33.60,14.40,1.00,0.00,1.00
-153.60,-9.60,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
-163.20,-4.80,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-19.20,-9.60,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
--148.80,14.40,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
--129.60,19.20,1.00,0.00,1.00
-52.80,-24.00,1.00,0.00,1.00
--120.00,24.00,1.00,0.00,1.00
-62.40,-24.00,1.00,0.00,1.00
--110.40,24.00,1.00,0.00,1.00
-76.80,-24.00,1.00,0.00,1.00
--100.80,28.80,1.00,0.00,1.00
-86.40,-28.80,1.00,0.00,1.00
--86.40,28.80,1.00,0.00,1.00
-96.00,-28.80,1.00,0.00,1.00
--76.80,28.80,1.00,0.00,1.00
-105.60,-24.00,1.00,0.00,1.00
--67.20,24.00,1.00,0.00,1.00
-120.00,-24.00,1.00,0.00,1.00
--57.60,24.00,1.00,0.00,1.00
-129.60,-24.00,1.00,0.00,1.00
--48.00,19.20,1.00,0.00,1.00
-139.20,-19.20,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
-148.80,-14.40,1.00,0.00,1.00
--28.80,14.40,1.00,0.00,1.00
-158.40,-9.60,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--158.40,9.60,1.00,0.00,1.00
-24.00,-9.60,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
-33.60,-14.40,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
-43.20,-19.20,1.00,0.00,1.00
--134.40,19.20,1.00,0.00,1.00
-52.80,-24.00,1.00,0.00,1.00
--124.80,24.00,1.00,0.00,1.00
-62.40,-24.00,1.00,0.00,1.00
--110.40,24.00,1.00,0.00,1.00
-72.00,-24.00,1.00,0.00,1.00
--100.80,28.80,1.00,0.00,1.00
-81.60,-28.80,1.00,0.00,1.00
--91.20,28.80,1.00,0.00,1.00
-96.00,-28.80,1.00,0.00,1.00
--81.60,28.80,1.00,0.00,1.00
-105.60,-24.00,1.00,0.00,1.00
--72.00,24.00,1.00,0.00,1.00
-115.20,-24.00,1.00,0.00,1.00
--57.60,24.00,1.00,0.00,1.00
-124.80,-24.00,1.00,0.00,1.00
--48.00,19.20,1.00,0.00,1.00
-134.40,-19.20,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
-144.00,-14.40,1.00,0.00,1.00
--28.80,14.40,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
--24.00,9.60,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
--14.40,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
--148.80,19.20,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
--139.20,19.20,1.00,0.00,1.00
-43.20,-24.00,1.00,0.00,1.00
--129.60,24.00,1.00,0.00,1.00
-52.80,-28.80,1.00,0.00,1.00
--120.00,28.80,1.00,0.00,1.00
-62.40,-28.80,1.00,0.00,1.00
--110.40,28.80,1.00,0.00,1.00
-76.80,-28.80,1.00,0.00,1.00
--100.80,33.60,1.00,0.00,1.00
-86.40,-33.60,1.00,0.00,1.00
--86.40,33.60,1.00,0.00,1.00
-96.00,-33.60,1.00,0.00,1.00
--76.80,28.80,1.00,0.00,1.00
-110.40,-28.80,1.00,0.00,1.00
--67.20,28.80,1.00,0.00,1.00
-120.00,-28.80,1.00,0.00,1.00
--57.60,28.80,1.00,0.00,1.00
-129.60,-24.00,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
--28.80,14.40,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
--19.20,9.60,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--163.20,9.60,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
--153.60,14.40,1.00,0.00,1.00
-33.60,-19.20,1.00,0.00,1.00
--144.00,19.20,1.00,0.00,1.00
-43.20,-24.00,1.00,0.00,1.00
--134.40,24.00,1.00,0.00,1.00
-52.80,-24.00,1.00,0.00,1.00
--124.80,28.80,1.00,0.00,1.00
-62.40,-28.80,1.00,0.00,1.00
--115.20,28.80,1.00,0.00,1.00
-72.00,-28.80,1.00,0.00,1.00
--100.80,28.80,1.00,0.00,1.00
-81.60,-33.60,1.00,0.00,1.00
--91.20,33.60,1.00,0.00,1.00
-96.00,-33.60,1.00,0.00,1.00
--81.60,33.60,1.00,0.00,1.00
-105.60,-28.80,1.00,0.00,1.00
--67.20,28.80,1.00,0.00,1.00
-115.20,-28.80,1.00,0.00,1.00
--57.60,28.80,1.00,0.00,1.00
-124.80,-28.80,1.00,0.00,1.00
--48.00,24.00,1.00,0.00,1.00
-134.40,-24.00,1.00,0.00,1.00
--38.40,19.20,1.00,0.00,1.00
-144.00,-19.20,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
-153.60,-14.40,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
--14.40,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--158.40,14.40,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
-33.60,-24.00,1.00,0.00,1.00
--144.00,24.00,1.00,0.00,1.00
-43.20,-24.00,1.00,0.00,1.00
--134.40,28.80,1.00,0.00,1.00
-52.80,-28.80,1.00,0.00,1.00
--124.80,33.60,1.00,0.00,1.00
-62.40,-33.60,1.00,0.00,1.00
--110.40,33.60,1.00,0.00,1.00
-72.00,-33.60,1.00,0.00,1.00
--100.80,38.40,1.00,0.00,1.00
-86.40,-38.40,1.00,0.00,1.00
--86.40,38.40,1.00,0.00,1.00
-96.00,-38.40,1.00,0.00,1.00
--76.80,33.60,1.00,0.00,1.00
-110.40,-33.60,1.00,0.00,1.00
--67.20,33.60,1.00,0.00,1.00
-120.00,-33.60,1.00,0.00,1.00
--52.80,28.80,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
--43.20,28.80,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
--33.60,24.00,1.00,0.00,1.00
-148.80,-19.20,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
--9.60,4.80,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--168.00,4.80,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
-24.00,-14.40,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
-28.80,-19.20,1.00,0.00,1.00
--144.00,24.00,1.00,0.00,1.00
-38.40,-24.00,1.00,0.00,1.00
--134.40,28.80,1.00,0.00,1.00
-48.00,-28.80,1.00,0.00,1.00
--124.80,28.80,1.00,0.00,1.00
-57.60,-33.60,1.00,0.00,1.00
--115.20,33.60,1.00,0.00,1.00
-72.00,-33.60,1.00,0.00,1.00
--105.60,33.60,1.00,0.00,1.00
-81.60,-38.40,1.00,0.00,1.00
--91.20,38.40,1.00,0.00,1.00
-96.00,-38.40,1.00,0.00,1.00
--81.60,38.40,1.00,0.00,1.00
-105.60,-33.60,1.00,0.00,1.00
--67.20,33.60,1.00,0.00,1.00
-120.00,-33.60,1.00,0.00,1.00
--57.60,33.60,1.00,0.00,1.00
-129.60,-28.80,1.00,0.00,1.00
--48.00,28.80,1.00,0.00,1.00
-139.20,-24.00,1.00,0.00,1.00
--38.40,24.00,1.00,0.00,1.00
-148.80,-24.00,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
-158.40,-14.40,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
-163.20,-9.60,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
-9.60,-4.80,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
-24.00,-19.20,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
-28.80,-24.00,1.00,0.00,1.00
--144.00,28.80,1.00,0.00,1.00
-38.40,-28.80,1.00,0.00,1.00
--134.40,33.60,1.00,0.00,1.00
-48.00,-33.60,1.00,0.00,1.00
--124.80,33.60,1.00,0.00,1.00
-62.40,-38.40,1.00,0.00,1.00
--115.20,38.40,1.00,0.00,1.00
-72.00,-38.40,1.00,0.00,1.00
--100.80,43.20,1.00,0.00,1.00
-86.40,-43.20,1.00,0.00,1.00
--86.40,43.20,1.00,0.00,1.00
-96.00,-43.20,1.00,0.00,1.00
--76.80,38.40,1.00,0.00,1.00
-110.40,-38.40,1.00,0.00,1.00
--62.40,38.40,1.00,0.00,1.00
-120.00,-38.40,1.00,0.00,1.00
--52.80,33.60,1.00,0.00,1.00
-134.40,-33.60,1.00,0.00,1.00
--43.20,28.80,1.00,0.00,1.00
-144.00,-28.80,1.00,0.00,1.00
--33.60,24.00,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
--24.00,19.20,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
-168.00,-9.60,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
-14.40,-9.60,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
-19.20,-19.20,1.00,0.00,1.00
--153.60,19.20,1.00,0.00,1.00
-28.80,-24.00,1.00,0.00,1.00
--148.80,24.00,1.00,0.00,1.00
-38.40,-28.80,1.00,0.00,1.00
--139.20,28.80,1.00,0.00,1.00
-48.00,-33.60,1.00,0.00,1.00
--129.60,33.60,1.00,0.00,1.00
-57.60,-38.40,1.00,0.00,1.00
--115.20,38.40,1.00,0.00,1.00
-67.20,-38.40,1.00,0.00,1.00
--105.60,38.40,1.00,0.00,1.00
-81.60,-43.20,1.00,0.00,1.00
--91.20,43.20,1.00,0.00,1.00
-96.00,-43.20,1.00,0.00,1.00
--76.80,43.20,1.00,0.00,1.00
-105.60,-38.40,1.00,0.00,1.00
--67.20,38.40,1.00,0.00,1.00
-120.00,-38.40,1.00,0.00,1.00
--52.80,33.60,1.00,0.00,1.00
-129.60,-33.60,1.00,0.00,1.00
--43.20,33.60,1.00,0.00,1.00
-139.20,-28.80,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
-148.80,-24.00,1.00,0.00,1.00
--28.80,19.20,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
--19.20,14.40,1.00,0.00,1.00
-163.20,-14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
--177.60,4.80,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--168.00,9.60,1.00,0.00,1.00
-14.40,-14.40,1.00,0.00,1.00
--163.20,19.20,1.00,0.00,1.00
-19.20,-19.20,1.00,0.00,1.00
--153.60,24.00,1.00,0.00,1.00
-28.80,-28.80,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
-38.40,-33.60,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
-48.00,-38.40,1.00,0.00,1.00
--124.80,38.40,1.00,0.00,1.00
-57.60,-43.20,1.00,0.00,1.00
--115.20,43.20,1.00,0.00,1.00
-72.00,-43.20,1.00,0.00,1.00
--100.80,43.20,1.00,0.00,1.00
-86.40,-48.00,1.00,0.00,1.00
--86.40,48.00,1.00,0.00,1.00
-100.80,-48.00,1.00,0.00,1.00
--76.80,43.20,1.00,0.00,1.00
-110.40,-43.20,1.00,0.00,1.00
--62.40,43.20,1.00,0.00,1.00
-124.80,-38.40,1.00,0.00,1.00
--48.00,38.40,1.00,0.00,1.00
-134.40,-38.40,1.00,0.00,1.00
--38.40,33.60,1.00,0.00,1.00
-144.00,-28.80,1.00,0.00,1.00
--28.80,28.80,1.00,0.00,1.00
-153.60,-24.00,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
-163.20,-19.20,1.00,0.00,1.00
--14.40,14.40,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--0.00,0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
-4.80,-4.80,1.00,0.00,1.00
--172.80,9.60,1.00,0.00,1.00
-9.60,-14.40,1.00,0.00,1.00
--163.20,14.40,1.00,0.00,1.00
-19.20,-19.20,1.00,0.00,1.00
--158.40,24.00,1.00,0.00,1.00
-28.80,-24.00,1.00,0.00,1.00
--148.80,28.80,1.00,0.00,1.00
-33.60,-28.80,1.00,0.00,1.00
--139.20,33.60,1.00,0.00,1.00
-43.20,-38.40,1.00,0.00,1.00
--129.60,38.40,1.00,0.00,1.00
-57.60,-38.40,1.00,0.00,1.00
--120.00,43.20,1.00,0.00,1.00
-67.20,-43.20,1.00,0.00,1.00
--105.60,43.20,1.00,0.00,1.00
-81.60,-48.00,1.00,0.00,1.00
--91.20,48.00,1.00,0.00,1.00
-96.00,-48.00,1.00,0.00,1.00
--76.80,43.20,1.00,0.00,1.00
-110.40,-43.20,1.00,0.00,1.00
--67.20,43.20,1.00,0.00,1.00
-120.00,-43.20,1.00,0.00,1.00
--52.80,38.40,1.00,0.00,1.00
-134.40,-38.40,1.00,0.00,1.00
--43.20,33.60,1.00,0.00,1.00
-144.00,-33.60,1.00,0.00,1.00
--33.60,28.80,1.00,0.00,1.00
-153.60,-28.80,1.00,0.00,1.00
--24.00,24.00,1.00,0.00,1.00
-158.40,-19.20,1.00,0.00,1.00
--19.20,19.20,1.00,0.00,1.00
-168.00,-14.40,1.00,0.00,1.00
--9.60,9.60,1.00,0.00,1.00
-172.80,-4.80,1.00,0.00,1.00
--4.80,4.80,1.00,0.00,1.00
+0.00,0.00,0.00,0.00,1.00,-0.00,0.00,0
+-177.60,-4.80,16.00,0.00,1.00,-0.00,0.00,0
+4.80,4.80,0.02,0.00,1.00,-0.00,0.00,0
+-168.00,-9.60,15.98,0.00,1.00,-0.00,0.00,0
+14.40,14.40,0.04,0.00,1.00,-0.00,0.00,0
+-163.20,-14.40,15.96,0.00,1.00,-0.00,0.00,0
+19.20,19.20,0.06,0.00,1.00,-0.00,0.00,0
+-153.60,-24.00,15.94,0.00,1.00,-0.00,0.00,0
+28.80,24.00,0.09,0.00,1.00,-0.00,0.00,0
+-148.80,-28.80,15.91,0.00,1.00,-0.00,0.00,0
+38.40,33.60,0.11,0.00,1.00,-0.00,0.00,0
+-139.20,-33.60,15.89,0.00,1.00,-0.00,0.00,0
+48.00,38.40,0.13,0.00,1.00,-0.00,0.00,0
+-124.80,-38.40,15.87,0.00,1.00,-0.00,0.00,0
+57.60,38.40,0.15,0.00,1.00,-0.00,0.00,0
+-115.20,-43.20,15.85,0.00,1.00,-0.00,0.00,0
+72.00,43.20,0.17,0.00,1.00,-0.00,0.00,0
+-100.80,-43.20,15.83,0.00,1.00,-0.00,0.00,0
+86.40,43.20,0.19,0.00,1.00,-0.00,0.00,0
+-86.40,-43.20,15.81,0.00,1.00,-177.60,0.00,0
+100.80,43.20,0.21,0.00,1.00,-177.60,0.00,0
+-76.80,-43.20,15.79,0.00,1.00,-177.60,0.00,0
+110.40,43.20,0.23,0.00,1.00,-177.60,0.00,0
+-62.40,-43.20,15.77,0.00,1.00,-177.60,0.00,0
+124.80,38.40,0.26,0.00,1.00,-177.60,0.00,0
+-52.80,-38.40,15.74,0.00,1.00,177.60,0.00,0
+134.40,33.60,0.28,0.00,1.00,177.60,0.00,0
+-38.40,-33.60,15.72,0.00,1.00,177.60,0.00,0
+144.00,28.80,0.30,0.00,1.00,177.60,0.00,0
+-33.60,-28.80,15.70,0.00,1.00,177.60,0.00,0
+153.60,24.00,0.32,0.00,1.00,177.60,0.00,0
+-24.00,-19.20,15.68,0.00,1.00,177.60,0.00,0
+158.40,19.20,0.34,0.00,1.00,177.60,0.00,0
+-14.40,-14.40,15.66,0.00,1.00,177.60,0.00,0
+168.00,9.60,0.36,0.00,1.00,177.60,0.00,0
+-9.60,-9.60,15.64,0.00,1.00,177.60,0.00,0
+172.80,4.80,0.38,0.00,1.00,177.60,0.00,0
+-0.00,-0.00,15.62,0.00,1.00,177.60,0.00,0
+-177.60,-0.00,0.41,0.00,1.00,-177.60,0.00,0
+4.80,4.80,15.59,0.00,1.00,-177.60,0.00,0
+-172.80,-9.60,0.43,0.00,1.00,-177.60,0.00,0
+14.40,9.60,15.57,0.00,1.00,-177.60,0.00,0
+-163.20,-14.40,0.45,0.00,1.00,-177.60,0.00,0
+19.20,19.20,15.55,0.00,1.00,-177.60,0.00,0
+-158.40,-19.20,0.47,0.00,1.00,-177.60,0.00,0
+28.80,24.00,15.53,0.00,1.00,-177.60,0.00,0
+-148.80,-28.80,0.49,0.00,1.00,-177.60,0.00,0
+33.60,28.80,15.51,0.00,1.00,-177.60,0.00,0
+-139.20,-33.60,0.51,0.00,1.00,-177.60,0.00,0
+43.20,33.60,15.49,0.00,1.00,-177.60,0.00,0
+-129.60,-38.40,0.53,0.00,1.00,-177.60,0.00,0
+57.60,38.40,15.47,0.00,1.00,177.60,0.00,0
+-120.00,-43.20,0.56,0.00,1.00,177.60,0.00,0
+67.20,43.20,15.44,0.00,1.00,177.60,0.00,0
+-105.60,-43.20,0.58,0.00,1.00,177.60,0.00,0
+81.60,43.20,15.42,0.00,1.00,177.60,0.00,0
+-91.20,-43.20,0.60,0.00,1.00,177.60,0.00,0
+96.00,43.20,15.40,0.00,1.00,0.00,0.00,0
+-76.80,-43.20,0.62,0.00,1.00,0.00,0.00,0
+110.40,43.20,15.38,0.00,1.00,0.00,0.00,0
+-67.20,-43.20,0.64,0.00,1.00,0.00,0.00,0
+120.00,38.40,15.36,0.00,1.00,0.00,0.00,0
+-52.80,-38.40,0.66,0.00,1.00,0.00,0.00,0
+129.60,38.40,15.34,0.00,1.00,0.00,0.00,0
+-43.20,-33.60,0.68,0.00,1.00,0.00,0.00,0
+144.00,33.60,15.32,0.00,1.00,0.00,0.00,0
+-33.60,-28.80,0.70,0.00,1.00,0.00,0.00,0
+148.80,24.00,15.30,0.00,1.00,0.00,0.00,0
+-24.00,-24.00,0.73,0.00,1.00,0.00,0.00,0
+158.40,19.20,15.27,0.00,1.00,0.00,0.00,0
+-19.20,-14.40,0.75,0.00,1.00,0.00,0.00,0
+168.00,14.40,15.25,0.00,1.00,0.00,0.00,0
+-9.60,-9.60,0.77,0.00,1.00,0.00,0.00,0
+172.80,4.80,15.23,0.00,1.00,0.00,0.00,0
+-4.80,-4.80,0.79,0.00,1.00,0.00,0.00,0
+0.00,0.00,15.21,0.00,1.00,0.00,0.00,0
+-177.60,-4.80,0.81,0.00,1.00,0.00,-0.00,0
+9.60,4.80,15.19,0.00,1.00,0.00,-0.00,0
+-168.00,-9.60,0.83,0.00,1.00,0.00,-0.00,0
+14.40,14.40,15.17,0.00,1.00,0.00,-0.00,0
+-163.20,-14.40,0.85,0.00,1.00,0.00,-0.00,0
+24.00,19.20,15.15,0.00,1.00,4.80,-0.00,0
+-153.60,-19.20,0.88,0.00,1.00,4.80,-4.80,0
+28.80,24.00,15.12,0.00,1.00,4.80,-4.80,0
+-144.00,-24.00,0.90,0.00,1.00,4.80,-4.80,0
+38.40,28.80,15.10,0.00,1.00,4.80,-4.80,0
+-134.40,-28.80,0.92,0.00,1.00,4.80,-4.80,0
+48.00,33.60,15.08,0.00,1.00,9.60,-4.80,0
+-124.80,-33.60,0.94,0.00,1.00,9.60,-4.80,0
+62.40,38.40,15.06,0.00,1.00,9.60,-4.80,0
+-115.20,-38.40,0.96,0.00,1.00,14.40,-4.80,0
+72.00,38.40,15.04,0.00,1.00,19.20,-4.80,0
+-100.80,-38.40,0.98,0.00,1.00,28.80,-4.80,0
+86.40,38.40,15.02,0.00,1.00,52.80,-4.80,0
+-86.40,-38.40,1.00,0.00,1.00,105.60,-4.80,0
+96.00,38.40,15.00,0.00,1.00,139.20,-4.80,0
+-76.80,-38.40,1.03,0.00,1.00,158.40,-4.80,0
+110.40,38.40,14.97,0.00,1.00,163.20,-4.80,0
+-62.40,-38.40,1.05,0.00,1.00,168.00,-4.80,0
+120.00,33.60,14.95,0.00,1.00,168.00,-4.80,0
+-52.80,-33.60,1.07,0.00,1.00,172.80,-4.80,0
+134.40,33.60,14.93,0.00,1.00,172.80,-4.80,0
+-43.20,-28.80,1.09,0.00,1.00,172.80,-4.80,0
+144.00,28.80,14.91,0.00,1.00,172.80,-4.80,0
+-33.60,-24.00,1.11,0.00,1.00,177.60,-4.80,0
+148.80,24.00,14.89,0.00,1.00,177.60,-4.80,0
+-24.00,-19.20,1.13,0.00,1.00,177.60,-4.80,0
+158.40,14.40,14.87,0.00,1.00,177.60,-0.00,0
+-19.20,-14.40,1.15,0.00,1.00,177.60,-0.00,0
+168.00,9.60,14.85,0.00,1.00,177.60,-0.00,0
+-9.60,-9.60,1.17,0.00,1.00,177.60,-0.00,0
+172.80,4.80,14.83,0.00,1.00,177.60,-0.00,0
+-0.00,-0.00,1.20,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,14.80,0.00,1.00,-177.60,0.00,0
+4.80,4.80,1.22,0.00,1.00,-177.60,0.00,0
+-172.80,-9.60,14.78,0.00,1.00,-177.60,0.00,0
+14.40,9.60,1.24,0.00,1.00,-177.60,0.00,0
+-163.20,-14.40,14.76,0.00,1.00,-177.60,0.00,0
+19.20,14.40,1.26,0.00,1.00,-177.60,0.00,0
+-153.60,-19.20,14.74,0.00,1.00,-177.60,4.80,0
+28.80,24.00,1.28,0.00,1.00,-177.60,4.80,0
+-148.80,-24.00,14.72,0.00,1.00,-177.60,4.80,0
+38.40,28.80,1.30,0.00,1.00,-172.80,4.80,0
+-139.20,-28.80,14.70,0.00,1.00,-172.80,4.80,0
+48.00,33.60,1.32,0.00,1.00,-172.80,4.80,0
+-124.80,-33.60,14.68,0.00,1.00,-172.80,4.80,0
+57.60,33.60,1.35,0.00,1.00,-168.00,4.80,0
+-115.20,-38.40,14.65,0.00,1.00,-168.00,4.80,0
+72.00,38.40,1.37,0.00,1.00,-163.20,4.80,0
+-105.60,-38.40,14.63,0.00,1.00,-158.40,4.80,0
+81.60,38.40,1.39,0.00,1.00,-139.20,4.80,0
+-91.20,-38.40,14.61,0.00,1.00,-105.60,4.80,0
+96.00,38.40,1.41,0.00,1.00,-52.80,4.80,0
+-76.80,-38.40,14.59,0.00,1.00,-28.80,4.80,0
+105.60,38.40,1.43,0.00,1.00,-19.20,4.80,0
+-67.20,-38.40,14.57,0.00,1.00,-14.40,4.80,0
+120.00,38.40,1.45,0.00,1.00,-9.60,4.80,0
+-57.60,-33.60,14.55,0.00,1.00,-9.60,4.80,0
+129.60,33.60,1.47,0.00,1.00,-9.60,4.80,0
+-43.20,-28.80,14.53,0.00,1.00,-4.80,4.80,0
+139.20,28.80,1.50,0.00,1.00,-4.80,4.80,0
+-33.60,-24.00,14.50,0.00,1.00,-4.80,4.80,0
+148.80,24.00,1.52,0.00,1.00,-4.80,4.80,0
+-28.80,-19.20,14.48,0.00,1.00,-4.80,4.80,0
+158.40,19.20,1.54,0.00,1.00,-4.80,0.00,0
+-19.20,-14.40,14.46,0.00,1.00,-0.00,0.00,0
+163.20,14.40,1.56,0.00,1.00,-0.00,0.00,0
+-9.60,-9.60,14.44,0.00,1.00,-0.00,0.00,0
+172.80,4.80,1.58,0.00,1.00,-0.00,0.00,0
+-4.80,-4.80,14.42,0.00,1.00,-0.00,0.00,0
+0.00,0.00,1.60,0.00,1.00,0.00,0.00,0
+-177.60,-4.80,14.40,0.00,1.00,0.00,-0.00,0
+9.60,4.80,1.62,0.00,1.00,0.00,-0.00,0
+-168.00,-9.60,14.38,0.00,1.00,4.80,-0.00,0
+14.40,9.60,1.64,0.00,1.00,4.80,-4.80,0
+-158.40,-14.40,14.36,0.00,1.00,4.80,-4.80,0
+24.00,14.40,1.67,0.00,1.00,4.80,-4.80,0
+-153.60,-19.20,14.33,0.00,1.00,4.80,-4.80,0
+33.60,19.20,1.69,0.00,1.00,9.60,-4.80,0
+-144.00,-24.00,14.31,0.00,1.00,9.60,-4.80,0
+43.20,24.00,1.71,0.00,1.00,9.60,-4.80,0
+-134.40,-28.80,14.29,0.00,1.00,14.40,-9.60,0
+52.80,28.80,1.73,0.00,1.00,14.40,-9.60,0
+-124.80,-28.80,14.27,0.00,1.00,19.20,-9.60,0
+62.40,33.60,1.75,0.00,1.00,24.00,-9.60,0
+-110.40,-33.60,14.25,0.00,1.00,28.80,-9.60,0
+72.00,33.60,1.77,0.00,1.00,33.60,-9.60,0
+-100.80,-33.60,14.23,0.00,1.00,48.00,-9.60,0
+86.40,33.60,1.79,0.00,1.00,67.20,-9.60,0
+-86.40,-33.60,14.21,0.00,1.00,96.00,-9.60,0
+96.00,33.60,1.82,0.00,1.00,120.00,-9.60,0
+-76.80,-33.60,14.18,0.00,1.00,139.20,-9.60,0
+110.40,33.60,1.84,0.00,1.00,148.80,-9.60,0
+-67.20,-33.60,14.16,0.00,1.00,153.60,-9.60,0
+120.00,33.60,1.86,0.00,1.00,158.40,-9.60,0
+-52.80,-28.80,14.14,0.00,1.00,163.20,-9.60,0
+129.60,28.80,1.88,0.00,1.00,168.00,-9.60,0
+-43.20,-28.80,14.12,0.00,1.00,168.00,-9.60,0
+139.20,24.00,1.90,0.00,1.00,168.00,-4.80,0
+-33.60,-24.00,14.10,0.00,1.00,172.80,-4.80,0
+148.80,19.20,1.92,0.00,1.00,172.80,-4.80,0
+-24.00,-19.20,14.08,0.00,1.00,172.80,-4.80,0
+158.40,14.40,1.94,0.00,1.00,177.60,-4.80,0
+-19.20,-14.40,14.06,0.00,1.00,177.60,-4.80,0
+168.00,9.60,1.97,0.00,1.00,177.60,-4.80,0
+-9.60,-4.80,14.03,0.00,1.00,177.60,-0.00,0
+172.80,4.80,1.99,0.00,1.00,177.60,-0.00,0
+-0.00,-0.00,14.01,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,2.01,0.00,1.00,-177.60,0.00,0
+4.80,4.80,13.99,0.00,1.00,-177.60,0.00,0
+-168.00,-4.80,2.03,0.00,1.00,-177.60,0.00,0
+14.40,9.60,13.97,0.00,1.00,-177.60,4.80,0
+-163.20,-14.40,2.05,0.00,1.00,-177.60,4.80,0
+24.00,14.40,13.95,0.00,1.00,-177.60,4.80,0
+-153.60,-19.20,2.07,0.00,1.00,-172.80,4.80,0
+28.80,19.20,13.93,0.00,1.00,-172.80,4.80,0
+-144.00,-24.00,2.09,0.00,1.00,-172.80,4.80,0
+38.40,24.00,13.91,0.00,1.00,-168.00,4.80,0
+-134.40,-28.80,2.11,0.00,1.00,-168.00,9.60,0
+48.00,28.80,13.89,0.00,1.00,-168.00,9.60,0
+-124.80,-28.80,2.14,0.00,1.00,-163.20,9.60,0
+62.40,33.60,13.86,0.00,1.00,-158.40,9.60,0
+-115.20,-33.60,2.16,0.00,1.00,-153.60,9.60,0
+72.00,33.60,13.84,0.00,1.00,-148.80,9.60,0
+-100.80,-33.60,2.18,0.00,1.00,-139.20,9.60,0
+81.60,33.60,13.82,0.00,1.00,-120.00,9.60,0
+-91.20,-33.60,2.20,0.00,1.00,-96.00,9.60,0
+96.00,33.60,13.80,0.00,1.00,-67.20,9.60,0
+-81.60,-33.60,2.22,0.00,1.00,-48.00,9.60,0
+105.60,33.60,13.78,0.00,1.00,-33.60,9.60,0
+-67.20,-33.60,2.24,0.00,1.00,-28.80,9.60,0
+115.20,33.60,13.76,0.00,1.00,-24.00,9.60,0
+-57.60,-28.80,2.26,0.00,1.00,-19.20,9.60,0
+129.60,28.80,13.74,0.00,1.00,-14.40,9.60,0
+-48.00,-28.80,2.29,0.00,1.00,-14.40,9.60,0
+139.20,24.00,13.71,0.00,1.00,-9.60,4.80,0
+-38.40,-24.00,2.31,0.00,1.00,-9.60,4.80,0
+148.80,19.20,13.69,0.00,1.00,-9.60,4.80,0
+-28.80,-19.20,2.33,0.00,1.00,-4.80,4.80,0
+153.60,14.40,13.67,0.00,1.00,-4.80,4.80,0
+-19.20,-14.40,2.35,0.00,1.00,-4.80,4.80,0
+163.20,9.60,13.65,0.00,1.00,-4.80,4.80,0
+-9.60,-9.60,2.37,0.00,1.00,-4.80,0.00,0
+172.80,4.80,13.63,0.00,1.00,-0.00,0.00,0
+-4.80,-4.80,2.39,0.00,1.00,-0.00,0.00,0
+0.00,0.00,13.61,0.00,1.00,0.00,0.00,0
+-177.60,-4.80,2.41,0.00,1.00,0.00,-0.00,0
+9.60,4.80,13.59,0.00,1.00,4.80,-0.00,0
+-168.00,-9.60,2.44,0.00,1.00,4.80,-4.80,0
+14.40,9.60,13.56,0.00,1.00,4.80,-4.80,0
+-158.40,-9.60,2.46,0.00,1.00,4.80,-4.80,0
+24.00,14.40,13.54,0.00,1.00,9.60,-4.80,0
+-148.80,-14.40,2.48,0.00,1.00,9.60,-9.60,0
+33.60,19.20,13.52,0.00,1.00,9.60,-9.60,0
+-139.20,-19.20,2.50,0.00,1.00,14.40,-9.60,0
+43.20,24.00,13.50,0.00,1.00,14.40,-9.60,0
+-129.60,-24.00,2.52,0.00,1.00,19.20,-9.60,0
+52.80,24.00,13.48,0.00,1.00,19.20,-14.40,0
+-120.00,-28.80,2.54,0.00,1.00,24.00,-14.40,0
+62.40,28.80,13.46,0.00,1.00,28.80,-14.40,0
+-110.40,-28.80,2.56,0.00,1.00,38.40,-14.40,0
+76.80,28.80,13.44,0.00,1.00,48.00,-14.40,0
+-100.80,-28.80,2.58,0.00,1.00,57.60,-14.40,0
+86.40,28.80,13.42,0.00,1.00,76.80,-14.40,0
+-86.40,-28.80,2.61,0.00,1.00,96.00,-14.40,0
+96.00,28.80,13.39,0.00,1.00,115.20,-14.40,0
+-76.80,-28.80,2.63,0.00,1.00,129.60,-14.40,0
+105.60,28.80,13.37,0.00,1.00,139.20,-14.40,0
+-67.20,-28.80,2.65,0.00,1.00,144.00,-14.40,0
+120.00,28.80,13.35,0.00,1.00,153.60,-14.40,0
+-57.60,-24.00,2.67,0.00,1.00,158.40,-14.40,0
+129.60,24.00,13.33,0.00,1.00,158.40,-9.60,0
+-48.00,-24.00,2.69,0.00,1.00,163.20,-9.60,0
+139.20,19.20,13.31,0.00,1.00,168.00,-9.60,0
+-38.40,-19.20,2.71,0.00,1.00,168.00,-9.60,0
+148.80,19.20,13.29,0.00,1.00,168.00,-9.60,0
+-28.80,-14.40,2.73,0.00,1.00,172.80,-9.60,0
+158.40,14.40,13.27,0.00,1.00,172.80,-4.80,0
+-19.20,-9.60,2.76,0.00,1.00,172.80,-4.80,0
+163.20,9.60,13.24,0.00,1.00,177.60,-4.80,0
+-9.60,-4.80,2.78,0.00,1.00,177.60,-4.80,0
+172.80,4.80,13.22,0.00,1.00,177.60,-0.00,0
+-0.00,-0.00,2.80,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,13.20,0.00,1.00,-177.60,0.00,0
+4.80,4.80,2.82,0.00,1.00,-177.60,0.00,0
+-168.00,-4.80,13.18,0.00,1.00,-177.60,4.80,0
+14.40,9.60,2.84,0.00,1.00,-177.60,4.80,0
+-163.20,-9.60,13.16,0.00,1.00,-172.80,4.80,0
+24.00,14.40,2.86,0.00,1.00,-172.80,4.80,0
+-153.60,-14.40,13.14,0.00,1.00,-172.80,9.60,0
+33.60,19.20,2.88,0.00,1.00,-168.00,9.60,0
+-144.00,-19.20,13.12,0.00,1.00,-168.00,9.60,0
+43.20,19.20,2.91,0.00,1.00,-168.00,9.60,0
+-134.40,-24.00,13.09,0.00,1.00,-163.20,9.60,0
+52.80,24.00,2.93,0.00,1.00,-158.40,9.60,0
+-124.80,-24.00,13.07,0.00,1.00,-158.40,14.40,0
+62.40,28.80,2.95,0.00,1.00,-153.60,14.40,0
+-115.20,-28.80,13.05,0.00,1.00,-144.00,14.40,0
+72.00,28.80,2.97,0.00,1.00,-139.20,14.40,0
+-100.80,-28.80,13.03,0.00,1.00,-129.60,14.40,0
+81.60,28.80,2.99,0.00,1.00,-115.20,14.40,0
+-91.20,-28.80,13.01,0.00,1.00,-96.00,14.40,0
+96.00,28.80,3.01,0.00,1.00,-76.80,14.40,0
+-81.60,-28.80,12.99,0.00,1.00,-57.60,14.40,0
+105.60,28.80,3.03,0.00,1.00,-48.00,14.40,0
+-67.20,-28.80,12.97,0.00,1.00,-38.40,14.40,0
+115.20,28.80,3.05,0.00,1.00,-28.80,14.40,0
+-57.60,-28.80,12.95,0.00,1.00,-24.00,14.40,0
+124.80,24.00,3.08,0.00,1.00,-19.20,14.40,0
+-48.00,-24.00,12.92,0.00,1.00,-19.20,9.60,0
+134.40,24.00,3.10,0.00,1.00,-14.40,9.60,0
+-38.40,-19.20,12.90,0.00,1.00,-14.40,9.60,0
+144.00,19.20,3.12,0.00,1.00,-9.60,9.60,0
+-28.80,-14.40,12.88,0.00,1.00,-9.60,9.60,0
+153.60,14.40,3.14,0.00,1.00,-9.60,4.80,0
+-19.20,-9.60,12.86,0.00,1.00,-4.80,4.80,0
+163.20,9.60,3.16,0.00,1.00,-4.80,4.80,0
+-14.40,-9.60,12.84,0.00,1.00,-4.80,4.80,0
+172.80,4.80,3.18,0.00,1.00,-4.80,0.00,0
+-4.80,-4.80,12.82,0.00,1.00,-0.00,0.00,0
+0.00,0.00,3.20,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,12.80,0.00,1.00,0.00,-0.00,0
+9.60,4.80,3.23,0.00,1.00,4.80,-4.80,0
+-168.00,-4.80,12.77,0.00,1.00,4.80,-4.80,0
+19.20,9.60,3.25,0.00,1.00,4.80,-4.80,0
+-158.40,-9.60,12.75,0.00,1.00,9.60,-9.60,0
+24.00,14.40,3.27,0.00,1.00,9.60,-9.60,0
+-148.80,-14.40,12.73,0.00,1.00,14.40,-9.60,0
+33.60,14.40,3.29,0.00,1.00,14.40,-9.60,0
+-139.20,-19.20,12.71,0.00,1.00,19.20,-14.40,0
+43.20,19.20,3.31,0.00,1.00,19.20,-14.40,0
+-129.60,-19.20,12.69,0.00,1.00,24.00,-14.40,0
+52.80,19.20,3.33,0.00,1.00,28.80,-14.40,0
+-120.00,-24.00,12.67,0.00,1.00,33.60,-19.20,0
+67.20,24.00,3.35,0.00,1.00,38.40,-19.20,0
+-110.40,-24.00,12.65,0.00,1.00,43.20,-19.20,0
+76.80,24.00,3.38,0.00,1.00,52.80,-19.20,0
+-100.80,-24.00,12.62,0.00,1.00,67.20,-19.20,0
+86.40,24.00,3.40,0.00,1.00,76.80,-19.20,0
+-86.40,-24.00,12.60,0.00,1.00,96.00,-19.20,0
+96.00,24.00,3.42,0.00,1.00,105.60,-19.20,0
+-76.80,-24.00,12.58,0.00,1.00,120.00,-19.20,0
+105.60,24.00,3.44,0.00,1.00,129.60,-19.20,0
+-67.20,-24.00,12.56,0.00,1.00,139.20,-19.20,0
+115.20,24.00,3.46,0.00,1.00,144.00,-19.20,0
+-57.60,-24.00,12.54,0.00,1.00,148.80,-14.40,0
+129.60,19.20,3.48,0.00,1.00,153.60,-14.40,0
+-48.00,-19.20,12.52,0.00,1.00,158.40,-14.40,0
+139.20,19.20,3.50,0.00,1.00,163.20,-14.40,0
+-38.40,-14.40,12.50,0.00,1.00,163.20,-14.40,0
+148.80,14.40,3.52,0.00,1.00,168.00,-9.60,0
+-28.80,-14.40,12.48,0.00,1.00,168.00,-9.60,0
+153.60,9.60,3.55,0.00,1.00,172.80,-9.60,0
+-19.20,-9.60,12.45,0.00,1.00,172.80,-4.80,0
+163.20,9.60,3.57,0.00,1.00,172.80,-4.80,0
+-9.60,-4.80,12.43,0.00,1.00,177.60,-4.80,0
+172.80,4.80,3.59,0.00,1.00,177.60,-0.00,0
+-0.00,-0.00,12.41,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,3.61,0.00,1.00,-177.60,0.00,0
+4.80,4.80,12.39,0.00,1.00,-177.60,0.00,0
+-168.00,-4.80,3.63,0.00,1.00,-177.60,4.80,0
+14.40,9.60,12.37,0.00,1.00,-172.80,4.80,0
+-158.40,-9.60,3.65,0.00,1.00,-172.80,4.80,0
+24.00,9.60,12.35,0.00,1.00,-172.80,9.60,0
+-153.60,-14.40,3.67,0.00,1.00,-168.00,9.60,0
+33.60,14.40,12.33,0.00,1.00,-168.00,9.60,0
+-144.00,-14.40,3.70,0.00,1.00,-163.20,14.40,0
+43.20,19.20,12.30,0.00,1.00,-163.20,14.40,0
+-134.40,-19.20,3.72,0.00,1.00,-158.40,14.40,0
+52.80,19.20,12.28,0.00,1.00,-153.60,14.40,0
+-124.80,-24.00,3.74,0.00,1.00,-148.80,14.40,0
+62.40,24.00,12.26,0.00,1.00,-144.00,19.20,0
+-110.40,-24.00,3.76,0.00,1.00,-139.20,19.20,0
+72.00,24.00,12.24,0.00,1.00,-129.60,19.20,0
+-100.80,-24.00,3.78,0.00,1.00,-120.00,19.20,0
+81.60,24.00,12.22,0.00,1.00,-105.60,19.20,0
+-91.20,-24.00,3.80,0.00,1.00,-96.00,19.20,0
+96.00,24.00,12.20,0.00,1.00,-76.80,19.20,0
+-81.60,-24.00,3.82,0.00,1.00,-67.20,19.20,0
+105.60,24.00,12.18,0.00,1.00,-52.80,19.20,0
+-72.00,-24.00,3.85,0.00,1.00,-43.20,19.20,0
+115.20,24.00,12.15,0.00,1.00,-38.40,19.20,0
+-57.60,-24.00,3.87,0.00,1.00,-33.60,19.20,0
+124.80,19.20,12.13,0.00,1.00,-28.80,14.40,0
+-48.00,-19.20,3.89,0.00,1.00,-24.00,14.40,0
+134.40,19.20,12.11,0.00,1.00,-19.20,14.40,0
+-38.40,-19.20,3.91,0.00,1.00,-19.20,14.40,0
+144.00,14.40,12.09,0.00,1.00,-14.40,9.60,0
+-28.80,-14.40,3.93,0.00,1.00,-14.40,9.60,0
+153.60,14.40,12.07,0.00,1.00,-9.60,9.60,0
+-24.00,-9.60,3.95,0.00,1.00,-9.60,9.60,0
+163.20,9.60,12.05,0.00,1.00,-4.80,4.80,0
+-14.40,-4.80,3.97,0.00,1.00,-4.80,4.80,0
+172.80,4.80,12.03,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,3.99,0.00,1.00,-0.00,0.00,0
+0.00,0.00,12.01,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,4.02,0.00,1.00,0.00,-0.00,0
+9.60,4.80,11.98,0.00,1.00,4.80,-4.80,0
+-168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0
+19.20,4.80,11.96,0.00,1.00,9.60,-9.60,0
+-158.40,-9.60,4.06,0.00,1.00,9.60,-9.60,0
+28.80,9.60,11.94,0.00,1.00,14.40,-9.60,0
+-148.80,-9.60,4.08,0.00,1.00,14.40,-14.40,0
+38.40,14.40,11.92,0.00,1.00,19.20,-14.40,0
+-139.20,-14.40,4.10,0.00,1.00,19.20,-14.40,0
+48.00,14.40,11.90,0.00,1.00,24.00,-19.20,0
+-129.60,-14.40,4.12,0.00,1.00,28.80,-19.20,0
+57.60,19.20,11.88,0.00,1.00,33.60,-19.20,0
+-120.00,-19.20,4.14,0.00,1.00,38.40,-19.20,0
+67.20,19.20,11.86,0.00,1.00,43.20,-24.00,0
+-110.40,-19.20,4.17,0.00,1.00,52.80,-24.00,0
+76.80,19.20,11.83,0.00,1.00,62.40,-24.00,0
+-100.80,-19.20,4.19,0.00,1.00,72.00,-24.00,0
+86.40,19.20,11.81,0.00,1.00,81.60,-24.00,0
+-86.40,-19.20,4.21,0.00,1.00,91.20,-24.00,0
+96.00,19.20,11.79,0.00,1.00,105.60,-24.00,0
+-76.80,-19.20,4.23,0.00,1.00,115.20,-24.00,0
+105.60,19.20,11.77,0.00,1.00,124.80,-24.00,0
+-67.20,-19.20,4.25,0.00,1.00,134.40,-24.00,0
+115.20,19.20,11.75,0.00,1.00,139.20,-19.20,0
+-57.60,-19.20,4.27,0.00,1.00,144.00,-19.20,0
+124.80,19.20,11.73,0.00,1.00,148.80,-19.20,0
+-48.00,-14.40,4.29,0.00,1.00,153.60,-19.20,0
+134.40,14.40,11.71,0.00,1.00,158.40,-19.20,0
+-38.40,-14.40,4.32,0.00,1.00,158.40,-14.40,0
+144.00,14.40,11.68,0.00,1.00,163.20,-14.40,0
+-28.80,-9.60,4.34,0.00,1.00,168.00,-14.40,0
+153.60,9.60,11.66,0.00,1.00,168.00,-9.60,0
+-19.20,-9.60,4.36,0.00,1.00,172.80,-9.60,0
+163.20,4.80,11.64,0.00,1.00,172.80,-4.80,0
+-9.60,-4.80,4.38,0.00,1.00,172.80,-4.80,0
+172.80,4.80,11.62,0.00,1.00,177.60,-4.80,0
+-0.00,-0.00,4.40,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,11.60,0.00,1.00,-177.60,0.00,0
+4.80,4.80,4.42,0.00,1.00,-177.60,4.80,0
+-168.00,-4.80,11.58,0.00,1.00,-172.80,4.80,0
+14.40,4.80,4.44,0.00,1.00,-172.80,4.80,0
+-158.40,-9.60,11.56,0.00,1.00,-172.80,9.60,0
+24.00,9.60,4.46,0.00,1.00,-168.00,9.60,0
+-148.80,-9.60,11.54,0.00,1.00,-168.00,14.40,0
+33.60,14.40,4.49,0.00,1.00,-163.20,14.40,0
+-139.20,-14.40,11.51,0.00,1.00,-158.40,14.40,0
+43.20,14.40,4.51,0.00,1.00,-158.40,19.20,0
+-129.60,-14.40,11.49,0.00,1.00,-153.60,19.20,0
+52.80,19.20,4.53,0.00,1.00,-148.80,19.20,0
+-120.00,-19.20,11.47,0.00,1.00,-144.00,19.20,0
+62.40,19.20,4.55,0.00,1.00,-139.20,19.20,0
+-110.40,-19.20,11.45,0.00,1.00,-134.40,24.00,0
+72.00,19.20,4.57,0.00,1.00,-124.80,24.00,0
+-100.80,-19.20,11.43,0.00,1.00,-115.20,24.00,0
+81.60,19.20,4.59,0.00,1.00,-105.60,24.00,0
+-91.20,-19.20,11.41,0.00,1.00,-91.20,24.00,0
+96.00,19.20,4.61,0.00,1.00,-81.60,24.00,0
+-81.60,-19.20,11.39,0.00,1.00,-72.00,24.00,0
+105.60,19.20,4.64,0.00,1.00,-62.40,24.00,0
+-72.00,-19.20,11.36,0.00,1.00,-52.80,24.00,0
+115.20,19.20,4.66,0.00,1.00,-43.20,24.00,0
+-62.40,-19.20,11.34,0.00,1.00,-38.40,19.20,0
+124.80,19.20,4.68,0.00,1.00,-33.60,19.20,0
+-52.80,-14.40,11.32,0.00,1.00,-28.80,19.20,0
+134.40,14.40,4.70,0.00,1.00,-24.00,19.20,0
+-43.20,-14.40,11.30,0.00,1.00,-19.20,14.40,0
+144.00,14.40,4.72,0.00,1.00,-19.20,14.40,0
+-33.60,-9.60,11.28,0.00,1.00,-14.40,14.40,0
+153.60,9.60,4.74,0.00,1.00,-14.40,9.60,0
+-24.00,-9.60,11.26,0.00,1.00,-9.60,9.60,0
+163.20,4.80,4.76,0.00,1.00,-9.60,9.60,0
+-14.40,-4.80,11.24,0.00,1.00,-4.80,4.80,0
+172.80,4.80,4.79,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,11.21,0.00,1.00,-0.00,0.00,0
+0.00,0.00,4.81,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,11.19,0.00,1.00,0.00,-0.00,0
+9.60,4.80,4.83,0.00,1.00,4.80,-4.80,0
+-168.00,-4.80,11.17,0.00,1.00,4.80,-4.80,0
+19.20,4.80,4.85,0.00,1.00,9.60,-9.60,0
+-158.40,-4.80,11.15,0.00,1.00,14.40,-9.60,0
+28.80,9.60,4.87,0.00,1.00,14.40,-14.40,0
+-148.80,-9.60,11.13,0.00,1.00,19.20,-14.40,0
+38.40,9.60,4.89,0.00,1.00,19.20,-19.20,0
+-139.20,-9.60,11.11,0.00,1.00,24.00,-19.20,0
+48.00,9.60,4.91,0.00,1.00,28.80,-19.20,0
+-129.60,-14.40,11.09,0.00,1.00,33.60,-24.00,0
+57.60,14.40,4.93,0.00,1.00,38.40,-24.00,0
+-120.00,-14.40,11.07,0.00,1.00,43.20,-24.00,0
+67.20,14.40,4.96,0.00,1.00,48.00,-24.00,0
+-110.40,-14.40,11.04,0.00,1.00,57.60,-28.80,0
+76.80,14.40,4.98,0.00,1.00,62.40,-28.80,0
+-100.80,-14.40,11.02,0.00,1.00,72.00,-28.80,0
+86.40,14.40,5.00,0.00,1.00,81.60,-28.80,0
+-86.40,-14.40,11.00,0.00,1.00,91.20,-28.80,0
+96.00,14.40,5.02,0.00,1.00,100.80,-28.80,0
+-76.80,-14.40,10.98,0.00,1.00,110.40,-28.80,0
+105.60,14.40,5.04,0.00,1.00,120.00,-28.80,0
+-67.20,-14.40,10.96,0.00,1.00,129.60,-28.80,0
+115.20,14.40,5.06,0.00,1.00,134.40,-24.00,0
+-57.60,-14.40,10.94,0.00,1.00,139.20,-24.00,0
+124.80,14.40,5.08,0.00,1.00,144.00,-24.00,0
+-48.00,-14.40,10.92,0.00,1.00,148.80,-24.00,0
+134.40,9.60,5.11,0.00,1.00,153.60,-19.20,0
+-38.40,-9.60,10.89,0.00,1.00,158.40,-19.20,0
+144.00,9.60,5.13,0.00,1.00,158.40,-14.40,0
+-28.80,-9.60,10.87,0.00,1.00,163.20,-14.40,0
+153.60,4.80,5.15,0.00,1.00,168.00,-14.40,0
+-19.20,-4.80,10.85,0.00,1.00,168.00,-9.60,0
+163.20,4.80,5.17,0.00,1.00,172.80,-9.60,0
+-9.60,-4.80,10.83,0.00,1.00,172.80,-4.80,0
+172.80,0.00,5.19,0.00,1.00,177.60,-4.80,0
+-0.00,-0.00,10.81,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,5.21,0.00,1.00,-177.60,0.00,0
+4.80,0.00,10.79,0.00,1.00,-177.60,4.80,0
+-168.00,-4.80,5.23,0.00,1.00,-172.80,4.80,0
+14.40,4.80,10.77,0.00,1.00,-172.80,9.60,0
+-158.40,-4.80,5.26,0.00,1.00,-168.00,9.60,0
+24.00,4.80,10.74,0.00,1.00,-168.00,14.40,0
+-148.80,-9.60,5.28,0.00,1.00,-163.20,14.40,0
+33.60,9.60,10.72,0.00,1.00,-158.40,14.40,0
+-139.20,-9.60,5.30,0.00,1.00,-158.40,19.20,0
+43.20,9.60,10.70,0.00,1.00,-153.60,19.20,0
+-129.60,-14.40,5.32,0.00,1.00,-148.80,24.00,0
+52.80,14.40,10.68,0.00,1.00,-144.00,24.00,0
+-120.00,-14.40,5.34,0.00,1.00,-139.20,24.00,0
+62.40,14.40,10.66,0.00,1.00,-134.40,24.00,0
+-110.40,-14.40,5.36,0.00,1.00,-129.60,28.80,0
+72.00,14.40,10.64,0.00,1.00,-120.00,28.80,0
+-100.80,-14.40,5.38,0.00,1.00,-110.40,28.80,0
+81.60,14.40,10.62,0.00,1.00,-100.80,28.80,0
+-91.20,-14.40,5.40,0.00,1.00,-91.20,28.80,0
+96.00,14.40,10.60,0.00,1.00,-81.60,28.80,0
+-81.60,-14.40,5.43,0.00,1.00,-72.00,28.80,0
+105.60,14.40,10.57,0.00,1.00,-62.40,28.80,0
+-72.00,-14.40,5.45,0.00,1.00,-57.60,28.80,0
+115.20,14.40,10.55,0.00,1.00,-48.00,24.00,0
+-62.40,-14.40,5.47,0.00,1.00,-43.20,24.00,0
+124.80,14.40,10.53,0.00,1.00,-38.40,24.00,0
+-52.80,-14.40,5.49,0.00,1.00,-33.60,24.00,0
+134.40,9.60,10.51,0.00,1.00,-28.80,19.20,0
+-43.20,-9.60,5.51,0.00,1.00,-24.00,19.20,0
+144.00,9.60,10.49,0.00,1.00,-19.20,19.20,0
+-33.60,-9.60,5.53,0.00,1.00,-19.20,14.40,0
+153.60,9.60,10.47,0.00,1.00,-14.40,14.40,0
+-24.00,-4.80,5.55,0.00,1.00,-14.40,9.60,0
+163.20,4.80,10.45,0.00,1.00,-9.60,9.60,0
+-14.40,-4.80,5.58,0.00,1.00,-4.80,4.80,0
+172.80,4.80,10.42,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,5.60,0.00,1.00,-0.00,0.00,0
+0.00,0.00,10.40,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,5.62,0.00,1.00,4.80,-4.80,0
+9.60,0.00,10.38,0.00,1.00,4.80,-4.80,0
+-168.00,-4.80,5.64,0.00,1.00,9.60,-9.60,0
+19.20,4.80,10.36,0.00,1.00,9.60,-9.60,0
+-158.40,-4.80,5.66,0.00,1.00,14.40,-14.40,0
+28.80,4.80,10.34,0.00,1.00,19.20,-14.40,0
+-148.80,-4.80,5.68,0.00,1.00,19.20,-19.20,0
+38.40,4.80,10.32,0.00,1.00,24.00,-19.20,0
+-139.20,-9.60,5.70,0.00,1.00,28.80,-24.00,0
+48.00,9.60,10.30,0.00,1.00,33.60,-24.00,0
+-129.60,-9.60,5.72,0.00,1.00,38.40,-24.00,0
+57.60,9.60,10.28,0.00,1.00,43.20,-28.80,0
+-120.00,-9.60,5.75,0.00,1.00,48.00,-28.80,0
+67.20,9.60,10.25,0.00,1.00,52.80,-28.80,0
+-110.40,-9.60,5.77,0.00,1.00,57.60,-33.60,0
+76.80,9.60,10.23,0.00,1.00,67.20,-33.60,0
+-100.80,-9.60,5.79,0.00,1.00,76.80,-33.60,0
+86.40,9.60,10.21,0.00,1.00,81.60,-33.60,0
+-86.40,-9.60,5.81,0.00,1.00,91.20,-33.60,0
+96.00,9.60,10.19,0.00,1.00,100.80,-33.60,0
+-76.80,-9.60,5.83,0.00,1.00,110.40,-33.60,0
+105.60,9.60,10.17,0.00,1.00,115.20,-33.60,0
+-67.20,-9.60,5.85,0.00,1.00,124.80,-33.60,0
+115.20,9.60,10.15,0.00,1.00,129.60,-28.80,0
+-57.60,-9.60,5.87,0.00,1.00,134.40,-28.80,0
+124.80,9.60,10.13,0.00,1.00,139.20,-28.80,0
+-48.00,-9.60,5.90,0.00,1.00,144.00,-24.00,0
+134.40,9.60,10.10,0.00,1.00,148.80,-24.00,0
+-38.40,-9.60,5.92,0.00,1.00,153.60,-19.20,0
+144.00,4.80,10.08,0.00,1.00,158.40,-19.20,0
+-28.80,-4.80,5.94,0.00,1.00,163.20,-14.40,0
+153.60,4.80,10.06,0.00,1.00,163.20,-14.40,0
+-19.20,-4.80,5.96,0.00,1.00,168.00,-9.60,0
+163.20,4.80,10.04,0.00,1.00,172.80,-9.60,0
+-9.60,-0.00,5.98,0.00,1.00,172.80,-4.80,0
+172.80,0.00,10.02,0.00,1.00,177.60,-4.80,0
+-0.00,-0.00,6.00,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,10.00,0.00,1.00,-177.60,0.00,0
+4.80,0.00,6.02,0.00,1.00,-177.60,4.80,0
+-168.00,-0.00,9.98,0.00,1.00,-172.80,4.80,0
+14.40,4.80,6.05,0.00,1.00,-172.80,9.60,0
+-158.40,-4.80,9.95,0.00,1.00,-168.00,9.60,0
+24.00,4.80,6.07,0.00,1.00,-163.20,14.40,0
+-148.80,-4.80,9.93,0.00,1.00,-163.20,14.40,0
+33.60,4.80,6.09,0.00,1.00,-158.40,19.20,0
+-139.20,-9.60,9.91,0.00,1.00,-153.60,19.20,0
+43.20,9.60,6.11,0.00,1.00,-148.80,24.00,0
+-129.60,-9.60,9.89,0.00,1.00,-144.00,24.00,0
+52.80,9.60,6.13,0.00,1.00,-139.20,28.80,0
+-120.00,-9.60,9.87,0.00,1.00,-134.40,28.80,0
+62.40,9.60,6.15,0.00,1.00,-129.60,28.80,0
+-110.40,-9.60,9.85,0.00,1.00,-124.80,33.60,0
+72.00,9.60,6.17,0.00,1.00,-115.20,33.60,0
+-100.80,-9.60,9.83,0.00,1.00,-110.40,33.60,0
+81.60,9.60,6.19,0.00,1.00,-100.80,33.60,0
+-91.20,-9.60,9.81,0.00,1.00,-91.20,33.60,0
+96.00,9.60,6.22,0.00,1.00,-81.60,33.60,0
+-81.60,-9.60,9.78,0.00,1.00,-76.80,33.60,0
+105.60,9.60,6.24,0.00,1.00,-67.20,33.60,0
+-72.00,-9.60,9.76,0.00,1.00,-57.60,33.60,0
+115.20,9.60,6.26,0.00,1.00,-52.80,28.80,0
+-62.40,-9.60,9.74,0.00,1.00,-48.00,28.80,0
+124.80,9.60,6.28,0.00,1.00,-43.20,28.80,0
+-52.80,-9.60,9.72,0.00,1.00,-38.40,24.00,0
+134.40,9.60,6.30,0.00,1.00,-33.60,24.00,0
+-43.20,-9.60,9.70,0.00,1.00,-28.80,24.00,0
+144.00,4.80,6.32,0.00,1.00,-24.00,19.20,0
+-33.60,-4.80,9.68,0.00,1.00,-19.20,19.20,0
+153.60,4.80,6.34,0.00,1.00,-19.20,14.40,0
+-24.00,-4.80,9.66,0.00,1.00,-14.40,14.40,0
+163.20,4.80,6.37,0.00,1.00,-9.60,9.60,0
+-14.40,-4.80,9.63,0.00,1.00,-9.60,9.60,0
+172.80,0.00,6.39,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,9.61,0.00,1.00,-4.80,4.80,0
+0.00,0.00,6.41,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,9.59,0.00,1.00,4.80,-4.80,0
+9.60,0.00,6.43,0.00,1.00,4.80,-4.80,0
+-168.00,-0.00,9.57,0.00,1.00,9.60,-9.60,0
+19.20,0.00,6.45,0.00,1.00,14.40,-9.60,0
+-158.40,-4.80,9.55,0.00,1.00,14.40,-14.40,0
+28.80,4.80,6.47,0.00,1.00,19.20,-19.20,0
+-148.80,-4.80,9.53,0.00,1.00,24.00,-19.20,0
+38.40,4.80,6.49,0.00,1.00,24.00,-24.00,0
+-139.20,-4.80,9.51,0.00,1.00,28.80,-24.00,0
+48.00,4.80,6.52,0.00,1.00,33.60,-28.80,0
+-129.60,-4.80,9.48,0.00,1.00,38.40,-28.80,0
+57.60,4.80,6.54,0.00,1.00,43.20,-33.60,0
+-120.00,-4.80,9.46,0.00,1.00,48.00,-33.60,0
+67.20,4.80,6.56,0.00,1.00,57.60,-33.60,0
+-110.40,-4.80,9.44,0.00,1.00,62.40,-38.40,0
+76.80,4.80,6.58,0.00,1.00,67.20,-38.40,0
+-100.80,-4.80,9.42,0.00,1.00,76.80,-38.40,0
+86.40,4.80,6.60,0.00,1.00,86.40,-38.40,0
+-86.40,-4.80,9.40,0.00,1.00,91.20,-38.40,0
+96.00,4.80,6.62,0.00,1.00,100.80,-38.40,0
+-76.80,-4.80,9.38,0.00,1.00,105.60,-38.40,0
+105.60,4.80,6.64,0.00,1.00,115.20,-38.40,0
+-67.20,-4.80,9.36,0.00,1.00,120.00,-33.60,0
+115.20,4.80,6.66,0.00,1.00,124.80,-33.60,0
+-57.60,-4.80,9.34,0.00,1.00,134.40,-33.60,0
+124.80,4.80,6.69,0.00,1.00,139.20,-28.80,0
+-48.00,-4.80,9.31,0.00,1.00,144.00,-28.80,0
+134.40,4.80,6.71,0.00,1.00,148.80,-24.00,0
+-38.40,-4.80,9.29,0.00,1.00,153.60,-24.00,0
+144.00,4.80,6.73,0.00,1.00,153.60,-19.20,0
+-28.80,-4.80,9.27,0.00,1.00,158.40,-19.20,0
+153.60,4.80,6.75,0.00,1.00,163.20,-14.40,0
+-19.20,-4.80,9.25,0.00,1.00,168.00,-14.40,0
+163.20,0.00,6.77,0.00,1.00,168.00,-9.60,0
+-9.60,-0.00,9.23,0.00,1.00,172.80,-9.60,0
+172.80,0.00,6.79,0.00,1.00,177.60,-4.80,0
+-0.00,-0.00,9.21,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,6.81,0.00,1.00,-177.60,0.00,0
+4.80,0.00,9.19,0.00,1.00,-177.60,4.80,0
+-168.00,-0.00,6.84,0.00,1.00,-172.80,9.60,0
+14.40,0.00,9.16,0.00,1.00,-168.00,9.60,0
+-158.40,-4.80,6.86,0.00,1.00,-168.00,14.40,0
+24.00,4.80,9.14,0.00,1.00,-163.20,14.40,0
+-148.80,-4.80,6.88,0.00,1.00,-158.40,19.20,0
+33.60,4.80,9.12,0.00,1.00,-153.60,19.20,0
+-139.20,-4.80,6.90,0.00,1.00,-153.60,24.00,0
+43.20,4.80,9.10,0.00,1.00,-148.80,24.00,0
+-129.60,-4.80,6.92,0.00,1.00,-144.00,28.80,0
+52.80,4.80,9.08,0.00,1.00,-139.20,28.80,0
+-120.00,-4.80,6.94,0.00,1.00,-134.40,33.60,0
+62.40,4.80,9.06,0.00,1.00,-124.80,33.60,0
+-110.40,-4.80,6.96,0.00,1.00,-120.00,33.60,0
+72.00,4.80,9.04,0.00,1.00,-115.20,38.40,0
+-100.80,-4.80,6.99,0.00,1.00,-105.60,38.40,0
+81.60,4.80,9.01,0.00,1.00,-100.80,38.40,0
+-91.20,-4.80,7.01,0.00,1.00,-91.20,38.40,0
+96.00,4.80,8.99,0.00,1.00,-86.40,38.40,0
+-81.60,-4.80,7.03,0.00,1.00,-76.80,38.40,0
+105.60,4.80,8.97,0.00,1.00,-67.20,38.40,0
+-72.00,-4.80,7.05,0.00,1.00,-62.40,38.40,0
+115.20,4.80,8.95,0.00,1.00,-57.60,33.60,0
+-62.40,-4.80,7.07,0.00,1.00,-48.00,33.60,0
+124.80,4.80,8.93,0.00,1.00,-43.20,33.60,0
+-52.80,-4.80,7.09,0.00,1.00,-38.40,28.80,0
+134.40,4.80,8.91,0.00,1.00,-33.60,28.80,0
+-43.20,-4.80,7.11,0.00,1.00,-28.80,24.00,0
+144.00,4.80,8.89,0.00,1.00,-24.00,24.00,0
+-33.60,-4.80,7.13,0.00,1.00,-24.00,19.20,0
+153.60,4.80,8.87,0.00,1.00,-19.20,19.20,0
+-24.00,-4.80,7.16,0.00,1.00,-14.40,14.40,0
+163.20,0.00,8.84,0.00,1.00,-14.40,9.60,0
+-14.40,-0.00,7.18,0.00,1.00,-9.60,9.60,0
+172.80,0.00,8.82,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,7.20,0.00,1.00,-4.80,4.80,0
+0.00,0.00,8.80,0.00,1.00,0.00,0.00,0
+-177.60,-0.00,7.22,0.00,1.00,4.80,-4.80,0
+9.60,0.00,8.78,0.00,1.00,4.80,-4.80,0
+-168.00,-0.00,7.24,0.00,1.00,9.60,-9.60,0
+19.20,0.00,8.76,0.00,1.00,14.40,-14.40,0
+-158.40,-0.00,7.26,0.00,1.00,19.20,-14.40,0
+28.80,0.00,8.74,0.00,1.00,19.20,-19.20,0
+-148.80,-0.00,7.28,0.00,1.00,24.00,-24.00,0
+38.40,0.00,8.72,0.00,1.00,28.80,-24.00,0
+-139.20,-0.00,7.31,0.00,1.00,33.60,-28.80,0
+48.00,0.00,8.69,0.00,1.00,38.40,-28.80,0
+-129.60,-0.00,7.33,0.00,1.00,43.20,-33.60,0
+57.60,0.00,8.67,0.00,1.00,48.00,-33.60,0
+-120.00,-0.00,7.35,0.00,1.00,52.80,-38.40,0
+67.20,0.00,8.65,0.00,1.00,57.60,-38.40,0
+-110.40,-0.00,7.37,0.00,1.00,62.40,-38.40,0
+76.80,0.00,8.63,0.00,1.00,72.00,-43.20,0
+-100.80,-0.00,7.39,0.00,1.00,76.80,-43.20,0
+86.40,0.00,8.61,0.00,1.00,86.40,-43.20,0
+-86.40,-0.00,7.41,0.00,1.00,91.20,-43.20,0
+96.00,0.00,8.59,0.00,1.00,100.80,-43.20,0
+-76.80,-0.00,7.43,0.00,1.00,105.60,-43.20,0
+105.60,0.00,8.57,0.00,1.00,110.40,-43.20,0
+-67.20,-0.00,7.46,0.00,1.00,120.00,-38.40,0
+115.20,0.00,8.54,0.00,1.00,124.80,-38.40,0
+-57.60,-0.00,7.48,0.00,1.00,129.60,-38.40,0
+124.80,0.00,8.52,0.00,1.00,134.40,-33.60,0
+-48.00,-0.00,7.50,0.00,1.00,139.20,-33.60,0
+134.40,0.00,8.50,0.00,1.00,144.00,-28.80,0
+-38.40,-0.00,7.52,0.00,1.00,148.80,-28.80,0
+144.00,0.00,8.48,0.00,1.00,153.60,-24.00,0
+-28.80,-0.00,7.54,0.00,1.00,158.40,-19.20,0
+153.60,0.00,8.46,0.00,1.00,163.20,-19.20,0
+-19.20,-0.00,7.56,0.00,1.00,163.20,-14.40,0
+163.20,0.00,8.44,0.00,1.00,168.00,-9.60,0
+-9.60,-0.00,7.58,0.00,1.00,172.80,-9.60,0
+172.80,0.00,8.42,0.00,1.00,172.80,-4.80,0
+-0.00,-0.00,7.60,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,8.40,0.00,1.00,-177.60,0.00,0
+4.80,0.00,7.63,0.00,1.00,-172.80,4.80,0
+-168.00,-0.00,8.37,0.00,1.00,-172.80,9.60,0
+14.40,0.00,7.65,0.00,1.00,-168.00,9.60,0
+-158.40,-0.00,8.35,0.00,1.00,-163.20,14.40,0
+24.00,0.00,7.67,0.00,1.00,-163.20,19.20,0
+-148.80,-0.00,8.33,0.00,1.00,-158.40,19.20,0
+33.60,0.00,7.69,0.00,1.00,-153.60,24.00,0
+-139.20,-0.00,8.31,0.00,1.00,-148.80,28.80,0
+43.20,0.00,7.71,0.00,1.00,-144.00,28.80,0
+-129.60,-0.00,8.29,0.00,1.00,-139.20,33.60,0
+52.80,0.00,7.73,0.00,1.00,-134.40,33.60,0
+-120.00,-0.00,8.27,0.00,1.00,-129.60,38.40,0
+62.40,0.00,7.75,0.00,1.00,-124.80,38.40,0
+-110.40,-0.00,8.25,0.00,1.00,-120.00,38.40,0
+72.00,0.00,7.78,0.00,1.00,-110.40,43.20,0
+-100.80,-0.00,8.22,0.00,1.00,-105.60,43.20,0
+81.60,0.00,7.80,0.00,1.00,-100.80,43.20,0
+-91.20,-0.00,8.20,0.00,1.00,-91.20,43.20,0
+96.00,0.00,7.82,0.00,1.00,-86.40,43.20,0
+-81.60,-0.00,8.18,0.00,1.00,-76.80,43.20,0
+105.60,0.00,7.84,0.00,1.00,-72.00,43.20,0
+-72.00,-0.00,8.16,0.00,1.00,-62.40,38.40,0
+115.20,0.00,7.86,0.00,1.00,-57.60,38.40,0
+-62.40,-0.00,8.14,0.00,1.00,-52.80,38.40,0
+124.80,0.00,7.88,0.00,1.00,-48.00,33.60,0
+-52.80,-0.00,8.12,0.00,1.00,-43.20,33.60,0
+134.40,0.00,7.90,0.00,1.00,-38.40,28.80,0
+-43.20,-0.00,8.10,0.00,1.00,-33.60,28.80,0
+144.00,0.00,7.93,0.00,1.00,-28.80,24.00,0
+-33.60,-0.00,8.07,0.00,1.00,-24.00,24.00,0
+153.60,0.00,7.95,0.00,1.00,-19.20,19.20,0
+-24.00,-0.00,8.05,0.00,1.00,-19.20,14.40,0
+163.20,0.00,7.97,0.00,1.00,-14.40,14.40,0
+-14.40,-0.00,8.03,0.00,1.00,-9.60,9.60,0
+172.80,0.00,7.99,0.00,1.00,-4.80,4.80,0
+-4.80,-0.00,8.01,0.00,1.00,-4.80,4.80,0
+0.00,0.00,8.01,0.00,1.00,0.00,0.00,0
+-177.60,0.00,7.99,0.00,1.00,4.80,-4.80,0
+9.60,-0.00,8.03,0.00,1.00,4.80,-4.80,0
+-168.00,0.00,7.97,0.00,1.00,9.60,-9.60,0
+19.20,-0.00,8.05,0.00,1.00,14.40,-14.40,0
+-158.40,0.00,7.95,0.00,1.00,19.20,-19.20,0
+28.80,-0.00,8.07,0.00,1.00,24.00,-19.20,0
+-148.80,0.00,7.93,0.00,1.00,24.00,-24.00,0
+38.40,-0.00,8.10,0.00,1.00,28.80,-28.80,0
+-139.20,0.00,7.90,0.00,1.00,33.60,-28.80,0
+48.00,-0.00,8.12,0.00,1.00,38.40,-33.60,0
+-129.60,0.00,7.88,0.00,1.00,43.20,-38.40,0
+57.60,-4.80,8.14,0.00,1.00,48.00,-38.40,0
+-120.00,4.80,7.86,0.00,1.00,52.80,-43.20,0
+67.20,-4.80,8.16,0.00,1.00,62.40,-43.20,0
+-110.40,4.80,7.84,0.00,1.00,67.20,-43.20,0
+76.80,-4.80,8.18,0.00,1.00,72.00,-48.00,0
+-100.80,4.80,7.82,0.00,1.00,76.80,-48.00,0
+86.40,-4.80,8.20,0.00,1.00,86.40,-48.00,0
+-86.40,4.80,7.80,0.00,1.00,91.20,-48.00,0
+96.00,-4.80,8.22,0.00,1.00,96.00,-48.00,0
+-76.80,4.80,7.78,0.00,1.00,105.60,-48.00,0
+105.60,-4.80,8.25,0.00,1.00,110.40,-48.00,0
+-67.20,4.80,7.75,0.00,1.00,115.20,-43.20,0
+115.20,-4.80,8.27,0.00,1.00,120.00,-43.20,0
+-57.60,4.80,7.73,0.00,1.00,129.60,-38.40,0
+124.80,-4.80,8.29,0.00,1.00,134.40,-38.40,0
+-48.00,0.00,7.71,0.00,1.00,139.20,-33.60,0
+134.40,-0.00,8.31,0.00,1.00,144.00,-33.60,0
+-38.40,0.00,7.69,0.00,1.00,148.80,-28.80,0
+144.00,-0.00,8.33,0.00,1.00,153.60,-24.00,0
+-28.80,0.00,7.67,0.00,1.00,153.60,-24.00,0
+153.60,-0.00,8.35,0.00,1.00,158.40,-19.20,0
+-19.20,0.00,7.65,0.00,1.00,163.20,-14.40,0
+163.20,-0.00,8.37,0.00,1.00,168.00,-14.40,0
+-9.60,0.00,7.63,0.00,1.00,172.80,-9.60,0
+172.80,-0.00,8.40,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,7.60,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,8.42,0.00,1.00,-177.60,0.00,0
+4.80,-0.00,7.58,0.00,1.00,-172.80,4.80,0
+-168.00,0.00,8.44,0.00,1.00,-172.80,9.60,0
+14.40,-0.00,7.56,0.00,1.00,-168.00,14.40,0
+-158.40,0.00,8.46,0.00,1.00,-163.20,14.40,0
+24.00,-0.00,7.54,0.00,1.00,-158.40,19.20,0
+-148.80,0.00,8.48,0.00,1.00,-153.60,24.00,0
+33.60,-0.00,7.52,0.00,1.00,-153.60,24.00,0
+-139.20,0.00,8.50,0.00,1.00,-148.80,28.80,0
+43.20,-0.00,7.50,0.00,1.00,-144.00,33.60,0
+-129.60,0.00,8.52,0.00,1.00,-139.20,33.60,0
+52.80,-4.80,7.48,0.00,1.00,-134.40,38.40,0
+-120.00,4.80,8.54,0.00,1.00,-129.60,38.40,0
+62.40,-4.80,7.46,0.00,1.00,-120.00,43.20,0
+-110.40,4.80,8.57,0.00,1.00,-115.20,43.20,0
+72.00,-4.80,7.43,0.00,1.00,-110.40,48.00,0
+-100.80,4.80,8.59,0.00,1.00,-105.60,48.00,0
+81.60,-4.80,7.41,0.00,1.00,-96.00,48.00,0
+-91.20,4.80,8.61,0.00,1.00,-91.20,48.00,0
+96.00,-4.80,7.39,0.00,1.00,-86.40,48.00,0
+-81.60,4.80,8.63,0.00,1.00,-76.80,48.00,0
+105.60,-4.80,7.37,0.00,1.00,-72.00,48.00,0
+-72.00,4.80,8.65,0.00,1.00,-67.20,43.20,0
+115.20,-4.80,7.35,0.00,1.00,-62.40,43.20,0
+-62.40,4.80,8.67,0.00,1.00,-52.80,43.20,0
+124.80,-4.80,7.33,0.00,1.00,-48.00,38.40,0
+-52.80,0.00,8.69,0.00,1.00,-43.20,38.40,0
+134.40,-0.00,7.31,0.00,1.00,-38.40,33.60,0
+-43.20,0.00,8.72,0.00,1.00,-33.60,28.80,0
+144.00,-0.00,7.28,0.00,1.00,-28.80,28.80,0
+-33.60,0.00,8.74,0.00,1.00,-24.00,24.00,0
+153.60,-0.00,7.26,0.00,1.00,-24.00,19.20,0
+-24.00,0.00,8.76,0.00,1.00,-19.20,19.20,0
+163.20,-0.00,7.24,0.00,1.00,-14.40,14.40,0
+-14.40,0.00,8.78,0.00,1.00,-9.60,9.60,0
+172.80,-0.00,7.22,0.00,1.00,-4.80,4.80,0
+-4.80,0.00,8.80,0.00,1.00,-4.80,4.80,0
+0.00,0.00,7.20,0.00,1.00,0.00,0.00,0
+-177.60,0.00,8.82,0.00,1.00,4.80,-4.80,0
+9.60,-0.00,7.18,0.00,1.00,9.60,-9.60,0
+-168.00,0.00,8.84,0.00,1.00,9.60,-9.60,0
+19.20,-4.80,7.16,0.00,1.00,14.40,-14.40,0
+-158.40,4.80,8.87,0.00,1.00,19.20,-19.20,0
+28.80,-4.80,7.13,0.00,1.00,24.00,-24.00,0
+-148.80,4.80,8.89,0.00,1.00,28.80,-24.00,0
+38.40,-4.80,7.11,0.00,1.00,33.60,-28.80,0
+-139.20,4.80,8.91,0.00,1.00,38.40,-33.60,0
+48.00,-4.80,7.09,0.00,1.00,43.20,-38.40,0
+-129.60,4.80,8.93,0.00,1.00,48.00,-38.40,0
+57.60,-4.80,7.07,0.00,1.00,52.80,-43.20,0
+-120.00,4.80,8.95,0.00,1.00,57.60,-43.20,0
+67.20,-4.80,7.05,0.00,1.00,62.40,-48.00,0
+-110.40,9.60,8.97,0.00,1.00,67.20,-48.00,0
+76.80,-9.60,7.03,0.00,1.00,72.00,-52.80,0
+-100.80,9.60,8.99,0.00,1.00,81.60,-52.80,0
+86.40,-9.60,7.01,0.00,1.00,86.40,-52.80,0
+-86.40,9.60,9.01,0.00,1.00,91.20,-52.80,0
+96.00,-9.60,6.99,0.00,1.00,96.00,-52.80,0
+-76.80,9.60,9.04,0.00,1.00,105.60,-52.80,0
+105.60,-9.60,6.96,0.00,1.00,110.40,-48.00,0
+-67.20,9.60,9.06,0.00,1.00,115.20,-48.00,0
+115.20,-4.80,6.94,0.00,1.00,120.00,-48.00,0
+-57.60,4.80,9.08,0.00,1.00,124.80,-43.20,0
+124.80,-4.80,6.92,0.00,1.00,129.60,-43.20,0
+-48.00,4.80,9.10,0.00,1.00,134.40,-38.40,0
+134.40,-4.80,6.90,0.00,1.00,139.20,-33.60,0
+-38.40,4.80,9.12,0.00,1.00,144.00,-33.60,0
+144.00,-4.80,6.88,0.00,1.00,148.80,-28.80,0
+-28.80,4.80,9.14,0.00,1.00,153.60,-24.00,0
+153.60,-4.80,6.86,0.00,1.00,158.40,-19.20,0
+-19.20,4.80,9.16,0.00,1.00,163.20,-19.20,0
+163.20,-0.00,6.84,0.00,1.00,168.00,-14.40,0
+-9.60,0.00,9.19,0.00,1.00,168.00,-9.60,0
+172.80,-0.00,6.81,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,9.21,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,6.79,0.00,1.00,-177.60,0.00,0
+4.80,-0.00,9.23,0.00,1.00,-172.80,4.80,0
+-168.00,0.00,6.77,0.00,1.00,-168.00,9.60,0
+14.40,-0.00,9.25,0.00,1.00,-168.00,14.40,0
+-158.40,4.80,6.75,0.00,1.00,-163.20,19.20,0
+24.00,-4.80,9.27,0.00,1.00,-158.40,19.20,0
+-148.80,4.80,6.73,0.00,1.00,-153.60,24.00,0
+33.60,-4.80,9.29,0.00,1.00,-148.80,28.80,0
+-139.20,4.80,6.71,0.00,1.00,-144.00,33.60,0
+43.20,-4.80,9.31,0.00,1.00,-139.20,33.60,0
+-129.60,4.80,6.69,0.00,1.00,-134.40,38.40,0
+52.80,-4.80,9.34,0.00,1.00,-129.60,43.20,0
+-120.00,4.80,6.66,0.00,1.00,-124.80,43.20,0
+62.40,-4.80,9.36,0.00,1.00,-120.00,48.00,0
+-110.40,9.60,6.64,0.00,1.00,-115.20,48.00,0
+72.00,-9.60,9.38,0.00,1.00,-110.40,48.00,0
+-100.80,9.60,6.62,0.00,1.00,-105.60,52.80,0
+81.60,-9.60,9.40,0.00,1.00,-96.00,52.80,0
+-91.20,9.60,6.60,0.00,1.00,-91.20,52.80,0
+96.00,-9.60,9.42,0.00,1.00,-86.40,52.80,0
+-81.60,9.60,6.58,0.00,1.00,-81.60,52.80,0
+105.60,-9.60,9.44,0.00,1.00,-72.00,52.80,0
+-72.00,9.60,6.56,0.00,1.00,-67.20,48.00,0
+115.20,-4.80,9.46,0.00,1.00,-62.40,48.00,0
+-62.40,4.80,6.54,0.00,1.00,-57.60,43.20,0
+124.80,-4.80,9.48,0.00,1.00,-52.80,43.20,0
+-52.80,4.80,6.52,0.00,1.00,-48.00,38.40,0
+134.40,-4.80,9.51,0.00,1.00,-43.20,38.40,0
+-43.20,4.80,6.49,0.00,1.00,-38.40,33.60,0
+144.00,-4.80,9.53,0.00,1.00,-33.60,28.80,0
+-33.60,4.80,6.47,0.00,1.00,-28.80,24.00,0
+153.60,-4.80,9.55,0.00,1.00,-24.00,24.00,0
+-24.00,4.80,6.45,0.00,1.00,-19.20,19.20,0
+163.20,-4.80,9.57,0.00,1.00,-14.40,14.40,0
+-14.40,0.00,6.43,0.00,1.00,-9.60,9.60,0
+172.80,-0.00,9.59,0.00,1.00,-9.60,9.60,0
+-4.80,0.00,6.41,0.00,1.00,-4.80,4.80,0
+0.00,0.00,9.61,0.00,1.00,0.00,0.00,0
+-177.60,0.00,6.39,0.00,1.00,4.80,-4.80,0
+9.60,-0.00,9.63,0.00,1.00,9.60,-9.60,0
+-168.00,4.80,6.37,0.00,1.00,14.40,-14.40,0
+19.20,-4.80,9.66,0.00,1.00,14.40,-14.40,0
+-158.40,4.80,6.34,0.00,1.00,19.20,-19.20,0
+28.80,-4.80,9.68,0.00,1.00,24.00,-24.00,0
+-148.80,4.80,6.32,0.00,1.00,28.80,-28.80,0
+38.40,-9.60,9.70,0.00,1.00,33.60,-33.60,0
+-139.20,9.60,6.30,0.00,1.00,38.40,-33.60,0
+48.00,-9.60,9.72,0.00,1.00,43.20,-38.40,0
+-129.60,9.60,6.28,0.00,1.00,48.00,-43.20,0
+57.60,-9.60,9.74,0.00,1.00,52.80,-43.20,0
+-120.00,9.60,6.26,0.00,1.00,57.60,-48.00,0
+67.20,-9.60,9.76,0.00,1.00,62.40,-52.80,0
+-110.40,9.60,6.24,0.00,1.00,67.20,-52.80,0
+76.80,-14.40,9.78,0.00,1.00,76.80,-57.60,0
+-100.80,14.40,6.22,0.00,1.00,81.60,-57.60,0
+86.40,-14.40,9.81,0.00,1.00,86.40,-57.60,0
+-86.40,14.40,6.19,0.00,1.00,91.20,-57.60,0
+96.00,-14.40,9.83,0.00,1.00,96.00,-57.60,0
+-76.80,14.40,6.17,0.00,1.00,100.80,-57.60,0
+105.60,-14.40,9.85,0.00,1.00,110.40,-52.80,0
+-67.20,9.60,6.15,0.00,1.00,115.20,-52.80,0
+115.20,-9.60,9.87,0.00,1.00,120.00,-48.00,0
+-57.60,9.60,6.13,0.00,1.00,124.80,-48.00,0
+124.80,-9.60,9.89,0.00,1.00,129.60,-43.20,0
+-48.00,9.60,6.11,0.00,1.00,134.40,-38.40,0
+134.40,-9.60,9.91,0.00,1.00,139.20,-38.40,0
+-38.40,9.60,6.09,0.00,1.00,144.00,-33.60,0
+144.00,-9.60,9.93,0.00,1.00,148.80,-28.80,0
+-28.80,4.80,6.07,0.00,1.00,153.60,-24.00,0
+153.60,-4.80,9.95,0.00,1.00,158.40,-24.00,0
+-19.20,4.80,6.05,0.00,1.00,163.20,-19.20,0
+163.20,-4.80,9.98,0.00,1.00,168.00,-14.40,0
+-9.60,4.80,6.02,0.00,1.00,168.00,-9.60,0
+172.80,-0.00,10.00,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,6.00,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,10.02,0.00,1.00,-177.60,0.00,0
+4.80,-0.00,5.98,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,10.04,0.00,1.00,-168.00,9.60,0
+14.40,-4.80,5.96,0.00,1.00,-168.00,14.40,0
+-158.40,4.80,10.06,0.00,1.00,-163.20,19.20,0
+24.00,-4.80,5.94,0.00,1.00,-158.40,24.00,0
+-148.80,4.80,10.08,0.00,1.00,-153.60,24.00,0
+33.60,-9.60,5.92,0.00,1.00,-148.80,28.80,0
+-139.20,9.60,10.10,0.00,1.00,-144.00,33.60,0
+43.20,-9.60,5.90,0.00,1.00,-139.20,38.40,0
+-129.60,9.60,10.13,0.00,1.00,-134.40,38.40,0
+52.80,-9.60,5.87,0.00,1.00,-129.60,43.20,0
+-120.00,9.60,10.15,0.00,1.00,-124.80,48.00,0
+62.40,-9.60,5.85,0.00,1.00,-120.00,48.00,0
+-110.40,9.60,10.17,0.00,1.00,-115.20,52.80,0
+72.00,-14.40,5.83,0.00,1.00,-110.40,52.80,0
+-100.80,14.40,10.19,0.00,1.00,-100.80,57.60,0
+81.60,-14.40,5.81,0.00,1.00,-96.00,57.60,0
+-91.20,14.40,10.21,0.00,1.00,-91.20,57.60,0
+96.00,-14.40,5.79,0.00,1.00,-86.40,57.60,0
+-81.60,14.40,10.23,0.00,1.00,-81.60,57.60,0
+105.60,-14.40,5.77,0.00,1.00,-76.80,57.60,0
+-72.00,9.60,10.25,0.00,1.00,-67.20,52.80,0
+115.20,-9.60,5.75,0.00,1.00,-62.40,52.80,0
+-62.40,9.60,10.28,0.00,1.00,-57.60,48.00,0
+124.80,-9.60,5.72,0.00,1.00,-52.80,43.20,0
+-52.80,9.60,10.30,0.00,1.00,-48.00,43.20,0
+134.40,-9.60,5.70,0.00,1.00,-43.20,38.40,0
+-43.20,9.60,10.32,0.00,1.00,-38.40,33.60,0
+144.00,-9.60,5.68,0.00,1.00,-33.60,33.60,0
+-33.60,4.80,10.34,0.00,1.00,-28.80,28.80,0
+153.60,-4.80,5.66,0.00,1.00,-24.00,24.00,0
+-24.00,4.80,10.36,0.00,1.00,-19.20,19.20,0
+163.20,-4.80,5.64,0.00,1.00,-14.40,14.40,0
+-14.40,4.80,10.38,0.00,1.00,-14.40,14.40,0
+172.80,-0.00,5.62,0.00,1.00,-9.60,9.60,0
+-4.80,0.00,10.40,0.00,1.00,-4.80,4.80,0
+0.00,0.00,5.60,0.00,1.00,0.00,0.00,0
+-177.60,0.00,10.42,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,5.58,0.00,1.00,9.60,-9.60,0
+-168.00,4.80,10.45,0.00,1.00,14.40,-14.40,0
+19.20,-4.80,5.55,0.00,1.00,19.20,-19.20,0
+-158.40,4.80,10.47,0.00,1.00,19.20,-19.20,0
+28.80,-9.60,5.53,0.00,1.00,24.00,-24.00,0
+-148.80,9.60,10.49,0.00,1.00,28.80,-28.80,0
+38.40,-9.60,5.51,0.00,1.00,33.60,-33.60,0
+-139.20,9.60,10.51,0.00,1.00,38.40,-38.40,0
+48.00,-14.40,5.49,0.00,1.00,43.20,-43.20,0
+-129.60,14.40,10.53,0.00,1.00,48.00,-43.20,0
+57.60,-14.40,5.47,0.00,1.00,52.80,-48.00,0
+-120.00,14.40,10.55,0.00,1.00,57.60,-52.80,0
+67.20,-14.40,5.45,0.00,1.00,62.40,-52.80,0
+-110.40,14.40,10.57,0.00,1.00,72.00,-57.60,0
+76.80,-19.20,5.43,0.00,1.00,76.80,-57.60,0
+-100.80,19.20,10.60,0.00,1.00,81.60,-62.40,0
+86.40,-19.20,5.40,0.00,1.00,86.40,-62.40,0
+-86.40,19.20,10.62,0.00,1.00,91.20,-62.40,0
+96.00,-19.20,5.38,0.00,1.00,96.00,-62.40,0
+-76.80,19.20,10.64,0.00,1.00,100.80,-62.40,0
+105.60,-14.40,5.36,0.00,1.00,105.60,-57.60,0
+-67.20,14.40,10.66,0.00,1.00,110.40,-57.60,0
+115.20,-14.40,5.34,0.00,1.00,120.00,-52.80,0
+-57.60,14.40,10.68,0.00,1.00,124.80,-48.00,0
+124.80,-14.40,5.32,0.00,1.00,129.60,-48.00,0
+-48.00,14.40,10.70,0.00,1.00,134.40,-43.20,0
+134.40,-14.40,5.30,0.00,1.00,139.20,-38.40,0
+-38.40,9.60,10.72,0.00,1.00,144.00,-33.60,0
+144.00,-9.60,5.28,0.00,1.00,148.80,-33.60,0
+-28.80,9.60,10.74,0.00,1.00,153.60,-28.80,0
+153.60,-9.60,5.26,0.00,1.00,158.40,-24.00,0
+-19.20,4.80,10.77,0.00,1.00,158.40,-19.20,0
+163.20,-4.80,5.23,0.00,1.00,163.20,-14.40,0
+-9.60,4.80,10.79,0.00,1.00,168.00,-9.60,0
+172.80,-0.00,5.21,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,10.81,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,5.19,0.00,1.00,-177.60,0.00,0
+4.80,-0.00,10.83,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,5.17,0.00,1.00,-168.00,9.60,0
+14.40,-4.80,10.85,0.00,1.00,-163.20,14.40,0
+-158.40,4.80,5.15,0.00,1.00,-158.40,19.20,0
+24.00,-9.60,10.87,0.00,1.00,-158.40,24.00,0
+-148.80,9.60,5.13,0.00,1.00,-153.60,28.80,0
+33.60,-9.60,10.89,0.00,1.00,-148.80,33.60,0
+-139.20,9.60,5.11,0.00,1.00,-144.00,33.60,0
+43.20,-14.40,10.92,0.00,1.00,-139.20,38.40,0
+-129.60,14.40,5.08,0.00,1.00,-134.40,43.20,0
+52.80,-14.40,10.94,0.00,1.00,-129.60,48.00,0
+-120.00,14.40,5.06,0.00,1.00,-124.80,48.00,0
+62.40,-14.40,10.96,0.00,1.00,-120.00,52.80,0
+-110.40,14.40,5.04,0.00,1.00,-110.40,57.60,0
+72.00,-14.40,10.98,0.00,1.00,-105.60,57.60,0
+-100.80,19.20,5.02,0.00,1.00,-100.80,62.40,0
+81.60,-19.20,11.00,0.00,1.00,-96.00,62.40,0
+-91.20,19.20,5.00,0.00,1.00,-91.20,62.40,0
+96.00,-19.20,11.02,0.00,1.00,-86.40,62.40,0
+-81.60,19.20,4.98,0.00,1.00,-81.60,62.40,0
+105.60,-19.20,11.04,0.00,1.00,-76.80,57.60,0
+-72.00,14.40,4.96,0.00,1.00,-72.00,57.60,0
+115.20,-14.40,11.07,0.00,1.00,-62.40,52.80,0
+-62.40,14.40,4.93,0.00,1.00,-57.60,52.80,0
+124.80,-14.40,11.09,0.00,1.00,-52.80,48.00,0
+-52.80,14.40,4.91,0.00,1.00,-48.00,43.20,0
+134.40,-14.40,11.11,0.00,1.00,-43.20,43.20,0
+-43.20,9.60,4.89,0.00,1.00,-38.40,38.40,0
+144.00,-9.60,11.13,0.00,1.00,-33.60,33.60,0
+-33.60,9.60,4.87,0.00,1.00,-28.80,28.80,0
+153.60,-9.60,11.15,0.00,1.00,-24.00,24.00,0
+-24.00,4.80,4.85,0.00,1.00,-19.20,19.20,0
+163.20,-4.80,11.17,0.00,1.00,-19.20,19.20,0
+-14.40,4.80,4.83,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,11.19,0.00,1.00,-9.60,9.60,0
+-4.80,0.00,4.81,0.00,1.00,-4.80,4.80,0
+0.00,0.00,11.21,0.00,1.00,0.00,0.00,0
+-177.60,0.00,4.79,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,11.24,0.00,1.00,9.60,-9.60,0
+-168.00,4.80,4.76,0.00,1.00,14.40,-14.40,0
+19.20,-4.80,11.26,0.00,1.00,19.20,-19.20,0
+-158.40,9.60,4.74,0.00,1.00,24.00,-24.00,0
+28.80,-9.60,11.28,0.00,1.00,28.80,-24.00,0
+-148.80,14.40,4.72,0.00,1.00,33.60,-28.80,0
+38.40,-14.40,11.30,0.00,1.00,38.40,-33.60,0
+-139.20,14.40,4.70,0.00,1.00,43.20,-38.40,0
+48.00,-14.40,11.32,0.00,1.00,48.00,-43.20,0
+-129.60,19.20,4.68,0.00,1.00,52.80,-48.00,0
+57.60,-19.20,11.34,0.00,1.00,57.60,-52.80,0
+-120.00,19.20,4.66,0.00,1.00,62.40,-52.80,0
+67.20,-19.20,11.36,0.00,1.00,67.20,-57.60,0
+-110.40,19.20,4.64,0.00,1.00,72.00,-62.40,0
+76.80,-19.20,11.39,0.00,1.00,76.80,-62.40,0
+-100.80,24.00,4.61,0.00,1.00,81.60,-67.20,0
+86.40,-24.00,11.41,0.00,1.00,86.40,-67.20,0
+-86.40,24.00,4.59,0.00,1.00,91.20,-67.20,0
+96.00,-24.00,11.43,0.00,1.00,96.00,-67.20,0
+-76.80,24.00,4.57,0.00,1.00,100.80,-67.20,0
+105.60,-19.20,11.45,0.00,1.00,105.60,-62.40,0
+-67.20,19.20,4.55,0.00,1.00,110.40,-57.60,0
+115.20,-19.20,11.47,0.00,1.00,115.20,-57.60,0
+-57.60,19.20,4.53,0.00,1.00,120.00,-52.80,0
+124.80,-19.20,11.49,0.00,1.00,124.80,-48.00,0
+-48.00,19.20,4.51,0.00,1.00,129.60,-43.20,0
+134.40,-14.40,11.51,0.00,1.00,134.40,-43.20,0
+-38.40,14.40,4.49,0.00,1.00,139.20,-38.40,0
+144.00,-14.40,11.54,0.00,1.00,144.00,-33.60,0
+-28.80,9.60,4.46,0.00,1.00,148.80,-28.80,0
+153.60,-9.60,11.56,0.00,1.00,153.60,-24.00,0
+-19.20,9.60,4.44,0.00,1.00,158.40,-19.20,0
+163.20,-4.80,11.58,0.00,1.00,163.20,-14.40,0
+-9.60,4.80,4.42,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,11.60,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,4.40,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,11.62,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,4.38,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,11.64,0.00,1.00,-168.00,9.60,0
+14.40,-4.80,4.36,0.00,1.00,-163.20,14.40,0
+-158.40,9.60,11.66,0.00,1.00,-158.40,19.20,0
+24.00,-9.60,4.34,0.00,1.00,-153.60,24.00,0
+-148.80,9.60,11.68,0.00,1.00,-148.80,28.80,0
+33.60,-14.40,4.32,0.00,1.00,-144.00,33.60,0
+-139.20,14.40,11.71,0.00,1.00,-139.20,38.40,0
+43.20,-14.40,4.29,0.00,1.00,-134.40,43.20,0
+-129.60,19.20,11.73,0.00,1.00,-129.60,43.20,0
+52.80,-19.20,4.27,0.00,1.00,-124.80,48.00,0
+-120.00,19.20,11.75,0.00,1.00,-120.00,52.80,0
+62.40,-19.20,4.25,0.00,1.00,-115.20,57.60,0
+-110.40,19.20,11.77,0.00,1.00,-110.40,57.60,0
+72.00,-19.20,4.23,0.00,1.00,-105.60,62.40,0
+-100.80,24.00,11.79,0.00,1.00,-100.80,67.20,0
+81.60,-24.00,4.21,0.00,1.00,-96.00,67.20,0
+-91.20,24.00,11.81,0.00,1.00,-91.20,67.20,0
+96.00,-24.00,4.19,0.00,1.00,-86.40,67.20,0
+-81.60,24.00,11.83,0.00,1.00,-81.60,67.20,0
+105.60,-19.20,4.17,0.00,1.00,-76.80,62.40,0
+-72.00,19.20,11.86,0.00,1.00,-72.00,62.40,0
+115.20,-19.20,4.14,0.00,1.00,-67.20,57.60,0
+-62.40,19.20,11.88,0.00,1.00,-62.40,52.80,0
+124.80,-19.20,4.12,0.00,1.00,-57.60,52.80,0
+-52.80,19.20,11.90,0.00,1.00,-52.80,48.00,0
+134.40,-14.40,4.10,0.00,1.00,-48.00,43.20,0
+-43.20,14.40,11.92,0.00,1.00,-43.20,38.40,0
+144.00,-14.40,4.08,0.00,1.00,-38.40,33.60,0
+-33.60,14.40,11.94,0.00,1.00,-33.60,28.80,0
+153.60,-9.60,4.06,0.00,1.00,-28.80,24.00,0
+-24.00,9.60,11.96,0.00,1.00,-24.00,24.00,0
+163.20,-4.80,4.04,0.00,1.00,-19.20,19.20,0
+-14.40,4.80,11.98,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,4.02,0.00,1.00,-9.60,9.60,0
+-4.80,0.00,12.01,0.00,1.00,-4.80,4.80,0
+0.00,0.00,3.99,0.00,1.00,0.00,0.00,0
+-177.60,0.00,12.03,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,3.97,0.00,1.00,9.60,-9.60,0
+-168.00,4.80,12.05,0.00,1.00,14.40,-14.40,0
+19.20,-9.60,3.95,0.00,1.00,19.20,-19.20,0
+-158.40,9.60,12.07,0.00,1.00,24.00,-24.00,0
+24.00,-14.40,3.93,0.00,1.00,28.80,-28.80,0
+-148.80,14.40,12.09,0.00,1.00,33.60,-33.60,0
+33.60,-14.40,3.91,0.00,1.00,38.40,-38.40,0
+-139.20,19.20,12.11,0.00,1.00,43.20,-38.40,0
+43.20,-19.20,3.89,0.00,1.00,48.00,-43.20,0
+-129.60,19.20,12.13,0.00,1.00,52.80,-48.00,0
+52.80,-24.00,3.87,0.00,1.00,57.60,-52.80,0
+-120.00,24.00,12.15,0.00,1.00,62.40,-57.60,0
+62.40,-24.00,3.85,0.00,1.00,67.20,-62.40,0
+-110.40,24.00,12.18,0.00,1.00,72.00,-62.40,0
+76.80,-24.00,3.82,0.00,1.00,76.80,-67.20,0
+-100.80,28.80,12.20,0.00,1.00,81.60,-72.00,0
+86.40,-28.80,3.80,0.00,1.00,86.40,-72.00,0
+-86.40,28.80,12.22,0.00,1.00,91.20,-72.00,0
+96.00,-28.80,3.78,0.00,1.00,96.00,-72.00,0
+-76.80,28.80,12.24,0.00,1.00,100.80,-67.20,0
+105.60,-24.00,3.76,0.00,1.00,105.60,-67.20,0
+-67.20,24.00,12.26,0.00,1.00,110.40,-62.40,0
+120.00,-24.00,3.74,0.00,1.00,115.20,-57.60,0
+-57.60,24.00,12.28,0.00,1.00,120.00,-57.60,0
+129.60,-24.00,3.72,0.00,1.00,124.80,-52.80,0
+-48.00,19.20,12.30,0.00,1.00,129.60,-48.00,0
+139.20,-19.20,3.70,0.00,1.00,134.40,-43.20,0
+-38.40,19.20,12.33,0.00,1.00,139.20,-38.40,0
+148.80,-14.40,3.67,0.00,1.00,144.00,-33.60,0
+-28.80,14.40,12.35,0.00,1.00,148.80,-28.80,0
+158.40,-9.60,3.65,0.00,1.00,153.60,-24.00,0
+-19.20,9.60,12.37,0.00,1.00,158.40,-19.20,0
+163.20,-9.60,3.63,0.00,1.00,163.20,-14.40,0
+-9.60,4.80,12.39,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,3.61,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,12.41,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,3.59,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,12.43,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,3.57,0.00,1.00,-168.00,9.60,0
+14.40,-9.60,12.45,0.00,1.00,-163.20,14.40,0
+-158.40,9.60,3.55,0.00,1.00,-158.40,19.20,0
+24.00,-9.60,12.48,0.00,1.00,-153.60,24.00,0
+-153.60,14.40,3.52,0.00,1.00,-148.80,28.80,0
+33.60,-14.40,12.50,0.00,1.00,-144.00,33.60,0
+-144.00,19.20,3.50,0.00,1.00,-139.20,38.40,0
+43.20,-19.20,12.52,0.00,1.00,-134.40,43.20,0
+-134.40,19.20,3.48,0.00,1.00,-129.60,48.00,0
+52.80,-24.00,12.54,0.00,1.00,-124.80,52.80,0
+-124.80,24.00,3.46,0.00,1.00,-120.00,57.60,0
+62.40,-24.00,12.56,0.00,1.00,-115.20,57.60,0
+-110.40,24.00,3.44,0.00,1.00,-110.40,62.40,0
+72.00,-24.00,12.58,0.00,1.00,-105.60,67.20,0
+-100.80,28.80,3.42,0.00,1.00,-100.80,67.20,0
+81.60,-28.80,12.60,0.00,1.00,-96.00,72.00,0
+-91.20,28.80,3.40,0.00,1.00,-91.20,72.00,0
+96.00,-28.80,12.62,0.00,1.00,-86.40,72.00,0
+-81.60,28.80,3.38,0.00,1.00,-81.60,72.00,0
+105.60,-24.00,12.65,0.00,1.00,-76.80,67.20,0
+-72.00,24.00,3.35,0.00,1.00,-72.00,62.40,0
+115.20,-24.00,12.67,0.00,1.00,-67.20,62.40,0
+-57.60,24.00,3.33,0.00,1.00,-62.40,57.60,0
+124.80,-24.00,12.69,0.00,1.00,-57.60,52.80,0
+-48.00,19.20,3.31,0.00,1.00,-52.80,48.00,0
+134.40,-19.20,12.71,0.00,1.00,-48.00,43.20,0
+-38.40,19.20,3.29,0.00,1.00,-43.20,38.40,0
+144.00,-14.40,12.73,0.00,1.00,-38.40,38.40,0
+-28.80,14.40,3.27,0.00,1.00,-33.60,33.60,0
+153.60,-14.40,12.75,0.00,1.00,-28.80,28.80,0
+-24.00,9.60,3.25,0.00,1.00,-24.00,24.00,0
+163.20,-9.60,12.77,0.00,1.00,-19.20,19.20,0
+-14.40,4.80,3.23,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,12.80,0.00,1.00,-9.60,9.60,0
+-4.80,0.00,3.20,0.00,1.00,-4.80,4.80,0
+0.00,0.00,12.82,0.00,1.00,0.00,0.00,0
+-177.60,4.80,3.18,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,12.84,0.00,1.00,9.60,-9.60,0
+-168.00,9.60,3.16,0.00,1.00,14.40,-14.40,0
+14.40,-9.60,12.86,0.00,1.00,19.20,-19.20,0
+-158.40,14.40,3.14,0.00,1.00,24.00,-24.00,0
+24.00,-14.40,12.88,0.00,1.00,28.80,-28.80,0
+-148.80,19.20,3.12,0.00,1.00,33.60,-33.60,0
+33.60,-19.20,12.90,0.00,1.00,38.40,-38.40,0
+-139.20,19.20,3.10,0.00,1.00,43.20,-43.20,0
+43.20,-24.00,12.92,0.00,1.00,48.00,-48.00,0
+-129.60,24.00,3.08,0.00,1.00,52.80,-52.80,0
+52.80,-28.80,12.95,0.00,1.00,57.60,-57.60,0
+-120.00,28.80,3.05,0.00,1.00,62.40,-57.60,0
+62.40,-28.80,12.97,0.00,1.00,67.20,-62.40,0
+-110.40,28.80,3.03,0.00,1.00,72.00,-67.20,0
+76.80,-28.80,12.99,0.00,1.00,76.80,-72.00,0
+-100.80,33.60,3.01,0.00,1.00,81.60,-72.00,0
+86.40,-33.60,13.01,0.00,1.00,86.40,-76.80,0
+-86.40,33.60,2.99,0.00,1.00,91.20,-76.80,0
+96.00,-33.60,13.03,0.00,1.00,96.00,-76.80,0
+-76.80,28.80,2.97,0.00,1.00,100.80,-72.00,0
+110.40,-28.80,13.05,0.00,1.00,105.60,-72.00,0
+-67.20,28.80,2.95,0.00,1.00,110.40,-67.20,0
+120.00,-28.80,13.07,0.00,1.00,115.20,-62.40,0
+-57.60,28.80,2.93,0.00,1.00,120.00,-57.60,0
+129.60,-24.00,13.09,0.00,1.00,124.80,-52.80,0
+-48.00,24.00,2.91,0.00,1.00,129.60,-48.00,0
+139.20,-24.00,13.12,0.00,1.00,134.40,-43.20,0
+-38.40,19.20,2.88,0.00,1.00,139.20,-38.40,0
+148.80,-19.20,13.14,0.00,1.00,144.00,-33.60,0
+-28.80,14.40,2.86,0.00,1.00,148.80,-28.80,0
+158.40,-14.40,13.16,0.00,1.00,153.60,-24.00,0
+-19.20,9.60,2.84,0.00,1.00,158.40,-19.20,0
+168.00,-9.60,13.18,0.00,1.00,163.20,-14.40,0
+-9.60,4.80,2.82,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,13.20,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,2.80,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,13.22,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,2.78,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,13.24,0.00,1.00,-168.00,9.60,0
+14.40,-9.60,2.76,0.00,1.00,-163.20,14.40,0
+-163.20,9.60,13.27,0.00,1.00,-158.40,19.20,0
+24.00,-14.40,2.73,0.00,1.00,-153.60,24.00,0
+-153.60,14.40,13.29,0.00,1.00,-148.80,28.80,0
+33.60,-19.20,2.71,0.00,1.00,-144.00,33.60,0
+-144.00,19.20,13.31,0.00,1.00,-139.20,38.40,0
+43.20,-24.00,2.69,0.00,1.00,-134.40,43.20,0
+-134.40,24.00,13.33,0.00,1.00,-129.60,48.00,0
+52.80,-24.00,2.67,0.00,1.00,-124.80,52.80,0
+-124.80,28.80,13.35,0.00,1.00,-120.00,57.60,0
+62.40,-28.80,2.65,0.00,1.00,-115.20,62.40,0
+-115.20,28.80,13.37,0.00,1.00,-110.40,67.20,0
+72.00,-28.80,2.63,0.00,1.00,-105.60,72.00,0
+-100.80,28.80,13.39,0.00,1.00,-100.80,72.00,0
+81.60,-33.60,2.61,0.00,1.00,-96.00,76.80,0
+-91.20,33.60,13.42,0.00,1.00,-91.20,76.80,0
+96.00,-33.60,2.58,0.00,1.00,-86.40,76.80,0
+-81.60,33.60,13.44,0.00,1.00,-81.60,72.00,0
+105.60,-28.80,2.56,0.00,1.00,-76.80,72.00,0
+-67.20,28.80,13.46,0.00,1.00,-72.00,67.20,0
+115.20,-28.80,2.54,0.00,1.00,-67.20,62.40,0
+-57.60,28.80,13.48,0.00,1.00,-62.40,57.60,0
+124.80,-28.80,2.52,0.00,1.00,-57.60,57.60,0
+-48.00,24.00,13.50,0.00,1.00,-52.80,52.80,0
+134.40,-24.00,2.50,0.00,1.00,-48.00,48.00,0
+-38.40,19.20,13.52,0.00,1.00,-43.20,43.20,0
+144.00,-19.20,2.48,0.00,1.00,-38.40,38.40,0
+-28.80,19.20,13.54,0.00,1.00,-33.60,33.60,0
+153.60,-14.40,2.46,0.00,1.00,-28.80,28.80,0
+-19.20,14.40,13.56,0.00,1.00,-24.00,24.00,0
+163.20,-9.60,2.44,0.00,1.00,-19.20,19.20,0
+-14.40,9.60,13.59,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,2.41,0.00,1.00,-9.60,9.60,0
+-4.80,4.80,13.61,0.00,1.00,-4.80,4.80,0
+0.00,0.00,2.39,0.00,1.00,0.00,0.00,0
+-177.60,4.80,13.63,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,2.37,0.00,1.00,9.60,-9.60,0
+-168.00,9.60,13.65,0.00,1.00,14.40,-14.40,0
+14.40,-9.60,2.35,0.00,1.00,19.20,-19.20,0
+-158.40,14.40,13.67,0.00,1.00,24.00,-24.00,0
+24.00,-14.40,2.33,0.00,1.00,28.80,-28.80,0
+-153.60,19.20,13.69,0.00,1.00,33.60,-33.60,0
+33.60,-24.00,2.31,0.00,1.00,38.40,-38.40,0
+-144.00,24.00,13.71,0.00,1.00,43.20,-43.20,0
+43.20,-24.00,2.29,0.00,1.00,48.00,-48.00,0
+-134.40,28.80,13.74,0.00,1.00,52.80,-52.80,0
+52.80,-28.80,2.26,0.00,1.00,57.60,-57.60,0
+-124.80,33.60,13.76,0.00,1.00,62.40,-62.40,0
+62.40,-33.60,2.24,0.00,1.00,67.20,-67.20,0
+-110.40,33.60,13.78,0.00,1.00,72.00,-72.00,0
+72.00,-33.60,2.22,0.00,1.00,76.80,-72.00,0
+-100.80,38.40,13.80,0.00,1.00,81.60,-76.80,0
+86.40,-38.40,2.20,0.00,1.00,86.40,-81.60,0
+-86.40,38.40,13.82,0.00,1.00,91.20,-81.60,0
+96.00,-38.40,2.18,0.00,1.00,96.00,-81.60,0
+-76.80,33.60,13.84,0.00,1.00,100.80,-76.80,0
+110.40,-33.60,2.16,0.00,1.00,105.60,-72.00,0
+-67.20,33.60,13.86,0.00,1.00,110.40,-67.20,0
+120.00,-33.60,2.14,0.00,1.00,115.20,-62.40,0
+-52.80,28.80,13.89,0.00,1.00,120.00,-57.60,0
+129.60,-28.80,2.11,0.00,1.00,124.80,-52.80,0
+-43.20,28.80,13.91,0.00,1.00,129.60,-48.00,0
+139.20,-24.00,2.09,0.00,1.00,134.40,-43.20,0
+-33.60,24.00,13.93,0.00,1.00,139.20,-38.40,0
+148.80,-19.20,2.07,0.00,1.00,144.00,-33.60,0
+-24.00,19.20,13.95,0.00,1.00,148.80,-28.80,0
+158.40,-14.40,2.05,0.00,1.00,153.60,-24.00,0
+-19.20,14.40,13.97,0.00,1.00,158.40,-19.20,0
+168.00,-9.60,2.03,0.00,1.00,163.20,-14.40,0
+-9.60,4.80,13.99,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,2.01,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,14.01,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,1.99,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,14.03,0.00,1.00,-172.80,4.80,0
+-168.00,4.80,1.97,0.00,1.00,-168.00,9.60,0
+14.40,-9.60,14.06,0.00,1.00,-163.20,14.40,0
+-163.20,14.40,1.94,0.00,1.00,-158.40,19.20,0
+24.00,-14.40,14.08,0.00,1.00,-153.60,24.00,0
+-153.60,19.20,1.92,0.00,1.00,-148.80,28.80,0
+28.80,-19.20,14.10,0.00,1.00,-144.00,33.60,0
+-144.00,24.00,1.90,0.00,1.00,-139.20,38.40,0
+38.40,-24.00,14.12,0.00,1.00,-134.40,43.20,0
+-134.40,28.80,1.88,0.00,1.00,-129.60,48.00,0
+48.00,-28.80,14.14,0.00,1.00,-124.80,52.80,0
+-124.80,28.80,1.86,0.00,1.00,-120.00,57.60,0
+57.60,-33.60,14.16,0.00,1.00,-115.20,62.40,0
+-115.20,33.60,1.84,0.00,1.00,-110.40,67.20,0
+72.00,-33.60,14.18,0.00,1.00,-105.60,72.00,0
+-105.60,33.60,1.82,0.00,1.00,-100.80,76.80,0
+81.60,-38.40,14.21,0.00,1.00,-96.00,81.60,0
+-91.20,38.40,1.79,0.00,1.00,-91.20,81.60,0
+96.00,-38.40,14.23,0.00,1.00,-86.40,81.60,0
+-81.60,38.40,1.77,0.00,1.00,-81.60,76.80,0
+105.60,-33.60,14.25,0.00,1.00,-76.80,72.00,0
+-67.20,33.60,1.75,0.00,1.00,-72.00,72.00,0
+120.00,-33.60,14.27,0.00,1.00,-67.20,67.20,0
+-57.60,33.60,1.73,0.00,1.00,-62.40,62.40,0
+129.60,-28.80,14.29,0.00,1.00,-57.60,57.60,0
+-48.00,28.80,1.71,0.00,1.00,-52.80,52.80,0
+139.20,-24.00,14.31,0.00,1.00,-48.00,48.00,0
+-38.40,24.00,1.69,0.00,1.00,-43.20,43.20,0
+148.80,-24.00,14.33,0.00,1.00,-38.40,38.40,0
+-28.80,19.20,1.67,0.00,1.00,-33.60,33.60,0
+158.40,-14.40,14.36,0.00,1.00,-28.80,28.80,0
+-19.20,14.40,1.64,0.00,1.00,-24.00,24.00,0
+163.20,-9.60,14.38,0.00,1.00,-19.20,19.20,0
+-9.60,9.60,1.62,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,14.40,0.00,1.00,-9.60,9.60,0
+-4.80,4.80,1.60,0.00,1.00,-4.80,4.80,0
+0.00,0.00,14.42,0.00,1.00,0.00,0.00,0
+-177.60,4.80,1.58,0.00,1.00,4.80,-4.80,0
+9.60,-4.80,14.44,0.00,1.00,9.60,-9.60,0
+-168.00,9.60,1.56,0.00,1.00,14.40,-14.40,0
+14.40,-14.40,14.46,0.00,1.00,19.20,-19.20,0
+-163.20,14.40,1.54,0.00,1.00,24.00,-24.00,0
+24.00,-19.20,14.48,0.00,1.00,28.80,-28.80,0
+-153.60,19.20,1.52,0.00,1.00,33.60,-33.60,0
+28.80,-24.00,14.50,0.00,1.00,38.40,-38.40,0
+-144.00,28.80,1.50,0.00,1.00,43.20,-43.20,0
+38.40,-28.80,14.53,0.00,1.00,48.00,-48.00,0
+-134.40,33.60,1.47,0.00,1.00,52.80,-52.80,0
+48.00,-33.60,14.55,0.00,1.00,57.60,-57.60,0
+-124.80,33.60,1.45,0.00,1.00,62.40,-62.40,0
+62.40,-38.40,14.57,0.00,1.00,67.20,-67.20,0
+-115.20,38.40,1.43,0.00,1.00,72.00,-72.00,0
+72.00,-38.40,14.59,0.00,1.00,76.80,-76.80,0
+-100.80,43.20,1.41,0.00,1.00,81.60,-81.60,0
+86.40,-43.20,14.61,0.00,1.00,86.40,-86.40,0
+-86.40,43.20,1.39,0.00,1.00,91.20,-86.40,0
+96.00,-43.20,14.63,0.00,1.00,96.00,-81.60,0
+-76.80,38.40,1.37,0.00,1.00,100.80,-76.80,0
+110.40,-38.40,14.65,0.00,1.00,105.60,-72.00,0
+-62.40,38.40,1.35,0.00,1.00,110.40,-67.20,0
+120.00,-38.40,14.68,0.00,1.00,115.20,-62.40,0
+-52.80,33.60,1.32,0.00,1.00,120.00,-57.60,0
+134.40,-33.60,14.70,0.00,1.00,124.80,-52.80,0
+-43.20,28.80,1.30,0.00,1.00,129.60,-48.00,0
+144.00,-28.80,14.72,0.00,1.00,134.40,-43.20,0
+-33.60,24.00,1.28,0.00,1.00,139.20,-38.40,0
+153.60,-24.00,14.74,0.00,1.00,144.00,-33.60,0
+-24.00,19.20,1.26,0.00,1.00,148.80,-28.80,0
+158.40,-19.20,14.76,0.00,1.00,153.60,-24.00,0
+-14.40,14.40,1.24,0.00,1.00,158.40,-19.20,0
+168.00,-9.60,14.78,0.00,1.00,163.20,-14.40,0
+-9.60,9.60,1.22,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,14.80,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,1.20,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,14.83,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,1.17,0.00,1.00,-172.80,4.80,0
+-172.80,9.60,14.85,0.00,1.00,-168.00,9.60,0
+14.40,-9.60,1.15,0.00,1.00,-163.20,14.40,0
+-163.20,14.40,14.87,0.00,1.00,-158.40,19.20,0
+19.20,-19.20,1.13,0.00,1.00,-153.60,24.00,0
+-153.60,19.20,14.89,0.00,1.00,-148.80,28.80,0
+28.80,-24.00,1.11,0.00,1.00,-144.00,33.60,0
+-148.80,24.00,14.91,0.00,1.00,-139.20,38.40,0
+38.40,-28.80,1.09,0.00,1.00,-134.40,43.20,0
+-139.20,28.80,14.93,0.00,1.00,-129.60,48.00,0
+48.00,-33.60,1.07,0.00,1.00,-124.80,52.80,0
+-129.60,33.60,14.95,0.00,1.00,-120.00,57.60,0
+57.60,-38.40,1.05,0.00,1.00,-115.20,62.40,0
+-115.20,38.40,14.97,0.00,1.00,-110.40,67.20,0
+67.20,-38.40,1.03,0.00,1.00,-105.60,72.00,0
+-105.60,38.40,15.00,0.00,1.00,-100.80,76.80,0
+81.60,-43.20,1.00,0.00,1.00,-96.00,81.60,0
+-91.20,43.20,15.02,0.00,1.00,-91.20,86.40,0
+96.00,-43.20,0.98,0.00,1.00,-86.40,86.40,0
+-76.80,43.20,15.04,0.00,1.00,-81.60,81.60,0
+105.60,-38.40,0.96,0.00,1.00,-76.80,76.80,0
+-67.20,38.40,15.06,0.00,1.00,-72.00,72.00,0
+120.00,-38.40,0.94,0.00,1.00,-67.20,67.20,0
+-52.80,33.60,15.08,0.00,1.00,-62.40,62.40,0
+129.60,-33.60,0.92,0.00,1.00,-57.60,57.60,0
+-43.20,33.60,15.10,0.00,1.00,-52.80,52.80,0
+139.20,-28.80,0.90,0.00,1.00,-48.00,48.00,0
+-33.60,28.80,15.12,0.00,1.00,-43.20,43.20,0
+148.80,-24.00,0.88,0.00,1.00,-38.40,38.40,0
+-28.80,19.20,15.15,0.00,1.00,-33.60,33.60,0
+158.40,-19.20,0.85,0.00,1.00,-28.80,28.80,0
+-19.20,14.40,15.17,0.00,1.00,-24.00,24.00,0
+163.20,-14.40,0.83,0.00,1.00,-19.20,19.20,0
+-9.60,9.60,15.19,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,0.81,0.00,1.00,-9.60,9.60,0
+-4.80,4.80,15.21,0.00,1.00,-4.80,4.80,0
+0.00,0.00,0.79,0.00,1.00,0.00,0.00,0
+-177.60,4.80,15.23,0.00,1.00,4.80,-4.80,0
+4.80,-4.80,0.77,0.00,1.00,9.60,-9.60,0
+-168.00,9.60,15.25,0.00,1.00,14.40,-14.40,0
+14.40,-14.40,0.75,0.00,1.00,19.20,-19.20,0
+-163.20,19.20,15.27,0.00,1.00,24.00,-24.00,0
+19.20,-19.20,0.73,0.00,1.00,28.80,-28.80,0
+-153.60,24.00,15.30,0.00,1.00,33.60,-33.60,0
+28.80,-28.80,0.70,0.00,1.00,38.40,-38.40,0
+-148.80,28.80,15.32,0.00,1.00,43.20,-43.20,0
+38.40,-33.60,0.68,0.00,1.00,48.00,-48.00,0
+-139.20,33.60,15.34,0.00,1.00,52.80,-52.80,0
+48.00,-38.40,0.66,0.00,1.00,57.60,-57.60,0
+-124.80,38.40,15.36,0.00,1.00,62.40,-62.40,0
+57.60,-43.20,0.64,0.00,1.00,67.20,-67.20,0
+-115.20,43.20,15.38,0.00,1.00,72.00,-72.00,0
+72.00,-43.20,0.62,0.00,1.00,76.80,-76.80,0
+-100.80,43.20,15.40,0.00,1.00,81.60,-81.60,0
+86.40,-48.00,0.60,0.00,1.00,86.40,-86.40,0
+-86.40,48.00,15.42,0.00,1.00,91.20,-86.40,0
+100.80,-48.00,0.58,0.00,1.00,96.00,-81.60,0
+-76.80,43.20,15.44,0.00,1.00,100.80,-76.80,0
+110.40,-43.20,0.56,0.00,1.00,105.60,-72.00,0
+-62.40,43.20,15.47,0.00,1.00,110.40,-67.20,0
+124.80,-38.40,0.53,0.00,1.00,115.20,-62.40,0
+-48.00,38.40,15.49,0.00,1.00,120.00,-57.60,0
+134.40,-38.40,0.51,0.00,1.00,124.80,-52.80,0
+-38.40,33.60,15.51,0.00,1.00,129.60,-48.00,0
+144.00,-28.80,0.49,0.00,1.00,134.40,-43.20,0
+-28.80,28.80,15.53,0.00,1.00,139.20,-38.40,0
+153.60,-24.00,0.47,0.00,1.00,144.00,-33.60,0
+-24.00,24.00,15.55,0.00,1.00,148.80,-28.80,0
+163.20,-19.20,0.45,0.00,1.00,153.60,-24.00,0
+-14.40,14.40,15.57,0.00,1.00,158.40,-19.20,0
+168.00,-14.40,0.43,0.00,1.00,163.20,-14.40,0
+-9.60,9.60,15.59,0.00,1.00,168.00,-9.60,0
+172.80,-4.80,0.41,0.00,1.00,172.80,-4.80,0
+-0.00,0.00,15.62,0.00,1.00,177.60,-0.00,0
+-177.60,0.00,0.38,0.00,1.00,-177.60,0.00,0
+4.80,-4.80,15.64,0.00,1.00,-172.80,4.80,0
+-172.80,9.60,0.36,0.00,1.00,-168.00,9.60,0
+9.60,-14.40,15.66,0.00,1.00,-163.20,14.40,0
+-163.20,14.40,0.34,0.00,1.00,-158.40,19.20,0
+19.20,-19.20,15.68,0.00,1.00,-153.60,24.00,0
+-158.40,24.00,0.32,0.00,1.00,-148.80,28.80,0
+28.80,-24.00,15.70,0.00,1.00,-144.00,33.60,0
+-148.80,28.80,0.30,0.00,1.00,-139.20,38.40,0
+33.60,-28.80,15.72,0.00,1.00,-134.40,43.20,0
+-139.20,33.60,0.28,0.00,1.00,-129.60,48.00,0
+43.20,-38.40,15.74,0.00,1.00,-124.80,52.80,0
+-129.60,38.40,0.26,0.00,1.00,-120.00,57.60,0
+57.60,-38.40,15.77,0.00,1.00,-115.20,62.40,0
+-120.00,43.20,0.23,0.00,1.00,-110.40,67.20,0
+67.20,-43.20,15.79,0.00,1.00,-105.60,72.00,0
+-105.60,43.20,0.21,0.00,1.00,-100.80,76.80,0
+81.60,-48.00,15.81,0.00,1.00,-96.00,81.60,0
+-91.20,48.00,0.19,0.00,1.00,-91.20,86.40,0
+96.00,-48.00,15.83,0.00,1.00,-86.40,86.40,0
+-76.80,43.20,0.17,0.00,1.00,-81.60,81.60,0
+110.40,-43.20,15.85,0.00,1.00,-76.80,76.80,0
+-67.20,43.20,0.15,0.00,1.00,-72.00,72.00,0
+120.00,-43.20,15.87,0.00,1.00,-67.20,67.20,0
+-52.80,38.40,0.13,0.00,1.00,-62.40,62.40,0
+134.40,-38.40,15.89,0.00,1.00,-57.60,57.60,0
+-43.20,33.60,0.11,0.00,1.00,-52.80,52.80,0
+144.00,-33.60,15.91,0.00,1.00,-48.00,48.00,0
+-33.60,28.80,0.09,0.00,1.00,-43.20,43.20,0
+153.60,-28.80,15.94,0.00,1.00,-38.40,38.40,0
+-24.00,24.00,0.06,0.00,1.00,-33.60,33.60,0
+158.40,-19.20,15.96,0.00,1.00,-28.80,28.80,0
+-19.20,19.20,0.04,0.00,1.00,-24.00,24.00,0
+168.00,-14.40,15.98,0.00,1.00,-19.20,19.20,0
+-9.60,9.60,0.02,0.00,1.00,-14.40,14.40,0
+172.80,-4.80,16.00,0.00,1.00,-9.60,9.60,0
+-4.80,4.80,0.00,0.00,1.00,-4.80,4.80,0
diff --git a/scripts/testv/stvISM4.csv b/scripts/testv/stvISM4.csv
index 6318155a25063eee0dbf035a8ad94ca5ddac9c21..8a14c3413ddd2dd47415bf6de3e19631f65f8f6c 100644
--- a/scripts/testv/stvISM4.csv
+++ b/scripts/testv/stvISM4.csv
@@ -1,1500 +1,1500 @@
--0.00,0.00,1.00,0.00,1.00
--0.00,4.80,1.00,0.00,1.00
--0.00,9.60,1.00,0.00,1.00
--0.00,14.40,1.00,0.00,1.00
--0.00,19.20,1.00,0.00,1.00
--0.00,24.00,1.00,0.00,1.00
--0.00,28.80,1.00,0.00,1.00
--0.00,33.60,1.00,0.00,1.00
--0.00,38.40,1.00,0.00,1.00
--0.00,43.20,1.00,0.00,1.00
--0.00,48.00,1.00,0.00,1.00
--0.00,52.80,1.00,0.00,1.00
--0.00,57.60,1.00,0.00,1.00
--0.00,62.40,1.00,0.00,1.00
--0.00,67.20,1.00,0.00,1.00
--0.00,72.00,1.00,0.00,1.00
--0.00,76.80,1.00,0.00,1.00
--0.00,81.60,1.00,0.00,1.00
--0.00,86.40,1.00,0.00,1.00
--177.60,89.20,1.00,0.00,1.00
--177.60,86.40,1.00,0.00,1.00
--177.60,81.60,1.00,0.00,1.00
--177.60,76.80,1.00,0.00,1.00
--177.60,72.00,1.00,0.00,1.00
--177.60,67.20,1.00,0.00,1.00
-177.60,62.40,1.00,0.00,1.00
-177.60,57.60,1.00,0.00,1.00
-177.60,52.80,1.00,0.00,1.00
-177.60,48.00,1.00,0.00,1.00
-177.60,43.20,1.00,0.00,1.00
-177.60,38.40,1.00,0.00,1.00
-177.60,33.60,1.00,0.00,1.00
-177.60,28.80,1.00,0.00,1.00
-177.60,24.00,1.00,0.00,1.00
-177.60,19.20,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--177.60,-19.20,1.00,0.00,1.00
--177.60,-24.00,1.00,0.00,1.00
--177.60,-28.80,1.00,0.00,1.00
--177.60,-33.60,1.00,0.00,1.00
--177.60,-38.40,1.00,0.00,1.00
--177.60,-48.00,1.00,0.00,1.00
--177.60,-48.00,1.00,0.00,1.00
--177.60,-52.80,1.00,0.00,1.00
--177.60,-57.60,1.00,0.00,1.00
-177.60,-62.40,1.00,0.00,1.00
-177.60,-67.20,1.00,0.00,1.00
-177.60,-76.80,1.00,0.00,1.00
-177.60,-76.80,1.00,0.00,1.00
-177.60,-86.40,1.00,0.00,1.00
-177.60,-89.20,1.00,0.00,1.00
-0.00,-86.40,1.00,0.00,1.00
-0.00,-81.60,1.00,0.00,1.00
-0.00,-76.80,1.00,0.00,1.00
-0.00,-72.00,1.00,0.00,1.00
-0.00,-67.20,1.00,0.00,1.00
-0.00,-62.40,1.00,0.00,1.00
-0.00,-57.60,1.00,0.00,1.00
-0.00,-52.80,1.00,0.00,1.00
-0.00,-48.00,1.00,0.00,1.00
-0.00,-43.20,1.00,0.00,1.00
-0.00,-38.40,1.00,0.00,1.00
-0.00,-33.60,1.00,0.00,1.00
-0.00,-28.80,1.00,0.00,1.00
-0.00,-24.00,1.00,0.00,1.00
-0.00,-19.20,1.00,0.00,1.00
-0.00,-14.40,1.00,0.00,1.00
-0.00,-9.60,1.00,0.00,1.00
-0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-0.00,9.60,1.00,0.00,1.00
-0.00,14.40,1.00,0.00,1.00
-0.00,19.20,1.00,0.00,1.00
-0.00,24.00,1.00,0.00,1.00
-4.80,28.80,1.00,0.00,1.00
-4.80,33.60,1.00,0.00,1.00
-4.80,38.40,1.00,0.00,1.00
-4.80,43.20,1.00,0.00,1.00
-4.80,48.00,1.00,0.00,1.00
-4.80,52.80,1.00,0.00,1.00
-9.60,57.60,1.00,0.00,1.00
-9.60,62.40,1.00,0.00,1.00
-9.60,67.20,1.00,0.00,1.00
-14.40,72.00,1.00,0.00,1.00
-19.20,76.80,1.00,0.00,1.00
-28.80,81.60,1.00,0.00,1.00
-52.80,86.40,1.00,0.00,1.00
-105.60,86.40,1.00,0.00,1.00
-139.20,81.60,1.00,0.00,1.00
-158.40,76.80,1.00,0.00,1.00
-163.20,72.00,1.00,0.00,1.00
-168.00,67.20,1.00,0.00,1.00
-168.00,62.40,1.00,0.00,1.00
-172.80,57.60,1.00,0.00,1.00
-172.80,52.80,1.00,0.00,1.00
-172.80,48.00,1.00,0.00,1.00
-172.80,43.20,1.00,0.00,1.00
-177.60,38.40,1.00,0.00,1.00
-177.60,33.60,1.00,0.00,1.00
-177.60,28.80,1.00,0.00,1.00
-177.60,24.00,1.00,0.00,1.00
-177.60,19.20,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--177.60,-19.20,1.00,0.00,1.00
--177.60,-24.00,1.00,0.00,1.00
--177.60,-28.80,1.00,0.00,1.00
--177.60,-33.60,1.00,0.00,1.00
--177.60,-38.40,1.00,0.00,1.00
--172.80,-43.20,1.00,0.00,1.00
--172.80,-48.00,1.00,0.00,1.00
--172.80,-52.80,1.00,0.00,1.00
--172.80,-57.60,1.00,0.00,1.00
--168.00,-62.40,1.00,0.00,1.00
--168.00,-67.20,1.00,0.00,1.00
--163.20,-72.00,1.00,0.00,1.00
--158.40,-76.80,1.00,0.00,1.00
--139.20,-81.60,1.00,0.00,1.00
--105.60,-86.40,1.00,0.00,1.00
--52.80,-86.40,1.00,0.00,1.00
--28.80,-81.60,1.00,0.00,1.00
--19.20,-76.80,1.00,0.00,1.00
--14.40,-72.00,1.00,0.00,1.00
--9.60,-67.20,1.00,0.00,1.00
--9.60,-62.40,1.00,0.00,1.00
--9.60,-57.60,1.00,0.00,1.00
--4.80,-52.80,1.00,0.00,1.00
--4.80,-48.00,1.00,0.00,1.00
--4.80,-43.20,1.00,0.00,1.00
--4.80,-38.40,1.00,0.00,1.00
--4.80,-33.60,1.00,0.00,1.00
--4.80,-28.80,1.00,0.00,1.00
--0.00,-24.00,1.00,0.00,1.00
--0.00,-19.20,1.00,0.00,1.00
--0.00,-14.40,1.00,0.00,1.00
--0.00,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-0.00,9.60,1.00,0.00,1.00
-4.80,14.40,1.00,0.00,1.00
-4.80,19.20,1.00,0.00,1.00
-4.80,24.00,1.00,0.00,1.00
-4.80,28.80,1.00,0.00,1.00
-4.80,33.60,1.00,0.00,1.00
-9.60,38.40,1.00,0.00,1.00
-9.60,43.20,1.00,0.00,1.00
-9.60,48.00,1.00,0.00,1.00
-14.40,52.80,1.00,0.00,1.00
-14.40,57.60,1.00,0.00,1.00
-19.20,62.40,1.00,0.00,1.00
-24.00,67.20,1.00,0.00,1.00
-28.80,72.00,1.00,0.00,1.00
-33.60,72.00,1.00,0.00,1.00
-48.00,76.80,1.00,0.00,1.00
-67.20,81.60,1.00,0.00,1.00
-96.00,81.60,1.00,0.00,1.00
-120.00,76.80,1.00,0.00,1.00
-139.20,76.80,1.00,0.00,1.00
-148.80,72.00,1.00,0.00,1.00
-153.60,67.20,1.00,0.00,1.00
-158.40,62.40,1.00,0.00,1.00
-163.20,57.60,1.00,0.00,1.00
-168.00,52.80,1.00,0.00,1.00
-168.00,48.00,1.00,0.00,1.00
-168.00,43.20,1.00,0.00,1.00
-172.80,38.40,1.00,0.00,1.00
-172.80,33.60,1.00,0.00,1.00
-172.80,28.80,1.00,0.00,1.00
-177.60,24.00,1.00,0.00,1.00
-177.60,19.20,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--177.60,-19.20,1.00,0.00,1.00
--177.60,-24.00,1.00,0.00,1.00
--172.80,-28.80,1.00,0.00,1.00
--172.80,-33.60,1.00,0.00,1.00
--172.80,-38.40,1.00,0.00,1.00
--168.00,-43.20,1.00,0.00,1.00
--168.00,-48.00,1.00,0.00,1.00
--168.00,-52.80,1.00,0.00,1.00
--163.20,-57.60,1.00,0.00,1.00
--158.40,-62.40,1.00,0.00,1.00
--153.60,-67.20,1.00,0.00,1.00
--148.80,-72.00,1.00,0.00,1.00
--139.20,-76.80,1.00,0.00,1.00
--120.00,-76.80,1.00,0.00,1.00
--96.00,-81.60,1.00,0.00,1.00
--67.20,-81.60,1.00,0.00,1.00
--48.00,-76.80,1.00,0.00,1.00
--33.60,-72.00,1.00,0.00,1.00
--28.80,-72.00,1.00,0.00,1.00
--24.00,-67.20,1.00,0.00,1.00
--19.20,-62.40,1.00,0.00,1.00
--14.40,-57.60,1.00,0.00,1.00
--14.40,-52.80,1.00,0.00,1.00
--9.60,-48.00,1.00,0.00,1.00
--9.60,-43.20,1.00,0.00,1.00
--9.60,-38.40,1.00,0.00,1.00
--4.80,-33.60,1.00,0.00,1.00
--4.80,-28.80,1.00,0.00,1.00
--4.80,-24.00,1.00,0.00,1.00
--4.80,-19.20,1.00,0.00,1.00
--4.80,-14.40,1.00,0.00,1.00
--0.00,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-4.80,14.40,1.00,0.00,1.00
-4.80,19.20,1.00,0.00,1.00
-4.80,24.00,1.00,0.00,1.00
-9.60,28.80,1.00,0.00,1.00
-9.60,33.60,1.00,0.00,1.00
-9.60,38.40,1.00,0.00,1.00
-14.40,43.20,1.00,0.00,1.00
-14.40,48.00,1.00,0.00,1.00
-19.20,52.80,1.00,0.00,1.00
-19.20,52.80,1.00,0.00,1.00
-24.00,57.60,1.00,0.00,1.00
-28.80,62.40,1.00,0.00,1.00
-38.40,67.20,1.00,0.00,1.00
-48.00,72.00,1.00,0.00,1.00
-57.60,72.00,1.00,0.00,1.00
-76.80,76.80,1.00,0.00,1.00
-96.00,76.80,1.00,0.00,1.00
-115.20,76.80,1.00,0.00,1.00
-129.60,72.00,1.00,0.00,1.00
-139.20,67.20,1.00,0.00,1.00
-144.00,67.20,1.00,0.00,1.00
-153.60,62.40,1.00,0.00,1.00
-158.40,57.60,1.00,0.00,1.00
-158.40,52.80,1.00,0.00,1.00
-163.20,48.00,1.00,0.00,1.00
-168.00,43.20,1.00,0.00,1.00
-168.00,38.40,1.00,0.00,1.00
-168.00,33.60,1.00,0.00,1.00
-172.80,28.80,1.00,0.00,1.00
-172.80,24.00,1.00,0.00,1.00
-172.80,19.20,1.00,0.00,1.00
-177.60,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--177.60,-14.40,1.00,0.00,1.00
--172.80,-19.20,1.00,0.00,1.00
--172.80,-24.00,1.00,0.00,1.00
--172.80,-28.80,1.00,0.00,1.00
--168.00,-33.60,1.00,0.00,1.00
--168.00,-38.40,1.00,0.00,1.00
--168.00,-43.20,1.00,0.00,1.00
--163.20,-48.00,1.00,0.00,1.00
--158.40,-52.80,1.00,0.00,1.00
--158.40,-57.60,1.00,0.00,1.00
--153.60,-62.40,1.00,0.00,1.00
--144.00,-67.20,1.00,0.00,1.00
--139.20,-67.20,1.00,0.00,1.00
--129.60,-72.00,1.00,0.00,1.00
--115.20,-76.80,1.00,0.00,1.00
--96.00,-76.80,1.00,0.00,1.00
--76.80,-76.80,1.00,0.00,1.00
--57.60,-72.00,1.00,0.00,1.00
--48.00,-72.00,1.00,0.00,1.00
--38.40,-67.20,1.00,0.00,1.00
--28.80,-62.40,1.00,0.00,1.00
--24.00,-57.60,1.00,0.00,1.00
--19.20,-52.80,1.00,0.00,1.00
--19.20,-52.80,1.00,0.00,1.00
--14.40,-48.00,1.00,0.00,1.00
--14.40,-43.20,1.00,0.00,1.00
--9.60,-38.40,1.00,0.00,1.00
--9.60,-33.60,1.00,0.00,1.00
--9.60,-28.80,1.00,0.00,1.00
--4.80,-24.00,1.00,0.00,1.00
--4.80,-19.20,1.00,0.00,1.00
--4.80,-14.40,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-4.80,14.40,1.00,0.00,1.00
-4.80,19.20,1.00,0.00,1.00
-9.60,24.00,1.00,0.00,1.00
-9.60,28.80,1.00,0.00,1.00
-14.40,33.60,1.00,0.00,1.00
-14.40,33.60,1.00,0.00,1.00
-19.20,38.40,1.00,0.00,1.00
-19.20,43.20,1.00,0.00,1.00
-24.00,48.00,1.00,0.00,1.00
-28.80,52.80,1.00,0.00,1.00
-33.60,57.60,1.00,0.00,1.00
-38.40,62.40,1.00,0.00,1.00
-43.20,62.40,1.00,0.00,1.00
-52.80,67.20,1.00,0.00,1.00
-67.20,67.20,1.00,0.00,1.00
-76.80,72.00,1.00,0.00,1.00
-96.00,72.00,1.00,0.00,1.00
-105.60,72.00,1.00,0.00,1.00
-120.00,67.20,1.00,0.00,1.00
-129.60,67.20,1.00,0.00,1.00
-139.20,62.40,1.00,0.00,1.00
-144.00,57.60,1.00,0.00,1.00
-148.80,52.80,1.00,0.00,1.00
-153.60,52.80,1.00,0.00,1.00
-158.40,48.00,1.00,0.00,1.00
-163.20,43.20,1.00,0.00,1.00
-163.20,38.40,1.00,0.00,1.00
-168.00,33.60,1.00,0.00,1.00
-168.00,28.80,1.00,0.00,1.00
-172.80,24.00,1.00,0.00,1.00
-172.80,19.20,1.00,0.00,1.00
-172.80,14.40,1.00,0.00,1.00
-177.60,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--177.60,-9.60,1.00,0.00,1.00
--172.80,-14.40,1.00,0.00,1.00
--172.80,-19.20,1.00,0.00,1.00
--172.80,-24.00,1.00,0.00,1.00
--168.00,-28.80,1.00,0.00,1.00
--168.00,-33.60,1.00,0.00,1.00
--163.20,-38.40,1.00,0.00,1.00
--163.20,-43.20,1.00,0.00,1.00
--158.40,-48.00,1.00,0.00,1.00
--153.60,-52.80,1.00,0.00,1.00
--148.80,-52.80,1.00,0.00,1.00
--144.00,-57.60,1.00,0.00,1.00
--139.20,-62.40,1.00,0.00,1.00
--129.60,-67.20,1.00,0.00,1.00
--120.00,-67.20,1.00,0.00,1.00
--105.60,-72.00,1.00,0.00,1.00
--96.00,-72.00,1.00,0.00,1.00
--76.80,-72.00,1.00,0.00,1.00
--67.20,-67.20,1.00,0.00,1.00
--52.80,-67.20,1.00,0.00,1.00
--43.20,-62.40,1.00,0.00,1.00
--38.40,-62.40,1.00,0.00,1.00
--33.60,-57.60,1.00,0.00,1.00
--28.80,-52.80,1.00,0.00,1.00
--24.00,-48.00,1.00,0.00,1.00
--19.20,-43.20,1.00,0.00,1.00
--19.20,-38.40,1.00,0.00,1.00
--14.40,-33.60,1.00,0.00,1.00
--14.40,-33.60,1.00,0.00,1.00
--9.60,-28.80,1.00,0.00,1.00
--9.60,-24.00,1.00,0.00,1.00
--4.80,-19.20,1.00,0.00,1.00
--4.80,-14.40,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-4.80,14.40,1.00,0.00,1.00
-9.60,19.20,1.00,0.00,1.00
-9.60,24.00,1.00,0.00,1.00
-14.40,24.00,1.00,0.00,1.00
-14.40,28.80,1.00,0.00,1.00
-19.20,33.60,1.00,0.00,1.00
-19.20,38.40,1.00,0.00,1.00
-24.00,43.20,1.00,0.00,1.00
-28.80,48.00,1.00,0.00,1.00
-33.60,52.80,1.00,0.00,1.00
-38.40,52.80,1.00,0.00,1.00
-43.20,57.60,1.00,0.00,1.00
-52.80,62.40,1.00,0.00,1.00
-62.40,62.40,1.00,0.00,1.00
-72.00,62.40,1.00,0.00,1.00
-81.60,67.20,1.00,0.00,1.00
-91.20,67.20,1.00,0.00,1.00
-105.60,67.20,1.00,0.00,1.00
-115.20,62.40,1.00,0.00,1.00
-124.80,62.40,1.00,0.00,1.00
-134.40,57.60,1.00,0.00,1.00
-139.20,57.60,1.00,0.00,1.00
-144.00,52.80,1.00,0.00,1.00
-148.80,48.00,1.00,0.00,1.00
-153.60,43.20,1.00,0.00,1.00
-158.40,38.40,1.00,0.00,1.00
-158.40,38.40,1.00,0.00,1.00
-163.20,33.60,1.00,0.00,1.00
-168.00,28.80,1.00,0.00,1.00
-168.00,24.00,1.00,0.00,1.00
-172.80,19.20,1.00,0.00,1.00
-172.80,14.40,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--172.80,-14.40,1.00,0.00,1.00
--172.80,-19.20,1.00,0.00,1.00
--168.00,-24.00,1.00,0.00,1.00
--168.00,-28.80,1.00,0.00,1.00
--163.20,-33.60,1.00,0.00,1.00
--158.40,-38.40,1.00,0.00,1.00
--158.40,-38.40,1.00,0.00,1.00
--153.60,-43.20,1.00,0.00,1.00
--148.80,-48.00,1.00,0.00,1.00
--144.00,-52.80,1.00,0.00,1.00
--139.20,-57.60,1.00,0.00,1.00
--134.40,-57.60,1.00,0.00,1.00
--124.80,-62.40,1.00,0.00,1.00
--115.20,-62.40,1.00,0.00,1.00
--105.60,-67.20,1.00,0.00,1.00
--91.20,-67.20,1.00,0.00,1.00
--81.60,-67.20,1.00,0.00,1.00
--72.00,-62.40,1.00,0.00,1.00
--62.40,-62.40,1.00,0.00,1.00
--52.80,-62.40,1.00,0.00,1.00
--43.20,-57.60,1.00,0.00,1.00
--38.40,-52.80,1.00,0.00,1.00
--33.60,-52.80,1.00,0.00,1.00
--28.80,-48.00,1.00,0.00,1.00
--24.00,-43.20,1.00,0.00,1.00
--19.20,-38.40,1.00,0.00,1.00
--19.20,-33.60,1.00,0.00,1.00
--14.40,-28.80,1.00,0.00,1.00
--14.40,-24.00,1.00,0.00,1.00
--9.60,-24.00,1.00,0.00,1.00
--9.60,-19.20,1.00,0.00,1.00
--4.80,-14.40,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-0.00,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-4.80,14.40,1.00,0.00,1.00
-9.60,14.40,1.00,0.00,1.00
-14.40,19.20,1.00,0.00,1.00
-14.40,24.00,1.00,0.00,1.00
-19.20,28.80,1.00,0.00,1.00
-19.20,33.60,1.00,0.00,1.00
-24.00,38.40,1.00,0.00,1.00
-28.80,38.40,1.00,0.00,1.00
-33.60,43.20,1.00,0.00,1.00
-38.40,48.00,1.00,0.00,1.00
-43.20,52.80,1.00,0.00,1.00
-48.00,52.80,1.00,0.00,1.00
-57.60,57.60,1.00,0.00,1.00
-62.40,57.60,1.00,0.00,1.00
-72.00,62.40,1.00,0.00,1.00
-81.60,62.40,1.00,0.00,1.00
-91.20,62.40,1.00,0.00,1.00
-100.80,62.40,1.00,0.00,1.00
-110.40,57.60,1.00,0.00,1.00
-120.00,57.60,1.00,0.00,1.00
-129.60,57.60,1.00,0.00,1.00
-134.40,52.80,1.00,0.00,1.00
-139.20,48.00,1.00,0.00,1.00
-144.00,48.00,1.00,0.00,1.00
-148.80,43.20,1.00,0.00,1.00
-153.60,38.40,1.00,0.00,1.00
-158.40,33.60,1.00,0.00,1.00
-158.40,28.80,1.00,0.00,1.00
-163.20,28.80,1.00,0.00,1.00
-168.00,24.00,1.00,0.00,1.00
-168.00,19.20,1.00,0.00,1.00
-172.80,14.40,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--172.80,-14.40,1.00,0.00,1.00
--168.00,-19.20,1.00,0.00,1.00
--168.00,-24.00,1.00,0.00,1.00
--163.20,-28.80,1.00,0.00,1.00
--158.40,-28.80,1.00,0.00,1.00
--158.40,-33.60,1.00,0.00,1.00
--153.60,-38.40,1.00,0.00,1.00
--148.80,-43.20,1.00,0.00,1.00
--144.00,-48.00,1.00,0.00,1.00
--139.20,-48.00,1.00,0.00,1.00
--134.40,-52.80,1.00,0.00,1.00
--129.60,-57.60,1.00,0.00,1.00
--120.00,-57.60,1.00,0.00,1.00
--110.40,-57.60,1.00,0.00,1.00
--100.80,-62.40,1.00,0.00,1.00
--91.20,-62.40,1.00,0.00,1.00
--81.60,-62.40,1.00,0.00,1.00
--72.00,-62.40,1.00,0.00,1.00
--62.40,-57.60,1.00,0.00,1.00
--57.60,-57.60,1.00,0.00,1.00
--48.00,-52.80,1.00,0.00,1.00
--43.20,-52.80,1.00,0.00,1.00
--38.40,-48.00,1.00,0.00,1.00
--33.60,-43.20,1.00,0.00,1.00
--28.80,-38.40,1.00,0.00,1.00
--24.00,-38.40,1.00,0.00,1.00
--19.20,-33.60,1.00,0.00,1.00
--19.20,-28.80,1.00,0.00,1.00
--14.40,-24.00,1.00,0.00,1.00
--14.40,-19.20,1.00,0.00,1.00
--9.60,-14.40,1.00,0.00,1.00
--4.80,-14.40,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--0.00,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-9.60,9.60,1.00,0.00,1.00
-9.60,14.40,1.00,0.00,1.00
-14.40,19.20,1.00,0.00,1.00
-19.20,24.00,1.00,0.00,1.00
-19.20,28.80,1.00,0.00,1.00
-24.00,28.80,1.00,0.00,1.00
-28.80,33.60,1.00,0.00,1.00
-33.60,38.40,1.00,0.00,1.00
-38.40,43.20,1.00,0.00,1.00
-43.20,43.20,1.00,0.00,1.00
-48.00,48.00,1.00,0.00,1.00
-52.80,48.00,1.00,0.00,1.00
-57.60,52.80,1.00,0.00,1.00
-67.20,52.80,1.00,0.00,1.00
-76.80,57.60,1.00,0.00,1.00
-81.60,57.60,1.00,0.00,1.00
-91.20,57.60,1.00,0.00,1.00
-100.80,57.60,1.00,0.00,1.00
-110.40,52.80,1.00,0.00,1.00
-115.20,52.80,1.00,0.00,1.00
-124.80,52.80,1.00,0.00,1.00
-129.60,48.00,1.00,0.00,1.00
-134.40,48.00,1.00,0.00,1.00
-139.20,43.20,1.00,0.00,1.00
-144.00,38.40,1.00,0.00,1.00
-148.80,38.40,1.00,0.00,1.00
-153.60,33.60,1.00,0.00,1.00
-158.40,28.80,1.00,0.00,1.00
-163.20,24.00,1.00,0.00,1.00
-163.20,24.00,1.00,0.00,1.00
-168.00,19.20,1.00,0.00,1.00
-172.80,14.40,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--172.80,-14.40,1.00,0.00,1.00
--168.00,-19.20,1.00,0.00,1.00
--163.20,-24.00,1.00,0.00,1.00
--163.20,-24.00,1.00,0.00,1.00
--158.40,-28.80,1.00,0.00,1.00
--153.60,-33.60,1.00,0.00,1.00
--148.80,-38.40,1.00,0.00,1.00
--144.00,-38.40,1.00,0.00,1.00
--139.20,-43.20,1.00,0.00,1.00
--134.40,-48.00,1.00,0.00,1.00
--129.60,-48.00,1.00,0.00,1.00
--124.80,-52.80,1.00,0.00,1.00
--115.20,-52.80,1.00,0.00,1.00
--110.40,-52.80,1.00,0.00,1.00
--100.80,-57.60,1.00,0.00,1.00
--91.20,-57.60,1.00,0.00,1.00
--81.60,-57.60,1.00,0.00,1.00
--76.80,-57.60,1.00,0.00,1.00
--67.20,-52.80,1.00,0.00,1.00
--57.60,-52.80,1.00,0.00,1.00
--52.80,-48.00,1.00,0.00,1.00
--48.00,-48.00,1.00,0.00,1.00
--43.20,-43.20,1.00,0.00,1.00
--38.40,-43.20,1.00,0.00,1.00
--33.60,-38.40,1.00,0.00,1.00
--28.80,-33.60,1.00,0.00,1.00
--24.00,-28.80,1.00,0.00,1.00
--19.20,-28.80,1.00,0.00,1.00
--19.20,-24.00,1.00,0.00,1.00
--14.40,-19.20,1.00,0.00,1.00
--9.60,-14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-4.80,9.60,1.00,0.00,1.00
-9.60,9.60,1.00,0.00,1.00
-14.40,14.40,1.00,0.00,1.00
-14.40,19.20,1.00,0.00,1.00
-19.20,24.00,1.00,0.00,1.00
-24.00,24.00,1.00,0.00,1.00
-24.00,28.80,1.00,0.00,1.00
-28.80,33.60,1.00,0.00,1.00
-33.60,33.60,1.00,0.00,1.00
-38.40,38.40,1.00,0.00,1.00
-43.20,43.20,1.00,0.00,1.00
-48.00,43.20,1.00,0.00,1.00
-57.60,48.00,1.00,0.00,1.00
-62.40,48.00,1.00,0.00,1.00
-67.20,48.00,1.00,0.00,1.00
-76.80,52.80,1.00,0.00,1.00
-86.40,52.80,1.00,0.00,1.00
-91.20,52.80,1.00,0.00,1.00
-100.80,52.80,1.00,0.00,1.00
-105.60,48.00,1.00,0.00,1.00
-115.20,48.00,1.00,0.00,1.00
-120.00,48.00,1.00,0.00,1.00
-124.80,43.20,1.00,0.00,1.00
-134.40,43.20,1.00,0.00,1.00
-139.20,38.40,1.00,0.00,1.00
-144.00,38.40,1.00,0.00,1.00
-148.80,33.60,1.00,0.00,1.00
-153.60,28.80,1.00,0.00,1.00
-153.60,28.80,1.00,0.00,1.00
-158.40,24.00,1.00,0.00,1.00
-163.20,19.20,1.00,0.00,1.00
-168.00,14.40,1.00,0.00,1.00
-168.00,14.40,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-177.60,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--177.60,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--168.00,-14.40,1.00,0.00,1.00
--168.00,-14.40,1.00,0.00,1.00
--163.20,-19.20,1.00,0.00,1.00
--158.40,-24.00,1.00,0.00,1.00
--153.60,-28.80,1.00,0.00,1.00
--153.60,-28.80,1.00,0.00,1.00
--148.80,-33.60,1.00,0.00,1.00
--144.00,-38.40,1.00,0.00,1.00
--139.20,-38.40,1.00,0.00,1.00
--134.40,-43.20,1.00,0.00,1.00
--124.80,-43.20,1.00,0.00,1.00
--120.00,-48.00,1.00,0.00,1.00
--115.20,-48.00,1.00,0.00,1.00
--105.60,-48.00,1.00,0.00,1.00
--100.80,-52.80,1.00,0.00,1.00
--91.20,-52.80,1.00,0.00,1.00
--86.40,-52.80,1.00,0.00,1.00
--76.80,-52.80,1.00,0.00,1.00
--67.20,-48.00,1.00,0.00,1.00
--62.40,-48.00,1.00,0.00,1.00
--57.60,-48.00,1.00,0.00,1.00
--48.00,-43.20,1.00,0.00,1.00
--43.20,-43.20,1.00,0.00,1.00
--38.40,-38.40,1.00,0.00,1.00
--33.60,-33.60,1.00,0.00,1.00
--28.80,-33.60,1.00,0.00,1.00
--24.00,-28.80,1.00,0.00,1.00
--24.00,-24.00,1.00,0.00,1.00
--19.20,-24.00,1.00,0.00,1.00
--14.40,-19.20,1.00,0.00,1.00
--14.40,-14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
--4.80,-9.60,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-9.60,9.60,1.00,0.00,1.00
-14.40,14.40,1.00,0.00,1.00
-19.20,19.20,1.00,0.00,1.00
-19.20,19.20,1.00,0.00,1.00
-24.00,24.00,1.00,0.00,1.00
-28.80,28.80,1.00,0.00,1.00
-33.60,28.80,1.00,0.00,1.00
-38.40,33.60,1.00,0.00,1.00
-43.20,33.60,1.00,0.00,1.00
-48.00,38.40,1.00,0.00,1.00
-52.80,38.40,1.00,0.00,1.00
-57.60,43.20,1.00,0.00,1.00
-62.40,43.20,1.00,0.00,1.00
-72.00,43.20,1.00,0.00,1.00
-76.80,48.00,1.00,0.00,1.00
-86.40,48.00,1.00,0.00,1.00
-91.20,48.00,1.00,0.00,1.00
-100.80,48.00,1.00,0.00,1.00
-105.60,48.00,1.00,0.00,1.00
-110.40,43.20,1.00,0.00,1.00
-120.00,43.20,1.00,0.00,1.00
-124.80,43.20,1.00,0.00,1.00
-129.60,38.40,1.00,0.00,1.00
-134.40,38.40,1.00,0.00,1.00
-139.20,33.60,1.00,0.00,1.00
-144.00,33.60,1.00,0.00,1.00
-148.80,28.80,1.00,0.00,1.00
-153.60,24.00,1.00,0.00,1.00
-158.40,24.00,1.00,0.00,1.00
-163.20,19.20,1.00,0.00,1.00
-163.20,14.40,1.00,0.00,1.00
-168.00,14.40,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--168.00,-14.40,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
--163.20,-19.20,1.00,0.00,1.00
--158.40,-24.00,1.00,0.00,1.00
--153.60,-24.00,1.00,0.00,1.00
--148.80,-28.80,1.00,0.00,1.00
--144.00,-33.60,1.00,0.00,1.00
--139.20,-33.60,1.00,0.00,1.00
--134.40,-38.40,1.00,0.00,1.00
--129.60,-38.40,1.00,0.00,1.00
--124.80,-43.20,1.00,0.00,1.00
--120.00,-43.20,1.00,0.00,1.00
--110.40,-43.20,1.00,0.00,1.00
--105.60,-48.00,1.00,0.00,1.00
--100.80,-48.00,1.00,0.00,1.00
--91.20,-48.00,1.00,0.00,1.00
--86.40,-48.00,1.00,0.00,1.00
--76.80,-48.00,1.00,0.00,1.00
--72.00,-43.20,1.00,0.00,1.00
--62.40,-43.20,1.00,0.00,1.00
--57.60,-43.20,1.00,0.00,1.00
--52.80,-38.40,1.00,0.00,1.00
--48.00,-38.40,1.00,0.00,1.00
--43.20,-33.60,1.00,0.00,1.00
--38.40,-33.60,1.00,0.00,1.00
--33.60,-28.80,1.00,0.00,1.00
--28.80,-28.80,1.00,0.00,1.00
--24.00,-24.00,1.00,0.00,1.00
--19.20,-19.20,1.00,0.00,1.00
--19.20,-19.20,1.00,0.00,1.00
--14.40,-14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-9.60,9.60,1.00,0.00,1.00
-14.40,14.40,1.00,0.00,1.00
-19.20,14.40,1.00,0.00,1.00
-24.00,19.20,1.00,0.00,1.00
-24.00,24.00,1.00,0.00,1.00
-28.80,24.00,1.00,0.00,1.00
-33.60,28.80,1.00,0.00,1.00
-38.40,28.80,1.00,0.00,1.00
-43.20,33.60,1.00,0.00,1.00
-48.00,33.60,1.00,0.00,1.00
-52.80,38.40,1.00,0.00,1.00
-62.40,38.40,1.00,0.00,1.00
-67.20,38.40,1.00,0.00,1.00
-72.00,38.40,1.00,0.00,1.00
-76.80,43.20,1.00,0.00,1.00
-86.40,43.20,1.00,0.00,1.00
-91.20,43.20,1.00,0.00,1.00
-96.00,43.20,1.00,0.00,1.00
-105.60,43.20,1.00,0.00,1.00
-110.40,38.40,1.00,0.00,1.00
-115.20,38.40,1.00,0.00,1.00
-120.00,38.40,1.00,0.00,1.00
-129.60,33.60,1.00,0.00,1.00
-134.40,33.60,1.00,0.00,1.00
-139.20,28.80,1.00,0.00,1.00
-144.00,28.80,1.00,0.00,1.00
-148.80,24.00,1.00,0.00,1.00
-153.60,24.00,1.00,0.00,1.00
-153.60,19.20,1.00,0.00,1.00
-158.40,19.20,1.00,0.00,1.00
-163.20,14.40,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
-172.80,9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--172.80,-9.60,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
--158.40,-19.20,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
--153.60,-24.00,1.00,0.00,1.00
--148.80,-24.00,1.00,0.00,1.00
--144.00,-28.80,1.00,0.00,1.00
--139.20,-28.80,1.00,0.00,1.00
--134.40,-33.60,1.00,0.00,1.00
--129.60,-33.60,1.00,0.00,1.00
--120.00,-38.40,1.00,0.00,1.00
--115.20,-38.40,1.00,0.00,1.00
--110.40,-38.40,1.00,0.00,1.00
--105.60,-43.20,1.00,0.00,1.00
--96.00,-43.20,1.00,0.00,1.00
--91.20,-43.20,1.00,0.00,1.00
--86.40,-43.20,1.00,0.00,1.00
--76.80,-43.20,1.00,0.00,1.00
--72.00,-38.40,1.00,0.00,1.00
--67.20,-38.40,1.00,0.00,1.00
--62.40,-38.40,1.00,0.00,1.00
--52.80,-38.40,1.00,0.00,1.00
--48.00,-33.60,1.00,0.00,1.00
--43.20,-33.60,1.00,0.00,1.00
--38.40,-28.80,1.00,0.00,1.00
--33.60,-28.80,1.00,0.00,1.00
--28.80,-24.00,1.00,0.00,1.00
--24.00,-24.00,1.00,0.00,1.00
--24.00,-19.20,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
--14.40,-14.40,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
-9.60,9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
-19.20,14.40,1.00,0.00,1.00
-24.00,19.20,1.00,0.00,1.00
-28.80,19.20,1.00,0.00,1.00
-33.60,24.00,1.00,0.00,1.00
-38.40,24.00,1.00,0.00,1.00
-43.20,28.80,1.00,0.00,1.00
-48.00,28.80,1.00,0.00,1.00
-52.80,28.80,1.00,0.00,1.00
-57.60,33.60,1.00,0.00,1.00
-62.40,33.60,1.00,0.00,1.00
-67.20,33.60,1.00,0.00,1.00
-72.00,38.40,1.00,0.00,1.00
-81.60,38.40,1.00,0.00,1.00
-86.40,38.40,1.00,0.00,1.00
-91.20,38.40,1.00,0.00,1.00
-96.00,38.40,1.00,0.00,1.00
-105.60,38.40,1.00,0.00,1.00
-110.40,33.60,1.00,0.00,1.00
-115.20,33.60,1.00,0.00,1.00
-120.00,33.60,1.00,0.00,1.00
-124.80,33.60,1.00,0.00,1.00
-129.60,28.80,1.00,0.00,1.00
-134.40,28.80,1.00,0.00,1.00
-139.20,24.00,1.00,0.00,1.00
-144.00,24.00,1.00,0.00,1.00
-148.80,19.20,1.00,0.00,1.00
-153.60,19.20,1.00,0.00,1.00
-158.40,14.40,1.00,0.00,1.00
-163.20,14.40,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
--163.20,-14.40,1.00,0.00,1.00
--158.40,-14.40,1.00,0.00,1.00
--153.60,-19.20,1.00,0.00,1.00
--148.80,-19.20,1.00,0.00,1.00
--144.00,-24.00,1.00,0.00,1.00
--139.20,-24.00,1.00,0.00,1.00
--134.40,-28.80,1.00,0.00,1.00
--129.60,-28.80,1.00,0.00,1.00
--124.80,-33.60,1.00,0.00,1.00
--120.00,-33.60,1.00,0.00,1.00
--115.20,-33.60,1.00,0.00,1.00
--110.40,-33.60,1.00,0.00,1.00
--105.60,-38.40,1.00,0.00,1.00
--96.00,-38.40,1.00,0.00,1.00
--91.20,-38.40,1.00,0.00,1.00
--86.40,-38.40,1.00,0.00,1.00
--81.60,-38.40,1.00,0.00,1.00
--72.00,-38.40,1.00,0.00,1.00
--67.20,-33.60,1.00,0.00,1.00
--62.40,-33.60,1.00,0.00,1.00
--57.60,-33.60,1.00,0.00,1.00
--52.80,-28.80,1.00,0.00,1.00
--48.00,-28.80,1.00,0.00,1.00
--43.20,-28.80,1.00,0.00,1.00
--38.40,-24.00,1.00,0.00,1.00
--33.60,-24.00,1.00,0.00,1.00
--28.80,-19.20,1.00,0.00,1.00
--24.00,-19.20,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
--14.40,-9.60,1.00,0.00,1.00
--9.60,-9.60,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,4.80,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
-14.40,9.60,1.00,0.00,1.00
-19.20,14.40,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
-28.80,19.20,1.00,0.00,1.00
-33.60,19.20,1.00,0.00,1.00
-38.40,19.20,1.00,0.00,1.00
-43.20,24.00,1.00,0.00,1.00
-48.00,24.00,1.00,0.00,1.00
-52.80,28.80,1.00,0.00,1.00
-57.60,28.80,1.00,0.00,1.00
-62.40,28.80,1.00,0.00,1.00
-67.20,28.80,1.00,0.00,1.00
-76.80,33.60,1.00,0.00,1.00
-81.60,33.60,1.00,0.00,1.00
-86.40,33.60,1.00,0.00,1.00
-91.20,33.60,1.00,0.00,1.00
-96.00,33.60,1.00,0.00,1.00
-100.80,33.60,1.00,0.00,1.00
-110.40,28.80,1.00,0.00,1.00
-115.20,28.80,1.00,0.00,1.00
-120.00,28.80,1.00,0.00,1.00
-124.80,28.80,1.00,0.00,1.00
-129.60,24.00,1.00,0.00,1.00
-134.40,24.00,1.00,0.00,1.00
-139.20,24.00,1.00,0.00,1.00
-144.00,19.20,1.00,0.00,1.00
-148.80,19.20,1.00,0.00,1.00
-153.60,14.40,1.00,0.00,1.00
-158.40,14.40,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
-168.00,9.60,1.00,0.00,1.00
-168.00,4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
--168.00,-9.60,1.00,0.00,1.00
--163.20,-9.60,1.00,0.00,1.00
--158.40,-14.40,1.00,0.00,1.00
--153.60,-14.40,1.00,0.00,1.00
--148.80,-19.20,1.00,0.00,1.00
--144.00,-19.20,1.00,0.00,1.00
--139.20,-24.00,1.00,0.00,1.00
--134.40,-24.00,1.00,0.00,1.00
--129.60,-24.00,1.00,0.00,1.00
--124.80,-28.80,1.00,0.00,1.00
--120.00,-28.80,1.00,0.00,1.00
--115.20,-28.80,1.00,0.00,1.00
--110.40,-28.80,1.00,0.00,1.00
--100.80,-33.60,1.00,0.00,1.00
--96.00,-33.60,1.00,0.00,1.00
--91.20,-33.60,1.00,0.00,1.00
--86.40,-33.60,1.00,0.00,1.00
--81.60,-33.60,1.00,0.00,1.00
--76.80,-33.60,1.00,0.00,1.00
--67.20,-28.80,1.00,0.00,1.00
--62.40,-28.80,1.00,0.00,1.00
--57.60,-28.80,1.00,0.00,1.00
--52.80,-28.80,1.00,0.00,1.00
--48.00,-24.00,1.00,0.00,1.00
--43.20,-24.00,1.00,0.00,1.00
--38.40,-19.20,1.00,0.00,1.00
--33.60,-19.20,1.00,0.00,1.00
--28.80,-19.20,1.00,0.00,1.00
--24.00,-14.40,1.00,0.00,1.00
--19.20,-14.40,1.00,0.00,1.00
--14.40,-9.60,1.00,0.00,1.00
--14.40,-9.60,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
--4.80,-4.80,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
-19.20,9.60,1.00,0.00,1.00
-19.20,9.60,1.00,0.00,1.00
-24.00,14.40,1.00,0.00,1.00
-28.80,14.40,1.00,0.00,1.00
-33.60,14.40,1.00,0.00,1.00
-38.40,19.20,1.00,0.00,1.00
-43.20,19.20,1.00,0.00,1.00
-48.00,24.00,1.00,0.00,1.00
-52.80,24.00,1.00,0.00,1.00
-57.60,24.00,1.00,0.00,1.00
-62.40,24.00,1.00,0.00,1.00
-72.00,24.00,1.00,0.00,1.00
-76.80,28.80,1.00,0.00,1.00
-81.60,28.80,1.00,0.00,1.00
-86.40,28.80,1.00,0.00,1.00
-91.20,28.80,1.00,0.00,1.00
-96.00,28.80,1.00,0.00,1.00
-100.80,28.80,1.00,0.00,1.00
-105.60,28.80,1.00,0.00,1.00
-110.40,24.00,1.00,0.00,1.00
-120.00,24.00,1.00,0.00,1.00
-124.80,24.00,1.00,0.00,1.00
-129.60,24.00,1.00,0.00,1.00
-134.40,19.20,1.00,0.00,1.00
-139.20,19.20,1.00,0.00,1.00
-144.00,19.20,1.00,0.00,1.00
-148.80,14.40,1.00,0.00,1.00
-153.60,14.40,1.00,0.00,1.00
-158.40,9.60,1.00,0.00,1.00
-158.40,9.60,1.00,0.00,1.00
-163.20,9.60,1.00,0.00,1.00
-168.00,4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
--163.20,-9.60,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
--153.60,-14.40,1.00,0.00,1.00
--148.80,-14.40,1.00,0.00,1.00
--144.00,-19.20,1.00,0.00,1.00
--139.20,-19.20,1.00,0.00,1.00
--134.40,-19.20,1.00,0.00,1.00
--129.60,-24.00,1.00,0.00,1.00
--124.80,-24.00,1.00,0.00,1.00
--120.00,-24.00,1.00,0.00,1.00
--110.40,-24.00,1.00,0.00,1.00
--105.60,-28.80,1.00,0.00,1.00
--100.80,-28.80,1.00,0.00,1.00
--96.00,-28.80,1.00,0.00,1.00
--91.20,-28.80,1.00,0.00,1.00
--86.40,-28.80,1.00,0.00,1.00
--81.60,-28.80,1.00,0.00,1.00
--76.80,-28.80,1.00,0.00,1.00
--72.00,-24.00,1.00,0.00,1.00
--62.40,-24.00,1.00,0.00,1.00
--57.60,-24.00,1.00,0.00,1.00
--52.80,-24.00,1.00,0.00,1.00
--48.00,-24.00,1.00,0.00,1.00
--43.20,-19.20,1.00,0.00,1.00
--38.40,-19.20,1.00,0.00,1.00
--33.60,-14.40,1.00,0.00,1.00
--28.80,-14.40,1.00,0.00,1.00
--24.00,-14.40,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
-19.20,9.60,1.00,0.00,1.00
-24.00,9.60,1.00,0.00,1.00
-28.80,9.60,1.00,0.00,1.00
-33.60,14.40,1.00,0.00,1.00
-38.40,14.40,1.00,0.00,1.00
-43.20,14.40,1.00,0.00,1.00
-48.00,14.40,1.00,0.00,1.00
-52.80,19.20,1.00,0.00,1.00
-57.60,19.20,1.00,0.00,1.00
-62.40,19.20,1.00,0.00,1.00
-67.20,19.20,1.00,0.00,1.00
-72.00,24.00,1.00,0.00,1.00
-76.80,24.00,1.00,0.00,1.00
-81.60,24.00,1.00,0.00,1.00
-86.40,24.00,1.00,0.00,1.00
-91.20,24.00,1.00,0.00,1.00
-96.00,24.00,1.00,0.00,1.00
-100.80,24.00,1.00,0.00,1.00
-105.60,24.00,1.00,0.00,1.00
-110.40,19.20,1.00,0.00,1.00
-115.20,19.20,1.00,0.00,1.00
-120.00,19.20,1.00,0.00,1.00
-124.80,19.20,1.00,0.00,1.00
-129.60,19.20,1.00,0.00,1.00
-134.40,14.40,1.00,0.00,1.00
-139.20,14.40,1.00,0.00,1.00
-144.00,14.40,1.00,0.00,1.00
-148.80,9.60,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
-158.40,9.60,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
-168.00,4.80,1.00,0.00,1.00
-172.80,4.80,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-4.80,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
--163.20,-4.80,1.00,0.00,1.00
--158.40,-9.60,1.00,0.00,1.00
--153.60,-9.60,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
--144.00,-14.40,1.00,0.00,1.00
--139.20,-14.40,1.00,0.00,1.00
--134.40,-14.40,1.00,0.00,1.00
--129.60,-19.20,1.00,0.00,1.00
--124.80,-19.20,1.00,0.00,1.00
--120.00,-19.20,1.00,0.00,1.00
--115.20,-19.20,1.00,0.00,1.00
--110.40,-19.20,1.00,0.00,1.00
--105.60,-24.00,1.00,0.00,1.00
--100.80,-24.00,1.00,0.00,1.00
--96.00,-24.00,1.00,0.00,1.00
--91.20,-24.00,1.00,0.00,1.00
--86.40,-24.00,1.00,0.00,1.00
--81.60,-24.00,1.00,0.00,1.00
--76.80,-24.00,1.00,0.00,1.00
--72.00,-24.00,1.00,0.00,1.00
--67.20,-19.20,1.00,0.00,1.00
--62.40,-19.20,1.00,0.00,1.00
--57.60,-19.20,1.00,0.00,1.00
--52.80,-19.20,1.00,0.00,1.00
--48.00,-14.40,1.00,0.00,1.00
--43.20,-14.40,1.00,0.00,1.00
--38.40,-14.40,1.00,0.00,1.00
--33.60,-14.40,1.00,0.00,1.00
--28.80,-9.60,1.00,0.00,1.00
--24.00,-9.60,1.00,0.00,1.00
--19.20,-9.60,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,4.80,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
-24.00,9.60,1.00,0.00,1.00
-28.80,9.60,1.00,0.00,1.00
-33.60,9.60,1.00,0.00,1.00
-38.40,9.60,1.00,0.00,1.00
-43.20,14.40,1.00,0.00,1.00
-48.00,14.40,1.00,0.00,1.00
-52.80,14.40,1.00,0.00,1.00
-57.60,14.40,1.00,0.00,1.00
-62.40,14.40,1.00,0.00,1.00
-67.20,14.40,1.00,0.00,1.00
-72.00,19.20,1.00,0.00,1.00
-76.80,19.20,1.00,0.00,1.00
-81.60,19.20,1.00,0.00,1.00
-86.40,19.20,1.00,0.00,1.00
-91.20,19.20,1.00,0.00,1.00
-96.00,19.20,1.00,0.00,1.00
-100.80,19.20,1.00,0.00,1.00
-105.60,19.20,1.00,0.00,1.00
-110.40,19.20,1.00,0.00,1.00
-115.20,14.40,1.00,0.00,1.00
-120.00,14.40,1.00,0.00,1.00
-124.80,14.40,1.00,0.00,1.00
-129.60,14.40,1.00,0.00,1.00
-134.40,14.40,1.00,0.00,1.00
-139.20,9.60,1.00,0.00,1.00
-144.00,9.60,1.00,0.00,1.00
-148.80,9.60,1.00,0.00,1.00
-153.60,9.60,1.00,0.00,1.00
-158.40,4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
-168.00,4.80,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-0.00,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
--163.20,-4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
--153.60,-9.60,1.00,0.00,1.00
--148.80,-9.60,1.00,0.00,1.00
--144.00,-9.60,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
--134.40,-14.40,1.00,0.00,1.00
--129.60,-14.40,1.00,0.00,1.00
--124.80,-14.40,1.00,0.00,1.00
--120.00,-14.40,1.00,0.00,1.00
--115.20,-14.40,1.00,0.00,1.00
--110.40,-19.20,1.00,0.00,1.00
--105.60,-19.20,1.00,0.00,1.00
--100.80,-19.20,1.00,0.00,1.00
--96.00,-19.20,1.00,0.00,1.00
--91.20,-19.20,1.00,0.00,1.00
--86.40,-19.20,1.00,0.00,1.00
--81.60,-19.20,1.00,0.00,1.00
--76.80,-19.20,1.00,0.00,1.00
--72.00,-19.20,1.00,0.00,1.00
--67.20,-14.40,1.00,0.00,1.00
--62.40,-14.40,1.00,0.00,1.00
--57.60,-14.40,1.00,0.00,1.00
--52.80,-14.40,1.00,0.00,1.00
--48.00,-14.40,1.00,0.00,1.00
--43.20,-14.40,1.00,0.00,1.00
--38.40,-9.60,1.00,0.00,1.00
--33.60,-9.60,1.00,0.00,1.00
--28.80,-9.60,1.00,0.00,1.00
--24.00,-9.60,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
--9.60,-4.80,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
-14.40,4.80,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
-24.00,4.80,1.00,0.00,1.00
-28.80,4.80,1.00,0.00,1.00
-33.60,9.60,1.00,0.00,1.00
-38.40,9.60,1.00,0.00,1.00
-43.20,9.60,1.00,0.00,1.00
-48.00,9.60,1.00,0.00,1.00
-52.80,9.60,1.00,0.00,1.00
-57.60,9.60,1.00,0.00,1.00
-62.40,9.60,1.00,0.00,1.00
-67.20,14.40,1.00,0.00,1.00
-72.00,14.40,1.00,0.00,1.00
-76.80,14.40,1.00,0.00,1.00
-81.60,14.40,1.00,0.00,1.00
-86.40,14.40,1.00,0.00,1.00
-91.20,14.40,1.00,0.00,1.00
-96.00,14.40,1.00,0.00,1.00
-100.80,14.40,1.00,0.00,1.00
-105.60,14.40,1.00,0.00,1.00
-110.40,14.40,1.00,0.00,1.00
-115.20,9.60,1.00,0.00,1.00
-120.00,9.60,1.00,0.00,1.00
-124.80,9.60,1.00,0.00,1.00
-129.60,9.60,1.00,0.00,1.00
-134.40,9.60,1.00,0.00,1.00
-139.20,9.60,1.00,0.00,1.00
-144.00,9.60,1.00,0.00,1.00
-148.80,4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
-158.40,4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
-168.00,4.80,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-0.00,1.00,0.00,1.00
--168.00,-4.80,1.00,0.00,1.00
--163.20,-4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
--153.60,-4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
--144.00,-9.60,1.00,0.00,1.00
--139.20,-9.60,1.00,0.00,1.00
--134.40,-9.60,1.00,0.00,1.00
--129.60,-9.60,1.00,0.00,1.00
--124.80,-9.60,1.00,0.00,1.00
--120.00,-9.60,1.00,0.00,1.00
--115.20,-9.60,1.00,0.00,1.00
--110.40,-14.40,1.00,0.00,1.00
--105.60,-14.40,1.00,0.00,1.00
--100.80,-14.40,1.00,0.00,1.00
--96.00,-14.40,1.00,0.00,1.00
--91.20,-14.40,1.00,0.00,1.00
--86.40,-14.40,1.00,0.00,1.00
--81.60,-14.40,1.00,0.00,1.00
--76.80,-14.40,1.00,0.00,1.00
--72.00,-14.40,1.00,0.00,1.00
--67.20,-14.40,1.00,0.00,1.00
--62.40,-9.60,1.00,0.00,1.00
--57.60,-9.60,1.00,0.00,1.00
--52.80,-9.60,1.00,0.00,1.00
--48.00,-9.60,1.00,0.00,1.00
--43.20,-9.60,1.00,0.00,1.00
--38.40,-9.60,1.00,0.00,1.00
--33.60,-9.60,1.00,0.00,1.00
--28.80,-4.80,1.00,0.00,1.00
--24.00,-4.80,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
--14.40,-4.80,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
-19.20,4.80,1.00,0.00,1.00
-24.00,4.80,1.00,0.00,1.00
-28.80,4.80,1.00,0.00,1.00
-33.60,4.80,1.00,0.00,1.00
-38.40,4.80,1.00,0.00,1.00
-43.20,4.80,1.00,0.00,1.00
-48.00,4.80,1.00,0.00,1.00
-52.80,4.80,1.00,0.00,1.00
-57.60,4.80,1.00,0.00,1.00
-62.40,9.60,1.00,0.00,1.00
-67.20,9.60,1.00,0.00,1.00
-72.00,9.60,1.00,0.00,1.00
-76.80,9.60,1.00,0.00,1.00
-81.60,9.60,1.00,0.00,1.00
-86.40,9.60,1.00,0.00,1.00
-91.20,9.60,1.00,0.00,1.00
-96.00,9.60,1.00,0.00,1.00
-100.80,9.60,1.00,0.00,1.00
-105.60,9.60,1.00,0.00,1.00
-110.40,9.60,1.00,0.00,1.00
-115.20,9.60,1.00,0.00,1.00
-120.00,9.60,1.00,0.00,1.00
-124.80,4.80,1.00,0.00,1.00
-129.60,4.80,1.00,0.00,1.00
-134.40,4.80,1.00,0.00,1.00
-139.20,4.80,1.00,0.00,1.00
-144.00,4.80,1.00,0.00,1.00
-148.80,4.80,1.00,0.00,1.00
-153.60,4.80,1.00,0.00,1.00
-158.40,4.80,1.00,0.00,1.00
-163.20,4.80,1.00,0.00,1.00
-168.00,0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
--163.20,-4.80,1.00,0.00,1.00
--158.40,-4.80,1.00,0.00,1.00
--153.60,-4.80,1.00,0.00,1.00
--148.80,-4.80,1.00,0.00,1.00
--144.00,-4.80,1.00,0.00,1.00
--139.20,-4.80,1.00,0.00,1.00
--134.40,-4.80,1.00,0.00,1.00
--129.60,-4.80,1.00,0.00,1.00
--124.80,-4.80,1.00,0.00,1.00
--120.00,-9.60,1.00,0.00,1.00
--115.20,-9.60,1.00,0.00,1.00
--110.40,-9.60,1.00,0.00,1.00
--105.60,-9.60,1.00,0.00,1.00
--100.80,-9.60,1.00,0.00,1.00
--96.00,-9.60,1.00,0.00,1.00
--91.20,-9.60,1.00,0.00,1.00
--86.40,-9.60,1.00,0.00,1.00
--81.60,-9.60,1.00,0.00,1.00
--76.80,-9.60,1.00,0.00,1.00
--72.00,-9.60,1.00,0.00,1.00
--67.20,-9.60,1.00,0.00,1.00
--62.40,-9.60,1.00,0.00,1.00
--57.60,-4.80,1.00,0.00,1.00
--52.80,-4.80,1.00,0.00,1.00
--48.00,-4.80,1.00,0.00,1.00
--43.20,-4.80,1.00,0.00,1.00
--38.40,-4.80,1.00,0.00,1.00
--33.60,-4.80,1.00,0.00,1.00
--28.80,-4.80,1.00,0.00,1.00
--24.00,-4.80,1.00,0.00,1.00
--19.20,-4.80,1.00,0.00,1.00
--14.40,-0.00,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,0.00,1.00,0.00,1.00
-9.60,0.00,1.00,0.00,1.00
-14.40,0.00,1.00,0.00,1.00
-19.20,0.00,1.00,0.00,1.00
-24.00,0.00,1.00,0.00,1.00
-28.80,0.00,1.00,0.00,1.00
-33.60,0.00,1.00,0.00,1.00
-38.40,0.00,1.00,0.00,1.00
-43.20,4.80,1.00,0.00,1.00
-48.00,4.80,1.00,0.00,1.00
-52.80,4.80,1.00,0.00,1.00
-57.60,4.80,1.00,0.00,1.00
-62.40,4.80,1.00,0.00,1.00
-67.20,4.80,1.00,0.00,1.00
-72.00,4.80,1.00,0.00,1.00
-76.80,4.80,1.00,0.00,1.00
-81.60,4.80,1.00,0.00,1.00
-86.40,4.80,1.00,0.00,1.00
-91.20,4.80,1.00,0.00,1.00
-96.00,4.80,1.00,0.00,1.00
-100.80,4.80,1.00,0.00,1.00
-105.60,4.80,1.00,0.00,1.00
-110.40,4.80,1.00,0.00,1.00
-115.20,4.80,1.00,0.00,1.00
-120.00,4.80,1.00,0.00,1.00
-124.80,4.80,1.00,0.00,1.00
-129.60,4.80,1.00,0.00,1.00
-134.40,4.80,1.00,0.00,1.00
-139.20,0.00,1.00,0.00,1.00
-144.00,0.00,1.00,0.00,1.00
-148.80,0.00,1.00,0.00,1.00
-153.60,0.00,1.00,0.00,1.00
-158.40,0.00,1.00,0.00,1.00
-163.20,0.00,1.00,0.00,1.00
-168.00,0.00,1.00,0.00,1.00
-172.80,0.00,1.00,0.00,1.00
-177.60,0.00,1.00,0.00,1.00
--177.60,-0.00,1.00,0.00,1.00
--172.80,-0.00,1.00,0.00,1.00
--168.00,-0.00,1.00,0.00,1.00
--163.20,-0.00,1.00,0.00,1.00
--158.40,-0.00,1.00,0.00,1.00
--153.60,-0.00,1.00,0.00,1.00
--148.80,-0.00,1.00,0.00,1.00
--144.00,-0.00,1.00,0.00,1.00
--139.20,-0.00,1.00,0.00,1.00
--134.40,-4.80,1.00,0.00,1.00
--129.60,-4.80,1.00,0.00,1.00
--124.80,-4.80,1.00,0.00,1.00
--120.00,-4.80,1.00,0.00,1.00
--115.20,-4.80,1.00,0.00,1.00
--110.40,-4.80,1.00,0.00,1.00
--105.60,-4.80,1.00,0.00,1.00
--100.80,-4.80,1.00,0.00,1.00
--96.00,-4.80,1.00,0.00,1.00
--91.20,-4.80,1.00,0.00,1.00
--86.40,-4.80,1.00,0.00,1.00
--81.60,-4.80,1.00,0.00,1.00
--76.80,-4.80,1.00,0.00,1.00
--72.00,-4.80,1.00,0.00,1.00
--67.20,-4.80,1.00,0.00,1.00
--62.40,-4.80,1.00,0.00,1.00
--57.60,-4.80,1.00,0.00,1.00
--52.80,-4.80,1.00,0.00,1.00
--48.00,-4.80,1.00,0.00,1.00
--43.20,-4.80,1.00,0.00,1.00
--38.40,-0.00,1.00,0.00,1.00
--33.60,-0.00,1.00,0.00,1.00
--28.80,-0.00,1.00,0.00,1.00
--24.00,-0.00,1.00,0.00,1.00
--19.20,-0.00,1.00,0.00,1.00
--14.40,-0.00,1.00,0.00,1.00
--9.60,-0.00,1.00,0.00,1.00
--4.80,-0.00,1.00,0.00,1.00
-0.00,0.00,1.00,0.00,1.00
-4.80,-0.00,1.00,0.00,1.00
-9.60,-0.00,1.00,0.00,1.00
-14.40,-0.00,1.00,0.00,1.00
-19.20,-0.00,1.00,0.00,1.00
-24.00,-0.00,1.00,0.00,1.00
-28.80,-0.00,1.00,0.00,1.00
-33.60,-0.00,1.00,0.00,1.00
-38.40,-0.00,1.00,0.00,1.00
-43.20,-0.00,1.00,0.00,1.00
-48.00,-0.00,1.00,0.00,1.00
-52.80,-0.00,1.00,0.00,1.00
-57.60,-0.00,1.00,0.00,1.00
-62.40,-0.00,1.00,0.00,1.00
-67.20,-0.00,1.00,0.00,1.00
-72.00,-0.00,1.00,0.00,1.00
-76.80,-0.00,1.00,0.00,1.00
-81.60,-0.00,1.00,0.00,1.00
-86.40,-0.00,1.00,0.00,1.00
-91.20,-0.00,1.00,0.00,1.00
-96.00,-0.00,1.00,0.00,1.00
-100.80,-0.00,1.00,0.00,1.00
-105.60,-0.00,1.00,0.00,1.00
-110.40,-0.00,1.00,0.00,1.00
-115.20,-0.00,1.00,0.00,1.00
-120.00,-0.00,1.00,0.00,1.00
-124.80,-0.00,1.00,0.00,1.00
-129.60,-0.00,1.00,0.00,1.00
-134.40,-0.00,1.00,0.00,1.00
-139.20,-0.00,1.00,0.00,1.00
-144.00,-0.00,1.00,0.00,1.00
-148.80,-0.00,1.00,0.00,1.00
-153.60,-0.00,1.00,0.00,1.00
-158.40,-0.00,1.00,0.00,1.00
-163.20,-0.00,1.00,0.00,1.00
-168.00,-0.00,1.00,0.00,1.00
-172.80,-0.00,1.00,0.00,1.00
-177.60,-0.00,1.00,0.00,1.00
--177.60,0.00,1.00,0.00,1.00
--172.80,0.00,1.00,0.00,1.00
--168.00,0.00,1.00,0.00,1.00
--163.20,0.00,1.00,0.00,1.00
--158.40,0.00,1.00,0.00,1.00
--153.60,0.00,1.00,0.00,1.00
--148.80,0.00,1.00,0.00,1.00
--144.00,0.00,1.00,0.00,1.00
--139.20,0.00,1.00,0.00,1.00
--134.40,0.00,1.00,0.00,1.00
--129.60,0.00,1.00,0.00,1.00
--124.80,0.00,1.00,0.00,1.00
--120.00,0.00,1.00,0.00,1.00
--115.20,0.00,1.00,0.00,1.00
--110.40,0.00,1.00,0.00,1.00
--105.60,0.00,1.00,0.00,1.00
--100.80,0.00,1.00,0.00,1.00
--96.00,0.00,1.00,0.00,1.00
--91.20,0.00,1.00,0.00,1.00
--86.40,0.00,1.00,0.00,1.00
--81.60,0.00,1.00,0.00,1.00
--76.80,0.00,1.00,0.00,1.00
--72.00,0.00,1.00,0.00,1.00
--67.20,0.00,1.00,0.00,1.00
--62.40,0.00,1.00,0.00,1.00
--57.60,0.00,1.00,0.00,1.00
--52.80,0.00,1.00,0.00,1.00
--48.00,0.00,1.00,0.00,1.00
--43.20,0.00,1.00,0.00,1.00
--38.40,0.00,1.00,0.00,1.00
--33.60,0.00,1.00,0.00,1.00
--28.80,0.00,1.00,0.00,1.00
--24.00,0.00,1.00,0.00,1.00
--19.20,0.00,1.00,0.00,1.00
--14.40,0.00,1.00,0.00,1.00
--9.60,0.00,1.00,0.00,1.00
--4.80,0.00,1.00,0.00,1.00
+-0.00,0.00,0.00,0.00,1.00,0.00,4.80,0
+-0.00,4.80,0.06,0.00,1.00,4.80,9.60,0
+-0.00,9.60,0.13,0.00,1.00,9.60,14.40,0
+-0.00,14.40,0.19,0.00,1.00,14.40,19.20,0
+-0.00,19.20,0.26,0.00,1.00,19.20,24.00,0
+-0.00,24.00,0.32,0.00,1.00,24.00,28.80,0
+-0.00,28.80,0.39,0.00,1.00,28.80,33.60,0
+-0.00,33.60,0.45,0.00,1.00,33.60,38.40,0
+-0.00,38.40,0.51,0.00,1.00,38.40,43.20,0
+-0.00,43.20,0.58,0.00,1.00,43.20,48.00,0
+-0.00,48.00,0.64,0.00,1.00,48.00,52.80,0
+-0.00,52.80,0.71,0.00,1.00,52.80,57.60,0
+-0.00,57.60,0.77,0.00,1.00,57.60,62.40,0
+-0.00,62.40,0.84,0.00,1.00,62.40,67.20,0
+-0.00,67.20,0.90,0.00,1.00,67.20,72.00,0
+-0.00,72.00,0.96,0.00,1.00,72.00,76.80,0
+-0.00,76.80,1.03,0.00,1.00,76.80,81.60,0
+-0.00,81.60,1.09,0.00,1.00,81.60,86.40,0
+-0.00,86.40,1.16,0.00,1.00,86.40,86.40,0
+-177.60,89.20,1.22,0.00,1.00,91.20,81.60,0
+-177.60,86.40,1.29,0.00,1.00,96.00,76.80,0
+-177.60,81.60,1.35,0.00,1.00,100.80,72.00,0
+-177.60,76.80,1.41,0.00,1.00,105.60,67.20,0
+-177.60,72.00,1.48,0.00,1.00,110.40,62.40,0
+-177.60,67.20,1.54,0.00,1.00,115.20,57.60,0
+177.60,62.40,1.61,0.00,1.00,120.00,52.80,0
+177.60,57.60,1.67,0.00,1.00,124.80,48.00,0
+177.60,52.80,1.73,0.00,1.00,129.60,43.20,0
+177.60,48.00,1.80,0.00,1.00,134.40,38.40,0
+177.60,43.20,1.86,0.00,1.00,139.20,33.60,0
+177.60,38.40,1.93,0.00,1.00,144.00,28.80,0
+177.60,33.60,1.99,0.00,1.00,148.80,24.00,0
+177.60,28.80,2.06,0.00,1.00,153.60,19.20,0
+177.60,24.00,2.12,0.00,1.00,158.40,14.40,0
+177.60,19.20,2.18,0.00,1.00,163.20,9.60,0
+177.60,14.40,2.25,0.00,1.00,168.00,4.80,0
+177.60,9.60,2.31,0.00,1.00,172.80,0.00,0
+177.60,4.80,2.38,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60,0
+-177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40,0
+-177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20,0
+-177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00,0
+-177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80,0
+-177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60,0
+-177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40,0
+-177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20,0
+-177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00,0
+-177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80,0
+-177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60,0
+-177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40,0
+177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20,0
+177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00,0
+177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80,0
+177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60,0
+177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40,0
+177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40,0
+0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60,0
+0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80,0
+0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00,0
+0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20,0
+0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40,0
+0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60,0
+0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80,0
+0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00,0
+0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20,0
+0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40,0
+0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60,0
+0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80,0
+0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00,0
+0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20,0
+0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40,0
+0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60,0
+0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80,0
+0.00,-4.80,4.76,0.00,1.00,-4.80,0.00,0
+0.00,0.00,4.82,0.00,1.00,0.00,4.80,0
+0.00,4.80,4.88,0.00,1.00,4.80,9.60,0
+0.00,9.60,4.95,0.00,1.00,9.60,14.40,0
+0.00,14.40,5.01,0.00,1.00,14.40,19.20,0
+0.00,19.20,5.08,0.00,1.00,19.20,24.00,0
+0.00,24.00,5.14,0.00,1.00,24.00,28.80,0
+4.80,28.80,5.20,0.00,1.00,28.80,33.60,0
+4.80,33.60,5.27,0.00,1.00,33.60,38.40,0
+4.80,38.40,5.33,0.00,1.00,38.40,43.20,0
+4.80,43.20,5.40,0.00,1.00,43.20,48.00,0
+4.80,48.00,5.46,0.00,1.00,48.00,52.80,0
+4.80,52.80,5.53,0.00,1.00,52.80,57.60,0
+9.60,57.60,5.59,0.00,1.00,57.60,62.40,0
+9.60,62.40,5.65,0.00,1.00,62.40,67.20,0
+9.60,67.20,5.72,0.00,1.00,67.20,72.00,0
+14.40,72.00,5.78,0.00,1.00,72.00,76.80,0
+19.20,76.80,5.85,0.00,1.00,76.80,81.60,0
+28.80,81.60,5.91,0.00,1.00,81.60,86.40,0
+52.80,86.40,5.98,0.00,1.00,86.40,86.40,0
+105.60,86.40,6.04,0.00,1.00,91.20,81.60,0
+139.20,81.60,6.10,0.00,1.00,96.00,76.80,0
+158.40,76.80,6.17,0.00,1.00,100.80,72.00,0
+163.20,72.00,6.23,0.00,1.00,105.60,67.20,0
+168.00,67.20,6.30,0.00,1.00,110.40,62.40,0
+168.00,62.40,6.36,0.00,1.00,115.20,57.60,0
+172.80,57.60,6.43,0.00,1.00,120.00,52.80,0
+172.80,52.80,6.49,0.00,1.00,124.80,48.00,0
+172.80,48.00,6.55,0.00,1.00,129.60,43.20,0
+172.80,43.20,6.62,0.00,1.00,134.40,38.40,0
+177.60,38.40,6.68,0.00,1.00,139.20,33.60,0
+177.60,33.60,6.75,0.00,1.00,144.00,28.80,0
+177.60,28.80,6.81,0.00,1.00,148.80,24.00,0
+177.60,24.00,6.88,0.00,1.00,153.60,19.20,0
+177.60,19.20,6.94,0.00,1.00,158.40,14.40,0
+177.60,14.40,7.00,0.00,1.00,163.20,9.60,0
+177.60,9.60,7.07,0.00,1.00,168.00,4.80,0
+177.60,4.80,7.13,0.00,1.00,172.80,0.00,0
+177.60,0.00,7.20,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60,0
+-177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40,0
+-177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20,0
+-177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00,0
+-177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80,0
+-177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60,0
+-177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40,0
+-177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20,0
+-172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00,0
+-172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80,0
+-172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60,0
+-172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40,0
+-168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20,0
+-168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00,0
+-163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80,0
+-158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60,0
+-139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40,0
+-105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40,0
+-52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60,0
+-28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80,0
+-19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00,0
+-14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20,0
+-9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40,0
+-9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60,0
+-9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80,0
+-4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00,0
+-4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20,0
+-4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40,0
+-4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60,0
+-4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80,0
+-4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00,0
+-0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20,0
+-0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40,0
+-0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60,0
+-0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,9.57,0.00,1.00,-4.80,0.00,0
+0.00,0.00,9.64,0.00,1.00,0.00,4.80,0
+0.00,4.80,9.70,0.00,1.00,4.80,9.60,0
+0.00,9.60,9.77,0.00,1.00,9.60,14.40,0
+4.80,14.40,9.83,0.00,1.00,14.40,19.20,0
+4.80,19.20,9.90,0.00,1.00,19.20,24.00,0
+4.80,24.00,9.96,0.00,1.00,24.00,28.80,0
+4.80,28.80,10.02,0.00,1.00,28.80,33.60,0
+4.80,33.60,10.09,0.00,1.00,33.60,38.40,0
+9.60,38.40,10.15,0.00,1.00,38.40,43.20,0
+9.60,43.20,10.22,0.00,1.00,43.20,48.00,0
+9.60,48.00,10.28,0.00,1.00,48.00,52.80,0
+14.40,52.80,10.35,0.00,1.00,52.80,57.60,0
+14.40,57.60,10.41,0.00,1.00,57.60,62.40,0
+19.20,62.40,10.47,0.00,1.00,62.40,67.20,0
+24.00,67.20,10.54,0.00,1.00,67.20,72.00,0
+28.80,72.00,10.60,0.00,1.00,72.00,72.00,0
+33.60,72.00,10.67,0.00,1.00,76.80,76.80,0
+48.00,76.80,10.73,0.00,1.00,81.60,81.60,0
+67.20,81.60,10.80,0.00,1.00,86.40,81.60,0
+96.00,81.60,10.86,0.00,1.00,91.20,81.60,0
+120.00,76.80,10.92,0.00,1.00,96.00,76.80,0
+139.20,76.80,10.99,0.00,1.00,100.80,72.00,0
+148.80,72.00,11.05,0.00,1.00,105.60,67.20,0
+153.60,67.20,11.12,0.00,1.00,110.40,62.40,0
+158.40,62.40,11.18,0.00,1.00,115.20,57.60,0
+163.20,57.60,11.24,0.00,1.00,120.00,52.80,0
+168.00,52.80,11.31,0.00,1.00,124.80,48.00,0
+168.00,48.00,11.37,0.00,1.00,129.60,43.20,0
+168.00,43.20,11.44,0.00,1.00,134.40,38.40,0
+172.80,38.40,11.50,0.00,1.00,139.20,33.60,0
+172.80,33.60,11.57,0.00,1.00,144.00,28.80,0
+172.80,28.80,11.63,0.00,1.00,148.80,24.00,0
+177.60,24.00,11.69,0.00,1.00,153.60,19.20,0
+177.60,19.20,11.76,0.00,1.00,158.40,14.40,0
+177.60,14.40,11.82,0.00,1.00,163.20,9.60,0
+177.60,9.60,11.89,0.00,1.00,168.00,4.80,0
+177.60,4.80,11.95,0.00,1.00,172.80,0.00,0
+177.60,0.00,12.02,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60,0
+-177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40,0
+-177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20,0
+-177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00,0
+-177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80,0
+-172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60,0
+-172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40,0
+-172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20,0
+-168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00,0
+-168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80,0
+-168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60,0
+-163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40,0
+-158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20,0
+-153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00,0
+-148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80,0
+-139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60,0
+-120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60,0
+-96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60,0
+-67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80,0
+-48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00,0
+-33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00,0
+-28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20,0
+-24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40,0
+-19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60,0
+-14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80,0
+-14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00,0
+-9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20,0
+-9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40,0
+-9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60,0
+-4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80,0
+-4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00,0
+-4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20,0
+-4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40,0
+-4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60,0
+-0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,14.39,0.00,1.00,-4.80,0.00,0
+0.00,0.00,14.46,0.00,1.00,0.00,4.80,0
+0.00,4.80,14.52,0.00,1.00,4.80,9.60,0
+4.80,9.60,14.59,0.00,1.00,9.60,14.40,0
+4.80,14.40,14.65,0.00,1.00,14.40,19.20,0
+4.80,19.20,14.71,0.00,1.00,19.20,24.00,0
+4.80,24.00,14.78,0.00,1.00,24.00,28.80,0
+9.60,28.80,14.84,0.00,1.00,28.80,33.60,0
+9.60,33.60,14.91,0.00,1.00,33.60,38.40,0
+9.60,38.40,14.97,0.00,1.00,38.40,43.20,0
+14.40,43.20,15.04,0.00,1.00,43.20,48.00,0
+14.40,48.00,15.10,0.00,1.00,48.00,52.80,0
+19.20,52.80,15.16,0.00,1.00,52.80,57.60,0
+19.20,52.80,15.23,0.00,1.00,57.60,57.60,0
+24.00,57.60,15.29,0.00,1.00,62.40,62.40,0
+28.80,62.40,15.36,0.00,1.00,67.20,67.20,0
+38.40,67.20,15.42,0.00,1.00,72.00,72.00,0
+48.00,72.00,15.49,0.00,1.00,76.80,72.00,0
+57.60,72.00,15.55,0.00,1.00,81.60,76.80,0
+76.80,76.80,15.61,0.00,1.00,86.40,76.80,0
+96.00,76.80,15.68,0.00,1.00,91.20,76.80,0
+115.20,76.80,15.74,0.00,1.00,96.00,72.00,0
+129.60,72.00,15.81,0.00,1.00,100.80,72.00,0
+139.20,67.20,15.87,0.00,1.00,105.60,67.20,0
+144.00,67.20,15.94,0.00,1.00,110.40,62.40,0
+153.60,62.40,16.00,0.00,1.00,115.20,57.60,0
+158.40,57.60,16.00,0.00,1.00,120.00,52.80,0
+158.40,52.80,15.94,0.00,1.00,124.80,48.00,0
+163.20,48.00,15.87,0.00,1.00,129.60,43.20,0
+168.00,43.20,15.81,0.00,1.00,134.40,38.40,0
+168.00,38.40,15.74,0.00,1.00,139.20,33.60,0
+168.00,33.60,15.68,0.00,1.00,144.00,28.80,0
+172.80,28.80,15.61,0.00,1.00,148.80,24.00,0
+172.80,24.00,15.55,0.00,1.00,153.60,19.20,0
+172.80,19.20,15.49,0.00,1.00,158.40,14.40,0
+177.60,14.40,15.42,0.00,1.00,163.20,9.60,0
+177.60,9.60,15.36,0.00,1.00,168.00,4.80,0
+177.60,4.80,15.29,0.00,1.00,172.80,0.00,0
+177.60,0.00,15.23,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60,0
+-177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40,0
+-177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20,0
+-172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00,0
+-172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80,0
+-172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60,0
+-168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40,0
+-168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20,0
+-168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00,0
+-163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80,0
+-158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60,0
+-158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40,0
+-153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20,0
+-144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00,0
+-139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00,0
+-129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80,0
+-115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80,0
+-96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80,0
+-76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00,0
+-57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00,0
+-48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20,0
+-38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40,0
+-28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60,0
+-24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60,0
+-19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80,0
+-19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00,0
+-14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20,0
+-14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40,0
+-9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60,0
+-9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80,0
+-9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00,0
+-4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20,0
+-4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40,0
+-4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60,0
+-4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,12.85,0.00,1.00,-4.80,0.00,0
+0.00,0.00,12.79,0.00,1.00,0.00,4.80,0
+0.00,4.80,12.72,0.00,1.00,4.80,9.60,0
+4.80,9.60,12.66,0.00,1.00,9.60,14.40,0
+4.80,14.40,12.59,0.00,1.00,14.40,19.20,0
+4.80,19.20,12.53,0.00,1.00,19.20,24.00,0
+9.60,24.00,12.47,0.00,1.00,24.00,28.80,0
+9.60,28.80,12.40,0.00,1.00,28.80,33.60,0
+14.40,33.60,12.34,0.00,1.00,33.60,38.40,0
+14.40,33.60,12.27,0.00,1.00,38.40,38.40,0
+19.20,38.40,12.21,0.00,1.00,43.20,43.20,0
+19.20,43.20,12.14,0.00,1.00,48.00,48.00,0
+24.00,48.00,12.08,0.00,1.00,52.80,52.80,0
+28.80,52.80,12.02,0.00,1.00,57.60,57.60,0
+33.60,57.60,11.95,0.00,1.00,62.40,62.40,0
+38.40,62.40,11.89,0.00,1.00,67.20,62.40,0
+43.20,62.40,11.82,0.00,1.00,72.00,67.20,0
+52.80,67.20,11.76,0.00,1.00,76.80,72.00,0
+67.20,67.20,11.69,0.00,1.00,81.60,72.00,0
+76.80,72.00,11.63,0.00,1.00,86.40,72.00,0
+96.00,72.00,11.57,0.00,1.00,91.20,72.00,0
+105.60,72.00,11.50,0.00,1.00,96.00,67.20,0
+120.00,67.20,11.44,0.00,1.00,100.80,67.20,0
+129.60,67.20,11.37,0.00,1.00,105.60,62.40,0
+139.20,62.40,11.31,0.00,1.00,110.40,57.60,0
+144.00,57.60,11.24,0.00,1.00,115.20,57.60,0
+148.80,52.80,11.18,0.00,1.00,120.00,52.80,0
+153.60,52.80,11.12,0.00,1.00,124.80,48.00,0
+158.40,48.00,11.05,0.00,1.00,129.60,43.20,0
+163.20,43.20,10.99,0.00,1.00,134.40,38.40,0
+163.20,38.40,10.92,0.00,1.00,139.20,33.60,0
+168.00,33.60,10.86,0.00,1.00,144.00,28.80,0
+168.00,28.80,10.80,0.00,1.00,148.80,24.00,0
+172.80,24.00,10.73,0.00,1.00,153.60,19.20,0
+172.80,19.20,10.67,0.00,1.00,158.40,14.40,0
+172.80,14.40,10.60,0.00,1.00,163.20,9.60,0
+177.60,9.60,10.54,0.00,1.00,168.00,4.80,0
+177.60,4.80,10.47,0.00,1.00,172.80,0.00,0
+177.60,0.00,10.41,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60,0
+-177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40,0
+-172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20,0
+-172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00,0
+-172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80,0
+-168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60,0
+-168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40,0
+-163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20,0
+-163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00,0
+-158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80,0
+-153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60,0
+-148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60,0
+-144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40,0
+-139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20,0
+-129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20,0
+-120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00,0
+-105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00,0
+-96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00,0
+-76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00,0
+-67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20,0
+-52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40,0
+-43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40,0
+-38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60,0
+-33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80,0
+-28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00,0
+-24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20,0
+-19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40,0
+-19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40,0
+-14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60,0
+-14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80,0
+-9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00,0
+-9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20,0
+-4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40,0
+-4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60,0
+-4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,8.03,0.00,1.00,-4.80,0.00,0
+0.00,0.00,7.97,0.00,1.00,0.00,4.80,0
+0.00,4.80,7.90,0.00,1.00,4.80,9.60,0
+4.80,9.60,7.84,0.00,1.00,9.60,14.40,0
+4.80,14.40,7.78,0.00,1.00,14.40,19.20,0
+9.60,19.20,7.71,0.00,1.00,19.20,24.00,0
+9.60,24.00,7.65,0.00,1.00,24.00,24.00,0
+14.40,24.00,7.58,0.00,1.00,28.80,28.80,0
+14.40,28.80,7.52,0.00,1.00,33.60,33.60,0
+19.20,33.60,7.45,0.00,1.00,33.60,38.40,0
+19.20,38.40,7.39,0.00,1.00,38.40,43.20,0
+24.00,43.20,7.33,0.00,1.00,43.20,48.00,0
+28.80,48.00,7.26,0.00,1.00,48.00,52.80,0
+33.60,52.80,7.20,0.00,1.00,57.60,52.80,0
+38.40,52.80,7.13,0.00,1.00,62.40,57.60,0
+43.20,57.60,7.07,0.00,1.00,67.20,62.40,0
+52.80,62.40,7.00,0.00,1.00,72.00,62.40,0
+62.40,62.40,6.94,0.00,1.00,76.80,67.20,0
+72.00,62.40,6.88,0.00,1.00,81.60,67.20,0
+81.60,67.20,6.81,0.00,1.00,86.40,67.20,0
+91.20,67.20,6.75,0.00,1.00,91.20,67.20,0
+105.60,67.20,6.68,0.00,1.00,96.00,67.20,0
+115.20,62.40,6.62,0.00,1.00,100.80,62.40,0
+124.80,62.40,6.55,0.00,1.00,105.60,57.60,0
+134.40,57.60,6.49,0.00,1.00,110.40,57.60,0
+139.20,57.60,6.43,0.00,1.00,115.20,52.80,0
+144.00,52.80,6.36,0.00,1.00,120.00,48.00,0
+148.80,48.00,6.30,0.00,1.00,129.60,43.20,0
+153.60,43.20,6.23,0.00,1.00,134.40,43.20,0
+158.40,38.40,6.17,0.00,1.00,139.20,38.40,0
+158.40,38.40,6.10,0.00,1.00,144.00,33.60,0
+163.20,33.60,6.04,0.00,1.00,148.80,28.80,0
+168.00,28.80,5.98,0.00,1.00,148.80,24.00,0
+168.00,24.00,5.91,0.00,1.00,153.60,19.20,0
+172.80,19.20,5.85,0.00,1.00,158.40,14.40,0
+172.80,14.40,5.78,0.00,1.00,163.20,9.60,0
+172.80,9.60,5.72,0.00,1.00,168.00,4.80,0
+177.60,4.80,5.65,0.00,1.00,172.80,0.00,0
+177.60,0.00,5.59,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40,0
+-172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20,0
+-172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00,0
+-168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80,0
+-168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60,0
+-163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40,0
+-158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20,0
+-158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20,0
+-153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00,0
+-148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80,0
+-144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60,0
+-139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60,0
+-134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40,0
+-124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20,0
+-115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20,0
+-105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20,0
+-91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20,0
+-81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20,0
+-72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40,0
+-62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40,0
+-52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60,0
+-43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80,0
+-38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80,0
+-33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00,0
+-28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20,0
+-24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40,0
+-19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60,0
+-19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80,0
+-14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00,0
+-14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00,0
+-9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20,0
+-9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40,0
+-4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60,0
+-4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,3.21,0.00,1.00,-4.80,0.00,0
+0.00,0.00,3.15,0.00,1.00,0.00,4.80,0
+0.00,4.80,3.08,0.00,1.00,4.80,9.60,0
+4.80,9.60,3.02,0.00,1.00,9.60,14.40,0
+4.80,14.40,2.96,0.00,1.00,14.40,19.20,0
+9.60,14.40,2.89,0.00,1.00,19.20,19.20,0
+14.40,19.20,2.83,0.00,1.00,19.20,24.00,0
+14.40,24.00,2.76,0.00,1.00,24.00,28.80,0
+19.20,28.80,2.70,0.00,1.00,28.80,33.60,0
+19.20,33.60,2.63,0.00,1.00,33.60,38.40,0
+24.00,38.40,2.57,0.00,1.00,38.40,43.20,0
+28.80,38.40,2.51,0.00,1.00,43.20,43.20,0
+33.60,43.20,2.44,0.00,1.00,48.00,48.00,0
+38.40,48.00,2.38,0.00,1.00,52.80,52.80,0
+43.20,52.80,2.31,0.00,1.00,57.60,52.80,0
+48.00,52.80,2.25,0.00,1.00,62.40,57.60,0
+57.60,57.60,2.18,0.00,1.00,72.00,57.60,0
+62.40,57.60,2.12,0.00,1.00,76.80,62.40,0
+72.00,62.40,2.06,0.00,1.00,81.60,62.40,0
+81.60,62.40,1.99,0.00,1.00,86.40,62.40,0
+91.20,62.40,1.93,0.00,1.00,91.20,62.40,0
+100.80,62.40,1.86,0.00,1.00,96.00,62.40,0
+110.40,57.60,1.80,0.00,1.00,100.80,57.60,0
+120.00,57.60,1.73,0.00,1.00,105.60,57.60,0
+129.60,57.60,1.67,0.00,1.00,115.20,52.80,0
+134.40,52.80,1.61,0.00,1.00,120.00,48.00,0
+139.20,48.00,1.54,0.00,1.00,124.80,48.00,0
+144.00,48.00,1.48,0.00,1.00,129.60,43.20,0
+148.80,43.20,1.41,0.00,1.00,134.40,38.40,0
+153.60,38.40,1.35,0.00,1.00,139.20,33.60,0
+158.40,33.60,1.29,0.00,1.00,144.00,33.60,0
+158.40,28.80,1.22,0.00,1.00,148.80,28.80,0
+163.20,28.80,1.16,0.00,1.00,153.60,24.00,0
+168.00,24.00,1.09,0.00,1.00,158.40,19.20,0
+168.00,19.20,1.03,0.00,1.00,163.20,14.40,0
+172.80,14.40,0.96,0.00,1.00,163.20,9.60,0
+172.80,9.60,0.90,0.00,1.00,168.00,4.80,0
+177.60,4.80,0.84,0.00,1.00,172.80,0.00,0
+177.60,0.00,0.77,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40,0
+-172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20,0
+-168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00,0
+-168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80,0
+-163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60,0
+-158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60,0
+-158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40,0
+-153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20,0
+-148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00,0
+-144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00,0
+-139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80,0
+-134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60,0
+-129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60,0
+-120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40,0
+-110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40,0
+-100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40,0
+-91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40,0
+-81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40,0
+-72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60,0
+-62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60,0
+-57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80,0
+-48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80,0
+-43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00,0
+-38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20,0
+-33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20,0
+-28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40,0
+-24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60,0
+-19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80,0
+-19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00,0
+-14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20,0
+-14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20,0
+-9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40,0
+-4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60,0
+-4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80,0
+-0.00,-4.80,3.88,0.00,1.00,-4.80,0.00,0
+0.00,0.00,4.04,0.00,1.00,0.00,4.80,0
+4.80,4.80,4.20,0.00,1.00,4.80,9.60,0
+4.80,9.60,4.36,0.00,1.00,9.60,14.40,0
+9.60,9.60,4.53,0.00,1.00,14.40,14.40,0
+9.60,14.40,4.69,0.00,1.00,14.40,19.20,0
+14.40,19.20,4.85,0.00,1.00,19.20,24.00,0
+19.20,24.00,5.01,0.00,1.00,24.00,28.80,0
+19.20,28.80,5.17,0.00,1.00,28.80,33.60,0
+24.00,28.80,5.33,0.00,1.00,33.60,33.60,0
+28.80,33.60,5.49,0.00,1.00,38.40,38.40,0
+33.60,38.40,5.66,0.00,1.00,43.20,43.20,0
+38.40,43.20,5.82,0.00,1.00,48.00,43.20,0
+43.20,43.20,5.98,0.00,1.00,52.80,48.00,0
+48.00,48.00,6.14,0.00,1.00,57.60,52.80,0
+52.80,48.00,6.30,0.00,1.00,62.40,52.80,0
+57.60,52.80,6.46,0.00,1.00,67.20,57.60,0
+67.20,52.80,6.63,0.00,1.00,72.00,57.60,0
+76.80,57.60,6.79,0.00,1.00,81.60,57.60,0
+81.60,57.60,6.95,0.00,1.00,86.40,57.60,0
+91.20,57.60,7.11,0.00,1.00,91.20,57.60,0
+100.80,57.60,7.27,0.00,1.00,96.00,57.60,0
+110.40,52.80,7.43,0.00,1.00,100.80,52.80,0
+115.20,52.80,7.60,0.00,1.00,110.40,52.80,0
+124.80,52.80,7.76,0.00,1.00,115.20,48.00,0
+129.60,48.00,7.92,0.00,1.00,120.00,48.00,0
+134.40,48.00,8.08,0.00,1.00,124.80,43.20,0
+139.20,43.20,8.24,0.00,1.00,129.60,38.40,0
+144.00,38.40,8.40,0.00,1.00,134.40,38.40,0
+148.80,38.40,8.57,0.00,1.00,139.20,33.60,0
+153.60,33.60,8.73,0.00,1.00,144.00,28.80,0
+158.40,28.80,8.89,0.00,1.00,148.80,24.00,0
+163.20,24.00,9.05,0.00,1.00,153.60,24.00,0
+163.20,24.00,9.21,0.00,1.00,158.40,19.20,0
+168.00,19.20,9.37,0.00,1.00,163.20,14.40,0
+172.80,14.40,9.54,0.00,1.00,168.00,9.60,0
+172.80,9.60,9.70,0.00,1.00,168.00,4.80,0
+177.60,4.80,9.86,0.00,1.00,172.80,0.00,0
+177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40,0
+-172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20,0
+-168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00,0
+-163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00,0
+-163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80,0
+-158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60,0
+-153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40,0
+-148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40,0
+-144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20,0
+-139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00,0
+-134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00,0
+-129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80,0
+-124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80,0
+-115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60,0
+-110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60,0
+-100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60,0
+-91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60,0
+-81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60,0
+-76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60,0
+-67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80,0
+-57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80,0
+-52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00,0
+-48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20,0
+-43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20,0
+-38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40,0
+-33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60,0
+-28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60,0
+-24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80,0
+-19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00,0
+-19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20,0
+-14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40,0
+-9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40,0
+-9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60,0
+-4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80,0
+-4.80,-4.80,16.00,0.00,1.00,-4.80,0.00,0
+0.00,0.00,16.00,0.00,1.00,0.00,4.80,0
+4.80,4.80,15.84,0.00,1.00,4.80,9.60,0
+4.80,9.60,15.68,0.00,1.00,9.60,9.60,0
+9.60,9.60,15.52,0.00,1.00,9.60,14.40,0
+14.40,14.40,15.35,0.00,1.00,14.40,19.20,0
+14.40,19.20,15.19,0.00,1.00,19.20,24.00,0
+19.20,24.00,15.03,0.00,1.00,24.00,24.00,0
+24.00,24.00,14.87,0.00,1.00,28.80,28.80,0
+24.00,28.80,14.71,0.00,1.00,33.60,33.60,0
+28.80,33.60,14.55,0.00,1.00,38.40,38.40,0
+33.60,33.60,14.38,0.00,1.00,43.20,38.40,0
+38.40,38.40,14.22,0.00,1.00,48.00,43.20,0
+43.20,43.20,14.06,0.00,1.00,52.80,43.20,0
+48.00,43.20,13.90,0.00,1.00,57.60,48.00,0
+57.60,48.00,13.74,0.00,1.00,62.40,48.00,0
+62.40,48.00,13.58,0.00,1.00,67.20,52.80,0
+67.20,48.00,13.41,0.00,1.00,72.00,52.80,0
+76.80,52.80,13.25,0.00,1.00,81.60,52.80,0
+86.40,52.80,13.09,0.00,1.00,86.40,52.80,0
+91.20,52.80,12.93,0.00,1.00,91.20,52.80,0
+100.80,52.80,12.77,0.00,1.00,96.00,52.80,0
+105.60,48.00,12.61,0.00,1.00,105.60,48.00,0
+115.20,48.00,12.44,0.00,1.00,110.40,48.00,0
+120.00,48.00,12.28,0.00,1.00,115.20,48.00,0
+124.80,43.20,12.12,0.00,1.00,120.00,43.20,0
+134.40,43.20,11.96,0.00,1.00,124.80,43.20,0
+139.20,38.40,11.80,0.00,1.00,129.60,38.40,0
+144.00,38.40,11.64,0.00,1.00,134.40,33.60,0
+148.80,33.60,11.47,0.00,1.00,139.20,33.60,0
+153.60,28.80,11.31,0.00,1.00,144.00,28.80,0
+153.60,28.80,11.15,0.00,1.00,148.80,24.00,0
+158.40,24.00,10.99,0.00,1.00,153.60,19.20,0
+163.20,19.20,10.83,0.00,1.00,158.40,19.20,0
+168.00,14.40,10.67,0.00,1.00,163.20,14.40,0
+168.00,14.40,10.51,0.00,1.00,168.00,9.60,0
+172.80,9.60,10.34,0.00,1.00,172.80,4.80,0
+177.60,4.80,10.18,0.00,1.00,172.80,0.00,0
+177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80,0
+-177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40,0
+-168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20,0
+-168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20,0
+-163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00,0
+-158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80,0
+-153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60,0
+-153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60,0
+-148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40,0
+-144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20,0
+-139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20,0
+-134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00,0
+-124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00,0
+-120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00,0
+-115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80,0
+-105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80,0
+-100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80,0
+-91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80,0
+-86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80,0
+-76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80,0
+-67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00,0
+-62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00,0
+-57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20,0
+-48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20,0
+-43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40,0
+-38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40,0
+-33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60,0
+-28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80,0
+-24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00,0
+-24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00,0
+-19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20,0
+-14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40,0
+-14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60,0
+-9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60,0
+-4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80,0
+-4.80,-4.80,4.04,0.00,1.00,-4.80,0.00,0
+0.00,0.00,3.88,0.00,1.00,0.00,4.80,0
+4.80,4.80,3.72,0.00,1.00,4.80,4.80,0
+4.80,4.80,3.56,0.00,1.00,4.80,9.60,0
+9.60,9.60,3.39,0.00,1.00,9.60,14.40,0
+14.40,14.40,3.23,0.00,1.00,14.40,19.20,0
+19.20,19.20,3.07,0.00,1.00,19.20,19.20,0
+19.20,19.20,2.91,0.00,1.00,24.00,24.00,0
+24.00,24.00,2.75,0.00,1.00,24.00,28.80,0
+28.80,28.80,2.59,0.00,1.00,28.80,28.80,0
+33.60,28.80,2.42,0.00,1.00,33.60,33.60,0
+38.40,33.60,2.26,0.00,1.00,38.40,38.40,0
+43.20,33.60,2.10,0.00,1.00,43.20,38.40,0
+48.00,38.40,1.94,0.00,1.00,48.00,43.20,0
+52.80,38.40,1.78,0.00,1.00,52.80,43.20,0
+57.60,43.20,1.62,0.00,1.00,62.40,43.20,0
+62.40,43.20,1.45,0.00,1.00,67.20,48.00,0
+72.00,43.20,1.29,0.00,1.00,72.00,48.00,0
+76.80,48.00,1.13,0.00,1.00,76.80,48.00,0
+86.40,48.00,0.97,0.00,1.00,86.40,48.00,0
+91.20,48.00,0.81,0.00,1.00,91.20,48.00,0
+100.80,48.00,0.65,0.00,1.00,96.00,48.00,0
+105.60,48.00,0.48,0.00,1.00,105.60,48.00,0
+110.40,43.20,0.32,0.00,1.00,110.40,43.20,0
+120.00,43.20,0.16,0.00,1.00,115.20,43.20,0
+124.80,43.20,0.00,0.00,1.00,124.80,38.40,0
+129.60,38.40,0.00,0.00,1.00,129.60,38.40,0
+134.40,38.40,0.04,0.00,1.00,134.40,33.60,0
+139.20,33.60,0.08,0.00,1.00,139.20,33.60,0
+144.00,33.60,0.12,0.00,1.00,144.00,28.80,0
+148.80,28.80,0.16,0.00,1.00,148.80,24.00,0
+153.60,24.00,0.20,0.00,1.00,153.60,24.00,0
+158.40,24.00,0.24,0.00,1.00,158.40,19.20,0
+163.20,19.20,0.28,0.00,1.00,158.40,14.40,0
+163.20,14.40,0.32,0.00,1.00,163.20,14.40,0
+168.00,14.40,0.36,0.00,1.00,168.00,9.60,0
+172.80,9.60,0.40,0.00,1.00,172.80,4.80,0
+172.80,4.80,0.44,0.00,1.00,172.80,0.00,0
+177.60,0.00,0.48,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40,0
+-168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40,0
+-163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20,0
+-163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00,0
+-158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00,0
+-153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80,0
+-148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60,0
+-144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60,0
+-139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40,0
+-134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40,0
+-129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20,0
+-124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20,0
+-120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00,0
+-110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00,0
+-105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00,0
+-100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00,0
+-91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00,0
+-86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00,0
+-76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00,0
+-72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20,0
+-62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20,0
+-57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20,0
+-52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40,0
+-48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40,0
+-43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60,0
+-38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80,0
+-33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80,0
+-28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00,0
+-24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20,0
+-19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20,0
+-19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40,0
+-14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60,0
+-9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80,0
+-4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80,0
+-4.80,-4.80,1.96,0.00,1.00,-4.80,0.00,0
+0.00,0.00,2.01,0.00,1.00,0.00,4.80,0
+4.80,4.80,2.05,0.00,1.00,4.80,4.80,0
+4.80,4.80,2.09,0.00,1.00,4.80,9.60,0
+9.60,9.60,2.13,0.00,1.00,9.60,14.40,0
+14.40,14.40,2.17,0.00,1.00,14.40,14.40,0
+19.20,14.40,2.21,0.00,1.00,14.40,19.20,0
+24.00,19.20,2.25,0.00,1.00,19.20,24.00,0
+24.00,24.00,2.29,0.00,1.00,24.00,24.00,0
+28.80,24.00,2.33,0.00,1.00,28.80,28.80,0
+33.60,28.80,2.37,0.00,1.00,33.60,28.80,0
+38.40,28.80,2.41,0.00,1.00,38.40,33.60,0
+43.20,33.60,2.45,0.00,1.00,43.20,33.60,0
+48.00,33.60,2.49,0.00,1.00,48.00,38.40,0
+52.80,38.40,2.53,0.00,1.00,52.80,38.40,0
+62.40,38.40,2.57,0.00,1.00,57.60,38.40,0
+67.20,38.40,2.61,0.00,1.00,62.40,43.20,0
+72.00,38.40,2.65,0.00,1.00,72.00,43.20,0
+76.80,43.20,2.69,0.00,1.00,76.80,43.20,0
+86.40,43.20,2.73,0.00,1.00,86.40,43.20,0
+91.20,43.20,2.77,0.00,1.00,91.20,43.20,0
+96.00,43.20,2.81,0.00,1.00,100.80,43.20,0
+105.60,43.20,2.85,0.00,1.00,105.60,43.20,0
+110.40,38.40,2.89,0.00,1.00,110.40,38.40,0
+115.20,38.40,2.93,0.00,1.00,120.00,38.40,0
+120.00,38.40,2.97,0.00,1.00,124.80,38.40,0
+129.60,33.60,3.01,0.00,1.00,129.60,33.60,0
+134.40,33.60,3.05,0.00,1.00,134.40,33.60,0
+139.20,28.80,3.09,0.00,1.00,139.20,28.80,0
+144.00,28.80,3.13,0.00,1.00,144.00,28.80,0
+148.80,24.00,3.17,0.00,1.00,148.80,24.00,0
+153.60,24.00,3.21,0.00,1.00,153.60,19.20,0
+153.60,19.20,3.25,0.00,1.00,158.40,19.20,0
+158.40,19.20,3.29,0.00,1.00,163.20,14.40,0
+163.20,14.40,3.33,0.00,1.00,163.20,9.60,0
+168.00,9.60,3.37,0.00,1.00,168.00,9.60,0
+172.80,9.60,3.41,0.00,1.00,172.80,4.80,0
+172.80,4.80,3.45,0.00,1.00,172.80,0.00,0
+177.60,0.00,3.49,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60,0
+-172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60,0
+-168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40,0
+-163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20,0
+-158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20,0
+-153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00,0
+-153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80,0
+-148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80,0
+-144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60,0
+-139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60,0
+-134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40,0
+-129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40,0
+-120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40,0
+-115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20,0
+-110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20,0
+-105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20,0
+-96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20,0
+-91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20,0
+-86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20,0
+-76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20,0
+-72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40,0
+-67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40,0
+-62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40,0
+-52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60,0
+-48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60,0
+-43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80,0
+-38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80,0
+-33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00,0
+-28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00,0
+-24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20,0
+-24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40,0
+-19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40,0
+-14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60,0
+-9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80,0
+-4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80,0
+-4.80,-4.80,4.97,0.00,1.00,-4.80,0.00,0
+0.00,0.00,5.01,0.00,1.00,0.00,4.80,0
+4.80,4.80,5.05,0.00,1.00,4.80,4.80,0
+9.60,4.80,5.09,0.00,1.00,4.80,9.60,0
+9.60,9.60,5.13,0.00,1.00,9.60,9.60,0
+14.40,9.60,5.17,0.00,1.00,9.60,14.40,0
+19.20,14.40,5.21,0.00,1.00,14.40,19.20,0
+24.00,19.20,5.25,0.00,1.00,19.20,19.20,0
+28.80,19.20,5.29,0.00,1.00,24.00,24.00,0
+33.60,24.00,5.33,0.00,1.00,24.00,24.00,0
+38.40,24.00,5.37,0.00,1.00,28.80,28.80,0
+43.20,28.80,5.41,0.00,1.00,33.60,28.80,0
+48.00,28.80,5.45,0.00,1.00,38.40,33.60,0
+52.80,28.80,5.49,0.00,1.00,43.20,33.60,0
+57.60,33.60,5.53,0.00,1.00,48.00,33.60,0
+62.40,33.60,5.57,0.00,1.00,52.80,38.40,0
+67.20,33.60,5.61,0.00,1.00,62.40,38.40,0
+72.00,38.40,5.65,0.00,1.00,67.20,38.40,0
+81.60,38.40,5.69,0.00,1.00,76.80,38.40,0
+86.40,38.40,5.73,0.00,1.00,86.40,38.40,0
+91.20,38.40,5.77,0.00,1.00,91.20,38.40,0
+96.00,38.40,5.81,0.00,1.00,100.80,38.40,0
+105.60,38.40,5.85,0.00,1.00,105.60,38.40,0
+110.40,33.60,5.89,0.00,1.00,115.20,33.60,0
+115.20,33.60,5.93,0.00,1.00,120.00,33.60,0
+120.00,33.60,5.97,0.00,1.00,129.60,33.60,0
+124.80,33.60,6.02,0.00,1.00,134.40,28.80,0
+129.60,28.80,6.06,0.00,1.00,139.20,28.80,0
+134.40,28.80,6.10,0.00,1.00,144.00,24.00,0
+139.20,24.00,6.14,0.00,1.00,148.80,24.00,0
+144.00,24.00,6.18,0.00,1.00,153.60,19.20,0
+148.80,19.20,6.22,0.00,1.00,158.40,19.20,0
+153.60,19.20,6.26,0.00,1.00,158.40,14.40,0
+158.40,14.40,6.30,0.00,1.00,163.20,14.40,0
+163.20,14.40,6.34,0.00,1.00,168.00,9.60,0
+168.00,9.60,6.38,0.00,1.00,168.00,9.60,0
+168.00,9.60,6.42,0.00,1.00,172.80,4.80,0
+172.80,4.80,6.46,0.00,1.00,177.60,0.00,0
+177.60,0.00,6.50,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60,0
+-168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60,0
+-168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40,0
+-163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40,0
+-158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20,0
+-153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20,0
+-148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00,0
+-144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00,0
+-139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80,0
+-134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80,0
+-129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60,0
+-124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60,0
+-120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60,0
+-115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40,0
+-110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40,0
+-105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40,0
+-96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40,0
+-91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40,0
+-86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40,0
+-81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40,0
+-72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40,0
+-67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60,0
+-62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60,0
+-57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60,0
+-52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80,0
+-48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80,0
+-43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00,0
+-38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00,0
+-33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20,0
+-28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20,0
+-24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40,0
+-19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60,0
+-14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60,0
+-9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80,0
+-9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80,0
+-4.80,-4.80,7.98,0.00,1.00,-4.80,0.00,0
+0.00,0.00,8.02,0.00,1.00,0.00,4.80,0
+4.80,4.80,8.06,0.00,1.00,4.80,4.80,0
+9.60,4.80,8.10,0.00,1.00,4.80,9.60,0
+14.40,9.60,8.14,0.00,1.00,9.60,9.60,0
+14.40,9.60,8.18,0.00,1.00,9.60,14.40,0
+19.20,14.40,8.22,0.00,1.00,14.40,14.40,0
+24.00,14.40,8.26,0.00,1.00,14.40,19.20,0
+28.80,19.20,8.30,0.00,1.00,19.20,19.20,0
+33.60,19.20,8.34,0.00,1.00,24.00,24.00,0
+38.40,19.20,8.38,0.00,1.00,28.80,24.00,0
+43.20,24.00,8.42,0.00,1.00,28.80,24.00,0
+48.00,24.00,8.46,0.00,1.00,33.60,28.80,0
+52.80,28.80,8.50,0.00,1.00,38.40,28.80,0
+57.60,28.80,8.54,0.00,1.00,48.00,28.80,0
+62.40,28.80,8.58,0.00,1.00,52.80,33.60,0
+67.20,28.80,8.62,0.00,1.00,57.60,33.60,0
+76.80,33.60,8.66,0.00,1.00,67.20,33.60,0
+81.60,33.60,8.70,0.00,1.00,76.80,33.60,0
+86.40,33.60,8.74,0.00,1.00,81.60,33.60,0
+91.20,33.60,8.78,0.00,1.00,91.20,33.60,0
+96.00,33.60,8.82,0.00,1.00,100.80,33.60,0
+100.80,33.60,8.86,0.00,1.00,110.40,33.60,0
+110.40,28.80,8.90,0.00,1.00,115.20,33.60,0
+115.20,28.80,8.94,0.00,1.00,124.80,28.80,0
+120.00,28.80,8.98,0.00,1.00,129.60,28.80,0
+124.80,28.80,9.02,0.00,1.00,139.20,28.80,0
+129.60,24.00,9.06,0.00,1.00,144.00,24.00,0
+134.40,24.00,9.10,0.00,1.00,148.80,24.00,0
+139.20,24.00,9.14,0.00,1.00,153.60,19.20,0
+144.00,19.20,9.18,0.00,1.00,153.60,19.20,0
+148.80,19.20,9.22,0.00,1.00,158.40,14.40,0
+153.60,14.40,9.26,0.00,1.00,163.20,14.40,0
+158.40,14.40,9.30,0.00,1.00,163.20,9.60,0
+163.20,9.60,9.34,0.00,1.00,168.00,9.60,0
+168.00,9.60,9.38,0.00,1.00,172.80,4.80,0
+168.00,4.80,9.42,0.00,1.00,172.80,4.80,0
+172.80,4.80,9.46,0.00,1.00,177.60,0.00,0
+177.60,0.00,9.50,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80,0
+-168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60,0
+-168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60,0
+-163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40,0
+-158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40,0
+-153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20,0
+-148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20,0
+-144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00,0
+-139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00,0
+-134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80,0
+-129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80,0
+-124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80,0
+-120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60,0
+-115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60,0
+-110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60,0
+-100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60,0
+-96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60,0
+-91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60,0
+-86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60,0
+-81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60,0
+-76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60,0
+-67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80,0
+-62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80,0
+-57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80,0
+-52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00,0
+-48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00,0
+-43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00,0
+-38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20,0
+-33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20,0
+-28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40,0
+-24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40,0
+-19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60,0
+-14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60,0
+-14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80,0
+-9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80,0
+-4.80,-4.80,10.99,0.00,1.00,-4.80,0.00,0
+0.00,0.00,11.03,0.00,1.00,0.00,0.00,0
+4.80,0.00,11.07,0.00,1.00,0.00,4.80,0
+9.60,4.80,11.11,0.00,1.00,4.80,4.80,0
+14.40,4.80,11.15,0.00,1.00,4.80,9.60,0
+19.20,9.60,11.19,0.00,1.00,9.60,9.60,0
+19.20,9.60,11.23,0.00,1.00,9.60,14.40,0
+24.00,14.40,11.27,0.00,1.00,14.40,14.40,0
+28.80,14.40,11.31,0.00,1.00,19.20,19.20,0
+33.60,14.40,11.35,0.00,1.00,19.20,19.20,0
+38.40,19.20,11.39,0.00,1.00,24.00,19.20,0
+43.20,19.20,11.43,0.00,1.00,28.80,24.00,0
+48.00,24.00,11.47,0.00,1.00,33.60,24.00,0
+52.80,24.00,11.51,0.00,1.00,38.40,24.00,0
+57.60,24.00,11.55,0.00,1.00,43.20,24.00,0
+62.40,24.00,11.59,0.00,1.00,48.00,28.80,0
+72.00,24.00,11.63,0.00,1.00,52.80,28.80,0
+76.80,28.80,11.67,0.00,1.00,62.40,28.80,0
+81.60,28.80,11.71,0.00,1.00,72.00,28.80,0
+86.40,28.80,11.75,0.00,1.00,81.60,28.80,0
+91.20,28.80,11.79,0.00,1.00,91.20,28.80,0
+96.00,28.80,11.83,0.00,1.00,100.80,28.80,0
+100.80,28.80,11.87,0.00,1.00,110.40,28.80,0
+105.60,28.80,11.91,0.00,1.00,120.00,28.80,0
+110.40,24.00,11.95,0.00,1.00,129.60,24.00,0
+120.00,24.00,11.99,0.00,1.00,134.40,24.00,0
+124.80,24.00,12.03,0.00,1.00,139.20,24.00,0
+129.60,24.00,12.07,0.00,1.00,144.00,24.00,0
+134.40,19.20,12.11,0.00,1.00,148.80,19.20,0
+139.20,19.20,12.15,0.00,1.00,153.60,19.20,0
+144.00,19.20,12.19,0.00,1.00,158.40,14.40,0
+148.80,14.40,12.23,0.00,1.00,163.20,14.40,0
+153.60,14.40,12.27,0.00,1.00,163.20,14.40,0
+158.40,9.60,12.31,0.00,1.00,168.00,9.60,0
+158.40,9.60,12.35,0.00,1.00,168.00,9.60,0
+163.20,9.60,12.39,0.00,1.00,172.80,4.80,0
+168.00,4.80,12.43,0.00,1.00,172.80,4.80,0
+172.80,4.80,12.47,0.00,1.00,177.60,0.00,0
+177.60,0.00,12.51,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80,0
+-168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60,0
+-163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60,0
+-158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40,0
+-158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40,0
+-153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40,0
+-148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20,0
+-144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20,0
+-139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00,0
+-134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00,0
+-129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00,0
+-124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00,0
+-120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80,0
+-110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80,0
+-105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80,0
+-100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80,0
+-96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80,0
+-91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80,0
+-86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80,0
+-81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80,0
+-76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80,0
+-72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00,0
+-62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00,0
+-57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00,0
+-52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00,0
+-48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20,0
+-43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20,0
+-38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20,0
+-33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40,0
+-28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40,0
+-24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60,0
+-19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60,0
+-19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80,0
+-14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80,0
+-9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00,0
+-4.80,-0.00,13.99,0.00,1.00,-0.00,0.00,0
+0.00,0.00,14.04,0.00,1.00,0.00,0.00,0
+4.80,0.00,14.08,0.00,1.00,0.00,4.80,0
+9.60,4.80,14.12,0.00,1.00,4.80,4.80,0
+14.40,4.80,14.16,0.00,1.00,4.80,9.60,0
+19.20,9.60,14.20,0.00,1.00,9.60,9.60,0
+24.00,9.60,14.24,0.00,1.00,9.60,9.60,0
+28.80,9.60,14.28,0.00,1.00,14.40,14.40,0
+33.60,14.40,14.32,0.00,1.00,14.40,14.40,0
+38.40,14.40,14.36,0.00,1.00,19.20,14.40,0
+43.20,14.40,14.40,0.00,1.00,19.20,19.20,0
+48.00,14.40,14.44,0.00,1.00,24.00,19.20,0
+52.80,19.20,14.48,0.00,1.00,28.80,19.20,0
+57.60,19.20,14.52,0.00,1.00,33.60,19.20,0
+62.40,19.20,14.56,0.00,1.00,38.40,24.00,0
+67.20,19.20,14.60,0.00,1.00,43.20,24.00,0
+72.00,24.00,14.64,0.00,1.00,48.00,24.00,0
+76.80,24.00,14.68,0.00,1.00,57.60,24.00,0
+81.60,24.00,14.72,0.00,1.00,67.20,24.00,0
+86.40,24.00,14.76,0.00,1.00,81.60,24.00,0
+91.20,24.00,14.80,0.00,1.00,91.20,24.00,0
+96.00,24.00,14.84,0.00,1.00,105.60,24.00,0
+100.80,24.00,14.88,0.00,1.00,115.20,24.00,0
+105.60,24.00,14.92,0.00,1.00,124.80,24.00,0
+110.40,19.20,14.96,0.00,1.00,134.40,19.20,0
+115.20,19.20,15.00,0.00,1.00,139.20,19.20,0
+120.00,19.20,15.04,0.00,1.00,144.00,19.20,0
+124.80,19.20,15.08,0.00,1.00,148.80,19.20,0
+129.60,19.20,15.12,0.00,1.00,153.60,19.20,0
+134.40,14.40,15.16,0.00,1.00,158.40,14.40,0
+139.20,14.40,15.20,0.00,1.00,163.20,14.40,0
+144.00,14.40,15.24,0.00,1.00,163.20,14.40,0
+148.80,9.60,15.28,0.00,1.00,168.00,9.60,0
+153.60,9.60,15.32,0.00,1.00,168.00,9.60,0
+158.40,9.60,15.36,0.00,1.00,172.80,4.80,0
+163.20,4.80,15.40,0.00,1.00,172.80,4.80,0
+168.00,4.80,15.44,0.00,1.00,177.60,4.80,0
+172.80,4.80,15.48,0.00,1.00,177.60,0.00,0
+177.60,0.00,15.52,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80,0
+-172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80,0
+-168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80,0
+-163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60,0
+-158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60,0
+-153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40,0
+-148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40,0
+-144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40,0
+-139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20,0
+-134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20,0
+-129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20,0
+-124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20,0
+-120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20,0
+-115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00,0
+-110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00,0
+-105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00,0
+-100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00,0
+-96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00,0
+-91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00,0
+-86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00,0
+-81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00,0
+-76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00,0
+-72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00,0
+-67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20,0
+-62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20,0
+-57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20,0
+-52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20,0
+-48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40,0
+-43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40,0
+-38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40,0
+-33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60,0
+-28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60,0
+-24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60,0
+-19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80,0
+-14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80,0
+-9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00,0
+-4.80,-0.00,15.04,0.00,1.00,-0.00,0.00,0
+0.00,0.00,15.00,0.00,1.00,0.00,0.00,0
+4.80,0.00,14.96,0.00,1.00,0.00,4.80,0
+9.60,4.80,14.92,0.00,1.00,4.80,4.80,0
+14.40,4.80,14.88,0.00,1.00,4.80,4.80,0
+19.20,4.80,14.84,0.00,1.00,4.80,9.60,0
+24.00,9.60,14.80,0.00,1.00,9.60,9.60,0
+28.80,9.60,14.76,0.00,1.00,9.60,9.60,0
+33.60,9.60,14.72,0.00,1.00,9.60,9.60,0
+38.40,9.60,14.68,0.00,1.00,14.40,14.40,0
+43.20,14.40,14.64,0.00,1.00,14.40,14.40,0
+48.00,14.40,14.60,0.00,1.00,19.20,14.40,0
+52.80,14.40,14.56,0.00,1.00,24.00,14.40,0
+57.60,14.40,14.52,0.00,1.00,24.00,19.20,0
+62.40,14.40,14.48,0.00,1.00,28.80,19.20,0
+67.20,14.40,14.44,0.00,1.00,38.40,19.20,0
+72.00,19.20,14.40,0.00,1.00,43.20,19.20,0
+76.80,19.20,14.36,0.00,1.00,52.80,19.20,0
+81.60,19.20,14.32,0.00,1.00,62.40,19.20,0
+86.40,19.20,14.28,0.00,1.00,76.80,19.20,0
+91.20,19.20,14.24,0.00,1.00,96.00,19.20,0
+96.00,19.20,14.20,0.00,1.00,110.40,19.20,0
+100.80,19.20,14.16,0.00,1.00,120.00,19.20,0
+105.60,19.20,14.12,0.00,1.00,134.40,19.20,0
+110.40,19.20,14.08,0.00,1.00,139.20,19.20,0
+115.20,14.40,14.04,0.00,1.00,148.80,14.40,0
+120.00,14.40,13.99,0.00,1.00,153.60,14.40,0
+124.80,14.40,13.95,0.00,1.00,158.40,14.40,0
+129.60,14.40,13.91,0.00,1.00,158.40,14.40,0
+134.40,14.40,13.87,0.00,1.00,163.20,14.40,0
+139.20,9.60,13.83,0.00,1.00,163.20,9.60,0
+144.00,9.60,13.79,0.00,1.00,168.00,9.60,0
+148.80,9.60,13.75,0.00,1.00,168.00,9.60,0
+153.60,9.60,13.71,0.00,1.00,172.80,4.80,0
+158.40,4.80,13.67,0.00,1.00,172.80,4.80,0
+163.20,4.80,13.63,0.00,1.00,172.80,4.80,0
+168.00,4.80,13.59,0.00,1.00,177.60,0.00,0
+172.80,0.00,13.55,0.00,1.00,177.60,0.00,0
+177.60,0.00,13.51,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00,0
+-172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80,0
+-168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80,0
+-163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80,0
+-158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60,0
+-153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60,0
+-148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60,0
+-144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40,0
+-139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40,0
+-134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40,0
+-129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40,0
+-124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40,0
+-120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20,0
+-115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20,0
+-110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20,0
+-105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20,0
+-100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20,0
+-96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20,0
+-91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20,0
+-86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20,0
+-81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20,0
+-76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20,0
+-72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20,0
+-67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20,0
+-62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40,0
+-57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40,0
+-52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40,0
+-48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40,0
+-43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60,0
+-38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60,0
+-33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60,0
+-28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60,0
+-24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80,0
+-19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80,0
+-14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80,0
+-9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00,0
+-4.80,-0.00,12.03,0.00,1.00,-0.00,0.00,0
+0.00,0.00,11.99,0.00,1.00,0.00,0.00,0
+4.80,0.00,11.95,0.00,1.00,0.00,0.00,0
+9.60,0.00,11.91,0.00,1.00,0.00,4.80,0
+14.40,4.80,11.87,0.00,1.00,4.80,4.80,0
+19.20,4.80,11.83,0.00,1.00,4.80,4.80,0
+24.00,4.80,11.79,0.00,1.00,4.80,4.80,0
+28.80,4.80,11.75,0.00,1.00,4.80,9.60,0
+33.60,9.60,11.71,0.00,1.00,9.60,9.60,0
+38.40,9.60,11.67,0.00,1.00,9.60,9.60,0
+43.20,9.60,11.63,0.00,1.00,14.40,9.60,0
+48.00,9.60,11.59,0.00,1.00,14.40,9.60,0
+52.80,9.60,11.55,0.00,1.00,14.40,14.40,0
+57.60,9.60,11.51,0.00,1.00,19.20,14.40,0
+62.40,9.60,11.47,0.00,1.00,24.00,14.40,0
+67.20,14.40,11.43,0.00,1.00,28.80,14.40,0
+72.00,14.40,11.39,0.00,1.00,33.60,14.40,0
+76.80,14.40,11.35,0.00,1.00,43.20,14.40,0
+81.60,14.40,11.31,0.00,1.00,57.60,14.40,0
+86.40,14.40,11.27,0.00,1.00,76.80,14.40,0
+91.20,14.40,11.23,0.00,1.00,96.00,14.40,0
+96.00,14.40,11.19,0.00,1.00,115.20,14.40,0
+100.80,14.40,11.15,0.00,1.00,129.60,14.40,0
+105.60,14.40,11.11,0.00,1.00,139.20,14.40,0
+110.40,14.40,11.07,0.00,1.00,148.80,14.40,0
+115.20,9.60,11.03,0.00,1.00,153.60,14.40,0
+120.00,9.60,10.99,0.00,1.00,158.40,9.60,0
+124.80,9.60,10.95,0.00,1.00,163.20,9.60,0
+129.60,9.60,10.91,0.00,1.00,163.20,9.60,0
+134.40,9.60,10.87,0.00,1.00,168.00,9.60,0
+139.20,9.60,10.83,0.00,1.00,168.00,9.60,0
+144.00,9.60,10.79,0.00,1.00,172.80,9.60,0
+148.80,4.80,10.75,0.00,1.00,172.80,4.80,0
+153.60,4.80,10.71,0.00,1.00,172.80,4.80,0
+158.40,4.80,10.67,0.00,1.00,172.80,4.80,0
+163.20,4.80,10.63,0.00,1.00,177.60,4.80,0
+168.00,4.80,10.59,0.00,1.00,177.60,0.00,0
+172.80,0.00,10.55,0.00,1.00,177.60,0.00,0
+177.60,0.00,10.51,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00,0
+-172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80,0
+-168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80,0
+-163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80,0
+-158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80,0
+-153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60,0
+-148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60,0
+-144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60,0
+-139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60,0
+-134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60,0
+-129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60,0
+-124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40,0
+-120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40,0
+-115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40,0
+-110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40,0
+-105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40,0
+-100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40,0
+-96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40,0
+-91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40,0
+-86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40,0
+-81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40,0
+-76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40,0
+-72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40,0
+-67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40,0
+-62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40,0
+-57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60,0
+-52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60,0
+-48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60,0
+-43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60,0
+-38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60,0
+-33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80,0
+-28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80,0
+-24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80,0
+-19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80,0
+-14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00,0
+-9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00,0
+-4.80,-0.00,9.02,0.00,1.00,-0.00,0.00,0
+0.00,0.00,8.98,0.00,1.00,0.00,0.00,0
+4.80,0.00,8.94,0.00,1.00,0.00,0.00,0
+9.60,0.00,8.90,0.00,1.00,0.00,0.00,0
+14.40,0.00,8.86,0.00,1.00,0.00,4.80,0
+19.20,4.80,8.82,0.00,1.00,4.80,4.80,0
+24.00,4.80,8.78,0.00,1.00,4.80,4.80,0
+28.80,4.80,8.74,0.00,1.00,4.80,4.80,0
+33.60,4.80,8.70,0.00,1.00,4.80,4.80,0
+38.40,4.80,8.66,0.00,1.00,4.80,4.80,0
+43.20,4.80,8.62,0.00,1.00,9.60,4.80,0
+48.00,4.80,8.58,0.00,1.00,9.60,9.60,0
+52.80,4.80,8.54,0.00,1.00,9.60,9.60,0
+57.60,4.80,8.50,0.00,1.00,14.40,9.60,0
+62.40,9.60,8.46,0.00,1.00,14.40,9.60,0
+67.20,9.60,8.42,0.00,1.00,19.20,9.60,0
+72.00,9.60,8.38,0.00,1.00,24.00,9.60,0
+76.80,9.60,8.34,0.00,1.00,33.60,9.60,0
+81.60,9.60,8.30,0.00,1.00,43.20,9.60,0
+86.40,9.60,8.26,0.00,1.00,67.20,9.60,0
+91.20,9.60,8.22,0.00,1.00,96.00,9.60,0
+96.00,9.60,8.18,0.00,1.00,124.80,9.60,0
+100.80,9.60,8.14,0.00,1.00,144.00,9.60,0
+105.60,9.60,8.10,0.00,1.00,153.60,9.60,0
+110.40,9.60,8.06,0.00,1.00,158.40,9.60,0
+115.20,9.60,8.02,0.00,1.00,163.20,9.60,0
+120.00,9.60,7.98,0.00,1.00,168.00,9.60,0
+124.80,4.80,7.94,0.00,1.00,168.00,9.60,0
+129.60,4.80,7.90,0.00,1.00,168.00,4.80,0
+134.40,4.80,7.86,0.00,1.00,172.80,4.80,0
+139.20,4.80,7.82,0.00,1.00,172.80,4.80,0
+144.00,4.80,7.78,0.00,1.00,172.80,4.80,0
+148.80,4.80,7.74,0.00,1.00,172.80,4.80,0
+153.60,4.80,7.70,0.00,1.00,177.60,4.80,0
+158.40,4.80,7.66,0.00,1.00,177.60,4.80,0
+163.20,4.80,7.62,0.00,1.00,177.60,0.00,0
+168.00,0.00,7.58,0.00,1.00,177.60,0.00,0
+172.80,0.00,7.54,0.00,1.00,177.60,0.00,0
+177.60,0.00,7.50,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00,0
+-172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00,0
+-168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80,0
+-163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80,0
+-158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80,0
+-153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80,0
+-148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80,0
+-144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80,0
+-139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80,0
+-134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60,0
+-129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60,0
+-124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60,0
+-120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60,0
+-115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60,0
+-110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60,0
+-105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60,0
+-100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60,0
+-96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60,0
+-91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60,0
+-86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60,0
+-81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60,0
+-76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60,0
+-72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60,0
+-67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60,0
+-62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60,0
+-57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60,0
+-52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80,0
+-48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80,0
+-43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80,0
+-38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80,0
+-33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80,0
+-28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80,0
+-24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80,0
+-19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00,0
+-14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00,0
+-9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00,0
+-4.80,-0.00,6.02,0.00,1.00,-0.00,0.00,0
+0.00,0.00,5.97,0.00,1.00,0.00,0.00,0
+4.80,0.00,5.93,0.00,1.00,0.00,0.00,0
+9.60,0.00,5.89,0.00,1.00,0.00,0.00,0
+14.40,0.00,5.85,0.00,1.00,0.00,0.00,0
+19.20,0.00,5.81,0.00,1.00,0.00,0.00,0
+24.00,0.00,5.77,0.00,1.00,0.00,0.00,0
+28.80,0.00,5.73,0.00,1.00,0.00,4.80,0
+33.60,0.00,5.69,0.00,1.00,0.00,4.80,0
+38.40,0.00,5.65,0.00,1.00,4.80,4.80,0
+43.20,4.80,5.61,0.00,1.00,4.80,4.80,0
+48.00,4.80,5.57,0.00,1.00,4.80,4.80,0
+52.80,4.80,5.53,0.00,1.00,4.80,4.80,0
+57.60,4.80,5.49,0.00,1.00,4.80,4.80,0
+62.40,4.80,5.45,0.00,1.00,4.80,4.80,0
+67.20,4.80,5.41,0.00,1.00,9.60,4.80,0
+72.00,4.80,5.37,0.00,1.00,9.60,4.80,0
+76.80,4.80,5.33,0.00,1.00,14.40,4.80,0
+81.60,4.80,5.29,0.00,1.00,24.00,4.80,0
+86.40,4.80,5.25,0.00,1.00,43.20,4.80,0
+91.20,4.80,5.21,0.00,1.00,110.40,4.80,0
+96.00,4.80,5.17,0.00,1.00,148.80,4.80,0
+100.80,4.80,5.13,0.00,1.00,163.20,4.80,0
+105.60,4.80,5.09,0.00,1.00,168.00,4.80,0
+110.40,4.80,5.05,0.00,1.00,172.80,4.80,0
+115.20,4.80,5.01,0.00,1.00,172.80,4.80,0
+120.00,4.80,4.97,0.00,1.00,172.80,4.80,0
+124.80,4.80,4.93,0.00,1.00,172.80,4.80,0
+129.60,4.80,4.89,0.00,1.00,177.60,4.80,0
+134.40,4.80,4.85,0.00,1.00,177.60,4.80,0
+139.20,0.00,4.81,0.00,1.00,177.60,4.80,0
+144.00,0.00,4.77,0.00,1.00,177.60,4.80,0
+148.80,0.00,4.73,0.00,1.00,177.60,0.00,0
+153.60,0.00,4.69,0.00,1.00,177.60,0.00,0
+158.40,0.00,4.65,0.00,1.00,177.60,0.00,0
+163.20,0.00,4.61,0.00,1.00,177.60,0.00,0
+168.00,0.00,4.57,0.00,1.00,177.60,0.00,0
+172.80,0.00,4.53,0.00,1.00,177.60,0.00,0
+177.60,0.00,4.49,0.00,1.00,177.60,-0.00,0
+-177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00,0
+-172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00,0
+-168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00,0
+-163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00,0
+-158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00,0
+-153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80,0
+-148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80,0
+-144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80,0
+-139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80,0
+-134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80,0
+-129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80,0
+-124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80,0
+-120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80,0
+-115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80,0
+-110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80,0
+-105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80,0
+-100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80,0
+-96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80,0
+-91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80,0
+-86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80,0
+-81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80,0
+-76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80,0
+-72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80,0
+-67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80,0
+-62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80,0
+-57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80,0
+-52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80,0
+-48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80,0
+-43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80,0
+-38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80,0
+-33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00,0
+-28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00,0
+-24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00,0
+-19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00,0
+-14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00,0
+-9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00,0
+-4.80,-0.00,3.01,0.00,1.00,-0.00,0.00,0
+0.00,0.00,2.97,0.00,1.00,-0.00,0.00,0
+4.80,-0.00,2.93,0.00,1.00,-0.00,0.00,0
+9.60,-0.00,2.89,0.00,1.00,-0.00,0.00,0
+14.40,-0.00,2.85,0.00,1.00,-0.00,0.00,0
+19.20,-0.00,2.81,0.00,1.00,-0.00,0.00,0
+24.00,-0.00,2.77,0.00,1.00,-0.00,0.00,0
+28.80,-0.00,2.73,0.00,1.00,-0.00,0.00,0
+33.60,-0.00,2.69,0.00,1.00,-0.00,0.00,0
+38.40,-0.00,2.65,0.00,1.00,-0.00,0.00,0
+43.20,-0.00,2.61,0.00,1.00,-0.00,0.00,0
+48.00,-0.00,2.57,0.00,1.00,-0.00,0.00,0
+52.80,-0.00,2.53,0.00,1.00,-0.00,0.00,0
+57.60,-0.00,2.49,0.00,1.00,-0.00,0.00,0
+62.40,-0.00,2.45,0.00,1.00,-0.00,0.00,0
+67.20,-0.00,2.41,0.00,1.00,-4.80,0.00,0
+72.00,-0.00,2.37,0.00,1.00,-4.80,0.00,0
+76.80,-0.00,2.33,0.00,1.00,-4.80,0.00,0
+81.60,-0.00,2.29,0.00,1.00,-9.60,0.00,0
+86.40,-0.00,2.25,0.00,1.00,-19.20,0.00,0
+91.20,-0.00,2.21,0.00,1.00,-134.40,0.00,0
+96.00,-0.00,2.17,0.00,1.00,-168.00,0.00,0
+100.80,-0.00,2.13,0.00,1.00,-172.80,0.00,0
+105.60,-0.00,2.09,0.00,1.00,-177.60,0.00,0
+110.40,-0.00,2.05,0.00,1.00,-177.60,0.00,0
+115.20,-0.00,2.01,0.00,1.00,-177.60,0.00,0
+120.00,-0.00,1.96,0.00,1.00,-177.60,0.00,0
+124.80,-0.00,1.92,0.00,1.00,-177.60,0.00,0
+129.60,-0.00,1.88,0.00,1.00,-177.60,0.00,0
+134.40,-0.00,1.84,0.00,1.00,-177.60,0.00,0
+139.20,-0.00,1.80,0.00,1.00,-177.60,0.00,0
+144.00,-0.00,1.76,0.00,1.00,-177.60,0.00,0
+148.80,-0.00,1.72,0.00,1.00,-177.60,0.00,0
+153.60,-0.00,1.68,0.00,1.00,-177.60,0.00,0
+158.40,-0.00,1.64,0.00,1.00,-177.60,0.00,0
+163.20,-0.00,1.60,0.00,1.00,-177.60,0.00,0
+168.00,-0.00,1.56,0.00,1.00,-177.60,0.00,0
+172.80,-0.00,1.52,0.00,1.00,-177.60,0.00,0
+177.60,-0.00,1.48,0.00,1.00,-177.60,0.00,0
+-177.60,0.00,1.44,0.00,1.00,177.60,0.00,0
+-172.80,0.00,1.40,0.00,1.00,177.60,0.00,0
+-168.00,0.00,1.36,0.00,1.00,177.60,0.00,0
+-163.20,0.00,1.32,0.00,1.00,177.60,0.00,0
+-158.40,0.00,1.28,0.00,1.00,177.60,0.00,0
+-153.60,0.00,1.24,0.00,1.00,177.60,0.00,0
+-148.80,0.00,1.20,0.00,1.00,177.60,0.00,0
+-144.00,0.00,1.16,0.00,1.00,177.60,0.00,0
+-139.20,0.00,1.12,0.00,1.00,177.60,0.00,0
+-134.40,0.00,1.08,0.00,1.00,177.60,0.00,0
+-129.60,0.00,1.04,0.00,1.00,177.60,0.00,0
+-124.80,0.00,1.00,0.00,1.00,177.60,0.00,0
+-120.00,0.00,0.96,0.00,1.00,177.60,0.00,0
+-115.20,0.00,0.92,0.00,1.00,177.60,0.00,0
+-110.40,0.00,0.88,0.00,1.00,177.60,0.00,0
+-105.60,0.00,0.84,0.00,1.00,177.60,0.00,0
+-100.80,0.00,0.80,0.00,1.00,172.80,0.00,0
+-96.00,0.00,0.76,0.00,1.00,168.00,0.00,0
+-91.20,0.00,0.72,0.00,1.00,134.40,0.00,0
+-86.40,0.00,0.68,0.00,1.00,19.20,0.00,0
+-81.60,0.00,0.64,0.00,1.00,9.60,0.00,0
+-76.80,0.00,0.60,0.00,1.00,4.80,0.00,0
+-72.00,0.00,0.56,0.00,1.00,4.80,0.00,0
+-67.20,0.00,0.52,0.00,1.00,4.80,0.00,0
+-62.40,0.00,0.48,0.00,1.00,0.00,0.00,0
+-57.60,0.00,0.44,0.00,1.00,0.00,0.00,0
+-52.80,0.00,0.40,0.00,1.00,0.00,0.00,0
+-48.00,0.00,0.36,0.00,1.00,0.00,0.00,0
+-43.20,0.00,0.32,0.00,1.00,0.00,0.00,0
+-38.40,0.00,0.28,0.00,1.00,0.00,0.00,0
+-33.60,0.00,0.24,0.00,1.00,0.00,0.00,0
+-28.80,0.00,0.20,0.00,1.00,0.00,0.00,0
+-24.00,0.00,0.16,0.00,1.00,0.00,0.00,0
+-19.20,0.00,0.12,0.00,1.00,0.00,0.00,0
+-14.40,0.00,0.08,0.00,1.00,0.00,0.00,0
+-9.60,0.00,0.04,0.00,1.00,0.00,0.00,0
+-4.80,0.00,0.00,0.00,1.00,0.00,0.00,0
diff --git a/scripts/testv/stvISM_with_no_diegetic_switch.csv b/scripts/testv/stvISM_with_no_diegetic_switch.csv
new file mode 100644
index 0000000000000000000000000000000000000000..ee0e7976379f1c1bc49ccfbef78a88e5b179820c
--- /dev/null
+++ b/scripts/testv/stvISM_with_no_diegetic_switch.csv
@@ -0,0 +1,1500 @@
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0
+-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0
+-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0
+-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0
+-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0
+-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0
+-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0
+-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0
+-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0
+-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0
+-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0
+-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+-56.46,0.00,1.00,0.00,1.00,0.00,0.00,0
+-60.64,0.00,1.00,0.00,1.00,0.00,0.00,0
+-64.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+-68.88,0.00,1.00,0.00,1.00,0.00,0.00,0
+-72.94,0.00,1.00,0.00,1.00,0.00,0.00,0
+-76.96,0.00,1.00,0.00,1.00,0.00,0.00,0
+-80.93,0.00,1.00,0.00,1.00,0.00,0.00,0
+-84.85,0.00,1.00,0.00,1.00,0.00,0.00,0
+-88.72,0.00,1.00,0.00,1.00,0.00,0.00,0
+-92.54,0.00,1.00,0.00,1.00,0.00,0.00,0
+-96.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+-100.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+-103.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+-107.23,0.00,1.00,0.00,1.00,0.00,0.00,0
+-110.74,0.00,1.00,0.00,1.00,0.00,0.00,0
+-114.19,0.00,1.00,0.00,1.00,0.00,0.00,0
+-117.57,0.00,1.00,0.00,1.00,0.00,0.00,0
+-120.88,0.00,1.00,0.00,1.00,0.00,0.00,0
+-124.12,0.00,1.00,0.00,1.00,0.00,0.00,0
+-127.28,0.00,1.00,0.00,1.00,0.00,0.00,0
+-130.36,0.00,1.00,0.00,1.00,0.00,0.00,0
+-133.37,0.00,1.00,0.00,1.00,0.00,0.00,0
+-136.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+-139.14,0.00,1.00,0.00,1.00,0.00,0.00,0
+-141.90,0.00,1.00,0.00,1.00,0.00,0.00,0
+-144.58,0.00,1.00,0.00,1.00,0.00,0.00,0
+-147.17,0.00,1.00,0.00,1.00,0.00,0.00,0
+-149.66,0.00,1.00,0.00,1.00,0.00,0.00,0
+-152.07,0.00,1.00,0.00,1.00,0.00,0.00,0
+-154.39,0.00,1.00,0.00,1.00,0.00,0.00,0
+-156.62,0.00,1.00,0.00,1.00,0.00,0.00,0
+-158.75,0.00,1.00,0.00,1.00,0.00,0.00,0
+-160.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+-162.72,0.00,1.00,0.00,1.00,0.00,0.00,0
+-164.56,0.00,1.00,0.00,1.00,0.00,0.00,0
+-166.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+-167.94,0.00,1.00,0.00,1.00,0.00,0.00,0
+-169.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+-170.92,0.00,1.00,0.00,1.00,0.00,0.00,0
+-172.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+-173.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+-174.61,0.00,1.00,0.00,1.00,0.00,0.00,0
+-175.63,0.00,1.00,0.00,1.00,0.00,0.00,0
+-176.54,0.00,1.00,0.00,1.00,0.00,0.00,0
+-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0
+-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0
+-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0
+-180.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0
+-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0
+-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0
+-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0
+-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0
+-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0
+-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0
+-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0
+-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0
+-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0
+-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0
+-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0
+-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,0
+8.83,0.00,1.00,0.00,1.00,0.00,0.00,0
+13.24,0.00,1.00,0.00,1.00,0.00,0.00,0
+17.64,0.00,1.00,0.00,1.00,0.00,0.00,0
+22.03,0.00,1.00,0.00,1.00,0.00,0.00,0
+26.41,0.00,1.00,0.00,1.00,0.00,0.00,0
+30.77,0.00,1.00,0.00,1.00,0.00,0.00,0
+35.12,0.00,1.00,0.00,1.00,0.00,0.00,0
+39.44,0.00,1.00,0.00,1.00,0.00,0.00,0
+43.74,0.00,1.00,0.00,1.00,0.00,0.00,0
+48.01,0.00,1.00,0.00,1.00,0.00,0.00,0
+52.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+56.46,0.00,1.00,0.00,1.00,0.00,0.00,0
+60.64,0.00,1.00,0.00,1.00,0.00,0.00,0
+64.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+68.88,0.00,1.00,0.00,1.00,0.00,0.00,0
+72.94,0.00,1.00,0.00,1.00,0.00,0.00,0
+76.96,0.00,1.00,0.00,1.00,0.00,0.00,0
+80.93,0.00,1.00,0.00,1.00,0.00,0.00,0
+84.85,0.00,1.00,0.00,1.00,0.00,0.00,0
+88.72,0.00,1.00,0.00,1.00,0.00,0.00,0
+92.54,0.00,1.00,0.00,1.00,0.00,0.00,0
+96.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+100.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+103.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+107.23,0.00,1.00,0.00,1.00,0.00,0.00,0
+110.74,0.00,1.00,0.00,1.00,0.00,0.00,0
+114.19,0.00,1.00,0.00,1.00,0.00,0.00,0
+117.57,0.00,1.00,0.00,1.00,0.00,0.00,0
+120.88,0.00,1.00,0.00,1.00,0.00,0.00,0
+124.12,0.00,1.00,0.00,1.00,0.00,0.00,0
+127.28,0.00,1.00,0.00,1.00,0.00,0.00,0
+130.36,0.00,1.00,0.00,1.00,0.00,0.00,0
+133.37,0.00,1.00,0.00,1.00,0.00,0.00,0
+136.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+139.14,0.00,1.00,0.00,1.00,0.00,0.00,0
+141.90,0.00,1.00,0.00,1.00,0.00,0.00,0
+144.58,0.00,1.00,0.00,1.00,0.00,0.00,0
+147.17,0.00,1.00,0.00,1.00,0.00,0.00,0
+149.66,0.00,1.00,0.00,1.00,0.00,0.00,0
+152.07,0.00,1.00,0.00,1.00,0.00,0.00,0
+154.39,0.00,1.00,0.00,1.00,0.00,0.00,0
+156.62,0.00,1.00,0.00,1.00,0.00,0.00,0
+158.75,0.00,1.00,0.00,1.00,0.00,0.00,0
+160.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+162.72,0.00,1.00,0.00,1.00,0.00,0.00,0
+164.56,0.00,1.00,0.00,1.00,0.00,0.00,0
+166.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+167.94,0.00,1.00,0.00,1.00,0.00,0.00,0
+169.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+170.92,0.00,1.00,0.00,1.00,0.00,0.00,0
+172.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+173.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+174.61,0.00,1.00,0.00,1.00,0.00,0.00,0
+175.63,0.00,1.00,0.00,1.00,0.00,0.00,0
+176.54,0.00,1.00,0.00,1.00,0.00,0.00,0
+177.35,0.00,1.00,0.00,1.00,0.00,0.00,0
+178.05,0.00,1.00,0.00,1.00,0.00,0.00,0
+178.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.13,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.51,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.95,0.00,1.00,0.00,1.00,0.00,0.00,0
+180.00,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.95,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.51,0.00,1.00,0.00,1.00,0.00,0.00,0
+179.13,0.00,1.00,0.00,1.00,0.00,0.00,0
+178.65,0.00,1.00,0.00,1.00,0.00,0.00,0
+178.05,0.00,1.00,0.00,1.00,0.00,0.00,0
+177.35,0.00,1.00,0.00,1.00,0.00,0.00,0
+176.54,0.00,1.00,0.00,1.00,0.00,0.00,0
+175.63,0.00,1.00,0.00,1.00,0.00,0.00,0
+174.61,0.00,1.00,0.00,1.00,0.00,0.00,0
+173.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+172.25,0.00,1.00,0.00,1.00,0.00,0.00,0
+170.92,0.00,1.00,0.00,1.00,0.00,0.00,0
+169.48,0.00,1.00,0.00,1.00,0.00,0.00,0
+167.94,0.00,1.00,0.00,1.00,0.00,0.00,0
+166.30,0.00,1.00,0.00,1.00,0.00,0.00,0
+164.56,0.00,1.00,0.00,1.00,0.00,0.00,0
+162.72,0.00,1.00,0.00,1.00,0.00,0.00,0
+160.78,0.00,1.00,0.00,1.00,0.00,0.00,0
+158.75,0.00,1.00,0.00,1.00,0.00,0.00,0
+156.62,0.00,1.00,0.00,1.00,0.00,0.00,0
+154.39,0.00,1.00,0.00,1.00,0.00,0.00,0
+152.07,0.00,1.00,0.00,1.00,0.00,0.00,0
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+0.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1
+-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1
+-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1
+-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1
+-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1
+-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1
+-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1
+-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1
+-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1
+-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1
+-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1
+-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1
+-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1
+-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1
+-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1
+-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1
+-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1
+-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1
+-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1
+-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1
+-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1
+-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1
+-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1
+-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1
+-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1
+-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1
+-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1
+-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1
+-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1
+-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1
+-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1
+-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1
+-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1
+-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1
+-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1
+-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1
+-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1
+-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1
+-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1
diff --git a/tests/conftest.py b/tests/conftest.py
index ef5f46ffc9c13b590fee7485a18499c6b7daec4f..d7a35a36e03d2c55e7a50aeb1a2e66c482830574 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -196,7 +196,6 @@ class EncoderFrontend:
sba_order: Optional[str] = None,
dtx_mode: Optional[bool] = False,
max_band: Optional[str] = None,
- agc_op: Optional[int] = None,
bypass_mode: Optional[int] = None,
quiet_mode: Optional[bool] = True,
add_option_list: Optional[list] = None,
@@ -213,9 +212,6 @@ class EncoderFrontend:
if max_band is not None:
command.extend(["-max_band", max_band])
- if agc_op is not None:
- command.extend(["-agc", str(agc_op)])
-
if bypass_mode is not None:
command.extend(["-bypass", str(bypass_mode)])
diff --git a/tests/renderer/README.md b/tests/renderer/README.md
index 9748d8abf1f67f311eab36b6c80d23b19ae9905a..513bd0991164ff1f79e8c3fe0525cb9955f0d51b 100644
--- a/tests/renderer/README.md
+++ b/tests/renderer/README.md
@@ -1,3 +1,7 @@
+========================================
+THIS FOLDER WILL NOT BE PART OF DELIVERY
+========================================
+
# External Renderer Tests
See also the [contribution page](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/Contributions/2-external-renderer) for related presentations.
diff --git a/tests/renderer/__init__.py b/tests/renderer/__init__.py
index c2c14754b4940b8f4ab39ef87a35a6356e5cab1a..8429fc9e1cd3947c33336e9c8825c7551a1edfd4 100644
--- a/tests/renderer/__init__.py
+++ b/tests/renderer/__init__.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
diff --git a/tests/renderer/compare_audio.py b/tests/renderer/compare_audio.py
index bf3ce26c93f968ca9bf11d2b17fe7279b4d3d15c..3fc5c064a8e49b44e028b820502f40ab1ca9d619 100644
--- a/tests/renderer/compare_audio.py
+++ b/tests/renderer/compare_audio.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py
index 3625a9307e9a947dc478b0eab8b2c661456e6973..56b4d71e26de32cf12a9f16664808d5f8675a0c6 100644
--- a/tests/renderer/constants.py
+++ b/tests/renderer/constants.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
@@ -94,6 +94,7 @@ FORMAT_TO_FILE_SMOKETEST = {
"ISM2": NCHAN_TO_FILE[2],
"ISM3": NCHAN_TO_FILE[3],
"ISM4": NCHAN_TO_FILE[4],
+ "NDP_ISM4": NCHAN_TO_FILE[4],
# "ISM1": TEST_VECTOR_DIR.joinpath("spectral_test_ism1.txt"),
# "ISM2": TEST_VECTOR_DIR.joinpath("spectral_test_ism2.txt"),
# "ISM3": TEST_VECTOR_DIR.joinpath("spectral_test_ism3.txt"),
@@ -148,6 +149,12 @@ FORMAT_TO_METADATA_FILES = {
str(TESTV_DIR.joinpath("stvISM3.csv")),
str(TESTV_DIR.joinpath("stvISM4.csv")),
],
+ "NDP_ISM4": [
+ str(TESTV_DIR.joinpath("stvISM1.csv")),
+ str(TESTV_DIR.joinpath("stvISM2_non-diegetic-pan.csv")),
+ str(TESTV_DIR.joinpath("stvISM3.csv")),
+ str(TESTV_DIR.joinpath("stvISM4.csv")),
+ ],
"MASA1": [str(TESTV_DIR.joinpath("stv1MASA1TC48c.met"))],
"MASA2": [str(TESTV_DIR.joinpath("stv2MASA2TC48c.met"))],
}
@@ -193,6 +200,10 @@ HR_TRAJECTORIES_TO_TEST = [
"rotate_yaw_pitch_roll1",
]
+CONFIG_FILES_TO_TEST = [
+ "just_reverb"
+]
+
""" Per-testcase xfail SNR thresholds (dB) """
pass_snr = dict() # not relevant for tests anymore, should be deprecated soon
_pass_snr = {
diff --git a/tests/renderer/data/ism_0a_0e.csv b/tests/renderer/data/ism_0a_0e.csv
index 7772c8c9169bc66f5c18ee25f78ce488eac3cc37..56a82f0fe379702d99a715eb2307ebb287590e92 100644
--- a/tests/renderer/data/ism_0a_0e.csv
+++ b/tests/renderer/data/ism_0a_0e.csv
@@ -1,750 +1,749 @@
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
-0,0,1,0,1
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
+0,0,1,0,1,0,0,0
diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py
index 690f495c7fc196c4c552e80a15a0445f74015ec3..38b7bbf9e743c4f479790c58a91e782623c806ca 100644
--- a/tests/renderer/test_renderer.py
+++ b/tests/renderer/test_renderer.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
@@ -56,6 +56,24 @@ def test_ambisonics_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file):
)
+# Test compares rendering with render config file containing just reverb defaults against rendering without config file.
+# These should be binary equivalent.
+@pytest.mark.parametrize("config_file", CONFIG_FILES_TO_TEST)
+@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL)
+@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM)
+def test_ambisonics_binaural_headrotation_defaultrenderconfig(test_info, in_fmt, out_fmt, config_file):
+ compare_renderer_args(
+ test_info,
+ in_fmt,
+ out_fmt,
+ ref_kwargs={
+ "name_extension": "defaultrenderconfig"
+ },
+ cut_kwargs={
+ "config_file": TESTV_DIR.joinpath(f"{config_file}.cfg")
+ }
+ )
+
# Test compares rendering with just a trajectory file against rendering with a trajectory file + a zero ref rotation.
# These should be binary equivalent.
@pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST)
@@ -423,3 +441,20 @@ def test_metadata(test_info, in_fmt, out_fmt):
out_fmt,
metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"),
)
+
+
+""" non diegetic pan """
+
+
+@pytest.mark.parametrize("out_fmt", ["STEREO"])
+@pytest.mark.parametrize("in_fmt", ["MONO"])
+@pytest.mark.parametrize("non_diegetic_pan", ["0", "-30", "45", "90", "-90"])
+def test_non_diegetic_pan_static(test_info, in_fmt, out_fmt, non_diegetic_pan):
+ run_renderer(in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan)
+
+
+@pytest.mark.parametrize("out_fmt", ["STEREO"])
+@pytest.mark.parametrize("in_fmt", ["ISM1"])
+@pytest.mark.parametrize("non_diegetic_pan", ["0", "-30", "45", "90", "-90"])
+def test_non_diegetic_pan_ism_static(test_info, in_fmt, out_fmt, non_diegetic_pan):
+ run_renderer(in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan)
diff --git a/tests/renderer/test_renderer_be_comparison.py b/tests/renderer/test_renderer_be_comparison.py
index 815d7fd640b2d53dd5fffcc5f3402e3a8c552a52..460ded4250421168864976c3941e2c2fbab34561 100644
--- a/tests/renderer/test_renderer_be_comparison.py
+++ b/tests/renderer/test_renderer_be_comparison.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
@@ -203,3 +203,22 @@ def test_metadata(test_info, in_fmt, out_fmt):
metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"),
is_comparetest=True,
)
+
+
+""" non diegetic pan """
+
+
+# @pytest.mark.parametrize("out_fmt", ["STEREO"])
+# @pytest.mark.parametrize("in_fmt", ["MONO"])
+# @pytest.mark.parametrize("non_diegetic_pan", ["0", "-0.2", "0.5", "1", "-1"])
+# def test_non_diegetic_pan_static(test_info, in_fmt, out_fmt, non_diegetic_pan):
+# compare_renderer_vs_mergetarget(
+# test_info, in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan)
+
+
+# @pytest.mark.parametrize("out_fmt", ["STEREO"])
+# @pytest.mark.parametrize("in_fmt", ["ISM1"])
+# @pytest.mark.parametrize("non_diegetic_pan", ["0", "-0.2", "0.5", "1", "-1"])
+# def test_non_diegetic_pan_ism_static(test_info, in_fmt, out_fmt, non_diegetic_pan):
+# compare_renderer_vs_mergetarget(
+# test_info, in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan)
diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py
index 7a98dff3006b066bf78c563801a8816553e8498c..356902ff47674ff111dbe7541bde3bac8e24bf4e 100644
--- a/tests/renderer/utils.py
+++ b/tests/renderer/utils.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
- (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
+ (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB,
Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange,
Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved.
@@ -105,10 +105,12 @@ def run_renderer(
metadata_input: Optional[str] = None,
in_meta_files: Optional[list] = None,
trj_file: Optional[str] = None,
+ non_diegetic_pan: Optional[str] = None,
name_extension: Optional[str] = None,
refrot_file: Optional[str] = None,
refvec_file: Optional[str] = None,
refveclev_file: Optional[str] = None,
+ config_file: Optional[str] = None,
output_path_base: str = OUTPUT_PATH_CUT,
binary_suffix: str = "",
is_comparetest: Optional[bool] = False,
@@ -134,6 +136,11 @@ def run_renderer(
else:
refveclev_name = ""
+ if config_file is not None:
+ config_name = f"_{config_file.stem}"
+ else:
+ config_name = ""
+
if not isinstance(out_fmt, str):
@@ -156,7 +163,11 @@ def run_renderer(
in_file = FORMAT_TO_FILE[in_fmt]
in_name = in_fmt
- out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}{refrot_name}{refvec_name}{refveclev_name}{name_extension}.wav"))
+ out_file = str(
+ output_path_base.joinpath(
+ f"{in_name}_to_{out_name}{trj_name}{non_diegetic_pan}{refrot_name}{refvec_name}{refveclev_name}{config_name}{name_extension}.wav"
+ )
+ )
cmd = RENDERER_CMD[:]
cmd[2] = str(in_file)
@@ -172,6 +183,8 @@ def run_renderer(
if trj_file is not None:
cmd.extend(["-tf", str(trj_file)])
+ if non_diegetic_pan is not None:
+ cmd.extend(["-non_diegetic_pan", str(non_diegetic_pan)])
if refrot_file is not None:
cmd.extend(["-rf", str(refrot_file)])
cmd.extend(["-otr", "ref"])
@@ -184,60 +197,13 @@ def run_renderer(
cmd.extend(["-rvf", str(refveclev_file)])
cmd.extend(["-otr", "ref_vec_lev"])
- run_cmd(cmd)
+ if config_file is not None:
+ cmd.extend(["-rc", str(config_file)])
- return pyaudio3dtools.audiofile.readfile(out_file)
-
-
-def run_pyscripts(
- in_fmt,
- out_fmt,
- metadata_input: Optional[str] = None,
- in_meta_files: Optional[list] = None,
- trj_file: Optional[str] = None,
- is_comparetest: Optional[bool] = False,
-) -> Tuple[np.ndarray, int]:
- """Reference creation with pyaudio3dtools"""
- if trj_file is not None:
- trj_name = f"_{trj_file.stem}"
- else:
- trj_name = ""
-
- if not isinstance(out_fmt, str):
- out_name = f"{out_fmt.stem}"
- else:
- out_name = out_fmt
-
- if is_comparetest:
- FORMAT_TO_FILE = FORMAT_TO_FILE_COMPARETEST
- else:
- FORMAT_TO_FILE = FORMAT_TO_FILE_SMOKETEST
-
- if metadata_input is not None:
- in_file = metadata_input
- in_name = metadata_input.stem
- elif isinstance(in_fmt, Path):
- in_file = FORMAT_TO_FILE[in_fmt.stem]
- in_name = in_fmt.stem
- else:
- in_file = FORMAT_TO_FILE[in_fmt]
- in_name = in_fmt
-
- out_file = str(OUTPUT_PATH_REF.joinpath(f"{in_name}_to_{out_name}{trj_name}.wav"))
-
- pyaudio3dtools.spatialaudioconvert.spatial_audio_convert(
- in_file,
- out_file,
- in_format=in_fmt,
- out_format=out_fmt,
- in_meta_files=in_meta_files,
- trajectory=trj_file,
- limit_output=True,
- )
+ run_cmd(cmd)
return pyaudio3dtools.audiofile.readfile(out_file)
-
def compare_renderer_vs_mergetarget(test_info, in_fmt, out_fmt, **kwargs):
ref, ref_fs = run_renderer(
in_fmt,
diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py
index 4920a9c59cec4cae613850989fb2802065dbf37a..bead7cda93796a66ea8ba83d5ff487e9d47f7975 100644
--- a/tests/test_sba_bs_dec_plc.py
+++ b/tests/test_sba_bs_dec_plc.py
@@ -45,9 +45,9 @@ from conftest import DecoderFrontend
tag_list = ['stvFOA']
plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2']
dtx_set = ['0', '1']
-ivas_br_list = ['32000', '64000', '96000', '256000']
+ivas_br_list = ['13200','16400','32000', '64000', '96000', '256000']
sampling_rate_list = ['48', '32', '16']
-agc_list = [-1, 0, 1]
+gain_list = [0, 1]
AbsTol = '0'
@@ -73,7 +73,7 @@ def check_and_makedir(dir_path):
@pytest.mark.parametrize("tag", tag_list)
@pytest.mark.parametrize("plc_pattern", plc_patterns)
@pytest.mark.parametrize("fs", sampling_rate_list)
-@pytest.mark.parametrize("agc", agc_list)
+@pytest.mark.parametrize("gain_flag", gain_list)
def test_sba_plc_system(
dut_decoder_frontend: DecoderFrontend,
test_vector_path,
@@ -87,12 +87,19 @@ def test_sba_plc_system(
tag,
plc_pattern,
fs,
- agc
+ gain_flag
):
- if dtx == '1' and ivas_br not in ['32000', '64000']:
+ SID = 0
+ if dtx == '1' and ivas_br not in ['13200','16400','24400','32000', '64000']:
# skip high bitrates for DTX until DTX issue is resolved
pytest.skip()
-
+ if ivas_br == '13200' or ivas_br == '16400':
+ if dtx == '1' and gain_flag == 0 and fs != '16':
+ SID = 1
+ else:
+ pytest.skip()
+ if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']:
+ pytest.skip()
tag = tag + fs + 'c'
# dec
@@ -106,9 +113,10 @@ def test_sba_plc_system(
fs,
ivas_br,
dtx,
+ SID,
plc_pattern,
update_ref,
- agc,
+ gain_flag,
keep_files,
)
@@ -125,17 +133,18 @@ def sba_dec_plc(
sampling_rate,
ivas_br,
dtx,
+ SID,
plc_pattern,
update_ref,
- agc,
+ gain_flag,
keep_files,
):
# ------------ run cmd ------------
tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}"
- if agc != -1:
- tag_out += f'_AGC{agc}'
+ if gain_flag == 1:
+ tag_out += f'_Gain{gain_flag}'
plc_tag_out = f"{tag_out}_{plc_pattern}"
dut_out_dir = f"{dut_base_path}/sba_bs/raw"
@@ -147,6 +156,9 @@ def sba_dec_plc(
plc_file = f"{test_vector_path}/{plc_pattern}.g192"
ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.pkt"
ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.pkt"
+ if SID == 1:
+ ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.pkt"
+ ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.pkt"
dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.raw"
ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.raw"
diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py
index 6825ee12ba3d162a21759cbab87d8a8aa8d2aaaa..759e1cce4fe44fa63babaed35c91c2d28d90f3d6 100644
--- a/tests/test_sba_bs_enc.py
+++ b/tests/test_sba_bs_enc.py
@@ -42,8 +42,9 @@ import pytest
from cmp_pcm import cmp_pcm
from cut_pcm import cut_samples
from conftest import EncoderFrontend, DecoderFrontend
-
+from cut_bs import cut_from_start
# params
+
tag_list = ['stvFOA']
tag_list_HOA2 = ['stv2OA']
tag_list_HOA3 = ['stv3OA']
@@ -53,13 +54,13 @@ dtx_set = ['0', '1']
dict_fsample_bw = {'48': '3', '32': '2', '16': '1'}
dict_bw_idx = {'FB': '3', 'SWB': '2', 'WB': '1'}
dict_bw_tag = {'SWB': '_ForceSWB', 'WB': '_ForceWB'}
-ivas_br_FOA = ['32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin']
+ivas_br_FOA = ['13200','16400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin']
ivas_br_HOA2 = ['256000', '384000', '512000']
ivas_br_HOA3 = ['256000', '384000', '512000']
sample_rate_list = ['48', '32', '16']
bypass_list = [1, 2]
-agc_list = [-1, 0, 1]
+gain_list = [0, 1]
sample_rate_bw_idx_list = [('48', 'SWB'), ('48', 'WB'), ('32', 'WB')]
@@ -100,7 +101,7 @@ def test_bypass_enc(
ivas_br = '256000'
dtx = '0'
max_bw = "FB"
- agc = -1
+ gain_flag = -1
sba_order = "+1"
output_config = "FOA"
@@ -116,11 +117,12 @@ def test_bypass_enc(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
cut_testv=True
)
@@ -134,11 +136,12 @@ def test_bypass_enc(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
)
@@ -148,7 +151,7 @@ def test_bypass_enc(
@pytest.mark.parametrize("dtx", dtx_set)
@pytest.mark.parametrize("tag", tag_list)
@pytest.mark.parametrize("fs", sample_rate_list)
-@pytest.mark.parametrize("agc", agc_list)
+@pytest.mark.parametrize("gain_flag", gain_list)
def test_sba_enc_system(
dut_encoder_frontend: EncoderFrontend,
dut_decoder_frontend: DecoderFrontend,
@@ -164,20 +167,27 @@ def test_sba_enc_system(
dtx,
tag,
fs,
- agc,
+ gain_flag,
):
- if dtx == '1' and ivas_br not in ['32000', '64000']:
+ SID = 0
+ if dtx == '1' and ivas_br not in ['13200','16400','24400','32000','64000']:
# skip high bitrates for DTX until DTX issue is resolved
pytest.skip()
- if ivas_br == 'sw_24k4_256k.bin' and agc != 1:
- pytest.skip()
-
+ if ivas_br == 'sw_24k4_256k.bin' and gain_flag != 1:
+ pytest.skip()
+ if ivas_br == '13200' or ivas_br == '16400':
+ if dtx == '1' and gain_flag == 0 and fs != '16':
+ SID = 1
+ else:
+ pytest.skip()
+ if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']:
+ pytest.skip()
tag = tag + fs + 'c'
max_bw = "FB"
bypass = -1
sba_order = "+1"
output_config = "FOA"
- if agc == 1:
+ if gain_flag == 1:
cut_gain = "16.0"
elif dtx == '1':
cut_gain = ".004"
@@ -195,11 +205,12 @@ def test_sba_enc_system(
fs,
ivas_br,
dtx,
+ SID,
max_bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
cut_gain=cut_gain,
create_dutenc=True,
cut_testv=True
@@ -215,11 +226,12 @@ def test_sba_enc_system(
fs,
ivas_br,
dtx,
+ SID,
max_bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
)
@@ -242,7 +254,7 @@ def test_spar_hoa2_enc_system(
):
fs = '48'
dtx = '0'
- agc = -1
+ gain_flag = -1
tag = tag + fs + 'c'
max_bw = "FB"
@@ -262,11 +274,12 @@ def test_spar_hoa2_enc_system(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
)
# dec
@@ -279,11 +292,12 @@ def test_spar_hoa2_enc_system(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
)
@@ -306,7 +320,7 @@ def test_spar_hoa3_enc_system(
):
fs = '48'
dtx = '0'
- agc = -1
+ gain_flag = -1
tag = tag + fs + 'c'
max_bw = "FB"
@@ -326,11 +340,12 @@ def test_spar_hoa3_enc_system(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
)
# dec
@@ -343,11 +358,12 @@ def test_spar_hoa3_enc_system(
fs,
ivas_br,
dtx,
+ None,
max_bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
)
@@ -372,16 +388,18 @@ def test_sba_enc_BWforce_system(
tag,
sample_rate_bw_idx,
):
- if dtx == '1' and ivas_br not in ['32000', '64000']:
+ if dtx == '1' and ivas_br not in ['32000','64000']:
# skip high bitrates for DTX until DTX issue is resolved
pytest.skip()
+ if ivas_br == '13200' or ivas_br == '16400':
+ pytest.skip()
if ivas_br == 'sw_24k4_256k.bin':
pytest.skip()
fs = sample_rate_bw_idx[0]
bw = sample_rate_bw_idx[1]
tag = tag + fs + 'c'
bypass = -1
- agc = -1
+ gain_flag = -1
sba_order = "+1"
output_config = "FOA"
@@ -397,11 +415,12 @@ def test_sba_enc_BWforce_system(
fs,
ivas_br,
dtx,
+ None,
bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
cut_testv=True
)
@@ -415,11 +434,12 @@ def test_sba_enc_BWforce_system(
fs,
ivas_br,
dtx,
+ None,
bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
)
@@ -437,11 +457,12 @@ def sba_enc(
sampling_rate,
ivas_br,
dtx,
+ SID,
ivas_max_bw,
bypass,
- agc,
sba_order,
update_ref,
+ gain_flag,
cut_gain='1.0',
create_dutenc=False,
cut_testv=False
@@ -466,20 +487,28 @@ def sba_enc(
if ivas_br == 'sw_24k4_256k.bin':
ivas_br = f"{br_switch_file_path}/sw_24k4_256k.bin"
short_tag_ext = ""
- if agc != -1:
- short_tag_ext += f'_AGC{agc}'
+ if gain_flag == 1:
+ short_tag_ext += f'_Gain{gain_flag}'
+ if SID == 1:
+ short_tag_ext += f'_SID'
# we update only bypass = 0/2 (bypass 1 is the same as the baseline)
if bypass in [0, 2]:
short_tag_ext += f"_pca{bypass}"
# to avoid conflicting names in case of parallel test execution, differentiate all cases
- long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified"
- long_tag_ext += f"_pca{bypass}"
+ if gain_flag == 1:
+ long_tag_ext = f"_Gain{gain_flag}"
+ else:
+ long_tag_ext = f"_pca{bypass}"
+ if SID == 1:
+ long_tag_ext += f"_SID"
dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt"
ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt"
ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt"
-
+ if SID == 1:
+ dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.pkt"
+ ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.pkt"
+ ref_pkt_file_dutenc_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.pkt"
input_path = f"{test_vector_path}/{tag_in}{in_extension}"
- agc_op = agc if agc != -1 else None
bypass_mode = bypass if bypass >= 0 else None
dtx_mode = dtx == '1'
@@ -507,7 +536,6 @@ def sba_enc(
ref_pkt_file,
sba_order=sba_order,
max_band=ivas_max_bw,
- agc_op=agc_op,
bypass_mode=bypass_mode,
dtx_mode=dtx_mode,
)
@@ -520,7 +548,6 @@ def sba_enc(
ref_pkt_file_dutenc,
sba_order=sba_order,
max_band=ivas_max_bw,
- agc_op=agc_op,
bypass_mode=bypass_mode,
dtx_mode=dtx_mode,
)
@@ -534,12 +561,25 @@ def sba_enc(
dut_pkt_file,
sba_order=sba_order,
max_band=ivas_max_bw,
- agc_op=agc_op,
bypass_mode=bypass_mode,
dtx_mode=dtx_mode,
)
-
+ if SID == 1:
+ if ref_encoder_path:
+ with open(ref_pkt_file, "rb") as fp_in:
+ with open(ref_pkt_file_cut, "wb") as fp_out:
+ fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True)
+ with open(ref_pkt_file_dutenc, "rb") as fp_in:
+ with open(ref_pkt_file_dutenc_cut, "wb") as fp_out:
+ fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True)
+ os.remove(ref_pkt_file)
+ os.remove(ref_pkt_file_dutenc)
+ if update_ref == 0:
+ with open(dut_pkt_file, "rb") as fp_in:
+ with open(dut_pkt_file_cut, "wb") as fp_out:
+ fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True)
+ os.remove(dut_pkt_file)
def sba_dec(
decoder_frontend,
ref_decoder_path,
@@ -549,11 +589,12 @@ def sba_dec(
sampling_rate,
ivas_br,
dtx,
+ SID,
ivas_max_bw,
bypass,
- agc,
output_config,
update_ref,
+ gain_flag,
keep_files,
):
@@ -566,16 +607,20 @@ def sba_dec(
tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}"
short_tag_ext = ""
- if agc != -1:
- short_tag_ext += f'_AGC{agc}'
+ if gain_flag == 1:
+ short_tag_ext += f'_Gain{gain_flag}'
# we update only bypass = 0/2 (bypass 1 is the same as the baseline)
if bypass in [0, 2]:
short_tag_ext += f"_pca{bypass}"
-
+ if SID == 1:
+ short_tag_ext += f'_SID_cut'
# to avoid conflicting names in case of parallel test execution, differentiate all cases
- long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified"
- long_tag_ext += f"_pca{bypass}"
-
+ if gain_flag == 1:
+ long_tag_ext = f"_Gain{gain_flag}"
+ else:
+ long_tag_ext = f"_pca{bypass}"
+ if SID == 1:
+ long_tag_ext += f"_SID_cut"
dut_out_dir = f"{dut_base_path}/sba_bs/raw"
ref_out_dir = f"{reference_path}/sba_bs/raw"