diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2022-08-08 17:23:45 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-08-08 17:23:45 +0000 |
commit | 92ad84ae515583926ec94cb7bd4e4e716a3e73ac (patch) | |
tree | 3f691ec11b78372bd7c6983733b1afa587c49311 | |
parent | 9fcd70ea8901cef7e847e34f53638001820745d1 (diff) | |
parent | 8e00512043a5d9726eefca46978d7a9a10b7a481 (diff) | |
download | libxaac-92ad84ae515583926ec94cb7bd4e4e716a3e73ac.tar.gz |
Update to v0.1.2 from upstream project am: 06b7d72a41 am: c13fd2dbf2 am: 8e00512043
Original change: https://android-review.googlesource.com/c/platform/external/libxaac/+/2170068
Change-Id: Ie86a7d40ae0967210d5d91b660544fddd46b070d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
68 files changed, 9271 insertions, 6597 deletions
@@ -95,6 +95,7 @@ cc_library_static { "decoder/ixheaacd_mps_temp_process.c", "decoder/ixheaacd_mps_temp_reshape.c", "decoder/ixheaacd_pns_js_thumb.c", + "decoder/ixheaacd_peak_limiter.c", "decoder/ixheaacd_pred_vec_block.c", "decoder/ixheaacd_process.c", "decoder/ixheaacd_ps_bitdec.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index 471681e..813b9d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ list( "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_process.c" "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_reshape.c" "${XAAC_ROOT}/decoder/ixheaacd_pns_js_thumb.c" + "${XAAC_ROOT}/decoder/ixheaacd_peak_limiter.c" "${XAAC_ROOT}/decoder/ixheaacd_pred_vec_block.c" "${XAAC_ROOT}/decoder/ixheaacd_process.c" "${XAAC_ROOT}/decoder/ixheaacd_ps_bitdec.c" @@ -1,3 +1,15 @@ +name: "libxaac" +description: "Android fork of the xaac library." third_party { + url { + type: GIT + value: "https://github.com/ittiam-systems/libxaac.git" + } + version: "601a6a03ce6d42c50c08f8bb07c4be2cbbf3b112" license_type: NOTICE + last_upgrade_date { + year: 2022 + month: 8 + day: 01 + } } diff --git a/README.md b/README.md new file mode 100644 index 0000000..b890e83 --- /dev/null +++ b/README.md @@ -0,0 +1,192 @@ +# Introduction of the Ex-HEAAC Decoder + + +Ex-HEAAC (Extended HE AAC), the latest upgrade to the MPEG AAC codec family, +is the audio codec of choice for digital radio and low bit rate +streaming applications. Selected as the mandatory audio codec for DRM +(Digital Radio Mondiale), Ex-HEAAC bridges the gap between speech and +audio coding, and provides consistent high quality audio for all signal +types, such as speech, music or mixed content. + +Another important feature is the codec’s coding efficiency. The audio +codec produces excellent sound for both music and speech, delivering +high quality performance at bit rates starting as low as 6 kbit/s for +mono and 12 kbit/s for stereo services. Thus Ex-HEAAC streaming apps and +streaming radio players may switch to very low bit rate streams and +offer a continuous playback even while the network is congested. Once +more bandwidth becomes available on the network again, the Ex-HEAAC +client can request a higher bitrate version and seamless switch over +the full range of bitrates. Audio bitrate that’s being saved due to the +improved coding efficiency can be used to improve video quality. Ex-HEAAC +supports AAC and HEAAC v2 as well. + +AAC is a popular audio coding technique recommended by MPEG committee. +The codec handles audio signals sampled in the range of 8 kHz to 96 +kHz. It operates on a frame of 1024 samples. The bit-rates supported +are in the range of 8 kbps to 576 kbps per channel. + +SBR and PS are the tools used in combination with the AAC general audio +codec resulting in HEAAC v2 (also known as Enhanced AAC Plus). It +provides significant increase in coding gain. In SBR, the high-band, +i.e. the high frequency part of the spectrum is replicated using the +low-band. In PS, channel redundancy is exploited and parameters are +extracted from a down-mixed channel.The bit-rate is by far below the +bit-rate required when using conventional AAC coding. This translates +into better quality at lower bit-rates. + + +# Introduction to Ex-HEAAC Decoder APIs + +## Files to be included are +* [`ixheaacd_apicmd_standards.h`](decoder/ixheaacd_apicmd_standards.h) +* [`ixheaacd_type_def.h`](decoder/ixheaacd_type_def.h) +* [`ixheaacd_memory_standards.h`](decoder/ixheaacd_memory_standards.h) +* [`ixheaacd_error_standards.h`](decoder/ixheaacd_error_standards.h) +* [`ixheaacd_error_handler.h`](decoder/ixheaacd_error_handler.h) +* [`ixheaacd_aac_config.h`](decoder/ixheaacd_aac_config.h) + +## Decoder APIs + +A single API is used to get and set configurations and execute the decode thread, based on command index passed. +* ia_xheaacd_dec_api + +| **API Command** | **API Sub Command** | **Description** | +|------|------|------| +|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_NAME | Gets the decoder library name | +|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_VERSION | Gets the decoder version | +|IA_API_CMD_GET_API_SIZE | 0 | Gets the memory requirements size of the API | +|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS | Sets the configuration parameters of the Ex-HEAAC v2 Decoder to default values | +|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS | Sets the attributes(size, priority, alignment) of all memory types required by the application onto the memory structure | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ | Sets the core AAC sampling frequency for RAW header decoding | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PCM_WDSZ | Sets the bit width of the output pcm samples.The value has to be 16 | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX | Sets the parameter whether the output needs to be down-mix to mono(1) or not(0) | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO | Sets the flag to disable interleave mono to stereo | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE | Sets the parameter whether the output needs to be downsampled(1) or not(0).This is valid only for Ex-HEAAC v2 build | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_FRAMEOK | Sets the flag to 0 or 1 to indicate whether the current frame is valid(1) or not(0) | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_ISMP4 | Sets the flag to 0 or 1 to indicate whether given test vector is an mp4 file or not | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC | Sets the flag of ADTS syncing or not ADTS syncing as 0 or 1 | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE | Sets the parameter auto SBR upsample to 0 or 1.Used in case of stream changing from SBR present to SBR not present.This is valid only for Ex-HEAAC v2 build | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL | Sets the maximum number of channels present.Its maximum value is 2 for stereo library and 8 for multichannel library | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL | Sets the number of coupling channels to be used for coupling.It can take values from 0 to 16.This command is supported only if the library has multichannel support | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO | Sets the flag of downmixing n number of channels to stereo.Can be 0 or 1. This command is supported only if the library has multichannel support | +|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISLOAS | Sets the flag indicating that the input file is a .loas file.Can be 0 or 1 | +|IA_API_CMD_GET_N_MEMTABS | 0 | Gets the number of memory types | +|IA_API_CMD_GET_N_TABLES | 0 | Gets the number of tables | +|IA_API_CMD_GET_MEM_INFO_SIZE | 0 | Gets the size of the memory type being referred to by the index | +|IA_API_CMD_GET_MEM_INFO_ALIGNMENT | 0 | Gets the alignment information of the memory-type being referred to by the index | +|IA_API_CMD_GET_MEM_INFO_TYPE | 0 | Gets the type of memory being referred to by the index | +|IA_API_CMD_SET_MEM_PTR | 0 | Sets the pointer to the memory being referred to by the index to the input value | +|IA_API_CMD_GET_TABLE_INFO_SIZE | 0 | Gets the size of the memory type being referred to by the index | +|IA_API_CMD_GET_TABLE_INFO_ALIGNMENT | 0 | Gets the alignment information of the memory-type being referred to by the index | +|IA_API_CMD_GET_TABLE_PTR | 0 | Gets the address of the current location of the table | +|IA_API_CMD_SET_TABLE_PTR | 0 | Sets the relocated table address | +|IA_API_CMD_INPUT_OVER | 0 | Signals the end of bit-stream to the library | +|IA_API_CMD_SET_INPUT_BYTES | 0 | Sets the number of bytes available in the input buffer for initialization | +|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_PROCESS | Search for the valid header, does header decode to get the parameters and initializes state and configuration structure | +|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_DONE_QUERY | Checks if the initialization process has completed | +|IA_API_CMD_GET_CURIDX_INPUT_BUF | 0 | Gets the number of input buffer bytes consumed by the last initialization | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ | Gets the sampling frequency | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS | Gets the output number of channels | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ | Gets the output PCM word size | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE | Gets the channel mode. (Mono or PS/Stereo/Dual-mono) | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK | Gets the channel mask | +|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE | Gets the SBR mode (Present/ Not Present).This is valid only for Ex-HEAAC v2 build | +|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DO_EXECUTE | Executes the decode thread | +|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DONE_QUERY | Checks if the end of decode has been reached | +|IA_API_CMD_GET_OUTPUT_BYTES | 0 | Gets the number of bytes output by the decoder in the last frame | + +## Flowchart of calling sequence + +![API Flowchart](docs/Api_flowchart.png) + +# Building the Ex-HEAAC Decoder + +## Building for AOSP +* Makefiles for building the Ex-HEAAC decoder library is provided in root(`libxaac/`) folder. +* Makefiles for building the Ex-HEAAC decoder testbench is provided in `test` folder. +* Build the library followed by the application using the below commands: +Go to root directory +``` +$ mm +``` + +## Using CMake +Users can also use cmake to build for `x86`, `x86_64`, and Windows (MSVS project) platforms. + +### Building for native platforms +Run the following commands to build the Ex-HEAAC Decoder for native platform: +``` +Go to the root directory(libxaac/) of the Ex-HEAAC Decoder. +Create a new folder in the project root directory and move to the newly created folder. + +$ cd <path to libxaac> +$ mkdir bin +$ cd bin +$ cmake .. +$ cmake --build . +``` + +### Creating MSVS project files +To create MSVS project files for the Ex-HEAAC decoder from cmake, run the following commands: +``` +Go to the root directory(libxaac/) of the Ex-HEAAC Decoder. +Create a new folder in the project root directory and move to the newly created folder. + +$ cd <path to libxaac> +$ mkdir bin +$ cd bin +$ cmake -G "Visual Studio 15 2017" .. +``` + +The above command creates MSVS 2017 project files. If the version is different, modify the generator name accordingly. +The Ex-HEAAC decoder can be built using these project files. + +# Running the Ex-HEAAC Decoder + +The Ex-HEAAC Decoder can be run by providing command-line parameters(CLI options) directly or by providing a parameter file as a command line argument. + +Command line usage : +``` +<exceutable> -ifile:<input_file> -imeta:<meta_data_file> -ofile:<out_file> [options] + +[options] can be, +[-pcmsz:<pcmwordsize>] +[-dmix:<down_mix>] +[-tostereo:<interleave_to_stereo>] +[-dsample:<down_sample_sbr>] +[-fs:<RAW_sample_rate>] +[-nosync:<disable_sync>] +[-sbrup:<auto_sbr_upsample>] +[-maxchannel:<maximum_num_channels>] +[-mp4:<mp4_flag>] + +where, + <inputfile> is the input AAC file name. + <meta_data_file> is a text file which contains metadata for USAC files with an MP4 container. + <outputfile> is the output file name. + <pcmwordsize> is the bits per sample info. Only 16 is valid + <down_mix> is to enable/disable always mono output. Default 0. + <interleave_to_stereo> is to enable/disable always interleaved to stereo output. Default 1. + <down_sample_sbr> is to enable/disable down-sampled SBR output. Default auto identification from header. + <RAW_sample_rate> is to indicate the core AAC sample rate for a RAW stream. If this is specified no other file format headers are searched for. + <disable_sync> is to disable the ADTS/ADIF sync search i.e when enabled the decoder expects the header to be at the start of input buffer. Default 0. + <auto_sbr_upsample> is to enable(1) or disable(0) auto SBR upsample in case of stream changing from SBR present to SBR not present. Default 1. + <maximum_num_channels> is the number of maxiumum channels the input may have. Default is 6 (5.1). + <mp4_flag> is a flag that should be set to 1 when passing raw stream along with meta data text file. + +``` + +Sample CLI: +``` +<xaac_dec_exe> -ifile:in_file.aac -ofile:out_file.wav -pcmsz:16 +``` + +# Validating the Ex-HEAAC Decoder + +Conformance testing for AAC/HEAAC v1/HEAAC v2 mainly involves comparing +decoder under test output with the ISO and 3GPP reference decoded output. + +Testing for USAC is done using encoded streams generated using ISO USAC +reference encoder. The output generated by ITTIAM USAC decoder is +compared against the output generated by ISO USAC decoder for 16-bit +conformance on the respective(ARMv7, ARMv8, X86_32, X86_64) platforms. diff --git a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c index 75ca6b3..d15cf74 100644 --- a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c +++ b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c @@ -69,7 +69,7 @@ VOID(*ixheaacd_covariance_matrix_calc_2) WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7; VOID(*ixheaacd_over_lap_add1) -(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16, +(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16) = &ixheaacd_over_lap_add1_dec; VOID(*ixheaacd_over_lap_add2) @@ -155,13 +155,13 @@ VOID(*ixheaacd_post_twiddle) WORD npoints) = &ixheaacd_post_twiddle_dec; VOID(*ixheaacd_post_twid_overlap_add) -(WORD16 pcm_out[], WORD32 spec_data[], +(WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec; VOID(*ixheaacd_neg_shift_spec) -(WORD32 *coef, WORD16 *out, WORD16 q_shift, +(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec; VOID(*ixheaacd_spec_to_overlapbuf) @@ -169,7 +169,7 @@ VOID(*ixheaacd_spec_to_overlapbuf) WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7; VOID(*ixheaacd_overlap_buf_out) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7; VOID(*ixheaacd_overlap_out_copy) diff --git a/decoder/armv7/ixheaacd_function_selector_armv7.c b/decoder/armv7/ixheaacd_function_selector_armv7.c index c9f41f9..d3a17d7 100644 --- a/decoder/armv7/ixheaacd_function_selector_armv7.c +++ b/decoder/armv7/ixheaacd_function_selector_armv7.c @@ -76,7 +76,7 @@ VOID(*ixheaacd_covariance_matrix_calc_2) WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7; VOID(*ixheaacd_over_lap_add1) -(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16, +(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16) = &ixheaacd_over_lap_add1_armv7; VOID(*ixheaacd_over_lap_add2) @@ -161,12 +161,13 @@ VOID(*ixheaacd_post_twiddle) WORD npoints) = &ixheaacd_post_twiddle_armv7; VOID(*ixheaacd_post_twid_overlap_add) -(WORD16 pcm_out[], WORD32 spec_data[], +(WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv7; + VOID(*ixheaacd_neg_shift_spec) -(WORD32 *coef, WORD16 *out, WORD16 q_shift, +(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv7; VOID(*ixheaacd_spec_to_overlapbuf) @@ -174,11 +175,11 @@ VOID(*ixheaacd_spec_to_overlapbuf) WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7; VOID(*ixheaacd_overlap_buf_out) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7; VOID(*ixheaacd_overlap_out_copy) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_armv7; VOID(*ixheaacd_pretwiddle_compute) @@ -194,18 +195,6 @@ VOID(*ixheaacd_complex_fft_p2) (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift) = &ixheaacd_complex_fft_p2_armv7; -VOID(*ixheaacd_mps_complex_fft_64) -(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, - WORD32 nlength) = &ixheaacd_mps_complex_fft_64_armv7; - -VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_armv7; - -VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_armv7; - VOID(*ixheaacd_calc_pre_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_armv7; @@ -214,14 +203,9 @@ VOID(*ixheaacd_calc_post_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_armv7; -VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_armv7; - VOID(*ixheaacd_mps_synt_out_calc) -(WORD32 resolution, WORD32 *out, WORD32 *state, - const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_armv7; +(WORD32 resolution, FLOAT32 *out, FLOAT32 *state, + const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; VOID(*ixheaacd_fft_15_ld) (WORD32 *inp, WORD32 *op, WORD32 *fft3out, diff --git a/decoder/armv7/ixheaacd_lap1.s b/decoder/armv7/ixheaacd_lap1.s index 999dd35..2f2ced3 100644 --- a/decoder/armv7/ixheaacd_lap1.s +++ b/decoder/armv7/ixheaacd_lap1.s @@ -29,7 +29,7 @@ ixheaacd_overlap_buf_out_armv7: STMFD sp!, {r4-r5} - MOV r3, r3, lsl #1 + MOV r3, r3, lsl #2 OUTSAMPLE_LOOP: @@ -37,11 +37,11 @@ OUTSAMPLE_LOOP: LDR r5, [r1], #4 SUBS r2, r2, #2 - QADD16 r4, r4, r4 - QADD16 r5, r5, r5 + LSL r4,r4,#15 + LSL r5,r5,#15 - STRH r4, [r0], r3 - STRH r5, [r0], r3 + STR r4, [r0], r3 + STR r5, [r0], r3 BGT OUTSAMPLE_LOOP @@ -54,7 +54,7 @@ ixheaacd_overlap_out_copy_armv7: STMFD sp!, {r4-r9, r14} MOV r9, #32 MOV r8, r1 - MOV r3, r3, LSL #1 + MOV r3, r3, LSL #2 OUT_OVERLAP_LOOP: @@ -62,14 +62,14 @@ OUT_OVERLAP_LOOP: LDR r5, [r1], #4 SUBS r9, r9, #1 - QADD16 r4, r4, r4 - QADD16 r5, r5, r5 + LSL r4,r4,#15 + LSL r5,r5,#15 LDR r6, [r2], #4 LDR r7, [r2], #4 - STRH r4, [r0], r3 - STRH r5, [r0], r3 + STR r4, [r0], r3 + STR r5, [r0], r3 STR r6, [r8], #4 STR r7, [r8], #4 diff --git a/decoder/armv7/ixheaacd_no_lap1.s b/decoder/armv7/ixheaacd_no_lap1.s index 2884191..944e32b 100644 --- a/decoder/armv7/ixheaacd_no_lap1.s +++ b/decoder/armv7/ixheaacd_no_lap1.s @@ -32,79 +32,60 @@ ixheaacd_neg_shift_spec_armv7: ADD R6, R6, R0 MOV R8, #-16 SUB R6, R6, #12 - MOV R7, R3, LSL #1 + MOV R7, R3, LSL #2 VDUP.32 Q1, R2 - MOV R4, #0x8000 - VDUP.32 Q2, R4 - VLD1.32 {D0, D1}, [R6], R8 VQNEG.S32 Q0, Q0 VLD1.32 {D6, D7}, [R6], R8 VQSHL.S32 Q15, Q0, Q1 - VQADD.S32 Q14, Q15, Q2 - VSHR.S32 Q13, Q14, #16 - VREV64.32 Q13, Q13 + VMOV Q13, Q15 SUB R5, R5, #8 - VUZP.16 D27, D26 VQNEG.S32 Q3, Q3 - + VREV64.32 Q13,Q13 LOOP_1: - - VST1.16 D27[0], [R1], R7 - VQSHL.S32 Q12, Q3, Q1 - VLD1.32 {D0, D1}, [R6], R8 - VST1.16 D27[1], [R1], R7 - VQADD.S32 Q11, Q12, Q2 - VST1.16 D27[2], [R1], R7 - VQNEG.S32 Q0, Q0 - VST1.16 D27[3], [R1], R7 - VSHR.S32 Q10, Q11, #16 - VREV64.32 Q10, Q10 - SUBS R5, R5, #8 - - - VUZP.16 D21, D20 - VQSHL.S32 Q15, Q0, Q1 - VST1.16 D21[0], [R1], R7 - VLD1.32 {D6, D7}, [R6], R8 - VQADD.S32 Q14, Q15, Q2 - VST1.16 D21[1], [R1], R7 - VSHR.S32 Q13, Q14, #16 - VST1.16 D21[2], [R1], R7 - VREV64.32 Q13, Q13 - VST1.16 D21[3], [R1], R7 - - - VUZP.16 D27, D26 - VQNEG.S32 Q3, Q3 - - - - BGT LOOP_1 - - VST1.16 D27[0], [R1], R7 - VQSHL.S32 Q12, Q3, Q1 - VST1.16 D27[1], [R1], R7 - VST1.16 D27[2], [R1], R7 - VQADD.S32 Q11, Q12, Q2 - VST1.16 D27[3], [R1], R7 - VSHR.S32 Q10, Q11, #16 - - - VREV64.32 Q10, Q10 - - VUZP.16 D21, D20 - - VST1.16 D21[0], [R1], R7 - VST1.16 D21[1], [R1], R7 - VST1.16 D21[2], [R1], R7 - VST1.16 D21[3], [R1], R7 - VPOP {D8 - D15} - LDMFD sp!, {R4-R12, R15} + VST1.32 {D27[0]},[R1], R7 + VQSHL.S32 Q12, Q3, Q1 + VLD1.32 {D0, D1}, [R6], R8 + VST1.32 {D27[1]}, [R1], R7 + VST1.32 {D26[0]}, [R1], R7 + VQNEG.S32 Q0, Q0 + VST1.32 {D26[1]}, [R1], R7 + VMOV Q10 , Q12 + SUBS R5, R5, #8 + + + VREV64.32 Q10,Q10 + VQSHL.S32 Q15, Q0, Q1 + VST1.32 {D21[0]},[R1], R7 + VLD1.32 {D6, D7}, [R6],R8 + VST1.32 {D21[1]}, [R1],R7 + VMOV Q13,Q15 + VST1.32 {D20[0]}, [R1],R7 + VST1.32 {D20[1]}, [R1],R7 + + VREV64.32 Q13,Q13 + VQNEG.S32 Q3, Q3 + + BGT LOOP_1 + + VST1.32 {D27[0]},[R1],R7 + VQSHL.S32 Q12, Q3, Q1 + VST1.32 {D27[1]}, [R1],R7 + VST1.32 {D26[0]}, [R1],R7 + VST1.32 {D26[1]}, [R1],R7 + VMOV Q10, Q12 + + VREV64.32 Q10,Q10 + VST1.32 {D21[0]}, [R1], R7 + VST1.32 {D21[1]}, [R1], R7 + VST1.32 {D20[0]}, [R1], R7 + VST1.32 {D20[1]}, [R1], R7 + VPOP {D8 - D15} + LDMFD sp!, {R4-R12, R15} .end diff --git a/decoder/armv7/ixheaacd_overlap_add1.s b/decoder/armv7/ixheaacd_overlap_add1.s index b376470..5c8f3c4 100644 --- a/decoder/armv7/ixheaacd_overlap_add1.s +++ b/decoder/armv7/ixheaacd_overlap_add1.s @@ -32,6 +32,8 @@ ixheaacd_over_lap_add1_armv7: LDR R4, [SP, #104] LDR R5, [SP, #108] LDR R6, [SP, #112] + + LSL R6 , R6 , #1 MOV R10, R5, LSL #1 SUB R11, R10, #1 MOV R10, R11, LSL #2 @@ -45,11 +47,10 @@ ixheaacd_over_lap_add1_armv7: MOV R12, #-16 VDUP.16 Q11, R4 VLD1.32 {D6, D7}, [R10], R12 - MOV R7, #0x2000 + MOV R7, #0x0 VREV64.32 Q3, Q3 RSB R7, R7, #0 VQNEG.S32 Q0, Q3 - VDUP.32 Q10, R7 VUZP.16 D1, D0 SUB R11, R5, #1 VUZP.16 D7, D6 @@ -66,7 +67,6 @@ ixheaacd_over_lap_add1_armv7: ADD R6, R6, R2 - VMULL.U16 Q15, D7, D2 VLD1.32 {D4, D5}, [R1]! VSHR.U32 Q15, Q15, #16 @@ -81,12 +81,7 @@ ixheaacd_over_lap_add1_armv7: VQMOVN.S64 D28, Q13 VMULL.S32 Q13, D5, D15 VQMOVN.S64 D29, Q13 - - VQADD.S32 Q14, Q14, Q10 VQSUB.S32 Q13, Q15, Q14 - VQSHL.S32 Q13, Q13, #2 - VSHR.S32 Q13, Q13, #16 - VUZP.16 D26, D27 VMULL.U16 Q12, D1, D3 @@ -104,16 +99,12 @@ ixheaacd_over_lap_add1_armv7: VQMOVN.S64 D17, Q0 VREV64.32 Q3, Q3 - VQADD.S32 Q8, Q8, Q10 VQNEG.S32 Q0, Q3 VUZP.16 D1, D0 VQSUB.S32 Q9, Q12, Q8 VUZP.16 D7, D6 - VQSHL.S32 Q9, Q9, #2 VLD2.16 {D2, D3}, [R8], R12 - VSHR.S32 Q9, Q9, #16 VREV64.16 Q1, Q1 - VUZP.16 D18, D19 VLD1.32 {D4, D5}, [R1]! SUB R5, R5, #8 @@ -121,25 +112,25 @@ ixheaacd_over_lap_add1_armv7: LOOP_1: - VST1.16 D26[0], [R11], R4 + + VST1.32 D26[0], [R11], R4 VMULL.U16 Q15, D7, D2 - VST1.16 D26[1], [R11], R4 + VST1.32 D26[1], [R11], R4 VMULL.U16 Q12, D1, D3 - VST1.16 D26[2], [R11], R4 + VST1.32 D27[0], [R11] ,R4 VSHR.U32 Q15, Q15, #16 - VST1.16 D26[3], [R11], R4 + VST1.32 D27[1], [R11] ,R4 VSHR.U32 Q12, Q12, #16 - VST1.16 D18[0], [R6], R9 + VST1.32 D18[0], [R6], R9 VMLAL.S16 Q15, D6, D2 - VST1.16 D18[1], [R6], R9 + VST1.32 D18[1], [R6], R9 VMLAL.S16 Q12, D0, D3 - VST1.16 D18[2], [R6], R9 + VST1.32 D19[0], [R6], R9 VQSHL.S32 Q15, Q15, Q11 - VST1.16 D18[3], [R6], R9 + VST1.32 D19[1], [R6], R9 VQSHL.S32 Q12, Q12, Q11 VLD1.32 {D6, D7}, [R10], R12 - VADDL.S16 Q7, D3, D12 VMULL.S32 Q8, D4, D14 @@ -148,8 +139,6 @@ LOOP_1: VQMOVN.S64 D29, Q8 VREV64.32 Q3, Q3 - - VADDL.S16 Q7, D2, D12 VMULL.S32 Q0, D4, D14 @@ -160,34 +149,27 @@ LOOP_1: VLD2.16 {D2, D3}, [R8], R12 VQNEG.S32 Q0, Q3 VLD1.32 {D4, D5}, [R1]! - VQADD.S32 Q14, Q14, Q10 VUZP.16 D1, D0 - VQADD.S32 Q8, Q8, Q10 VUZP.16 D7, D6 VQSUB.S32 Q13, Q15, Q14 VREV64.16 Q1, Q1 VQSUB.S32 Q9, Q12, Q8 - VQSHL.S32 Q13, Q13, #2 - VQSHL.S32 Q9, Q9, #2 VMULL.U16 Q15, D7, D2 - VSHR.S32 Q13, Q13, #16 - VUZP.16 D26, D27 - VSHR.S32 Q9, Q9, #16 - VST1.16 D26[0], [R11], R4 + VST1.32 D26[0], [R11], R4 VMULL.U16 Q12, D1, D3 - VUZP.16 D18, D19 + VSHR.U32 Q15, Q15, #16 - VST1.16 D26[1], [R11], R4 + VST1.32 {D26[1]}, [R11], R4 VMLAL.S16 Q15, D6, D2 @MLA - VST1.16 D26[2], [R11], R4 + VST1.32 {D27[0]}, [R11], R4 VSHR.U32 Q12, Q12, #16 - VST1.16 D26[3], [R11], R4 + VST1.32 {D27[1]}, [R11], R4 VMLAL.S16 Q12, D0, D3 @MLA - VST1.16 D18[0], [R6], R9 + VST1.32 {D18[0]}, [R6], R9 VQSHL.S32 Q15, Q15, Q11 - VST1.16 D18[1], [R6], R9 + VST1.32 {D18[1]}, [R6], R9 VQSHL.S32 Q12, Q12, Q11 - VST1.16 D18[2], [R6], R9 + VST1.32 {D19[0]}, [R6], R9 VADDL.S16 Q7, D3, D12 @@ -197,7 +179,7 @@ LOOP_1: VMULL.S32 Q8, D5, D15 VQMOVN.S64 D29, Q8 - VST1.16 D18[3], [R6], R9 + VST1.32 {D19[1]}, [R6], R9 VADDL.S16 Q7, D2, D12 @@ -208,45 +190,40 @@ LOOP_1: VQMOVN.S64 D17, Q0 VLD1.32 {D6, D7}, [R10], R12 - VQADD.S32 Q14, Q14, Q10 VREV64.32 Q3, Q3 VQNEG.S32 Q0, Q3 VUZP.16 D1, D0 VQSUB.S32 Q13, Q15, Q14 VUZP.16 D7, D6 - VQADD.S32 Q8, Q8, Q10 VLD2.16 {D2, D3}, [R8], R12 VQSUB.S32 Q9, Q12, Q8 VREV64.16 Q1, Q1 - VQSHL.S32 Q13, Q13, #2 + VLD1.32 {D4, D5}, [R1]! - VQSHL.S32 Q9, Q9, #2 - VSHR.S32 Q13, Q13, #16 + SUBS R5, R5, #8 - VSHR.S32 Q9, Q9, #16 - VUZP.16 D26, D27 - VUZP.16 D18, D19 + BGT LOOP_1 - VST1.16 D26[0], [R11], R4 + VST1.32 {D26[0]}, [R11], R4 VMULL.U16 Q15, D7, D2 - VST1.16 D26[1], [R11], R4 + VST1.32 {D26[1]}, [R11], R4 VMULL.U16 Q12, D1, D3 - VST1.16 D26[2], [R11], R4 + VST1.32 {D27[0]}, [R11], R4 VSHR.U32 Q15, Q15, #16 - VST1.16 D26[3], [R11], R4 + VST1.32 {D27[1]}, [R11], R4 VSHR.U32 Q12, Q12, #16 - VST1.16 D18[0], [R6], R9 + VST1.32 {D18[0]}, [R6], R9 VMLAL.S16 Q15, D6, D2 - VST1.16 D18[1], [R6], R9 + VST1.32 {D18[1]}, [R6], R9 VMLAL.S16 Q12, D0, D3 - VST1.16 D18[2], [R6], R9 + VST1.32 {D19[0]}, [R6], R9 VQSHL.S32 Q15, Q15, Q11 - VST1.16 D18[3], [R6], R9 + VST1.32 {D19[1]}, [R6], R9 VQSHL.S32 Q12, Q12, Q11 @@ -268,29 +245,19 @@ LOOP_1: VMULL.S32 Q13, D5, D15 VQMOVN.S64 D17, Q13 - VQADD.S32 Q14, Q14, Q10 - VQADD.S32 Q8, Q8, Q10 + VQSUB.S32 Q13, Q15, Q14 VQSUB.S32 Q9, Q12, Q8 - VQSHL.S32 Q13, Q13, #2 - VQSHL.S32 Q9, Q9, #2 - VSHR.S32 Q13, Q13, #16 - VSHR.S32 Q9, Q9, #16 - VUZP.16 D26, D27 - - VUZP.16 D18, D19 - - - VST1.16 D26[0], [R11], R4 - VST1.16 D26[1], [R11], R4 - VST1.16 D26[2], [R11], R4 - VST1.16 D26[3], [R11], R4 + VST1.32 D26[0], [R11], R4 + VST1.32 D26[1], [R11], R4 + VST1.32 D27[0], [R11], R4 + VST1.32 D27[1], [R11], R4 - VST1.16 D18[0], [R6], R9 - VST1.16 D18[1], [R6], R9 - VST1.16 D18[2], [R6], R9 - VST1.16 D18[3], [R6], R9 + VST1.32 D18[0], [R6], R9 + VST1.32 D18[1], [R6], R9 + VST1.32 D19[0], [R6], R9 + VST1.32 D19[1], [R6], R9 VPOP {d8 - d15} LDMFD sp!, {R4-R12, R15} diff --git a/decoder/armv7/ixheaacd_post_twiddle_overlap.s b/decoder/armv7/ixheaacd_post_twiddle_overlap.s index 24a5ba3..57d20cd 100644 --- a/decoder/armv7/ixheaacd_post_twiddle_overlap.s +++ b/decoder/armv7/ixheaacd_post_twiddle_overlap.s @@ -44,7 +44,7 @@ ixheaacd_post_twid_overlap_add_armv7: VMOV.S16 D18, #50 RSB R9, R5, #15 - VMOV.S32 Q10, #0x00008000 + VMOV.S32 Q10, #0x0000000 VDUP.32 Q8, R5 SUB R5, R5, #16 STR R5, [sp, #116] @@ -149,14 +149,12 @@ NEXT1: VQSUB.S32 D8, D0, D8 - VQSHL.S32 D8, D8, #2 VDUP.32 D0, R8 - VQADD.S32 D8, D8, D0 - VSHR.S32 D8, D8, #16 LDR R7, [sp, #112] + LSL R7 , R7 , #1 LSL R10, R7, #1 ASR R5, R3, #1 @@ -166,8 +164,8 @@ NEXT1: MVN R9, R10 ADD R9, R9, #1 - VST1.16 D8[2], [R0], R9 - VST1.16 D8[0], [R5], R10 + VST1.32 D8[1], [R0], R9 + VST1.32 D8[0], [R5], R10 MOV R8, R1 @@ -397,28 +395,19 @@ PROLOGUE_NEON: VMLAL.S16 Q15, D15, D10 VLD2.32 {Q5, Q6}, [R6], R12 - VQSHL.S32 Q2, Q2, #2 VUZP.16 D10, D11 - VQSHL.S32 Q3, Q3, #2 VUZP.16 D12, D13 - VQADD.S32 Q7, Q2, Q10 + VMOV Q7,Q2 VREV64.16 Q5, Q5 - VQADD.S32 Q3, Q3, Q10 VREV64.16 Q6, Q6 - VSHR.S32 Q7, Q7, #16 - - VUZP.16 D14, D15 - VSHR.S32 Q3, Q3, #16 - - VUZP.16 D6, D7 - - VMOV D15, D6 VQSHL.S32 Q4, Q4, Q8 + VMOV Q9,Q3 + VLD2.32 {Q2, Q3}, [R8]! VQSHL.S32 Q15, Q15, Q8 @@ -428,72 +417,61 @@ PROLOGUE_NEON: VUZP.16 D6, D7 VQSUB.S32 Q11, Q15, Q11 - VQSHL.S32 Q15, Q4, #2 + VMOV Q15,Q4 VLD2.16 {D8, D9}, [R2]! - VQSHL.S32 Q11, Q11, #2 - VQADD.S32 Q15, Q15, Q10 - VQADD.S32 Q11, Q11, Q10 +CORE_LOOP_PTO: - VSHR.S32 Q15, Q15, #16 + VST1.32 D14[0], [R0, :32], R9 - VUZP.16 D30, D31 - VSHR.S32 Q11, Q11, #16 + VST1.32 D22[0], [R0, :32], R9 + VST1.32 D14[1], [R0, :32], R9 - VUZP.16 D22, D23 - VMOV D23, D30 + VST1.32 D22[1], [R0, :32], R9 -CORE_LOOP_PTO: - VST1.16 D14[0], [R0, : 16], R9 - VMULL.U16 Q15, D0, D9 + VST1.32 D15[0], [R0, :32], R9 - VST1.16 D22[0], [R0, : 16], R9 - VMULL.U16 Q14, D2, D8 + VST1.32 D23[0], [R0, :32], R9 - VST1.16 D14[1], [R0, : 16], R9 - VMULL.U16 Q13, D0, D8 + VST1.32 D15[1], [R0, :32], R9 - VST1.16 D22[1], [R0, : 16], R9 - VMULL.U16 Q12, D2, D9 + VST1.32 D23[1], [R0, :32], R9 - VST1.16 D14[2], [R0, : 16], R9 - VSHR.U32 Q15, Q15, #16 + VST1.32 D18[0], [R5, :32], R10 - VST1.16 D22[2], [R0, : 16], R9 - VSHR.U32 Q14, Q14, #16 + VST1.32 D30[0], [R5, :32] ,R10 - VST1.16 D14[3], [R0, : 16], R9 - VMLAL.S16 Q15, D1, D9 + VST1.32 D18[1], [R5, :32], R10 - VST1.16 D22[3], [R0, : 16], R9 - VMLAL.S16 Q14, D3, D8 + VST1.32 D30[1], [R5, :32], R10 - VST1.16 D15[0], [R5, : 16], R10 - VSHR.U32 Q13, Q13, #16 + VST1.32 D19[0], [R5, :32], R10 - VST1.16 D23[0], [R5, : 16], R10 - VSHR.U32 Q12, Q12, #16 + VST1.32 D31[0], [R5, :32], R10 - VST1.16 D15[1], [R5, : 16], R10 - VMLAL.S16 Q13, D1, D8 + VST1.32 D19[1], [R5, :32], R10 + + VST1.32 D31[1], [R5, :32], R10 - VST1.16 D23[1], [R5, : 16], R10 + VMULL.U16 Q15, D0, D9 + VMULL.U16 Q14, D2, D8 + VMULL.U16 Q13, D0, D8 + VMULL.U16 Q12, D2, D9 + VSHR.U32 Q15, Q15, #16 + VSHR.U32 Q14, Q14, #16 + VMLAL.S16 Q15, D1, D9 + VMLAL.S16 Q14, D3, D8 + VSHR.U32 Q13, Q13, #16 + VSHR.U32 Q12, Q12, #16 + VMLAL.S16 Q13, D1, D8 VMLAL.S16 Q12, D3, D9 - VST1.16 D15[2], [R5, : 16], R10 VADD.I32 Q15, Q15, Q14 - - VST1.16 D23[2], [R5, : 16], R10 VNEG.S32 Q15, Q15 - - VST1.16 D15[3], [R5, : 16], R10 - - VST1.16 D23[3], [R5, : 16], R10 VSUB.I32 Q14, Q12, Q13 - VMOV Q13, Q15 VMULL.U16 Q11, D4, D8 @@ -501,6 +479,7 @@ CORE_LOOP_PTO: VUZP.16 D24, D25 + VMOV.S16 D18, #50 VUZP.16 D26, D27 VMULL.U16 Q1, D24, D18 @@ -660,28 +639,21 @@ CORE_LOOP_PTO: VMLAL.S16 Q15, D15, D10 VLD2.32 {Q5, Q6}, [R6], R12 - VQSHL.S32 Q2, Q2, #2 VUZP.16 D10, D11 - VQSHL.S32 Q3, Q3, #2 VUZP.16 D12, D13 - VQADD.S32 Q7, Q2, Q10 + VMOV Q7 , Q2 VREV64.16 Q5, Q5 - VQADD.S32 Q3, Q3, Q10 VREV64.16 Q6, Q6 - VSHR.S32 Q7, Q7, #16 - - VUZP.16 D14, D15 - VSHR.S32 Q3, Q3, #16 - VUZP.16 D6, D7 - VMOV D15, D6 VQSHL.S32 Q4, Q4, Q8 + VMOV Q9,Q3 + VLD2.32 {Q2, Q3}, [R8]! VQSHL.S32 Q15, Q15, Q8 @@ -691,22 +663,9 @@ CORE_LOOP_PTO: VUZP.16 D6, D7 VQSUB.S32 Q11, Q15, Q11 - VQSHL.S32 Q15, Q4, #2 + VMOV Q15,Q4 VLD2.16 {D8, D9}, [R2]! - VQSHL.S32 Q11, Q11, #2 - - VQADD.S32 Q15, Q15, Q10 - VQADD.S32 Q11, Q11, Q10 - - VSHR.S32 Q15, Q15, #16 - - VUZP.16 D30, D31 - VSHR.S32 Q11, Q11, #16 - - - VUZP.16 D22, D23 - VMOV D23, D30 SUBS R3, R3, #1 BNE CORE_LOOP_PTO @@ -717,54 +676,57 @@ CORE_LOOP_PTO: EPILOGUE: - VST1.16 D14[0], [R0], R9 - VMULL.U16 Q15, D0, D9 + VST1.32 D14[0], [R0], R9 - VST1.16 D22[0], [R0], R9 - VMULL.U16 Q14, D2, D8 + VST1.32 D22[0], [R0], R9 - VST1.16 D14[1], [R0], R9 - VMULL.U16 Q13, D0, D8 + VST1.32 D14[1], [R0], R9 - VST1.16 D22[1], [R0], R9 - VMULL.U16 Q12, D2, D9 + VST1.32 D22[1], [R0], R9 - VST1.16 D14[2], [R0], R9 - VSHR.U32 Q15, Q15, #16 + VST1.32 D15[0], [R0], R9 - VST1.16 D22[2], [R0], R9 - VSHR.U32 Q14, Q14, #16 + VST1.32 D23[0], [R0], R9 - VST1.16 D14[3], [R0], R9 - VMLAL.S16 Q15, D1, D9 + VST1.32 D15[1], [R0], R9 - VST1.16 D22[3], [R0], R9 - VMLAL.S16 Q14, D3, D8 + VST1.32 D23[1], [R0], R9 - VST1.16 D15[0], [R5], R10 - VSHR.U32 Q13, Q13, #16 + VST1.32 D18[0], [R5], R10 - VST1.16 D23[0], [R5], R10 - VSHR.U32 Q12, Q12, #16 + VST1.32 D30[0], [R5], R10 - VST1.16 D15[1], [R5], R10 - VMLAL.S16 Q13, D1, D8 + VST1.32 D18[1], [R5], R10 - VST1.16 D23[1], [R5], R10 - VMLAL.S16 Q12, D3, D9 + VST1.32 D30[1], [R5], R10 - VST1.16 D15[2], [R5], R10 - VADD.I32 Q15, Q15, Q14 + VST1.32 D19[0], [R5], R10 - VST1.16 D23[2], [R5], R10 - VNEG.S32 Q15, Q15 + VST1.32 D31[0], [R5], R10 + + VST1.32 D19[1], [R5], R10 + + VST1.32 D31[1], [R5], R10 - VST1.16 D15[3], [R5], R10 + VMULL.U16 Q15, D0, D9 + VMULL.U16 Q14, D2, D8 + VMULL.U16 Q13, D0, D8 + VMULL.U16 Q12, D2, D9 + VSHR.U32 Q15, Q15, #16 + VSHR.U32 Q14, Q14, #16 + VMLAL.S16 Q15, D1, D9 + VMLAL.S16 Q14, D3, D8 + VSHR.U32 Q13, Q13, #16 + VSHR.U32 Q12, Q12, #16 + VMLAL.S16 Q13, D1, D8 + VMLAL.S16 Q12, D3, D9 + VADD.I32 Q15, Q15, Q14 + VNEG.S32 Q15, Q15 - VST1.16 D23[3], [R5], R10 VSUB.I32 Q14, Q12, Q13 + VMOV.S16 D18, #50 VMULL.U16 Q11, D4, D8 VMOV Q13, Q15 @@ -925,22 +887,10 @@ EPILOGUE: VMLAL.S16 Q15, D15, D10 - VQSHL.S32 Q2, Q2, #2 - VQSHL.S32 Q3, Q3, #2 VQADD.S32 Q7, Q2, Q10 - VQADD.S32 Q3, Q3, Q10 - - VSHR.S32 Q7, Q7, #16 - - VUZP.16 D14, D15 - VSHR.S32 Q3, Q3, #16 - - VUZP.16 D6, D7 - - VMOV D15, D6 VQSHL.S32 Q4, Q4, Q8 VQSHL.S32 Q15, Q15, Q8 @@ -949,40 +899,24 @@ EPILOGUE: VQSUB.S32 Q11, Q15, Q11 - VQSHL.S32 Q15, Q4, #2 - - VQSHL.S32 Q11, Q11, #2 - - VQADD.S32 Q15, Q15, Q10 - VQADD.S32 Q11, Q11, Q10 - - VSHR.S32 Q15, Q15, #16 - - VUZP.16 D30, D31 - VSHR.S32 Q11, Q11, #16 - - VUZP.16 D22, D23 - VMOV D23, D30 - - - - - VST1.16 D14[0], [R0], R9 - VST1.16 D22[0], [R0], R9 - VST1.16 D14[1], [R0], R9 - VST1.16 D22[1], [R0], R9 - VST1.16 D14[2], [R0], R9 - VST1.16 D22[2], [R0], R9 - VST1.16 D14[3], [R0], R9 - VST1.16 D22[3], [R0], R9 - VST1.16 D15[0], [R5], R10 - VST1.16 D23[0], [R5], R10 - VST1.16 D15[1], [R5], R10 - VST1.16 D23[1], [R5], R10 - VST1.16 D15[2], [R5], R10 - VST1.16 D23[2], [R5], R10 - VST1.16 D15[3], [R5], R10 - VST1.16 D23[3], [R5], R10 + VMOV Q15 , Q4 + + VST1.32 D14[0], [R0], R9 + VST1.32 D22[0], [R0], R9 + VST1.32 D14[1], [R0], R9 + VST1.32 D22[1], [R0], R9 + VST1.32 D15[0], [R0], R9 + VST1.32 D23[0], [R0], R9 + VST1.32 D15[1], [R0], R9 + VST1.32 D23[1], [R0], R9 + VST1.32 D6[0], [R5], R10 + VST1.32 D30[0], [R5], R10 + VST1.32 D6[1], [R5], R10 + VST1.32 D30[1], [R5], R10 + VST1.32 D7[0], [R5], R10 + VST1.32 D31[0], [R5], R10 + VST1.32 D7[1], [R5], R10 + VST1.32 D31[1], [R5], R10 ARM_EPILOGUE: @@ -1212,22 +1146,10 @@ ARM_LOOP: VMLAL.S16 Q15, D15, D10 - VQSHL.S32 Q2, Q2, #2 - VQSHL.S32 Q3, Q3, #2 - VQADD.S32 Q7, Q2, Q10 + VMOV Q7 , Q2 - VQADD.S32 Q3, Q3, Q10 - - VSHR.S32 Q7, Q7, #16 - - VUZP.16 D14, D15 - VSHR.S32 Q3, Q3, #16 - - VUZP.16 D6, D7 - - VMOV D15, D6 VQSHL.S32 Q4, Q4, Q8 VQSHL.S32 Q15, Q15, Q8 @@ -1236,39 +1158,26 @@ ARM_LOOP: VQSUB.S32 Q11, Q15, Q11 - VQSHL.S32 Q15, Q4, #2 - - VQSHL.S32 Q11, Q11, #2 - - VQADD.S32 Q15, Q15, Q10 - VQADD.S32 Q11, Q11, Q10 - - VSHR.S32 Q15, Q15, #16 - - VUZP.16 D30, D31 - VSHR.S32 Q11, Q11, #16 - - VUZP.16 D22, D23 - VMOV D23, D30 + VMOV Q15, Q4 - VST1.16 D14[0], [R0], R9 - VST1.16 D22[0], [R0], R9 - VST1.16 D14[1], [R0], R9 - VST1.16 D22[1], [R0], R9 - VST1.16 D14[2], [R0], R9 - VST1.16 D22[2], [R0], R9 - VST1.16 D14[3], [R0], R9 + VST1.32 D14[0], [R0], R9 + VST1.32 D22[0], [R0], R9 + VST1.32 D14[1], [R0], R9 + VST1.32 D22[1], [R0], R9 + VST1.32 D15[0], [R0], R9 + VST1.32 D23[0], [R0], R9 + VST1.32 D15[1], [R0], R9 - VST1.16 D15[0], [R5], R10 - VST1.16 D23[0], [R5], R10 - VST1.16 D15[1], [R5], R10 - VST1.16 D23[1], [R5], R10 - VST1.16 D15[2], [R5], R10 - VST1.16 D23[2], [R5], R10 - VST1.16 D15[3], [R5], R10 + VST1.32 D6[0], [R5], R10 + VST1.32 D30[0], [R5], R10 + VST1.32 D6[1], [R5], R10 + VST1.32 D30[1], [R5], R10 + VST1.32 D7[0], [R5], R10 + VST1.32 D31[0], [R5], R10 + VST1.32 D7[1], [R5], R10 VPOP {d8 - d15} LDMFD sp!, {R4-R12} diff --git a/decoder/armv8/ixheaacd_function_selector_armv8.c b/decoder/armv8/ixheaacd_function_selector_armv8.c index 351e472..8cb4067 100644 --- a/decoder/armv8/ixheaacd_function_selector_armv8.c +++ b/decoder/armv8/ixheaacd_function_selector_armv8.c @@ -74,7 +74,7 @@ VOID(*ixheaacd_covariance_matrix_calc_2) WORD16) = &ixheaacd_covariance_matrix_calc_2_dec; VOID(*ixheaacd_over_lap_add1) -(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16, +(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16) = &ixheaacd_over_lap_add1_armv8; VOID(*ixheaacd_over_lap_add2) @@ -159,13 +159,13 @@ VOID(*ixheaacd_post_twiddle) WORD npoints) = &ixheaacd_post_twiddle_armv8; VOID(*ixheaacd_post_twid_overlap_add) -(WORD16 pcm_out[], WORD32 spec_data[], +(WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv8; VOID(*ixheaacd_neg_shift_spec) -(WORD32 *coef, WORD16 *out, WORD16 q_shift, +(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv8; VOID(*ixheaacd_spec_to_overlapbuf) @@ -173,11 +173,11 @@ VOID(*ixheaacd_spec_to_overlapbuf) WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec; VOID(*ixheaacd_overlap_buf_out) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec; VOID(*ixheaacd_overlap_out_copy) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec; VOID(*ixheaacd_pretwiddle_compute) @@ -193,18 +193,6 @@ VOID(*ixheaacd_complex_fft_p2) (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec; -VOID(*ixheaacd_mps_complex_fft_64) -(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, - WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; - -VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; - -VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; - VOID(*ixheaacd_calc_pre_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec; @@ -213,14 +201,9 @@ VOID(*ixheaacd_calc_post_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; -VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; - VOID(*ixheaacd_mps_synt_out_calc) -(WORD32 resolution, WORD32 *out, WORD32 *state, - const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; +(WORD32 resolution, FLOAT32 *out, FLOAT32 *state, + const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; VOID(*ixheaacd_fft_15_ld) (WORD32 *inp, WORD32 *op, WORD32 *fft3out, @@ -246,4 +229,4 @@ VOID(*ixheaacd_inv_dit_fft_8pt) VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, - WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
\ No newline at end of file + WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8; diff --git a/decoder/armv8/ixheaacd_no_lap1.s b/decoder/armv8/ixheaacd_no_lap1.s index d339879..1c71f42 100644 --- a/decoder/armv8/ixheaacd_no_lap1.s +++ b/decoder/armv8/ixheaacd_no_lap1.s @@ -53,71 +53,60 @@ ixheaacd_neg_shift_spec_armv8: ADD X6, X6, X0 MOV X8, #-16 SUB X6, X6, #12 - LSL X7, X3, #1 + LSL X7, X3, #2 DUP V31.4S, W2 - MOV W4, #0x8000 - DUP V30.4S, W4 + LD1 {V0.4S}, [X6], X8 SQNEG V0.4S, V0.4S LD1 {V6.4S}, [X6], X8 SQSHL V25.4S, V0.4S, V31.4S - SQADD V24.4S, V25.4S, V30.4S - SSHR V23.4S, V24.4S, #16 - REV64 V23.4S, V23.4S + + REV64 V25.4S, V25.4S SUB X5, X5, #8 - UZP1 V27.8H, V23.8H, V23.8H SQNEG V29.4S, V6.4S LOOP_1: - ST1 {V27.H}[2], [X1], X7 + ST1 {V25.S}[2], [X1], X7 SQSHL V22.4S, V29.4S, V31.4S LD1 {V0.4S}, [X6], X8 - ST1 {V27.H}[3], [X1], X7 - SQADD V21.4S, V22.4S, V30.4S - ST1 {V27.H}[0], [X1], X7 + ST1 {V25.S}[3], [X1], X7 + ST1 {V25.S}[0], [X1], X7 SQNEG V0.4S, V0.4S - ST1 {V27.H}[1], [X1], X7 - SSHR V20.4S, V21.4S, #16 - REV64 V20.4S, V20.4S + ST1 {V25.S}[1], [X1], X7 + REV64 V22.4S, V22.4S SUBS X5, X5, #8 - UZP1 V27.8H, V20.8H, V20.8H SQSHL V25.4S, V0.4S, V31.4S - ST1 {V27.H}[2], [X1], X7 + ST1 {V22.S}[2], [X1], X7 LD1 {V6.4S}, [X6], X8 - SQADD V24.4S, V25.4S, V30.4S - ST1 {V27.H}[3], [X1], X7 - SSHR V23.4S, V24.4S, #16 - ST1 {V27.H}[0], [X1], X7 - REV64 V23.4S, V23.4S - ST1 {V27.H}[1], [X1], X7 + ST1 {V22.S}[3], [X1], X7 + ST1 {V22.S}[0], [X1], X7 + REV64 V25.4S, V25.4S + ST1 {V22.S}[1], [X1], X7 - UZP1 V27.8H, V23.8H, V23.8H SQNEG V29.4S, V6.4S BGT LOOP_1 - ST1 {V27.H}[2], [X1], X7 + ST1 {V25.S}[2], [X1], X7 SQSHL V22.4S, V29.4S, V31.4S - ST1 {V27.H}[3], [X1], X7 - ST1 {V27.H}[0], [X1], X7 - SQADD V21.4S, V22.4S, V30.4S - ST1 {V27.H}[1], [X1], X7 - SSHR V20.4S, V21.4S, #16 + ST1 {V25.S}[3], [X1], X7 + ST1 {V25.S}[0], [X1], X7 + + ST1 {V25.S}[1], [X1], X7 - REV64 V20.4S, V20.4S + REV64 V22.4S, V22.4S - UZP1 V27.8H, V20.8H, V20.8H - ST1 {V27.H}[2], [X1], X7 - ST1 {V27.H}[3], [X1], X7 - ST1 {V27.H}[0], [X1], X7 - ST1 {V27.H}[1], [X1], X7 + ST1 {V22.S}[2], [X1], X7 + ST1 {V22.S}[3], [X1], X7 + ST1 {V22.S}[0], [X1], X7 + ST1 {V22.S}[1], [X1], X7 pop_v_regs RET diff --git a/decoder/armv8/ixheaacd_overlap_add1.s b/decoder/armv8/ixheaacd_overlap_add1.s index 14f5402..844effc 100644 --- a/decoder/armv8/ixheaacd_overlap_add1.s +++ b/decoder/armv8/ixheaacd_overlap_add1.s @@ -47,6 +47,7 @@ .global ixheaacd_over_lap_add1_armv8 ixheaacd_over_lap_add1_armv8: push_v_regs + LSL X6 , X6 , #1 LSL X10, X5, #1 SUB X11, X10, #1 LSL X10, X11, #2 @@ -58,11 +59,9 @@ ixheaacd_over_lap_add1_armv8: MOV X12, #-16 DUP V11.8H, W4 LD1 {V3.4S}, [X10], X12 - MOV W7, #0x2000 NEG W7, W7 SQNEG V0.4S, V3.4S - DUP V10.4S, W7 UZP1 V31.8H, V0.8H, V0.8H UZP2 V30.8H, V0.8H, V0.8H REV64 V31.8h, V31.8h @@ -105,12 +104,7 @@ ixheaacd_over_lap_add1_armv8: SQXTN2 V28.4S, V29.2D MOV V14.16B, V28.16B - SQADD V14.4S, V14.4S, V10.4S SQSUB V13.4S, V15.4S, V14.4S - SQSHL V13.4S, V13.4S, #2 - SSHR V13.4S, V13.4S, #16 - UZP1 V26.8H, V13.8H, V13.8H - UMULL V12.4S, V31.4H, V3.4H USHR V12.4S, V12.4S, #16 SMLAL V12.4S, V30.4H, V3.4H @@ -124,8 +118,6 @@ ixheaacd_over_lap_add1_armv8: SQXTN2 V28.4S, V29.2D MOV V8.16B, V28.16B - SQADD V8.4S, V8.4S, V10.4S - SQNEG V0.4S, V3.4S UZP1 V1.8H, V0.8H, V0.8H UZP2 V0.8H, V0.8H, V0.8H @@ -136,12 +128,9 @@ ixheaacd_over_lap_add1_armv8: UZP2 V6.8H, V3.8H, V3.8H REV64 V7.8h, V7.8h REV64 V6.8h, V6.8h - SQSHL V9.4S, V9.4S, #2 LD2 {V2.4H, V3.4H}, [X8], X12 - SSHR V9.4S, V9.4S, #16 REV64 V2.4H, V2.4H REV64 V3.4H, V3.4H - UZP1 V18.8H, V9.8H, V9.8H LD1 {V4.4S}, [X1], #16 SUB W5, W5, #8 @@ -149,21 +138,21 @@ ixheaacd_over_lap_add1_armv8: LOOP_1: - ST1 {V26.H}[0], [X11], X4 + ST1 {V13.S}[0], [X11], X4 UMULL V15.4S, V7.4H, V2.4H - ST1 {V26.H}[1], [X11], X4 + ST1 {V13.S}[1], [X11], X4 UMULL V12.4S, V1.4H, V3.4H - ST1 {V26.H}[2], [X11], X4 + ST1 {V13.S}[2], [X11], X4 USHR V15.4S, V15.4S, #16 - ST1 {V26.H}[3], [X11], X4 + ST1 {V13.S}[3], [X11], X4 USHR V12.4S, V12.4S, #16 - ST1 {V18.H}[0], [X6], X9 + ST1 {V9.S}[0], [X6], X9 SMLAL V15.4S, V6.4H, V2.4H - ST1 {V18.H}[1], [X6], X9 + ST1 {V9.S}[1], [X6], X9 SMLAL V12.4S, V0.4H, V3.4H - ST1 {V18.H}[2], [X6], X9 + ST1 {V9.S}[2], [X6], X9 SQSHL V15.4S, V15.4S, V11.4S - ST1 {V18.H}[3], [X6], X9 + ST1 {V9.S}[3], [X6], X9 SQSHL V12.4S, V12.4S, V11.4S LD1 {V6.4S}, [X10], X12 @@ -187,12 +176,10 @@ LOOP_1: LD1 {V4.4S}, [X1], #16 - SQADD V14.4S, V14.4S, V10.4S UZP1 V1.8H, V0.8H, V0.8H UZP2 V0.8H, V0.8H, V0.8H REV64 V1.8h, V1.8h REV64 V0.8h, V0.8h - SQADD V8.4S, V8.4S, V10.4S UZP1 V7.8H, V6.8H, V6.8H UZP2 V6.8H, V6.8H, V6.8H REV64 V7.8h, V7.8h @@ -201,27 +188,21 @@ LOOP_1: REV64 V2.4H, V2.4H REV64 V3.4H, V3.4H SQSUB V9.4S, V12.4S, V8.4S - SQSHL V13.4S, V13.4S, #2 - SQSHL V9.4S, V9.4S, #2 UMULL V15.4S, V7.4H, V2.4H - SSHR V13.4S, V13.4S, #16 - UZP1 V26.8H, V13.8H, V13.8H - SSHR V9.4S, V9.4S, #16 - ST1 {V26.H}[0], [X11], X4 + ST1 {V13.S}[0], [X11], X4 UMULL V12.4S, V1.4H, V3.4H - UZP1 V18.8H, V9.8H, V9.8H USHR V15.4S, V15.4S, #16 - ST1 {V26.H}[1], [X11], X4 + ST1 {V13.S}[1], [X11], X4 SMLAL V15.4S, V6.4H, V2.4H - ST1 {V26.H}[2], [X11], X4 + ST1 {V13.S}[2], [X11], X4 USHR V12.4S, V12.4S, #16 - ST1 {V26.H}[3], [X11], X4 + ST1 {V13.S}[3], [X11], X4 SMLAL V12.4S, V0.4H, V3.4H - ST1 {V18.H}[0], [X6], X9 + ST1 {V9.S}[0], [X6], X9 SQSHL V15.4S, V15.4S, V11.4S - ST1 {V18.H}[1], [X6], X9 + ST1 {V9.S}[1], [X6], X9 SQSHL V12.4S, V12.4S, V11.4S - ST1 {V18.H}[2], [X6], X9 + ST1 {V9.S}[2], [X6], X9 SSHLL V27.4S, V3.4H, #0 SMULL V28.2D, V27.2S, V4.2S @@ -230,7 +211,7 @@ LOOP_1: SQXTN2 V28.4S, V29.2D MOV V14.16B, V28.16B - ST1 {V18.H}[3], [X6], X9 + ST1 {V9.S}[3], [X6], X9 SSHLL V27.4S, V2.4H, #0 @@ -241,7 +222,6 @@ LOOP_1: MOV V8.16B, V28.16B LD1 {V3.4S}, [X10], X12 - SQADD V14.4S, V14.4S, V10.4S SQNEG V0.4S, V3.4S UZP1 V1.8H, V0.8H, V0.8H @@ -253,39 +233,35 @@ LOOP_1: UZP2 V6.8H, V3.8H, V3.8H REV64 V7.8H, V7.8H REV64 V6.8H, V6.8H - SQADD V8.4S, V8.4S, V10.4S + LD2 {V2.4H, V3.4H}, [X8], X12 SQSUB V9.4S, V12.4S, V8.4S REV64 V2.4H, V2.4H REV64 V3.4H, V3.4H - SQSHL V13.4S, V13.4S, #2 + LD1 {V4.4S}, [X1], #16 - SQSHL V9.4S, V9.4S, #2 - SSHR V13.4S, V13.4S, #16 + SUBS X5, X5, #8 - SSHR V9.4S, V9.4S, #16 - UZP1 V26.8H, V13.8H, V13.8H - UZP1 V18.8H, V9.8H, V9.8H BGT LOOP_1 - ST1 {V26.H}[0], [X11], X4 + ST1 {V13.S}[0], [X11], X4 UMULL V15.4S, V7.4H, V2.4H - ST1 {V26.H}[1], [X11], X4 + ST1 {V13.S}[1], [X11], X4 UMULL V12.4s, V1.4H, V3.4H - ST1 {V26.H}[2], [X11], X4 + ST1 {V13.S}[2], [X11], X4 USHR V15.4S, V15.4S, #16 - ST1 {V26.H}[3], [X11], X4 + ST1 {V13.S}[3], [X11], X4 USHR V12.4S, V12.4S, #16 - ST1 {V18.H}[0], [X6], X9 + ST1 {V9.S}[0], [X6], X9 SMLAL V15.4S, V6.4H, V2.4H - ST1 {V18.H}[1], [X6], X9 + ST1 {V9.S}[1], [X6], X9 SMLAL V12.4S, V0.4H, V3.4H - ST1 {V18.H}[2], [X6], X9 + ST1 {V9.S}[2], [X6], X9 SQSHL V15.4S, V15.4S, V11.4S - ST1 {V18.H}[3], [X6], X9 + ST1 {V9.S}[3], [X6], X9 SQSHL V12.4S, V12.4S, V11.4S @@ -303,28 +279,20 @@ LOOP_1: SQXTN2 V28.4S, V29.2D MOV V8.16B, V28.16B - SQADD V14.4S, V14.4S, V10.4S - SQADD V8.4S, V8.4S, V10.4S + SQSUB V13.4S, V15.4S, V14.4S SQSUB V9.4S, V12.4S, V8.4S - SQSHL V13.4S, V13.4S, #2 - SQSHL V9.4S, V9.4S, #2 - SSHR V13.4S, V13.4S, #16 - SSHR V9.4S, V9.4S, #16 - UZP1 V26.8H, V13.8H, V13.8H - - UZP1 V18.8H, V9.8H, V9.8H - ST1 {V26.H}[0], [X11], X4 - ST1 {V26.H}[1], [X11], X4 - ST1 {V26.H}[2], [X11], X4 - ST1 {V26.H}[3], [X11], X4 + ST1 {V13.S}[0], [X11], X4 + ST1 {V13.S}[1], [X11], X4 + ST1 {V13.S}[2], [X11], X4 + ST1 {V13.S}[3], [X11], X4 - ST1 {V18.H}[0], [X6], X9 - ST1 {V18.H}[1], [X6], X9 - ST1 {V18.H}[2], [X6], X9 - ST1 {V18.H}[3], [X6], X9 + ST1 {V9.S}[0], [X6], X9 + ST1 {V9.S}[1], [X6], X9 + ST1 {V9.S}[2], [X6], X9 + ST1 {V9.S}[3], [X6], X9 pop_v_regs RET diff --git a/decoder/armv8/ixheaacd_post_twiddle_overlap.s b/decoder/armv8/ixheaacd_post_twiddle_overlap.s index b8ee331..f05e6e4 100644 --- a/decoder/armv8/ixheaacd_post_twiddle_overlap.s +++ b/decoder/armv8/ixheaacd_post_twiddle_overlap.s @@ -1,43 +1,43 @@ .macro push_v_regs - stp q8, q9, [sp, #-32]! - stp q10, q11, [sp, #-32]! - stp q12, q13, [sp, #-32]! - stp q14, q15, [sp, #-32]! + stp q8, q9, [sp, #-32]! + stp q10, q11, [sp, #-32]! + stp q12, q13, [sp, #-32]! + stp q14, q15, [sp, #-32]! //st1 { v8.2d, v9.2d, v10.2d, v11.2d}, [sp, #-64]! //st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp, #-64]! - stp X8, X9, [sp, #-16]! - stp X10, X11, [sp, #-16]! - stp X12, X13, [sp, #-16]! - stp X14, X15, [sp, #-16]! - stp X16, X17, [sp, #-16]! - stp X18, X19, [sp, #-16]! - stp X20, X21, [sp, #-16]! - stp X22, X23, [sp, #-16]! - stp X24, X25, [sp, #-16]! - stp X26, X27, [sp, #-16]! - stp X28, X29, [sp, #-16]! - stp X30, X29, [sp, #-16]! + stp X8, X9, [sp, #-16]! + stp X10, X11, [sp, #-16]! + stp X12, X13, [sp, #-16]! + stp X14, X15, [sp, #-16]! + stp X16, X17, [sp, #-16]! + stp X18, X19, [sp, #-16]! + stp X20, X21, [sp, #-16]! + stp X22, X23, [sp, #-16]! + stp X24, X25, [sp, #-16]! + stp X26, X27, [sp, #-16]! + stp X28, X29, [sp, #-16]! + stp X30, X29, [sp, #-16]! .endm .macro pop_v_regs - ldp X30, X29, [sp], #16 - ldp X28, X29, [sp], #16 - ldp X26, X27, [sp], #16 - ldp X24, X25, [sp], #16 - ldp X22, X23, [sp], #16 - ldp X20, X21, [sp], #16 - ldp X18, X19, [sp], #16 - ldp X16, X17, [sp], #16 - ldp X14, X15, [sp], #16 - ldp X12, X13, [sp], #16 - ldp X10, X11, [sp], #16 - ldp X8, X9, [sp], #16 + ldp X30, X29, [sp], #16 + ldp X28, X29, [sp], #16 + ldp X26, X27, [sp], #16 + ldp X24, X25, [sp], #16 + ldp X22, X23, [sp], #16 + ldp X20, X21, [sp], #16 + ldp X18, X19, [sp], #16 + ldp X16, X17, [sp], #16 + ldp X14, X15, [sp], #16 + ldp X12, X13, [sp], #16 + ldp X10, X11, [sp], #16 + ldp X8, X9, [sp], #16 //ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64 //ld1 { v8.2d, v9.2d, v10.2d, v11.2d}, [sp], #64 - ldp q14, q15, [sp], #32 - ldp q12, q13, [sp], #32 - ldp q10, q11, [sp], #32 - ldp q8, q9, [sp], #32 + ldp q14, q15, [sp], #32 + ldp q12, q13, [sp], #32 + ldp q10, q11, [sp], #32 + ldp q8, q9, [sp], #32 .endm @@ -48,18 +48,18 @@ ixheaacd_post_twid_overlap_add_armv8: // STMFD sp!, {x4-x12} - push_v_regs - //stp x19, x20,[sp,#-16]! + push_v_regs + //stp x19, x20,[sp,#-16]! //VPUSH {d8 - d15} //LDR w4, [sp, #100] - //sxtw x4,w4 + //sxtw x4,w4 //LDR w5, [sp, #104] - //sxtw x5,w5 + //sxtw x5,w5 //LDR w6, [sp, #108] - //sxtw x6,w6 - MOV x16, x5 - MOV x17, x7 + //sxtw x6,w6 + MOV x16, x5 + MOV x17, x7 LSL x9, x3, #2 ASR x9, x9, #1 ADD x6, x6, x9 @@ -71,141 +71,141 @@ ixheaacd_post_twid_overlap_add_armv8: - movi v18.4h, #50 - sub x20, x5, #15 - neg x9, x20 - movi v20.4s, #0x80, LSL #8 - dup v16.4s, w5 + movi v18.4h, #50 + sub x20, x5, #15 + neg x9, x20 + movi v20.4s, #0x00, LSL #8 + dup v16.4s,w5 SUB x5, x5, #16 //STR w5, [sp, #116] - MOV w25, w5 - sxtw x25, w25 + MOV w25, w5 + sxtw x25,w25 MOV x8, #1 LSL x8, x8, x9 //STR w8, [sp, #120] - MOV w26, w8 + MOV w26, w8 - //sxtw x8,w8 + //sxtw x8,w8 ARM_PROLOGUE: - LDR w8, [x1], #4 - sxtw x8, w8 - LDR w9, [x1], #4 - sxtw x9, w9 + LDR w8, [x1], #4 + sxtw x8,w8 + LDR w9, [x1], #4 + sxtw x9,w9 - LDR w10, [x2], #4 - sxtw x10, w10 + LDR w10, [x2], #4 + sxtw x10,w10 - AND w19, w10, 0xFFFF - sxth x19, w19 - ASR w10, w10, #16 + AND w19,w10,0xFFFF + sxth x19,w19 + ASR w10,w10,#16 // SMULWT x11, x8, x10 // -// SMULWB x12, x9, x10 +// SMULWB x12, x9, x10 // SMULWB x5, x8, x10 // SMLAWT x7, x9, x10, x5 - SMULL x11, w8, w10 - ASR x11, x11, #16 - SMULL x12, w9, w19 - ASR x12, x12, #16 - SMULL x5, w8, w19 - ASR x5, x5, #16 - SMULL x7, w9, w10 - ASR x7, x7, #16 - ADD x7, x7, x5 - - SUB x8, x12, x11 + SMULL x11, w8, w10 + ASR x11,x11,#16 + SMULL x12, w9, w19 + ASR x12,x12,#16 + SMULL x5, w8, w19 + ASR x5,x5,#16 + SMULL x7, w9, w10 + ASR x7, x7, #16 + ADD x7, x7, x5 + + SUB x8, x12, x11 MVN x5, x7 ADD x5, x5, #1 MOV x9, #50 MOV x12, #-50 - AND w19, w9, 0xFFFF - sxth x19, w19 - SMULL x10, w5, w19 - ASR x10, x10, #16 - AND w19, w12, 0xFFFF - sxth x19, w19 - SMULL x11, w8, w19 - ASR x11, x11, #16 - - ADD x8, x8, x10 + AND w19,w9,0xFFFF + sxth x19,w19 + SMULL x10, w5, w19 + ASR x10,x10,#16 + AND w19,w12,0xFFFF + sxth x19,w19 + SMULL x11, w8, w19 + ASR x11,x11,#16 + + ADD x8, x8, x10 ADD x5, x5, x11 //LDR w11, [sp, #104] - MOV w11, w16 - sxth x11, w11 - LDR w10, [x6], #-32 - sxtw x10, w10 + MOV w11, w16 + sxth x11,w11 + LDR w10, [x6], #-32 + sxtw x10,w10 - AND w19, w10, 0xFFFF - sxth x19, w19 - ASR w20, w10, #16 + AND w19,w10,0xFFFF + sxth x19,w19 + ASR w20,w10,#16 //SMULWB x7, x8, x10 - SMULL x7, w8, w19 - ASR x7, x7, #16 - MVN x8, x8 + SMULL x7, w8, w19 + ASR x7, x7, #16 + MVN x8, x8 ADD x8, x8, #1 //SMULWT x12, x8, x10 - SMULL x12, w8, w20 - ASR x12, x12, #16 + SMULL x12, w8, w20 + ASR x12, x12, #16 CMP x11, #0 BLT NEXT - SUB x9, x11, #16 - negs x9, x9 + SUB x9, x11, #16 + negs x9,x9 - // LDR w8, [sp, #120] - //sxtw x8,w8 - MOV v1.s[0], w26 - MOV v2.s[0], w5 + // LDR w8, [sp, #120] + //sxtw x8,w8 + MOV v1.s[0], w26 + MOV v2.s[0], w5 //sQADD w5, w5, w8 //ASR w5, w5, w9 - SQADD v2.2s, v2.2s, v1.2s - MOV w5, v2.s[0] - ASR w5, w5, w9 + SQADD v2.2s, v2.2s, v1.2s + MOV w5, v2.s[0] + ASR w5, w5, w9 - SUB x9, x11, #31 - negs x9, x9 - ASR x20, x7, x9 + SUB x9, x11, #31 + negs x9,x9 + ASR x20, x7, x9 //MOV x8, x20 - ADDS x8, x20, #0 - BGE NEXT2 - CMN x8, #1 + ADDS x8, x20, #0 + BGE NEXT2 + CMN x8, #1 NEXT2: MOV x20, #0x80000000 - csel x7, x20, x7, LT + csel x7, x20, x7,LT MOV x20, #0x7fffffff - csel x7, x20, x7, GT - LSL x20, x7, x11 - csel x7, x20, x7, EQ + csel x7, x20, x7,GT + LSL x20, x7, x11 + csel x7,x20,x7,EQ - SUB x9, x11, #31 - negs x9, x9 - ASR x20, x12, x9 + SUB x9, x11, #31 + negs x9,x9 + ASR x20, x12, x9 //MOV x8, x20 - ADDS x8, x20, #0 - BGE NEXT3 - CMN x8, #1 + ADDS x8, x20, #0 + BGE NEXT3 + CMN x8, #1 NEXT3: MOV x20, #0x80000000 - csel x12, x20, x12, LT + csel x12, x20, x12,LT MOV x20, #0x7fffffff - csel x12, x20, x12, GT - LSL x20, x12, x11 - csel x12, x20, x12, EQ + csel x12, x20, x12,GT + LSL x20, x12, x11 + csel x12,x20,x12,EQ B NEXT1 NEXT: @@ -214,83 +214,83 @@ NEXT: ASR w5, w5, w11 MOV w8, #0x8000 - MOV v1.s[0], w8 - MOV v2.s[0], w5 + MOV v1.s[0], w8 + MOV v2.s[0], w5 //QADD x5, x5, x8 - SQADD v2.2s, v2.2s, v1.2s - MOV w5, v2.s[0] + SQADD v2.2s, v2.2s, v1.2s + MOV w5, v2.s[0] - ASR w5, w5, #16 + ASR w5, w5, #16 ASR w7, w7, w11 ASR w12, w12, w11 NEXT1: - LDR w9, [x4] - sxtw x9, w9 + LDR w9, [x4] + sxtw x9,w9 MOV w8, #0x8000 - //sxtw x8,w8 + //sxtw x8,w8 - STR w5, [x4], #4 - sxtw x5, w5 + STR w5, [x4], #4 + sxtw x5,w5 - ROR w20, w10, #16 + ROR w20, w10, #16 //UXTH x5, x10, ROR #16 - UXTH w5, w20 - UXTH w10, w10 + UXTH w5, w20 + UXTH w10, w10 - dup v0.2s, w9 - dup v2.2s, w10 - dup v3.2s, w5 + dup v0.2s,w9 + dup v2.2s,w10 + dup v3.2s,w5 //VZIP.32 D2, D3 - ZIP1 v28.2s, v2.2s, v3.2s - ZIP2 v3.2s, v2.2s, v3.2s - MOV v2.8b, v28.8b - sMULL v0.2d, v2.2s, v0.2s - Sqxtn v8.2s, v0.2d + ZIP1 v28.2s, v2.2s, v3.2s + ZIP2 v3.2s, v2.2s, v3.2s + MOV v2.8b, v28.8b + sMULL v0.2d, v2.2s, v0.2s + Sqxtn v8.2s, v0.2d - dup v0.2s, w12 - dup v1.2s, w7 + dup v0.2s,w12 + dup v1.2s,w7 //VZIP.32 D0, D1 - ZIP1 v28.2s, v0.2s, v1.2s - ZIP2 v1.2s, v0.2s, v1.2s - MOV v0.8b, v28.8b + ZIP1 v28.2s, v0.2s, v1.2s + ZIP2 v1.2s, v0.2s, v1.2s + MOV v0.8b, v28.8b - SQSUB v8.2s, v0.2s , v8.2s + SQSUB v8.2s, v0.2s , v8.2s - sQshL v8.2s, v8.2s, #2 - dup v0.2s, w8 - SQADD v8.2s, v8.2s , v0.2s - sshR v8.2s, v8.2s, #16 + //sQshL v8.2s, v8.2s,#2 + dup v0.2s,w8 + //SQADD v8.2s, v8.2s , v0.2s + //sshR v8.2s, v8.2s,#16 - MOV x7, x17 - //sxtw x7,w7 - LSL x10, x7, #1 + MOV x7, x17 + //sxtw x7,w7 + LSL x10, x7, #2 ASR x5, x3, #1 //SMULBB x5, x10, x5 - AND w5, w5, 0xFFFF - sxth x5, w5 - AND w19, w10, 0xFFFF - sxth x19, w19 - SMULL x5, w19, w5 + AND w5,w5,0xFFFF + sxth x5,w5 + AND w19,w10,0xFFFF + sxth x19,w19 + SMULL x5, w19, w5 ADD x5, x5, x0 SUB x0, x5, x10 MVN x9, x10 ADD x9, x9, #1 - ST1 {v8.h}[2], [x0], x9 - ST1 {v8.h}[0], [x5], x10 + ST1 {V8.S}[1],[x0], x9 + ST1 {V8.S}[0],[x5], x10 MOV x8, x1 @@ -311,1723 +311,1568 @@ PROLOGUE_NEON: ASR x3, x3, #2 SUB x3, x3, #2 - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b - ADD x1, x1, x12 + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b + ADD x1, x1, x12 //VUZP.16 D0, D1 - UZP1 v28.8h, v0.8h, v0.8h - UZP2 v29.8h, v0.8h, v0.8h - MOV v0.d[0], v28.d[0] - MOV v0.d[1], v29.d[0] + UZP1 v28.8h, v0.8h, v0.8h + UZP2 v29.8h, v0.8h, v0.8h + MOV v0.d[0], v28.d[0] + MOV v0.d[1], v29.d[0] - //VUZP.16 D2, D3 + //VUZP.16 D2, D3 - UZP1 v28.8h, v2.8h, v2.8h - UZP2 v29.8h, v2.8h, v2.8h - MOV v2.d[0], v28.d[0] - MOV v2.d[1], v29.d[0] + UZP1 v28.8h, v2.8h, v2.8h + UZP2 v29.8h, v2.8h, v2.8h + MOV v2.d[0], v28.d[0] + MOV v2.d[1], v29.d[0] //rev64 v0.8h, v0.8h - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 - - LD2 { v4.4s, v5.4s}, [x8] - MOV v6.16b, v5.16b - ADD x8, x8, #32 - uMULL v30.4s, v0.4h, v9.4h + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 + + LD2 { v4.4s, v5.4s}, [x8] + MOV v6.16b, v5.16b + ADD x8, x8,#32 + uMULL v30.4s, v0.4h, v9.4h // VUZP.16 D4, D5 - UZP1 v28.8h, v4.8h, v4.8h - UZP2 v29.8h, v4.8h, v4.8h - MOV v4.d[0], v28.d[0] - MOV v5.d[0], v29.d[0] + UZP1 v28.8h, v4.8h, v4.8h + UZP2 v29.8h, v4.8h, v4.8h + MOV v4.d[0], v28.d[0] + MOV v5.d[0], v29.d[0] - uMULL v28.4s, v2.4h, v8.4h + uMULL v28.4s, v2.4h, v8.4h // VUZP.16 D6, D7 - UZP1 v26.8h, v6.8h, v6.8h - UZP2 v27.8h, v6.8h, v6.8h - MOV v6.d[0], v26.d[0] - MOV v7.d[0], v27.d[0] + UZP1 v26.8h, v6.8h, v6.8h + UZP2 v27.8h, v6.8h, v6.8h + MOV v6.d[0], v26.d[0] + MOV v7.d[0], v27.d[0] - uMULL v26.4s, v0.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h - uMULL v24.4s, v2.4h, v9.4h + uMULL v24.4s, v2.4h, v9.4h - LD2 { v10.4s, v11.4s}, [x6] - MOV v12.16b, v11.16b - ADD x6, x6, x12 - ushR v30.4s, v30.4s, #16 + LD2 { v10.4s, v11.4s}, [x6] + MOV v12.16b, v11.16b + ADD x6, x6, x12 + ushR v30.4s, v30.4s,#16 //VUZP.16 D10, D11 - UZP1 v22.8h, v10.8h, v10.8h - UZP2 v23.8h, v10.8h, v10.8h - MOV v10.d[0], v22.d[0] - MOV v10.d[1], v23.d[0] + UZP1 v22.8h, v10.8h, v10.8h + UZP2 v23.8h, v10.8h, v10.8h + MOV v10.d[0], v22.d[0] + MOV v10.d[1], v23.d[0] - ushR v28.4s, v28.4s, #16 + ushR v28.4s, v28.4s,#16 //VUZP.16 D12, D13 - UZP1 v22.8h, v12.8h, v12.8h - UZP2 v23.8h, v12.8h, v12.8h - MOV v12.d[0], v22.d[0] - MOV v12.d[1], v23.d[0] + UZP1 v22.8h, v12.8h, v12.8h + UZP2 v23.8h, v12.8h, v12.8h + MOV v12.d[0], v22.d[0] + MOV v12.d[1], v23.d[0] - sMLAL v30.4s, v1.4h, v9.4h + sMLAL v30.4s, v1.4h, v9.4h - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - sMLAL v28.4s, v3.4h, v8.4h + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + sMLAL v28.4s, v3.4h, v8.4h - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - ushR v26.4s, v26.4s, #16 + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] + ushR v26.4s, v26.4s,#16 - ushR v24.4s, v24.4s, #16 + ushR v24.4s, v24.4s,#16 - sMLAL v26.4s, v1.4h, v8.4h - sMLAL v24.4s, v3.4h, v9.4h + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h - ADD v30.4s, v30.4s , v28.4s - NEG v30.4s, v30.4s + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s - uMULL v22.4s, v4.4h, v8.4h + uMULL v22.4s, v4.4h, v8.4h - SUB v28.4s, v24.4s , v26.4s + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - mov v24.16b, v28.16b + mov v26.16b, v30.16b + mov v24.16b, v28.16b // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s, #16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s,#16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s, #16 - ushR v0.4s, v0.4s, #16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s,#16 + ushR v0.4s, v0.4s,#16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s, #16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s, #16 - sshR v0.4s, v0.4s, #16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s,#16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s,#16 + sshR v0.4s, v0.4s,#16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v14.4s, w11 - SQADD v28.4s, v28.4s , v14.4s + //sxtw x11,w11 + MOV w11, w26 + dup v14.4s,w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] - MOV w11, w25 - //sxtw x11,w11 - dup v0.4s, w11 - sQshL v28.4s, v28.4s, v0.4s + MOV w11, w25 + //sxtw x11,w11 + dup v0.4s,w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + UZP1 v19.8h, v22.8h, v22.8h + UZP2 v21.8h, v22.8h, v22.8h + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + UZP1 v19.8h, v30.8h, v30.8h + UZP2 v21.8h, v30.8h, v30.8h + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h + uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s, #16 - ushR v26.4s, v26.4s, #16 + ushR v8.4s, v8.4s,#16 + ushR v26.4s, v26.4s,#16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s, #16 - ushR v6.4s, v6.4s, #16 + ushR v4.4s, v4.4s,#16 + ushR v6.4s, v6.4s,#16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v8.4s, w11 - SQADD v0.4s, v0.4s , v8.4s + //sxtw x11,w11 + MOV w11, w26 + dup v8.4s,w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v26.4s, w11 - sQshL v0.4s, v0.4s, v26.4s + //sxtw x11,w11 + MOV w11, w25 + dup v26.4s,w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] -// VZIP.32 Q13, Q0 + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] + // VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4], #16 - ST1 { v0.4s}, [x4], #16 + ST1 { v26.4s}, [x4],#16 + ST1 { v0.4s}, [x4],#16 - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + UZP1 v19.8h, v14.8h, v14.8h + UZP2 v21.8h, v14.8h, v14.8h + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[0] - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[0] + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h - - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b - ADD x1, x1, x12 + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h + + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b + ADD x1, x1, x12 // VUZP.16 D0, D1 - UZP1 v19.8h, v0.8h, v0.8h - UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + UZP1 v19.8h, v0.8h, v0.8h + UZP2 v21.8h, v0.8h, v0.8h + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] - ushR v8.4s, v8.4s, #16 + ushR v8.4s, v8.4s,#16 - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - ushR v30.4s, v30.4s, #16 + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + ushR v30.4s, v30.4s,#16 - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - sMLAL v8.4s, v27.4h, v11.4h + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - LD2 { v10.4s, v11.4s}, [x6] - ADD x6, x6, x12 - MOV v12.16b, v11.16b - sQshL v4.4s, v4.4s, #2 + LD2 { v10.4s, v11.4s}, [x6] + ADD x6, x6, x12 + MOV v12.16b, v11.16b -// VUZP.16 D10, D11 + UZP1 v19.8h, v10.8h, v10.8h + UZP2 v21.8h, v10.8h, v10.8h + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] - UZP1 v19.8h, v10.8h, v10.8h - UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] - sQshL v6.4s, v6.4s, #2 + UZP1 v19.8h, v12.8h, v12.8h + UZP2 v21.8h, v12.8h, v12.8h + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] + MOV V14.16B , V4.16B -// VUZP.16 D12, D13 + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] - UZP1 v19.8h, v12.8h, v12.8h - UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] - SQADD v14.4s, v4.4s , v20.4s + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - SQADD v6.4s, v6.4s , v20.4s + sQshL v8.4s, v8.4s, v16.4s - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - sshR v14.4s, v14.4s, #16 + MOV V31.16B, V6.16B + LD2 { v4.4s, v5.4s}, [x8] + ADD x8, x8,#32 -// VUZP.16 D14, D15 + MOV v6.16b, v5.16b + sQshL v30.4s, v30.4s, v16.4s + +// VUZP.16 D4, D5 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + UZP1 v19.8h, v4.8h, v4.8h + UZP2 v21.8h, v4.8h, v4.8h + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] - sshR v6.4s, v6.4s, #16 + SQSUB v8.4s, v8.4s , v24.4s // VUZP.16 D6, D7 - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] - - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + UZP1 v19.8h, v6.8h, v6.8h + UZP2 v21.8h, v6.8h, v6.8h + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - LD2 { v4.4s, v5.4s}, [x8] - ADD x8, x8, #32 - MOV v6.16b, v5.16b - sQshL v30.4s, v30.4s, v16.4s + SQSUB v22.4s, v30.4s , v22.4s -// VUZP.16 D4, D5 - UZP1 v19.8h, v4.8h, v4.8h - UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + MOV V30.16B, V8.16B - SQSUB v8.4s, v8.4s , v24.4s + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 -// VUZP.16 D6, D7 - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] +CORE_LOOP: + ST1 {V14.S}[0], [x0] + ADD x0, x0, x9 + ST1 {V22.S}[0], [x0] + ADD x0, x0, x9 - SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s, #2 + ST1 {V14.S}[1], [x0] + ADD x0, x0, x9 - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 - sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + ST1 {V22.S}[1], [x0] + ADD x0, x0, x9 - sshR v30.4s, v30.4s, #16 -// VUZP.16 D30, D31 + ST1 {V14.S}[2], [x0] + ADD x0, x0, x9 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s, #16 + ST1 {V22.S}[2], [x0] + ADD x0, x0, x9 -// VUZP.16 D22, D23 + ST1 {V14.S}[3], [x0] + ADD x0, x0, x9 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + ST1 {V22.S}[3], [x0] + ADD x0, x0, x9 - mov v23.8b, v30.8b -CORE_LOOP: - ST1 {v14.h}[0], [x0] - ADD x0, x0, x9 - uMULL v30.4s, v0.4h, v9.4h + ST1 {V31.S}[0], [x5] + ADD x5, x5, x10 - ST1 {v22.h}[0], [x0] - ADD x0, x0, x9 - uMULL v28.4s, v2.4h, v8.4h - ST1 {v14.h}[1], [x0] - ADD x0, x0, x9 - uMULL v26.4s, v0.4h, v8.4h + ST1 {V30.S}[0], [x5] + ADD x5, x5, x10 - ST1 {v22.h}[1], [x0] - ADD x0, x0, x9 - uMULL v24.4s, v2.4h, v9.4h - ST1 {v14.h}[2], [x0] - ADD x0, x0, x9 - ushR v30.4s, v30.4s, #16 + ST1 {V31.S}[1], [x5] + ADD x5, x5, x10 - ST1 {v22.h}[2], [x0] - ADD x0, x0, x9 - ushR v28.4s, v28.4s, #16 - ST1 {v14.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v30.4s, v1.4h, v9.4h + ST1 {V30.S}[1], [x5] + ADD x5, x5, x10 - ST1 {v22.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v28.4s, v3.4h, v8.4h - ST1 {v15.h}[0], [x5] - ADD x5, x5, x10 - ushR v26.4s, v26.4s, #16 + ST1 {V31.S}[2], [x5] + ADD x5, x5, x10 - ST1 {v23.h}[0], [x5] - ADD x5, x5, x10 - ushR v24.4s, v24.4s, #16 - ST1 {v15.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v26.4s, v1.4h, v8.4h + ST1 {V30.S}[2], [x5] + ADD x5, x5, x10 - ST1 {v23.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v24.4s, v3.4h, v9.4h - ST1 {v15.h}[2], [x5] - ADD x5, x5, x10 - ADD v30.4s, v30.4s , v28.4s + ST1 {V31.S}[3], [x5] + ADD x5, x5, x10 - ST1 {v23.h}[2], [x5] - ADD x5, x5, x10 - NEG v30.4s, v30.4s + ST1 {V30.S}[3], [x5] + ADD x5, x5, x10 - ST1 {v15.h}[3], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[3], [x5] - ADD x5, x5, x10 - SUB v28.4s, v24.4s , v26.4s + uMULL v30.4s, v0.4h, v9.4h + uMULL v28.4s, v2.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h + uMULL v24.4s, v2.4h, v9.4h + ushR v30.4s, v30.4s,#16 + ushR v28.4s, v28.4s,#16 + sMLAL v30.4s, v1.4h, v9.4h + sMLAL v28.4s, v3.4h, v8.4h + ushR v26.4s, v26.4s,#16 + ushR v24.4s, v24.4s,#16 + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s + SUB v28.4s, v24.4s , v26.4s + mov v26.16b, v30.16b + uMULL v22.4s, v4.4h, v8.4h - mov v26.16b, v30.16b - uMULL v22.4s, v4.4h, v8.4h - - mov v24.16b, v28.16b + mov v24.16b, v28.16b // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s, #16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s,#16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s, #16 - ushR v0.4s, v0.4s, #16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s,#16 + ushR v0.4s, v0.4s,#16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s, #16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s, #16 - sshR v0.4s, v0.4s, #16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s,#16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s,#16 + sshR v0.4s, v0.4s,#16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s + ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v14.4s, w11 - SQADD v28.4s, v28.4s , v14.4s + //sxtw x11,w11 + MOV w11, w26 + dup v14.4s,w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v0.4s, w11 - sQshL v28.4s, v28.4s, v0.4s + //sxtw x11,w11 + MOV w11, w25 + dup v0.4s,w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + UZP1 v19.8h, v22.8h, v22.8h + UZP2 v21.8h, v22.8h, v22.8h + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + UZP1 v19.8h, v30.8h, v30.8h + UZP2 v21.8h, v30.8h, v30.8h + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s, #16 - ushR v26.4s, v26.4s, #16 + ushR v8.4s, v8.4s,#16 + ushR v26.4s, v26.4s,#16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s, #16 - ushR v6.4s, v6.4s, #16 + ushR v4.4s, v4.4s,#16 + ushR v6.4s, v6.4s,#16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v8.4s, w11 - SQADD v0.4s, v0.4s , v8.4s + //sxtw x11,w11 + MOV w11, w26 + dup v8.4s,w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v26.4s, w11 - sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b - - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] + //sxtw x11,w11 + MOV w11, w25 + dup v26.4s,w11 + sQshL v0.4s, v0.4s, v26.4s + mov v26.16b, v28.16b + + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] // VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4] - ADD x4, x4, #16 - ST1 { v0.4s}, [x4] - ADD x4, x4, #16 + ST1 { v26.4s}, [x4] + ADD x4, x4,#16 + ST1 { v0.4s}, [x4] + ADD x4, x4,#16 - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] - - movi v1.2s, #0 - //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] + + movi v1.2s, #0 + //VADDL.S16 Q0, D10, D1 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h + SADDL v0.4s, v11.4h, v1.4h - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] // VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + UZP1 v19.8h, v14.8h, v14.8h + UZP2 v21.8h, v14.8h, v14.8h + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b - ADD X1, X1, x12 + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b + ADD X1, X1, x12 // VUZP.16 D0, D1 - UZP1 v19.8h, v0.8h, v0.8h - UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + UZP1 v19.8h, v0.8h, v0.8h + UZP2 v21.8h, v0.8h, v0.8h + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] + + ushR v8.4s, v8.4s,#16 - ushR v8.4s, v8.4s, #16 + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + ushR v30.4s, v30.4s,#16 - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - ushR v30.4s, v30.4s, #16 + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + sMLAL v8.4s, v27.4h, v11.4h - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - sMLAL v8.4s, v27.4h, v11.4h + sMLAL v30.4s, v15.4h, v10.4h - sMLAL v30.4s, v15.4h, v10.4h + LD2 { v10.4s, v11.4s}, [x6] + add X6, x6, x12 + MOV v12.16b, v11.16b - LD2 { v10.4s, v11.4s}, [x6] - add X6, x6, x12 - MOV v12.16b, v11.16b - sQshL v4.4s, v4.4s, #2 //VUZP.16 D10, D11 - UZP1 v19.8h, v10.8h, v10.8h - UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] + UZP1 v19.8h, v10.8h, v10.8h + UZP2 v21.8h, v10.8h, v10.8h + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] + - sQshL v6.4s, v6.4s, #2 // VUZP.16 D12, D13 - UZP1 v19.8h, v12.8h, v12.8h - UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] + UZP1 v19.8h, v12.8h, v12.8h + UZP2 v21.8h, v12.8h, v12.8h + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] - SQADD v14.4s, v4.4s , v20.4s - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - SQADD v6.4s, v6.4s , v20.4s + MOV V14.16B, V4.16B - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - sshR v14.4s, v14.4s, #16 + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] -// VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] + sQshL v8.4s, v8.4s, v16.4s - sshR v6.4s, v6.4s, #16 + LD2 { v4.4s, v5.4s}, [x8] + ADD x8, x8, #32 -// VUZP.16 D6, D7 + MOV V31.16B, V6.16B + MOV v6.16b, v5.16b - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + sQshL v30.4s, v30.4s, v16.4s - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + UZP1 v19.8h, v4.8h, v4.8h + UZP2 v21.8h, v4.8h, v4.8h + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] - LD2 { v4.4s, v5.4s}, [x8] - ADD x8, x8, #32 - MOV v6.16b, v5.16b - sQshL v30.4s, v30.4s, v16.4s + SQSUB v8.4s, v8.4s , v24.4s -// VUZP.16 D4, D5 +// VUZP.16 D6, D7 - UZP1 v19.8h, v4.8h, v4.8h - UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + UZP1 v19.8h, v6.8h, v6.8h + UZP2 v21.8h, v6.8h, v6.8h + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] + SQSUB v22.4s, v30.4s , v22.4s - SQSUB v8.4s, v8.4s , v24.4s + MOV V30.16B , V8.16B -// VUZP.16 D6, D7 + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2,#16 - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] - SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s, #2 + SUBS x3, x3, #1 + BNE CORE_LOOP - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 - sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s - sshR v30.4s, v30.4s, #16 -// VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] +EPILOGUE: + ST1 {V14.S}[0],[x0] + ADD x0, x0, x9 - sshR v22.4s, v22.4s, #16 + ST1 {V22.S}[0],[x0] + ADD x0, x0, x9 -// VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + ST1 {V14.S}[1],[x0] + ADD x0, x0, x9 - mov v23.8b, v30.8b - SUBS x3, x3, #1 - BNE CORE_LOOP + ST1 {V22.S}[1],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[2],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[2],[x0] + ADD x0, x0, x9 + + + ST1 {V14.S}[3],[x0] + ADD x0, x0, x9 -EPILOGUE: - ST1 {v14.h}[0], [x0] - ADD x0, x0, x9 - uMULL v30.4s, v0.4h, v9.4h + ST1 {V22.S}[3],[x0] + ADD x0, x0, x9 - ST1 {v22.h}[0], [x0] - ADD x0, x0, x9 - uMULL v28.4s, v2.4h, v8.4h - ST1 {v14.h}[1], [x0] - ADD x0, x0, x9 - uMULL v26.4s, v0.4h, v8.4h + ST1 {V31.S}[0],[x5] + ADD x5, x5, x10 - ST1 {v22.h}[1], [x0] - ADD x0, x0, x9 - uMULL v24.4s, v2.4h, v9.4h - ST1 {v14.h}[2], [x0] - ADD x0, x0, x9 - ushR v30.4s, v30.4s, #16 + ST1 {V30.S}[0],[x5] + ADD x5, x5, x10 - ST1 {v22.h}[2], [x0] - ADD x0, x0, x9 - ushR v28.4s, v28.4s, #16 - ST1 {v14.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v30.4s, v1.4h, v9.4h + ST1 {V31.S}[1],[x5] + ADD x5, x5, x10 - ST1 {v22.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v28.4s, v3.4h, v8.4h - ST1 {v15.h}[0], [x5] - ADD x5, x5, x10 - ushR v26.4s, v26.4s, #16 + ST1 {V30.S}[1],[x5] + ADD x5, x5, x10 - ST1 {v23.h}[0], [x5] - ADD x5, x5, x10 - ushR v24.4s, v24.4s, #16 - ST1 {v15.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v26.4s, v1.4h, v8.4h + ST1 {V31.S}[2],[x5] + ADD x5, x5, x10 - ST1 {v23.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v24.4s, v3.4h, v9.4h - ST1 {v15.h}[2], [x5] - ADD x5, x5, x10 - ADD v30.4s, v30.4s , v28.4s + ST1 {V30.S}[2],[x5] + ADD x5, x5, x10 - ST1 {v23.h}[2], [x5] - ADD x5, x5, x10 - NEG v30.4s, v30.4s - ST1 {v15.h}[3], [x5] - ADD x5, x5, x10 + ST1 {V31.S}[3],[x5] + ADD x5, x5, x10 - ST1 {v23.h}[3], [x5] - ADD x5, x5, x10 - SUB v28.4s, v24.4s , v26.4s + ST1 {V30.S}[3],[x5] + ADD x5, x5, x10 - uMULL v22.4s, v4.4h, v8.4h - mov v26.16b, v30.16b - mov v24.16b, v28.16b + uMULL v30.4s, v0.4h, v9.4h + uMULL v28.4s, v2.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h + uMULL v24.4s, v2.4h, v9.4h + ushR v30.4s, v30.4s,#16 + ushR v28.4s, v28.4s,#16 + sMLAL v30.4s, v1.4h, v9.4h + sMLAL v28.4s, v3.4h, v8.4h + ushR v26.4s, v26.4s,#16 + ushR v24.4s, v24.4s,#16 + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - mov v24.16b, v28.16b + + uMULL v22.4s, v4.4h, v8.4h + mov v26.16b, v30.16b + mov v24.16b, v28.16b + + mov v26.16b, v30.16b + mov v24.16b, v28.16b //VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s, #16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s,#16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s, #16 - ushR v0.4s, v0.4s, #16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s,#16 + ushR v0.4s, v0.4s,#16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s, #16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s, #16 - sshR v0.4s, v0.4s, #16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s,#16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s,#16 + sshR v0.4s, v0.4s,#16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v14.4s, w11 - SQADD v28.4s, v28.4s , v14.4s + //sxtw x11,w11 + MOV w11, w26 + dup v14.4s,w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v0.4s, w11 - sQshL v28.4s, v28.4s, v0.4s + //sxtw x11,w11 + MOV w11, w25 + dup v0.4s,w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + UZP1 v19.8h, v22.8h, v22.8h + UZP2 v21.8h, v22.8h, v22.8h + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + UZP1 v19.8h, v30.8h, v30.8h + UZP2 v21.8h, v30.8h, v30.8h + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s, #16 - ushR v26.4s, v26.4s, #16 + ushR v8.4s, v8.4s,#16 + ushR v26.4s, v26.4s,#16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s, #16 - ushR v6.4s, v6.4s, #16 + ushR v4.4s, v4.4s,#16 + ushR v6.4s, v6.4s,#16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v8.4s, w11 - SQADD v0.4s, v0.4s , v8.4s + //sxtw x11,w11 + MOV w11, w26 + dup v8.4s,w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v26.4s, w11 - sQshL v0.4s, v0.4s, v26.4s + //sxtw x11,w11 + MOV w11, w25 + dup v26.4s,w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] // VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4], #16 - ST1 { v0.4s}, [x4], #16 + ST1 { v26.4s}, [x4],#16 + ST1 { v0.4s}, [x4],#16 - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + UZP1 v19.8h, v14.8h, v14.8h + UZP2 v21.8h, v14.8h, v14.8h + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] -// VUZP.16 D26, D27 + // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] - - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h - - ushR v8.4s, v8.4s, #16 - - ushR v30.4s, v30.4s, #16 - - sMLAL v8.4s, v27.4h, v11.4h - - sMLAL v30.4s, v15.4h, v10.4h - - sQshL v4.4s, v4.4s, #2 - - sQshL v6.4s, v6.4s, #2 - - SQADD v14.4s, v4.4s , v20.4s + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] - SQADD v6.4s, v6.4s , v20.4s + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] - sshR v14.4s, v14.4s, #16 + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h -// VUZP.16 D14, D15 - - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + ushR v8.4s, v8.4s,#16 - sshR v6.4s, v6.4s, #16 + ushR v30.4s, v30.4s,#16 -// VUZP.16 D6, D7 + sMLAL v8.4s, v27.4h, v11.4h - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + sMLAL v30.4s, v15.4h, v10.4h - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s - sQshL v30.4s, v30.4s, v16.4s + MOV V14.16B, V4.16B - SQSUB v8.4s, v8.4s , v24.4s - SQSUB v22.4s, v30.4s , v22.4s + sQshL v8.4s, v8.4s, v16.4s - sQshL v30.4s, v8.4s, #2 + sQshL v30.4s, v30.4s, v16.4s - sQshL v22.4s, v22.4s, #2 + SQSUB v8.4s, v8.4s , v24.4s - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + SQSUB v22.4s, v30.4s , v22.4s - sshR v30.4s, v30.4s, #16 + MOV V30.16B , V8.16B - //VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s, #16 -// VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] - - mov v23.8b, v30.8b - - - - - ST1 {v14.h}[0], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[0], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[1], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[1], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[2], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[2], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[3], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[3], [x0] - ADD x0, x0, x9 - ST1 {v15.h}[0], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[0], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[1], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[1], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[2], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[2], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[3], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[3], [x5] - ADD x5, x5, x10 + ST1 {V14.S}[0],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[0],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[1],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[1],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[2],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[2],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[3],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[3],[x0] + ADD x0, x0, x9 + ST1 {V6.S}[0],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[0],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[1],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[1],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[2],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[2],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[3],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[3],[x5] + ADD x5, x5, x10 ARM_EPILOGUE: ARM_LOOP: - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b //VUZP.16 D0, D1 - UZP1 v19.8h, v0.8h, v0.8h - UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + UZP1 v19.8h, v0.8h, v0.8h + UZP2 v21.8h, v0.8h, v0.8h + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] - //VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + //VUZP.16 D2, D3 + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2,#16 - LD2 {v4.2s, v5.2s}, [x8] - ADD x8, x8, #16 - MOV v6.16b, v5.16b - movi v5.2s, #0x00000000 - movi v7.2s, #0x00000000 + LD2 {v4.2s, v5.2s}, [x8] + ADD x8, x8,#16 + MOV v6.16b, v5.16b + movi v5.2s, #0x00000000 + movi v7.2s, #0x00000000 - LD1 {v5.s}[0], [x8], #4 - LD1 {v7.s}[0], [x8] + LD1 {v5.s}[0],[x8],#4 + LD1 {v7.s}[0],[x8] MOV x12, #16 - MOV v4.d[1], v5.d[0] - MOV v6.d[1], v7.d[0] + MOV v4.d[1], v5.d[0] + MOV v6.d[1], v7.d[0] // VUZP.16 D4, D5 - UZP1 v19.8h, v4.8h, v4.8h - UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + UZP1 v19.8h, v4.8h, v4.8h + UZP2 v21.8h, v4.8h, v4.8h + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] // VUZP.16 D6, D7 - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + UZP1 v19.8h, v6.8h, v6.8h + UZP2 v21.8h, v6.8h, v6.8h + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] ADD x6, x6, #16 MOV x12, #-4 - LD2 {v11.2s, v12.2s}, [x6] - ADD x6, x6, x12 - MOV v13.16b, v12.16b + LD2 {v11.2s, v12.2s}, [x6] + ADD x6, x6, x12 + MOV v13.16b, v12.16b - movi v10.2s, #0x00000000 + movi v10.2s, #0x00000000 - LD1 {v12.s}[1], [x6] - ADD x6, x6, x12 - LD1 {v10.s}[1], [x6] - ADD x6, x6, x12 - LD1 {v12.s}[0], [x6] - ADD x6, x6, x12 + LD1 {v12.s}[1],[x6] + ADD x6, x6, x12 + LD1 {v10.s}[1],[x6] + ADD x6, x6, x12 + LD1 {v12.s}[0],[x6] + ADD x6, x6, x12 - MOV v10.d[1], v11.d[0] - MOV v12.d[1], v13.d[0] + MOV v10.d[1], v11.d[0] + MOV v12.d[1], v13.d[0] //VUZP.16 D10, D11 - UZP1 v19.8h, v10.8h, v10.8h - UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] + UZP1 v19.8h, v10.8h, v10.8h + UZP2 v21.8h, v10.8h, v10.8h + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] - //VUZP.16 D12, D13 + //VUZP.16 D12, D13 - UZP1 v19.8h, v12.8h, v12.8h - UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] + UZP1 v19.8h, v12.8h, v12.8h + UZP2 v21.8h, v12.8h, v12.8h + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] - uMULL v30.4s, v0.4h, v9.4h - uMULL v28.4s, v2.4h, v8.4h - uMULL v26.4s, v0.4h, v8.4h - uMULL v24.4s, v2.4h, v9.4h + uMULL v30.4s, v0.4h, v9.4h + uMULL v28.4s, v2.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h + uMULL v24.4s, v2.4h, v9.4h - ushR v30.4s, v30.4s, #16 - ushR v28.4s, v28.4s, #16 + ushR v30.4s, v30.4s,#16 + ushR v28.4s, v28.4s,#16 - sMLAL v30.4s, v1.4h, v9.4h - sMLAL v28.4s, v3.4h, v8.4h + sMLAL v30.4s, v1.4h, v9.4h + sMLAL v28.4s, v3.4h, v8.4h - ushR v26.4s, v26.4s, #16 - ushR v24.4s, v24.4s, #16 + ushR v26.4s, v26.4s,#16 + ushR v24.4s, v24.4s,#16 - sMLAL v26.4s, v1.4h, v8.4h - sMLAL v24.4s, v3.4h, v9.4h + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h - ADD v30.4s, v30.4s , v28.4s - NEG v30.4s, v30.4s + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s - uMULL v22.4s, v4.4h, v8.4h + uMULL v22.4s, v4.4h, v8.4h - SUB v28.4s, v24.4s , v26.4s + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - mov v24.16b, v28.16b + mov v26.16b, v30.16b + mov v24.16b, v28.16b // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] //VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s, #16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s,#16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s, #16 - ushR v0.4s, v0.4s, #16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s,#16 + ushR v0.4s, v0.4s,#16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s, #16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s, #16 - sshR v0.4s, v0.4s, #16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s,#16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s,#16 + sshR v0.4s, v0.4s,#16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v14.4s, w11 - SQADD v28.4s, v28.4s , v14.4s + //sxtw x11,w11 + MOV w11, w26 + dup v14.4s,w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v0.4s, w11 - sQshL v28.4s, v28.4s, v0.4s + //sxtw x11,w11 + MOV w11, w25 + dup v0.4s,w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + UZP1 v19.8h, v22.8h, v22.8h + UZP2 v21.8h, v22.8h, v22.8h + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] -// VUZP.16 D24, D25 + // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h - UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + UZP1 v19.8h, v24.8h, v24.8h + UZP2 v21.8h, v24.8h, v24.8h + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + UZP1 v19.8h, v30.8h, v30.8h + UZP2 v21.8h, v30.8h, v30.8h + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 - UZP1 v19.8h, v2.8h, v2.8h - UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + UZP1 v19.8h, v2.8h, v2.8h + UZP2 v21.8h, v2.8h, v2.8h + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s, #16 - ushR v26.4s, v26.4s, #16 + ushR v8.4s, v8.4s,#16 + ushR v26.4s, v26.4s,#16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s, #16 - ushR v6.4s, v6.4s, #16 + ushR v4.4s, v4.4s,#16 + ushR v6.4s, v6.4s,#16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] - //sxtw x11,w11 - MOV w11, w26 - dup v8.4s, w11 - SQADD v0.4s, v0.4s , v8.4s + //sxtw x11,w11 + MOV w11, w26 + dup v8.4s,w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] - //sxtw x11,w11 - MOV w11, w25 - dup v26.4s, w11 - sQshL v0.4s, v0.4s, v26.4s + //sxtw x11,w11 + MOV w11, w25 + dup v26.4s,w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b MOV x6, x4 - LD1 {v28.2s, v29.2s}, [x4], #16 - movi v19.2s, #0x00000000 - LD1 {v30.s}[0], [x4], #4 - LD1 {v30.s}[1], [x4], #4 - LD1 {v19.s}[0], [x4], #4 + LD1 {v28.2s, v29.2s}, [x4],#16 + movi v19.2s, #0x00000000 + LD1 {v30.s}[0],[x4],#4 + LD1 {v30.s}[1],[x4],#4 + LD1 {v19.s}[0],[x4],#4 - MOV v28.d[1], v29.d[0] - MOV v30.d[1], v19.d[0] + MOV v28.d[1], v29.d[0] + MOV v30.d[1], v19.d[0] //VUZP.32 Q14, Q15 - UZP1 v19.4s, v28.4s, v30.4s - UZP2 v30.4s, v28.4s, v30.4s - MOV v28.16b, v19.16b - MOV v29.d[0], v28.d[1] + UZP1 v19.4s, v28.4s, v30.4s + UZP2 v30.4s, v28.4s, v30.4s + MOV v28.16b, v19.16b + MOV v29.d[0], v28.d[1] - ST1 {v26.s}[0], [x6], #4 - ST1 {v0.s}[0], [x6], #4 - ST1 {v26.s}[1], [x6], #4 - ST1 {v0.s}[1], [x6], #4 - ST1 {v26.s}[2], [x6], #4 - ST1 {v0.s}[2], [x6], #4 - ST1 {v26.s}[3], [x6], #4 + ST1 {v26.s}[0],[x6],#4 + ST1 {v0.s}[0],[x6],#4 + ST1 {v26.s}[1],[x6],#4 + ST1 {v0.s}[1],[x6],#4 + ST1 {v26.s}[2],[x6],#4 + ST1 {v0.s}[2],[x6],#4 + ST1 {v26.s}[3],[x6],#4 - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s //VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + UZP1 v19.8h, v14.8h, v14.8h + UZP2 v21.8h, v14.8h, v14.8h + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] -// VUZP.16 D26, D27 +// VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h - UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + UZP1 v19.8h, v26.8h, v26.8h + UZP2 v21.8h, v26.8h, v26.8h + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h - ushR v8.4s, v8.4s, #16 + ushR v8.4s, v8.4s,#16 - ushR v30.4s, v30.4s, #16 + ushR v30.4s, v30.4s,#16 - sMLAL v8.4s, v27.4h, v11.4h + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - sQshL v4.4s, v4.4s, #2 + MOV V14.16B , V4.16B - sQshL v6.4s, v6.4s, #2 + //mov v15.8b, v6.8b + sQshL v8.4s, v8.4s, v16.4s - SQADD v14.4s, v4.4s , v20.4s + sQshL v30.4s, v30.4s, v16.4s - SQADD v6.4s, v6.4s , v20.4s + SQSUB v8.4s, v8.4s , v24.4s - sshR v14.4s, v14.4s, #16 - -// VUZP.16 D14, D15 + SQSUB v22.4s, v30.4s , v22.4s - UZP1 v19.8h, v14.8h, v14.8h - UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV V30.16B, V8.16B - sshR v6.4s, v6.4s, #16 - //VUZP.16 D6, D7 - UZP1 v19.8h, v6.8h, v6.8h - UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s - sQshL v30.4s, v30.4s, v16.4s - SQSUB v8.4s, v8.4s , v24.4s - SQSUB v22.4s, v30.4s , v22.4s + ST1 {V14.S}[0],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[0],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[1],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[1],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[2],[x0] + ADD x0, x0, x9 + ST1 {V22.S}[2],[x0] + ADD x0, x0, x9 + ST1 {V14.S}[3],[x0] + ADD x0, x0, x9 - sQshL v30.4s, v8.4s, #2 + ST1 {V6.S}[0],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[0],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[1],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[1],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[2],[x5] + ADD x5, x5, x10 + ST1 {V30.S}[2],[x5] + ADD x5, x5, x10 + ST1 {V6.S}[3],[x5] + ADD x5, x5, x10 - sQshL v22.4s, v22.4s, #2 + pop_v_regs + ret - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s - - sshR v30.4s, v30.4s, #16 - -// VUZP.16 D30, D31 - - UZP1 v19.8h, v30.8h, v30.8h - UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] - - sshR v22.4s, v22.4s, #16 - -// VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h - UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] - - mov v23.8b, v30.8b - - - - - ST1 {v14.h}[0], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[0], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[1], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[1], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[2], [x0] - ADD x0, x0, x9 - ST1 {v22.h}[2], [x0] - ADD x0, x0, x9 - ST1 {v14.h}[3], [x0] - ADD x0, x0, x9 - - ST1 {v15.h}[0], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[0], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[1], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[1], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[2], [x5] - ADD x5, x5, x10 - ST1 {v23.h}[2], [x5] - ADD x5, x5, x10 - ST1 {v15.h}[3], [x5] - ADD x5, x5, x10 - - // VPOP {d8 - d15} - // LDMFD sp!, {x4-x12} - //ldp x19, x20,[sp],#16 - pop_v_regs - ret - //BX x14 diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c index 62df69b..7121a71 100644 --- a/decoder/drc_src/impd_drc_api.c +++ b/decoder/drc_src/impd_drc_api.c @@ -19,7 +19,6 @@ */ #include <string.h> #include <stdlib.h> - #include "impd_type_def.h" #include "impd_error_standards.h" #include "impd_apicmd_standards.h" @@ -108,6 +107,8 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, pUWORD32 pus_value = pv_value; pWORD8 pb_value = pv_value; SIZE_T *ps_value = pv_value; + pWORD32 pi_value = pv_value; + float *pf_value = pv_value; switch (i_cmd) { case IA_API_CMD_GET_MEM_INFO_SIZE: @@ -269,6 +270,15 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output; break; } + case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { + *pi_value = p_obj_drc->str_payload.pstr_loudness_info->loudness_info + ->loudness_measure->method_val; + if (*pi_value < -1) + *pi_value = *pi_value * -4; + else + *pi_value = -1; + break; + } } break; } @@ -335,7 +345,18 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, p_obj_drc->str_config.loud_norm_flag = *pus_value; break; } - + case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: { + p_obj_drc->str_config.album_mode = *pus_value; + break; + } + case IA_DRC_DEC_CONFIG_DRC_BOOST: { + p_obj_drc->str_config.boost = (*pf_value); + break; + } + case IA_DRC_DEC_CONFIG_DRC_COMPRESS: { + p_obj_drc->str_config.compress = (*pf_value); + break; + } default: { return -1; } } break; diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h index 6c2734a..265a82f 100644 --- a/decoder/drc_src/impd_drc_api_struct_def.h +++ b/decoder/drc_src/impd_drc_api_struct_def.h @@ -55,6 +55,9 @@ typedef struct ia_drc_config_struct { WORD32 effect_type; WORD32 target_loudness; WORD32 loud_norm_flag; + WORD32 album_mode; + FLOAT32 boost; + FLOAT32 compress; } ia_drc_config_struct; diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h index e83385a..13a79ec 100644 --- a/decoder/drc_src/impd_drc_config_params.h +++ b/decoder/drc_src/impd_drc_config_params.h @@ -41,4 +41,7 @@ #define IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE 0x0011 #define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012 #define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013 +#define IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE 0x0014 +#define IA_DRC_DEC_CONFIG_DRC_BOOST 0x0015 +#define IA_DRC_DEC_CONFIG_DRC_COMPRESS 0x0016 #endif diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index 6a41fc0..fa8578e 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -59,7 +59,8 @@ impd_drc_dec_interface_process(ia_bit_buf_struct *it_bit_buff, WORD32 impd_drc_dec_interface_add_effect_type( ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type, - WORD32 target_loudness, WORD32 loud_norm); + WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, + FLOAT32 compress); #define BITSTREAM_FILE_FORMAT_SPLIT 1 #define LIM_DEFAULT_THRESHOLD (0.89125094f) @@ -111,6 +112,7 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_config.effect_type = 0; p_obj_drc->str_config.target_loudness = -24; p_obj_drc->str_config.loud_norm_flag = 0; + p_obj_drc->str_config.album_mode = 0; memset(&p_obj_drc->str_bit_handler, 0, sizeof(p_obj_drc->str_bit_handler)); return IA_NO_ERROR; @@ -411,7 +413,8 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { err_code = impd_drc_dec_interface_add_effect_type( p_obj_drc->str_payload.pstr_drc_interface, p_obj_drc->str_config.effect_type, p_obj_drc->str_config.target_loudness, - p_obj_drc->str_config.loud_norm_flag); + p_obj_drc->str_config.loud_norm_flag, p_obj_drc->str_config.album_mode, + p_obj_drc->str_config.boost, p_obj_drc->str_config.compress); if (err_code != IA_NO_ERROR) return err_code; @@ -454,6 +457,16 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info); if (err_code != IA_NO_ERROR) return err_code; + if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info + ->anchor_loudness_present) + p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params + .loudness_measurement_method = METHOD_DEFINITION_ANCHOR_LOUDNESS; + + if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info + ->expert_loudness_present) + p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params + .loudness_measurement_system = USER_MEASUREMENT_SYSTEM_EXPERT_PANEL; + err_code = impd_drc_uni_sel_proc_process( p_obj_drc->str_payload.pstr_selection_proc, p_obj_drc->str_payload.pstr_drc_config, diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c index 4e0301c..557ea2f 100644 --- a/decoder/drc_src/impd_drc_interface_decoder.c +++ b/decoder/drc_src/impd_drc_interface_decoder.c @@ -23,7 +23,6 @@ #include <assert.h> #include <string.h> #include "impd_type_def.h" - #include "impd_drc_bitbuffer.h" #include "impd_drc_common.h" #include "impd_drc_interface.h" @@ -32,7 +31,8 @@ WORD32 impd_drc_dec_interface_add_effect_type( ia_drc_interface_struct* pstr_drc_interface, WORD32 drc_effect_type, - WORD32 target_loudness, WORD32 loud_norm) { + WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, + FLOAT32 compress) { WORD32 err = 0; WORD32 i = 0; @@ -67,7 +67,7 @@ impd_drc_dec_interface_add_effect_type( (FLOAT32)target_loudness; pstr_drc_interface->loudness_norm_parameter_interface_flag = 1; - pstr_drc_interface->loudness_norm_param_interface.album_mode = 0; + pstr_drc_interface->loudness_norm_param_interface.album_mode = album_mode; pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0; pstr_drc_interface->loudness_norm_param_interface .change_loudness_deviation_max = 1; @@ -138,8 +138,8 @@ impd_drc_dec_interface_add_effect_type( pstr_drc_interface->drc_parameter_interface_flag = 1; pstr_drc_interface->drc_parameter_interface.change_compress = 1; pstr_drc_interface->drc_parameter_interface.change_boost = 1; - pstr_drc_interface->drc_parameter_interface.compress = 1.0f; - pstr_drc_interface->drc_parameter_interface.boost = 1.0f; + pstr_drc_interface->drc_parameter_interface.compress = compress; + pstr_drc_interface->drc_parameter_interface.boost = boost; pstr_drc_interface->drc_parameter_interface .change_drc_characteristic_target = 1; pstr_drc_interface->drc_parameter_interface.drc_characteristic_target = 0; diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c index e389c24..3ad9562 100644 --- a/decoder/drc_src/impd_drc_static_payload.c +++ b/decoder/drc_src/impd_drc_static_payload.c @@ -2477,6 +2477,15 @@ impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, for (i = 0; i < loudness_info->measurement_count; i++) { err = impd_parse_loudness_measure(it_bit_buff, &(loudness_info->loudness_measure[i])); + + if (loudness_info->loudness_measure[i].method_def == + METHOD_DEFINITION_ANCHOR_LOUDNESS) + loudness_info->anchor_loudness_present = 1; + + if (loudness_info->loudness_measure[i].measurement_system == + MEASUREMENT_SYSTEM_EXPERT_PANEL) + loudness_info->expert_loudness_present = 1; + if (err) return (err); } diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h index 16e2191..5aa7e30 100644 --- a/decoder/drc_src/impd_drc_struct.h +++ b/decoder/drc_src/impd_drc_struct.h @@ -444,6 +444,8 @@ typedef struct { WORD32 true_peak_level_measurement_system; /* Parsed but unused */ WORD32 true_peak_level_reliability; /* Parsed but unused */ WORD32 measurement_count; + WORD32 anchor_loudness_present; + WORD32 expert_loudness_present; ia_loudness_measure_struct loudness_measure[MEASUREMENT_COUNT_MAX]; } ia_loudness_info_struct; diff --git a/decoder/generic/ixheaacd_function_selector_generic.c b/decoder/generic/ixheaacd_function_selector_generic.c index b6c34a5..9354159 100644 --- a/decoder/generic/ixheaacd_function_selector_generic.c +++ b/decoder/generic/ixheaacd_function_selector_generic.c @@ -194,18 +194,6 @@ VOID(*ixheaacd_complex_fft_p2) (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec; -VOID(*ixheaacd_mps_complex_fft_64) -(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, - WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; - -VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; - -VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; - VOID(*ixheaacd_calc_pre_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec; @@ -214,14 +202,10 @@ VOID(*ixheaacd_calc_post_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; -VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; VOID(*ixheaacd_mps_synt_out_calc) -(WORD32 resolution, WORD32 *out, WORD32 *state, - const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; +(WORD32 resolution, FLOAT32 *out, FLOAT32 *state, + const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; VOID(*ixheaacd_fft_15_ld) (WORD32 *inp, WORD32 *op, WORD32 *fft3out, diff --git a/decoder/ixheaacd_aac_imdct.c b/decoder/ixheaacd_aac_imdct.c index 43f2025..6b158de 100644 --- a/decoder/ixheaacd_aac_imdct.c +++ b/decoder/ixheaacd_aac_imdct.c @@ -467,14 +467,14 @@ VOID ixheaacd_post_twiddle_dec(WORD32 out_ptr[], WORD32 spec_data[], } VOID ixheaacd_post_twid_overlap_add_dec( - WORD16 pcm_out[], WORD32 spec_data[], + WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) { WORD i; WORD16 cos, cos1, sin, sin1; WORD32 size = npoints / 2; - WORD16 *pcmout1 = pcm_out + (ch_fac * size); + WORD32 *pcmout1 = pcm_out + (ch_fac * size); const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256; pcm_out = pcmout1 - ch_fac; @@ -511,7 +511,7 @@ VOID ixheaacd_post_twid_overlap_add_dec( ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( @@ -520,7 +520,7 @@ VOID ixheaacd_post_twid_overlap_add_dec( q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1))); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcmout1 = accu; pcmout1 += ch_fac; @@ -550,14 +550,16 @@ VOID ixheaacd_post_twid_overlap_add_dec( accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1)); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcmout1 = accu; pcmout1 += ch_fac; tempr = *(spec_data - i); @@ -585,14 +587,15 @@ VOID ixheaacd_post_twid_overlap_add_dec( accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1))); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcmout1 = accu; pcmout1 += ch_fac; } cos1 = *cos_sin_ptr++; @@ -620,14 +623,16 @@ VOID ixheaacd_post_twid_overlap_add_dec( accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( ixheaacd_shl32_sat( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1)); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcmout1 = accu; pcmout1 += ch_fac; } else { q_shift = -q_shift; @@ -663,7 +668,7 @@ VOID ixheaacd_post_twid_overlap_add_dec( ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( @@ -672,7 +677,7 @@ VOID ixheaacd_post_twid_overlap_add_dec( q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1))); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcmout1 = accu; pcmout1 += ch_fac; for (i = size - 2; i != 0;) { @@ -701,14 +706,16 @@ VOID ixheaacd_post_twid_overlap_add_dec( ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcm_out = accu; pcm_out -= ch_fac; + accu = ixheaacd_sub32_sat( ixheaacd_shr32( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1)); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + + *pcmout1 = accu; pcmout1 += ch_fac; tempr = *(spec_data - i); @@ -735,15 +742,16 @@ VOID ixheaacd_post_twid_overlap_add_dec( ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcm_out = accu; pcm_out -= ch_fac; + accu = ixheaacd_sub32_sat( ixheaacd_shr32( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1))); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcmout1 = accu; pcmout1 += ch_fac; } cos1 = *cos_sin_ptr++; @@ -773,14 +781,14 @@ VOID ixheaacd_post_twid_overlap_add_dec( ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16))); - *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcm_out = accu; pcm_out -= ch_fac; accu = ixheaacd_sub32_sat( ixheaacd_shr32( ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1), q_shift), ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1)); - *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2)); + *pcmout1 = accu; pcmout1 += ch_fac; } } diff --git a/decoder/ixheaacd_aac_imdct.h b/decoder/ixheaacd_aac_imdct.h index d6dc58f..950eef9 100644 --- a/decoder/ixheaacd_aac_imdct.h +++ b/decoder/ixheaacd_aac_imdct.h @@ -38,19 +38,19 @@ VOID ixheaacd_post_twiddle_armv8( ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints); VOID ixheaacd_post_twid_overlap_add_dec( - WORD16 pcm_out[], WORD32 spec_data[], + WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac); VOID ixheaacd_post_twid_overlap_add_armv7( - WORD16 pcm_out[], WORD32 spec_data[], + WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac); VOID ixheaacd_post_twid_overlap_add_armv8( - WORD16 pcm_out[], WORD32 spec_data[], + WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac); diff --git a/decoder/ixheaacd_aacdecoder.c b/decoder/ixheaacd_aacdecoder.c index 6c26d2d..c9c1547 100644 --- a/decoder/ixheaacd_aacdecoder.c +++ b/decoder/ixheaacd_aacdecoder.c @@ -85,16 +85,18 @@ #define EXT_FILL_DATA 1 #define EXT_FIL 0 +#define MIN(x, y) ((x) > (y) ? (y) : (x)) + WORD32 ixheaacd_aacdec_decodeframe( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, - ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data, + ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data_tmp, FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel, WORD *element_index_order, WORD skip_full_decode, WORD ch_fac, WORD slot_element, WORD max_channels, WORD32 total_channels, WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 ch_config, ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader, - ia_drc_dec_struct *drc_dummy) + ia_drc_dec_struct *drc_dummy, UWORD8 *slot_pos) { WORD ch, ele_type; @@ -129,6 +131,8 @@ WORD32 ixheaacd_aacdec_decodeframe( WORD32 *work_buffer_2 = aac_scratch_ptrs->extra_scr_4k[2]; p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac; + WORD32 *time_data = (WORD32 *)time_data_tmp; + aac_dec_handle = p_state_enhaacplus_dec->pstr_aac_dec_info[*ch_idx]; it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream; @@ -810,8 +814,14 @@ WORD32 ixheaacd_aacdec_decodeframe( if (skip_full_decode == 0) { ixheaacd_imdct_process( aac_dec_handle->pstr_aac_dec_overlap_info[ch], spec_coef[ch], - &str_ics_info[ch], time_data + slot_element, (WORD16)ch_fac, - scratch[ch], aac_dec_handle->pstr_aac_tables, object_type); + &str_ics_info[ch], time_data + slot_element, ch_fac, scratch[ch], + aac_dec_handle->pstr_aac_tables, object_type, slot_element); + + if (slot_pos != NULL) *slot_pos = slot_element; + + p_obj_exhaacplus_dec->p_state_aac + ->qshift_adj[p_obj_exhaacplus_dec->p_state_aac->qshift_cnt++] = + str_ics_info[ch].qshift_adj; aac_dec_handle->ptr_aac_dec_static_channel_info[ch] ->overlap_add_data.win_shape = str_ics_info[ch].window_shape; @@ -827,7 +837,7 @@ WORD32 ixheaacd_aacdec_decodeframe( time_data + slot_element, overlap1, aac_dec_handle->samples_per_frame, object_type, (WORD16)ch_fac, str_ics_info[ch].window_sequence, - (WORD16 *)ptr_long_window_next); + (WORD16 *)ptr_long_window_next, slot_element); } else { ixheaacd_lt_update_state( aac_dec_handle->ptr_aac_dec_static_channel_info[ch] @@ -835,7 +845,7 @@ WORD32 ixheaacd_aacdec_decodeframe( time_data + slot_element, overlap1, aac_dec_handle->samples_per_frame, object_type, (WORD16)ch_fac, str_ics_info[ch].window_sequence, - (WORD16 *)ptr_short_window_next); + (WORD16 *)ptr_short_window_next, slot_element); } } } diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 3a17d1d..8e9a2a6 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -119,6 +119,18 @@ #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE (610) #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE_8 (IXHEAACD_CCE_DEC_INFO_MEM_SIZE + 8) +#define LD_OBJ -2 + +#define MIN(x, y) ((x) > (y) ? (y) : (x)) + +WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter, + UWORD32 num_channels, UWORD32 sample_rate, + FLOAT32 *buffer, UWORD32 *delay_in_samples); + +VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter, + VOID *samples, UWORD32 frame_len, + WORD8 *qshift_adj); + IA_ERRORCODE ixheaacd_dec_mem_api( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd, WORD32 i_idx, VOID *pv_value) { @@ -277,11 +289,41 @@ static VOID ixheaacd_allocate_aac_scr( VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct, VOID *base_scratch_ptr, VOID *output_ptr, WORD total_elements, WORD ch_fac, - WORD32 audio_object_type) { + WORD32 audio_object_type, WORD32 total_channels, + WORD8 *p_qshift_arr, UWORD8 slot_pos, + UWORD8 num_ch) { WORD32 temp = 0; + WORD32 j, i; sbr_scratch_struct->ptr_work_buf_core = base_scratch_ptr; sbr_scratch_struct->ptr_work_buf = (WORD8 *)base_scratch_ptr + (18 * 1024); + if (p_qshift_arr != NULL && *p_qshift_arr != LD_OBJ) { + WORD32 *tmp_buf = (WORD32 *)output_ptr; + + for (j = 1; j < num_ch; j++) { + if ((*p_qshift_arr + j) == 0) + *(p_qshift_arr + j) = *(p_qshift_arr + j - 1); + } + + if (total_channels > 2) { + for (j = 0; j < num_ch; j++) { + for (i = 0; i < 1024; i++) { + *((WORD16 *)tmp_buf + slot_pos + total_channels * i + j) = + ixheaacd_round16(ixheaacd_shl32_sat( + *(tmp_buf + slot_pos + total_channels * i + j), + *(p_qshift_arr + j))); + } + } + } else { + for (j = 0; j < num_ch; j++) { + for (i = 0; i < 1024; i++) { + *((WORD16 *)tmp_buf + total_channels * i + j) = + ixheaacd_round16(ixheaacd_shl32_sat( + *(tmp_buf + total_channels * i + j), *(p_qshift_arr + j))); + } + } + } + } if (total_elements > 1) { sbr_scratch_struct->extra_scr_1k[0] = (WORD8 *)base_scratch_ptr + (18 * 1024); @@ -319,6 +361,7 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, pWORD32 pui_value_signed = pv_value; pWORD8 pb_value = pv_value; pVOID *pp_value = (pVOID *)pv_value; + float *pf_value = pv_value; if ((i_cmd != IA_API_CMD_GET_API_SIZE) && (i_cmd != IA_API_CMD_GET_LIB_ID_STRINGS)) { @@ -406,6 +449,7 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108; p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0; p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0; + p_obj_exhaacplus_dec->aac_config.output_level = -1; p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6; @@ -558,28 +602,29 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, } case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT: { p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1; - if (*pui_value > 127) { + if (*pf_value > 1) { p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0; return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT); } p_obj_exhaacplus_dec->aac_config.ui_drc_cut = - (WORD32)((*pui_value / 127.0) * 100); + (WORD32)((*pf_value) * 100); break; } case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST: { p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1; - if (*pui_value > 127) { + if (*pf_value > 1) { p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0; return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST); } p_obj_exhaacplus_dec->aac_config.ui_drc_boost = - (WORD32)((*pui_value / 127.0) * 100); + (WORD32)((*pf_value) * 100); break; } case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL: { p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1; + p_obj_exhaacplus_dec->aac_config.i_loud_ref_level = *pui_value_signed; if (*pui_value > 127) { p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108; return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET); @@ -815,6 +860,10 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, (IA_ENHAACPDEC_NUM_MEMTABS); break; } + case IA_API_CMD_GET_LOUDNESS_VAL: { + *pui_value = p_obj_exhaacplus_dec->aac_config.output_level; + break; + } case IA_API_CMD_SET_MEMTABS_PTR: { if (pv_value == NULL) return IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC; memset(pv_value, 0, (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) * @@ -844,6 +893,9 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) { err_code = IA_FATAL_ERROR; } else { + memset(p_obj_exhaacplus_dec->p_state_aac->qshift_adj, 0, + sizeof(p_obj_exhaacplus_dec->p_state_aac->qshift_adj)); + p_obj_exhaacplus_dec->p_state_aac->qshift_cnt = 0; err_code = ixheaacd_dec_execute(p_obj_exhaacplus_dec); } if (err_code != IA_NO_ERROR) { @@ -1018,6 +1070,7 @@ IA_ERRORCODE ixheaacd_decoder_flush_api( p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0; p_obj_exhaacplus_dec->aac_config.downmix = 0; + p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 0; { ia_aac_dec_tables_struct *pstr_aac_tables = @@ -1324,6 +1377,8 @@ IA_ERRORCODE ixheaacd_dec_init( p_obj_exhaacplus_dec->p_state_aac = p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX]; + p_obj_exhaacplus_dec->p_state_aac->preroll_config_present = 0; + if (p_obj_exhaacplus_dec->p_state_aac != NULL) { ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf); if (ret_val != 0) { @@ -1808,7 +1863,18 @@ IA_ERRORCODE ixheaacd_dec_init( p_state_enhaacplus_dec->ch_config, p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present, - &p_state_enhaacplus_dec->drc_dummy); + &p_state_enhaacplus_dec->drc_dummy, + &p_state_enhaacplus_dec->slot_pos); + + if (p_state_enhaacplus_dec->pstr_drc_dec->drc_element_found == 1) { + if (p_obj_exhaacplus_dec->aac_config.i_loud_ref_level < 0) { + p_obj_exhaacplus_dec->aac_config.output_level = + p_state_enhaacplus_dec->pstr_drc_dec->prog_ref_level; + } else { + p_obj_exhaacplus_dec->aac_config.output_level = + p_obj_exhaacplus_dec->aac_config.i_loud_ref_level; + } + } memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx] ->pstr_aac_dec_ch_info[0] @@ -1899,7 +1965,8 @@ IA_ERRORCODE ixheaacd_dec_init( WORD16 num_channels_1_t = num_channels_1; ixheaacd_allocate_sbr_scr( &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v, - time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type); + time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type, 0, NULL, + 0, 0); if (ixheaacd_applysbr( p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx], @@ -2227,7 +2294,7 @@ IA_ERRORCODE ixheaacd_dec_execute( WORD type; WORD total_channels = 0; WORD total_elements = 0; - WORD16 *actual_out_buffer; + WORD16 *actual_out_buffer = NULL; WORD ps_enable; WORD esbr_mono_downmix = 0; WORD8 element_used[MAX_BS_ELEMENT]; @@ -2347,7 +2414,7 @@ IA_ERRORCODE ixheaacd_dec_execute( scratch_pointer = 12 * 1024; p_state_enhaacplus_dec->coup_ch_output = - (WORD16 *)((WORD8 *) + (WORD32 *)((WORD8 *) p_obj_exhaacplus_dec->p_state_aac->aac_scratch_mem_v + scratch_pointer); } @@ -2363,6 +2430,52 @@ IA_ERRORCODE ixheaacd_dec_execute( p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0; if (p_state_enhaacplus_dec->ui_in_bytes == 0) { + WORD32 i, j; + if (p_state_enhaacplus_dec->peak_lim_init == 1) { + p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = + (p_state_enhaacplus_dec->peak_limiter.attack_time_samples) * + total_channels * sizeof(WORD16); + + for (j = 0; j < total_channels; j++) { + for (i = 0; + i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples - + p_state_enhaacplus_dec->peak_limiter.delayed_input_index); + i++) { + *(time_data + total_channels * i + j) = ixheaacd_round16( + *(p_state_enhaacplus_dec->peak_limiter.delayed_input + + (p_state_enhaacplus_dec->peak_limiter.delayed_input_index) * + total_channels + + total_channels * i + j)); + } + } + + for (j = 0; j < total_channels; j++) { + for (i = 0; + i < p_state_enhaacplus_dec->peak_limiter.delayed_input_index; + i++) { + *(time_data + + (p_state_enhaacplus_dec->peak_limiter.attack_time_samples - + p_state_enhaacplus_dec->peak_limiter.delayed_input_index) * + total_channels + + total_channels * i + j) = + ixheaacd_round16( + *(p_state_enhaacplus_dec->peak_limiter.delayed_input + + total_channels * i + j)); + } + } + + if (p_obj_exhaacplus_dec->aac_config.dup_stereo_flag) { + for (i = 0; + i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples); + i++) { + time_data[2 * i + 1] = time_data[2 * i + 0]; + } + } + p_state_enhaacplus_dec->peak_lim_init = 0xFF; + } else { + p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0; + } + p_state_enhaacplus_dec->i_bytes_consumed = 0; return IA_NO_ERROR; } @@ -2505,6 +2618,10 @@ IA_ERRORCODE ixheaacd_dec_execute( p_state_enhaacplus_dec->pstr_drc_dec->state = 1; } + WORD16 *intermediate_scr = + (WORD16 *)(WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + + (128 * 1024); + for (ch_idx1 = 0; ch_idx1 < total_elements; ch_idx1++) { WORD32 skip_full_decode = 0; WORD32 ch_idx = ch_idx1; @@ -2582,7 +2699,8 @@ IA_ERRORCODE ixheaacd_dec_execute( if (p_obj_exhaacplus_dec->aac_config.element_type[1] < 3 && p_obj_exhaacplus_dec->aac_config.element_type[1] > 0 && p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) { - actual_out_buffer = p_state_enhaacplus_dec->coup_ch_output; + actual_out_buffer = + (WORD16 *)(VOID *)p_state_enhaacplus_dec->coup_ch_output; } ch_fac = 1; slot_ele = 0; @@ -2599,8 +2717,8 @@ IA_ERRORCODE ixheaacd_dec_execute( time_data, channel, p_obj_exhaacplus_dec->aac_config.ui_max_channels, p_state_enhaacplus_dec->audio_object_type); - if(p_state_enhaacplus_dec->ch_config == 2 && channel == 1) - return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR; + if (p_state_enhaacplus_dec->ch_config == 2 && channel == 1) + return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR; error_code = ixheaacd_aacdec_decodeframe( p_obj_exhaacplus_dec, &aac_scratch_struct, actual_out_buffer, @@ -2614,7 +2732,21 @@ IA_ERRORCODE ixheaacd_dec_execute( p_state_enhaacplus_dec->ch_config, p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present, - &p_state_enhaacplus_dec->drc_dummy); + &p_state_enhaacplus_dec->drc_dummy, + &p_state_enhaacplus_dec->slot_pos); + + p_state_enhaacplus_dec->slot_pos -= (channel - 1); + p_state_enhaacplus_dec->sbr_present = 0; + + if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ && + p_state_enhaacplus_dec->frame_counter == 0) { + ixheaacd_peak_limiter_init( + &p_state_enhaacplus_dec->peak_limiter, total_channels, + p_obj_exhaacplus_dec->p_state_aac->p_config->ui_samp_freq, + &p_state_enhaacplus_dec->peak_limiter.buffer[0], + &p_obj_exhaacplus_dec->p_state_aac->delay_in_samples); + p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 1; + } if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START || (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD && @@ -2692,10 +2824,15 @@ IA_ERRORCODE ixheaacd_dec_execute( if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] && p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) { ia_sbr_scr_struct sbr_scratch_struct; - ixheaacd_allocate_sbr_scr(&sbr_scratch_struct, - p_state_enhaacplus_dec->aac_scratch_mem_v, - time_data, total_elements, ch_fac, - p_state_enhaacplus_dec->audio_object_type); + ixheaacd_allocate_sbr_scr( + &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v, + time_data, total_elements, ch_fac, + p_state_enhaacplus_dec->audio_object_type, total_channels, + p_obj_exhaacplus_dec->p_state_aac->qshift_adj, + p_state_enhaacplus_dec->slot_pos, channel); + + p_state_enhaacplus_dec->sbr_present = 1; + p_state_enhaacplus_dec->peak_lim_init = 0; if (ixheaacd_applysbr( p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx], @@ -2721,8 +2858,17 @@ IA_ERRORCODE ixheaacd_dec_execute( sample_rate = sample_rate_dec; } + if (p_state_enhaacplus_dec->sbr_present || + p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] == LD_OBJ) { + num_of_out_samples = frame_size; + + } else { + num_of_out_samples = + frame_size - + MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size); + } + p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate; - num_of_out_samples = frame_size; p_state_enhaacplus_dec->num_channel_last = num_ch; p_state_enhaacplus_dec->num_of_out_samples = num_of_out_samples; @@ -2732,12 +2878,11 @@ IA_ERRORCODE ixheaacd_dec_execute( { if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 && channel == 1 && total_elements == 1 && num_ch == 1) { - WORD i; num_ch = 2; + p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 1; - for (i = 0; i < frame_size; i++) { - actual_out_buffer[2 * i + 1] = actual_out_buffer[2 * i + 0]; - } + } else { + p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 0; } p_obj_exhaacplus_dec->aac_config.ui_n_channels = num_ch; @@ -2750,6 +2895,22 @@ IA_ERRORCODE ixheaacd_dec_execute( else { channel_coupling_flag = 1; } + + if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) { + for (int j = 0; j < channel; j++) { + for (int i = 0; i < frame_size; i++) { + intermediate_scr[total_channels * i + j + + p_state_enhaacplus_dec->slot_pos] = + actual_out_buffer[total_channels * i + j + + p_state_enhaacplus_dec->slot_pos]; + } + } + } + } + + if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) { + memcpy(time_data, intermediate_scr, + sizeof(WORD16) * frame_size * total_channels); } { @@ -2766,12 +2927,63 @@ IA_ERRORCODE ixheaacd_dec_execute( p_state_enhaacplus_dec->frame_counter++; + WORD32 i, j; + if (channel_coupling_flag) { ixheaacd_dec_ind_coupling(p_obj_exhaacplus_dec, p_state_enhaacplus_dec->coup_ch_output, num_of_out_samples, total_channels, time_data); } + for (i = 0; i < total_channels; i++) { + if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] == 0) + p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] = + p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0]; + } + + if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 && + total_elements == 1 && num_ch == 2 && + p_obj_exhaacplus_dec->aac_config.dup_stereo_flag == 1) { + WORD i; + + if (!p_state_enhaacplus_dec->sbr_present && + p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) { + for (i = 0; i < frame_size; i++) { + *((WORD32 *)actual_out_buffer + 2 * i + 1) = + *((WORD32 *)actual_out_buffer + 2 * i); + } + } else { + for (i = 0; i < frame_size; i++) { + *(actual_out_buffer + 2 * i + 1) = *(actual_out_buffer + 2 * i); + } + } + } + + if (!p_state_enhaacplus_dec->sbr_present && + p_obj_exhaacplus_dec->p_state_aac->peak_lim_init == 1 && + p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) { + ixheaacd_peak_limiter_process( + &p_state_enhaacplus_dec->peak_limiter, time_data, frame_size, + p_obj_exhaacplus_dec->p_state_aac->qshift_adj); + + for (i = 0; i < frame_size * 2; i++) { + for (j = 0; j < total_channels; j++) { + *((WORD16 *)time_data + total_channels * i + j) = + ixheaacd_round16(*((WORD32 *)time_data + total_channels * i + j)); + } + } + + memmove( + time_data, + (time_data + + total_channels * p_obj_exhaacplus_dec->p_state_aac->delay_in_samples), + sizeof(WORD16) * num_of_out_samples * total_channels); + + p_obj_exhaacplus_dec->p_state_aac->delay_in_samples = + p_obj_exhaacplus_dec->p_state_aac->delay_in_samples - + MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size); + } + if ((total_channels > 2) && (1 == p_obj_exhaacplus_dec->aac_config.downmix)) { ixheaacd_dec_downmix_to_stereo(p_obj_exhaacplus_dec, num_of_out_samples, total_elements, time_data, total_channels); diff --git a/decoder/ixheaacd_apicmd_standards.h b/decoder/ixheaacd_apicmd_standards.h index 802585d..baa8f40 100644 --- a/decoder/ixheaacd_apicmd_standards.h +++ b/decoder/ixheaacd_apicmd_standards.h @@ -60,6 +60,7 @@ #define IA_API_CMD_GET_TABLE_INFO_PRIORITY 0x001C #define IA_API_CMD_SET_TABLE_PTR 0x001D #define IA_API_CMD_GET_TABLE_PTR 0x001E +#define IA_API_CMD_GET_LOUDNESS_VAL 0x001F /*****************************************************************************/ /* Ittiam standard API command indices */ diff --git a/decoder/ixheaacd_block.c b/decoder/ixheaacd_block.c index 2784edd..2424676 100644 --- a/decoder/ixheaacd_block.c +++ b/decoder/ixheaacd_block.c @@ -17,6 +17,7 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ +#include <stdlib.h> #include "ixheaacd_sbr_common.h" #include "ixheaacd_type_def.h" @@ -1122,6 +1123,10 @@ WORD ixheaacd_huffman_dec_word2(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no, } else { it_bit_buff->ptr_read_next += (it_bit_buff->bit_pos) >> 3; it_bit_buff->bit_pos = it_bit_buff->bit_pos & 0x7; + if ((SIZE_T)(it_bit_buff->ptr_read_next) > (SIZE_T)(it_bit_buff->ptr_bit_buf_end + 1)) + { + return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; + } bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) + ((it_bit_buff->bit_pos - start_bit_pos)); @@ -1131,9 +1136,11 @@ WORD ixheaacd_huffman_dec_word2(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no, return ret_val; } -void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out, +void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp, const WORD16 *window, WORD16 q_shift, WORD16 size, - WORD16 stride) { + WORD16 stride , WORD slot_element) { + + WORD32 accu; WORD32 i; WORD16 rounding_fac = -0x2000; @@ -1145,6 +1152,8 @@ void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out, WORD32 *pwin1, *pwin2; WORD32 *pCoef = &coef[size * 2 - 1 - 0]; + WORD16 * out = (WORD16*)out_tmp - slot_element; + pwin1 = &window_i[size - 1 - 0]; pwin2 = &window_i[size + 0]; @@ -1182,12 +1191,12 @@ void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out, } } -VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out, +VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out, const WORD16 *window, WORD16 q_shift, WORD16 size, WORD16 ch_fac) { WORD32 accu; WORD32 i; - WORD16 rounding_fac = -0x2000; + WORD16 rounding_fac = 0; for (i = 0; i < size; i++) { WORD16 window1, window2; @@ -1198,16 +1207,14 @@ VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out, ixheaacd_shl32_dir_sat_limit( ixheaacd_mult32x16in32(coef[size * 2 - 1 - i], window2), q_shift), ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window1)); - out[ch_fac * (size - i - 1)] = - ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16); + out[ch_fac * (size - i - 1)] = accu; accu = ixheaacd_sub32_sat( ixheaacd_shl32_dir_sat_limit( ixheaacd_mult32x16in32(ixheaacd_negate32(coef[size * 2 - 1 - i]), window1), q_shift), ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window2)); - out[ch_fac * (size + i)] = - ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16); + out[ch_fac * (size + i)] = accu; } } diff --git a/decoder/ixheaacd_block.h b/decoder/ixheaacd_block.h index 739116c..51a1d9f 100644 --- a/decoder/ixheaacd_block.h +++ b/decoder/ixheaacd_block.h @@ -78,15 +78,15 @@ IA_ERRORCODE ixheaacd_read_section_data( WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag, ia_aac_dec_tables_struct *ptr_aac_tables); -VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out, +VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out, const WORD16 *window, WORD16 q_shift, WORD16 size, WORD16 ch_fac); -VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD16 *out, +VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD32 *out, const WORD16 *window, WORD16 q_shift, WORD16 size, WORD16 ch_fac); -VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD16 *out, +VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD32 *out, const WORD16 *window, WORD16 q_shift, WORD16 size, WORD16 ch_fac); @@ -120,10 +120,10 @@ VOID ixheaacd_spec_to_overlapbuf_armv7(WORD32 *ptr_overlap_buf, WORD32 *ptr_spec_coeff, WORD32 q_shift, WORD32 size); -VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf, +VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac); -VOID ixheaacd_overlap_buf_out_armv7(WORD16 *out_samples, +VOID ixheaacd_overlap_buf_out_armv7(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac); @@ -132,33 +132,33 @@ WORD32 ixheaacd_inv_quant(WORD32 *x_quant, WORD32 *ixheaacd_pow_table_Q13); VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, WORD32 *ptr_spec_coeff, ia_ics_info_struct *ptr_ics_info, - WORD16 out_samples[], const WORD16 ch_fac, + VOID* out_samples, const WORD16 ch_fac, WORD32 *scratch, ia_aac_dec_tables_struct *ptr_aac_tables, - WORD32 object_type); + WORD32 object_type , WORD slot_element); -VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift, +VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac); -VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD16 *out, WORD16 q_shift, +VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac); -VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD16 *out, WORD16 q_shift, +VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac); VOID ixheaacd_nolap1_32(WORD32 *coef, WORD32 *out, WORD16 cu_scale, WORD16 stride); -VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf, +VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac); -VOID ixheaacd_overlap_out_copy_armv7(WORD16 *out_samples, +VOID ixheaacd_overlap_out_copy_armv7(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac); -VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out, +VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window, const WORD16 *short_window_prev, const WORD16 *long_window_prev, WORD16 q_shift, @@ -173,7 +173,7 @@ VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *huff_index, void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *ptr_win, WORD32 framesize, WORD16 q_shift, WORD32 *ptr_overlap_buf, const WORD16 stride, - WORD16 *out_samples); + VOID *out_samples, WORD slot_element); WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 cnt); @@ -182,8 +182,8 @@ VOID ixheaacd_process_single_scf(WORD32 scale_factor, WORD32 *x_invquant, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag); -void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out, +void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp, const WORD16 *window, WORD16 q_shift, WORD16 size, - WORD16 stride); + WORD16 stride , WORD slot_element); #endif /* #ifndef IXHEAACD_BLOCK_H */ diff --git a/decoder/ixheaacd_channelinfo.h b/decoder/ixheaacd_channelinfo.h index b582c0e..4cf1216 100644 --- a/decoder/ixheaacd_channelinfo.h +++ b/decoder/ixheaacd_channelinfo.h @@ -43,6 +43,7 @@ typedef struct { WORD16 predictor_data_present; ltp_info ltp; ltp_info ltp2; + WORD8 qshift_adj; } ia_ics_info_struct; typedef struct { diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c index 7ee1bcd..cc1a971 100644 --- a/decoder/ixheaacd_decode_main.c +++ b/decoder/ixheaacd_decode_main.c @@ -65,12 +65,14 @@ #include "ixheaacd_create.h" #include "ixheaacd_dec_main.h" #include "ixheaacd_error_standards.h" +#include "ixheaacd_struct_def.h" VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, WORD32 pcmsize, FLOAT32 (*out_samples)[4096], WORD32 *out_bytes, WORD32 num_channel_out) { WORD32 num; WORD32 i; - FLOAT32 sample; + WORD32 write_local; + FLOAT32 write_local_float; WORD16 *out_buf = (WORD16 *)outbuffer; @@ -78,29 +80,30 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, if (pcmsize == 16) { for (i = 0; i < num; i++) { - sample = (out_samples[i % num_channel_out][i / num_channel_out]); + write_local_float = + (out_samples[i % num_channel_out][i / num_channel_out]); - if (sample > MAX_16) { - sample = MAX_16; - } else if (sample < MIN_16) { - sample = MIN_16; + if (write_local_float > 32767.0f) { + write_local_float = 32767.0f; + } else if (write_local_float < -32768.0f) { + write_local_float = -32768.0f; } - out_buf[i] = (WORD16)sample; + out_buf[i] = (WORD16)write_local_float; } *out_bytes = num * sizeof(WORD16); } else { WORD8 *out_24bit = (WORD8 *)out_buf; for (i = 0; i < num; i++) { - WORD32 write_local; - sample = (out_samples[i % num_channel_out][i / num_channel_out] * 256); + write_local_float = + (out_samples[i % num_channel_out][i / num_channel_out] * 256); - if (sample > MAX_24) { - sample = MAX_24; - } else if (sample < MIN_24) { - sample = MIN_24; + if (write_local_float > 8388607.0f) { + write_local_float = 8388607.0f; + } else if (write_local_float < -8388608.0f) { + write_local_float = -8388608.0f; } - write_local = (WORD32)sample; + write_local = (WORD32)write_local_float; *out_24bit++ = (WORD32)write_local & 0xff; *out_24bit++ = ((WORD32)write_local >> 8) & 0xff; @@ -112,10 +115,9 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, } /* audio pre roll frame parsing*/ -static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, - UWORD8 *conf_buf, - WORD32 *preroll_units, - WORD32 *preroll_frame_offset) { +static WORD32 ixheaacd_audio_preroll_parsing( + ia_dec_data_struct *pstr_dec_data, UWORD8 *conf_buf, WORD32 *preroll_units, + WORD32 *preroll_frame_offset, ia_aac_dec_state_struct *aac_dec_handle) { ia_bit_buf_struct *temp_buff = (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf); WORD32 independency_flag = 0; @@ -128,7 +130,6 @@ static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, WORD32 num_pre_roll_frames = 0; WORD32 frame_idx = 0; - WORD32 frame_len[MAX_AUDIO_PREROLLS] = {0}; WORD32 temp = 0; WORD32 config_len = 0; @@ -171,6 +172,16 @@ static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, for (loop = 0; loop < config_len; loop++) conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8); + if (aac_dec_handle->preroll_config_present == 1) { + if (!(memcmp(aac_dec_handle->preroll_config_prev, conf_buf, + sizeof(aac_dec_handle->preroll_config_prev)))) { + config_len = 0; + } + } + aac_dec_handle->preroll_config_present = 1; + memcpy(aac_dec_handle->preroll_config_prev, conf_buf, + sizeof(aac_dec_handle->preroll_config_prev)); + apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1); un_used_val = ixheaacd_read_bits_buf(temp_buff, 1); // reserverd @@ -191,15 +202,20 @@ static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16); au_len += val_add; } - preroll_frame_offset[frame_idx] = temp_buff->size - temp_buff->cnt_bits; - frame_len[frame_idx] = - (8 * au_len) + (temp_buff->size - temp_buff->cnt_bits); + if (config_len != 0) { + preroll_frame_offset[frame_idx] = + temp_buff->size - temp_buff->cnt_bits; + } temp_buff->ptr_read_next += au_len; temp_buff->cnt_bits -= au_len * 8; } } } - *preroll_units = num_pre_roll_frames; + if (config_len == 0) + *preroll_units = 0; + else + *preroll_units = num_pre_roll_frames; + return config_len; } @@ -218,11 +234,10 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, WORD32 suitable_tracks = 1; WORD32 num_samples_out; ia_dec_data_struct *pstr_dec_data; - UWORD8 config[285]; // max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + - // 2^8 -1; + UWORD8 config[MAX_PREROLL_SIZE]; WORD32 config_len; WORD32 delay; - WORD preroll_frame_offset[4] = {0}; + WORD preroll_frame_offset[MAX_PREROLL_FRAME_OFFSET] = {0}; WORD preroll_units = -1; WORD32 access_units = 0; @@ -283,9 +298,9 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, if (access_units == 0 && pstr_audio_specific_config->str_usac_config.str_usac_dec_config .preroll_flag) { - config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data, &config[0], - &preroll_units, - &preroll_frame_offset[0]); + config_len = ixheaacd_audio_preroll_parsing( + pstr_dec_data, &config[0], &preroll_units, &preroll_frame_offset[0], + aac_dec_handle); if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR; } diff --git a/decoder/ixheaacd_env_extr.h b/decoder/ixheaacd_env_extr.h index 32b1421..4c79e95 100644 --- a/decoder/ixheaacd_env_extr.h +++ b/decoder/ixheaacd_env_extr.h @@ -74,7 +74,7 @@ typedef struct { WORD32 over_sampling_flag; WORD32 pitch_in_bins; WORD32 pvc_mode; - + WORD32 cov_count; WORD32 sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES]; FLOAT32 flt_env_sf_arr[MAX_NUM_ENVELOPE_VALUES]; FLOAT32 flt_noise_floor[MAX_NUM_NOISE_VALUES]; diff --git a/decoder/ixheaacd_fft.c b/decoder/ixheaacd_fft.c index 0932097..60482d6 100644 --- a/decoder/ixheaacd_fft.c +++ b/decoder/ixheaacd_fft.c @@ -28,9 +28,10 @@ #include "ixheaacd_function_selector.h" extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514]; +extern const FLOAT32 ixheaacd_twiddle_table_fft_flt[16]; extern const WORD32 ixheaacd_twiddle_table_3pr[1155]; extern const WORD32 ixheaacd_twiddle_table_3pi[1155]; -extern const WORD8 ixheaacd_mps_dig_rev[16]; +extern const WORD8 ixheaacd_mps_dig_rev[8]; #define PLATFORM_INLINE __inline @@ -61,59 +62,84 @@ static PLATFORM_INLINE WORD32 ixheaacd_mac32_sat(WORD32 a, WORD32 b, WORD32 c) { return (result); } +static PLATFORM_INLINE FLOAT32 mult32X32float(FLOAT32 a, FLOAT32 b) { + FLOAT32 result; -VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re, - WORD32 *fin_im, WORD32 nlength) { - WORD32 i, j, k, n_stages; - WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - WORD32 del, nodespacing, in_loop_cnt; - WORD32 y[128]; - WORD32 npoints = nlength; - WORD32 *ptr_y = y; - const WORD32 *ptr_w; - n_stages = 30 - ixheaacd_norm32(npoints); + result = a * b; - n_stages = n_stages >> 1; + return result; +} - ptr_w = ixheaacd_twiddle_table_fft_32x32; +static PLATFORM_INLINE FLOAT32 mac32X32float(FLOAT32 a, FLOAT32 b, FLOAT32 c) { + FLOAT32 result; + + result = a + b * c; + + return result; +} + +VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_xr, FLOAT32 *ptr_xi, + WORD32 npoints) { + WORD32 i, j, k; + FLOAT32 y[64], z[64]; + FLOAT32 *ptr_y = y, *ptr_z = z; + const FLOAT32 *ptr_w = ixheaacd_twiddle_table_fft_flt; for (i = 0; i < npoints; i += 4) { - WORD32 *inp = ptr_x; - h2 = ixheaacd_mps_dig_rev[i >> 2]; + FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + FLOAT32 *inp = ptr_xr; + FLOAT32 tmk; + + WORD32 h2 = ixheaacd_mps_dig_rev[i >> 2]; + inp += (h2); x0r = *inp; x0i = *(inp + 1); - inp += (npoints >> 1); + inp += 16; x1r = *inp; x1i = *(inp + 1); - inp += (npoints >> 1); + inp += 16; x2r = *inp; x2i = *(inp + 1); - inp += (npoints >> 1); + inp += 16; x3r = *inp; x3i = *(inp + 1); - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_add32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); - - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); + x0r = x0r + x2r; + x0i = x0i + x2i; + + tmk = x0r - x2r; + x2r = tmk - x2r; + tmk = x0i - x2i; + x2i = tmk - x2i; + + x1r = x1r + x3r; + x1i = x1i + x3i; + + tmk = x1r - x3r; + x3r = tmk - x3r; + tmk = x1i - x3i; + x3i = tmk - x3i; + + x0r = x0r + x1r; + x0i = x0i + x1i; + + tmk = x0r - x1r; + x1r = tmk - x1r; + tmk = x0i - x1i; + x1i = tmk - x1i; + + x2r = x2r + x3i; + x2i = x2i - x3r; + + tmk = x2r - x3i; + x3i = tmk - x3i; + tmk = x2i + x3r; + x3r = tmk + x3r; *ptr_y++ = x0r; *ptr_y++ = x0i; @@ -123,416 +149,719 @@ VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re, *ptr_y++ = x1i; *ptr_y++ = x3i; *ptr_y++ = x3r; - } - ptr_y -= 2 * npoints; - del = 4; - nodespacing = 64; - in_loop_cnt = npoints >> 4; - for (i = n_stages - 1; i > 0; i--) { - const WORD32 *twiddles = ptr_w; - WORD32 *data = ptr_y; - WORD32 w1h, w2h, w3h, w1l, w2l, w3l; - WORD32 sec_loop_cnt; - - for (k = in_loop_cnt; k != 0; k--) { - x0r = (*data); - x0i = (*(data + 1)); - data += (del << 1); - - x1r = (*data); - x1i = (*(data + 1)); - data += (del << 1); - - x2r = (*data); - x2i = (*(data + 1)); - data += (del << 1); - - x3r = (*data); - x3i = (*(data + 1)); - data -= 3 * (del << 1); - - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_add32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); - - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); - - *data = x0r; - *(data + 1) = x0i; - data += (del << 1); - - *data = x2r; - *(data + 1) = x2i; - data += (del << 1); - - *data = x1r; - *(data + 1) = x1i; - data += (del << 1); - - *data = x3i; - *(data + 1) = x3r; - data += (del << 1); - } - data = ptr_y + 2; - - sec_loop_cnt = (nodespacing * del); - sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - - (sec_loop_cnt / 16) + (sec_loop_cnt / 32) - - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) - - (sec_loop_cnt / 256); - j = nodespacing; - - for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) { - w1h = *(twiddles + 2 * j); - w1l = *(twiddles + 2 * j + 1); - w2h = *(twiddles + 2 * (j << 1)); - w2l = *(twiddles + 2 * (j << 1) + 1); - w3h = *(twiddles + 2 * j + 2 * (j << 1)); - w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1); - - for (k = in_loop_cnt; k != 0; k--) { - WORD32 tmp; - WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - data += (del << 1); - - x1r = *data; - x1i = *(data + 1); - data += (del << 1); - - x2r = *data; - x2i = *(data + 1); - data += (del << 1); - - x3r = *data; - x3i = *(data + 1); - data -= 3 * (del << 1); - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l), - ixheaacd_mult32_sat(x1i, w1h)); - x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l); - x1r = tmp; - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l), - ixheaacd_mult32_sat(x2i, w2h)); - x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l); - x2r = tmp; - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3l), - ixheaacd_mult32_sat(x3i, w3h)); - x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l); - x3r = tmp; + inp = ptr_xi; - x0r = (*data); - x0i = (*(data + 1)); - - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_add32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); + inp += (h2); - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); + x0r = *inp; + x0i = *(inp + 1); + inp += 16; - *data = x0r; - *(data + 1) = x0i; - data += (del << 1); + x1r = *inp; + x1i = *(inp + 1); + inp += 16; - *data = x2r; - *(data + 1) = x2i; - data += (del << 1); + x2r = *inp; + x2i = *(inp + 1); + inp += 16; - *data = x1r; - *(data + 1) = x1i; - data += (del << 1); + x3r = *inp; + x3i = *(inp + 1); - *data = x3i; - *(data + 1) = x3r; - data += (del << 1); - } - data -= 2 * npoints; - data += 2; + x0r = x0r + x2r; + x0i = x0i + x2i; + + tmk = x0r - x2r; + x2r = tmk - x2r; + tmk = x0i - x2i; + x2i = tmk - x2i; + + x1r = x1r + x3r; + x1i = x1i + x3i; + + tmk = x1r - x3r; + x3r = tmk - x3r; + tmk = x1i - x3i; + x3i = tmk - x3i; + + x0r = x0r + x1r; + x0i = x0i + x1i; + + tmk = x0r - x1r; + x1r = tmk - x1r; + tmk = x0i - x1i; + x1i = tmk - x1i; + + x2r = x2r + x3i; + x2i = x2i - x3r; + + tmk = x2r - x3i; + x3i = tmk - x3i; + tmk = x2i + x3r; + x3r = tmk + x3r; + + *ptr_z++ = x0r; + *ptr_z++ = x0i; + *ptr_z++ = x2r; + *ptr_z++ = x2i; + *ptr_z++ = x1r; + *ptr_z++ = x1i; + *ptr_z++ = x3i; + *ptr_z++ = x3r; + } + ptr_y -= 64; + ptr_z -= 64; + { + FLOAT32 *data_r = ptr_y; + FLOAT32 *data_i = ptr_z; + for (k = 2; k != 0; k--) { + FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = (*data_r); + x0i = (*(data_r + 1)); + data_r += 8; + + x1r = (*data_r); + x1i = (*(data_r + 1)); + data_r += 8; + + x2r = (*data_r); + x2i = (*(data_r + 1)); + data_r += 8; + + x3r = (*data_r); + x3i = (*(data_r + 1)); + data_r -= 24; + + x0r = x0r + x2r; + x0i = x0i + x2i; + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + x1r; + x0i = x0i + x1i; + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + x3i; + x2i = x2i - x3r; + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_r = x0r; + *(data_r + 1) = x0i; + data_r += 8; + + *data_r = x2r; + *(data_r + 1) = x2i; + data_r += 8; + + *data_r = x1r; + *(data_r + 1) = x1i; + data_r += 8; + + *data_r = x3i; + *(data_r + 1) = x3r; + data_r += 8; + + x0r = (*data_i); + x0i = (*(data_i + 1)); + data_i += 8; + + x1r = (*data_i); + x1i = (*(data_i + 1)); + data_i += 8; + + x2r = (*data_i); + x2i = (*(data_i + 1)); + data_i += 8; + + x3r = (*data_i); + x3i = (*(data_i + 1)); + data_i -= 24; + + x0r = x0r + x2r; + x0i = x0i + x2i; + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + x1r; + x0i = x0i + x1i; + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + x3i; + x2i = x2i - x3r; + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_i = x0r; + *(data_i + 1) = x0i; + data_i += 8; + + *data_i = x2r; + *(data_i + 1) = x2i; + data_i += 8; + + *data_i = x1r; + *(data_i + 1) = x1i; + data_i += 8; + + *data_i = x3i; + *(data_i + 1) = x3r; + data_i += 8; } - for (; j <= (nodespacing * del) >> 1; j += nodespacing) { - w1h = *(twiddles + 2 * j); - w2h = *(twiddles + 2 * (j << 1)); - w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512); - w1l = *(twiddles + 2 * j + 1); - w2l = *(twiddles + 2 * (j << 1) + 1); - w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511); - - for (k = in_loop_cnt; k != 0; k--) { - WORD32 tmp; - WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - data += (del << 1); - - x1r = *data; - x1i = *(data + 1); - data += (del << 1); - - x2r = *data; - x2i = *(data + 1); - data += (del << 1); - - x3r = *data; - x3i = *(data + 1); - data -= 3 * (del << 1); - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l), - ixheaacd_mult32_sat(x1i, w1h)); - x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l); - x1r = tmp; - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l), - ixheaacd_mult32_sat(x2i, w2h)); - x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l); - x2r = tmp; - - tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h), - ixheaacd_mult32_sat(x3i, w3l)); - x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h), - ixheaacd_mult32_sat(x3r, w3l)); - x3r = tmp; - - x0r = (*data); - x0i = (*(data + 1)); - - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_add32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); - - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); - - *data = x0r; - *(data + 1) = x0i; - data += (del << 1); - - *data = x2r; - *(data + 1) = x2i; - data += (del << 1); - - *data = x1r; - *(data + 1) = x1i; - data += (del << 1); - - *data = x3i; - *(data + 1) = x3r; - data += (del << 1); - } - data -= 2 * npoints; - data += 2; + data_r = ptr_y + 2; + data_i = ptr_z + 2; + + for (k = 2; k != 0; k--) { + FLOAT32 tmp; + FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + data_r += 8; + + x1r = *data_r; + x1i = *(data_r + 1); + data_r += 8; + + x2r = *data_r; + x2i = *(data_r + 1); + data_r += 8; + + x3r = *data_r; + x3i = *(data_r + 1); + data_r -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.923880f) - + mult32X32float((FLOAT32)x1i, -0.382683f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.382683f), + (FLOAT32)x1i, 0.923880f); + x1r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, 0.707107f) - + mult32X32float((FLOAT32)x2i, -0.707107f)); + x2i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x2r, -0.707107f), + (FLOAT32)x2i, 0.707107f); + x2r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, 0.382683f) - + mult32X32float((FLOAT32)x3i, -0.923880f)); + x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.923880f), + (FLOAT32)x3i, 0.382683f); + x3r = tmp; + + x0r = (*data_r); + x0i = (*(data_r + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_r = x0r; + *(data_r + 1) = x0i; + data_r += 8; + + *data_r = x2r; + *(data_r + 1) = x2i; + data_r += 8; + + *data_r = x1r; + *(data_r + 1) = x1i; + data_r += 8; + + *data_r = x3i; + *(data_r + 1) = x3r; + data_r += 8; + data_i += 8; + + x1r = *data_i; + x1i = *(data_i + 1); + data_i += 8; + + x2r = *data_i; + x2i = *(data_i + 1); + data_i += 8; + + x3r = *data_i; + x3i = *(data_i + 1); + data_i -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.923880f) - + mult32X32float((FLOAT32)x1i, -0.382683f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.382683f), + (FLOAT32)x1i, 0.923880f); + x1r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, 0.707107f) - + mult32X32float((FLOAT32)x2i, -0.707107f)); + x2i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x2r, -0.707107f), + (FLOAT32)x2i, 0.707107f); + x2r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, 0.382683f) - + mult32X32float((FLOAT32)x3i, -0.923880f)); + x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.923880f), + (FLOAT32)x3i, 0.382683f); + x3r = tmp; + + x0r = (*data_i); + x0i = (*(data_i + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_i = x0r; + *(data_i + 1) = x0i; + data_i += 8; + + *data_i = x2r; + *(data_i + 1) = x2i; + data_i += 8; + + *data_i = x1r; + *(data_i + 1) = x1i; + data_i += 8; + + *data_i = x3i; + *(data_i + 1) = x3r; + data_i += 8; } - for (; j <= sec_loop_cnt * 2; j += nodespacing) { - w1h = *(twiddles + 2 * j); - w2h = *(twiddles + 2 * (j << 1) - 512); - w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512); - w1l = *(twiddles + 2 * j + 1); - w2l = *(twiddles + 2 * (j << 1) - 511); - w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511); - - for (k = in_loop_cnt; k != 0; k--) { - WORD32 tmp; - WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - data += (del << 1); - - x1r = *data; - x1i = *(data + 1); - data += (del << 1); - - x2r = *data; - x2i = *(data + 1); - data += (del << 1); - - x3r = *data; - x3i = *(data + 1); - data -= 3 * (del << 1); - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l), - ixheaacd_mult32_sat(x1i, w1h)); - x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l); - x1r = tmp; - - tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h), - ixheaacd_mult32_sat(x2i, w2l)); - x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h), - ixheaacd_mult32_sat(x2r, w2l)); - x2r = tmp; - - tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h), - ixheaacd_mult32_sat(x3i, w3l)); - x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h), - ixheaacd_mult32_sat(x3r, w3l)); - x3r = tmp; - - x0r = (*data); - x0i = (*(data + 1)); - - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_add32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); - - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); - - *data = x0r; - *(data + 1) = x0i; - data += (del << 1); - - *data = x2r; - *(data + 1) = x2i; - data += (del << 1); - - *data = x1r; - *(data + 1) = x1i; - data += (del << 1); - - *data = x3i; - *(data + 1) = x3r; - data += (del << 1); - } - data -= 2 * npoints; - data += 2; + data_r -= 62; + data_i -= 62; + for (k = 2; k != 0; k--) { + FLOAT32 tmp; + FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + data_r += 8; + + x1r = *data_r; + x1i = *(data_r + 1); + data_r += 8; + + x2r = *data_r; + x2i = *(data_r + 1); + data_r += 8; + + x3r = *data_r; + x3i = *(data_r + 1); + data_r -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.707107f) - + mult32X32float((FLOAT32)x1i, -0.707107f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.707107f), + (FLOAT32)x1i, 0.707107f); + x1r = tmp; + + tmp = x2i; + x2i = -x2r; + x2r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, -0.707107f) + + mult32X32float((FLOAT32)x3i, 0.707107f)); + x3i = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.707107f) + + mult32X32float((FLOAT32)x3i, -0.707107f)); + x3r = tmp; + + x0r = (*data_r); + x0i = (*(data_r + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_r = x0r; + *(data_r + 1) = x0i; + data_r += 8; + + *data_r = x2r; + *(data_r + 1) = x2i; + data_r += 8; + + *data_r = x1r; + *(data_r + 1) = x1i; + data_r += 8; + + *data_r = x3i; + *(data_r + 1) = x3r; + data_r += 8; + data_i += 8; + + x1r = *data_i; + x1i = *(data_i + 1); + data_i += 8; + + x2r = *data_i; + x2i = *(data_i + 1); + data_i += 8; + + x3r = *data_i; + x3i = *(data_i + 1); + data_i -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.707107f) - + mult32X32float((FLOAT32)x1i, -0.707107f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.707107f), + (FLOAT32)x1i, 0.707107f); + x1r = tmp; + + tmp = x2i; + x2i = -x2r; + x2r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x3r, -0.707107f) + + mult32X32float((FLOAT32)x3i, 0.707107f)); + x3i = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.707107f) + + mult32X32float((FLOAT32)x3i, -0.707107f)); + x3r = tmp; + + x0r = (*data_i); + x0i = (*(data_i + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i + x3i; + x3r = x1r - (x3r * 2); + x3i = x1i - (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_i = x0r; + *(data_i + 1) = x0i; + data_i += 8; + + *data_i = x2r; + *(data_i + 1) = x2i; + data_i += 8; + + *data_i = x1r; + *(data_i + 1) = x1i; + data_i += 8; + + *data_i = x3i; + *(data_i + 1) = x3r; + data_i += 8; } - for (; j < nodespacing * del; j += nodespacing) { - w1h = *(twiddles + 2 * j); - w2h = *(twiddles + 2 * (j << 1) - 512); - w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024); - w1l = *(twiddles + 2 * j + 1); - w2l = *(twiddles + 2 * (j << 1) - 511); - w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023); - - for (k = in_loop_cnt; k != 0; k--) { - WORD32 tmp; - WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; - - data += (del << 1); - - x1r = *data; - x1i = *(data + 1); - data += (del << 1); - - x2r = *data; - x2i = *(data + 1); - data += (del << 1); - - x3r = *data; - x3i = *(data + 1); - data -= 3 * (del << 1); - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l), - ixheaacd_mult32_sat(x1i, w1h)); - x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l); - x1r = tmp; - - tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h), - ixheaacd_mult32_sat(x2i, w2l)); - x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h), - ixheaacd_mult32_sat(x2r, w2l)); - x2r = tmp; - - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h), - ixheaacd_mult32_sat(x3r, w3l)); - x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l); - x3r = tmp; - - x0r = (*data); - x0i = (*(data + 1)); - - x0r = ixheaacd_add32_sat(x0r, x2r); - x0i = ixheaacd_add32_sat(x0i, x2i); - x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1)); - x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1)); - x1r = ixheaacd_add32_sat(x1r, x3r); - x1i = ixheaacd_sub32_sat(x1i, x3i); - x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1)); - x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1)); - - x0r = ixheaacd_add32_sat(x0r, x1r); - x0i = ixheaacd_add32_sat(x0i, x1i); - x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1)); - x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1)); - x2r = ixheaacd_add32_sat(x2r, x3i); - x2i = ixheaacd_sub32_sat(x2i, x3r); - x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1)); - x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1)); - - *data = x0r; - *(data + 1) = x0i; - data += (del << 1); - - *data = x2r; - *(data + 1) = x2i; - data += (del << 1); - - *data = x1r; - *(data + 1) = x1i; - data += (del << 1); - - *data = x3i; - *(data + 1) = x3r; - data += (del << 1); - } - data -= 2 * npoints; - data += 2; + data_r -= 62; + data_i -= 62; + for (k = 2; k != 0; k--) { + FLOAT32 tmp; + FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + data_r += 8; + + x1r = *data_r; + x1i = *(data_r + 1); + data_r += 8; + + x2r = *data_r; + x2i = *(data_r + 1); + data_r += 8; + + x3r = *data_r; + x3i = *(data_r + 1); + data_r -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.382683f) - + mult32X32float((FLOAT32)x1i, -0.923880f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.923880f), + (FLOAT32)x1i, 0.382683f); + x1r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, -0.707107f) + + mult32X32float((FLOAT32)x2i, 0.707107f)); + x2i = (FLOAT32)(-mult32X32float((FLOAT32)x2r, 0.707107f) + + mult32X32float((FLOAT32)x2i, -0.707107f)); + x2r = tmp; + + tmp = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.923880f) + + mult32X32float((FLOAT32)x3i, -0.382683f)); + x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.382683f), + (FLOAT32)x3i, 0.923880f); + x3r = tmp; + + x0r = (*data_r); + x0i = (*(data_r + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i - x3i; + x3r = x1r - (x3r * 2); + x3i = x1i + (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_r = x0r; + *(data_r + 1) = x0i; + data_r += 8; + + *data_r = x2r; + *(data_r + 1) = x2i; + data_r += 8; + + *data_r = x1r; + *(data_r + 1) = x1i; + data_r += 8; + + *data_r = x3i; + *(data_r + 1) = x3r; + data_r += 8; + data_i += 8; + + x1r = *data_i; + x1i = *(data_i + 1); + data_i += 8; + + x2r = *data_i; + x2i = *(data_i + 1); + data_i += 8; + + x3r = *data_i; + x3i = *(data_i + 1); + data_i -= 24; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, 0.382683f) - + mult32X32float((FLOAT32)x1i, -0.923880f)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, -0.923880f), + (FLOAT32)x1i, 0.382683f); + x1r = tmp; + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x2r, -0.707107f) + + mult32X32float((FLOAT32)x2i, 0.707107f)); + x2i = (FLOAT32)(-mult32X32float((FLOAT32)x2r, 0.707107f) + + mult32X32float((FLOAT32)x2i, -0.707107f)); + x2r = tmp; + + tmp = (FLOAT32)(-mult32X32float((FLOAT32)x3r, 0.923880f) + + mult32X32float((FLOAT32)x3i, -0.382683f)); + x3i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x3r, -0.382683f), + (FLOAT32)x3i, 0.923880f); + x3r = tmp; + + x0r = (*data_i); + x0i = (*(data_i + 1)); + + x0r = x0r + (x2r); + x0i = x0i + (x2i); + x2r = x0r - (x2r * 2); + x2i = x0i - (x2i * 2); + x1r = x1r + x3r; + x1i = x1i - x3i; + x3r = x1r - (x3r * 2); + x3i = x1i + (x3i * 2); + + x0r = x0r + (x1r); + x0i = x0i + (x1i); + x1r = x0r - (x1r * 2); + x1i = x0i - (x1i * 2); + x2r = x2r + (x3i); + x2i = x2i - (x3r); + x3i = x2r - (x3i * 2); + x3r = x2i + (x3r * 2); + + *data_i = x0r; + *(data_i + 1) = x0i; + data_i += 8; + + *data_i = x2r; + *(data_i + 1) = x2i; + data_i += 8; + + *data_i = x1r; + *(data_i + 1) = x1i; + data_i += 8; + + *data_i = x3i; + *(data_i + 1) = x3r; + data_i += 8; } - nodespacing >>= 2; - del <<= 2; - in_loop_cnt >>= 2; + data_r -= 62; + data_i -= 62; } - - for (i = 0; i < 2 * nlength; i += 2) { - fin_re[i] = y[i]; - fin_im[i] = y[i + 1]; + { + const FLOAT32 *twiddles = ptr_w; + FLOAT32 x0r, x0i, x1r, x1i; + for (j = 8; j != 0; j--) { + FLOAT32 W1 = *twiddles; + twiddles++; + FLOAT32 W4 = *twiddles; + twiddles++; + FLOAT32 tmp; + + x0r = *ptr_y; + x0i = *(ptr_y + 1); + ptr_y += 32; + ptr_xr += 32; + + x1r = *ptr_y; + x1i = *(ptr_y + 1); + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W1) - + mult32X32float((FLOAT32)x1i, W4)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, W4), + (FLOAT32)x1i, W1); + x1r = tmp; + + *ptr_xr = (x0r) - (x1r); + *(ptr_xr + 1) = (x0i) - (x1i); + ptr_y -= 32; + ptr_xr -= 32; + + *ptr_xr = (x0r) + (x1r); + *(ptr_xr + 1) = (x0i) + (x1i); + ptr_y += 2; + ptr_xr += 2; + + x0r = *ptr_z; + x0i = *(ptr_z + 1); + ptr_z += 32; + ptr_xi += 32; + + x1r = *ptr_z; + x1i = *(ptr_z + 1); + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W1) - + mult32X32float((FLOAT32)x1i, W4)); + x1i = (FLOAT32)mac32X32float(mult32X32float((FLOAT32)x1r, W4), + (FLOAT32)x1i, W1); + x1r = tmp; + + *ptr_xi = (x0r) - (x1r); + *(ptr_xi + 1) = (x0i) - (x1i); + ptr_z -= 32; + ptr_xi -= 32; + + *ptr_xi = (x0r) + (x1r); + *(ptr_xi + 1) = (x0i) + (x1i); + ptr_z += 2; + ptr_xi += 2; + } + twiddles = ptr_w; + for (j = 8; j != 0; j--) { + FLOAT32 W1 = *twiddles; + twiddles++; + FLOAT32 W4 = *twiddles; + twiddles++; + FLOAT32 tmp; + + x0r = *ptr_y; + x0i = *(ptr_y + 1); + ptr_y += 32; + ptr_xr += 32; + + x1r = *ptr_y; + x1i = *(ptr_y + 1); + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W4) + + mult32X32float((FLOAT32)x1i, W1)); + x1i = (FLOAT32)(-mult32X32float((FLOAT32)x1r, W1) + + mult32X32float((FLOAT32)x1i, W4)); + x1r = tmp; + + *ptr_xr = (x0r) - (x1r); + *(ptr_xr + 1) = (x0i) - (x1i); + ptr_y -= 32; + ptr_xr -= 32; + + *ptr_xr = (x0r) + (x1r); + *(ptr_xr + 1) = (x0i) + (x1i); + ptr_y += 2; + ptr_xr += 2; + + x0r = *ptr_z; + x0i = *(ptr_z + 1); + ptr_z += 32; + ptr_xi += 32; + + x1r = *ptr_z; + x1i = *(ptr_z + 1); + + tmp = (FLOAT32)(mult32X32float((FLOAT32)x1r, W4) + + mult32X32float((FLOAT32)x1i, W1)); + x1i = (FLOAT32)(-mult32X32float((FLOAT32)x1r, W1) + + mult32X32float((FLOAT32)x1i, W4)); + x1r = tmp; + + *ptr_xi = (x0r) - (x1r); + *(ptr_xi + 1) = (x0i) - (x1i); + ptr_z -= 32; + ptr_xi -= 32; + + *ptr_xi = (x0r) + (x1r); + *(ptr_xi + 1) = (x0i) + (x1i); + ptr_z += 2; + ptr_xi += 2; + } } - - return; } VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength, @@ -1715,13 +2044,6 @@ VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength, if (fft_mode < 0) { for (i = 0; i < nlength; i += 3) { - tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)), - ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i))); - ptr_x[2 * i + 1] = - ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)), - ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r))); - ptr_x[2 * i] = tmp; - w1r++; w1i++; @@ -1749,13 +2071,6 @@ VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength, else { for (i = 0; i < nlength; i += 3) { - tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)), - ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i))); - ptr_x[2 * i + 1] = - ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)), - ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i))); - ptr_x[2 * i] = tmp; - w1r++; w1i++; @@ -1789,20 +2104,16 @@ VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength, ptr_y = ptr_y + 6; } + ptr_y = y; for (i = 0; i < mpass; i++) { - xr[i] = y[6 * i]; - xi[i] = y[6 * i + 1]; - } - - for (i = 0; i < mpass; i++) { - xr[mpass + i] = y[6 * i + 2]; - xi[mpass + i] = y[6 * i + 3]; + xr[i] = *ptr_y++; + xi[i] = *ptr_y++; + xr[mpass + i] = *ptr_y++; + xi[mpass + i] = *ptr_y++; + xr[2 * mpass + i] = *ptr_y++; + xi[2 * mpass + i] = *ptr_y++; } - for (i = 0; i < mpass; i++) { - xr[2 * mpass + i] = y[6 * i + 4]; - xi[2 * mpass + i] = y[6 * i + 5]; - } return; } diff --git a/decoder/ixheaacd_function_selector.h b/decoder/ixheaacd_function_selector.h index daa5aac..b2882f8 100644 --- a/decoder/ixheaacd_function_selector.h +++ b/decoder/ixheaacd_function_selector.h @@ -61,7 +61,7 @@ extern VOID (*ixheaacd_covariance_matrix_calc)(WORD32 *, WORD32); extern VOID (*ixheaacd_covariance_matrix_calc_2)( ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32, WORD16); -extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD16 *, +extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16); extern VOID (*ixheaacd_over_lap_add2)(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16); @@ -119,19 +119,19 @@ extern WORD32 (*ixheaacd_calc_max_spectral_line)(WORD32 *, WORD32); extern VOID (*ixheaacd_post_twiddle)(WORD32[], WORD32[], ia_aac_dec_imdct_tables_struct *, WORD); -extern VOID (*ixheaacd_post_twid_overlap_add)(WORD16[], WORD32[], +extern VOID (*ixheaacd_post_twid_overlap_add)(WORD32[], WORD32[], ia_aac_dec_imdct_tables_struct *, WORD, WORD32 *, WORD16, const WORD16 *, WORD16); -extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD16 *, WORD16, WORD16); +extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD32 *, WORD16, WORD16); extern VOID (*ixheaacd_spec_to_overlapbuf)(WORD32 *, WORD32 *, WORD32, WORD32); -extern VOID (*ixheaacd_overlap_buf_out)(WORD16 *, WORD32 *, WORD32, +extern VOID (*ixheaacd_overlap_buf_out)(WORD32 *, WORD32 *, WORD32, const WORD16); -extern VOID (*ixheaacd_overlap_out_copy)(WORD16 *, WORD32 *, WORD32 *, +extern VOID (*ixheaacd_overlap_out_copy)(WORD32 *, WORD32 *, WORD32 *, const WORD16); extern VOID (*ixheaacd_pretwiddle_compute)(WORD32 *, WORD32 *, WORD32 *, @@ -144,19 +144,6 @@ extern VOID (*ixheaacd_imdct_using_fft)(ia_aac_dec_imdct_tables_struct *, extern VOID (*ixheaacd_complex_fft_p2)(WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift); -extern VOID (*ixheaacd_mps_complex_fft_64)(WORD32 *ptr_x, WORD32 *fin_re, - WORD32 *fin_im, WORD32 nlength); - -extern VOID (*ixheaacd_mps_synt_pre_twiddle)(WORD32 *ptr_in, - const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution); - -extern VOID (*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in, - const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution); - extern VOID (*ixheaacd_calc_pre_twid)(WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, @@ -167,12 +154,9 @@ extern VOID (*ixheaacd_calc_post_twid)(WORD32 *ptr_x, WORD32 *r_ptr, const WORD32 *cos_ptr, const WORD32 *sin_ptr); -extern VOID (*ixheaacd_mps_synt_post_fft_twiddle)( - WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, WORD32 *state); -extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, WORD32 *out, - WORD32 *state, - const WORD32 *filter_coeff); +extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, FLOAT32 *out, + FLOAT32 *state, + const FLOAT32 *filter_coeff); extern VOID (*ixheaacd_fft_15_ld)(WORD32 *inp, WORD32 *op, WORD32 *fft3out, UWORD8 *re_arr_tab_sml_240_ptr); diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c index 356cf08..2c38ec6 100644 --- a/decoder/ixheaacd_headerdecode.c +++ b/decoder/ixheaacd_headerdecode.c @@ -490,6 +490,7 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, WORD32 cnt_bits = it_bit_buff->cnt_bits; WORD32 dummy = 0; UWORD32 aot_init; + UWORD32 tmp_aot; ia_audio_specific_config_struct *pstr_audio_specific_config; @@ -506,14 +507,20 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, aot_init = aac_state_struct->audio_object_type; - aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5); + tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5); - if (aac_state_struct->audio_object_type == 31) { + if (tmp_aot == 31) { tmp = ixheaacd_read_bits_buf(it_bit_buff, 6); - aac_state_struct->audio_object_type = 32 + tmp; + tmp_aot = 32 + tmp; } + + if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) { + if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS) + return IA_FATAL_ERROR; + } + pstr_audio_specific_config->audio_object_type = - aac_state_struct->audio_object_type; + aac_state_struct->audio_object_type = tmp_aot; tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info, pstr_audio_specific_config); diff --git a/decoder/ixheaacd_interface.h b/decoder/ixheaacd_interface.h index 4a9c263..3dde0c3 100644 --- a/decoder/ixheaacd_interface.h +++ b/decoder/ixheaacd_interface.h @@ -55,8 +55,7 @@ VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength, VOID ixheaacd_complex_fft_p2_armv7(WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift); -VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re, - WORD32 *fin_im, WORD32 nlength); +VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 nPass); VOID ixheaacd_mps_complex_fft_64_armv7(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, WORD32 nlength); @@ -71,18 +70,10 @@ VOID ixheaacd_complex_ifft_p2_asm(const WORD32 *table, WORD32 nlength, VOID ixheaacd_complex_fft_p2_asm(const WORD32 *table, WORD32 nlength, WORD32 *ptr_x, WORD32 *ptr_y); -VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution); - VOID ixheaacd_mps_synt_pre_twiddle_armv7(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution); -VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution); - VOID ixheaacd_mps_synt_post_twiddle_armv7(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, @@ -104,20 +95,9 @@ VOID ixheaacd_calc_post_twid_armv7(WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr); -VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, - const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state); - -VOID ixheaacd_mps_synt_post_fft_twiddle_armv7(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, - const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state); - -VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out, - WORD32 *state, const WORD32 *filter_coeff); +VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out, + FLOAT32 *state, + const FLOAT32 *filter_coeff); VOID ixheaacd_mps_synt_out_calc_armv7(WORD32 resolution, WORD32 *out, WORD32 *state, diff --git a/decoder/ixheaacd_lpfuncs.c b/decoder/ixheaacd_lpfuncs.c index 44433a0..c2828bf 100644 --- a/decoder/ixheaacd_lpfuncs.c +++ b/decoder/ixheaacd_lpfuncs.c @@ -120,14 +120,14 @@ static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_drc(WORD32 a, WORD16 b) { return (result); } -VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, +VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD32 *out, const WORD16 *window_long, const WORD16 *window_short, WORD16 q_shift, WORD16 ch_fac, WORD16 flag) { WORD32 i, accu; WORD32 *coef_1; const WORD16 *temp_win_sh, *temp_win_long; - WORD16 *out1, *out2; + WORD32 *out1, *out2; WORD32 *temp_prev; if (flag == 1) { @@ -137,13 +137,13 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, (q_shift + 1)); accu = ixheaacd_add32_sat(temp1, ((WORD32)prev[i] << 16)); - out[ch_fac * i] = ixheaacd_round16(accu << 1); + out[ch_fac * i] = accu; accu = ixheaacd_shl32_dir_sat_limit( ixheaacd_mult32x16in32(-(coef[SIZE15 - 1 - i]), window_long[2 * (SIZE07 - i) - 1]), q_shift); - out[ch_fac * (i + SIZE09)] = ixheaacd_round16(accu << 2); + out[ch_fac * (i + SIZE09)] = (accu << 1); } temp_win_sh = &(window_short[0]); @@ -158,14 +158,14 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, accu = ixheaacd_mult32x16in32_drc( prev[SIZE08 - 1 - i], ixheaacd_negate16(window_long[2 * i + 1])); - out[ch_fac * i] = ixheaacd_round16(accu << 2); + out[ch_fac * i] = accu; accu = ixheaacd_sub32_sat( ixheaacd_shl32_dir_sat_limit(-(coef[SIZE15 - 1 - i]), (q_shift - 1)), ixheaacd_mult32x16in32_drc(prev[i + SIZE01], window_long[2 * SIZE07 - 2 - 2 * i])); - out[ch_fac * (SIZE09 + i)] = ixheaacd_round16(accu << 2); + out[ch_fac * (SIZE09 + i)] = accu; } temp_win_sh = &(window_long[SIZE14]); @@ -187,7 +187,7 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, ixheaacd_shl32_dir_sat_limit(ixheaacd_mult32x16in32(temp_coef, win1), q_shift), ixheaacd_mult32x16in32_drc(prev1, win3)); - *out1 = ixheaacd_round16(accu << 2); + *out1 = accu << flag; out1 += ch_fac; accu = ixheaacd_sub32_sat( @@ -195,13 +195,13 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, ixheaacd_mult32x16in32(ixheaacd_negate32_sat(temp_coef), win2), q_shift), ixheaacd_mult32x16in32_drc(prev1, win4)); - *out2 = ixheaacd_round16(accu << 2); + *out2 = accu << flag; out2 -= ch_fac; } } static PLATFORM_INLINE VOID ixheaacd_long_short_win_process( - WORD32 *current, WORD32 *prev, WORD16 *out, const WORD16 *short_window, + WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window, const WORD16 *long_window_prev, WORD16 q_shift, WORD16 ch_fac, WORD32 flag) { WORD i; @@ -220,7 +220,7 @@ static PLATFORM_INLINE VOID ixheaacd_long_short_win_process( ixheaacd_mult32x16in32(tmp2_cur, short1)), q_shift), ixheaacd_mult32x16in32_drc(prev[i], long_window_prev[0 - 2 - 2 * i])); - out[ch_fac * (0 + i)] = ixheaacd_round16(accu << 2); + out[ch_fac * (0 + i)] = accu; if (flag) { accu = ixheaacd_sub32_sat( @@ -230,12 +230,12 @@ static PLATFORM_INLINE VOID ixheaacd_long_short_win_process( q_shift), ixheaacd_mult32x16in32_drc(prev[SIZE02 - 1 - i], long_window_prev[-2 * SIZE02 + 2 * i])); - out[ch_fac * (SIZE02 - 1 - i)] = ixheaacd_round16(accu << 2); + out[ch_fac * (SIZE02 - 1 - i)] = accu; } } } -VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out, +VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window, const WORD16 *short_window_prev, const WORD16 *long_window_prev, WORD16 q_shift, @@ -245,7 +245,7 @@ VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out, for (i = 0; i < SIZE07; i++) { accu = ixheaacd_mult32x16in32_drc( prev[SIZE08 - 1 - i], ixheaacd_negate16(long_window_prev[2 * i + 1])); - out[ch_fac * i] = ixheaacd_round16(accu << 2); + out[ch_fac * i] = accu; } for (i = 0; i < SIZE01; i++) { @@ -256,7 +256,7 @@ VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out, q_shift), ixheaacd_mult32x16in32_drc(prev[SIZE01 - 1 - i], long_window_prev[2 * SIZE07 + 1 + 2 * i])); - out[ch_fac * (SIZE07 + i)] = ixheaacd_round16(accu << 2); + out[ch_fac * (SIZE07 + i)] = accu; } for (i = 0; i < SIZE01; i++) { @@ -267,7 +267,7 @@ VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out, q_shift), ixheaacd_mult32x16in32_drc(prev[i], long_window_prev[SIZE16 - 2 - (2 * i)])); - out[ch_fac * (SIZE08 + i)] = ixheaacd_round16(accu << 2); + out[ch_fac * (SIZE08 + i)] = accu; } flag = 1; @@ -307,12 +307,11 @@ VOID ixheaacd_nolap1_32(WORD32 *coef, } } -VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift, +VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) { WORD32 i; - for (i = 0; i < SIZE07; i++) { - out[ch_fac * i] = ixheaacd_round16(ixheaacd_shl32_dir_sat_limit( + out[ch_fac * i] = (ixheaacd_shl32_dir_sat_limit( ixheaacd_negate32_sat(coef[SIZE07 - 1 - i]), q_shift)); } } @@ -326,33 +325,34 @@ VOID ixheaacd_spec_to_overlapbuf_dec(WORD32 *ptr_overlap_buf, } } -VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf, +VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) { WORD32 i; for (i = 0; i < size; i++) { - out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1); + out_samples[ch_fac * i] = + (ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15)); } } -VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf, +VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac) { WORD32 i; for (i = 0; i < SIZE01; i++) { - out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1); + out_samples[ch_fac * i] = + ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15); ptr_overlap_buf[i] = ptr_overlap_buf1[i]; } } VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, WORD32 *ptr_spec_coeff, - ia_ics_info_struct *ptr_ics_info, - WORD16 out_samples[], const WORD16 ch_fac, - WORD32 *scratch, + ia_ics_info_struct *ptr_ics_info, VOID *out_samples, + const WORD16 ch_fac, WORD32 *scratch, ia_aac_dec_tables_struct *ptr_aac_tables, - WORD32 object_type) { + WORD32 object_type, WORD slot_element) { WORD32 *ptr_overlap_buf; const WORD16 *ptr_long_window; const WORD16 *ptr_short_window; @@ -371,6 +371,8 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, if ((512 == ptr_ics_info->frame_length) || (480 == ptr_ics_info->frame_length)) { + ptr_ics_info->qshift_adj = -2; + if (512 == ptr_ics_info->frame_length) { WORD32 *ld_cos_sin_ptr = (WORD32 *)ptr_aac_tables->pstr_imdct_tables->cosine_array_1024; @@ -415,10 +417,13 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, if (1024 == ptr_ics_info->frame_length) { ia_ics_info_struct *tmp_ptr_ics_info = ptr_ics_info; + (*ixheaacd_post_twid_overlap_add)( - out_samples, ptr_spec_coeff, + (WORD32 *)out_samples, ptr_spec_coeff, ptr_aac_tables->pstr_imdct_tables, 1024, ptr_overlap_buf, q_shift, ptr_long_window, ch_fac); + + ptr_ics_info->qshift_adj = 2; ptr_ics_info = tmp_ptr_ics_info; } if ((512 == ptr_ics_info->frame_length) || @@ -426,21 +431,24 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, if (object_type != AOT_ER_AAC_ELD) { if (512 == ptr_ics_info->frame_length) { ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf, - out_samples, ptr_long_window, q_shift, - SIZE04, ch_fac); + (WORD16 *)out_samples, ptr_long_window, + q_shift, SIZE04, ch_fac, slot_element); ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff, q_shift, SIZE04); } else if (480 == ptr_ics_info->frame_length) { ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf, - out_samples, ptr_long_window, q_shift, - 240, ch_fac); + (WORD16 *)out_samples, ptr_long_window, + q_shift, 240, ch_fac, slot_element); ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff, q_shift, 240); } } else { - ixheaacd_eld_dec_windowing( - ptr_spec_coeff, ptr_long_window, ptr_ics_info->frame_length, - q_shift, ptr_overlap_buf, ch_fac, out_samples); + ixheaacd_eld_dec_windowing(ptr_spec_coeff, ptr_long_window, + ptr_ics_info->frame_length, q_shift, + ptr_overlap_buf, ch_fac, + (WORD16 *)out_samples, slot_element); + + ptr_ics_info->qshift_adj = -2; } } break; @@ -452,9 +460,10 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, ptr_aac_tables->pstr_imdct_tables, 1024); } - ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples, - ptr_long_window, ptr_short_window, q_shift, - ch_fac, 1); + ixheaacd_process_win_seq(scratch, ptr_overlap_buf, + (WORD32 *)out_samples, ptr_long_window, + ptr_short_window, q_shift, ch_fac, 1); + ptr_ics_info->qshift_adj = 1; if (512 == ptr_ics_info->frame_length) { ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff, @@ -480,17 +489,20 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, case ONLY_LONG_SEQUENCE: case LONG_STOP_SEQUENCE: - (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf, out_samples, - ptr_long_window, q_shift, SIZE08, ch_fac); + (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf, + (WORD32 *)out_samples, ptr_long_window, + q_shift, SIZE08, ch_fac); + ptr_ics_info->qshift_adj = 2; break; case LONG_START_SEQUENCE: case EIGHT_SHORT_SEQUENCE: - ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples, - ptr_long_window, ptr_short_window, q_shift, - ch_fac, 1); + ixheaacd_process_win_seq(scratch, ptr_overlap_buf, + (WORD32 *)out_samples, ptr_long_window, + ptr_short_window, q_shift, ch_fac, 1); + ptr_ics_info->qshift_adj = 1; break; } @@ -512,28 +524,32 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, case EIGHT_SHORT_SEQUENCE: case LONG_START_SEQUENCE: - (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07, - ch_fac); + (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf, + SIZE07, ch_fac); (*ixheaacd_over_lap_add1)( &scratch[SIZE14], &ptr_overlap_buf[SIZE07], - &out_samples[ch_fac * (SIZE07)], ptr_short_window, q_shift, - SIZE01, ch_fac); + ((WORD32 *)out_samples + ch_fac * (SIZE07)), ptr_short_window, + q_shift, SIZE01, ch_fac); { - WORD16 q_shift1 = q_shift + 1; - (*ixheaacd_neg_shift_spec)(&scratch[SIZE08], - &out_samples[ch_fac * SIZE09], - q_shift1, ch_fac); + WORD16 q_shift1 = q_shift - 1; + + (*ixheaacd_neg_shift_spec)( + &scratch[SIZE08], ((WORD32 *)out_samples + ch_fac * SIZE09), + q_shift1, ch_fac); } + ptr_ics_info->qshift_adj = 2; break; case ONLY_LONG_SEQUENCE: case LONG_STOP_SEQUENCE: - ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples, - ptr_long_window, ptr_short_window, q_shift, - ch_fac, 0); + ixheaacd_process_win_seq(scratch, ptr_overlap_buf, + (WORD32 *)out_samples, ptr_long_window, + ptr_short_window, q_shift, ch_fac, 0); + + ptr_ics_info->qshift_adj = 2; break; } @@ -579,11 +595,11 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, case EIGHT_SHORT_SEQUENCE: case LONG_START_SEQUENCE: - (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07, - ch_fac); + (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf, + SIZE07, ch_fac); (*ixheaacd_over_lap_add1)(&scratch[0], &ptr_overlap_buf[SIZE07], - &out_samples[ch_fac * SIZE07], + ((WORD32 *)out_samples + ch_fac * SIZE07), ptr_short_window, q_shift, SIZE01, ch_fac); for (i = 0; i < 3; i++) { @@ -591,27 +607,32 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &scratch[inc], q_shift, SIZE01); - (*ixheaacd_over_lap_add1)(&scratch[SIZE02 + inc], overlap_buf_loc, - &out_samples[ch_fac * (SIZE09 + inc)], - short_window, q_shift, SIZE01, ch_fac); + (*ixheaacd_over_lap_add1)( + &scratch[SIZE02 + inc], overlap_buf_loc, + ((WORD32 *)out_samples + ch_fac * (SIZE09 + inc)), short_window, + q_shift, SIZE01, ch_fac); } (*ixheaacd_over_lap_add2)(&scratch[SIZE08], &scratch[SIZE06], ptr_overlap_buf, short_window, q_shift, SIZE01, 1); - (*ixheaacd_overlap_out_copy)(&out_samples[ch_fac * SIZE15], + (*ixheaacd_overlap_out_copy)(((WORD32 *)out_samples + ch_fac * SIZE15), ptr_overlap_buf, &ptr_overlap_buf[SIZE01], ch_fac); + ptr_ics_info->qshift_adj = 2; + break; case ONLY_LONG_SEQUENCE: case LONG_STOP_SEQUENCE: - ixheaacd_long_short_win_seq(scratch, ptr_overlap_buf, out_samples, - short_window, ptr_short_window, - ptr_long_window, q_shift, ch_fac); + ixheaacd_long_short_win_seq( + scratch, ptr_overlap_buf, (WORD32 *)out_samples, short_window, + ptr_short_window, ptr_long_window, q_shift, ch_fac); + + ptr_ics_info->qshift_adj = 2; break; } @@ -633,7 +654,7 @@ VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info, void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *p_win, WORD32 framesize, WORD16 q_shift, WORD32 *p_overlap_buffer, const WORD16 stride, - WORD16 *out_samples) + VOID *out_samples_t, WORD slot_element) { int i = 0; @@ -644,6 +665,8 @@ void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *p_win, WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer; WORD32 delay = framesize >> 2; + WORD16 *out_samples = (WORD16 *)out_samples_t - slot_element; + ptr_z = ptr_spect_coeff + delay; p_win += delay; ptr_out = p_overlap_buffer32; diff --git a/decoder/ixheaacd_lt_predict.c b/decoder/ixheaacd_lt_predict.c index 83fc9cc..9f5b852 100644 --- a/decoder/ixheaacd_lt_predict.c +++ b/decoder/ixheaacd_lt_predict.c @@ -396,15 +396,18 @@ VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr, } } -VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time, +VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, void *time_t, WORD32 *overlap, WORD32 frame_len, WORD32 object_type, WORD32 stride, - WORD16 window_sequence, WORD16 *p_window_next) { + WORD16 window_sequence, WORD16 *p_window_next, + WORD slot_element) { WORD32 i; + if (object_type == AOT_ER_AAC_LD) { WORD16 *ptr_ltp_state0 = <_pred_stat[0]; WORD16 *ptr_ltp_state_fl = <_pred_stat[frame_len + 0]; WORD16 *ptr_ltp_state_2fl = <_pred_stat[(frame_len * 2) + 0]; + WORD16 *time = (WORD16 *)time_t - slot_element; WORD16 *ptr_time_in = &time[0 * stride]; for (i = 0; i < frame_len; i++) { @@ -417,11 +420,15 @@ VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time, } else { WORD16 *ptr_ltp_state0 = <_pred_stat[0]; WORD16 *ptr_ltp_state_fl = <_pred_stat[frame_len + 0]; - WORD16 *ptr_time_in = &time[0 * stride]; + WORD32 *time = (WORD32 *)time_t; + WORD32 *ptr_time_in = &time[0 * stride]; + + time = (WORD32 *)time_t; for (i = 0; i < frame_len; i++) { *ptr_ltp_state0++ = *ptr_ltp_state_fl; - *ptr_ltp_state_fl++ = *ptr_time_in; + *ptr_ltp_state_fl++ = + ixheaacd_round16(ixheaacd_shl32_sat(*ptr_time_in, 2)); ptr_time_in += stride; } } diff --git a/decoder/ixheaacd_lt_predict.h b/decoder/ixheaacd_lt_predict.h index 8e4fbfc..69a2a39 100644 --- a/decoder/ixheaacd_lt_predict.h +++ b/decoder/ixheaacd_lt_predict.h @@ -46,10 +46,10 @@ typedef struct { VOID ixheaacd_init_ltp_object(ltp_info *ltp); -VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time, - WORD32 *overlap, WORD32 frame_len, - WORD32 object_type, WORD32 stride, - WORD16 window_sequence, WORD16 *p_window_next); +VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, void *time, WORD32 *overlap, + WORD32 frame_len, WORD32 object_type, + WORD32 stride, WORD16 window_sequence, + WORD16 *p_window_next, WORD slot_element); VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr, WORD16 window_sequence, WORD16 win_shape, diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c index 98f6646..a5f9c11 100644 --- a/decoder/ixheaacd_mps_dec.c +++ b/decoder/ixheaacd_mps_dec.c @@ -69,8 +69,15 @@ #include "ixheaacd_mps_hybfilter.h" #include "ixheaacd_mps_nlc_dec.h" #include "ixheaacd_mps_huff_tab.h" + +#include "math.h" + +#include <assert.h> +#include <string.h> #include "ixheaacd_error_standards.h" +#define max(a, b) (((a) > (b)) ? (a) : (b)) + extern const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes; extern const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes; extern const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes; @@ -126,7 +133,7 @@ WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, if ((self->residual_coding) && (self->res_bands > 0)) ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]); - err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count, + err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count_max, self->config->bs_decorr_config); if (err_code != IA_NO_ERROR) return err_code; @@ -163,12 +170,12 @@ static const FLOAT32 ixheaacd_tsd_mul_im[] = { VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self) { ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0], - self->qmf_band_count, self->time_slots, + self->band_count[0], self->time_slots, self->hyb_in[0]); if ((self->residual_coding) && (self->res_bands > 0)) { ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[self->in_ch_count], - self->qmf_in[1], self->qmf_band_count, + self->qmf_in[1], self->band_count[1], self->time_slots, self->hyb_res); } } @@ -178,7 +185,7 @@ VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self) { for (ch = 0; ch < self->out_ch_count; ch++) { ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch], - self->qmf_band_count, self->time_slots, + self->band_count[0], self->time_slots, self->qmf_out_dir[ch]); } } @@ -209,7 +216,7 @@ VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self) { } ixheaacd_mps_decor_apply(&self->mps_decor, self->v[k], self->w_diff[k], - self->time_slots); + self->time_slots, NO_RES_BANDS); if (self->bs_tsd_enable) { for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) { @@ -235,7 +242,7 @@ VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self) { WORD32 ts, qs, row, indx; for (ts = 0; ts < self->time_slots; ts++) { - for (qs = 0; qs < self->hyb_band_count; qs++) { + for (qs = 0; qs < self->hyb_band_count_max; qs++) { indx = self->hyb_band_to_processing_band_table[qs]; for (row = 0; row < self->dir_sig_count; row++) { @@ -246,8 +253,8 @@ VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self) { for (row = self->dir_sig_count; row < (self->dir_sig_count + self->decor_sig_count); row++) { if (indx < self->res_bands) { - self->w_dir[row][ts][qs].re = self->hyb_res[ts][qs].re; - self->w_dir[row][ts][qs].im = self->hyb_res[ts][qs].im; + self->w_dir[row][ts][qs].re = self->hyb_res[qs][ts].re; + self->w_dir[row][ts][qs].im = self->hyb_res[qs][ts].im; } else { self->w_dir[row][ts][qs].re = 0.0f; self->w_dir[row][ts][qs].im = 0.0f; @@ -270,10 +277,54 @@ VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self) { } } +VOID ixheaacd_mps_mix_res_decor_residual_band(ia_mps_dec_state_struct* self) { + WORD32 ts, qs, indx; + for (qs = 0; qs < self->hyb_band_count_max; qs++) { + indx = self->hyb_band_to_processing_band_table[qs]; + if (indx >= self->res_bands) { + if (qs < self->hyb_band_count[1]) { + for (ts = 0; ts < self->time_slots; ts++) { + self->w_dir[1][ts][qs].re = 0.0f; + self->w_dir[1][ts][qs].im = 0.0f; + } + } + } else { + for (ts = 0; ts < self->time_slots; ts++) { + self->w_diff[1][ts][qs].re = 0.0f; + self->w_diff[1][ts][qs].im = 0.0f; + } + } + } +} + VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) { ixheaacd_mps_decor(self); ixheaacd_mps_mix_res_decor(self); } + +VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self) { + ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix( + &self->hyb_filt_state[0], self->qmf_in[0], self->band_count[0], + self->time_slots, self->w_dir[0]); + + if (self->res_bands) { + ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix( + &self->hyb_filt_state[1], self->qmf_in[1], self->band_count[1], + self->time_slots, self->w_dir[1]); + + if (self->res_bands != 28) { + ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0], + self->w_diff[1], self->time_slots, + self->res_bands); + + ixheaacd_mps_mix_res_decor_residual_band(self); + } + } else { + ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0], self->w_diff[1], + self->time_slots, NO_RES_BANDS); + } +} + WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, FLOAT32** input_buffer[4], FLOAT32 (*output_buffer)[4096]) { @@ -281,43 +332,56 @@ WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, WORD32 time_slots = self->time_slots; WORD32 in_ch_count = self->in_ch_count + self->res_ch_count; WORD32 err = 0; - + self->hyb_band_count[0] = self->band_count[0] - QMF_BANDS_TO_HYBRID + 10; + self->hyb_band_count[1] = self->band_count[1] - QMF_BANDS_TO_HYBRID + 10; + self->hyb_band_count_max = + max(self->hyb_band_count[0], self->hyb_band_count[1]); + self->mps_decor.decor_nrg_smooth.num_bins = self->hyb_band_count_max; + self->mps_decor.num_bins = self->hyb_band_count_max; self->output_buffer = output_buffer; - assert(self->present_time_slot + time_slots <= self->time_slots); + err = ixheaacd_mps_frame_decode(self); + + if (err != 0) return err; + + ixheaacd_pre_and_mix_matrix_calculation(self); - for (ts = 0; ts < time_slots; ts++) { - for (ch = 0; ch < in_ch_count; ch++) { - for (qs = 0; qs < self->qmf_band_count; qs++) { - self->qmf_in[ch][self->present_time_slot + ts][qs].re = + ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self); + + for (ch = 0; ch < in_ch_count; ch++) { + for (ts = 0; ts < time_slots; ts++) { + for (qs = 0; qs < self->band_count[ch]; qs++) { + self->qmf_in[ch][qs][ts].re = self->input_gain * input_buffer[2 * ch][ts][qs]; - self->qmf_in[ch][self->present_time_slot + ts][qs].im = + self->qmf_in[ch][qs][ts].im = self->input_gain * input_buffer[2 * ch + 1][ts][qs]; } } } - self->present_time_slot += time_slots; - - if (self->present_time_slot < self->time_slots) return 0; + if (!(self->pre_mix_req | self->bs_tsd_enable)) { + ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(self); + } else { + ixheaacd_mps_qmf_hyb_analysis(self); - self->present_time_slot = 0; + err = ixheaacd_mps_apply_pre_matrix(self); - err = ixheaacd_mps_frame_decode(self); + if (err < 0) return err; - if (err != 0) return err; - ixheaacd_mps_qmf_hyb_analysis(self); - - ixheaacd_pre_and_mix_matrix_calculation(self); + ixheaacd_mps_create_w(self); + } - ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self); + if ((!(self->res_bands | self->pre_mix_req)) && + (self->config->bs_phase_coding == 0)) { + err = ixheaacd_mps_apply_mix_matrix_type1(self); - err = ixheaacd_mps_apply_pre_matrix(self); - if (err < 0) return err; + } else if (self->pre_mix_req) { + err = ixheaacd_mps_apply_mix_matrix_type2(self); - ixheaacd_mps_create_w(self); + } else { + err = ixheaacd_mps_apply_mix_matrix_type3(self); + } - err = ixheaacd_mps_apply_mix_matrix(self); if (err < 0) return err; if (self->config->bs_temp_shape_config == 2) { diff --git a/decoder/ixheaacd_mps_dec.h b/decoder/ixheaacd_mps_dec.h index 845b723..55f98bd 100644 --- a/decoder/ixheaacd_mps_dec.h +++ b/decoder/ixheaacd_mps_dec.h @@ -38,6 +38,8 @@ #define MAX_DECORR_FIL_ORDER (DECORR_FILT_0_ORD) +#define NO_RES_BANDS -1 + typedef struct { FLOAT32 re; FLOAT32 im; @@ -107,7 +109,7 @@ typedef struct ia_mps_decor_struct { typedef struct ia_mps_hybrid_filt_struct { ia_cmplx_flt_struct hf_buffer[MAX_NUM_QMF_BANDS_MPS][BUFFER_LEN_HF_MPS]; - ia_cmplx_w32_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS]; + ia_cmplx_flt_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS]; } ia_mps_hybrid_filt_struct; typedef struct ia_mps_data_struct { @@ -151,7 +153,7 @@ typedef struct ia_mps_bs_frame { typedef struct ia_mps_smoothing_struct { WORD32 prev_smg_time; - WORD32 inv_prev_smg_time; + FLOAT32 inv_prev_smg_time; WORD32 prev_smg_data[MAX_PARAMETER_BANDS]; } ia_mps_smoothing_struct; @@ -188,18 +190,18 @@ typedef struct ia_mps_dec_state_struct { WORD32 decor_sig_count; WORD32 time_slots; - WORD32 present_time_slot; - WORD32 frame_len; - + WORD32 pre_mix_req; WORD32 temp_shape_enable_ch_stp[2]; WORD32 temp_shape_enable_ch_ges[2]; FLOAT32 env_shape_data[2][MAX_TIME_SLOTS]; WORD8 parse_nxt_frame; - + WORD32 band_count[MAX_M1_INPUT]; + WORD32 synth_count; WORD32 qmf_band_count; - WORD32 hyb_band_count; + WORD32 hyb_band_count[MAX_M1_INPUT]; + WORD32 hyb_band_count_max; const WORD32 *hyb_band_to_processing_band_table; WORD32 res_ch_count; @@ -226,7 +228,7 @@ typedef struct ia_mps_dec_state_struct { ia_mps_bs_frame bs_frame; WORD32 smoothing_time[MAX_PARAMETER_SETS_MPS]; - WORD32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS]; + FLOAT32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS]; WORD32 smoothing_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; WORD32 bs_tsd_enable; @@ -248,32 +250,29 @@ typedef struct ia_mps_dec_state_struct { FLOAT32 phase_l_prev[MAX_PARAMETER_BANDS]; FLOAT32 phase_r_prev[MAX_PARAMETER_BANDS]; - WORD32 phase_l_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; - WORD32 phase_r_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS]; - - WORD32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - WORD32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - WORD32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - WORD32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - WORD32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - WORD32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT]; - - WORD32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - WORD32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - WORD32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - WORD32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - WORD32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - WORD32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; - - ia_cmplx_flt_struct qmf_in[2][MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW]; - ia_cmplx_flt_struct hyb_in[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; - ia_cmplx_flt_struct hyb_res[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; + FLOAT32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + FLOAT32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + FLOAT32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + FLOAT32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + FLOAT32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + FLOAT32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT]; + + FLOAT32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + FLOAT32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + FLOAT32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + FLOAT32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + FLOAT32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + FLOAT32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT]; + + ia_cmplx_flt_struct qmf_in[2][MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS]; + ia_cmplx_flt_struct hyb_in[2][MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]; + ia_cmplx_flt_struct hyb_res[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]; ia_cmplx_flt_struct v[MAX_M1_OUTPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]; ia_cmplx_flt_struct w_diff[MAX_M2_INPUT][MAX_TIME_SLOTS] [MAX_HYBRID_BANDS_MPS]; @@ -297,7 +296,7 @@ typedef struct ia_mps_dec_state_struct { WORD32 bs_high_rate_mode; - WORD32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC]; + FLOAT32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC]; FLOAT32 r_out_re_in_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] [MAX_M_INPUT]; @@ -340,11 +339,9 @@ typedef struct ia_mps_dec_state_struct { VOID ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct *self); VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self); WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self); -WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self); - -VOID ixheaacd_mps_config(ia_mps_dec_state_struct *self, WORD32 frame_len, - WORD32 residual_coding, - ia_usac_dec_mps_config_struct *mps212_config); +WORD32 ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self); +WORD32 ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self); +WORD32 ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self); WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self); @@ -359,25 +356,33 @@ VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self); WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct *self); VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self, - ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real, + ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real, WORD32 param_set_idx); - VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self, ia_mps_bs_frame *curr_bit_stream, - WORD32 *h_real, WORD32 param_set_idx); + FLOAT32 *h_real, WORD32 param_set_idx); VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, - ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag, - WORD32 *h_real, WORD32 param_set_idx, - WORD32 res_bands); - -WORD32 ixheaacd_mps_upmix_interp( - WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT], - WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT], - WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], - WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self); + ia_mps_bs_frame *curr_bit_stream, + FLOAT32 *h_imag, FLOAT32 *h_real, + WORD32 param_set_idx, WORD32 res_bands); + +WORD32 ixheaacd_mps_upmix_interp_type1( + FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], + WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self, + WORD32 bs_high_rate_mode); + +WORD32 ixheaacd_mps_upmix_interp_type2( + FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], + WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col); VOID ixheaacd_mps_phase_interpolation( FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], diff --git a/decoder/ixheaacd_mps_decor.h b/decoder/ixheaacd_mps_decor.h index 4f856f5..8153681 100644 --- a/decoder/ixheaacd_mps_decor.h +++ b/decoder/ixheaacd_mps_decor.h @@ -30,6 +30,6 @@ VOID ixheaacd_mps_decor_apply( ia_mps_decor_struct_handle self, ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], - WORD32 length); + WORD32 length, WORD32 res_bands); #endif diff --git a/decoder/ixheaacd_mps_decorr.c b/decoder/ixheaacd_mps_decorr.c index 33b6aa5..b2acb26 100644 --- a/decoder/ixheaacd_mps_decorr.c +++ b/decoder/ixheaacd_mps_decorr.c @@ -44,6 +44,8 @@ static const WORD32 ixheaacd_qmf_split_freq_0[] = {3, 15, 24, 65}; static const WORD32 ixheaacd_qmf_split_freq_1[] = {3, 50, 65, 65}; static const WORD32 ixheaacd_qmf_split_freq_2[] = {0, 15, 65, 65}; +extern const WORD32 ixheaacd_mps_gain_set_indx[29]; + static const FLOAT32 ixheaacd_lattice_coeff_0_filt_den_coeff[DECORR_FILT_0_ORD + 1] = { 1.000000f, -0.314818f, -0.256828f, -0.173641f, -0.115077f, 0.000599f, @@ -141,19 +143,25 @@ static VOID ixheaacd_mps_decor_energy_adjustment( ixheaacd_mps_decor_energy_adjust_filt_struct *handle, ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], - WORD32 time_slots) { + WORD32 time_slots, WORD32 res_bands) { ixheaacd_mps_decor_energy_adjust_filt_struct *self = (ixheaacd_mps_decor_energy_adjust_filt_struct *)handle; FLOAT32 in_energy[MAX_PARAMETER_BANDS] = {0}; FLOAT32 out_energy[MAX_PARAMETER_BANDS] = {0}; FLOAT32 gain[MAX_PARAMETER_BANDS]; WORD32 i, j, k; + WORD32 start_param_band = 0, start_bin = 0; + + if (res_bands != NO_RES_BANDS) { + start_bin = ixheaacd_mps_gain_set_indx[res_bands]; + start_param_band = res_bands; + } for (i = 0; i < time_slots; i++) { memset(in_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS); memset(out_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS); - for (j = 0; j < self->num_bins; j++) { + for (j = start_bin; j < self->num_bins; j++) { k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j]; in_energy[k] += in[i][j].re * in[i][j].re + in[i][j].im * in[i][j].im; @@ -161,7 +169,7 @@ static VOID ixheaacd_mps_decor_energy_adjustment( out[i][j].re * out[i][j].re + out[i][j].im * out[i][j].im; } - for (k = 0; k < MAX_PARAMETER_BANDS; k++) { + for (k = start_param_band; k < MAX_PARAMETER_BANDS; k++) { self->smooth_in_energy[k] = self->smooth_in_energy[k] * DECOR_ALPHA + in_energy[k] * ONE_MINUS_DECOR_ALPHA; self->smooth_out_energy[k] = self->smooth_out_energy[k] * DECOR_ALPHA + @@ -184,7 +192,7 @@ static VOID ixheaacd_mps_decor_energy_adjustment( } } - for (j = 0; j < self->num_bins; j++) { + for (j = start_bin; j < self->num_bins; j++) { k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j]; out[i][j].re *= gain[k]; @@ -233,12 +241,14 @@ VOID ixheaacd_mps_decor_apply( ia_mps_decor_struct_handle self, ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], - WORD32 length) { - WORD32 idx, sb_sample; + WORD32 length, WORD32 res_bands) { + WORD32 idx, sb_sample, index = 0; ia_cmplx_flt_struct scratch[MAX_TIME_SLOTS]; - for (idx = 0; idx < self->num_bins; idx++) { + if (res_bands != NO_RES_BANDS) index = ixheaacd_mps_gain_set_indx[res_bands]; + + for (idx = index; idx < self->num_bins; idx++) { for (sb_sample = 0; sb_sample < length; sb_sample++) { self->decor_delay_buffer[idx][self->delay_sample_count[idx] + sb_sample] .re = in[sb_sample][idx].re; @@ -262,6 +272,6 @@ VOID ixheaacd_mps_decor_apply( } } - ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out, - length); + ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out, length, + res_bands); } diff --git a/decoder/ixheaacd_mps_hybfilter.h b/decoder/ixheaacd_mps_hybfilter.h index b0b8266..126dee2 100644 --- a/decoder/ixheaacd_mps_hybfilter.h +++ b/decoder/ixheaacd_mps_hybfilter.h @@ -24,9 +24,15 @@ VOID ixheaacd_mps_qmf_hybrid_analysis_init(ia_mps_hybrid_filt_struct *handle); VOID ixheaacd_mps_qmf_hybrid_analysis( ia_mps_hybrid_filt_struct *handle, - ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW], + ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], WORD32 num_bands, WORD32 num_samples, - ia_cmplx_flt_struct out_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]); + ia_cmplx_flt_struct out_hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]); + +VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix( + ia_mps_hybrid_filt_struct *handle, + ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], + WORD32 num_bands, WORD32 num_samples, + ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]); VOID ixheaacd_mps_qmf_hybrid_synthesis( ia_cmplx_flt_struct in_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], diff --git a/decoder/ixheaacd_mps_hybrid_filt.c b/decoder/ixheaacd_mps_hybrid_filt.c index 044f4b1..2c57ead 100644 --- a/decoder/ixheaacd_mps_hybrid_filt.c +++ b/decoder/ixheaacd_mps_hybrid_filt.c @@ -33,136 +33,177 @@ #include "ixheaacd_mps_hybfilter.h" -extern const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER]; -extern const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER]; -extern const WORD32 ixheaacd_cosine[8][13]; -extern const WORD32 ixheaacd_sine[8][13]; -extern const WORD32 ixheaacd_cosine2[2][13]; - -static WORD32 ixheaacd_mps_mult32_local(WORD32 a, WORD32 b, WORD16 shift) { - WORD64 temp; - - temp = (WORD64)a * (WORD64)b; - temp = temp >> shift; - return (WORD32)temp; -} +extern const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER]; +extern const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER]; + +extern const FLOAT32 ixheaacd_sine[8][8]; +extern const FLOAT32 ixheaacd_cosine[8][8]; static VOID ixheaacd_mps_hyb_filt_type1( - ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[8][MAX_TIME_SLOTS], - WORD32 num_samples, const WORD32 *filt_coeff) + ia_cmplx_flt_struct *input, ia_cmplx_flt_struct output[8][MAX_TIME_SLOTS], + WORD32 num_samples, const FLOAT32 *filt_coeff) { WORD32 i, n, q; - WORD32 modulation_fac_re, modulation_fac_im; - WORD32 in_re, in_im; - WORD32 temp; - WORD32 coeff; - WORD64 acc_re, acc_im; - - WORD16 shift = 8; + FLOAT32 in_re, in_im; + FLOAT32 coeff; + FLOAT32 acc_re_l, acc_re_h, acc_im_l, acc_im_h; for (i = 0; i < num_samples; i++) { - for (q = 0; q < 8; q++) { - acc_re = 0; - acc_im = 0; - for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) { - modulation_fac_re = ixheaacd_cosine[q][n]; - modulation_fac_im = ixheaacd_sine[q][n]; + FLOAT32 x0_re[13], x0_im[13], x0_1_re[8], x0_1_im[8]; + FLOAT32 acc_re_val[8], acc_im_val[8]; + for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) // x0 = x[n]*Cf[n] + { + in_re = input[n + i].re; + in_im = input[n + i].im; + + coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; + + x0_re[n] = coeff * in_re; + x0_im[n] = coeff * in_im; + } + + // x0_2 series + + x0_1_re[0] = x0_re[6]; + x0_1_im[0] = x0_im[6]; + + x0_1_re[1] = x0_re[7]; + x0_1_im[1] = x0_im[7]; + + x0_1_re[2] = x0_re[8] - x0_re[0]; + x0_1_im[2] = x0_im[8] - x0_im[0]; + + x0_1_re[3] = x0_re[9] - x0_re[1]; + x0_1_im[3] = x0_im[9] - x0_im[1]; - in_re = (WORD32)(input[n + i].re); - in_im = (WORD32)(input[n + i].im); + x0_1_re[4] = x0_re[10] - x0_re[2]; + x0_1_im[4] = x0_im[10] - x0_im[2]; - in_re = ixheaacd_shl32_sat(in_re, shift); - in_im = ixheaacd_shl32_sat(in_im, shift); + x0_1_re[5] = x0_re[11] - x0_re[3]; + x0_1_im[5] = x0_im[11] - x0_im[3]; - coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; + x0_1_re[6] = x0_re[12] - x0_re[4]; + x0_1_im[6] = x0_im[12] - x0_im[4]; - temp = ixheaacd_sub32_sat( - ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30), - ixheaacd_mps_mult32_local(in_im, modulation_fac_im, 30)); + x0_1_re[7] = -(x0_re[5]); + x0_1_im[7] = -(x0_im[5]); - if (temp >= 1073741823) - temp = 1073741823; - else if (temp <= -1073741824) - temp = -1073741824; + // acc_re_im_val + acc_re_val[0] = x0_1_re[0]; + acc_re_val[1] = x0_1_re[1] - x0_1_re[7]; + acc_re_val[2] = x0_1_re[2] - x0_1_re[6]; + acc_re_val[3] = x0_1_re[3] - x0_1_re[5]; + acc_re_val[4] = x0_1_im[1] + x0_1_im[7]; + acc_re_val[5] = x0_1_im[2] + x0_1_im[6]; + acc_re_val[6] = x0_1_im[3] + x0_1_im[5]; + acc_re_val[7] = x0_1_im[4]; - temp = ixheaacd_mps_mult32_local(coeff, temp, 30); - acc_re = acc_re + (WORD64)temp; + acc_im_val[0] = x0_1_im[0]; + acc_im_val[1] = x0_1_im[1] - x0_1_im[7]; + acc_im_val[2] = x0_1_im[2] - x0_1_im[6]; + acc_im_val[3] = x0_1_im[3] - x0_1_im[5]; + acc_im_val[4] = x0_1_re[1] + x0_1_re[7]; + acc_im_val[5] = x0_1_re[2] + x0_1_re[6]; + acc_im_val[6] = x0_1_re[3] + x0_1_re[5]; + acc_im_val[7] = x0_1_re[4]; - temp = ixheaacd_add32_sat( - ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30), - ixheaacd_mps_mult32_local(in_re, modulation_fac_im, 30)); + for (q = 0; q < 4; q++) { + acc_re_l = 0; + acc_im_l = 0; + acc_re_h = 0; + acc_im_h = 0; - if (temp >= 1073741823) - temp = 1073741823; - else if (temp <= -1073741824) - temp = -1073741824; + // X_re + acc_re_l += acc_re_val[0]; + acc_re_l += acc_re_val[1] * ixheaacd_cosine[q][1]; + acc_re_l += acc_re_val[2] * ixheaacd_cosine[q][2]; + acc_re_l += acc_re_val[3] * ixheaacd_cosine[q][3]; - temp = ixheaacd_mps_mult32_local(coeff, temp, 30); - acc_im = acc_im + (WORD64)temp; - } + acc_re_h = acc_re_l; - output[q][i].re = (WORD32)(acc_re >> shift); - output[q][i].im = (WORD32)(acc_im >> shift); + acc_re_l -= acc_re_val[4] * ixheaacd_sine[q][1]; + acc_re_l -= acc_re_val[5] * ixheaacd_sine[q][2]; + acc_re_l -= acc_re_val[6] * ixheaacd_sine[q][3]; + acc_re_l -= acc_re_val[7] * ixheaacd_sine[q][4]; + + acc_re_h = acc_re_h - (acc_re_l - acc_re_h); + + // X_im + acc_im_l += acc_im_val[0]; + acc_im_l += acc_im_val[1] * ixheaacd_cosine[q][1]; + acc_im_l += acc_im_val[2] * ixheaacd_cosine[q][2]; + acc_im_l += acc_im_val[3] * ixheaacd_cosine[q][3]; + + acc_im_h = acc_im_l; + + acc_im_l += acc_im_val[4] * ixheaacd_sine[q][1]; + acc_im_l += acc_im_val[5] * ixheaacd_sine[q][2]; + acc_im_l += acc_im_val[6] * ixheaacd_sine[q][3]; + acc_im_l += acc_im_val[7] * ixheaacd_sine[q][4]; + + acc_im_h = acc_im_h - (acc_im_l - acc_im_h); + + output[q][i].re = acc_re_l; + output[q][i].im = acc_im_l; + + output[7 - q][i].re = acc_re_h; + output[7 - q][i].im = acc_im_h; } } } static VOID ixheaacd_mps_hyb_filt_type2( - ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[2][MAX_TIME_SLOTS], - WORD32 num_samples, const WORD32 *filt_coeff) + ia_cmplx_flt_struct *input, ia_cmplx_flt_struct output[2][MAX_TIME_SLOTS], + WORD32 num_samples, const FLOAT32 *filt_coeff) { - WORD32 i, n, q; + WORD32 i, n; - WORD32 modulation_fac_re; - WORD32 in_re, in_im; - WORD32 temp; - WORD32 coeff; - WORD64 acc_re, acc_im; - - WORD16 shift = 8; + FLOAT32 in_re, in_im; + FLOAT32 coeff; + FLOAT32 acc_re[2], acc_im[2]; for (i = 0; i < num_samples; i++) { - for (q = 0; q < 2; q++) { - acc_re = 0; - acc_im = 0; - for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) { - modulation_fac_re = ixheaacd_cosine2[q][n]; + FLOAT32 x_0_re[13], x_0_im[13]; + + for (n = 1; n < 6; n = n + 2) { + in_re = input[n + i].re; + in_im = input[n + i].im; - in_re = (WORD32)(input[n + i].re); - in_im = (WORD32)(input[n + i].im); + in_re += input[12 - n + i].re; + in_im += input[12 - n + i].im; - in_re = ixheaacd_shl32_sat(in_re, shift); - in_im = ixheaacd_shl32_sat(in_im, shift); + coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; - coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; + x_0_re[n] = coeff * in_re; + x_0_im[n] = coeff * in_im; + } - temp = ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30); + n = 6; + in_re = input[n + i].re; + in_im = input[n + i].im; - if (temp >= 1073741823) - temp = 1073741823; - else if (temp <= -1073741824) - temp = -1073741824; + coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; - temp = ixheaacd_mps_mult32_local(coeff, temp, 30); - acc_re = acc_re + (WORD64)temp; + x_0_re[n] = coeff * in_re; + x_0_im[n] = coeff * in_im; - temp = ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30); + x_0_re[1] = x_0_re[1] + x_0_re[3] + x_0_re[5]; + x_0_im[1] = x_0_im[1] + x_0_im[3] + x_0_im[5]; - if (temp >= 1073741823) - temp = 1073741823; - else if (temp <= -1073741824) - temp = -1073741824; + acc_re[0] = x_0_re[6] + x_0_re[1]; + acc_im[0] = x_0_im[6] + x_0_im[1]; - temp = ixheaacd_mps_mult32_local(coeff, temp, 30); - acc_im = acc_im + (WORD64)temp; - } + acc_re[1] = x_0_re[6] - x_0_re[1]; + acc_im[1] = x_0_im[6] - x_0_im[1]; - output[q][i].re = (WORD32)(acc_re >> shift); - output[q][i].im = (WORD32)(acc_im >> shift); - } + output[0][i].re = acc_re[0]; + output[0][i].im = acc_im[0]; + + output[1][i].re = acc_re[1]; + output[1][i].im = acc_im[1]; } } @@ -173,17 +214,17 @@ VOID ixheaacd_mps_qmf_hybrid_analysis_init(ia_mps_hybrid_filt_struct *handle) { sizeof(ia_cmplx_flt_struct)); } -VOID ixheaacd_mps_qmf_hybrid_analysis( +VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix( ia_mps_hybrid_filt_struct *handle, - ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW], + ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], WORD32 num_bands, WORD32 num_samples, - ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) { + ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) { WORD32 lf_samples_shift; WORD32 hf_samples_shift; WORD32 lf_qmf_bands; WORD32 k, n; - ia_cmplx_w32_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS]; + ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS]; lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples; hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples; @@ -191,34 +232,109 @@ VOID ixheaacd_mps_qmf_hybrid_analysis( lf_qmf_bands = QMF_BANDS_TO_HYBRID; for (k = 0; k < lf_qmf_bands; k++) { - for (n = 0; n < lf_samples_shift; n++) { - handle->lf_buffer[k][n].re = handle->lf_buffer[k][n + num_samples].re; - handle->lf_buffer[k][n].im = handle->lf_buffer[k][n + num_samples].im; - } + memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re, + 2 * lf_samples_shift * sizeof(FLOAT32)); } for (k = 0; k < lf_qmf_bands; k++) { + memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re, + 2 * num_samples * sizeof(FLOAT32)); + } + + for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) { + memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re, + 2 * hf_samples_shift * sizeof(FLOAT32)); + } + + for (k = 0; k < num_bands - lf_qmf_bands; k++) { + memcpy(&handle->hf_buffer[k][hf_samples_shift].re, + &in_qmf[k + lf_qmf_bands][0].re, 2 * num_samples * sizeof(FLOAT32)); + } + + ixheaacd_mps_hyb_filt_type1( + &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), + scratch, num_samples, ixheaacd_ia_mps_hyb_filter_coeff_8); + + for (k = 0; k < 2; k++) { for (n = 0; n < num_samples; n++) { - handle->lf_buffer[k][n + lf_samples_shift].re = (WORD32)(in_qmf[n][k].re); - handle->lf_buffer[k][n + lf_samples_shift].im = (WORD32)(in_qmf[n][k].im); + v[n][k].re = scratch[k + 6][n].re; + v[n][k + 2].re = scratch[k][n].re; + v[n][k + 4].re = scratch[k + 2][n].re; + v[n][k + 4].re += scratch[5 - k][n].re; + + v[n][k].im = scratch[k + 6][n].im; + v[n][k + 2].im = scratch[k][n].im; + v[n][k + 4].im = scratch[k + 2][n].im; + v[n][k + 4].im += scratch[5 - k][n].im; } } - for (k = 0; k < num_bands - lf_qmf_bands; k++) { - for (n = 0; n < hf_samples_shift; n++) { - handle->hf_buffer[k][n].re = handle->hf_buffer[k][n + num_samples].re; - handle->hf_buffer[k][n].im = handle->hf_buffer[k][n + num_samples].im; + ixheaacd_mps_hyb_filt_type2( + &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), + scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2); + + for (k = 0; k < 2; k++) { + for (n = 0; n < num_samples; n++) { + v[n][k + 6].re = scratch[1 - k][n].re; + v[n][k + 6].im = scratch[1 - k][n].im; + } + } + + ixheaacd_mps_hyb_filt_type2( + &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), + scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2); + + for (k = 0; k < 2; k++) { + for (n = 0; n < num_samples; n++) { + v[n][k + 8].re = scratch[k][n].re; + v[n][k + 8].im = scratch[k][n].im; } } for (k = 0; k < num_bands - lf_qmf_bands; k++) { for (n = 0; n < num_samples; n++) { - handle->hf_buffer[k][n + hf_samples_shift].re = - (in_qmf[n][k + lf_qmf_bands].re); - handle->hf_buffer[k][n + hf_samples_shift].im = - (in_qmf[n][k + lf_qmf_bands].im); + v[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re); + v[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im); } } +} + +VOID ixheaacd_mps_qmf_hybrid_analysis( + ia_mps_hybrid_filt_struct *handle, + ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], + WORD32 num_bands, WORD32 num_samples, + ia_cmplx_flt_struct hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]) { + WORD32 lf_samples_shift; + WORD32 hf_samples_shift; + WORD32 lf_qmf_bands; + WORD32 k, n; + + ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS]; + + lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples; + hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples; + + lf_qmf_bands = QMF_BANDS_TO_HYBRID; + + for (k = 0; k < lf_qmf_bands; k++) { + memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re, + 2 * lf_samples_shift * sizeof(FLOAT32)); + } + + for (k = 0; k < lf_qmf_bands; k++) { + memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re, + 2 * num_samples * sizeof(FLOAT32)); + } + + for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) { + memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re, + 2 * hf_samples_shift * sizeof(FLOAT32)); + } + + for (k = 0; k < num_bands - lf_qmf_bands; k++) { + memcpy(&handle->hf_buffer[k][hf_samples_shift].re, + &in_qmf[k + lf_qmf_bands][0].re, 2 * num_samples * sizeof(FLOAT32)); + } ixheaacd_mps_hyb_filt_type1( &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), @@ -226,15 +342,15 @@ VOID ixheaacd_mps_qmf_hybrid_analysis( for (k = 0; k < 2; k++) { for (n = 0; n < num_samples; n++) { - hyb[n][k].re = (FLOAT32)scratch[k + 6][n].re; - hyb[n][k + 2].re = (FLOAT32)scratch[k][n].re; - hyb[n][k + 4].re = (FLOAT32)scratch[k + 2][n].re; - hyb[n][k + 4].re += (FLOAT32)scratch[5 - k][n].re; - - hyb[n][k].im = (FLOAT32)scratch[k + 6][n].im; - hyb[n][k + 2].im = (FLOAT32)scratch[k][n].im; - hyb[n][k + 4].im = (FLOAT32)scratch[k + 2][n].im; - hyb[n][k + 4].im += (FLOAT32)scratch[5 - k][n].im; + hyb[k][n].re = scratch[k + 6][n].re; + hyb[k + 2][n].re = scratch[k][n].re; + hyb[k + 4][n].re = scratch[k + 2][n].re; + hyb[k + 4][n].re += scratch[5 - k][n].re; + + hyb[k][n].im = scratch[k + 6][n].im; + hyb[k + 2][n].im = scratch[k][n].im; + hyb[k + 4][n].im = scratch[k + 2][n].im; + hyb[k + 4][n].im += scratch[5 - k][n].im; } } @@ -244,8 +360,8 @@ VOID ixheaacd_mps_qmf_hybrid_analysis( for (k = 0; k < 2; k++) { for (n = 0; n < num_samples; n++) { - hyb[n][k + 6].re = (FLOAT32)scratch[1 - k][n].re; - hyb[n][k + 6].im = (FLOAT32)scratch[1 - k][n].im; + hyb[k + 6][n].re = scratch[1 - k][n].re; + hyb[k + 6][n].im = scratch[1 - k][n].im; } } @@ -255,16 +371,14 @@ VOID ixheaacd_mps_qmf_hybrid_analysis( for (k = 0; k < 2; k++) { for (n = 0; n < num_samples; n++) { - hyb[n][k + 8].re = (FLOAT32)scratch[k][n].re; - hyb[n][k + 8].im = (FLOAT32)scratch[k][n].im; + hyb[k + 8][n].re = scratch[k][n].re; + hyb[k + 8][n].im = scratch[k][n].im; } } for (k = 0; k < num_bands - lf_qmf_bands; k++) { - for (n = 0; n < num_samples; n++) { - hyb[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re); - hyb[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im); - } + memcpy(&hyb[k + 10][0].re, &handle->hf_buffer[k][hf_samples_shift].re, + 2 * num_samples * sizeof(FLOAT32)); } } @@ -289,9 +403,7 @@ VOID ixheaacd_mps_qmf_hybrid_synthesis( in_qmf[n][2].re = hyb[n][8].re + hyb[n][9].re; in_qmf[n][2].im = hyb[n][8].im + hyb[n][9].im; - for (k = 3; k < num_bands; k++) { - in_qmf[n][k].re = hyb[n][k - 3 + 10].re; - in_qmf[n][k].im = hyb[n][k - 3 + 10].im; - } + memcpy(&in_qmf[n][3].re, &hyb[n][10].re, + 2 * (num_bands - 3) * sizeof(FLOAT32)); } } diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c index 81a8592..ca5cbcb 100644 --- a/decoder/ixheaacd_mps_parse.c +++ b/decoder/ixheaacd_mps_parse.c @@ -107,8 +107,8 @@ const int ixheaacd_ipd_de_quant_table_q28[] = { 1264972288, 1370386688, 1475800960, 1581215360}; static const int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; -static const int ixheaacd_inverse_smoothing_time_table_q30[] = { - 16777216, 8388608, 4194304, 2097152}; +static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = { + 1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f}; static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) { var = min(var, upper_bound); @@ -878,7 +878,7 @@ static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { switch (frame->bs_smooth_mode[ps]) { case 0: self->smoothing_time[ps] = 256; - self->inv_smoothing_time[ps] = 4194304; + self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f); for (pb = 0; pb < self->bs_param_bands; pb++) { self->smoothing_data[ps][pb] = 0; @@ -908,8 +908,7 @@ static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { self->smoothing_time[ps] = ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; self->inv_smoothing_time[ps] = - ixheaacd_inverse_smoothing_time_table_q30[frame - ->bs_smooth_time[ps]]; + ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; for (pb = 0; pb < self->bs_param_bands; pb++) { self->smoothing_data[ps][pb] = 1; } @@ -919,8 +918,7 @@ static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { self->smoothing_time[ps] = ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; self->inv_smoothing_time[ps] = - ixheaacd_inverse_smoothing_time_table_q30[frame - ->bs_smooth_time[ps]]; + ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]]; data_bands = (self->bs_param_bands - 1) / ch_fac + 1; @@ -994,10 +992,9 @@ WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { self->time_slots = self->frame_length; - self->frame_len = self->time_slots * self->qmf_band_count; self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res]; - self->hyb_band_count = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10; + self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10; switch (self->bs_param_bands) { case 4: diff --git a/decoder/ixheaacd_mps_poly_filt.c b/decoder/ixheaacd_mps_poly_filt.c index 315f0c7..7118538 100644 --- a/decoder/ixheaacd_mps_poly_filt.c +++ b/decoder/ixheaacd_mps_poly_filt.c @@ -32,22 +32,10 @@ #include "ixheaacd_basic_ops32.h" #include "ixheaacd_function_selector.h" -extern const WORD32 - ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2]; -extern const WORD32 ixheaacd_mps_pre_re[64]; -extern const WORD32 ixheaacd_mps_pre_im[64]; -extern const WORD32 ixheaacd_mps_post_re[128]; -extern const WORD32 ixheaacd_mps_post_im[128]; - -static PLATFORM_INLINE WORD32 ixheaacd_mult32(WORD32 a, WORD32 b) { - WORD32 result; - WORD64 temp_result; - - temp_result = (WORD64)a * (WORD64)b; - result = (WORD32)(temp_result >> 31); - - return (result); -} +extern const FLOAT32 + ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2]; +extern const FLOAT32 ixheaacd_mps_post_twid[30]; +extern const FLOAT32 ixheaacd_mps_pre_twid[64]; VOID ixheaacd_mps_synt_create(ia_mps_poly_phase_struct *kernel, WORD32 resolution) { @@ -55,65 +43,14 @@ VOID ixheaacd_mps_synt_create(ia_mps_poly_phase_struct *kernel, } VOID ixheaacd_mps_synt_init(ia_mps_poly_phase_synth_struct *self) { - memset(self->state, 0, sizeof(WORD32) * 64 * 20); -} - -static VOID ixheaacd_float_to_int32(FLOAT32 *in, WORD32 *out, WORD32 q_factor, - WORD32 sample) { - WORD32 loop; - UWORD32 temp = (1 << q_factor); - - for (loop = 0; loop < sample; loop++) out[loop] = (WORD32)(in[loop] * temp); -} - -VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution) { - WORD32 tmp, k; - for (k = 0; k < 2 * resolution; k += 2) { - tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k >> 1]), - ixheaacd_mult32(ptr_in[k + 1], table_im[k >> 1])); - ptr_in[k + 1] = ixheaacd_add32_sat( - ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k >> 1]), - ixheaacd_mult32(ptr_in[k + 1], table_re[k >> 1])); - - ptr_in[k] = tmp; - } -} - -VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 resolution) { - WORD32 tmp, k; - for (k = 0; k < 2 * resolution; k += 2) { - tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k]), - ixheaacd_mult32(ptr_in[k + 1], table_im[k])); - - ptr_in[k + 1] = ixheaacd_add32_sat( - ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k]), - ixheaacd_mult32(ptr_in[k + 1], table_re[k])); - - ptr_in[k] = tmp; - } + memset(self->state, 0, sizeof(FLOAT32) * POLY_PHASE_SYNTH_SIZE); } -VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, - const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) { - WORD32 l; - for (l = 0; l < 2 * resolution; l++) { - state[2 * resolution - l - 1] = - ixheaacd_add32_sat(ixheaacd_mult32(fin_re[l], table_re[l]), - ixheaacd_mult32(fin_im[l], table_im[l])); - } -} - -VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out, - WORD32 *state, const WORD32 *filter_coeff) { +VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out, + FLOAT32 *state, + const FLOAT32 *filter_coeff) { WORD32 l, k; - WORD32 *out1, *out2, *state1, *state2; + FLOAT32 *out1, *out2, *state1, *state2; out1 = out; out2 = out + resolution; state1 = state; @@ -121,8 +58,8 @@ VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out, for (k = 0; k < 5; k++) { for (l = 0; l < resolution; l++) { - *out1++ = (WORD32)(((WORD64)(*state1++) * (*filter_coeff++)) >> 31); - *out2++ = (WORD32)(((WORD64)(*state2++) * (*filter_coeff++)) >> 31); + *out1++ = (*state1++) * (*filter_coeff++); + *out2++ = (*state2++) * (*filter_coeff++); } out1 += resolution; out2 += resolution; @@ -131,64 +68,163 @@ VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out, } } +VOID ixheaacd_mps_synth_pre_twidle(FLOAT32 *out_re, FLOAT32 *out_im, + FLOAT32 *c_in, WORD32 len) { + WORD32 i; + FLOAT32 *c_s = c_in; + FLOAT32 *p_re_s = out_re; + FLOAT32 *p_im_s = out_im; + FLOAT32 *c_e = c_in + (len << 1) - 1; + FLOAT32 *p_im_e = out_im + len - 1; + FLOAT32 *p_re_e = out_re + len - 1; + const FLOAT32 *prtw = ixheaacd_mps_pre_twid; + + for (i = 0; i < len; i += 4) { + *p_re_s = ((*c_s++) * (*prtw)); + p_re_s++; + *p_im_s = -((*c_s--) * (*prtw)); + p_im_s++; + *p_im_s = ((*c_e--) * (*prtw)); + p_im_s--; + *p_re_s = ((*c_e++) * (*prtw++)); + p_re_s--; + *p_im_s += ((*c_e--) * (*prtw)); + p_im_s++; + *p_re_s += ((*c_e--) * (*prtw)); + p_re_s++; + *p_re_s -= ((*c_s++) * (*prtw)); + p_re_s++; + *p_im_s += ((*c_s++) * (*prtw++)); + p_im_s++; + *p_im_e = ((*c_e--) * (*prtw)); + p_im_e--; + *p_re_e = -((*c_e++) * (*prtw)); + p_re_e--; + *p_re_e = ((*c_s++) * (*prtw)); + p_re_e++; + *p_im_e = ((*c_s--) * (*prtw++)); + p_im_e++; + *p_re_e += ((*c_s++) * (*prtw)); + p_re_e--; + *p_im_e += ((*c_s++) * (*prtw)); + p_im_e--; + *p_im_e -= ((*c_e--) * (*prtw)); + p_im_e--; + *p_re_e += ((*c_e--) * (*prtw++)); + p_re_e--; + } +} + +VOID ixheaacd_mps_synth_post_twidle(FLOAT32 *state, FLOAT32 *out_re, + FLOAT32 *out_im, WORD32 len) { + WORD32 i; + { + FLOAT32 x_0, x_1, x_2, x_3; + FLOAT32 *p_re_e, *p_im_e; + const FLOAT32 *potw = ixheaacd_mps_post_twid; + FLOAT32 *p_re_s = out_re; + FLOAT32 *p_im_s = out_im; + + p_re_e = p_re_s + (len - 2); + p_im_e = p_im_s + (len - 2); + x_0 = *p_re_e; + x_1 = *(p_re_e + 1); + x_2 = *p_im_e; + x_3 = *(p_im_e + 1); + + *(p_re_e + 1) = -*(p_re_s + 1); + *(p_im_e + 1) = -*p_im_s; + *p_im_s = *(p_im_s + 1); + + for (i = 5; i < len; i += 4) { + FLOAT32 twdr = *potw++; + FLOAT32 twdi = *potw++; + FLOAT32 tmp; + + *p_re_e = (x_0 * twdi); + *p_re_e += (x_1 * twdr); + p_re_e--; + p_re_s++; + *p_re_s = (x_0 * twdr); + *p_re_s -= (x_1 * twdi); + p_re_s++; + x_1 = *p_re_e--; + x_0 = *p_re_e++; + *p_re_e = (*p_re_s++ * twdi); + *p_re_e += -(*p_re_s * twdr); + p_re_e--; + tmp = (*p_re_s-- * twdi); + *p_re_s = tmp + (*p_re_s * twdr); + + *p_im_e = -(x_2 * twdr); + *p_im_e += (x_3 * twdi); + p_im_e--; + p_im_s++; + *p_im_s = -(x_2 * twdi); + *p_im_s -= (x_3 * twdr); + p_im_s++; + x_3 = *p_im_e--; + x_2 = *p_im_e++; + *p_im_e = -(*p_im_s++ * twdr); + *p_im_e -= (*p_im_s * twdi); + p_im_e--; + tmp = (*p_im_s-- * twdr); + *p_im_s = tmp - (*p_im_s * twdi); + } + + *p_re_e = 0.7071067f * (x_1 + x_0); + *p_im_e = 0.7071067f * (x_3 - x_2); + *(p_re_s + 1) = -0.7071067f * (x_1 - x_0); + *(p_im_s + 1) = -0.7071067f * (x_3 + x_2); + } + + for (i = 0; i < len; i++) { + state[i] = out_im[i] - out_re[i]; + state[len + i] = out_im[len - i - 1] + out_re[len - i - 1]; + state[len - i - 1] = out_im[len - i - 1] - out_re[len - i - 1]; + state[2 * len - i - 1] = out_im[i] + out_re[i]; + } +} + VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct *self) { WORD32 k, l, ts, ch; - WORD64 acc; - WORD32 ptr_in[128]; - WORD32 fin_re[128]; - WORD32 fin_im[128]; - FLOAT32 temp; - WORD32 *state, *tmp_state, *out; - const WORD32 *filt_coeff; - WORD32 *tmp_buf = self->tmp_buf; + FLOAT32 *state, *tmp_state, *out; + const FLOAT32 *filt_coeff; + FLOAT32 *tmp_buf = self->tmp_buf; + FLOAT32 fin_re[64] = {0}; + FLOAT32 fin_im[64] = {0}; ia_mps_poly_phase_struct kernel = self->poly_phase_filt_kernel; WORD32 resolution = kernel.resolution; + WORD32 m_resolution = resolution >> 1; for (ch = 0; ch < self->out_ch_count; ch++) { tmp_state = (&self->qmf_filt_state[ch])->state; state = &tmp_buf[self->time_slots * 2 * resolution]; - memcpy(state, tmp_state, sizeof(WORD32) * 20 * resolution); + memcpy(state, tmp_state, sizeof(FLOAT32) * 18 * resolution); out = &tmp_buf[74 * MAX_NUM_QMF_BANDS_SAC]; for (ts = 0; ts < self->time_slots; ts++) { - ixheaacd_float_to_int32(&self->qmf_out_dir[ch][ts][0].re, ptr_in, 10, - resolution * 2); - - filt_coeff = ixheaacd_mps_polyphase_filter_coeff_fix; + filt_coeff = ixheaacd_mps_polyphase_filter_coeff; state -= (2 * resolution); - (*ixheaacd_mps_synt_pre_twiddle)(ptr_in, ixheaacd_mps_pre_re, - ixheaacd_mps_pre_im, resolution); - (*ixheaacd_mps_complex_fft_64)(ptr_in, fin_re, fin_im, resolution); + ixheaacd_mps_synth_pre_twidle( + fin_re, fin_im, &self->qmf_out_dir[ch][ts][0].re, resolution); - (*ixheaacd_mps_synt_post_twiddle)(ptr_in, ixheaacd_mps_post_re, - ixheaacd_mps_post_im, resolution); + ixheaacd_mps_synth_calc_fft(fin_re, fin_im, m_resolution); - (*ixheaacd_mps_complex_fft_64)(ptr_in, &fin_re[1], &fin_im[1], - resolution); + ixheaacd_mps_synth_post_twidle(state, fin_re, fin_im, resolution); - (*ixheaacd_mps_synt_post_fft_twiddle)(resolution, fin_re, fin_im, - ixheaacd_mps_post_re, - ixheaacd_mps_post_im, state); (*ixheaacd_mps_synt_out_calc)(resolution, out, state, filt_coeff); for (k = 0; k < resolution; k++) { - acc = 0; - for (l = 0; l < 10; l++) { - acc = acc + out[resolution * l + k]; + FLOAT32 acc = out[k]; + for (l = 1; l < 10; l++) { + acc += out[resolution * l + k]; } - if (acc >= 2147483647) - temp = 1.0; - else if (acc <= -2147483647 - 1) - temp = -1.0f; - else - temp = (FLOAT32)((WORD32)acc) / ((FLOAT32)(1 << 10)); - - self->output_buffer[ch][self->qmf_band_count * ts + k] = (FLOAT32)temp; + self->output_buffer[ch][self->qmf_band_count * ts + k] = acc; } } - - memcpy(tmp_state, state, sizeof(WORD32) * 20 * resolution); + memcpy(tmp_state, state, sizeof(FLOAT32) * 18 * resolution); } } diff --git a/decoder/ixheaacd_mps_polyphase.h b/decoder/ixheaacd_mps_polyphase.h index dcc6f10..79e2c8e 100644 --- a/decoder/ixheaacd_mps_polyphase.h +++ b/decoder/ixheaacd_mps_polyphase.h @@ -21,9 +21,10 @@ #define IXHEAACD_MPS_POLYPHASE_H #define MAX_NUM_QMF_BANDS_SAC (128) +#define POLY_PHASE_SYNTH_SIZE (1152) typedef struct ia_mps_poly_phase_synth_struct { - WORD32 state[1280]; + FLOAT32 state[POLY_PHASE_SYNTH_SIZE]; } ia_mps_poly_phase_synth_struct; typedef struct ia_mps_poly_phase_struct { diff --git a/decoder/ixheaacd_mps_pre_mix.c b/decoder/ixheaacd_mps_pre_mix.c index c490e78..3d7a5cf 100644 --- a/decoder/ixheaacd_mps_pre_mix.c +++ b/decoder/ixheaacd_mps_pre_mix.c @@ -47,22 +47,21 @@ #define PI_Q28 (843314856) #define PI_Q27 (421657428) #define PI_BY_8_Q28 (105414352) +#define P_PI 3.1415926535897932 +#define PI_IN_Q28 843314880 -extern const WORD32 ixheaacd_im_weight_Q28[16][8][31]; -extern const WORD32 ixheaacd_re_weight_Q28[16][8][31]; -extern const WORD32 ixheaacd_beta_Q28[16][8][31]; -extern const WORD32 ixheaacd_weight_Q28[16][8][31]; -extern const WORD32 ixheaacd_c_l_table_Q31[31]; -extern const WORD32 ixheaacd_sin_table_Q31[8][31]; -extern const WORD32 ixheaacd_cos_table_Q31[8][31]; extern const WORD32 ixheaacd_atan_table_Q28[16][8][31]; extern const WORD32 ixheaacd_ipd_de_quant_table_q28[16]; -#define P_PI 3.1415926535897932 -#define PI_IN_Q28 843314880 +extern const FLOAT32 ixheaacd_im_weight[16][8][31]; +extern const FLOAT32 ixheaacd_re_weight[16][8][31]; +extern const FLOAT32 ixheaacd_beta[16][8][31]; +extern const FLOAT32 ixheaacd_weight[16][8][31]; +extern const FLOAT32 ixheaacd_c_l_table[31]; +extern const FLOAT32 ixheaacd_sin_table[8][31]; +extern const FLOAT32 ixheaacd_cos_table[8][31]; -#define P_PI 3.1415926535897932 -#define PI_IN_Q28 843314880 +extern const WORD32 ixheaacd_mps_gain_set_indx[29]; static WORD32 ixheaacd_mps_phase_wraping(WORD32 phase) { const WORD32 pi_2 = 2 * PI_IN_Q28; @@ -116,17 +115,17 @@ VOID ixheaacd_fix_to_float_int(WORD32 *inp, FLOAT32 *out, WORD32 length, VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) { WORD32 ps, pb; ia_mps_bs_frame *curr_bit_stream = &(self->bs_frame); - WORD32 h_imag[2 * MAX_PARAMETER_BANDS]; - WORD32 - h_real[6 * MAX_PARAMETER_BANDS]; + FLOAT32 h_imag[2 * MAX_PARAMETER_BANDS]; + FLOAT32 h_real[6 * MAX_PARAMETER_BANDS]; ixheaacd_mps_buffer_pre_and_mix_matrix(self); for (ps = 0; ps < self->num_parameter_sets; ps++) { - WORD32 *h_im = &h_imag[0]; - WORD32 *h_re = &h_real[0]; - memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(WORD32)); - memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(WORD32)); + FLOAT32 *h_im = &h_imag[0]; + FLOAT32 *h_re = &h_real[0]; + + memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(FLOAT32)); + memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(FLOAT32)); switch (self->config->bs_phase_coding) { case 0: @@ -148,8 +147,8 @@ VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) { } for (pb = 0; pb < self->bs_param_bands; pb++) { - self->m1_param_re[ps][pb][0][0] = 1073741824; - self->m1_param_re[ps][pb][1][0] = 1073741824; + self->m1_param_re[ps][pb][0][0] = 1.0f; + self->m1_param_re[ps][pb][1][0] = 1.0f; self->m1_param_im[ps][pb][0][0] = 0; self->m1_param_im[ps][pb][1][0] = 0; @@ -177,21 +176,15 @@ VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) { } } ixheaacd_mps_smoothing_opd(self); - - ixheaacd_fix_to_float_int(&self->phase_l_fix[0][0], &self->phase_l[0][0], - MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS, - 268435456.0f); - ixheaacd_fix_to_float_int(&self->phase_r_fix[0][0], &self->phase_r[0][0], - MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS, - 268435456.0f); } static VOID ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS], WORD32 icc[MAX_PARAMETER_BANDS], WORD32 ott_band_count, - WORD32 *h_real) { + FLOAT32 *h_real) { WORD32 band; - WORD32 c_l_temp, c_r_temp, cld_idx, icc_idx, temp; + FLOAT32 c_l_temp, c_r_temp, temp; + WORD32 cld_idx, icc_idx; for (band = 0; band < ott_band_count; band++) { cld_idx = *cld++ + 15; @@ -199,27 +192,27 @@ static VOID ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS], icc_idx = icc_idx & 7; - c_l_temp = (ixheaacd_c_l_table_Q31[cld_idx]); - c_r_temp = (ixheaacd_c_l_table_Q31[30 - cld_idx]); + c_l_temp = (ixheaacd_c_l_table[cld_idx]); + c_r_temp = (ixheaacd_c_l_table[30 - cld_idx]); +#define MULT(a, b) (a * b) + temp = ixheaacd_cos_table[icc_idx][cld_idx]; + *h_real++ = MULT(temp, c_l_temp); - temp = ixheaacd_cos_table_Q31[icc_idx][cld_idx]; - *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2; + temp = ixheaacd_cos_table[icc_idx][30 - cld_idx]; + *h_real++ = MULT(temp, c_r_temp); - temp = ixheaacd_cos_table_Q31[icc_idx][30 - cld_idx]; - *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2; + temp = ixheaacd_sin_table[icc_idx][cld_idx]; + *h_real++ = MULT(temp, c_l_temp); - temp = ixheaacd_sin_table_Q31[icc_idx][cld_idx]; - *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2; - - temp = -ixheaacd_sin_table_Q31[icc_idx][30 - cld_idx]; - *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2; + temp = -ixheaacd_sin_table[icc_idx][30 - cld_idx]; + *h_real++ = MULT(temp, c_r_temp); h_real += 2; } } VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self, - ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real, + ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real, WORD32 param_set_idx) { ixheaacd_mps_par2umx_ps_core(curr_bit_stream->cld_idx[param_set_idx], curr_bit_stream->icc_idx[param_set_idx], @@ -246,7 +239,7 @@ static VOID ixheaacd_mps_opd_calc(ia_mps_dec_state_struct *self, VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self, ia_mps_bs_frame *curr_bit_stream, - WORD32 *h_real, WORD32 param_set_idx) { + FLOAT32 *h_real, WORD32 param_set_idx) { WORD32 opd[MAX_PARAMETER_BANDS]; WORD32 ott_band_count = self->bs_param_bands; WORD32 num_bands_ipd = self->num_bands_ipd; @@ -263,25 +256,27 @@ VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self, WORD32 ipd_idx = curr_bit_stream->ipd_idx[param_set_idx][band] & 15; WORD32 ipd = ixheaacd_ipd_de_quant_table_q28[ipd_idx]; - self->phase_l_fix[param_set_idx][band] = - ixheaacd_mps_phase_wraping(opd[band]); - self->phase_r_fix[param_set_idx][band] = - ixheaacd_mps_phase_wraping(opd[band] - ipd); +#define Q28_FLOAT_VAL ((float)(1 << 28)) +#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL) + self->phase_l[param_set_idx][band] = + ixheaacd_mps_phase_wraping(opd[band]) * ONE_BY_Q28_FLOAT_VAL; + self->phase_r[param_set_idx][band] = + ixheaacd_mps_phase_wraping(opd[band] - ipd) * ONE_BY_Q28_FLOAT_VAL; } } else { num_bands_ipd = 0; } for (band = num_bands_ipd; band < ott_band_count; band++) { - self->phase_l_fix[param_set_idx][band] = 0; - self->phase_r_fix[param_set_idx][band] = 0; + self->phase_l[param_set_idx][band] = 0; + self->phase_r[param_set_idx][band] = 0; } } VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, - ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag, - WORD32 *h_real, WORD32 param_set_idx, - WORD32 res_bands) { + ia_mps_bs_frame *curr_bit_stream, + FLOAT32 *h_imag, FLOAT32 *h_real, + WORD32 param_set_idx, WORD32 res_bands) { WORD32 band; for (band = 0; band < self->bs_param_bands; band++) { @@ -291,7 +286,7 @@ VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, if ((band < self->num_bands_ipd) && (cld_idx == 15) && (icc_idx == 0) && (ipd_idx == 8)) { - WORD32 gain = 111848107; + FLOAT32 gain = 0.416666667f; *h_imag++ = 0; *h_imag++ = 0; @@ -309,34 +304,34 @@ VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, h_real += 4; } } else { - WORD32 weight_fix, re_weight_fix, im_weight_fix; + FLOAT32 weight, re_weight, im_weight; - weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx]; - re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx]; - im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx]; + weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx]; + re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx]; + im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx]; if (band < self->num_bands_ipd) { - weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx]; - re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx]; - im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx]; + weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx]; + re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx]; + im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx]; } else { - weight_fix = ixheaacd_weight_Q28[0][icc_idx][cld_idx]; - re_weight_fix = ixheaacd_re_weight_Q28[0][icc_idx][cld_idx]; - im_weight_fix = ixheaacd_im_weight_Q28[0][icc_idx][cld_idx]; + weight = ixheaacd_weight[0][icc_idx][cld_idx]; + re_weight = ixheaacd_re_weight[0][icc_idx][cld_idx]; + im_weight = ixheaacd_im_weight[0][icc_idx][cld_idx]; } - *h_real++ = weight_fix - re_weight_fix; - *h_imag++ = -im_weight_fix; - *h_real++ = weight_fix + re_weight_fix; - *h_imag++ = im_weight_fix; + *h_real++ = weight - re_weight; // h_real[0] = weight - re_weight + *h_imag++ = -im_weight; + *h_real++ = weight + re_weight; + *h_imag++ = im_weight; if (band < res_bands) { h_real += 2; - *h_real++ = weight_fix; - *h_real++ = -weight_fix; + *h_real++ = weight; + *h_real++ = -weight; } else { - WORD32 beta = ixheaacd_beta_Q28[ipd_idx][icc_idx][cld_idx]; + FLOAT32 beta = ixheaacd_beta[ipd_idx][icc_idx][cld_idx]; *h_real++ = beta; *h_real++ = -beta; @@ -347,122 +342,121 @@ VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self, } WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self) { - WORD32 ts, qs, row, col = 0; + WORD32 ts, qs, row; WORD32 err = 0; - err = ixheaacd_mps_upmix_interp( - self->m1_param_re, self->r_out_re_scratch_m1, self->m1_param_re_prev, - (self->dir_sig_count + self->decor_sig_count), 1, self); - if (err < 0) return err; - err = ixheaacd_mps_upmix_interp( - self->m1_param_im, self->r_out_im_scratch_m1, self->m1_param_im_prev, - (self->dir_sig_count + self->decor_sig_count), 1, self); - if (err < 0) return err; + if (self->pre_mix_req) { + err = ixheaacd_mps_upmix_interp_type1( + self->m1_param_re, self->r_out_re_in_m1, self->m1_param_re_prev, + (self->dir_sig_count + self->decor_sig_count), 1, self, + self->bs_high_rate_mode); + if (err < 0) return err; - ixheaacd_fix_to_float_int( - (WORD32 *)(self->r_out_re_scratch_m1), (FLOAT32 *)(self->r_out_re_in_m1), - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 1073741824); - ixheaacd_fix_to_float_int( - (WORD32 *)self->r_out_im_scratch_m1, (FLOAT32 *)self->r_out_im_in_m1, - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 1073741824); + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < 2; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; - for (ts = 0; ts < self->time_slots; ts++) { - for (qs = 0; qs < 2; qs++) { - WORD32 sign = -1; - WORD32 indx = self->hyb_band_to_processing_band_table[qs]; - for (row = 0; row < (self->dir_sig_count + self->decor_sig_count); - row++) { - FLOAT32 sum_real = 0.0f; - FLOAT32 sum_imag = 0.0f; - - { - FLOAT32 real = self->hyb_in[0][ts][qs].re * - self->r_out_re_in_m1[ts][indx][row][col] - - self->hyb_in[0][ts][qs].im * - self->r_out_im_in_m1[ts][indx][row][col] * sign; - FLOAT32 imag = self->hyb_in[0][ts][qs].re * - self->r_out_im_in_m1[ts][indx][row][col] * sign + - self->hyb_in[0][ts][qs].im * - self->r_out_re_in_m1[ts][indx][row][col]; - sum_real += real; - sum_imag += imag; + FLOAT32 real = + self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0]; + FLOAT32 imag = + self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0]; + for (row = 0; row < (self->dir_sig_count + self->decor_sig_count); + row++) { + self->v[row][ts][qs].re = real; + self->v[row][ts][qs].im = imag; + } + } + for (qs = 2; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + FLOAT32 real = + self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0]; + FLOAT32 imag = + self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0]; + for (row = 0; row < (self->dir_sig_count + self->decor_sig_count); + row++) { + self->v[row][ts][qs].re = real; + self->v[row][ts][qs].im = imag; } - self->v[row][ts][qs].re = sum_real; - self->v[row][ts][qs].im = sum_imag; } } - for (qs = 2; qs < self->hyb_band_count; qs++) { - WORD32 sign = 1; - WORD32 indx = self->hyb_band_to_processing_band_table[qs]; - for (row = 0; row < (self->dir_sig_count + self->decor_sig_count); - row++) { - FLOAT32 sum_real = 0.0f; - FLOAT32 sum_imag = 0.0f; - - { - FLOAT32 real = self->hyb_in[0][ts][qs].re * - self->r_out_re_in_m1[ts][indx][row][col] - - self->hyb_in[0][ts][qs].im * - self->r_out_im_in_m1[ts][indx][row][col] * sign; - FLOAT32 imag = self->hyb_in[0][ts][qs].re * - self->r_out_im_in_m1[ts][indx][row][col] * sign + - self->hyb_in[0][ts][qs].im * - self->r_out_re_in_m1[ts][indx][row][col]; - sum_real += real; - sum_imag += imag; + } else { + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < self->hyb_band_count[0]; qs++) { + FLOAT32 real = self->hyb_in[0][qs][ts].re; + FLOAT32 imag = self->hyb_in[0][qs][ts].im; + for (row = 0; row < (self->dir_sig_count + self->decor_sig_count); + row++) { + self->v[row][ts][qs].re = real; + self->v[row][ts][qs].im = imag; } - self->v[row][ts][qs].re = sum_real; - self->v[row][ts][qs].im = sum_imag; } } } return 0; } -WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) { +WORD32 ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self) { + WORD32 ts, qs, row; + WORD32 err = 0; + + err = ixheaacd_mps_upmix_interp_type2( + self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev, + self->out_ch_count, self, 1); + if (err < 0) return err; + + err = ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2, + self->m2_resid_re_prev, + self->out_ch_count, self, 0); + if (err < 0) return err; + + for (qs = 0; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (ts = 0; ts < self->time_slots; ts++) { + for (row = 0; row < self->out_ch_count; row++) { + self->hyb_dir_out[row][ts][qs].re = + self->w_dir[0][ts][qs].re * self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_dir_out[row][ts][qs].im = + self->w_dir[0][ts][qs].im * self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_diff_out[row][ts][qs].re = + self->w_diff[1][ts][qs].re * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im = + self->w_diff[1][ts][qs].im * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + } + } + } + return 0; +} + +WORD32 ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self) { WORD32 ts, qs, row, col; WORD32 complex_m2 = ((self->config->bs_phase_coding != 0)); WORD32 phase_interpolation = (self->config->bs_phase_coding == 1); WORD32 err = 0; - err = ixheaacd_mps_upmix_interp( - self->m2_decor_re, self->r_diff_out_re_fix_in_m2, self->m2_decor_re_prev, - self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self); + WORD32 num_col_iters = 0; + + err = ixheaacd_mps_upmix_interp_type1( + self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev, + self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self, + 1); if (err < 0) return err; - err = ixheaacd_mps_upmix_interp( - self->m2_resid_re, self->r_out_re_fix_in_m2, self->m2_resid_re_prev, - self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self); + err = ixheaacd_mps_upmix_interp_type1( + self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev, + self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self, + 1); if (err < 0) return err; - ixheaacd_fix_to_float_int( - (WORD32 *)self->r_out_re_fix_in_m2, (FLOAT32 *)self->r_out_re_in_m2, - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 268435456); - ixheaacd_fix_to_float_int( - (WORD32 *)self->r_diff_out_re_fix_in_m2, - (FLOAT32 *)self->r_out_diff_re_in_m2, - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 268435456); if (complex_m2 && !phase_interpolation) { - err = ixheaacd_mps_upmix_interp( - self->m2_decor_im, self->r_diff_out_im_fix_in_m2, - self->m2_decor_im_prev, self->out_ch_count, - (self->dir_sig_count + self->decor_sig_count), self); + err = ixheaacd_mps_upmix_interp_type1( + self->m2_decor_im, self->r_out_diff_im_in_m2, self->m2_decor_im_prev, + self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self, + 1); if (err < 0) return err; - err = ixheaacd_mps_upmix_interp( - self->m2_resid_im, self->r_out_im_fix_in_m2, self->m2_resid_im_prev, - self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), - self); + err = ixheaacd_mps_upmix_interp_type1( + self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev, + self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self, + 1); if (err < 0) return err; - ixheaacd_fix_to_float_int( - (WORD32 *)self->r_diff_out_im_fix_in_m2, - (FLOAT32 *)self->r_out_diff_im_in_m2, - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 268435456); - ixheaacd_fix_to_float_int( - (WORD32 *)self->r_out_im_fix_in_m2, (FLOAT32 *)self->r_out_im_in_m2, - MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT, - 268435456); } if (phase_interpolation) { @@ -473,155 +467,586 @@ WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) { for (ts = 0; ts < self->time_slots; ts++) { WORD32 pb; for (pb = 0; pb < self->bs_param_bands; pb++) { - for (row = 0; row < self->out_ch_count; row++) { - for (col = 0; col < (self->dir_sig_count + self->decor_sig_count); - col++) { - self->r_out_im_in_m2[ts][pb][row][col] = - self->r_out_re_in_m2[ts][pb][row][col] * - self->r_out_ph_im_in_m2[ts][pb][row]; - self->r_out_re_in_m2[ts][pb][row][col] = - self->r_out_re_in_m2[ts][pb][row][col] * - self->r_out_ph_re_in_m2[ts][pb][row]; - - self->r_out_diff_im_in_m2[ts][pb][row][col] = - self->r_out_diff_re_in_m2[ts][pb][row][col] * - self->r_out_ph_im_in_m2[ts][pb][row]; - self->r_out_diff_re_in_m2[ts][pb][row][col] = - self->r_out_diff_re_in_m2[ts][pb][row][col] * - self->r_out_ph_re_in_m2[ts][pb][row]; - } - } + self->r_out_im_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_im_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_diff_im_in_m2[ts][pb][0][0] = 0; + self->r_out_diff_im_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_diff_im_in_m2[ts][pb][1][0] = 0; + self->r_out_diff_im_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_diff_re_in_m2[ts][pb][0][0] = 0; + self->r_out_diff_re_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_diff_re_in_m2[ts][pb][1][0] = 0; + self->r_out_diff_re_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; } } } - + if (self->res_bands == 0) { + num_col_iters = self->dir_sig_count; + } else { + num_col_iters = (self->dir_sig_count + self->decor_sig_count); + } for (ts = 0; ts < self->time_slots; ts++) { - for (qs = 0; qs < self->hyb_band_count; qs++) { + for (qs = 0; qs < self->hyb_band_count_max; qs++) { WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { FLOAT32 sum_re_dir = 0; - FLOAT32 sum_re_diff = 0; FLOAT32 sum_im_dir = 0; - FLOAT32 sum_im_diff = 0; - for (col = 0; col < (self->dir_sig_count + self->decor_sig_count); - col++) { + for (col = 0; col < num_col_iters; col++) { sum_re_dir += self->w_dir[col][ts][qs].re * self->r_out_re_in_m2[ts][indx][row][col]; sum_im_dir += self->w_dir[col][ts][qs].im * self->r_out_re_in_m2[ts][indx][row][col]; - sum_re_diff += self->w_diff[col][ts][qs].re * - self->r_out_diff_re_in_m2[ts][indx][row][col]; - sum_im_diff += self->w_diff[col][ts][qs].im * - self->r_out_diff_re_in_m2[ts][indx][row][col]; } self->hyb_dir_out[row][ts][qs].re = sum_re_dir; self->hyb_dir_out[row][ts][qs].im = sum_im_dir; - self->hyb_diff_out[row][ts][qs].re = sum_re_diff; - self->hyb_diff_out[row][ts][qs].im = sum_im_diff; + + self->hyb_diff_out[row][ts][qs].re = + self->w_diff[1][ts][qs].re * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im = + self->w_diff[1][ts][qs].im * + self->r_out_diff_re_in_m2[ts][indx][row][1]; } } } if (complex_m2) { + if (phase_interpolation) { + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < 2; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir += self->w_dir[col][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][col]; + sum_im_dir -= self->w_dir[col][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][col]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + self->hyb_diff_out[row][ts][qs].re += + self->w_diff[1][ts][qs].im * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im -= + self->w_diff[1][ts][qs].re * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + } + } + for (qs = 2; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir -= self->w_dir[col][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][col]; + sum_im_dir += self->w_dir[col][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][col]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + self->hyb_diff_out[row][ts][qs].re -= + self->w_diff[1][ts][qs].im * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im += + self->w_diff[1][ts][qs].re * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + } + } + } + } else { + int num_cols = (self->dir_sig_count + self->decor_sig_count) > 1 + ? 1 + : (self->dir_sig_count + self->decor_sig_count); + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < 2; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + if (num_cols > 0) { + sum_re_dir += self->w_dir[0][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][0]; + sum_im_dir -= self->w_dir[0][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][0]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + } + } + for (qs = 2; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + if (num_cols > 0) { + sum_re_dir -= self->w_dir[0][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][0]; + sum_im_dir += self->w_dir[0][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][0]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + } + } + } + } + } + return 0; +} + +WORD32 ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self) { + WORD32 ts, qs, row, col; + WORD32 complex_m2 = ((self->config->bs_phase_coding != 0)); + WORD32 phase_interpolation = (self->config->bs_phase_coding == 1); + WORD32 err = 0; + WORD32 num_col_iters = 0; + + if (self->res_bands != 28) { + err = ixheaacd_mps_upmix_interp_type2( + self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev, + self->out_ch_count, self, 1); + if (err < 0) return err; + } + if (self->res_bands == 0) { + num_col_iters = self->dir_sig_count; + err = ixheaacd_mps_upmix_interp_type2( + self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev, + self->out_ch_count, self, 0); + if (err < 0) return err; + } else { + num_col_iters = (self->dir_sig_count + self->decor_sig_count); + err = ixheaacd_mps_upmix_interp_type1( + self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev, + self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self, + 1); + if (err < 0) return err; + } + + if (complex_m2 && !phase_interpolation) { + err = ixheaacd_mps_upmix_interp_type2( + self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev, + self->out_ch_count, self, 0); + if (err < 0) return err; + } + + if (phase_interpolation) { + ixheaacd_mps_phase_interpolation( + self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev, + self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self); + + if (self->res_bands == 0) { + for (ts = 0; ts < self->time_slots; ts++) { + WORD32 pb; + for (pb = 0; pb < self->bs_param_bands; pb++) { + self->r_out_im_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_diff_im_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_diff_im_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_diff_re_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_diff_re_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; + } + } + } else if (self->res_bands == 28) { + for (ts = 0; ts < self->time_slots; ts++) { + WORD32 pb; + for (pb = 0; pb < self->bs_param_bands; pb++) { + self->r_out_im_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_im_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; + } + } + } else { + for (ts = 0; ts < self->time_slots; ts++) { + WORD32 pb; + for (pb = 0; pb < self->bs_param_bands; pb++) { + self->r_out_im_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_im_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_im_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][0][0] = + self->r_out_re_in_m2[ts][pb][0][0] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][0][1] = + self->r_out_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_re_in_m2[ts][pb][1][0] = + self->r_out_re_in_m2[ts][pb][1][0] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_re_in_m2[ts][pb][1][1] = + self->r_out_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; + + self->r_out_diff_im_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_im_in_m2[ts][pb][0]; + + self->r_out_diff_im_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_im_in_m2[ts][pb][1]; + + self->r_out_diff_re_in_m2[ts][pb][0][1] = + self->r_out_diff_re_in_m2[ts][pb][0][1] * + self->r_out_ph_re_in_m2[ts][pb][0]; + + self->r_out_diff_re_in_m2[ts][pb][1][1] = + self->r_out_diff_re_in_m2[ts][pb][1][1] * + self->r_out_ph_re_in_m2[ts][pb][1]; + } + } + } + } + if (self->res_bands == 0) { for (ts = 0; ts < self->time_slots; ts++) { - for (qs = 0; qs < 2; qs++) { + for (qs = 0; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + self->hyb_dir_out[row][ts][qs].re = + self->w_dir[0][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_dir_out[row][ts][qs].im = + self->w_dir[0][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_diff_out[row][ts][qs].re = + self->w_diff[1][ts][qs].re * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im = + self->w_diff[1][ts][qs].im * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + } + } + } + } else if (self->res_bands == 28) { + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < self->hyb_band_count[1]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = 0; + FLOAT32 sum_im_dir = 0; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir += self->w_dir[col][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][col]; + sum_im_dir += self->w_dir[col][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][col]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + } + } + for (; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + self->hyb_dir_out[row][ts][qs].re = + self->w_dir[0][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_dir_out[row][ts][qs].im = + self->w_dir[0][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][0]; + } + } + } + } else { + WORD32 dif_s = ixheaacd_mps_gain_set_indx[self->res_bands]; + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < dif_s; qs++) { WORD32 indx = self->hyb_band_to_processing_band_table[qs]; for (row = 0; row < self->out_ch_count; row++) { - FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; - FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; - FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re; - FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im; - for (col = 0; col < (self->dir_sig_count + self->decor_sig_count); - col++) { - sum_re_dir += self->w_dir[col][ts][qs].im * - self->r_out_im_in_m2[ts][indx][row][col]; - sum_im_dir -= self->w_dir[col][ts][qs].re * - self->r_out_im_in_m2[ts][indx][row][col]; - sum_re_diff += self->w_diff[col][ts][qs].im * - self->r_out_diff_im_in_m2[ts][indx][row][col]; - sum_im_diff -= self->w_diff[col][ts][qs].re * - self->r_out_diff_im_in_m2[ts][indx][row][col]; + FLOAT32 sum_re_dir = 0; + FLOAT32 sum_im_dir = 0; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir += self->w_dir[col][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][col]; + sum_im_dir += self->w_dir[col][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][col]; } self->hyb_dir_out[row][ts][qs].re = sum_re_dir; self->hyb_dir_out[row][ts][qs].im = sum_im_dir; - self->hyb_diff_out[row][ts][qs].re = sum_re_diff; - self->hyb_diff_out[row][ts][qs].im = sum_im_diff; } } - for (qs = 2; qs < self->hyb_band_count; qs++) { + for (; qs < self->hyb_band_count[1]; qs++) { WORD32 indx = self->hyb_band_to_processing_band_table[qs]; for (row = 0; row < self->out_ch_count; row++) { - FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; - FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; - FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re; - FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im; - for (col = 0; col < (self->dir_sig_count + self->decor_sig_count); - col++) { - sum_re_dir -= self->w_dir[col][ts][qs].im * - self->r_out_im_in_m2[ts][indx][row][col]; - sum_im_dir += self->w_dir[col][ts][qs].re * - self->r_out_im_in_m2[ts][indx][row][col]; - sum_re_diff -= self->w_diff[col][ts][qs].im * - self->r_out_diff_im_in_m2[ts][indx][row][col]; - sum_im_diff += self->w_diff[col][ts][qs].re * - self->r_out_diff_im_in_m2[ts][indx][row][col]; + FLOAT32 sum_re_dir = 0; + FLOAT32 sum_im_dir = 0; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir += self->w_dir[col][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][col]; + sum_im_dir += self->w_dir[col][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][col]; } self->hyb_dir_out[row][ts][qs].re = sum_re_dir; self->hyb_dir_out[row][ts][qs].im = sum_im_dir; - self->hyb_diff_out[row][ts][qs].re = sum_re_diff; - self->hyb_diff_out[row][ts][qs].im = sum_im_diff; + self->hyb_diff_out[row][ts][qs].re = + self->w_diff[1][ts][qs].re * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im = + self->w_diff[1][ts][qs].im * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + } + } + for (; qs < self->hyb_band_count[0]; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + self->hyb_dir_out[row][ts][qs].re = + self->w_dir[0][ts][qs].re * + self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_dir_out[row][ts][qs].im = + self->w_dir[0][ts][qs].im * + self->r_out_re_in_m2[ts][indx][row][0]; + self->hyb_diff_out[row][ts][qs].re = + self->w_diff[1][ts][qs].re * + self->r_out_diff_re_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im = + self->w_diff[1][ts][qs].im * + self->r_out_diff_re_in_m2[ts][indx][row][1]; } } } } - return 0; -} - -static PLATFORM_INLINE WORD32 ixheaacd_mult32_shl2(WORD32 a, WORD32 b) { - WORD32 result; - WORD64 temp_result; - temp_result = (WORD64)a * (WORD64)b; - result = (WORD32)(temp_result >> 30); - - return (result); + if (complex_m2) { + if (phase_interpolation) { + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < 2; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir += self->w_dir[col][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][col]; + sum_im_dir -= self->w_dir[col][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][col]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + self->hyb_diff_out[row][ts][qs].re += + self->w_diff[1][ts][qs].im * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im -= + self->w_diff[1][ts][qs].re * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + } + } + for (qs = 2; qs < self->hyb_band_count_max; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + for (col = 0; col < num_col_iters; col++) { + sum_re_dir -= self->w_dir[col][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][col]; + sum_im_dir += self->w_dir[col][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][col]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + self->hyb_diff_out[row][ts][qs].re -= + self->w_diff[1][ts][qs].im * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + self->hyb_diff_out[row][ts][qs].im += + self->w_diff[1][ts][qs].re * + self->r_out_diff_im_in_m2[ts][indx][row][1]; + } + } + } + } else { + int num_cols = (self->dir_sig_count + self->decor_sig_count) > 1 + ? 1 + : (self->dir_sig_count + self->decor_sig_count); + for (ts = 0; ts < self->time_slots; ts++) { + for (qs = 0; qs < 2; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + if (num_cols > 0) { + sum_re_dir += self->w_dir[0][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][0]; + sum_im_dir -= self->w_dir[0][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][0]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + } + } + for (qs = 2; qs < self->hyb_band_count_max; qs++) { + WORD32 indx = self->hyb_band_to_processing_band_table[qs]; + for (row = 0; row < self->out_ch_count; row++) { + FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re; + FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im; + if (num_cols > 0) { + sum_re_dir -= self->w_dir[0][ts][qs].im * + self->r_out_im_in_m2[ts][indx][row][0]; + sum_im_dir += self->w_dir[0][ts][qs].re * + self->r_out_im_in_m2[ts][indx][row][0]; + } + self->hyb_dir_out[row][ts][qs].re = sum_re_dir; + self->hyb_dir_out[row][ts][qs].im = sum_im_dir; + } + } + } + } + } + return 0; } -WORD32 ixheaacd_mps_upmix_interp( - WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT], - WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] - [MAX_M_INPUT], - WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], - WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self) { +WORD32 ixheaacd_mps_upmix_interp_type1( + FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], + WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self, + WORD32 bs_high_rate_mode) { WORD32 ts, ps, pb, row, col, i; + FLOAT32 ks, ms, ls; + FLOAT32 fl_step, fl_base; + + if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1; for (pb = 0; pb < self->bs_param_bands; pb++) { for (row = 0; row < num_rows; row++) { for (col = 0; col < num_cols; col++) { - ps = 0; ts = 0; - if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1; + ps = 0; + ks = self->inv_param_slot_diff[ps]; + ms = m_matrix[ps][pb][row][col]; + ls = m_matrix_prev[pb][row][col]; + fl_step = ks * (ms - ls); + fl_base = ls + fl_step; + for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) { - WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps]; - WORD32 one_minus_alpha = 1073741824 - alpha; - r_matrix[ts][pb][row][col] = - ((ixheaacd_mult32_shl2(m_matrix_prev[pb][row][col], - one_minus_alpha) + - ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col]))); + r_matrix_float[ts][pb][row][col] = fl_base; + fl_base += fl_step; ts++; } - - for (ps = 1; ps < self->num_parameter_sets; ps++) { - if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1; - for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) { - WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps]; - WORD32 one_minus_alpha = 1073741824 - alpha; - r_matrix[ts][pb][row][col] = - ((ixheaacd_mult32_shl2(m_matrix[ps - 1][pb][row][col], - one_minus_alpha) + - ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col]))); - ts++; + if (bs_high_rate_mode) { + for (ps = 1; ps < self->num_parameter_sets; ps++) { + if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1; + ks = self->inv_param_slot_diff[ps]; + ms = m_matrix[ps][pb][row][col]; + ls = m_matrix[ps - 1][pb][row][col]; + fl_step = ks * (ms - ls); + fl_base = ls + fl_step; + + for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) { + r_matrix_float[ts][pb][row][col] = fl_base; + fl_base += fl_step; + ts++; + } } } } @@ -630,13 +1055,60 @@ WORD32 ixheaacd_mps_upmix_interp( return 0; } +WORD32 ixheaacd_mps_upmix_interp_type2( + FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT] + [MAX_M_INPUT], + FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], + WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col) { + WORD32 ts, ps, pb, row, i; + FLOAT32 ks, ms, ls; + FLOAT32 fl_step, fl_base; + + if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1; + + for (pb = 0; pb < self->bs_param_bands; pb++) { + for (row = 0; row < num_rows; row++) { + ts = 0; + ps = 0; + ks = self->inv_param_slot_diff[ps]; + ms = m_matrix[ps][pb][row][col]; + ls = m_matrix_prev[pb][row][col]; + fl_step = ks * (ms - ls); + fl_base = ls + fl_step; + + for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) { + r_matrix_float[ts][pb][row][col] = fl_base; + fl_base += fl_step; + ts++; + } + for (ps = 1; ps < self->num_parameter_sets; ps++) { + if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1; + ks = self->inv_param_slot_diff[ps]; + ms = m_matrix[ps][pb][row][col]; + ls = m_matrix[ps - 1][pb][row][col]; + fl_step = ks * (ms - ls); + fl_base = ls + fl_step; + + for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) { + r_matrix_float[ts][pb][row][col] = fl_base; + fl_base += fl_step; + ts++; + } + } + } + } + return 0; +} + static FLOAT32 ixheaacd_mps_angle_interpolation(FLOAT32 angle1, FLOAT32 angle2, - FLOAT32 alpha) { + FLOAT32 alpha, FLOAT32 *step) { while (angle2 - angle1 > (FLOAT32)P_PI) angle1 = angle1 + 2.0f * (FLOAT32)P_PI; while (angle1 - angle2 > (FLOAT32)P_PI) angle2 = angle2 + 2.0f * (FLOAT32)P_PI; - + *step = angle2 - angle1; return (1 - alpha) * angle1 + alpha * angle2; } @@ -647,37 +1119,46 @@ VOID ixheaacd_mps_phase_interpolation( FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2], FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2], ia_mps_dec_state_struct *self) { - WORD32 ts, ps, pb; - WORD32 i; + WORD32 i, ts, ps, pb; + FLOAT32 step_l, step_r, alpha, tl, tr; for (pb = 0; pb < self->bs_param_bands; pb++) { ps = 0; ts = 0; - for (i = 1; i <= self->param_slot_diff[ps]; i++) { - FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps]; - FLOAT32 t; + alpha = (FLOAT32)self->inv_param_slot_diff[ps]; + tl = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha, + &step_l); + tr = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha, + &step_r); + step_l *= alpha; + step_r *= alpha; - t = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha); - r_re[ts][pb][0] = (FLOAT32)cos(t); - r_im[ts][pb][0] = (FLOAT32)sin(t); + for (i = 1; i <= self->param_slot_diff[ps]; i++) { + r_re[ts][pb][0] = (FLOAT32)cos(tl); + r_im[ts][pb][0] = (FLOAT32)sin(tl); + tl += step_l; - t = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha); - r_re[ts][pb][1] = (FLOAT32)cos(t); - r_im[ts][pb][1] = (FLOAT32)sin(t); + r_re[ts][pb][1] = (FLOAT32)cos(tr); + r_im[ts][pb][1] = (FLOAT32)sin(tr); + tr += step_r; ts++; } for (ps = 1; ps < self->num_parameter_sets; ps++) { + FLOAT32 alpha = self->inv_param_slot_diff[ps]; + tl = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha, + &step_l); + tr = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha, + &step_r); + step_l *= alpha; + step_r *= alpha; for (i = 1; i <= self->param_slot_diff[ps]; i++) { - FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps]; - FLOAT32 t; - - t = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha); - r_re[ts][pb][0] = (FLOAT32)cos(t); - r_im[ts][pb][0] = (FLOAT32)sin(t); + r_re[ts][pb][0] = (FLOAT32)cos(tl); + r_im[ts][pb][0] = (FLOAT32)sin(tl); + tl += step_l; - t = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha); - r_re[ts][pb][1] = (FLOAT32)cos(t); - r_im[ts][pb][1] = (FLOAT32)sin(t); + r_re[ts][pb][1] = (FLOAT32)cos(tr); + r_im[ts][pb][1] = (FLOAT32)sin(tr); + tr += step_r; ts++; if (ts > 71) { diff --git a/decoder/ixheaacd_mps_process.h b/decoder/ixheaacd_mps_process.h index 97b7090..40555fa 100644 --- a/decoder/ixheaacd_mps_process.h +++ b/decoder/ixheaacd_mps_process.h @@ -22,6 +22,7 @@ VOID ixheaacd_mps_res_buf_copy(ia_mps_dec_state_struct* self); VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self); +VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self); VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self); VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self); VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self); diff --git a/decoder/ixheaacd_mps_rom.c b/decoder/ixheaacd_mps_rom.c index 6dd2ded..954fef0 100644 --- a/decoder/ixheaacd_mps_rom.c +++ b/decoder/ixheaacd_mps_rom.c @@ -828,2953 +828,4240 @@ const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes = { {-56, 35}, {-24, -67}, {-23, -55}, {-8, -72}, {-5, 36}, {-68, 37}, {-6, 38}, {-7, -69}, {-70, -71}}}; -const WORD32 ixheaacd_im_weight_Q28[16][8][31] = { +const FLOAT32 ixheaacd_im_weight[16][8][31] = { { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}}, { - {-3, -574674, -1017796, -1796901, -3154468, -5481590, - -7575016, -10370478, -14006830, -18549081, -23865573, -27607851, - -31193408, -34233661, -36296902, -37030589, -36296902, -34233661, - -31193411, -27607851, -23865573, -18549082, -14006829, -10370478, - -7575017, -5481590, -3154468, -1796901, -1017796, -574674, - -3}, - {-3, -538644, -954220, -1685385, -2960885, -5151503, - -7126422, -9769580, -13217236, -17537304, -22610489, -26190951, - -29627877, -32546501, -34529291, -35234746, -34529291, -32546501, - -29627879, -26190951, -22610489, -17537304, -13217236, -9769579, - -7126423, -5151503, -2960885, -1685385, -954220, -538644, - -3}, - {-3, -483799, -857386, -1515349, -2665174, -4645760, - -6437353, -8843606, -11995831, -15965514, -20652239, -23974316, - -27173122, -29896409, -31749795, -32409817, -31749798, -29896409, - -27173122, -23974316, -20652241, -15965512, -11995831, -8843606, - -6437353, -4645760, -2665174, -1515349, -857386, -483799, - -3}, - {-2, -346044, -613840, -1086712, -1916795, -3357478, - -4672194, -6454555, -8816980, -11833773, -15450674, -18047554, - -20571857, -22737959, -24220523, -24750059, -24220526, -22737954, - -20571860, -18047555, -15450674, -11833774, -8816980, -6454555, - -4672195, -3357477, -1916795, -1086712, -613840, -346044, - -2}, - {-1, -211963, -376347, -667357, -1180477, -2077857, - -2904213, -4035616, -5554462, -7524805, -9930552, -11685604, - -13412726, -14910621, -15943947, -16314578, -15943948, -14910621, - -13412728, -11685605, -9930552, -7524805, -5554462, -4035615, - -2904213, -2077857, -1180477, -667357, -376347, -211963, - -1}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {2, 341283, 608313, 1086175, 1945172, 3500199, 4995375, - 7149357, 10257166, 14719094, 21095209, 27678683, 35807499, 44718702, - 52254129, 55306472, 52254135, 44718696, 35807506, 27678683, 21095208, - 14719092, 10257166, 7149356, 4995375, 3500199, 1945172, 1086175, - 608313, 341283, 2}, - {3, 574839, 1026313, 1838046, 3309837, 6017789, - 8678530, 12620302, 18566315, 29617673, 51387069, 78419391, - 127027624, 219233261, 378389618, 496423988, 378389858, 219233221, - 127027637, 78419391, 51387075, 29617673, 18566315, 12620301, - 8678531, 6017788, 3309837, 1838046, 1026313, 574839, - 3}, - }, + + {-0.0000000112f, -0.0021408275f, -0.0037915856f, -0.0066939779f, + -0.0117513090f, -0.0204205140f, -0.0282191336f, -0.0386330411f, + -0.0521795079f, -0.0691007078f, -0.0889061838f, -0.1028472632f, + -0.1162045002f, -0.1275303215f, -0.1352165043f, -0.1379496902f, + -0.1352165043f, -0.1275303215f, -0.1162045151f, -0.1028472632f, + -0.0889061838f, -0.0691007152f, -0.0521795042f, -0.0386330411f, + -0.0282191373f, -0.0204205140f, -0.0117513090f, -0.0066939779f, + -0.0037915856f, -0.0021408275f, -0.0000000112f}, + {-0.0000000112f, -0.0020066053f, -0.0035547465f, -0.0062785484f, + -0.0110301562f, -0.0191908441f, -0.0265479907f, -0.0363945216f, + -0.0492380410f, -0.0653315485f, -0.0842306316f, -0.0975688994f, + -0.1103724390f, -0.1212451607f, -0.1286316365f, -0.1312596500f, + -0.1286316365f, -0.1212451607f, -0.1103724539f, -0.0975688994f, + -0.0842306316f, -0.0653315485f, -0.0492380410f, -0.0363945179f, + -0.0265479945f, -0.0191908441f, -0.0110301562f, -0.0062785484f, + -0.0035547465f, -0.0020066053f, -0.0000000112f}, + {-0.0000000112f, -0.0018022917f, -0.0031940117f, -0.0056451149f, + -0.0099285468f, -0.0173068047f, -0.0239810087f, -0.0329449996f, + -0.0446879528f, -0.0594761744f, -0.0769355893f, -0.0893112868f, + -0.1012277678f, -0.1113727987f, -0.1182772070f, -0.1207359731f, + -0.1182772145f, -0.1113727987f, -0.1012277678f, -0.0893112868f, + -0.0769355893f, -0.0594761670f, -0.0446879528f, -0.0329449996f, + -0.0239810087f, -0.0173068047f, -0.0099285468f, -0.0056451149f, + -0.0031940117f, -0.0018022917f, -0.0000000112f}, + {-0.0000000075f, -0.0012891144f, -0.0022867322f, -0.0040483177f, + -0.0071406178f, -0.0125075802f, -0.0174052790f, -0.0240450911f, + -0.0328458101f, -0.0440842398f, -0.0575582460f, -0.0672323778f, + -0.0766361356f, -0.0847055018f, -0.0902284831f, -0.0922011584f, + -0.0902284905f, -0.0847054794f, -0.0766361505f, -0.0672323853f, + -0.0575582460f, -0.0440842435f, -0.0328458101f, -0.0240450911f, + -0.0174052827f, -0.0125075765f, -0.0071406178f, -0.0040483177f, + -0.0022867322f, -0.0012891144f, -0.0000000075f}, + {-0.0000000037f, -0.0007896237f, -0.0014020018f, -0.0024860986f, + -0.0043976195f, -0.0077406205f, -0.0108190365f, -0.0150338411f, + -0.0206919834f, -0.0280320831f, -0.0369941890f, -0.0435322672f, + -0.0499662980f, -0.0555463918f, -0.0593958311f, -0.0607765391f, + -0.0593958348f, -0.0555463918f, -0.0499663055f, -0.0435322709f, + -0.0369941890f, -0.0280320831f, -0.0206919834f, -0.0150338374f, + -0.0108190365f, -0.0077406205f, -0.0043976195f, -0.0024860986f, + -0.0014020018f, -0.0007896237f, -0.0000000037f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000075f, 0.0012713782f, 0.0022661425f, 0.0040463172f, + 0.0072463304f, 0.0130392574f, 0.0186092220f, 0.0266334303f, + 0.0382109210f, 0.0548328981f, 0.0785857737f, 0.1031111330f, + 0.1333933324f, 0.1665901542f, 0.1946617961f, 0.2060326636f, + 0.1946618259f, 0.1665901244f, 0.1333933473f, 0.1031111330f, + 0.0785857737f, 0.0548328906f, 0.0382109210f, 0.0266334265f, + 0.0186092220f, 0.0130392574f, 0.0072463304f, 0.0040463172f, + 0.0022661425f, 0.0012713782f, 0.0000000075f}, + {0.0000000112f, 0.0021414421f, 0.0038233139f, 0.0068472549f, + 0.0123301037f, 0.0224180110f, 0.0323300436f, 0.0470142886f, + 0.0691649169f, 0.1103344262f, 0.1914317459f, 0.2921350002f, + 0.4732147753f, 0.8167075515f, 1.4096112251f, 1.8493235111f, + 1.4096120596f, 0.8167073727f, 0.4732148349f, 0.2921350002f, + 0.1914317757f, 0.1103344262f, 0.0691649169f, 0.0470142849f, + 0.0323300473f, 0.0224180073f, 0.0123301037f, 0.0068472549f, + 0.0038233139f, 0.0021414421f, 0.0000000112f}}, { - {-6, -1063142, -1884657, -3332697, -5866780, -10242061, - -14210618, -19556015, -26583487, -35470365, -46010122, -53508848, - -60748872, -66926406, -71137302, -72638110, -71137307, -66926401, - -60748877, -53508853, -46010127, -35470363, -26583487, -19556013, - -14210619, -10242061, -5866781, -3332697, -1884657, -1063142, - -6}, - {-6, -996411, -1766700, -3125152, -5504594, -9619093, - -13357671, -18402686, -25050704, -33480939, -43509452, -50662425, - -57581404, -63494074, -67528860, -68967732, -67528865, -63494073, - -57581409, -50662430, -43509452, -33480939, -25050704, -18402684, - -13357672, -9619093, -5504594, -3125152, -1766700, -996411, - -6}, - {-5, -894854, -1587094, -2808873, -4951863, -8666114, - -12050168, -16630008, -22687068, -30401449, -39622947, -46227133, - -52634601, -58124037, -61876858, -63216462, -61876863, -58124037, - -52634607, -46227138, -39622951, -30401449, -22687068, -16630007, - -12050168, -8666115, -4951864, -2808873, -1587094, -894854, - -5}, - {-4, -639871, -1135692, -2012557, -3555941, -6246900, - -8715879, -12082768, -16579119, -22374143, -29395763, -34483541, - -39463815, -43763084, -46718677, -47776809, -46718677, -43763084, - -39463820, -34483541, -29395763, -22374143, -16579119, -12082768, - -8715880, -6246900, -3555941, -2012557, -1135692, -639871, - -4}, - {-2, -391832, -695950, -1234845, -2186633, -3856009, - -5398614, -7518849, -10379694, -14115081, -18711418, -22088179, - -25429852, -28342454, -30359291, -31084156, -30359294, -28342454, - -25429854, -22088179, -18711418, -14115079, -10379693, -7518848, - -5398615, -3856009, -2186633, -1234845, -695950, -391832, - -2}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 630153, 1122569, 2002361, 3579289, 6418784, 9130132, - 13002758, 18518363, 26281774, 36854214, 45475090, 56006939, 67371285, - 76348185, 79832098, 76348185, 67371278, 56006945, 45475094, 36854219, - 26281774, 18518363, 13002756, 9130133, 6418784, 3579289, 2002361, - 1122569, 630153, 4}, - {6, 1060871, 1892248, 3382951, 6072244, 10973302, - 15727473, 22653420, 32821245, 47830061, 75342938, 103710864, - 142829663, 191958022, 239742154, 261023300, 239742208, 191958009, - 142829663, 103710864, 75342952, 47830061, 32821243, 22653418, - 15727475, 10973302, 6072245, 3382952, 1892248, 1060871, - 6}, - }, + + {-0.0000000224f, -0.0039605126f, -0.0070208944f, -0.0124152638f, + -0.0218554586f, -0.0381546505f, -0.0529386774f, -0.0728518367f, + -0.0990312099f, -0.1321374029f, -0.1714010537f, -0.1993359923f, + -0.2263071835f, -0.2493202984f, -0.2650071084f, -0.2705980539f, + -0.2650071084f, -0.2493202686f, -0.2263071984f, -0.1993360072f, + -0.1714010835f, -0.1321374029f, -0.0990312099f, -0.0728518218f, + -0.0529386811f, -0.0381546505f, -0.0218554623f, -0.0124152638f, + -0.0070208944f, -0.0039605126f, -0.0000000224f}, + {-0.0000000224f, -0.0037119202f, -0.0065814704f, -0.0116420984f, + -0.0205062106f, -0.0358339138f, -0.0497612022f, -0.0685553476f, + -0.0933211446f, -0.1247262210f, -0.1620853394f, -0.1887322366f, + -0.2145074457f, -0.2365338504f, -0.2515646219f, -0.2569248080f, + -0.2515646219f, -0.2365338504f, -0.2145074606f, -0.1887322664f, + -0.1620853394f, -0.1247262210f, -0.0933211446f, -0.0685553402f, + -0.0497612059f, -0.0358339138f, -0.0205062106f, -0.0116420984f, + -0.0065814704f, -0.0037119202f, -0.0000000224f}, + {-0.0000000186f, -0.0033335909f, -0.0059123859f, -0.0104638673f, + -0.0184471272f, -0.0322837904f, -0.0448903739f, -0.0619516075f, + -0.0845159143f, -0.1132542193f, -0.1476069838f, -0.1722094864f, + -0.1960791647f, -0.2165289074f, -0.2305092514f, -0.2354996800f, + -0.2305092812f, -0.2165289074f, -0.1960791945f, -0.1722095013f, + -0.1476069987f, -0.1132542193f, -0.0845159143f, -0.0619516037f, + -0.0448903739f, -0.0322837941f, -0.0184471309f, -0.0104638673f, + -0.0059123859f, -0.0033335909f, -0.0000000186f}, + {-0.0000000149f, -0.0023837052f, -0.0042307824f, -0.0074973591f, + -0.0132469125f, -0.0232715160f, -0.0324691795f, -0.0450118184f, + -0.0617620312f, -0.0833501816f, -0.1095077544f, -0.1284611970f, + -0.1470141709f, -0.1630301923f, -0.1740406305f, -0.1779824793f, + -0.1740406305f, -0.1630301923f, -0.1470141858f, -0.1284611970f, + -0.1095077544f, -0.0833501816f, -0.0617620312f, -0.0450118184f, + -0.0324691832f, -0.0232715160f, -0.0132469125f, -0.0074973591f, + -0.0042307824f, -0.0023837052f, -0.0000000149f}, + {-0.0000000075f, -0.0014596879f, -0.0025926158f, -0.0046001561f, + -0.0081458427f, -0.0143647529f, -0.0201114044f, -0.0280098952f, + -0.0386673734f, -0.0525827743f, -0.0697054639f, -0.0822848827f, + -0.0947335809f, -0.1055838689f, -0.1130971760f, -0.1157975048f, + -0.1130971834f, -0.1055838689f, -0.0947335884f, -0.0822848827f, + -0.0697054639f, -0.0525827669f, -0.0386673696f, -0.0280098915f, + -0.0201114081f, -0.0143647529f, -0.0081458427f, -0.0046001561f, + -0.0025926158f, -0.0014596879f, -0.0000000075f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000149f, 0.0023475029f, 0.0041818954f, 0.0074593760f, + 0.0133338906f, 0.0239118338f, 0.0340123922f, 0.0484390482f, + 0.0689862818f, 0.0979072377f, 0.1372926533f, 0.1694079041f, + 0.2086421102f, 0.2509776056f, 0.2844191492f, 0.2973977327f, + 0.2844191492f, 0.2509775758f, 0.2086421251f, 0.1694079340f, + 0.1372926682f, 0.0979072377f, 0.0689862818f, 0.0484390408f, + 0.0340123959f, 0.0239118338f, 0.0133338906f, 0.0074593760f, + 0.0041818954f, 0.0023475029f, 0.0000000149f}, + {0.0000000224f, 0.0039520524f, 0.0070491731f, 0.0126024745f, + 0.0226208717f, 0.0408787355f, 0.0585894026f, 0.0843905658f, + 0.1222686619f, 0.1781808585f, 0.2806743085f, 0.3863530755f, + 0.5320819616f, 0.7150993347f, 0.8931091428f, 0.9723875523f, + 0.8931093216f, 0.7150993347f, 0.5320819616f, 0.3863530755f, + 0.2806743681f, 0.1781808585f, 0.1222686619f, 0.0843905583f, + 0.0585894100f, 0.0408787355f, 0.0226208754f, 0.0126024783f, + 0.0070491731f, 0.0039520524f, 0.0000000224f}}, { - {-8, -1391582, -2470337, -4379084, -7741644, -13613250, - -19010161, -26384297, -36257343, -49022548, -64547243, -75833181, - -86908862, -96491301, -103089782, -105454184, -103089782, -96491301, - -86908862, -75833172, -64547240, -49022548, -36257343, -26384295, - -19010165, -13613251, -7741645, -4379084, -2470337, -1391582, - -8}, - {-7, -1304089, -2315260, -4104938, -7259321, -12772177, - -17844573, -24783192, -34086929, -46138449, -60827308, -71526414, - -82042251, -91152504, -97432108, -99683455, -97432108, -91152495, - -82042260, -71526418, -60827312, -46138449, -34086931, -24783188, - -17844578, -12772178, -7259321, -4104938, -2315260, -1304089, - -7}, - {-7, -1170970, -2079253, -3687531, -6524359, -11488788, - -16063810, -22333022, -30758491, -41703962, -55090554, -64871119, - -74507479, -82873672, -88649676, -90722278, -88649676, -82873672, - -74507487, -64871119, -55090554, -41703962, -30758489, -22333018, - -16063811, -11488789, -6524359, -3687531, -2079253, -1170970, - -7}, - {-5, -836946, -1486730, -2638556, -4674179, -8248466, - -11555711, -16108121, -22262876, -30319528, -40263731, -47590055, - -54856837, -61203595, -65605308, -67188665, -65605308, -61203586, - -54856842, -47590059, -40263731, -30319526, -22262874, -16108120, - -11555711, -8248465, -4674180, -2638556, -1486730, -836946, - -5}, - {-3, -512296, -910384, -1616803, -2867623, -5071172, - -7118298, -9948960, -13799297, -18879453, -25211247, -29918728, - -34622928, -38759529, -41643508, -42683912, -41643508, -38759525, - -34622930, -29918732, -25211249, -18879451, -13799296, -9948958, - -7118299, -5071172, -2867624, -1616803, -910384, -512296, - -3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 822447, 1463889, 2607236, 4647839, 8293870, 11741041, - 16605976, 23414447, 32754663, 45010872, 54604473, 64638836, 73862135, - 80529788, 82985438, 80529795, 73862128, 64638850, 54604473, 45010872, - 32754663, 23414449, 16605974, 11741042, 8293870, 4647839, 2607237, - 1463889, 822447, 5}, - {8, 1383579, 2464328, 4394383, 7850862, 14065144, - 19987153, 28424960, 40399126, 57162281, 79807987, 98105864, - 117845260, 140317143, 157927636, 164697609, 157927650, 140317143, - 117845274, 98105858, 79807994, 57162273, 40399123, 28424958, - 19987155, 14065143, 7850864, 4394383, 2464328, 1383579, - 8}, - }, + + {-0.0000000298f, -0.0051840469f, -0.0092027225f, -0.0163133591f, + -0.0288398713f, -0.0507133082f, -0.0708183646f, -0.0982891619f, + -0.1350691319f, -0.1826232225f, -0.2404572219f, -0.2825006247f, + -0.3237607479f, -0.3594581187f, -0.3840393722f, -0.3928474486f, + -0.3840393722f, -0.3594581187f, -0.3237607479f, -0.2825005651f, + -0.2404572070f, -0.1826232225f, -0.1350691319f, -0.0982891619f, + -0.0708183795f, -0.0507133119f, -0.0288398750f, -0.0163133591f, + -0.0092027225f, -0.0051840469f, -0.0000000298f}, + {-0.0000000261f, -0.0048581101f, -0.0086250156f, -0.0152920857f, + -0.0270430781f, -0.0475800671f, -0.0664762110f, -0.0923245847f, + -0.1269837022f, -0.1718791127f, -0.2265993804f, -0.2664566636f, + -0.3056311905f, -0.3395695388f, -0.3629629016f, -0.3713498116f, + -0.3629629016f, -0.3395695090f, -0.3056312203f, -0.2664566636f, + -0.2265993953f, -0.1718791127f, -0.1269837171f, -0.0923245698f, + -0.0664762333f, -0.0475800708f, -0.0270430781f, -0.0152920857f, + -0.0086250156f, -0.0048581101f, -0.0000000261f}, + {-0.0000000261f, -0.0043622032f, -0.0077458210f, -0.0137371235f, + -0.0243051313f, -0.0427990705f, -0.0598423555f, -0.0831969902f, + -0.1145843118f, -0.1553593576f, -0.2052282989f, -0.2416637540f, + -0.2775619924f, -0.3087284863f, -0.3302457929f, -0.3379668295f, + -0.3302457929f, -0.3087284863f, -0.2775620222f, -0.2416637540f, + -0.2052282989f, -0.1553593576f, -0.1145842969f, -0.0831969753f, + -0.0598423593f, -0.0427990742f, -0.0243051313f, -0.0137371235f, + -0.0077458210f, -0.0043622032f, -0.0000000261f}, + {-0.0000000186f, -0.0031178668f, -0.0055385008f, -0.0098293871f, + -0.0174126737f, -0.0307279304f, -0.0430483781f, -0.0600074269f, + -0.0829356760f, -0.1129490435f, -0.1499940902f, -0.1772867739f, + -0.2043576390f, -0.2280011624f, -0.2443988174f, -0.2502972782f, + -0.2443988174f, -0.2280011177f, -0.2043576539f, -0.1772867888f, + -0.1499940902f, -0.1129490361f, -0.0829356685f, -0.0600074232f, + -0.0430483781f, -0.0307279266f, -0.0174126774f, -0.0098293871f, + -0.0055385008f, -0.0031178668f, -0.0000000186f}, + {-0.0000000112f, -0.0019084513f, -0.0033914447f, -0.0060230605f, + -0.0106827281f, -0.0188915879f, -0.0265177265f, -0.0370627642f, + -0.0514063872f, -0.0703314394f, -0.0939192176f, -0.1114559472f, + -0.1289804578f, -0.1443904936f, -0.1551341563f, -0.1590099633f, + -0.1551341563f, -0.1443904787f, -0.1289804578f, -0.1114559621f, + -0.0939192176f, -0.0703314394f, -0.0514063835f, -0.0370627567f, + -0.0265177302f, -0.0188915879f, -0.0106827319f, -0.0060230605f, + -0.0033914447f, -0.0019084513f, -0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000186f, 0.0030638538f, 0.0054534115f, 0.0097127110f, + 0.0173145495f, 0.0308970734f, 0.0437387861f, 0.0618620813f, + 0.0872256160f, 0.1220206320f, 0.1676785648f, 0.2034175098f, + 0.2407984287f, 0.2751578987f, 0.2999968529f, 0.3091448545f, + 0.2999968529f, 0.2751578689f, 0.2407984734f, 0.2034175098f, + 0.1676785648f, 0.1220206320f, 0.0872256160f, 0.0618620738f, + 0.0437387899f, 0.0308970734f, 0.0173145495f, 0.0097127147f, + 0.0054534115f, 0.0030638538f, 0.0000000186f}, + {0.0000000298f, 0.0051542334f, 0.0091803372f, 0.0163703524f, + 0.0292467400f, 0.0523967445f, 0.0744579434f, 0.1058912277f, + 0.1504984796f, 0.2129460871f, 0.2973079085f, 0.3654728234f, + 0.4390078187f, 0.5227220654f, 0.5883262753f, 0.6135464311f, + 0.5883263350f, 0.5227220654f, 0.4390078485f, 0.3654727936f, + 0.2973079383f, 0.2129460573f, 0.1504984647f, 0.1058912203f, + 0.0744579583f, 0.0523967408f, 0.0292467475f, 0.0163703524f, + 0.0091803372f, 0.0051542334f, 0.0000000298f}}, { - {-8, -1509476, -2684086, -4772023, -8480193, -15047650, - -21188892, -29744494, -41501680, -57227068, -77169768, -92246064, - -107526888, -121143312, -130736632, -134217744, -130736624, -121143312, - -107526896, -92246064, -77169768, -57227064, -41501676, -29744492, - -21188894, -15047650, -8480194, -4772023, -2684086, -1509476, - -8}, - {-8, -1414379, -2514988, -4471386, -7945941, -14099648, - -19853990, -27870592, -38887072, -53621760, -72308072, -86434552, - -100752688, -113511272, -122500224, -125762016, -122500216, -113511280, - -100752696, -86434560, -72308072, -53621760, -38887072, -27870588, - -19853994, -14099649, -7945942, -4471386, -2514989, -1414379, - -8}, - {-7, -1269741, -2257800, -4014131, -7133369, -12657783, - -17823674, -25020474, -34910384, -48138264, -64913664, -77595552, - -90449464, -101903328, -109973032, -112901280, -109973040, -101903328, - -90449472, -77595544, -64913668, -48138264, -34910384, -25020472, - -17823674, -12657783, -7133369, -4014131, -2257800, -1269741, - -7}, - {-5, -907074, -1612921, -2867604, -5095918, -9042434, - -12732830, -17874062, -24939188, -34388892, -46372856, -55432508, - -64615056, -72797440, -78562256, -80654120, -78562256, -72797432, - -64615064, -55432508, -46372860, -34388892, -24939190, -17874060, - -12732831, -9042434, -5095918, -2867604, -1612921, -907074, - -5}, - {-3, -554944, -986777, -1754386, -3117658, -5532118, - -7789884, -10935266, -15257677, -21038960, -28370692, -33913340, - -39531184, -44537124, -48064012, -49343804, -48064012, -44537124, - -39531188, -33913344, -28370694, -21038958, -15257676, -10935264, - -7789885, -5532117, -3117658, -1754387, -986777, -554944, - -3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 889081, 1580927, 2810722, 4994834, 8863066, 12480257, - 17519508, 24444488, 33706744, 45452992, 54332928, 63333332, 71353408, - 77003864, 79054240, 77003872, 71353400, 63333336, 54332932, 45452992, - 33706744, 24444488, 17519506, 12480258, 8863066, 4994834, 2810722, - 1580927, 889081, 5}, - {8, 1494381, 2657245, 4724303, 8395391, 14897174, - 20977002, 29447048, 41086664, 56654796, 76398072, 91323608, - 106451616, 119931880, 129429263, 132875552, 129429264, 119931878, - 106451624, 91323608, 76398072, 56654796, 41086660, 29447048, - 20977004, 14897174, 8395392, 4724304, 2657245, 1494381, - 8}, - }, + + {-0.0000000298f, -0.0056232363f, -0.0099989995f, -0.0177771710f, + -0.0315911807f, -0.0560568646f, -0.0789347738f, -0.1108068749f, + -0.1546058059f, -0.2131874412f, -0.2874797881f, -0.3436433673f, + -0.4005688727f, -0.4512940049f, -0.4870319068f, -0.5000000596f, + -0.4870318770f, -0.4512940049f, -0.4005689025f, -0.3436433673f, + -0.2874797881f, -0.2131874263f, -0.1546057910f, -0.1108068675f, + -0.0789347813f, -0.0560568646f, -0.0315911844f, -0.0177771710f, + -0.0099989995f, -0.0056232363f, -0.0000000298f}, + {-0.0000000298f, -0.0052689724f, -0.0093690604f, -0.0166572109f, + -0.0296009369f, -0.0525252819f, -0.0739618763f, -0.1038260460f, + -0.1448656321f, -0.1997566223f, -0.2693685591f, -0.3219937980f, + -0.3753330112f, -0.4228624403f, -0.4563488960f, -0.4685000181f, + -0.4563488662f, -0.4228624701f, -0.3753330410f, -0.3219938278f, + -0.2693685591f, -0.1997566223f, -0.1448656321f, -0.1038260311f, + -0.0739618912f, -0.0525252856f, -0.0296009406f, -0.0166572109f, + -0.0093690641f, -0.0052689724f, -0.0000000298f}, + {-0.0000000261f, -0.0047301538f, -0.0084109604f, -0.0149538033f, + -0.0265738703f, -0.0471539162f, -0.0663983598f, -0.0932085291f, + -0.1300513148f, -0.1793290079f, -0.2418222427f, -0.2890659571f, + -0.3369505107f, -0.3796194792f, -0.4096814692f, -0.4205900431f, + -0.4096814990f, -0.3796194792f, -0.3369505405f, -0.2890659273f, + -0.2418222576f, -0.1793290079f, -0.1300513148f, -0.0932085216f, + -0.0663983598f, -0.0471539162f, -0.0265738703f, -0.0149538033f, + -0.0084109604f, -0.0047301538f, -0.0000000261f}, + {-0.0000000186f, -0.0033791140f, -0.0060085990f, -0.0106826574f, + -0.0189837739f, -0.0336856917f, -0.0474334881f, -0.0665860698f, + -0.0929057151f, -0.1281086057f, -0.1727523506f, -0.2065021843f, + -0.2407098413f, -0.2711915970f, -0.2926672101f, -0.3004600108f, + -0.2926672101f, -0.2711915672f, -0.2407098711f, -0.2065021843f, + -0.1727523655f, -0.1281086057f, -0.0929057226f, -0.0665860623f, + -0.0474334918f, -0.0336856917f, -0.0189837739f, -0.0106826574f, + -0.0060085990f, -0.0033791140f, -0.0000000186f}, + {-0.0000000112f, -0.0020673275f, -0.0036760308f, -0.0065355971f, + -0.0116141811f, -0.0206087455f, -0.0290195793f, -0.0407370403f, + -0.0568392761f, -0.0783762336f, -0.1056890637f, -0.1263370365f, + -0.1472651362f, -0.1659137160f, -0.1790523976f, -0.1838199943f, + -0.1790523976f, -0.1659137160f, -0.1472651511f, -0.1263370514f, + -0.1056890711f, -0.0783762261f, -0.0568392724f, -0.0407370329f, + -0.0290195830f, -0.0206087418f, -0.0116141811f, -0.0065356009f, + -0.0036760308f, -0.0020673275f, -0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000186f, 0.0033120848f, 0.0058894120f, 0.0104707554f, + 0.0186072066f, 0.0330174938f, 0.0464925803f, 0.0652652532f, + 0.0910628140f, 0.1255674064f, 0.1693255901f, 0.2024059296f, + 0.2359350473f, 0.2658121586f, 0.2868617475f, 0.2944999933f, + 0.2868617773f, 0.2658121288f, 0.2359350622f, 0.2024059445f, + 0.1693255901f, 0.1255674064f, 0.0910628140f, 0.0652652457f, + 0.0464925840f, 0.0330174938f, 0.0186072066f, 0.0104707554f, + 0.0058894120f, 0.0033120848f, 0.0000000186f}, + {0.0000000298f, 0.0055670030f, 0.0098990090f, 0.0175994001f, + 0.0312752686f, 0.0554962978f, 0.0781454220f, 0.1096988022f, + 0.1530597508f, 0.2110555619f, 0.2846049964f, 0.3402069509f, + 0.3965631723f, 0.4467810690f, 0.4821615815f, 0.4950000048f, + 0.4821615815f, 0.4467810690f, 0.3965632021f, 0.3402069509f, + 0.2846049964f, 0.2110555619f, 0.1530597359f, 0.1096988022f, + 0.0781454295f, 0.0554962978f, 0.0312752724f, 0.0175994039f, + 0.0098990090f, 0.0055670030f, 0.0000000298f}}, { - {-8, -1397585, -2489316, -4439078, -7931147, -14210401, - -20195533, -28725381, -40834574, -57795944, -80727760, -99273505, - -119386757, -142482370, -160470890, -167392516, -160470890, -142482357, - -119386757, -99273512, -80727756, -57795944, -40834574, -28725377, - -20195535, -14210400, -7931148, -4439078, -2489316, -1397585, - -8}, - {-7, -1309358, -2331922, -4157610, -7425692, -13296383, - -18885003, -26837459, -38101253, -53825212, -74978577, -91990894, - -110257644, -129210650, -144934890, -150951436, -144934903, -129210650, - -110257650, -91990901, -74978584, -53825215, -38101253, -26837455, - -18885005, -13296384, -7425692, -4157610, -2331922, -1309358, - -7}, - {-7, -1175217, -2092682, -3729980, -6658434, -11911179, - -16901999, -23987347, -33988896, -47881077, -66434665, -81236418, - -97003508, -111774388, -123343304, -128186650, -123343317, -111774382, - -97003515, -81236418, -66434665, -47881077, -33988892, -23987347, - -16902001, -11911179, -6658434, -3729980, -2092681, -1175217, - -7}, - {-5, -839113, -1493583, -2660218, -4742594, -8463942, - -11983129, -16951064, -23906436, -33453557, -45991133, -55813174, - -66094542, -75552455, -82394424, -84915283, -82394417, -75552441, - -66094540, -55813171, -45991139, -33453554, -23906434, -16951065, - -11983130, -8463941, -4742595, -2660218, -1493583, -839113, - -5}, - {-3, -513107, -912949, -1624911, -2893228, -5151802, - -7278196, -10264146, -14413252, -20048070, -27340204, -32966174, - -38772409, -44037899, -47801354, -49178242, -47801358, -44037903, - -38772413, -32966178, -27340208, -20048068, -14413250, -10264145, - -7278196, -5151802, -2893229, -1624911, -912949, -513107, - -3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 820365, 1457305, 2586425, 4582113, 8086863, 11330426, - 15796198, 21835646, 29744456, 39510836, 46709319, 53851835, 60092071, - 64420974, 65978354, 64420974, 60092067, 53851844, 46709315, 39510836, - 29744457, 21835644, 15796195, 11330427, 8086863, 4582113, 2586425, - 1457305, 820365, 5}, - {8, 1377696, 2445727, 4335584, 7665133, 13479892, - 18825424, 26130668, 35913779, 48566398, 63959479, 75153138, - 86140901, 95649257, 102197733, 104544436, 102197742, 95649257, - 86140901, 75153138, 63959483, 48566398, 35913779, 26130668, - 18825426, 13479892, 7665134, 4335585, 2445727, 1377696, - 8}, - }, + + {-0.0000000298f, -0.0052064098f, -0.0092734247f, -0.0165368542f, + -0.0295458250f, -0.0529378690f, -0.0752342194f, -0.1070103794f, + -0.1521206498f, -0.2153066695f, -0.3007343411f, -0.3698226213f, + -0.4447503388f, -0.5307881832f, -0.5978006721f, -0.6235857010f, + -0.5978006721f, -0.5307881236f, -0.4447503388f, -0.3698226511f, + -0.3007343411f, -0.2153066695f, -0.1521206498f, -0.1070103645f, + -0.0752342343f, -0.0529378653f, -0.0295458287f, -0.0165368542f, + -0.0092734247f, -0.0052064098f, -0.0000000298f}, + {-0.0000000261f, -0.0048777387f, -0.0086870864f, -0.0154883042f, + -0.0276628584f, -0.0495328866f, -0.0703521222f, -0.0999773294f, + -0.1419382244f, -0.2005145401f, -0.2793169618f, -0.3426927924f, + -0.4107417464f, -0.4813471735f, -0.5399245620f, -0.5623379350f, + -0.5399245620f, -0.4813471735f, -0.4107417464f, -0.3426928222f, + -0.2793169916f, -0.2005145550f, -0.1419382244f, -0.0999773145f, + -0.0703521222f, -0.0495328903f, -0.0276628584f, -0.0154883042f, + -0.0086870864f, -0.0048777387f, -0.0000000261f}, + {-0.0000000261f, -0.0043780245f, -0.0077958480f, -0.0138952583f, + -0.0248045996f, -0.0443725996f, -0.0629648566f, -0.0893598348f, + -0.1266185045f, -0.1783709079f, -0.2474884093f, -0.3026292324f, + -0.3613662124f, -0.4163920283f, -0.4594896138f, -0.4775324762f, + -0.4594896734f, -0.4163920283f, -0.3613662422f, -0.3026292324f, + -0.2474884093f, -0.1783709079f, -0.1266184896f, -0.0893598348f, + -0.0629648566f, -0.0443725996f, -0.0248045996f, -0.0138952583f, + -0.0077958442f, -0.0043780245f, -0.0000000261f}, + {-0.0000000186f, -0.0031259395f, -0.0055640303f, -0.0099100843f, + -0.0176675394f, -0.0315306410f, -0.0446406342f, -0.0631476343f, + -0.0890584141f, -0.1246242076f, -0.1713303179f, -0.2079202831f, + -0.2462213635f, -0.2814548314f, -0.3069431484f, -0.3163340688f, + -0.3069431186f, -0.2814547718f, -0.2462213486f, -0.2079202682f, + -0.1713303477f, -0.1246242002f, -0.0890584067f, -0.0631476343f, + -0.0446406379f, -0.0315306373f, -0.0176675431f, -0.0099100843f, + -0.0055640303f, -0.0031259395f, -0.0000000186f}, + {-0.0000000112f, -0.0019114725f, -0.0034010001f, -0.0060532652f, + -0.0107781142f, -0.0191919580f, -0.0271133929f, -0.0382369235f, + -0.0536935478f, -0.0746848807f, -0.1018501967f, -0.1228085682f, + -0.1444384754f, -0.1640539616f, -0.1780739129f, -0.1832032204f, + -0.1780739427f, -0.1640539765f, -0.1444384903f, -0.1228085831f, + -0.1018502116f, -0.0746848732f, -0.0536935404f, -0.0382369198f, + -0.0271133929f, -0.0191919580f, -0.0107781179f, -0.0060532652f, + -0.0034010001f, -0.0019114725f, -0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000186f, 0.0030560978f, 0.0054288842f, 0.0096351840f, + 0.0170697011f, 0.0301259123f, 0.0422091261f, 0.0588454232f, + 0.0813441202f, 0.1108067334f, 0.1471893340f, 0.1740057766f, + 0.2006137222f, 0.2238604128f, 0.2399868369f, 0.2457885146f, + 0.2399868369f, 0.2238603979f, 0.2006137520f, 0.1740057617f, + 0.1471893340f, 0.1108067334f, 0.0813441128f, 0.0588454120f, + 0.0422091298f, 0.0301259123f, 0.0170697011f, 0.0096351840f, + 0.0054288842f, 0.0030560978f, 0.0000000186f}, + {0.0000000298f, 0.0051323175f, 0.0091110431f, 0.0161513090f, + 0.0285548456f, 0.0502165109f, 0.0701301694f, 0.0973443240f, + 0.1337892562f, 0.1809239388f, 0.2382676303f, 0.2799672484f, + 0.3208998740f, 0.3563212454f, 0.3807162344f, 0.3894583583f, + 0.3807162642f, 0.3563212454f, 0.3208998740f, 0.2799672484f, + 0.2382676452f, 0.1809239388f, 0.1337892562f, 0.0973443240f, + 0.0701301768f, 0.0502165109f, 0.0285548493f, 0.0161513127f, + 0.0091110431f, 0.0051323175f, 0.0000000298f}}, { - {-6, -1071630, -1911499, -3417563, -6135014, -11088915, - -15896315, -22903493, -33199122, -48417346, -76625352, -105748897, - -146157663, -197317649, -247522927, -270025194, -247522954, -197317609, - -146157677, -105748904, -76625358, -48417346, -33199122, -22903491, - -15896315, -11088915, -6135014, -3417563, -1911499, -1071630, - -6}, - {-6, -1003864, -1790265, -3199659, -5740059, -10362247, - -14836237, -21336047, -30836947, -44762533, -68827345, -93516451, - -126532850, -166393343, -203549915, -219611661, -203549928, -166393329, - -126532890, -93516458, -68827352, -44762536, -30836951, -21336046, - -14836239, -10362246, -5740059, -3199659, -1790265, -1003864, - -6}, - {-5, -900861, -1606086, -2868917, -5141593, -9264643, - -13240198, -18987808, -27325830, -39399654, -58130792, -77340471, - -101814498, -129653024, -154062530, -164186529, -154062570, -129653010, - -101814518, -77340471, -58130799, -39399654, -27325828, -18987806, - -13240198, -9264643, -5141593, -2868917, -1606086, -900860, - -5}, - {-4, -642936, -1145384, -2043195, -3652724, -6551934, - -9321546, -13279575, -18921457, -26872438, -37720430, -46584838, - -57725379, -69582952, -78984425, -82641451, -78984418, -69582945, - -57725385, -46584841, -37720434, -26872436, -18921457, -13279575, - -9321547, -6551934, -3652725, -2043195, -1145384, -642936, - -4}, - {-2, -392979, -699578, -1246312, -2222848, -3970081, - -5624912, -7965246, -11250449, -15776819, -21752506, -26460379, - -31414830, -35997598, -39328571, -40559278, -39328574, -35997598, - -31414833, -26460381, -21752510, -15776818, -11250449, -7965245, - -5624912, -3970080, -2222848, -1246312, -699578, -392979, - -2}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 627208, 1113258, 1972927, 3486308, 6125748, 8548319, - 11853214, 16269000, 21963762, 28868936, 33875540, 38778800, 43013413, - 45925477, 46968213, 45925482, 43013409, 38778804, 33875542, 28868936, - 21963760, 16269001, 11853213, 8548320, 6125748, 3486308, 1972927, - 1113257, 627208, 4}, - {6, 1052552, 1865940, 3299774, 5809354, 10143366, 14075580, - 19373582, 26341294, 35156402, 45615999, 53060599, 60250435, 66386585, - 70569986, 72061134, 70569991, 66386585, 60250429, 53060599, 45615999, - 35156405, 26341292, 19373582, 14075583, 10143366, 5809355, 3299775, - 1865941, 1052552, 6}, - }, + + {-0.0000000224f, -0.0039921328f, -0.0071208887f, -0.0127314143f, + -0.0228547081f, -0.0413094275f, -0.0592183881f, -0.0853221565f, + -0.1236763671f, -0.1803686619f, -0.2854516804f, -0.3939453363f, + -0.5444797277f, -0.7350655198f, -0.9220947623f, -1.0059221983f, + -0.9220948815f, -0.7350654006f, -0.5444797873f, -0.3939453661f, + -0.2854517102f, -0.1803686619f, -0.1236763671f, -0.0853221565f, + -0.0592183881f, -0.0413094275f, -0.0228547081f, -0.0127314143f, + -0.0071208887f, -0.0039921328f, -0.0000000224f}, + {-0.0000000224f, -0.0037396848f, -0.0066692568f, -0.0119196586f, + -0.0213833861f, -0.0386023782f, -0.0552692898f, -0.0794829726f, + -0.1148765832f, -0.1667534262f, -0.2564018369f, -0.3483759165f, + -0.4713715911f, -0.6198635101f, -0.7582825422f, -0.8181172013f, + -0.7582825422f, -0.6198634505f, -0.4713717401f, -0.3483759463f, + -0.2564018667f, -0.1667534411f, -0.1148765981f, -0.0794829652f, + -0.0552692972f, -0.0386023745f, -0.0213833861f, -0.0119196586f, + -0.0066692568f, -0.0037396848f, -0.0000000224f}, + {-0.0000000186f, -0.0033559687f, -0.0059831366f, -0.0106875487f, + -0.0191539265f, -0.0345134847f, -0.0493235812f, -0.0707350969f, + -0.1017966494f, -0.1467751563f, -0.2165540755f, -0.2881157100f, + -0.3792885542f, -0.4829951525f, -0.5739276409f, -0.6116424799f, + -0.5739278197f, -0.4829950929f, -0.3792886436f, -0.2881157100f, + -0.2165541053f, -0.1467751563f, -0.1017966419f, -0.0707350895f, + -0.0493235812f, -0.0345134847f, -0.0191539265f, -0.0106875487f, + -0.0059831366f, -0.0033559650f, -0.0000000186f}, + {-0.0000000149f, -0.0023951232f, -0.0042668879f, -0.0076114945f, + -0.0136074573f, -0.0244078562f, -0.0347254649f, -0.0494702719f, + -0.0704879165f, -0.1001076326f, -0.1405195594f, -0.1735420525f, + -0.2150437981f, -0.2592166960f, -0.2942399085f, -0.3078633845f, + -0.2942398787f, -0.2592166662f, -0.2150438130f, -0.1735420525f, + -0.1405195594f, -0.1001076251f, -0.0704879165f, -0.0494702719f, + -0.0347254686f, -0.0244078562f, -0.0136074610f, -0.0076114945f, + -0.0042668879f, -0.0023951232f, -0.0000000149f}, + {-0.0000000075f, -0.0014639609f, -0.0026061311f, -0.0046428740f, + -0.0082807541f, -0.0147897042f, -0.0209544301f, -0.0296728536f, + -0.0419111885f, -0.0587732308f, -0.0810343996f, -0.0985725969f, + -0.1170293614f, -0.1341015100f, -0.1465103477f, -0.1510950923f, + -0.1465103626f, -0.1341015100f, -0.1170293689f, -0.0985725969f, + -0.0810344145f, -0.0587732270f, -0.0419111885f, -0.0296728499f, + -0.0209544301f, -0.0147897005f, -0.0082807541f, -0.0046428740f, + -0.0026061311f, -0.0014639609f, -0.0000000075f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000149f, 0.0023365319f, 0.0041472092f, 0.0073497258f, + 0.0129875094f, 0.0228201896f, 0.0318449698f, 0.0441566631f, + 0.0606067479f, 0.0818213895f, 0.1075451672f, 0.1261962205f, + 0.1444622874f, 0.1602374464f, 0.1710857302f, 0.1749702245f, + 0.1710857451f, 0.1602374315f, 0.1444623023f, 0.1261962354f, + 0.1075451672f, 0.0818213820f, 0.0606067516f, 0.0441566594f, + 0.0318449736f, 0.0228201896f, 0.0129875094f, 0.0073497258f, + 0.0041472055f, 0.0023365319f, 0.0000000149f}, + {0.0000000224f, 0.0039210618f, 0.0069511682f, 0.0122926161f, + 0.0216415301f, 0.0377869830f, 0.0524356216f, 0.0721722171f, + 0.0981289670f, 0.1309677958f, 0.1699328423f, 0.1976661384f, + 0.2244503647f, 0.2473092973f, 0.2628936768f, 0.2684486508f, + 0.2628937066f, 0.2473092973f, 0.2244503349f, 0.1976661384f, + 0.1699328423f, 0.1309678108f, 0.0981289595f, 0.0721722171f, + 0.0524356328f, 0.0377869830f, 0.0216415338f, 0.0122926198f, + 0.0069511719f, 0.0039210618f, 0.0000000224f}}, { - {-3, -580676, -1036778, -1856927, -3344306, -6082086, - -8773675, -12764181, -18791317, -30111286, -52494265, -80589391, - -131965584, -232564048, -416579297, -562298280, -416579510, -232563968, - -131965624, -80589405, -52494275, -30111283, -18791315, -12764179, - -8773676, -6082086, -3344306, -1856927, -1036778, -580676, - -3}, - {-3, -543914, -970885, -1738082, -3127514, -5678284, - -8177066, -11864206, -17389757, -27104441, -45909909, -68054278, - -104838298, -165555583, -249179407, -298573540, -249179487, -165555569, - -104838338, -68054292, -45909909, -27104439, -17389757, -11864205, - -8177067, -5678284, -3127513, -1738082, -970885, -543913, - -3}, - {-3, -488046, -870816, -1557814, -2799416, -5069822, - -7282155, -10523970, -15327605, -22959079, -37422722, -53115972, - -76430452, -108848624, -144319570, -161563289, -144319637, -108848611, - -76430472, -53115969, -37422729, -22959078, -15327603, -10523969, - -7282156, -5069822, -2799417, -1557814, -870816, -488046, - -3}, - {-2, -348211, -620694, -1108379, -1985253, -3573386, - -5101324, -7304187, -10486237, -15063094, -21722298, -28584446, - -37112672, -46532696, -54556959, -57822712, -54556959, -46532689, - -37112682, -28584446, -21722299, -15063095, -10486238, -7304186, - -5101324, -3573386, -1985253, -1108378, -620694, -348211, - -2}, - {-1, -212775, -378912, -675466, -1206088, -2158548, - -3064349, -4351732, -6171956, -8706333, -12102898, -14823042, - -17731555, -20482223, -22906153, -23829791, -22906156, -20482223, - -17731555, -14823041, -12102899, -8706332, -6171955, -4351731, - -3064349, -2158548, -1206088, -675466, -378913, -212775, - -1}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {2, 339200, 601729, 1065360, 1879405, 3292792, 4583180, - 6333406, 8654669, 11621118, 15180668, 17738214, 20225637, 22361080, - 23823154, 24345462, 23823157, 22361078, 20225641, 17738213, 15180668, - 11621118, 8654670, 6333406, 4583181, 3292792, 1879405, 1065360, - 601729, 339200, 2}, - {3, 568956, 1007710, 1779215, 3123785, 5429323, 7504044, - 10275511, 13882195, 18389595, 23668008, 27385006, 30947362, 33968646, - 36019344, 36748630, 36019347, 33968643, 30947364, 27385006, 23668008, - 18389595, 13882195, 10275510, 7504045, 5429323, 3123785, 1779215, - 1007710, 568956, 3}, - }, + + {-0.0000000112f, -0.0021631867f, -0.0038622990f, -0.0069175921f, + -0.0124585107f, -0.0226575360f, -0.0326844864f, -0.0475502796f, + -0.0700031072f, -0.1121732816f, -0.1955563724f, -0.3002188802f, + -0.4916101098f, -0.8663685918f, -1.5518788099f, -2.0947244167f, + -1.5518796444f, -0.8663682938f, -0.4916102588f, -0.3002189398f, + -0.1955564171f, -0.1121732742f, -0.0700031072f, -0.0475502722f, + -0.0326844901f, -0.0226575360f, -0.0124585107f, -0.0069175921f, + -0.0038622990f, -0.0021631867f, -0.0000000112f}, + {-0.0000000112f, -0.0020262375f, -0.0036168285f, -0.0064748600f, + -0.0116508976f, -0.0211532563f, -0.0304619446f, -0.0441976115f, + -0.0647818893f, -0.1009719074f, -0.1710277349f, -0.2535219491f, + -0.3905530870f, -0.6167426109f, -0.9282656312f, -1.1122730970f, + -0.9282659292f, -0.6167425513f, -0.3905532360f, -0.2535219789f, + -0.1710277349f, -0.1009719074f, -0.0647818893f, -0.0441976078f, + -0.0304619484f, -0.0211532563f, -0.0116508938f, -0.0064748600f, + -0.0036168285f, -0.0020262338f, -0.0000000112f}, + {-0.0000000112f, -0.0018181130f, -0.0032440424f, -0.0058033094f, + -0.0104286373f, -0.0188865587f, -0.0271281414f, -0.0392048433f, + -0.0570997782f, -0.0855292380f, -0.1394104958f, -0.1978724152f, + -0.2847256064f, -0.4054927230f, -0.5376322865f, -0.6018701792f, + -0.5376325250f, -0.4054926634f, -0.2847256958f, -0.1978724003f, + -0.1394105256f, -0.0855292305f, -0.0570997708f, -0.0392048396f, + -0.0271281451f, -0.0188865587f, -0.0104286410f, -0.0058033094f, + -0.0032440424f, -0.0018181130f, -0.0000000112f}, + {-0.0000000075f, -0.0012971871f, -0.0023122653f, -0.0041290335f, + -0.0073956437f, -0.0133119002f, -0.0190039128f, -0.0272102170f, + -0.0390642770f, -0.0561143979f, -0.0809218660f, -0.1064853594f, + -0.1382554770f, -0.1733478010f, -0.2032405138f, -0.2154063880f, + -0.2032405138f, -0.1733477712f, -0.1382555068f, -0.1064853594f, + -0.0809218735f, -0.0561144017f, -0.0390642807f, -0.0272102132f, + -0.0190039128f, -0.0133119002f, -0.0073956437f, -0.0041290298f, + -0.0023122653f, -0.0012971871f, -0.0000000075f}, + {-0.0000000037f, -0.0007926486f, -0.0014115572f, -0.0025163069f, + -0.0044930279f, -0.0080412179f, -0.0114155896f, -0.0162114650f, + -0.0229923278f, -0.0324336179f, -0.0450868085f, -0.0552201346f, + -0.0660551935f, -0.0763022304f, -0.0853320658f, -0.0887728930f, + -0.0853320807f, -0.0763022304f, -0.0660551935f, -0.0552201308f, + -0.0450868122f, -0.0324336141f, -0.0229923241f, -0.0162114613f, + -0.0114155896f, -0.0080412179f, -0.0044930279f, -0.0025163069f, + -0.0014115609f, -0.0007926486f, -0.0000000037f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000075f, 0.0012636185f, 0.0022416152f, 0.0039687753f, + 0.0070013292f, 0.0122666061f, 0.0170736760f, 0.0235937759f, + 0.0322411545f, 0.0432920381f, 0.0565523952f, 0.0660799965f, + 0.0753463656f, 0.0833015144f, 0.0887481645f, 0.0906939134f, + 0.0887481719f, 0.0833015069f, 0.0753463805f, 0.0660799891f, + 0.0565523952f, 0.0432920381f, 0.0322411582f, 0.0235937759f, + 0.0170736797f, 0.0122666061f, 0.0070013292f, 0.0039687753f, + 0.0022416152f, 0.0012636185f, 0.0000000075f}, + {0.0000000112f, 0.0021195263f, 0.0037540123f, 0.0066280924f, + 0.0116370060f, 0.0202258043f, 0.0279547423f, 0.0382792614f, + 0.0517152064f, 0.0685065836f, 0.0881702006f, 0.1020170972f, + 0.1152879074f, 0.1265430748f, 0.1341825128f, 0.1368993223f, + 0.1341825277f, 0.1265430599f, 0.1152879149f, 0.1020170972f, + 0.0881702006f, 0.0685065836f, 0.0517152064f, 0.0382792577f, + 0.0279547460f, 0.0202258043f, 0.0116370060f, 0.0066280924f, + 0.0037540123f, 0.0021195263f, 0.0000000112f}}, { - {0, 0, 0, 0, 1, 1, 2, 3, 4, 7, 13, 21, 39, 91, 367, -858993460, - 367, 91, 39, 21, 13, 7, 4, 3, 2, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 2, 3, 4, 7, 11, 18, 29, 54, 102, 145, - 102, 54, 29, 18, 11, 7, 4, 3, 2, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 2, 2, 4, 5, 9, 13, 20, 31, 44, 52, - 44, 31, 20, 13, 9, 5, 4, 2, 2, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 9, 12, 14, 15, - 14, 12, 9, 7, 5, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5, 6, - 5, 5, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, -1, -1, -1, -2, -3, -3, -4, -5, -5, -5, -5, - -5, -5, -5, -4, -3, -3, -2, -1, -1, -1, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, -1, -1, -2, -2, -3, -4, -5, -6, -7, -8, -8, -8, - -8, -8, -7, -6, -5, -4, -3, -2, -2, -1, -1, 0, 0, 0, 0}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000112f, + 0.0000000149f, 0.0000000261f, 0.0000000484f, 0.0000000782f, + 0.0000001453f, 0.0000003390f, 0.0000013672f, -3.2000000477f, + 0.0000013672f, 0.0000003390f, 0.0000001453f, 0.0000000782f, + 0.0000000484f, 0.0000000261f, 0.0000000149f, 0.0000000112f, + 0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000112f, + 0.0000000149f, 0.0000000261f, 0.0000000410f, 0.0000000671f, + 0.0000001080f, 0.0000002012f, 0.0000003800f, 0.0000005402f, + 0.0000003800f, 0.0000002012f, 0.0000001080f, 0.0000000671f, + 0.0000000410f, 0.0000000261f, 0.0000000149f, 0.0000000112f, + 0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000075f, + 0.0000000149f, 0.0000000186f, 0.0000000335f, 0.0000000484f, + 0.0000000745f, 0.0000001155f, 0.0000001639f, 0.0000001937f, + 0.0000001639f, 0.0000001155f, 0.0000000745f, 0.0000000484f, + 0.0000000335f, 0.0000000186f, 0.0000000149f, 0.0000000075f, + 0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000037f, 0.0000000037f, 0.0000000075f, + 0.0000000075f, 0.0000000112f, 0.0000000186f, 0.0000000261f, + 0.0000000335f, 0.0000000447f, 0.0000000522f, 0.0000000559f, + 0.0000000522f, 0.0000000447f, 0.0000000335f, 0.0000000261f, + 0.0000000186f, 0.0000000112f, 0.0000000075f, 0.0000000075f, + 0.0000000037f, 0.0000000037f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000037f, 0.0000000037f, + 0.0000000037f, 0.0000000075f, 0.0000000112f, 0.0000000112f, + 0.0000000149f, 0.0000000186f, 0.0000000186f, 0.0000000224f, + 0.0000000186f, 0.0000000186f, 0.0000000149f, 0.0000000112f, + 0.0000000112f, 0.0000000075f, 0.0000000037f, 0.0000000037f, + 0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, -0.0000000037f, -0.0000000037f, -0.0000000037f, + -0.0000000075f, -0.0000000112f, -0.0000000112f, -0.0000000149f, + -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000186f, + -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000149f, + -0.0000000112f, -0.0000000112f, -0.0000000075f, -0.0000000037f, + -0.0000000037f, -0.0000000037f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + -0.0000000037f, -0.0000000037f, -0.0000000075f, -0.0000000075f, + -0.0000000112f, -0.0000000149f, -0.0000000186f, -0.0000000224f, + -0.0000000261f, -0.0000000298f, -0.0000000298f, -0.0000000298f, + -0.0000000298f, -0.0000000298f, -0.0000000261f, -0.0000000224f, + -0.0000000186f, -0.0000000149f, -0.0000000112f, -0.0000000075f, + -0.0000000075f, -0.0000000037f, -0.0000000037f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}}, { - {3, 580676, 1036777, 1856927, 3344305, 6082085, - 8773674, 12764179, 18791313, 30111279, 52494259, 80589378, - 131965557, 232564021, 416579217, 562298173, 416579430, 232563941, - 131965610, 80589391, 52494265, 30111279, 18791313, 12764177, - 8773674, 6082085, 3344306, 1856927, 1036778, 580676, - 3}, - {3, 543913, 970885, 1738082, 3127513, 5678283, - 8177065, 11864205, 17389754, 27104436, 45909902, 68054265, - 104838284, 165555556, 249179381, 298573513, 249179434, 165555543, - 104838318, 68054278, 45909902, 27104436, 17389756, 11864203, - 8177066, 5678283, 3127513, 1738082, 970885, 543913, - 3}, - {3, 488046, 870816, 1557814, 2799416, 5069821, - 7282153, 10523969, 15327601, 22959076, 37422716, 53115965, - 76430438, 108848611, 144319557, 161563263, 144319610, 108848597, - 76430458, 53115962, 37422722, 22959074, 15327601, 10523968, - 7282155, 5069821, 2799416, 1557814, 870816, 488046, - 3}, - {2, 348211, 620693, 1108378, 1985253, 3573386, 5101323, - 7304185, 10486235, 15063092, 21722294, 28584443, 37112666, 46532689, - 54556952, 57822705, 54556949, 46532682, 37112676, 28584443, 21722296, - 15063092, 10486236, 7304185, 5101323, 3573385, 1985253, 1108378, - 620693, 348211, 2}, - {1, 212775, 378912, 675465, 1206088, 2158547, 3064349, - 4351731, 6171955, 8706331, 12102897, 14823040, 17731552, 20482220, - 22906149, 23829786, 22906153, 20482220, 17731554, 14823040, 12102898, - 8706331, 6171954, 4351731, 3064349, 2158547, 1206088, 675466, - 378912, 212775, 1}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-2, -339200, -601729, -1065360, -1879405, -3292791, - -4583180, -6333406, -8654668, -11621117, -15180664, -17738211, - -20225634, -22361078, -23823152, -24345457, -23823152, -22361075, - -20225636, -17738211, -15180665, -11621117, -8654668, -6333405, - -4583180, -3292791, -1879405, -1065360, -601729, -339200, - -2}, - {-3, -568956, -1007709, -1779214, -3123784, -5429322, - -7504043, -10275508, -13882193, -18389592, -23668005, -27385003, - -30947359, -33968641, -36019338, -36748625, -36019341, -33968638, - -30947359, -27385003, -23668005, -18389591, -13882193, -10275507, - -7504044, -5429322, -3123785, -1779214, -1007709, -568956, - -3}, - }, + + {0.0000000112f, 0.0021631867f, 0.0038622953f, 0.0069175921f, + 0.0124585070f, 0.0226575322f, 0.0326844826f, 0.0475502722f, + 0.0700030923f, 0.1121732593f, 0.1955563575f, 0.3002188206f, + 0.4916100204f, 0.8663684726f, 1.5518785715f, 2.0947239399f, + 1.5518792868f, 0.8663681746f, 0.4916101992f, 0.3002188802f, + 0.1955563724f, 0.1121732593f, 0.0700030923f, 0.0475502647f, + 0.0326844826f, 0.0226575322f, 0.0124585107f, 0.0069175921f, + 0.0038622990f, 0.0021631867f, 0.0000000112f}, + {0.0000000112f, 0.0020262338f, 0.0036168285f, 0.0064748600f, + 0.0116508938f, 0.0211532526f, 0.0304619409f, 0.0441976078f, + 0.0647818819f, 0.1009718925f, 0.1710277200f, 0.2535218894f, + 0.3905530572f, 0.6167424917f, 0.9282655120f, 1.1122729778f, + 0.9282657504f, 0.6167424321f, 0.3905531764f, 0.2535219491f, + 0.1710277200f, 0.1009718925f, 0.0647818893f, 0.0441976003f, + 0.0304619446f, 0.0211532526f, 0.0116508938f, 0.0064748600f, + 0.0036168285f, 0.0020262338f, 0.0000000112f}, + {0.0000000112f, 0.0018181130f, 0.0032440424f, 0.0058033094f, + 0.0104286373f, 0.0188865550f, 0.0271281339f, 0.0392048396f, + 0.0570997633f, 0.0855292231f, 0.1394104809f, 0.1978723854f, + 0.2847255766f, 0.4054926634f, 0.5376322269f, 0.6018700600f, + 0.5376324654f, 0.4054926336f, 0.2847256362f, 0.1978723705f, + 0.1394104958f, 0.0855292156f, 0.0570997633f, 0.0392048359f, + 0.0271281414f, 0.0188865550f, 0.0104286373f, 0.0058033094f, + 0.0032440424f, 0.0018181130f, 0.0000000112f}, + {0.0000000075f, 0.0012971871f, 0.0023122616f, 0.0041290298f, + 0.0073956437f, 0.0133119002f, 0.0190039091f, 0.0272102095f, + 0.0390642695f, 0.0561143905f, 0.0809218511f, 0.1064853519f, + 0.1382554471f, 0.1733477712f, 0.2032404840f, 0.2154063582f, + 0.2032404691f, 0.1733477414f, 0.1382554919f, 0.1064853519f, + 0.0809218585f, 0.0561143905f, 0.0390642732f, 0.0272102095f, + 0.0190039091f, 0.0133118965f, 0.0073956437f, 0.0041290298f, + 0.0023122616f, 0.0012971871f, 0.0000000075f}, + {0.0000000037f, 0.0007926486f, 0.0014115572f, 0.0025163032f, + 0.0044930279f, 0.0080412142f, 0.0114155896f, 0.0162114613f, + 0.0229923241f, 0.0324336104f, 0.0450868048f, 0.0552201271f, + 0.0660551786f, 0.0763022155f, 0.0853320509f, 0.0887728706f, + 0.0853320658f, 0.0763022155f, 0.0660551861f, 0.0552201271f, + 0.0450868085f, 0.0324336104f, 0.0229923204f, 0.0162114613f, + 0.0114155896f, 0.0080412142f, 0.0044930279f, 0.0025163069f, + 0.0014115572f, 0.0007926486f, 0.0000000037f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000075f, -0.0012636185f, -0.0022416152f, -0.0039687753f, + -0.0070013292f, -0.0122666024f, -0.0170736760f, -0.0235937759f, + -0.0322411507f, -0.0432920344f, -0.0565523803f, -0.0660799891f, + -0.0753463581f, -0.0833015069f, -0.0887481570f, -0.0906938910f, + -0.0887481570f, -0.0833014995f, -0.0753463656f, -0.0660799891f, + -0.0565523840f, -0.0432920344f, -0.0322411507f, -0.0235937722f, + -0.0170736760f, -0.0122666024f, -0.0070013292f, -0.0039687753f, + -0.0022416152f, -0.0012636185f, -0.0000000075f}, + {-0.0000000112f, -0.0021195263f, -0.0037540086f, -0.0066280887f, + -0.0116370022f, -0.0202258006f, -0.0279547386f, -0.0382792503f, + -0.0517151989f, -0.0685065687f, -0.0881701857f, -0.1020170897f, + -0.1152879000f, -0.1265430450f, -0.1341824830f, -0.1368992925f, + -0.1341824979f, -0.1265430450f, -0.1152879000f, -0.1020170897f, + -0.0881701857f, -0.0685065687f, -0.0517151989f, -0.0382792465f, + -0.0279547423f, -0.0202258006f, -0.0116370060f, -0.0066280887f, + -0.0037540086f, -0.0021195263f, -0.0000000112f}}, { - {6, 1071630, 1911498, 3417563, 6135013, 11088914, - 15896313, 22903491, 33199122, 48417342, 76625352, 105748897, - 146157663, 197317649, 247522954, 270025220, 247523007, 197317609, - 146157677, 105748911, 76625358, 48417339, 33199122, 22903489, - 15896315, 11088914, 6135014, 3417563, 1911498, 1071630, - 6}, - {6, 1003864, 1790265, 3199659, 5740058, 10362246, - 14836235, 21336046, 30836947, 44762529, 68827352, 93516444, - 126532850, 166393343, 203549915, 219611675, 203549942, 166393329, - 126532890, 93516458, 68827345, 44762533, 30836947, 21336044, - 14836238, 10362246, 5740058, 3199659, 1790265, 1003864, - 6}, - {5, 900860, 1606086, 2868917, 5141592, 9264643, - 13240197, 18987806, 27325827, 39399651, 58130785, 77340471, - 101814498, 129653024, 154062530, 164186529, 154062570, 129653010, - 101814518, 77340465, 58130799, 39399651, 27325825, 18987804, - 13240199, 9264643, 5141593, 2868916, 1606086, 900860, - 5}, - {4, 642936, 1145384, 2043195, 3652724, 6551933, 9321545, - 13279574, 18921455, 26872435, 37720428, 46584834, 57725379, 69582952, - 78984425, 82641458, 78984418, 69582945, 57725385, 46584838, 37720430, - 26872435, 18921455, 13279574, 9321546, 6551933, 3652724, 2043195, - 1145384, 642936, 4}, - {2, 392979, 699578, 1246311, 2222848, 3970080, 5624911, - 7965245, 11250448, 15776818, 21752506, 26460378, 31414826, 35997601, - 39328568, 40559278, 39328574, 35997598, 31414830, 26460379, 21752508, - 15776818, 11250448, 7965244, 5624912, 3970080, 2222848, 1246312, - 699578, 392979, 2}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-4, -627208, -1113257, -1972926, -3486308, -6125748, - -8548319, -11853212, -16268999, -21963760, -28868934, -33875539, - -38778795, -43013409, -45925473, -46968213, -45925477, -43013404, - -38778795, -33875539, -28868932, -21963758, -16269000, -11853212, - -8548319, -6125747, -3486308, -1972926, -1113257, -627208, - -4}, - {-6, -1052552, -1865940, -3299774, -5809354, -10143366, - -14075579, -19373580, -26341292, -35156400, -45615994, -53060594, - -60250430, -66386576, -70569981, -72061118, -70569981, -66386576, - -60250430, -53060594, -45615994, -35156400, -26341290, -19373580, - -14075582, -10143365, -5809354, -3299775, -1865940, -1052552, - -6}, - }, + + {0.0000000224f, 0.0039921328f, 0.0071208850f, 0.0127314143f, + 0.0228547044f, 0.0413094237f, 0.0592183806f, 0.0853221565f, + 0.1236763671f, 0.1803686619f, 0.2854516804f, 0.3939453363f, + 0.5444797277f, 0.7350655198f, 0.9220948815f, 1.0059223175f, + 0.9220950603f, 0.7350654006f, 0.5444797873f, 0.3939453959f, + 0.2854517102f, 0.1803686470f, 0.1236763671f, 0.0853221416f, + 0.0592183881f, 0.0413094237f, 0.0228547081f, 0.0127314143f, + 0.0071208850f, 0.0039921328f, 0.0000000224f}, + {0.0000000224f, 0.0037396848f, 0.0066692568f, 0.0119196586f, + 0.0213833824f, 0.0386023745f, 0.0552692823f, 0.0794829652f, + 0.1148765832f, 0.1667534113f, 0.2564018667f, 0.3483759165f, + 0.4713715911f, 0.6198635101f, 0.7582825422f, 0.8181172609f, + 0.7582826018f, 0.6198634505f, 0.4713717401f, 0.3483759463f, + 0.2564018369f, 0.1667534262f, 0.1148765832f, 0.0794829577f, + 0.0552692935f, 0.0386023745f, 0.0213833824f, 0.0119196586f, + 0.0066692568f, 0.0037396848f, 0.0000000224f}, + {0.0000000186f, 0.0033559650f, 0.0059831366f, 0.0106875487f, + 0.0191539228f, 0.0345134847f, 0.0493235774f, 0.0707350895f, + 0.1017966419f, 0.1467751414f, 0.2165540457f, 0.2881157100f, + 0.3792885542f, 0.4829951525f, 0.5739276409f, 0.6116424799f, + 0.5739278197f, 0.4829950929f, 0.3792886436f, 0.2881156802f, + 0.2165541053f, 0.1467751414f, 0.1017966270f, 0.0707350820f, + 0.0493235849f, 0.0345134847f, 0.0191539265f, 0.0106875449f, + 0.0059831366f, 0.0033559650f, 0.0000000186f}, + {0.0000000149f, 0.0023951232f, 0.0042668879f, 0.0076114945f, + 0.0136074573f, 0.0244078524f, 0.0347254612f, 0.0494702682f, + 0.0704879165f, 0.1001076251f, 0.1405195445f, 0.1735420227f, + 0.2150437981f, 0.2592166960f, 0.2942399085f, 0.3078634143f, + 0.2942398787f, 0.2592166662f, 0.2150438130f, 0.1735420525f, + 0.1405195594f, 0.1001076251f, 0.0704879165f, 0.0494702682f, + 0.0347254649f, 0.0244078524f, 0.0136074573f, 0.0076114945f, + 0.0042668879f, 0.0023951232f, 0.0000000149f}, + {0.0000000075f, 0.0014639609f, 0.0026061311f, 0.0046428703f, + 0.0082807541f, 0.0147897005f, 0.0209544264f, 0.0296728499f, + 0.0419111848f, 0.0587732270f, 0.0810343996f, 0.0985725895f, + 0.1170293465f, 0.1341015100f, 0.1465103328f, 0.1510950923f, + 0.1465103626f, 0.1341015100f, 0.1170293614f, 0.0985725969f, + 0.0810344070f, 0.0587732270f, 0.0419111848f, 0.0296728462f, + 0.0209544301f, 0.0147897005f, 0.0082807541f, 0.0046428740f, + 0.0026061311f, 0.0014639609f, 0.0000000075f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000149f, -0.0023365319f, -0.0041472055f, -0.0073497221f, + -0.0129875094f, -0.0228201896f, -0.0318449698f, -0.0441566557f, + -0.0606067441f, -0.0818213820f, -0.1075451598f, -0.1261962205f, + -0.1444622725f, -0.1602374315f, -0.1710857153f, -0.1749702245f, + -0.1710857302f, -0.1602374166f, -0.1444622725f, -0.1261962205f, + -0.1075451523f, -0.0818213746f, -0.0606067479f, -0.0441566557f, + -0.0318449698f, -0.0228201859f, -0.0129875094f, -0.0073497221f, + -0.0041472055f, -0.0023365319f, -0.0000000149f}, + {-0.0000000224f, -0.0039210618f, -0.0069511682f, -0.0122926161f, + -0.0216415301f, -0.0377869830f, -0.0524356179f, -0.0721722096f, + -0.0981289595f, -0.1309677958f, -0.1699328125f, -0.1976661086f, + -0.2244503498f, -0.2473092675f, -0.2628936768f, -0.2684485912f, + -0.2628936768f, -0.2473092675f, -0.2244503498f, -0.1976661086f, + -0.1699328125f, -0.1309677958f, -0.0981289521f, -0.0721722096f, + -0.0524356291f, -0.0377869792f, -0.0216415301f, -0.0122926198f, + -0.0069511682f, -0.0039210618f, -0.0000000224f}}, { - {8, 1397585, 2489316, 4439077, 7931147, 14210400, - 20195533, 28725381, 40834574, 57795937, 80727756, 99273505, - 119386770, 142482397, 160470916, 167392556, 160470930, 142482397, - 119386770, 99273512, 80727763, 57795937, 40834574, 28725377, - 20195535, 14210399, 7931147, 4439077, 2489316, 1397584, - 8}, - {7, 1309358, 2331922, 4157610, 7425691, 13296383, - 18885003, 26837457, 38101253, 53825212, 74978579, 91990888, - 110257650, 129210677, 144934930, 150951463, 144934930, 129210664, - 110257648, 91990895, 74978579, 53825212, 38101253, 26837453, - 18885005, 13296383, 7425691, 4157609, 2331922, 1309358, - 7}, - {7, 1175217, 2092681, 3729980, 6658433, 11911178, - 16901999, 23987347, 33988892, 47881081, 66434656, 81236414, - 97003508, 111774386, 123343330, 128186677, 123343330, 111774379, - 97003515, 81236414, 66434672, 47881077, 33988888, 23987345, - 16901999, 11911179, 6658434, 3729980, 2092681, 1175217, - 7}, - {5, 839113, 1493583, 2660218, 4742594, 8463941, 11983129, - 16951064, 23906434, 33453557, 45991133, 55813174, 66094533, 75552445, - 82394424, 84915284, 82394424, 75552445, 66094548, 55813174, 45991133, - 33453557, 23906436, 16951064, 11983129, 8463941, 4742594, 2660218, - 1493583, 839113, 5}, - {3, 513107, 912949, 1624911, 2893228, 5151802, 7278195, - 10264146, 14413251, 20048070, 27340206, 32966174, 38772413, 44037903, - 47801358, 49178236, 47801358, 44037903, 38772413, 32966174, 27340206, - 20048066, 14413251, 10264145, 7278196, 5151802, 2893229, 1624911, - 912949, 513107, 3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-5, -820365, -1457305, -2586425, -4582112, -8086862, - -11330425, -15796197, -21835644, -29744455, -39510832, -46709311, - -53851837, -60092063, -64420965, -65978350, -64420972, -60092058, - -53851841, -46709311, -39510837, -29744455, -21835644, -15796194, - -11330427, -8086862, -4582112, -2586425, -1457305, -820365, - -5}, - {-8, -1377696, -2445727, -4335584, -7665132, -13479891, - -18825424, -26130668, -35913775, -48566394, -63959470, -75153128, - -86140892, -95649238, -102197714, -104544419, -102197714, -95649247, - -86140892, -75153132, -63959470, -48566394, -35913771, -26130665, - -18825426, -13479892, -7665133, -4335584, -2445727, -1377696, - -8}, - }, + + {0.0000000298f, 0.0052064098f, 0.0092734247f, 0.0165368505f, + 0.0295458250f, 0.0529378653f, 0.0752342194f, 0.1070103794f, + 0.1521206498f, 0.2153066397f, 0.3007343411f, 0.3698226213f, + 0.4447503686f, 0.5307883024f, 0.5978007317f, 0.6235858798f, + 0.5978007913f, 0.5307883024f, 0.4447503686f, 0.3698226511f, + 0.3007343411f, 0.2153066397f, 0.1521206498f, 0.1070103645f, + 0.0752342343f, 0.0529378615f, 0.0295458250f, 0.0165368505f, + 0.0092734247f, 0.0052064061f, 0.0000000298f}, + {0.0000000261f, 0.0048777387f, 0.0086870864f, 0.0154883042f, + 0.0276628546f, 0.0495328866f, 0.0703521222f, 0.0999773145f, + 0.1419382244f, 0.2005145401f, 0.2793169618f, 0.3426927626f, + 0.4107417464f, 0.4813472927f, 0.5399246812f, 0.5623379946f, + 0.5399246812f, 0.4813472331f, 0.4107417464f, 0.3426927924f, + 0.2793169618f, 0.2005145401f, 0.1419382244f, 0.0999772996f, + 0.0703521222f, 0.0495328866f, 0.0276628546f, 0.0154883005f, + 0.0086870864f, 0.0048777387f, 0.0000000261f}, + {0.0000000261f, 0.0043780245f, 0.0077958442f, 0.0138952583f, + 0.0248045959f, 0.0443725958f, 0.0629648566f, 0.0893598348f, + 0.1266184896f, 0.1783709228f, 0.2474883795f, 0.3026292324f, + 0.3613662124f, 0.4163920283f, 0.4594897032f, 0.4775325954f, + 0.4594897032f, 0.4163919985f, 0.3613662422f, 0.3026292324f, + 0.2474884391f, 0.1783709079f, 0.1266184747f, 0.0893598199f, + 0.0629648566f, 0.0443725996f, 0.0248045996f, 0.0138952583f, + 0.0077958442f, 0.0043780245f, 0.0000000261f}, + {0.0000000186f, 0.0031259395f, 0.0055640303f, 0.0099100843f, + 0.0176675394f, 0.0315306373f, 0.0446406342f, 0.0631476343f, + 0.0890584067f, 0.1246242076f, 0.1713303179f, 0.2079202831f, + 0.2462213188f, 0.2814548016f, 0.3069431484f, 0.3163340688f, + 0.3069431484f, 0.2814548016f, 0.2462213784f, 0.2079202831f, + 0.1713303179f, 0.1246242076f, 0.0890584141f, 0.0631476343f, + 0.0446406342f, 0.0315306373f, 0.0176675394f, 0.0099100843f, + 0.0055640303f, 0.0031259395f, 0.0000000186f}, + {0.0000000112f, 0.0019114725f, 0.0034010001f, 0.0060532652f, + 0.0107781142f, 0.0191919580f, 0.0271133892f, 0.0382369235f, + 0.0536935441f, 0.0746848807f, 0.1018502042f, 0.1228085682f, + 0.1444384903f, 0.1640539765f, 0.1780739427f, 0.1832032055f, + 0.1780739427f, 0.1640539765f, 0.1444384903f, 0.1228085682f, + 0.1018502042f, 0.0746848658f, 0.0536935441f, 0.0382369198f, + 0.0271133929f, 0.0191919580f, 0.0107781179f, 0.0060532652f, + 0.0034010001f, 0.0019114725f, 0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000186f, -0.0030560978f, -0.0054288842f, -0.0096351840f, + -0.0170696974f, -0.0301259086f, -0.0422091223f, -0.0588454194f, + -0.0813441128f, -0.1108067334f, -0.1471893191f, -0.1740057468f, + -0.2006137222f, -0.2238603830f, -0.2399867922f, -0.2457885146f, + -0.2399868220f, -0.2238603532f, -0.2006137371f, -0.1740057468f, + -0.1471893340f, -0.1108067334f, -0.0813441128f, -0.0588454083f, + -0.0422091298f, -0.0301259086f, -0.0170696974f, -0.0096351840f, + -0.0054288842f, -0.0030560978f, -0.0000000186f}, + {-0.0000000298f, -0.0051323175f, -0.0091110431f, -0.0161513090f, + -0.0285548419f, -0.0502165072f, -0.0701301694f, -0.0973443240f, + -0.1337892413f, -0.1809239089f, -0.2382676005f, -0.2799672186f, + -0.3208998442f, -0.3563211858f, -0.3807161450f, -0.3894582987f, + -0.3807161450f, -0.3563212156f, -0.3208998442f, -0.2799672484f, + -0.2382676005f, -0.1809239089f, -0.1337892264f, -0.0973443091f, + -0.0701301768f, -0.0502165109f, -0.0285548456f, -0.0161513090f, + -0.0091110431f, -0.0051323175f, -0.0000000298f}}, { - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {8, 1414379, 2514989, 4471386, 7945941, 14099648, - 19853990, 27870592, 38887072, 53621760, 72308072, 86434552, - 100752688, 113511272, 122500216, 125762008, 122500216, 113511272, - 100752696, 86434560, 72308072, 53621760, 38887072, 27870588, - 19853994, 14099649, 7945942, 4471386, 2514989, 1414379, - 8}, - {7, 1269741, 2257800, 4014131, 7133370, 12657783, - 17823674, 25020474, 34910384, 48138264, 64913664, 77595552, - 90449464, 101903328, 109973032, 112901272, 109973040, 101903328, - 90449472, 77595544, 64913668, 48138264, 34910384, 25020472, - 17823674, 12657783, 7133370, 4014131, 2257800, 1269741, - 7}, - {5, 907074, 1612921, 2867604, 5095918, 9042434, 12732830, - 17874062, 24939188, 34388892, 46372856, 55432508, 64615056, 72797440, - 78562256, 80654120, 78562256, 72797432, 64615064, 55432508, 46372860, - 34388892, 24939190, 17874060, 12732831, 9042434, 5095919, 2867604, - 1612921, 907074, 5}, - {3, 554944, 986777, 1754387, 3117658, 5532118, 7789884, - 10935266, 15257677, 21038960, 28370692, 33913340, 39531184, 44537124, - 48064012, 49343804, 48064012, 44537124, 39531188, 33913344, 28370694, - 21038958, 15257676, 10935264, 7789885, 5532118, 3117659, 1754387, - 986777, 554944, 3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-5, -889081, -1580927, -2810721, -4994834, -8863066, - -12480257, -17519508, -24444488, -33706744, -45452992, -54332928, - -63333332, -71353408, -77003864, -79054240, -77003872, -71353400, - -63333336, -54332932, -45452992, -33706744, -24444488, -17519506, - -12480258, -8863066, -4994834, -2810722, -1580927, -889081, - -5}, - {-8, -1494381, -2657245, -4724303, -8395391, -14897174, - -20977002, -29447048, -41086664, -56654796, -76398072, -91323608, - -106451616, -119931880, -129429256, -132875552, -129429264, -119931872, - -106451624, -91323608, -76398072, -56654796, -41086660, -29447048, - -20977004, -14897174, -8395392, -4724303, -2657245, -1494381, - -8}, - }, + + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000298f, 0.0052689724f, 0.0093690641f, 0.0166572109f, + 0.0296009369f, 0.0525252819f, 0.0739618763f, 0.1038260460f, + 0.1448656321f, 0.1997566223f, 0.2693685591f, 0.3219937980f, + 0.3753330112f, 0.4228624403f, 0.4563488662f, 0.4684999883f, + 0.4563488662f, 0.4228624403f, 0.3753330410f, 0.3219938278f, + 0.2693685591f, 0.1997566223f, 0.1448656321f, 0.1038260311f, + 0.0739618912f, 0.0525252856f, 0.0296009406f, 0.0166572109f, + 0.0093690641f, 0.0052689724f, 0.0000000298f}, + {0.0000000261f, 0.0047301538f, 0.0084109604f, 0.0149538033f, + 0.0265738741f, 0.0471539162f, 0.0663983598f, 0.0932085291f, + 0.1300513148f, 0.1793290079f, 0.2418222427f, 0.2890659571f, + 0.3369505107f, 0.3796194792f, 0.4096814692f, 0.4205900133f, + 0.4096814990f, 0.3796194792f, 0.3369505405f, 0.2890659273f, + 0.2418222576f, 0.1793290079f, 0.1300513148f, 0.0932085216f, + 0.0663983598f, 0.0471539162f, 0.0265738741f, 0.0149538033f, + 0.0084109604f, 0.0047301538f, 0.0000000261f}, + {0.0000000186f, 0.0033791140f, 0.0060085990f, 0.0106826574f, + 0.0189837739f, 0.0336856917f, 0.0474334881f, 0.0665860698f, + 0.0929057151f, 0.1281086057f, 0.1727523506f, 0.2065021843f, + 0.2407098413f, 0.2711915970f, 0.2926672101f, 0.3004600108f, + 0.2926672101f, 0.2711915672f, 0.2407098711f, 0.2065021843f, + 0.1727523655f, 0.1281086057f, 0.0929057226f, 0.0665860623f, + 0.0474334918f, 0.0336856917f, 0.0189837776f, 0.0106826574f, + 0.0060085990f, 0.0033791140f, 0.0000000186f}, + {0.0000000112f, 0.0020673275f, 0.0036760308f, 0.0065356009f, + 0.0116141811f, 0.0206087455f, 0.0290195793f, 0.0407370403f, + 0.0568392761f, 0.0783762336f, 0.1056890637f, 0.1263370365f, + 0.1472651362f, 0.1659137160f, 0.1790523976f, 0.1838199943f, + 0.1790523976f, 0.1659137160f, 0.1472651511f, 0.1263370514f, + 0.1056890711f, 0.0783762261f, 0.0568392724f, 0.0407370329f, + 0.0290195830f, 0.0206087455f, 0.0116141848f, 0.0065356009f, + 0.0036760308f, 0.0020673275f, 0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000186f, -0.0033120848f, -0.0058894120f, -0.0104707517f, + -0.0186072066f, -0.0330174938f, -0.0464925803f, -0.0652652532f, + -0.0910628140f, -0.1255674064f, -0.1693255901f, -0.2024059296f, + -0.2359350473f, -0.2658121586f, -0.2868617475f, -0.2944999933f, + -0.2868617773f, -0.2658121288f, -0.2359350622f, -0.2024059445f, + -0.1693255901f, -0.1255674064f, -0.0910628140f, -0.0652652457f, + -0.0464925840f, -0.0330174938f, -0.0186072066f, -0.0104707554f, + -0.0058894120f, -0.0033120848f, -0.0000000186f}, + {-0.0000000298f, -0.0055670030f, -0.0098990090f, -0.0175994001f, + -0.0312752686f, -0.0554962978f, -0.0781454220f, -0.1096988022f, + -0.1530597508f, -0.2110555619f, -0.2846049964f, -0.3402069509f, + -0.3965631723f, -0.4467810690f, -0.4821615517f, -0.4950000048f, + -0.4821615815f, -0.4467810392f, -0.3965632021f, -0.3402069509f, + -0.2846049964f, -0.2110555619f, -0.1530597359f, -0.1096988022f, + -0.0781454295f, -0.0554962978f, -0.0312752724f, -0.0175994001f, + -0.0098990090f, -0.0055670030f, -0.0000000298f}}, { - {8, 1391582, 2470337, 4379084, 7741644, 13613249, - 19010161, 26384295, 36257343, 49022539, 64547234, 75833163, - 86908844, 96491282, 103089763, 105454176, 103089763, 96491282, - 86908853, 75833163, 64547238, 49022539, 36257339, 26384293, - 19010161, 13613249, 7741645, 4379084, 2470337, 1391582, - 8}, - {7, 1304089, 2315260, 4104938, 7259320, 12772176, 17844574, - 24783190, 34086927, 46138445, 60827299, 71526405, 82042242, 91152486, - 97432080, 99683437, 97432080, 91152486, 82042242, 71526405, 60827303, - 46138450, 34086925, 24783185, 17844576, 12772176, 7259321, 4104938, - 2315260, 1304089, 7}, - {7, 1170970, 2079253, 3687531, 6524358, 11488787, 16063809, - 22333018, 30758490, 41703962, 55090551, 64871110, 74507473, 82873663, - 88649667, 90722260, 88649667, 82873663, 74507478, 64871105, 55090551, - 41703958, 30758487, 22333016, 16063810, 11488788, 6524359, 3687531, - 2079253, 1170970, 7}, - {5, 836946, 1486730, 2638556, 4674179, 8248466, 11555710, - 16108120, 22262872, 30319524, 40263723, 47590046, 54856833, 61203586, - 65605295, 67188663, 65605295, 61203577, 54856842, 47590051, 40263727, - 30319524, 22262872, 16108119, 11555711, 8248465, 4674180, 2638556, - 1486730, 836946, 5}, - {3, 512296, 910384, 1616803, 2867623, 5071172, 7118297, - 9948958, 13799293, 18879451, 25211243, 29918726, 34622925, 38759520, - 41643504, 42683904, 41643508, 38759520, 34622927, 29918726, 25211247, - 18879449, 13799293, 9948957, 7118298, 5071172, 2867623, 1616803, - 910384, 512296, 3}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-5, -822447, -1463889, -2607236, -4647839, -8293870, - -11741041, -16605976, -23414447, -32754663, -45010867, -54604470, - -64638843, -73862135, -80529791, -82985440, -80529802, -73862128, - -64638843, -54604470, -45010867, -32754663, -23414447, -16605974, - -11741041, -8293870, -4647839, -2607236, -1463889, -822447, - -5}, - {-8, -1383579, -2464327, -4394383, -7850861, -14065144, - -19987153, -28424958, -40399126, -57162277, -79807994, -98105864, - -117845265, -140317170, -157927676, -164697636, -157927690, -140317157, - -117845279, -98105864, -79807994, -57162277, -40399126, -28424956, - -19987155, -14065143, -7850863, -4394383, -2464328, -1383579, - -8}, - }, + + {0.0000000298f, 0.0051840469f, 0.0092027225f, 0.0163133591f, + 0.0288398713f, 0.0507133044f, 0.0708183646f, 0.0982891619f, + 0.1350691319f, 0.1826231927f, 0.2404571772f, 0.2825005352f, + 0.3237606883f, 0.3594580293f, 0.3840392828f, 0.3928474188f, + 0.3840392828f, 0.3594580293f, 0.3237607181f, 0.2825005352f, + 0.2404572070f, 0.1826231927f, 0.1350691170f, 0.0982891470f, + 0.0708183646f, 0.0507133044f, 0.0288398750f, 0.0163133591f, + 0.0092027225f, 0.0051840469f, 0.0000000298f}, + {0.0000000261f, 0.0048581101f, 0.0086250156f, 0.0152920857f, + 0.0270430744f, 0.0475800633f, 0.0664762184f, 0.0923245773f, + 0.1269837022f, 0.1718790978f, 0.2265993506f, 0.2664566338f, + 0.3056311607f, 0.3395694792f, 0.3629627824f, 0.3713497519f, + 0.3629627824f, 0.3395694792f, 0.3056311607f, 0.2664566338f, + 0.2265993655f, 0.1718791127f, 0.1269836873f, 0.0923245549f, + 0.0664762259f, 0.0475800633f, 0.0270430781f, 0.0152920857f, + 0.0086250156f, 0.0048581101f, 0.0000000261f}, + {0.0000000261f, 0.0043622032f, 0.0077458210f, 0.0137371235f, + 0.0243051276f, 0.0427990668f, 0.0598423518f, 0.0831969753f, + 0.1145843044f, 0.1553593576f, 0.2052282989f, 0.2416637242f, + 0.2775619626f, 0.3087284565f, 0.3302457333f, 0.3379667401f, + 0.3302457333f, 0.3087284565f, 0.2775619924f, 0.2416636944f, + 0.2052282989f, 0.1553593576f, 0.1145842969f, 0.0831969678f, + 0.0598423555f, 0.0427990705f, 0.0243051313f, 0.0137371235f, + 0.0077458210f, 0.0043622032f, 0.0000000261f}, + {0.0000000186f, 0.0031178668f, 0.0055385008f, 0.0098293871f, + 0.0174126737f, 0.0307279304f, 0.0430483744f, 0.0600074232f, + 0.0829356611f, 0.1129490286f, 0.1499940604f, 0.1772867441f, + 0.2043576241f, 0.2280011177f, 0.2443987727f, 0.2502972782f, + 0.2443987727f, 0.2280010879f, 0.2043576539f, 0.1772867590f, + 0.1499940753f, 0.1129490286f, 0.0829356611f, 0.0600074194f, + 0.0430483781f, 0.0307279266f, 0.0174126774f, 0.0098293871f, + 0.0055385008f, 0.0031178668f, 0.0000000186f}, + {0.0000000112f, 0.0019084513f, 0.0033914447f, 0.0060230605f, + 0.0106827281f, 0.0188915879f, 0.0265177228f, 0.0370627567f, + 0.0514063723f, 0.0703314394f, 0.0939192027f, 0.1114559397f, + 0.1289804429f, 0.1443904638f, 0.1551341414f, 0.1590099335f, + 0.1551341563f, 0.1443904638f, 0.1289804578f, 0.1114559397f, + 0.0939192176f, 0.0703314245f, 0.0514063723f, 0.0370627530f, + 0.0265177265f, 0.0188915879f, 0.0106827281f, 0.0060230605f, + 0.0033914447f, 0.0019084513f, 0.0000000112f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000186f, -0.0030638538f, -0.0054534115f, -0.0097127110f, + -0.0173145495f, -0.0308970734f, -0.0437387861f, -0.0618620813f, + -0.0872256160f, -0.1220206320f, -0.1676785499f, -0.2034175098f, + -0.2407984585f, -0.2751578987f, -0.2999968529f, -0.3091448545f, + -0.2999968827f, -0.2751578689f, -0.2407984585f, -0.2034175098f, + -0.1676785499f, -0.1220206320f, -0.0872256160f, -0.0618620738f, + -0.0437387861f, -0.0308970734f, -0.0173145495f, -0.0097127110f, + -0.0054534115f, -0.0030638538f, -0.0000000186f}, + {-0.0000000298f, -0.0051542334f, -0.0091803335f, -0.0163703524f, + -0.0292467363f, -0.0523967445f, -0.0744579434f, -0.1058912203f, + -0.1504984796f, -0.2129460722f, -0.2973079383f, -0.3654728234f, + -0.4390078187f, -0.5227221847f, -0.5883264542f, -0.6135464907f, + -0.5883265138f, -0.5227221251f, -0.4390078783f, -0.3654728234f, + -0.2973079383f, -0.2129460722f, -0.1504984796f, -0.1058912128f, + -0.0744579583f, -0.0523967408f, -0.0292467438f, -0.0163703524f, + -0.0091803372f, -0.0051542334f, -0.0000000298f}}, { - {6, 1063142, 1884657, 3332697, 5866781, 10242063, 14210621, - 19556019, 26583493, 35470370, 46010131, 53508858, 60748887, 66926417, - 71137316, 72638124, 71137318, 66926416, 60748892, 53508858, 46010131, - 35470372, 26583491, 19556017, 14210622, 10242063, 5866782, 3332697, - 1884657, 1063142, 6}, - {6, 996412, 1766700, 3125152, 5504595, 9619094, 13357673, - 18402690, 25050711, 33480946, 43509461, 50662435, 57581418, 63494088, - 67528881, 68967747, 67528880, 63494088, 57581423, 50662440, 43509461, - 33480946, 25050711, 18402688, 13357674, 9619095, 5504595, 3125152, - 1766700, 996411, 6}, - {5, 894855, 1587095, 2808874, 4951864, 8666115, 12050171, - 16630010, 22687072, 30401455, 39622952, 46227143, 52634611, 58124051, - 61876873, 63216472, 61876878, 58124046, 52634616, 46227147, 39622956, - 30401453, 22687072, 16630009, 12050171, 8666116, 4951865, 2808874, - 1587094, 894855, 5}, - {4, 639871, 1135693, 2012557, 3555941, 6246901, 8715881, - 12082770, 16579122, 22374147, 29395768, 34483545, 39463825, 43763098, - 46718682, 47776819, 46718682, 43763093, 39463829, 34483548, 29395770, - 22374147, 16579122, 12082770, 8715881, 6246901, 3555942, 2012557, - 1135693, 639871, 4}, - {2, 391832, 695950, 1234845, 2186633, 3856010, 5398615, - 7518850, 10379695, 14115083, 18711422, 22088181, 25429856, 28342458, - 30359295, 31084165, 30359297, 28342458, 25429858, 22088183, 18711424, - 14115081, 10379695, 7518850, 5398616, 3856010, 2186634, 1234845, - 695950, 391832, 2}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-4, -630153, -1122569, -2002361, -3579289, -6418785, - -9130134, -13002760, -18518365, -26281781, -36854217, -45475104, - -56006945, -67371285, -76348185, -79832098, -76348192, -67371278, - -56006952, -45475104, -36854222, -26281779, -18518367, -13002758, - -9130135, -6418785, -3579289, -2002362, -1122569, -630153, - -4}, - {-6, -1060871, -1892248, -3382952, -6072245, -10973304, - -15727476, -22653422, -32821252, -47830065, -75342945, -103710871, - -142829663, -191958009, -239742101, -261023247, -239742154, -191957982, - -142829663, -103710864, -75342952, -47830065, -32821248, -22653422, - -15727478, -10973304, -6072246, -3382952, -1892248, -1060871, - -6}, - }, + + {0.0000000224f, 0.0039605126f, 0.0070208944f, 0.0124152638f, + 0.0218554623f, 0.0381546579f, 0.0529386885f, 0.0728518516f, + 0.0990312248f, 0.1321374178f, 0.1714010984f, 0.1993360221f, + 0.2263072431f, 0.2493203282f, 0.2650071383f, 0.2705981135f, + 0.2650071681f, 0.2493203282f, 0.2263072580f, 0.1993360221f, + 0.1714010984f, 0.1321374327f, 0.0990312248f, 0.0728518367f, + 0.0529386923f, 0.0381546579f, 0.0218554661f, 0.0124152638f, + 0.0070208944f, 0.0039605126f, 0.0000000224f}, + {0.0000000224f, 0.0037119240f, 0.0065814704f, 0.0116420984f, + 0.0205062144f, 0.0358339176f, 0.0497612096f, 0.0685553625f, + 0.0933211744f, 0.1247262433f, 0.1620853692f, 0.1887322813f, + 0.2145074904f, 0.2365339100f, 0.2515646815f, 0.2569248676f, + 0.2515646815f, 0.2365339100f, 0.2145075202f, 0.1887322962f, + 0.1620853692f, 0.1247262433f, 0.0933211744f, 0.0685553551f, + 0.0497612134f, 0.0358339213f, 0.0205062144f, 0.0116420984f, + 0.0065814704f, 0.0037119202f, 0.0000000224f}, + {0.0000000186f, 0.0033335947f, 0.0059123896f, 0.0104638711f, + 0.0184471309f, 0.0322837941f, 0.0448903851f, 0.0619516149f, + 0.0845159292f, 0.1132542491f, 0.1476069987f, 0.1722095311f, + 0.1960792094f, 0.2165289670f, 0.2305093110f, 0.2354997098f, + 0.2305093408f, 0.2165289521f, 0.1960792243f, 0.1722095460f, + 0.1476070136f, 0.1132542342f, 0.0845159292f, 0.0619516112f, + 0.0448903851f, 0.0322837979f, 0.0184471346f, 0.0104638711f, + 0.0059123859f, 0.0033335947f, 0.0000000186f}, + {0.0000000149f, 0.0023837052f, 0.0042307861f, 0.0074973591f, + 0.0132469125f, 0.0232715197f, 0.0324691869f, 0.0450118259f, + 0.0617620423f, 0.0833501965f, 0.1095077693f, 0.1284612119f, + 0.1470142007f, 0.1630302370f, 0.1740406454f, 0.1779825240f, + 0.1740406454f, 0.1630302221f, 0.1470142156f, 0.1284612268f, + 0.1095077768f, 0.0833501965f, 0.0617620423f, 0.0450118259f, + 0.0324691869f, 0.0232715197f, 0.0132469162f, 0.0074973591f, + 0.0042307861f, 0.0023837052f, 0.0000000149f}, + {0.0000000075f, 0.0014596879f, 0.0025926158f, 0.0046001561f, + 0.0081458427f, 0.0143647566f, 0.0201114081f, 0.0280098990f, + 0.0386673771f, 0.0525827818f, 0.0697054788f, 0.0822848827f, + 0.0947335958f, 0.1055838838f, 0.1130971909f, 0.1157975346f, + 0.1130971909f, 0.1055838838f, 0.0947336033f, 0.0822848976f, + 0.0697054863f, 0.0525827743f, 0.0386673771f, 0.0280098990f, + 0.0201114118f, 0.0143647566f, 0.0081458464f, 0.0046001561f, + 0.0025926158f, 0.0014596879f, 0.0000000075f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000149f, -0.0023475029f, -0.0041818954f, -0.0074593760f, + -0.0133338906f, -0.0239118375f, -0.0340123996f, -0.0484390557f, + -0.0689862818f, -0.0979072601f, -0.1372926533f, -0.1694079638f, + -0.2086421251f, -0.2509776056f, -0.2844191492f, -0.2973977327f, + -0.2844191790f, -0.2509775758f, -0.2086421549f, -0.1694079638f, + -0.1372926831f, -0.0979072601f, -0.0689862967f, -0.0484390482f, + -0.0340124033f, -0.0239118375f, -0.0133338906f, -0.0074593797f, + -0.0041818954f, -0.0023475029f, -0.0000000149f}, + {-0.0000000224f, -0.0039520524f, -0.0070491731f, -0.0126024783f, + -0.0226208754f, -0.0408787429f, -0.0585894138f, -0.0843905732f, + -0.1222686917f, -0.1781808734f, -0.2806743383f, -0.3863531053f, + -0.5320819616f, -0.7150993347f, -0.8931089044f, -0.9723873734f, + -0.8931091428f, -0.7150992155f, -0.5320819616f, -0.3863530755f, + -0.2806743681f, -0.1781808734f, -0.1222686768f, -0.0843905732f, + -0.0585894212f, -0.0408787429f, -0.0226208791f, -0.0126024783f, + -0.0070491731f, -0.0039520524f, -0.0000000224f}}, { - {3, 574674, 1017796, 1796900, 3154467, 5481590, 7575015, - 10370478, 14006828, 18549080, 23865568, 27607848, 31193405, 34233658, - 36296899, 37030586, 36296899, 34233658, 31193408, 27607848, 23865571, - 18549080, 14006828, 10370477, 7575016, 5481590, 3154468, 1796900, - 1017796, 574674, 3}, - {3, 538644, 954220, 1685385, 2960884, 5151503, 7126421, - 9769579, 13217235, 17537303, 22610486, 26190946, 29627874, 32546498, - 34529288, 35234744, 34529288, 32546498, 29627877, 26190948, 22610486, - 17537303, 13217235, 9769578, 7126422, 5151503, 2960885, 1685385, - 954220, 538644, 3}, - {3, 483799, 857386, 1515349, 2665173, 4645760, 6437352, - 8843606, 11995830, 15965511, 20652239, 23974315, 27173119, 29896409, - 31749793, 32409812, 31749796, 29896409, 27173119, 23974315, 20652239, - 15965511, 11995830, 8843605, 6437353, 4645760, 2665173, 1515349, - 857386, 483799, 3}, - {2, 346044, 613840, 1086712, 1916795, 3357477, 4672194, - 6454554, 8816978, 11833772, 15450673, 18047553, 20571855, 22737956, - 24220523, 24750056, 24220523, 22737954, 20571857, 18047553, 15450673, - 11833773, 8816979, 6454554, 4672195, 3357477, 1916795, 1086712, - 613840, 346044, 2}, - {1, 211963, 376347, 667357, 1180477, 2077857, 2904213, - 4035615, 5554462, 7524805, 9930550, 11685603, 13412725, 14910620, - 15943945, 16314576, 15943947, 14910620, 13412727, 11685603, 9930550, - 7524804, 5554462, 4035615, 2904213, 2077857, 1180477, 667357, - 376347, 211963, 1}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {-2, -341283, -608313, -1086175, -1945172, -3500199, - -4995375, -7149356, -10257165, -14719092, -21095208, -27678681, - -35807499, -44718702, -52254129, -55306469, -52254132, -44718696, - -35807502, -27678681, -21095206, -14719093, -10257165, -7149355, - -4995375, -3500199, -1945172, -1086175, -608313, -341283, - -2}, - {-3, -574839, -1026313, -1838045, -3309836, -6017788, - -8678530, -12620301, -18566315, -29617669, -51387072, -78419391, - -127027637, -219233301, -378389804, -496424308, -378390018, -219233261, - -127027650, -78419391, -51387075, -29617669, -18566313, -12620300, - -8678531, -6017788, -3309837, -1838046, -1026313, -574839, - -3}, - }, -}; -const WORD32 ixheaacd_re_weight_Q28[16][8][31] = { + {0.0000000112f, 0.0021408275f, 0.0037915856f, 0.0066939741f, + 0.0117513053f, 0.0204205140f, 0.0282191299f, 0.0386330411f, + 0.0521795005f, 0.0691007078f, 0.0889061689f, 0.1028472483f, + 0.1162044853f, 0.1275303066f, 0.1352164894f, 0.1379496753f, + 0.1352164894f, 0.1275303066f, 0.1162045002f, 0.1028472483f, + 0.0889061838f, 0.0691007078f, 0.0521795005f, 0.0386330374f, + 0.0282191336f, 0.0204205140f, 0.0117513090f, 0.0066939741f, + 0.0037915856f, 0.0021408275f, 0.0000000112f}, + {0.0000000112f, 0.0020066053f, 0.0035547465f, 0.0062785484f, + 0.0110301524f, 0.0191908441f, 0.0265479870f, 0.0363945179f, + 0.0492380373f, 0.0653315485f, 0.0842306241f, 0.0975688770f, + 0.1103724316f, 0.1212451532f, 0.1286316216f, 0.1312596500f, + 0.1286316216f, 0.1212451532f, 0.1103724390f, 0.0975688845f, + 0.0842306241f, 0.0653315485f, 0.0492380373f, 0.0363945141f, + 0.0265479907f, 0.0191908441f, 0.0110301562f, 0.0062785484f, + 0.0035547465f, 0.0020066053f, 0.0000000112f}, + {0.0000000112f, 0.0018022917f, 0.0031940117f, 0.0056451149f, + 0.0099285431f, 0.0173068047f, 0.0239810050f, 0.0329449996f, + 0.0446879491f, 0.0594761632f, 0.0769355893f, 0.0893112868f, + 0.1012277603f, 0.1113727987f, 0.1182771921f, 0.1207359582f, + 0.1182772070f, 0.1113727987f, 0.1012277603f, 0.0893112868f, + 0.0769355893f, 0.0594761632f, 0.0446879491f, 0.0329449959f, + 0.0239810087f, 0.0173068047f, 0.0099285431f, 0.0056451149f, + 0.0031940117f, 0.0018022917f, 0.0000000112f}, + {0.0000000075f, 0.0012891144f, 0.0022867322f, 0.0040483177f, + 0.0071406178f, 0.0125075765f, 0.0174052790f, 0.0240450874f, + 0.0328458026f, 0.0440842360f, 0.0575582422f, 0.0672323704f, + 0.0766361356f, 0.0847054869f, 0.0902284831f, 0.0922011435f, + 0.0902284831f, 0.0847054794f, 0.0766361356f, 0.0672323704f, + 0.0575582422f, 0.0440842398f, 0.0328458063f, 0.0240450874f, + 0.0174052827f, 0.0125075765f, 0.0071406178f, 0.0040483177f, + 0.0022867322f, 0.0012891144f, 0.0000000075f}, + {0.0000000037f, 0.0007896237f, 0.0014020018f, 0.0024860986f, + 0.0043976195f, 0.0077406205f, 0.0108190365f, 0.0150338374f, + 0.0206919834f, 0.0280320831f, 0.0369941816f, 0.0435322635f, + 0.0499662943f, 0.0555463880f, 0.0593958236f, 0.0607765317f, + 0.0593958311f, 0.0555463880f, 0.0499663018f, 0.0435322635f, + 0.0369941816f, 0.0280320793f, 0.0206919834f, 0.0150338374f, + 0.0108190365f, 0.0077406205f, 0.0043976195f, 0.0024860986f, + 0.0014020018f, 0.0007896237f, 0.0000000037f}, + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {-0.0000000075f, -0.0012713782f, -0.0022661425f, -0.0040463172f, + -0.0072463304f, -0.0130392574f, -0.0186092220f, -0.0266334265f, + -0.0382109173f, -0.0548328906f, -0.0785857737f, -0.1031111181f, + -0.1333933324f, -0.1665901542f, -0.1946617961f, -0.2060326487f, + -0.1946618110f, -0.1665901244f, -0.1333933473f, -0.1031111181f, + -0.0785857663f, -0.0548328944f, -0.0382109173f, -0.0266334228f, + -0.0186092220f, -0.0130392574f, -0.0072463304f, -0.0040463172f, + -0.0022661425f, -0.0012713782f, -0.0000000075f}, + {-0.0000000112f, -0.0021414421f, -0.0038233139f, -0.0068472512f, + -0.0123300999f, -0.0224180073f, -0.0323300436f, -0.0470142849f, + -0.0691649169f, -0.1103344113f, -0.1914317608f, -0.2921350002f, + -0.4732148349f, -0.8167076707f, -1.4096118212f, -1.8493247032f, + -1.4096126556f, -0.8167075515f, -0.4732148647f, -0.2921350002f, + -0.1914317757f, -0.1103344113f, -0.0691649020f, -0.0470142812f, + -0.0323300473f, -0.0224180073f, -0.0123301037f, -0.0068472549f, + -0.0038233139f, -0.0021414421f, -0.0000000112f}}}; + +const FLOAT32 ixheaacd_re_weight[16][8][31] = { + { - {134217728, 133460863, 132868901, 131810111, 129908442, 126470291, - 123168465, 118415202, 111553289, 101653880, 87503416, 75055587, - 59853017, 41890564, 21615401, 0, -21615400, -41890567, - -59853022, -75055592, -87503416, -101653880, -111553289, -118415202, - -123168474, -126470291, -129908442, -131810119, -132868916, -133460855, - -134217736}, - {134217728, 133507641, 132951036, 131952906, 130152305, 126873835, - 123700894, 119097743, 112392608, 102624793, 88527346, 76037569, - 60709668, 42530952, 21959413, 0, -21959412, -42530956, - -60709668, -76037567, -88527354, -102624793, -112392608, -119097743, - -123700897, -126873843, -130152314, -131952906, -132951044, -133507625, - -134217736}, - {134217728, 133578889, 133076245, 132170971, 130525880, 127495076, - 124524084, 120158840, 113706267, 104156340, 90156022, 77607879, - 62086135, 43563841, 22515636, 0, -22515635, -43563843, - -62086140, -77607874, -90156032, -104156349, -113706267, -120158844, - -124524084, -127495076, -130525880, -132170971, -133076253, -133578881, - -134217736}, - {134217728, 133758012, 133391773, 132722523, 131476888, 129093806, - 126662688, 122949415, 117214012, 108319953, 94671025, 82017354, - 65996439, 46525651, 24120340, 0, -24120340, -46525655, - -65996434, -82017354, -94671025, -108319953, -117214003, -122949415, - -126662696, -129093806, -131476888, -132722531, -133391781, -133758012, - -134217736}, - {134217728, 133932649, 133700308, 133264733, 132420429, 130705061, - 128848242, 125853808, 120950424, 112880929, 99774559, 87108077, - 70599795, 50068507, 26060170, 0, -26060170, -50068507, - -70599792, -87108068, -99774568, -112880929, -120950424, -125853814, - -128848243, -130705069, -132420430, -133264733, -133700308, -133932641, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217744, 134655979, 134988239, 135559790, 136513776, 138005964, - 139162482, 140361258, 141138020, 140293965, 138371877, 136502930, - 126746944, 102804704, 59370579, 0, -59370579, -102804704, - -126746957, -136502930, -138371890, -140293970, -141138020, -140361258, - -139162497, -138005964, -136513792, -135559805, -134988239, -134655979, - -134217744}, - {134217744, 134962683, 135539295, 136557732, 138346233, 141452453, - 144288910, 148135620, 153292676, 175071409, 212428515, 254219167, - 323573619, 452387989, 709374650, 0, -709375876, -452387936, - -323573672, -254219167, -212428528, -175071409, -153292663, -148135606, - -144288924, -141452453, -138346233, -136557732, -135539295, -134962683, - -134217744}, - }, + + {0.5000000000f, 0.4971804619f, 0.4949752390f, 0.4910309315f, + 0.4839466512f, 0.4711385369f, 0.4588382840f, 0.4411309958f, + 0.4155683815f, 0.3786902130f, 0.3259756267f, 0.2796038389f, + 0.2229698598f, 0.1560545117f, 0.0805236399f, 0.0000000000f, + -0.0805236399f, -0.1560545266f, -0.2229698896f, -0.2796038687f, + -0.3259756267f, -0.3786902130f, -0.4155683815f, -0.4411309958f, + -0.4588383138f, -0.4711385369f, -0.4839466512f, -0.4910309613f, + -0.4949752688f, -0.4971804321f, -0.5000000000f}, + {0.5000000000f, 0.4973547161f, 0.4952812195f, 0.4915628731f, + 0.4848551154f, 0.4726418555f, 0.4608217478f, 0.4436736703f, + 0.4186950922f, 0.3823071420f, 0.3297900558f, 0.2832620144f, + 0.2261611372f, 0.1584401429f, 0.0818051845f, 0.0000000000f, + -0.0818051845f, -0.1584401578f, -0.2261611372f, -0.2832620144f, + -0.3297900856f, -0.3823071420f, -0.4186950922f, -0.4436736703f, + -0.4608217478f, -0.4726418853f, -0.4848551452f, -0.4915628731f, + -0.4952812195f, -0.4973546565f, -0.5000000000f}, + {0.5000000000f, 0.4976201355f, 0.4957476556f, 0.4923752248f, + 0.4862467945f, 0.4749561548f, 0.4638883471f, 0.4476265609f, + 0.4235888422f, 0.3880125880f, 0.3358573616f, 0.2891118824f, + 0.2312888801f, 0.1622879505f, 0.0838772804f, 0.0000000000f, + -0.0838772804f, -0.1622879654f, -0.2312888950f, -0.2891118526f, + -0.3358573914f, -0.3880126476f, -0.4235888422f, -0.4476265907f, + -0.4638883471f, -0.4749561548f, -0.4862467945f, -0.4923752248f, + -0.4957476854f, -0.4976201057f, -0.5000000000f}, + {0.5000000000f, 0.4982874393f, 0.4969230890f, 0.4944299161f, + 0.4897895753f, 0.4809119105f, 0.4718552828f, 0.4580222666f, + 0.4366562366f, 0.4035232663f, 0.3526770473f, 0.3055384457f, + 0.2458558977f, 0.1733215600f, 0.0898552686f, 0.0000000000f, + -0.0898552686f, -0.1733215749f, -0.2458558679f, -0.3055384457f, + -0.3526770473f, -0.4035232663f, -0.4366561770f, -0.4580222666f, + -0.4718553126f, -0.4809119105f, -0.4897895753f, -0.4944299459f, + -0.4969231188f, -0.4982874393f, -0.5000000000f}, + {0.5000000000f, 0.4989379942f, 0.4980724454f, 0.4964498281f, + 0.4933045506f, 0.4869143069f, 0.4799970984f, 0.4688419700f, + 0.4505754411f, 0.4205142260f, 0.3716892004f, 0.3245028853f, + 0.2630047202f, 0.1865197271f, 0.0970816985f, 0.0000000000f, + -0.0970816985f, -0.1865197271f, -0.2630047202f, -0.3245028257f, + -0.3716892302f, -0.4205142260f, -0.4505754411f, -0.4688419998f, + -0.4799970984f, -0.4869143367f, -0.4933045506f, -0.4964498281f, + -0.4980724454f, -0.4989379644f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000596f, 0.5016326308f, 0.5028703809f, 0.5049995780f, + 0.5085534453f, 0.5141122937f, 0.5184206367f, 0.5228864551f, + 0.5257800817f, 0.5226357579f, 0.5154753923f, 0.5085130334f, + 0.4721691608f, 0.3829773664f, 0.2211726457f, 0.0000000000f, + -0.2211726457f, -0.3829773664f, -0.4721692204f, -0.5085130334f, + -0.5154754519f, -0.5226357579f, -0.5257800817f, -0.5228864551f, + -0.5184206963f, -0.5141122937f, -0.5085535049f, -0.5049996376f, + -0.5028703809f, -0.5016326308f, -0.5000000596f}, + {0.5000000596f, 0.5027751923f, 0.5049232244f, 0.5087171793f, + 0.5153799057f, 0.5269514322f, 0.5375180840f, 0.5518481731f, + 0.5710597038f, 0.6521918178f, 0.7913578749f, 0.9470402002f, + 1.2054057121f, 1.6852766275f, 2.6426265240f, 0.0000000000f, + -2.6426310539f, -1.6852763891f, -1.2054058313f, -0.9470402002f, + -0.7913579345f, -0.6521918178f, -0.5710596442f, -0.5518481135f, + -0.5375181437f, -0.5269514322f, -0.5153799057f, -0.5087171793f, + -0.5049232244f, -0.5027751923f, -0.5000000596f}}, { - {134217728, 133517388, 132968168, 131982689, 130203271, 126958371, - 123812646, 119241372, 112569794, 102830521, 88745164, 76246965, - 60892748, 42668052, 22033146, 0, -22033144, -42668057, - -60892753, -76246965, -88745164, -102830531, -112569785, -119241363, - -123812654, -126958371, -130203280, -131982697, -132968160, -133517380, - -134217736}, - {134217728, 133560667, 133044207, 132115111, 130430074, 127335394, - 124312090, 119884885, 113366063, 103758318, 89731143, 77197214, - 61725371, 43292653, 22369435, 0, -22369434, -43292655, - -61725371, -77197209, -89731143, -103758309, -113366063, -119884894, - -124312098, -127335394, -130430074, -132115119, -133044215, -133560651, - -134217736}, - {134217728, 133626556, 133160120, 132317284, 130777308, 127915335, - 125083431, 120883935, 114610226, 105218864, 91295851, 78713132, - 63059915, 44297538, 22911785, 0, -22911782, -44297538, - -63059910, -78713137, -91295851, -105218855, -114610226, -120883935, - -125083440, -127915335, -130777308, -132317293, -133160128, -133626540, - -134217736}, - {134217728, 133792202, 133452102, 132828323, 131660297, 129405046, - 127082463, 123503081, 117919375, 109170723, 95610055, 82945267, - 66828178, 47161136, 24466610, 0, -24466610, -47161136, - -66828178, -82945267, -95610064, -109170725, -117919366, -123503090, - -127082486, -129405039, -131660312, -132828331, -133452110, -133792210, - -134217736}, - {134217728, 133953625, 133737455, 133330222, 132534982, 130902453, - 129118100, 126216242, 121423078, 113467678, 100443871, 87784612, - 71219199, 50550149, 26325706, 0, -26325706, -50550154, - -71219202, -87784612, -100443871, -113467678, -121423078, -126216226, - -129118109, -130902453, -132534997, -133330214, -133737456, -133953625, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217744, 134621813, 134927051, 135449572, 136313400, 137636071, - 138622650, 139566056, 139956832, 138536878, 133180717, 129783677, - 118675624, 94628804, 53853292, 0, -53853295, -94628804, - -118675637, -129783677, -133180717, -138536864, -139956832, -139566056, - -138622666, -137636071, -136313400, -135449556, -134927051, -134621813, - -134217744}, - {134217744, 134904883, 135435203, 136368502, 137996233, 140785045, - 143282261, 146575942, 150720567, 165849956, 193015182, 218765195, - 250475781, 276007380, 232012261, 0, -232012394, -276007380, - -250475807, -218765195, -193015209, -165849956, -150720553, -146575942, - -143282270, -140785029, -137996233, -136368502, -135435219, -134904883, - -134217744}, - }, + + {0.5000000000f, 0.4973910451f, 0.4953450263f, 0.4916738272f, + 0.4850449860f, 0.4729567766f, 0.4612380564f, 0.4442087412f, + 0.4193551540f, 0.3830735385f, 0.3306015134f, 0.2840420902f, + 0.2268431634f, 0.1589508802f, 0.0820798650f, 0.0000000000f, + -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420902f, + -0.3306015134f, -0.3830735683f, -0.4193551242f, -0.4442086816f, + -0.4612380862f, -0.4729567766f, -0.4850450158f, -0.4916738570f, + -0.4953449965f, -0.4973909855f, -0.5000000000f}, + {0.5000000000f, 0.4975522459f, 0.4956282973f, 0.4921671450f, + 0.4858898818f, 0.4743613005f, 0.4630986154f, 0.4466060102f, + 0.4223214984f, 0.3865298629f, 0.3342745602f, 0.2875820398f, + 0.2299449295f, 0.1612776965f, 0.0833326429f, 0.0000000000f, + -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f, + -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f, + -0.4630986452f, -0.4743613005f, -0.4858898818f, -0.4921671748f, + -0.4956283271f, -0.4975521863f, -0.5000000000f}, + {0.5000000000f, 0.4977977276f, 0.4960601032f, 0.4929202795f, + 0.4871834517f, 0.4765217602f, 0.4659720957f, 0.4503277540f, + 0.4269563556f, 0.3919708133f, 0.3401035368f, 0.2932292819f, + 0.2349164933f, 0.1650211811f, 0.0853530467f, 0.0000000000f, + -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f, + -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277540f, + -0.4659721255f, -0.4765217602f, -0.4871834517f, -0.4929203391f, + -0.4960601330f, -0.4977976680f, -0.5000000000f}, + {0.5000000000f, 0.4984147847f, 0.4971478283f, 0.4948240519f, + 0.4904728234f, 0.4820713699f, 0.4734190702f, 0.4600848258f, + 0.4392839074f, 0.4066926241f, 0.3561752141f, 0.3089951873f, + 0.2489543557f, 0.1756889224f, 0.0911452249f, 0.0000000000f, + -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f, + -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f, + -0.4734191597f, -0.4820713401f, -0.4904728830f, -0.4948240817f, + -0.4971478581f, -0.4984148145f, -0.5000000000f}, + {0.5000000000f, 0.4990161359f, 0.4982108474f, 0.4966937900f, + 0.4937312901f, 0.4876496494f, 0.4810023904f, 0.4701921344f, + 0.4523362219f, 0.4227000475f, 0.3741825819f, 0.3270231485f, + 0.2653121948f, 0.1883139759f, 0.0980708972f, 0.0000000000f, + -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231485f, + -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f, + -0.4810024500f, -0.4876496494f, -0.4937313497f, -0.4966937602f, + -0.4982108474f, -0.4990161359f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000596f, 0.5015053153f, 0.5026424527f, 0.5045889616f, + 0.5078070164f, 0.5127342939f, 0.5164096355f, 0.5199240446f, + 0.5213798285f, 0.5160900950f, 0.4961368442f, 0.4834818840f, + 0.4421011508f, 0.3525197506f, 0.2006191462f, 0.0000000000f, + -0.2006191611f, -0.3525197506f, -0.4421012104f, -0.4834818840f, + -0.4961368442f, -0.5160900354f, -0.5213798285f, -0.5199240446f, + -0.5164096951f, -0.5127342939f, -0.5078070164f, -0.5045889020f, + -0.5026424527f, -0.5015053153f, -0.5000000596f}, + {0.5000000596f, 0.5025598407f, 0.5045354366f, 0.5080122352f, + 0.5140760541f, 0.5244651437f, 0.5337679982f, 0.5460379124f, + 0.5614778399f, 0.6178392172f, 0.7190375924f, 0.8149638772f, + 0.9330949783f, 1.0282076597f, 0.8643130064f, 0.0000000000f, + -0.8643135428f, -1.0282076597f, -0.9330950975f, -0.8149638772f, + -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f, + -0.5337680578f, -0.5244650841f, -0.5140760541f, -0.5080122352f, + -0.5045354962f, -0.5025598407f, -0.5000000596f}}, { - {134217728, 133678764, 133252044, 132477911, 131054012, 128379841, - 125703998, 121692333, 115624163, 106419205, 92593586, 79977946, - 64179408, 45144170, 23370016, 0, -23370016, -45144175, - -64179408, -79977946, -92593586, -106419196, -115624163, -121692324, - -125704006, -128379848, -131054020, -132477902, -133252052, -133678756, - -134217736}, - {134217728, 133712005, 133310620, 132580354, 131230923, 128677921, - 126103542, 122214988, 116283221, 107204353, 93448326, 80814826, - 64923233, 45708586, 23676171, 0, -23676171, -45708586, - -64923233, -80814831, -93448326, -107204344, -116283221, -122214988, - -126103542, -128677921, -131230923, -132580362, -133310620, -133711997, - -134217736}, - {134217728, 133762594, 133399847, 132736656, 131501355, 129135285, - 126718571, 123023009, 117307580, 108432548, 94794977, 82139614, - 66105841, 46609132, 24165789, 0, -24165786, -46609132, - -66105847, -82139614, -94794987, -108432548, -117307580, -123023009, - -126718574, -129135283, -131501371, -132736656, -133399839, -133762594, - -134217736}, - {134217728, 133889704, 133624356, 133130995, 132186884, 130303885, - 128301191, 125121697, 120000061, 111707953, 98445440, 85770865, - 69380893, 49124191, 25540859, 0, -25540857, -49124196, - -69380888, -85770874, -98445440, -111707944, -120000061, -125121697, - -128301191, -130303893, -132186900, -133130995, -133624356, -133889712, - -134217728}, - {134217728, 134013488, 133843425, 133517257, 132862879, 131469447, - 129895964, 127265729, 122800030, 115190043, 102426301, 89801131, - 73076637, 52001860, 27128796, 0, -27128794, -52001864, - -73076641, -89801131, -102426301, -115190039, -122800030, -127265729, - -129895972, -131469447, -132862879, -133517265, -133843441, -134013480, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134524667, 134753225, 135137152, 135747532, 136598811, - 137119080, 137373516, 136748951, 133873231, 125921352, 115399244, - 100457884, 77154931, 42583862, 0, -42583862, -77154938, - -100457891, -115399244, -125921369, -133873231, -136748936, -137373501, - -137119096, -136598811, -135747548, -135137152, -134753241, -134524667, - -134217728}, - {134217744, 134740697, 135140165, 135833916, 137013874, 138934982, - 140527025, 142390637, 144197099, 144950624, 153156303, 156579063, - 152419543, 130790210, 79555611, 0, -79555625, -130790210, - -152419556, -156579063, -153156316, -144950610, -144197089, -142390622, - -140527040, -138934982, -137013890, -135833916, -135140150, -134740697, - -134217744}, - }, + + {0.5000000000f, 0.4979922175f, 0.4964025617f, 0.4935186803f, + 0.4882142544f, 0.4782521725f, 0.4682838917f, 0.4533392787f, + 0.4307335615f, 0.3964424431f, 0.3449379802f, 0.2979410589f, + 0.2390869260f, 0.1681751311f, 0.0870600939f, 0.0000000000f, + -0.0870600939f, -0.1681751609f, -0.2390869260f, -0.2979410589f, + -0.3449379802f, -0.3964424133f, -0.4307335615f, -0.4533392191f, + -0.4682839215f, -0.4782522023f, -0.4882142544f, -0.4935186505f, + -0.4964025617f, -0.4979921579f, -0.5000000000f}, + {0.5000000000f, 0.4981160462f, 0.4966207743f, 0.4939002991f, + 0.4888732731f, 0.4793626070f, 0.4697723091f, 0.4552863240f, + 0.4331887662f, 0.3993673325f, 0.3481221497f, 0.3010586798f, + 0.2418578863f, 0.1702777445f, 0.0882006139f, 0.0000000000f, + -0.0882006139f, -0.1702777445f, -0.2418578863f, -0.3010587096f, + -0.3481221497f, -0.3993673027f, -0.4331887662f, -0.4552863240f, + -0.4697723091f, -0.4793626070f, -0.4888732731f, -0.4939003289f, + -0.4966207743f, -0.4981160164f, -0.5000000000f}, + {0.5000000000f, 0.4983044863f, 0.4969531596f, 0.4944825768f, + 0.4898807108f, 0.4810664356f, 0.4720634520f, 0.4582964182f, + 0.4370048046f, 0.4039427042f, 0.3531388044f, 0.3059939146f, + 0.2462634444f, 0.1736325473f, 0.0900245756f, 0.0000000000f, + -0.0900245681f, -0.1736325473f, -0.2462634742f, -0.3059939146f, + -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f, + -0.4720634818f, -0.4810664058f, -0.4898807704f, -0.4944825768f, + -0.4969531298f, -0.4983044863f, -0.5000000000f}, + {0.5000000000f, 0.4987780154f, 0.4977895021f, 0.4959515929f, + 0.4924345016f, 0.4854198098f, 0.4779591858f, 0.4661146402f, + 0.4470350742f, 0.4161445498f, 0.3667378426f, 0.3195213675f, + 0.2584639788f, 0.1830018759f, 0.0951471180f, 0.0000000000f, + -0.0951471031f, -0.1830018908f, -0.2584639490f, -0.3195213974f, + -0.3667378426f, -0.4161445200f, -0.4470350742f, -0.4661146402f, + -0.4779591858f, -0.4854198396f, -0.4924345613f, -0.4959515929f, + -0.4977895021f, -0.4987780452f, -0.5000000000f}, + {0.5000000000f, 0.4992391467f, 0.4986056089f, 0.4973905385f, + 0.4949527979f, 0.4897618592f, 0.4839001894f, 0.4741017818f, + 0.4574657679f, 0.4291163385f, 0.3815677166f, 0.3345352709f, + 0.2722316980f, 0.1937220246f, 0.1010626405f, 0.0000000000f, + -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f, + -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f, + -0.4839001894f, -0.4897618592f, -0.4949527979f, -0.4973905683f, + -0.4986056685f, -0.4992391169f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.5011434555f, 0.5019949079f, 0.5034251213f, + 0.5056989789f, 0.5088702440f, 0.5108083487f, 0.5117562413f, + 0.5094295144f, 0.4987166524f, 0.4690935910f, 0.4298956990f, + 0.3742347956f, 0.2874245048f, 0.1586372554f, 0.0000000000f, + -0.1586372554f, -0.2874245346f, -0.3742347956f, -0.4298956990f, + -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f, + -0.5108084679f, -0.5088702440f, -0.5056990385f, -0.5034251213f, + -0.5019949675f, -0.5011434555f, -0.5000000000f}, + {0.5000000596f, 0.5019482374f, 0.5034363270f, 0.5060207844f, + 0.5104164481f, 0.5175731182f, 0.5235039592f, 0.5304464698f, + 0.5371760726f, 0.5399831533f, 0.5705516934f, 0.5833024383f, + 0.5678070188f, 0.4872314930f, 0.2963677347f, 0.0000000000f, + -0.2963677943f, -0.4872314930f, -0.5678070784f, -0.5833024383f, + -0.5705517530f, -0.5399830937f, -0.5371760130f, -0.5304464102f, + -0.5235040188f, -0.5175731182f, -0.5104165077f, -0.5060207844f, + -0.5034362674f, -0.5019482374f, -0.5000000596f}}, { - {134217728, 133921369, 133680325, 133229561, 132358967, 130599331, - 128703866, 125660282, 120698624, 112569282, 99420258, 86750815, - 70273432, 49815216, 25920711, 0, -25920711, -49815221, - -70273437, -86750806, -99420256, -112569274, -120698624, -125660282, - -128703883, -130599348, -132358983, -133229561, -133680325, -133921361, - -134217728}, - {134217728, 133939441, 133712333, 133285932, 132457505, 130768900, - 128935466, 125970874, 121102931, 113070012, 99989913, 87325519, - 70798672, 50223025, 26145310, 0, -26145308, -50223025, - -70798677, -87325519, -99989913, -113070003, -121102931, -125970860, - -128935481, -130768908, -132457513, -133285932, -133712341, -133939433, - -134217728}, - {134217728, 133966965, 133761027, 133371807, 132607806, 131028081, - 129290134, 126447733, 121725737, 113844587, 100875426, 88221963, - 71620613, 50862941, 26498391, 0, -26498388, -50862946, - -71620620, -88221963, -100875417, -113844587, -121725728, -126447716, - -129290134, -131028089, -132607807, -133371815, -133761036, -133966957, - -134217728}, - {134217728, 134036022, 133883399, 133587872, 132986916, 131684800, - 130192440, 127667609, 123330628, 115859003, 103203522, 90597004, - 73814421, 52581631, 27450709, 0, -27450709, -52581635, - -73814421, -90597004, -103203522, -115858986, -123330612, -127667609, - -130192441, -131684792, -132986917, -133587864, -133883399, -134036014, - -134217728}, - {134217728, 134103202, 134002513, 133798640, 133358145, 132331971, - 131086862, 128886498, 124951227, 117920856, 105625498, 93096793, - 76149690, 54428903, 28481041, 0, -28481039, -54428903, - -76149698, -93096793, -105625498, -117920856, -124951227, -128886489, - -131086879, -132331963, -133358153, -133798640, -134002521, -134103194, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134379666, 134494354, 134673574, 134913679, 135089351, - 134957528, 134277005, 132335084, 127697337, 117706196, 106054041, - 88737129, 64741142, 34377364, 0, -34377364, -64741149, - -88737144, -106054041, -117706196, -127697337, -132335084, -134276990, - -134957528, -135089351, -134913679, -134673590, -134494354, -134379666, - -134217728}, - {134217728, 134496089, 134702142, 135045469, 135582090, 136297572, - 136685209, 136746798, 135844838, 132586209, 124167611, 113363711, - 96250730, 73172752, 40110146, 0, -40110146, -73172752, - -96250737, -113363711, -124167625, -132586192, -135844823, -136746798, - -136685224, -136297557, -135582122, -135045469, -134702142, -134496073, - -134217728}, - }, + + {0.5000000000f, 0.4988959730f, 0.4979980290f, 0.4963187873f, + 0.4930755794f, 0.4865204096f, 0.4794592559f, 0.4681210220f, + 0.4496374130f, 0.4193532467f, 0.3703693151f, 0.3231719732f, + 0.2617889345f, 0.1855761409f, 0.0965621769f, 0.0000000000f, + -0.0965621769f, -0.1855761558f, -0.2617889643f, -0.3231719434f, + -0.3703693151f, -0.4193532169f, -0.4496374130f, -0.4681210220f, + -0.4794593155f, -0.4865204692f, -0.4930756390f, -0.4963187873f, + -0.4979980290f, -0.4988959432f, -0.5000000000f}, + {0.5000000000f, 0.4989632964f, 0.4981172681f, 0.4965288043f, + 0.4934426546f, 0.4871520996f, 0.4803220332f, 0.4692780674f, + 0.4511435628f, 0.4212186337f, 0.3724914491f, 0.3253129125f, + 0.2637456059f, 0.1870953441f, 0.0973988697f, 0.0000000000f, + -0.0973988622f, -0.1870953441f, -0.2637456357f, -0.3253129125f, + -0.3724914491f, -0.4212185740f, -0.4511435628f, -0.4692780375f, + -0.4803220928f, -0.4871521592f, -0.4934426844f, -0.4965288043f, + -0.4981172979f, -0.4989632666f, -0.5000000000f}, + {0.5000000000f, 0.4990658462f, 0.4982986450f, 0.4968487024f, + 0.4940025806f, 0.4881176353f, 0.4816432893f, 0.4710545242f, + 0.4534637034f, 0.4241041243f, 0.3757902384f, 0.3286524117f, + 0.2668075860f, 0.1894792169f, 0.0987142026f, 0.0000000000f, + -0.0987141877f, -0.1894792318f, -0.2668076158f, -0.3286524117f, + -0.3757902086f, -0.4241041243f, -0.4534636736f, -0.4710544348f, + -0.4816432893f, -0.4881176651f, -0.4940025806f, -0.4968487322f, + -0.4982987046f, -0.4990658164f, -0.5000000000f}, + {0.5000000000f, 0.4993230999f, 0.4987545311f, 0.4976536036f, + 0.4954148531f, 0.4905641079f, 0.4850046337f, 0.4755989015f, + 0.4594423771f, 0.4316084087f, 0.3844630718f, 0.3375001550f, + 0.2749801576f, 0.1958818436f, 0.1022618562f, 0.0000000000f, + -0.1022618562f, -0.1958818585f, -0.2749801576f, -0.3375001550f, + -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f, + -0.4850046337f, -0.4905640781f, -0.4954148829f, -0.4976535738f, + -0.4987545311f, -0.4993230700f, -0.5000000000f}, + {0.5000000000f, 0.4995733500f, 0.4991982579f, 0.4984387755f, + 0.4967978001f, 0.4929749966f, 0.4883366227f, 0.4801396132f, + 0.4654795825f, 0.4392894208f, 0.3934856355f, 0.3468125761f, + 0.2836796939f, 0.2027634680f, 0.1061001420f, 0.0000000000f, + -0.1061001420f, -0.2027634680f, -0.2836797237f, -0.3468125761f, + -0.3934856355f, -0.4392894208f, -0.4654795825f, -0.4801395833f, + -0.4883366823f, -0.4929749668f, -0.4967978299f, -0.4984387755f, + -0.4991982877f, -0.4995733202f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.5006032586f, 0.5010305047f, 0.5016981363f, + 0.5025926232f, 0.5032470226f, 0.5027559996f, 0.5002208352f, + 0.4929866195f, 0.4757096469f, 0.4384897351f, 0.3950820863f, + 0.3305715621f, 0.2411795557f, 0.1280656606f, 0.0000000000f, + -0.1280656606f, -0.2411795706f, -0.3305716217f, -0.3950820863f, + -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f, + -0.5027559996f, -0.5032470226f, -0.5025926232f, -0.5016981959f, + -0.5010305047f, -0.5006032586f, -0.5000000000f}, + {0.5000000000f, 0.5010370016f, 0.5018045902f, 0.5030835867f, + 0.5050826669f, 0.5077480078f, 0.5091921091f, 0.5094215274f, + 0.5060614347f, 0.4939221144f, 0.4625603855f, 0.4223127365f, + 0.3585619032f, 0.2725897431f, 0.1494219303f, 0.0000000000f, + -0.1494219303f, -0.2725897431f, -0.3585619330f, -0.4223127365f, + -0.4625604451f, -0.4939220548f, -0.5060613751f, -0.5094215274f, + -0.5091921091f, -0.5077479482f, -0.5050827861f, -0.5030835867f, + -0.5018045902f, -0.5010369420f, -0.5000000000f}}, { - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369938, 0, -30369936, -57781476, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369938, 0, -30369936, -57781476, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369938, 0, -30369936, -57781479, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - }, + + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368354f, 0.0000000000f, + -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368354f, 0.0000000000f, + -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368354f, 0.0000000000f, + -0.1131368279f, -0.2152527869f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}}, { - {134217728, 134498993, 134707335, 135054789, 135598900, 136328115, - 136729141, 136810142, 135935959, 132715402, 124342638, 113565820, - 96534651, 73558852, 40348512, 0, -40348509, -73558852, - -96534651, -113565820, -124342622, -132715402, -135935959, -136810127, - -136729141, -136328115, -135598916, -135054789, -134707335, -134498977, - -134217728}, - {134217728, 134480680, 134674623, 134996162, 135493192, 136136017, - 136453048, 136412541, 135364880, 131907703, 123252219, 112310293, - 95147250, 71192218, 38892389, 0, -38892389, -71192225, - -95147244, -112310293, -123252233, -131907703, -135364880, -136412525, - -136453064, -136136017, -135493192, -134996162, -134674623, -134480664, - -134217728}, - {134217728, 134452852, 134624907, 134907111, 135332868, 135845392, - 136036318, 135814387, 134509950, 130707034, 121647428, 110478072, - 93245003, 68600479, 36868706, 0, -36868706, -68600486, - -93245010, -110478072, -121647428, -130707019, -134509933, -135814387, - -136036318, -135845392, -135332868, -134907111, -134624907, -134452836, - -134217728}, - {134217728, 134383129, 134500515, 134684594, 134933403, 135124815, - 135007943, 134348491, 132435517, 127834944, 117883926, 106251314, - 88935676, 64909118, 34475644, 0, -34475641, -64909118, - -88935672, -106251314, -117883941, -127834944, -132435502, -134348484, - -135007943, -135124799, -134933403, -134684610, -134500515, -134383113, - -134217728}, - {134217728, 134315558, 134380057, 134469604, 134548899, 134436000, - 134031448, 132969665, 130510521, 125220021, 114545007, 102579384, - 85276062, 61841165, 32692547, 0, -32692543, -61841172, - -85276062, -102579384, -114545015, -125220021, -130510514, -132969665, - -134031463, -134436000, -134548899, -134469604, -134380057, -134315558, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134039455, 133889472, 133598612, 133005816, 131717634, - 130237695, 127729079, 123411911, 115961736, 103323251, 90719885, - 73928581, 52671501, 27500671, 0, -27500669, -52671505, - -73928581, -90719885, -103323259, -115961741, -123411903, -127729055, - -130237711, -131717634, -133005816, -133598612, -133889472, -134039447, - -134217728}, - {134217728, 133924242, 133685411, 133238504, 132374593, 130626201, - 128740547, 125709420, 120762534, 112648312, 99510030, 86841272, - 70356024, 49879283, 25955974, 0, -25955971, -49879287, - -70356024, -86841272, -99510039, -112648312, -120762526, -125709412, - -128740555, -130626209, -132374601, -133238504, -133685403, -133924234, - -134217728}, - }, + + {0.5000000000f, 0.5010477901f, 0.5018239021f, 0.5031182766f, + 0.5051452518f, 0.5078617930f, 0.5093557239f, 0.5096575022f, + 0.5064008832f, 0.4944033921f, 0.4632124305f, 0.4230656624f, + 0.3596195877f, 0.2740280628f, 0.1503099203f, 0.0000000000f, + -0.1503099054f, -0.2740280628f, -0.3596195877f, -0.4230656624f, + -0.4632123709f, -0.4944033921f, -0.5064008832f, -0.5096574426f, + -0.5093557239f, -0.5078617930f, -0.5051453114f, -0.5031182766f, + -0.5018239021f, -0.5010477304f, -0.5000000000f}, + {0.5000000000f, 0.5009795427f, 0.5017020702f, 0.5028998852f, + 0.5047514439f, 0.5071461797f, 0.5083272457f, 0.5081763268f, + 0.5042734742f, 0.4913944900f, 0.4591502845f, 0.4183884561f, + 0.3544511199f, 0.2652116716f, 0.1448854357f, 0.0000000000f, + -0.1448854357f, -0.2652117014f, -0.3544511199f, -0.4183884561f, + -0.4591503441f, -0.4913944900f, -0.5042734742f, -0.5081762671f, + -0.5083272457f, -0.5071461797f, -0.5047514439f, -0.5028998852f, + -0.5017020702f, -0.5009795427f, -0.5000000000f}, + {0.5000000000f, 0.5008758903f, 0.5015168786f, 0.5025681257f, + 0.5041542053f, 0.5060635209f, 0.5067747831f, 0.5059480071f, + 0.5010886192f, 0.4869216383f, 0.4531719685f, 0.4115628898f, + 0.3473646939f, 0.2555567026f, 0.1373466253f, 0.0000000000f, + -0.1373466253f, -0.2555567324f, -0.3473647237f, -0.4115628898f, + -0.4531719685f, -0.4869215786f, -0.5010885596f, -0.5059480071f, + -0.5067747831f, -0.5060635209f, -0.5041542053f, -0.5025681257f, + -0.5015168786f, -0.5008758307f, -0.5000000000f}, + {0.5000000000f, 0.5006161928f, 0.5010534525f, 0.5017392039f, + 0.5026661158f, 0.5033791661f, 0.5029437542f, 0.5004871488f, + 0.4933607578f, 0.4762222767f, 0.4391518533f, 0.3958169818f, + 0.3313112259f, 0.2418053150f, 0.1284317821f, 0.0000000000f, + -0.1284317672f, -0.2418053150f, -0.3313111961f, -0.3958169818f, + -0.4391519129f, -0.4762222767f, -0.4933606982f, -0.5004870892f, + -0.5029437542f, -0.5033791065f, -0.5026661158f, -0.5017392635f, + -0.5010534525f, -0.5006161332f, -0.5000000000f}, + {0.5000000000f, 0.5003644228f, 0.5006047487f, 0.5009382963f, + 0.5012336969f, 0.5008131266f, 0.4993060529f, 0.4953505993f, + 0.4861895740f, 0.4664809406f, 0.4267134070f, 0.3821379840f, + 0.3176780939f, 0.2303762883f, 0.1217892319f, 0.0000000000f, + -0.1217892170f, -0.2303763181f, -0.3176780939f, -0.3821379840f, + -0.4267134368f, -0.4664809406f, -0.4861895442f, -0.4953505993f, + -0.4993061125f, -0.5008131266f, -0.5012336969f, -0.5009382963f, + -0.5006047487f, -0.5003644228f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4993358850f, 0.4987771511f, 0.4976935983f, + 0.4954852760f, 0.4906864166f, 0.4851732254f, 0.4758279026f, + 0.4597451985f, 0.4319911301f, 0.3849090934f, 0.3379579186f, + 0.2754054368f, 0.1962166280f, 0.1024479866f, 0.0000000000f, + -0.1024479717f, -0.1962166429f, -0.2754054368f, -0.3379579186f, + -0.3849091232f, -0.4319911599f, -0.4597451687f, -0.4758278131f, + -0.4851732850f, -0.4906864166f, -0.4954852760f, -0.4976935983f, + -0.4987771511f, -0.4993358552f, -0.5000000000f}, + {0.5000000000f, 0.4989066720f, 0.4980169535f, 0.4963521063f, + 0.4931337833f, 0.4866205156f, 0.4795958996f, 0.4683040977f, + 0.4498755038f, 0.4196476638f, 0.3707037568f, 0.3235089481f, + 0.2620966136f, 0.1858148128f, 0.0966935381f, 0.0000000000f, + -0.0966935307f, -0.1858148277f, -0.2620966136f, -0.3235089481f, + -0.3707037866f, -0.4196476638f, -0.4498754740f, -0.4683040380f, + -0.4795959294f, -0.4866205454f, -0.4931338131f, -0.4963521063f, + -0.4980169237f, -0.4989066422f, -0.5000000000f}}, { - {134217744, 134746091, 135149853, 135851434, 137045902, 138994799, - 140615296, 142522879, 144398695, 145263100, 154205556, 158059463, - 154411290, 133097557, 81316205, 0, -81316205, -133097543, - -154411303, -158059463, -154205556, -145263100, -144398695, -142522879, - -140615296, -138994799, -137045918, -135851434, -135149837, -134746091, - -134217744}, - {134217744, 134712087, 135088825, 135741208, 136844475, 138619336, - 140061990, 141695888, 143142475, 143327466, 147825370, 149173983, - 142666223, 119784477, 71366265, 0, -71366265, -119784477, - -142666263, -149173983, -147825383, -143327466, -143142475, -141695873, - -140062006, -138619320, -136844467, -135741224, -135088825, -134712087, - -134217744}, - {134217744, 134660400, 134996180, 135574064, 136539790, 138054064, - 139232828, 140465192, 141293136, 140526367, 139073637, 137423970, - 127872797, 103967564, 60168572, 0, -60168579, -103967564, - -127872810, -137423970, -139073650, -140526353, -141293121, -140465192, - -139232828, -138054064, -136539805, -135574064, -134996180, -134660400, - -134217744}, - {134217728, 134531071, 134764682, 135157698, 135784674, 136666568, - 137216832, 137515087, 136953956, 134166704, 126324479, 115870417, - 101486338, 78107065, 43180376, 0, -43180372, -78107065, - -101486344, -115870417, -126324479, -134166690, -136953956, -137515087, - -137216847, -136666568, -135784674, -135157698, -134764682, -134531071, - -134217728}, - {134217728, 134405853, 134541061, 134757061, 135063333, 135358653, - 135340907, 134821548, 133101766, 128751135, 119073216, 107576641, - 90275394, 66047286, 35143667, 0, -35143664, -66047286, - -90275401, -107576641, -119073231, -128751120, -133101751, -134821548, - -135340923, -135358653, -135063349, -134757077, -134541061, -134405853, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 133896028, 133635530, 133150648, 132221176, 130362696, - 128381245, 125228644, 120138520, 111878277, 98637718, 85963798, - 69556315, 49259814, 25615335, 0, -25615335, -49259818, - -69556315, -85963798, -98637718, -111878269, -120138520, -125228635, - -128381253, -130362689, -132221184, -133150656, -133635522, -133896020, - -134217728}, - {134217728, 133684024, 133261330, 132494150, 131082043, 128427016, - 125767162, 121774846, 115728035, 106542671, 92727700, 80109047, - 64295775, 45232367, 23417819, 0, -23417819, -45232367, - -64295774, -80109052, -92727700, -106542671, -115728027, -121774851, - -125767170, -128427016, -131082043, -132494166, -133261346, -133684032, - -134217736}, - }, + + {0.5000000596f, 0.5019683242f, 0.5034724474f, 0.5060860515f, + 0.5105357766f, 0.5177959800f, 0.5238327980f, 0.5309391022f, + 0.5379270315f, 0.5411472321f, 0.5744604468f, 0.5888173580f, + 0.5752269030f, 0.4958270490f, 0.3029264808f, 0.0000000000f, + -0.3029264808f, -0.4958269894f, -0.5752269030f, -0.5888173580f, + -0.5744604468f, -0.5411472321f, -0.5379270315f, -0.5309391022f, + -0.5238327980f, -0.5177959800f, -0.5105358362f, -0.5060860515f, + -0.5034723878f, -0.5019683242f, -0.5000000596f}, + {0.5000000596f, 0.5018416047f, 0.5032451153f, 0.5056754351f, + 0.5097854137f, 0.5163972378f, 0.5217715502f, 0.5278583169f, + 0.5332472920f, 0.5339364409f, 0.5506924391f, 0.5557163954f, + 0.5314731002f, 0.4462319613f, 0.2658600509f, 0.0000000000f, + -0.2658600509f, -0.4462319613f, -0.5314732194f, -0.5557163954f, + -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f, + -0.5217716098f, -0.5163972378f, -0.5097853541f, -0.5056754351f, + -0.5032451153f, -0.5018416047f, -0.5000000596f}, + {0.5000000596f, 0.5016490817f, 0.5028999448f, 0.5050527453f, + 0.5086503625f, 0.5142914653f, 0.5186827183f, 0.5232735872f, + 0.5263579488f, 0.5235015154f, 0.5180896521f, 0.5119441748f, + 0.4763633013f, 0.3873093724f, 0.2241453975f, 0.0000000000f, + -0.2241454273f, -0.3873093724f, -0.4763633311f, -0.5119441748f, + -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f, + -0.5186827183f, -0.5142914653f, -0.5086504221f, -0.5050527453f, + -0.5028999448f, -0.5016490817f, -0.5000000596f}, + {0.5000000000f, 0.5011672974f, 0.5020375848f, 0.5035016537f, + 0.5058373213f, 0.5091226101f, 0.5111725330f, 0.5122836232f, + 0.5101932287f, 0.4998099208f, 0.4705953598f, 0.4316509366f, + 0.3780660629f, 0.2909714878f, 0.1608594358f, 0.0000000000f, + -0.1608594209f, -0.2909714878f, -0.3780660927f, -0.4316509366f, + -0.4705953598f, -0.4998098612f, -0.5101932287f, -0.5122836232f, + -0.5111725926f, -0.5091226101f, -0.5058373213f, -0.5035016537f, + -0.5020375848f, -0.5011672974f, -0.5000000000f}, + {0.5000000000f, 0.5007008314f, 0.5012044907f, 0.5020091534f, + 0.5031501055f, 0.5042502880f, 0.5041841865f, 0.5022494197f, + 0.4958427250f, 0.4796353579f, 0.4435822964f, 0.4007542133f, + 0.3363020420f, 0.2460453212f, 0.1309203655f, 0.0000000000f, + -0.1309203506f, -0.2460453212f, -0.3363020718f, -0.4007542133f, + -0.4435823560f, -0.4796352983f, -0.4958426654f, -0.5022494197f, + -0.5041842461f, -0.5042502880f, -0.5031501651f, -0.5020092130f, + -0.5012044907f, -0.5007008314f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4988015890f, 0.4978311360f, 0.4960248172f, + 0.4925622642f, 0.4856388867f, 0.4782574177f, 0.4665130377f, + 0.4475508630f, 0.4167790711f, 0.3674541414f, 0.3202401102f, + 0.2591174543f, 0.1835071146f, 0.0954245627f, 0.0000000000f, + -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f, + -0.3674541414f, -0.4167790413f, -0.4475508630f, -0.4665130079f, + -0.4782574475f, -0.4856388569f, -0.4925622940f, -0.4960248470f, + -0.4978311062f, -0.4988015294f, -0.5000000000f}, + {0.5000000000f, 0.4980117977f, 0.4964371324f, 0.4935791790f, + 0.4883186519f, 0.4784279168f, 0.4685191810f, 0.4536466599f, + 0.4311205149f, 0.3969023824f, 0.3454375863f, 0.2984294593f, + 0.2395204306f, 0.1685037017f, 0.0872381777f, 0.0000000000f, + -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294891f, + -0.3454375863f, -0.3969023824f, -0.4311204851f, -0.4536466599f, + -0.4685192108f, -0.4784279168f, -0.4883186519f, -0.4935792387f, + -0.4964371920f, -0.4980118275f, -0.5000000000f}}, { - {134217744, 134911968, 135447966, 136391663, 138039000, 140866367, - 143404554, 146764521, 151021632, 166927889, 195202182, 222570595, - 257610421, 289862500, 252874234, 0, -252874341, -289862420, - -257610501, -222570621, -195202209, -166927876, -151021632, -146764507, - -143404554, -140866352, -138039000, -136391663, -135447966, -134911968, - -134217744}, - {134217744, 134867355, 135367738, 136245965, 137770239, 140356424, - 142639355, 145588557, 149154344, 160361636, 182196342, 200588382, - 218415341, 220218448, 161428236, 0, -161428263, -220218448, - -218415395, -200588409, -182196329, -160361623, -149154344, -145588542, - -142639355, -140356409, -137770238, -136245981, -135367738, -134867355, - -134217744}, - {134217744, 134799630, 135245963, 136025282, 137364449, 139591338, - 141498666, 143852961, 146442545, 151309130, 165431889, 174391809, - 177370022, 161281089, 104146144, 0, -104146171, -161281089, - -177370049, -174391796, -165431903, -151309116, -146442531, -143852947, - -141498681, -139591338, -137364449, -136025297, -135245963, -134799614, - -134217744}, - {134217744, 134630198, 134942075, 135476620, 136362516, 137726655, - 138754657, 139760139, 140244217, 138962344, 134419383, 131372064, - 120561410, 96514144, 55111265, 0, -55111262, -96514144, - -120561424, -131372064, -134419383, -138962344, -140244217, -139760124, - -138754673, -137726655, -136362532, -135476604, -134942075, -134630198, - -134217744}, - {134217728, 134466320, 134648961, 134950176, 135410401, 135985835, - 136237563, 136102933, 134921759, 131284100, 122416352, 111353663, - 94151405, 69439052, 37821289, 0, -37821289, -69439058, - -94151405, -111353655, -122416359, -131284100, -134921744, -136102933, - -136237563, -135985836, -135410401, -134950176, -134648961, -134466304, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 133800456, 133466639, 132853833, 131704577, 129480322, - 127184162, 123637500, 118091100, 109378569, 95840339, 83173415, - 67033158, 47318062, 24552229, 0, -24552227, -47318062, - -67033165, -83173405, -95840348, -109378569, -118091100, -123637492, - -127184170, -129480322, -131704577, -132853833, -133466647, -133800448, - -134217736}, - {134217728, 133524250, 132980227, 132003691, 130239201, 127017985, - 123891524, 119342831, 112695071, 102976138, 88899495, 76395462, - 61022664, 42765392, 22085513, 0, -22085512, -42765395, - -61022669, -76395462, -88899495, -102976129, -112695062, -119342822, - -123891527, -127017985, -130239210, -132003691, -132980227, -133524250, - -134217736}, - }, + + {0.5000000596f, 0.5025862455f, 0.5045830011f, 0.5080985427f, + 0.5142353773f, 0.5247681141f, 0.5342236161f, 0.5467404723f, + 0.5625994205f, 0.6218548417f, 0.7271847725f, 0.8291400671f, + 0.9596735835f, 1.0798219442f, 0.9420299530f, 0.0000000000f, + -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f, + -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f, + -0.5342236161f, -0.5247680545f, -0.5142353773f, -0.5080985427f, + -0.5045830011f, -0.5025862455f, -0.5000000596f}, + {0.5000000596f, 0.5024200678f, 0.5042841434f, 0.5075557828f, + 0.5132341385f, 0.5228683949f, 0.5313730240f, 0.5423596501f, + 0.5556432009f, 0.5973936319f, 0.6787342429f, 0.7472499609f, + 0.8136605620f, 0.8203776479f, 0.6013670564f, 0.0000000000f, + -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f, + -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f, + -0.5313730240f, -0.5228683949f, -0.5132341385f, -0.5075558424f, + -0.5042841434f, -0.5024200678f, -0.5000000596f}, + {0.5000000596f, 0.5021677613f, 0.5038304925f, 0.5067336559f, + 0.5117224455f, 0.5200182796f, 0.5271236300f, 0.5358940363f, + 0.5455409884f, 0.5636704564f, 0.6162818074f, 0.6496601105f, + 0.6607547998f, 0.6008188725f, 0.3879746199f, 0.0000000000f, + -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f, + -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f, + -0.5271236897f, -0.5200182796f, -0.5117224455f, -0.5067337155f, + -0.5038304925f, -0.5021677017f, -0.5000000596f}, + {0.5000000596f, 0.5015365481f, 0.5026984215f, 0.5046897531f, + 0.5079899430f, 0.5130717754f, 0.5169013739f, 0.5206471086f, + 0.5224504471f, 0.5176750422f, 0.5007511973f, 0.4893990755f, + 0.4491262436f, 0.3595432043f, 0.2053054571f, 0.0000000000f, + -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f, + -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f, + -0.5169014335f, -0.5130717754f, -0.5079900026f, -0.5046896935f, + -0.5026984215f, -0.5015365481f, -0.5000000596f}, + {0.5000000000f, 0.5009260774f, 0.5016064644f, 0.5027285814f, + 0.5044430494f, 0.5065867305f, 0.5075244904f, 0.5070229173f, + 0.5026227236f, 0.4890713692f, 0.4560364485f, 0.4148247242f, + 0.3507413268f, 0.2586806417f, 0.1408952773f, 0.0000000000f, + -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f, + -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f, + -0.5075244904f, -0.5065867305f, -0.5044430494f, -0.5027285814f, + -0.5016064644f, -0.5009260178f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4984455407f, 0.4972019792f, 0.4949190915f, + 0.4906377792f, 0.4823517799f, 0.4737979174f, 0.4605855942f, + 0.4399236441f, 0.4074669182f, 0.3570330739f, 0.3098451197f, + 0.2497179806f, 0.1762735248f, 0.0914641768f, 0.0000000000f, + -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f, + -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f, + -0.4737979472f, -0.4823517799f, -0.4906377792f, -0.4949190915f, + -0.4972020090f, -0.4984455109f, -0.5000000000f}, + {0.5000000000f, 0.4974165857f, 0.4953899384f, 0.4917520583f, + 0.4851788282f, 0.4731788635f, 0.4615318775f, 0.4445866942f, + 0.4198218584f, 0.3836160004f, 0.3311764300f, 0.2845952809f, + 0.2273271382f, 0.1593134999f, 0.0822749436f, 0.0000000000f, + -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f, + -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f, + -0.4615319073f, -0.4731788635f, -0.4851788580f, -0.4917520583f, + -0.4953899384f, -0.4974165857f, -0.5000000000f}}, { - {134217744, 134970359, 135553135, 136582894, 138392877, 141541743, - 144424094, 148346340, 153978836, 176372729, 215302062, 259806420, - 336609085, 494304735, 975787497, -858993460, -975789097, -494304522, - -336609192, -259806447, -215302075, -176372702, -153978836, -148346340, - -144424109, -141541728, -138392877, -136582894, -135553135, -134970359, - -134217744}, - {134217744, 134922022, 135466091, 136424566, 138099800, 140982070, - 143578731, 147033572, 151452343, 168483023, 198394635, 228208128, - 268470634, 312112739, 289892500, 0, -289892633, -312112739, - -268470714, -228208155, -198394649, -168483009, -151452340, -147033558, - -143578731, -140982070, -138099815, -136424566, -135466075, -134922022, - -134217744}, - {134217744, 134848627, 135333994, 136184803, 137657591, 140143456, - 142320970, 145102040, 148388972, 157750196, 177226889, 192583689, - 205271595, 199995929, 140105690, 0, -140105757, -199995915, - -205271635, -192583689, -177226916, -157750183, -148388958, -145102025, - -142320985, -140143456, -137657591, -136184803, -135334009, -134848611, - -134217744}, - {134217744, 134665058, 135004509, 135589124, 136567188, 138104822, - 139307072, 140574980, 141457125, 140772491, 139820837, 138408050, - 129080970, 105221711, 61032985, 0, -61032985, -105221711, - -129080997, -138408050, -139820850, -140772477, -141457125, -140574962, - -139307072, -138104806, -136567205, -135589140, -135004525, -134665058, - -134217744}, - {134217728, 134487552, 134686918, 135018188, 135532903, 136208162, - 136556685, 136561648, 135578778, 132209698, 123658874, 112777500, - 95635765, 72064052, 39427432, 0, -39427432, -72064065, - -95635772, -112777498, -123658874, -132209683, -135578762, -136561648, - -136556685, -136208146, -135532903, -135018204, -134686918, -134487552, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 133766932, 133407501, 132750065, 131524599, 129174690, - 126771678, 123092977, 117396601, 108539737, 94913060, 82256151, - 66210183, 46688771, 24209158, 0, -24209156, -46688776, - -66210179, -82256150, -94913060, -108539737, -117396605, -123092969, - -126771680, -129174690, -131524607, -132750073, -133407493, -133766932, - -134217736}, - {134217728, 133468277, 132881938, 131832762, 129947063, 126534099, - 123252524, 118522767, 111685262, 101806166, 87663578, 75208916, - 59986579, 41990286, 21668928, 0, -21668926, -41990288, - -59986579, -75208922, -87663568, -101806156, -111685259, -118522767, - -123252524, -126534093, -129947064, -131832762, -132881938, -133468277, - -134217736}, - }, + + {0.5000000596f, 0.5028037429f, 0.5049747825f, 0.5088109374f, + 0.5155536532f, 0.5272840858f, 0.5380216837f, 0.5526331663f, + 0.5736158490f, 0.6570396423f, 0.8020626903f, 0.9678543210f, + 1.2539665699f, 1.8414286375f, 3.6350917816f, -3.2000000477f, + -3.6350977421f, -1.8414278030f, -1.2539669275f, -0.9678544402f, + -0.8020627499f, -0.6570395231f, -0.5736158490f, -0.5526331663f, + -0.5380217433f, -0.5272840261f, -0.5155536532f, -0.5088109374f, + -0.5049747825f, -0.5028037429f, -0.5000000596f}, + {0.5000000596f, 0.5026236773f, 0.5046505332f, 0.5082210898f, + 0.5144618750f, 0.5251991153f, 0.5348724723f, 0.5477427244f, + 0.5642039180f, 0.6276481748f, 0.7390776277f, 0.8501415253f, + 1.0001310110f, 1.1627105474f, 1.0799337626f, 0.0000000000f, + -1.0799342394f, -1.1627105474f, -1.0001313686f, -0.8501416445f, + -0.7390776873f, -0.6276481152f, -0.5642039180f, -0.5477426648f, + -0.5348724723f, -0.5251991153f, -0.5144618750f, -0.5082210898f, + -0.5046504736f, -0.5026236773f, -0.5000000596f}, + {0.5000000596f, 0.5023502707f, 0.5041584373f, 0.5073279142f, + 0.5128144622f, 0.5220750570f, 0.5301869512f, 0.5405472517f, + 0.5527920127f, 0.5876652598f, 0.6602216363f, 0.7174301744f, + 0.7646963000f, 0.7450429201f, 0.5219343901f, 0.0000000000f, + -0.5219346285f, -0.7450428605f, -0.7646964192f, -0.7174301744f, + -0.6602216959f, -0.5876652002f, -0.5527919531f, -0.5405471921f, + -0.5301870108f, -0.5220750570f, -0.5128144622f, -0.5073279142f, + -0.5041584969f, -0.5023502111f, -0.5000000596f}, + {0.5000000596f, 0.5016664267f, 0.5029309988f, 0.5051088333f, + 0.5087524056f, 0.5144805312f, 0.5189592838f, 0.5236825943f, + 0.5269688368f, 0.5244184136f, 0.5208731890f, 0.5156101584f, + 0.4808640778f, 0.3919814229f, 0.2273655832f, 0.0000000000f, + -0.2273655832f, -0.3919814229f, -0.4808641970f, -0.5156101584f, + -0.5208732486f, -0.5244183540f, -0.5269688368f, -0.5236825347f, + -0.5189592838f, -0.5144804716f, -0.5087524652f, -0.5051088929f, + -0.5029310584f, -0.5016664267f, -0.5000000596f}, + {0.5000000000f, 0.5010051727f, 0.5017478466f, 0.5029819608f, + 0.5048993826f, 0.5074149370f, 0.5087133050f, 0.5087317824f, + 0.5050703287f, 0.4925194979f, 0.4606651962f, 0.4201289415f, + 0.3562709987f, 0.2684594989f, 0.1468786299f, 0.0000000000f, + -0.1468786299f, -0.2684595585f, -0.3562710285f, -0.4201289117f, + -0.4606651962f, -0.4925194383f, -0.5050702691f, -0.5087317824f, + -0.5087133050f, -0.5074148774f, -0.5048993826f, -0.5029820204f, + -0.5017478466f, -0.5010051727f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4983206391f, 0.4969816804f, 0.4945325255f, + 0.4899673164f, 0.4812132120f, 0.4722613096f, 0.4585570693f, + 0.4373364151f, 0.4043420255f, 0.3535786867f, 0.3064280450f, + 0.2466521561f, 0.1739292294f, 0.0901861414f, 0.0000000000f, + -0.0901861340f, -0.1739292443f, -0.2466521412f, -0.3064280450f, + -0.3535786867f, -0.4043420255f, -0.4373364449f, -0.4585570395f, + -0.4722613096f, -0.4812132120f, -0.4899673462f, -0.4945325553f, + -0.4969816506f, -0.4983206391f, -0.5000000000f}, + {0.5000000000f, 0.4972080886f, 0.4950237870f, 0.4911153018f, + 0.4840905368f, 0.4713762403f, 0.4591514468f, 0.4415317178f, + 0.4160600305f, 0.3792575300f, 0.3265722692f, 0.2801750302f, + 0.2234674245f, 0.1564260125f, 0.0807230473f, 0.0000000000f, + -0.0807230398f, -0.1564260125f, -0.2234674245f, -0.2801750600f, + -0.3265722394f, -0.3792575002f, -0.4160600007f, -0.4415317178f, + -0.4591514468f, -0.4713762403f, -0.4840905368f, -0.4911153018f, + -0.4950237870f, -0.4972080886f, -0.5000000000f}}, { - {134217744, 134911968, 135447966, 136391663, 138039000, 140866367, - 143404554, 146764521, 151021632, 166927889, 195202182, 222570595, - 257610421, 289862500, 252874234, 0, -252874341, -289862420, - -257610501, -222570621, -195202209, -166927876, -151021632, -146764507, - -143404554, -140866352, -138039000, -136391663, -135447966, -134911968, - -134217744}, - {134217744, 134867355, 135367738, 136245965, 137770239, 140356424, - 142639355, 145588557, 149154344, 160361636, 182196342, 200588382, - 218415341, 220218448, 161428236, 0, -161428263, -220218448, - -218415395, -200588409, -182196329, -160361623, -149154344, -145588542, - -142639355, -140356409, -137770238, -136245981, -135367738, -134867355, - -134217744}, - {134217744, 134799630, 135245963, 136025282, 137364449, 139591338, - 141498666, 143852961, 146442545, 151309130, 165431889, 174391809, - 177370022, 161281089, 104146144, 0, -104146171, -161281089, - -177370049, -174391796, -165431903, -151309116, -146442531, -143852947, - -141498681, -139591338, -137364449, -136025297, -135245963, -134799614, - -134217744}, - {134217744, 134630198, 134942075, 135476620, 136362516, 137726655, - 138754657, 139760139, 140244217, 138962344, 134419383, 131372064, - 120561410, 96514144, 55111265, 0, -55111262, -96514144, - -120561424, -131372064, -134419383, -138962344, -140244217, -139760124, - -138754673, -137726655, -136362532, -135476604, -134942075, -134630198, - -134217744}, - {134217728, 134466320, 134648961, 134950176, 135410401, 135985835, - 136237563, 136102933, 134921759, 131284100, 122416352, 111353663, - 94151405, 69439052, 37821289, 0, -37821289, -69439058, - -94151405, -111353655, -122416359, -131284100, -134921744, -136102933, - -136237563, -135985836, -135410401, -134950176, -134648961, -134466304, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 133800456, 133466639, 132853833, 131704577, 129480322, - 127184162, 123637500, 118091100, 109378569, 95840339, 83173415, - 67033158, 47318062, 24552229, 0, -24552227, -47318062, - -67033165, -83173405, -95840348, -109378569, -118091100, -123637492, - -127184170, -129480322, -131704577, -132853833, -133466647, -133800448, - -134217736}, - {134217728, 133524250, 132980227, 132003691, 130239201, 127017985, - 123891524, 119342831, 112695071, 102976138, 88899495, 76395462, - 61022664, 42765392, 22085513, 0, -22085512, -42765395, - -61022669, -76395462, -88899495, -102976129, -112695062, -119342822, - -123891527, -127017985, -130239210, -132003691, -132980227, -133524250, - -134217736}, - }, + + {0.5000000596f, 0.5025862455f, 0.5045830011f, 0.5080985427f, + 0.5142353773f, 0.5247681141f, 0.5342236161f, 0.5467404723f, + 0.5625994205f, 0.6218548417f, 0.7271847725f, 0.8291400671f, + 0.9596735835f, 1.0798219442f, 0.9420299530f, 0.0000000000f, + -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f, + -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f, + -0.5342236161f, -0.5247680545f, -0.5142353773f, -0.5080985427f, + -0.5045830011f, -0.5025862455f, -0.5000000596f}, + {0.5000000596f, 0.5024200678f, 0.5042841434f, 0.5075557828f, + 0.5132341385f, 0.5228683949f, 0.5313730240f, 0.5423596501f, + 0.5556432009f, 0.5973936319f, 0.6787342429f, 0.7472499609f, + 0.8136605620f, 0.8203776479f, 0.6013670564f, 0.0000000000f, + -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f, + -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f, + -0.5313730240f, -0.5228683949f, -0.5132341385f, -0.5075558424f, + -0.5042841434f, -0.5024200678f, -0.5000000596f}, + {0.5000000596f, 0.5021677613f, 0.5038304925f, 0.5067336559f, + 0.5117224455f, 0.5200182796f, 0.5271236300f, 0.5358940363f, + 0.5455409884f, 0.5636704564f, 0.6162818074f, 0.6496601105f, + 0.6607547998f, 0.6008188725f, 0.3879746199f, 0.0000000000f, + -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f, + -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f, + -0.5271236897f, -0.5200182796f, -0.5117224455f, -0.5067337155f, + -0.5038304925f, -0.5021677017f, -0.5000000596f}, + {0.5000000596f, 0.5015365481f, 0.5026984215f, 0.5046897531f, + 0.5079899430f, 0.5130717754f, 0.5169013739f, 0.5206471086f, + 0.5224504471f, 0.5176750422f, 0.5007511973f, 0.4893990755f, + 0.4491262436f, 0.3595432043f, 0.2053054571f, 0.0000000000f, + -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f, + -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f, + -0.5169014335f, -0.5130717754f, -0.5079900026f, -0.5046896935f, + -0.5026984215f, -0.5015365481f, -0.5000000596f}, + {0.5000000000f, 0.5009260774f, 0.5016064644f, 0.5027285814f, + 0.5044430494f, 0.5065867305f, 0.5075244904f, 0.5070229173f, + 0.5026227236f, 0.4890713692f, 0.4560364485f, 0.4148247242f, + 0.3507413268f, 0.2586806417f, 0.1408952773f, 0.0000000000f, + -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f, + -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f, + -0.5075244904f, -0.5065867305f, -0.5044430494f, -0.5027285814f, + -0.5016064644f, -0.5009260178f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4984455407f, 0.4972019792f, 0.4949190915f, + 0.4906377792f, 0.4823517799f, 0.4737979174f, 0.4605855942f, + 0.4399236441f, 0.4074669182f, 0.3570330739f, 0.3098451197f, + 0.2497179806f, 0.1762735248f, 0.0914641768f, 0.0000000000f, + -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f, + -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f, + -0.4737979472f, -0.4823517799f, -0.4906377792f, -0.4949190915f, + -0.4972020090f, -0.4984455109f, -0.5000000000f}, + {0.5000000000f, 0.4974165857f, 0.4953899384f, 0.4917520583f, + 0.4851788282f, 0.4731788635f, 0.4615318775f, 0.4445866942f, + 0.4198218584f, 0.3836160004f, 0.3311764300f, 0.2845952809f, + 0.2273271382f, 0.1593134999f, 0.0822749436f, 0.0000000000f, + -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f, + -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f, + -0.4615319073f, -0.4731788635f, -0.4851788580f, -0.4917520583f, + -0.4953899384f, -0.4974165857f, -0.5000000000f}}, { - {134217744, 134746091, 135149853, 135851434, 137045902, 138994799, - 140615296, 142522879, 144398709, 145263103, 154205570, 158059476, - 154411303, 133097570, 81316211, 0, -81316218, -133097557, - -154411316, -158059490, -154205570, -145263103, -144398709, -142522879, - -140615296, -138994799, -137045918, -135851434, -135149837, -134746091, - -134217744}, - {134217744, 134712087, 135088825, 135741208, 136844475, 138619336, - 140061990, 141695888, 143142475, 143327470, 147825383, 149173983, - 142666250, 119784490, 71366272, 0, -71366278, -119784490, - -142666277, -149173996, -147825383, -143327466, -143142475, -141695873, - -140062006, -138619320, -136844467, -135741224, -135088825, -134712087, - -134217744}, - {134217744, 134660400, 134996180, 135574064, 136539790, 138054064, - 139232828, 140465192, 141293136, 140526367, 139073637, 137423983, - 127872810, 103967578, 60168579, 0, -60168585, -103967578, - -127872810, -137423970, -139073650, -140526353, -141293121, -140465192, - -139232843, -138054064, -136539805, -135574064, -134996180, -134660400, - -134217744}, - {134217728, 134531071, 134764682, 135157698, 135784674, 136666568, - 137216832, 137515087, 136953956, 134166704, 126324470, 115870417, - 101486344, 78107071, 43180379, 0, -43180376, -78107078, - -101486351, -115870417, -126324479, -134166695, -136953956, -137515087, - -137216847, -136666568, -135784674, -135157698, -134764682, -134531071, - -134217728}, - {134217728, 134405853, 134541061, 134757061, 135063333, 135358653, - 135340907, 134821548, 133101766, 128751127, 119073224, 107576641, - 90275401, 66047293, 35143667, 0, -35143667, -66047293, - -90275401, -107576641, -119073231, -128751127, -133101751, -134821548, - -135340923, -135358653, -135063349, -134757077, -134541061, -134405853, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 133896028, 133635530, 133150648, 132221176, 130362696, - 128381245, 125228635, 120138520, 111878281, 98637718, 85963798, - 69556315, 49259814, 25615335, 0, -25615335, -49259818, - -69556310, -85963798, -98637709, -111878269, -120138520, -125228635, - -128381253, -130362689, -132221184, -133150656, -133635522, -133896020, - -134217728}, - {134217728, 133684024, 133261330, 132494150, 131082043, 128427016, - 125767162, 121774843, 115728035, 106542671, 92727700, 80109047, - 64295775, 45232366, 23417819, 0, -23417819, -45232366, - -64295775, -80109047, -92727700, -106542662, -115728027, -121774851, - -125767170, -128427016, -131082043, -132494166, -133261346, -133684032, - -134217736}, - }, + + {0.5000000596f, 0.5019683242f, 0.5034724474f, 0.5060860515f, + 0.5105357766f, 0.5177959800f, 0.5238327980f, 0.5309391022f, + 0.5379270911f, 0.5411472321f, 0.5744605064f, 0.5888174176f, + 0.5752269030f, 0.4958270788f, 0.3029264808f, 0.0000000000f, + -0.3029265106f, -0.4958270490f, -0.5752269626f, -0.5888174772f, + -0.5744605064f, -0.5411472321f, -0.5379270911f, -0.5309391022f, + -0.5238327980f, -0.5177959800f, -0.5105358362f, -0.5060860515f, + -0.5034723878f, -0.5019683242f, -0.5000000596f}, + {0.5000000596f, 0.5018416047f, 0.5032451153f, 0.5056754351f, + 0.5097854137f, 0.5163972378f, 0.5217715502f, 0.5278583169f, + 0.5332472920f, 0.5339364409f, 0.5506924391f, 0.5557163954f, + 0.5314732194f, 0.4462319911f, 0.2658600807f, 0.0000000000f, + -0.2658601105f, -0.4462319911f, -0.5314732790f, -0.5557164550f, + -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f, + -0.5217716098f, -0.5163972378f, -0.5097853541f, -0.5056754351f, + -0.5032451153f, -0.5018416047f, -0.5000000596f}, + {0.5000000596f, 0.5016490817f, 0.5028999448f, 0.5050527453f, + 0.5086503625f, 0.5142914653f, 0.5186827183f, 0.5232735872f, + 0.5263579488f, 0.5235015154f, 0.5180896521f, 0.5119442344f, + 0.4763633311f, 0.3873094022f, 0.2241454273f, 0.0000000000f, + -0.2241454422f, -0.3873094022f, -0.4763633311f, -0.5119441748f, + -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f, + -0.5186827779f, -0.5142914653f, -0.5086504221f, -0.5050527453f, + -0.5028999448f, -0.5016490817f, -0.5000000596f}, + {0.5000000000f, 0.5011672974f, 0.5020375848f, 0.5035016537f, + 0.5058373213f, 0.5091226101f, 0.5111725330f, 0.5122836232f, + 0.5101932287f, 0.4998099208f, 0.4705953300f, 0.4316509366f, + 0.3780660927f, 0.2909715176f, 0.1608594507f, 0.0000000000f, + -0.1608594358f, -0.2909715474f, -0.3780661225f, -0.4316509366f, + -0.4705953598f, -0.4998098910f, -0.5101932287f, -0.5122836232f, + -0.5111725926f, -0.5091226101f, -0.5058373213f, -0.5035016537f, + -0.5020375848f, -0.5011672974f, -0.5000000000f}, + {0.5000000000f, 0.5007008314f, 0.5012044907f, 0.5020091534f, + 0.5031501055f, 0.5042502880f, 0.5041841865f, 0.5022494197f, + 0.4958427250f, 0.4796353281f, 0.4435823262f, 0.4007542133f, + 0.3363020718f, 0.2460453361f, 0.1309203655f, 0.0000000000f, + -0.1309203655f, -0.2460453361f, -0.3363020718f, -0.4007542133f, + -0.4435823560f, -0.4796353281f, -0.4958426654f, -0.5022494197f, + -0.5041842461f, -0.5042502880f, -0.5031501651f, -0.5020092130f, + -0.5012044907f, -0.5007008314f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4988015890f, 0.4978311360f, 0.4960248172f, + 0.4925622642f, 0.4856388867f, 0.4782574177f, 0.4665130079f, + 0.4475508630f, 0.4167790711f, 0.3674541414f, 0.3202401102f, + 0.2591174543f, 0.1835071146f, 0.0954245627f, 0.0000000000f, + -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f, + -0.3674541116f, -0.4167790413f, -0.4475508630f, -0.4665130079f, + -0.4782574475f, -0.4856388569f, -0.4925622940f, -0.4960248470f, + -0.4978311062f, -0.4988015294f, -0.5000000000f}, + {0.5000000000f, 0.4980117977f, 0.4964371324f, 0.4935791790f, + 0.4883186519f, 0.4784279168f, 0.4685191810f, 0.4536466300f, + 0.4311205149f, 0.3969023824f, 0.3454375863f, 0.2984294593f, + 0.2395204306f, 0.1685037017f, 0.0872381777f, 0.0000000000f, + -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294593f, + -0.3454375863f, -0.3969023526f, -0.4311204851f, -0.4536466599f, + -0.4685192108f, -0.4784279168f, -0.4883186519f, -0.4935792387f, + -0.4964371920f, -0.4980118275f, -0.5000000000f}}, { - {134217728, 134498993, 134707335, 135054789, 135598916, 136328115, - 136729141, 136810142, 135935974, 132715400, 124342636, 113565825, - 96534671, 73558872, 40348522, 0, -40348522, -73558878, - -96534671, -113565825, -124342636, -132715400, -135935959, -136810142, - -136729157, -136328114, -135598899, -135054789, -134707335, -134498977, - -134217728}, - {134217728, 134480680, 134674623, 134996162, 135493192, 136136017, - 136453048, 136412541, 135364880, 131907703, 123252239, 112310291, - 95147257, 71192238, 38892402, 0, -38892399, -71192238, - -95147250, -112310298, -123252239, -131907703, -135364895, -136412525, - -136453064, -136136017, -135493192, -134996146, -134674623, -134480664, - -134217728}, - {134217728, 134452852, 134624907, 134907111, 135332868, 135845392, - 136036318, 135814387, 134509933, 130707049, 121647427, 110478071, - 93245017, 68600483, 36868716, 0, -36868712, -68600489, - -93245017, -110478064, -121647443, -130707034, -134509933, -135814387, - -136036318, -135845392, -135332883, -134907111, -134624907, -134452836, - -134217728}, - {134217728, 134383129, 134500499, 134684594, 134933403, 135124815, - 135007943, 134348507, 132435517, 127834959, 117883933, 106251321, - 88935672, 64909116, 34475648, 0, -34475644, -64909116, - -88935679, -106251321, -117883933, -127834944, -132435517, -134348491, - -135007943, -135124799, -134933403, -134684610, -134500515, -134383113, - -134217728}, - {134217728, 134315558, 134380057, 134469604, 134548899, 134436000, - 134031448, 132969681, 130510521, 125220028, 114545015, 102579384, - 85276069, 61841172, 32692547, 0, -32692547, -61841176, - -85276077, -102579384, -114545015, -125220021, -130510521, -132969665, - -134031463, -134436000, -134548899, -134469604, -134380057, -134315558, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134039455, 133889472, 133598612, 133005800, 131717634, - 130237695, 127729079, 123411911, 115961741, 103323251, 90719885, - 73928580, 52671496, 27500669, 0, -27500669, -52671501, - -73928580, -90719885, -103323262, -115961741, -123411903, -127729055, - -130237711, -131717634, -133005808, -133598612, -133889472, -134039455, - -134217728}, - {134217728, 133924242, 133685411, 133238504, 132374593, 130626201, - 128740547, 125709420, 120762531, 112648312, 99510021, 86841264, - 70356022, 49879278, 25955971, 0, -25955969, -49879283, - -70356027, -86841273, -99510021, -112648303, -120762517, -125709412, - -128740555, -130626208, -132374601, -133238504, -133685403, -133924234, - -134217728}, - }, + + {0.5000000000f, 0.5010477901f, 0.5018239021f, 0.5031182766f, + 0.5051453114f, 0.5078617930f, 0.5093557239f, 0.5096575022f, + 0.5064009428f, 0.4944033921f, 0.4632124305f, 0.4230656624f, + 0.3596196771f, 0.2740281522f, 0.1503099501f, 0.0000000000f, + -0.1503099501f, -0.2740281820f, -0.3596196771f, -0.4230656624f, + -0.4632124305f, -0.4944033921f, -0.5064008832f, -0.5096575022f, + -0.5093557835f, -0.5078617930f, -0.5051452518f, -0.5031182766f, + -0.5018239021f, -0.5010477304f, -0.5000000000f}, + {0.5000000000f, 0.5009795427f, 0.5017020702f, 0.5028998852f, + 0.5047514439f, 0.5071461797f, 0.5083272457f, 0.5081763268f, + 0.5042734742f, 0.4913944900f, 0.4591503739f, 0.4183884263f, + 0.3544511497f, 0.2652117610f, 0.1448854804f, 0.0000000000f, + -0.1448854804f, -0.2652117610f, -0.3544511199f, -0.4183884561f, + -0.4591503739f, -0.4913944900f, -0.5042735338f, -0.5081762671f, + -0.5083272457f, -0.5071461797f, -0.5047514439f, -0.5028998256f, + -0.5017020702f, -0.5009795427f, -0.5000000000f}, + {0.5000000000f, 0.5008758903f, 0.5015168786f, 0.5025681257f, + 0.5041542053f, 0.5060635209f, 0.5067747831f, 0.5059480071f, + 0.5010885596f, 0.4869216979f, 0.4531719685f, 0.4115628898f, + 0.3473647535f, 0.2555567026f, 0.1373466700f, 0.0000000000f, + -0.1373466551f, -0.2555567324f, -0.3473647535f, -0.4115628600f, + -0.4531720281f, -0.4869216383f, -0.5010885596f, -0.5059480071f, + -0.5067747831f, -0.5060635209f, -0.5041542649f, -0.5025681257f, + -0.5015168786f, -0.5008758307f, -0.5000000000f}, + {0.5000000000f, 0.5006161928f, 0.5010533929f, 0.5017392039f, + 0.5026661158f, 0.5033791661f, 0.5029437542f, 0.5004872084f, + 0.4933607578f, 0.4762223363f, 0.4391518831f, 0.3958170116f, + 0.3313111961f, 0.2418053001f, 0.1284317970f, 0.0000000000f, + -0.1284317821f, -0.2418053001f, -0.3313112259f, -0.3958170116f, + -0.4391518831f, -0.4762222767f, -0.4933607578f, -0.5004871488f, + -0.5029437542f, -0.5033791065f, -0.5026661158f, -0.5017392635f, + -0.5010534525f, -0.5006161332f, -0.5000000000f}, + {0.5000000000f, 0.5003644228f, 0.5006047487f, 0.5009382963f, + 0.5012336969f, 0.5008131266f, 0.4993060529f, 0.4953506589f, + 0.4861895740f, 0.4664809704f, 0.4267134368f, 0.3821379840f, + 0.3176781237f, 0.2303763181f, 0.1217892319f, 0.0000000000f, + -0.1217892319f, -0.2303763330f, -0.3176781535f, -0.3821379840f, + -0.4267134368f, -0.4664809406f, -0.4861895740f, -0.4953505993f, + -0.4993061125f, -0.5008131266f, -0.5012336969f, -0.5009382963f, + -0.5006047487f, -0.5003644228f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4993358850f, 0.4987771511f, 0.4976935983f, + 0.4954852164f, 0.4906864166f, 0.4851732254f, 0.4758279026f, + 0.4597451985f, 0.4319911599f, 0.3849090934f, 0.3379579186f, + 0.2754054070f, 0.1962166131f, 0.1024479717f, 0.0000000000f, + -0.1024479717f, -0.1962166280f, -0.2754054070f, -0.3379579186f, + -0.3849091530f, -0.4319911599f, -0.4597451687f, -0.4758278131f, + -0.4851732850f, -0.4906864166f, -0.4954852462f, -0.4976935983f, + -0.4987771511f, -0.4993358850f, -0.5000000000f}, + {0.5000000000f, 0.4989066720f, 0.4980169535f, 0.4963521063f, + 0.4931337833f, 0.4866205156f, 0.4795958996f, 0.4683040977f, + 0.4498754740f, 0.4196476638f, 0.3707037270f, 0.3235089183f, + 0.2620966136f, 0.1858147979f, 0.0966935307f, 0.0000000000f, + -0.0966935158f, -0.1858148128f, -0.2620966136f, -0.3235089481f, + -0.3707037270f, -0.4196476340f, -0.4498754442f, -0.4683040380f, + -0.4795959294f, -0.4866205454f, -0.4931338131f, -0.4963521063f, + -0.4980169237f, -0.4989066422f, -0.5000000000f}}, { - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - }, + + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}}, { - {134217728, 133921369, 133680325, 133229561, 132358967, 130599331, - 128703866, 125660282, 120698624, 112569265, 99420249, 86750797, - 70273427, 49815207, 25920708, 0, -25920706, -49815216, - -70273432, -86750797, -99420258, -112569265, -120698624, -125660282, - -128703874, -130599331, -132358983, -133229561, -133680325, -133921361, - -134217728}, - {134217728, 133939441, 133712333, 133285932, 132457505, 130768900, - 128935465, 125970874, 121102931, 113070012, 99989904, 87325519, - 70798668, 50223016, 26145306, 0, -26145303, -50223020, - -70798668, -87325510, -99989904, -113070007, -121102923, -125970860, - -128935481, -130768900, -132457513, -133285939, -133712341, -133939433, - -134217728}, - {134217728, 133966965, 133761027, 133371807, 132607806, 131028081, - 129290132, 126447716, 121725742, 113844587, 100875428, 88221954, - 71620616, 50862942, 26498391, 0, -26498387, -50862942, - -71620616, -88221954, -100875420, -113844579, -121725728, -126447716, - -129290134, -131028089, -132607814, -133371815, -133761036, -133966957, - -134217728}, - {134217728, 134036022, 133883399, 133587872, 132986916, 131684800, - 130192440, 127667609, 123330612, 115858986, 103203513, 90596996, - 73814421, 52581631, 27450707, 0, -27450704, -52581631, - -73814421, -90596996, -103203522, -115858986, -123330612, -127667609, - -130192441, -131684792, -132986917, -133587864, -133883399, -134036014, - -134217728}, - {134217728, 134103202, 134002513, 133798640, 133358145, 132331971, - 131086862, 128886498, 124951211, 117920856, 105625489, 93096793, - 76149699, 54428898, 28481041, 0, -28481039, -54428898, - -76149699, -93096785, -105625498, -117920856, -124951211, -128886489, - -131086879, -132331963, -133358153, -133798640, -134002521, -134103194, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134379666, 134494354, 134673574, 134913679, 135089351, - 134957528, 134277005, 132335084, 127697337, 117706188, 106054041, - 88737144, 64741149, 34377366, 0, -34377367, -64741156, - -88737144, -106054041, -117706196, -127697337, -132335084, -134276990, - -134957528, -135089351, -134913695, -134673590, -134494354, -134379666, - -134217728}, - {134217728, 134496089, 134702142, 135045469, 135582090, 136297572, - 136685224, 136746798, 135844838, 132586207, 124167625, 113363717, - 96250743, 73172765, 40110159, 0, -40110156, -73172772, - -96250750, -113363724, -124167639, -132586207, -135844838, -136746798, - -136685224, -136297572, -135582122, -135045469, -134702142, -134496073, - -134217728}, - }, + + {0.5000000000f, 0.4988959730f, 0.4979980290f, 0.4963187873f, + 0.4930755794f, 0.4865204096f, 0.4794592559f, 0.4681210220f, + 0.4496374130f, 0.4193531871f, 0.3703692853f, 0.3231719136f, + 0.2617889047f, 0.1855761111f, 0.0965621620f, 0.0000000000f, + -0.0965621546f, -0.1855761409f, -0.2617889345f, -0.3231719136f, + -0.3703693151f, -0.4193531871f, -0.4496374130f, -0.4681210220f, + -0.4794592857f, -0.4865204096f, -0.4930756390f, -0.4963187873f, + -0.4979980290f, -0.4988959432f, -0.5000000000f}, + {0.5000000000f, 0.4989632964f, 0.4981172681f, 0.4965288043f, + 0.4934426546f, 0.4871520996f, 0.4803220332f, 0.4692780674f, + 0.4511435628f, 0.4212186337f, 0.3724914193f, 0.3253129125f, + 0.2637456059f, 0.1870953143f, 0.0973988548f, 0.0000000000f, + -0.0973988473f, -0.1870953292f, -0.2637456059f, -0.3253128827f, + -0.3724914193f, -0.4212186038f, -0.4511435330f, -0.4692780375f, + -0.4803220928f, -0.4871520996f, -0.4934426844f, -0.4965288043f, + -0.4981172979f, -0.4989632666f, -0.5000000000f}, + {0.5000000000f, 0.4990658462f, 0.4982986450f, 0.4968487024f, + 0.4940025806f, 0.4881176353f, 0.4816432595f, 0.4710544348f, + 0.4534637332f, 0.4241041243f, 0.3757902384f, 0.3286523819f, + 0.2668075860f, 0.1894792318f, 0.0987142026f, 0.0000000000f, + -0.0987141877f, -0.1894792318f, -0.2668075860f, -0.3286523819f, + -0.3757902384f, -0.4241040945f, -0.4534636736f, -0.4710544348f, + -0.4816432893f, -0.4881176651f, -0.4940026104f, -0.4968487322f, + -0.4982987046f, -0.4990658164f, -0.5000000000f}, + {0.5000000000f, 0.4993230999f, 0.4987545311f, 0.4976536036f, + 0.4954148531f, 0.4905641079f, 0.4850046337f, 0.4755989015f, + 0.4594423175f, 0.4316083491f, 0.3844630420f, 0.3375000954f, + 0.2749801576f, 0.1958818436f, 0.1022618562f, 0.0000000000f, + -0.1022618413f, -0.1958818436f, -0.2749801576f, -0.3375000954f, + -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f, + -0.4850046337f, -0.4905640781f, -0.4954148829f, -0.4976535738f, + -0.4987545311f, -0.4993230700f, -0.5000000000f}, + {0.5000000000f, 0.4995733500f, 0.4991982579f, 0.4984387755f, + 0.4967978001f, 0.4929749966f, 0.4883366227f, 0.4801396132f, + 0.4654795229f, 0.4392894208f, 0.3934856057f, 0.3468125761f, + 0.2836797237f, 0.2027634382f, 0.1061001420f, 0.0000000000f, + -0.1061001420f, -0.2027634382f, -0.2836797237f, -0.3468125463f, + -0.3934856355f, -0.4392894208f, -0.4654795229f, -0.4801395833f, + -0.4883366823f, -0.4929749668f, -0.4967978299f, -0.4984387755f, + -0.4991982877f, -0.4995733202f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.5006032586f, 0.5010305047f, 0.5016981363f, + 0.5025926232f, 0.5032470226f, 0.5027559996f, 0.5002208352f, + 0.4929866195f, 0.4757096469f, 0.4384897351f, 0.3950820863f, + 0.3305716217f, 0.2411795706f, 0.1280656755f, 0.0000000000f, + -0.1280656755f, -0.2411796004f, -0.3305716217f, -0.3950820863f, + -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f, + -0.5027559996f, -0.5032470226f, -0.5025926828f, -0.5016981959f, + -0.5010305047f, -0.5006032586f, -0.5000000000f}, + {0.5000000000f, 0.5010370016f, 0.5018045902f, 0.5030835867f, + 0.5050826669f, 0.5077480078f, 0.5091921091f, 0.5094215274f, + 0.5060614347f, 0.4939221144f, 0.4625604451f, 0.4223127663f, + 0.3585619628f, 0.2725898027f, 0.1494219899f, 0.0000000000f, + -0.1494219750f, -0.2725898027f, -0.3585619926f, -0.4223127961f, + -0.4625605047f, -0.4939221144f, -0.5060614347f, -0.5094215274f, + -0.5091921091f, -0.5077480078f, -0.5050827861f, -0.5030835867f, + -0.5018045902f, -0.5010369420f, -0.5000000000f}}, { - {134217728, 133678764, 133252044, 132477911, 131054012, 128379841, - 125703998, 121692333, 115624181, 106419205, 92593586, 79977943, - 64179408, 45144170, 23370016, 0, -23370016, -45144171, - -64179414, -79977946, -92593586, -106419205, -115624163, -121692333, - -125704006, -128379841, -131054020, -132477902, -133252052, -133678756, - -134217736}, - {134217728, 133712005, 133310620, 132580354, 131230923, 128677921, - 126103542, 122214988, 116283239, 107204353, 93448335, 80814831, - 64923238, 45708586, 23676173, 0, -23676171, -45708591, - -64923238, -80814831, -93448335, -107204344, -116283230, -122214988, - -126103542, -128677921, -131230923, -132580362, -133310620, -133711997, - -134217736}, - {134217728, 133762594, 133399847, 132736656, 131501355, 129135285, - 126718565, 123023009, 117307580, 108432557, 94794977, 82139615, - 66105845, 46609132, 24165789, 0, -24165786, -46609132, - -66105845, -82139614, -94794987, -108432548, -117307580, -123023009, - -126718574, -129135285, -131501371, -132736656, -133399839, -133762594, - -134217736}, - {134217728, 133889704, 133624356, 133130995, 132186884, 130303885, - 128301191, 125121697, 120000061, 111707953, 98445440, 85770865, - 69380893, 49124196, 25540859, 0, -25540856, -49124196, - -69380893, -85770874, -98445449, -111707944, -120000061, -125121697, - -128301191, -130303893, -132186900, -133130995, -133624357, -133889712, - -134217728}, - {134217728, 134013488, 133843425, 133517257, 132862879, 131469448, - 129895964, 127265729, 122800030, 115190043, 102426301, 89801131, - 73076634, 52001860, 27128796, 0, -27128794, -52001864, - -73076638, -89801131, -102426301, -115190039, -122800030, -127265729, - -129895972, -131469447, -132862879, -133517265, -133843441, -134013480, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217728, 134524667, 134753225, 135137152, 135747532, 136598811, - 137119081, 137373516, 136748951, 133873234, 125921352, 115399246, - 100457878, 77154925, 42583859, 0, -42583859, -77154925, - -100457884, -115399246, -125921369, -133873234, -136748936, -137373501, - -137119096, -136598811, -135747548, -135137152, -134753241, -134524667, - -134217728}, - {134217744, 134740697, 135140165, 135833916, 137013874, 138934982, - 140527025, 142390622, 144197099, 144950610, 153156290, 156579036, - 152419516, 130790170, 79555585, 0, -79555598, -130790170, - -152419516, -156579036, -153156290, -144950597, -144197099, -142390622, - -140527040, -138934982, -137013891, -135833916, -135140150, -134740697, - -134217744}, - }, + + {0.5000000000f, 0.4979922175f, 0.4964025617f, 0.4935186803f, + 0.4882142544f, 0.4782521725f, 0.4682838917f, 0.4533392787f, + 0.4307336509f, 0.3964424431f, 0.3449379802f, 0.2979410589f, + 0.2390869260f, 0.1681751311f, 0.0870600939f, 0.0000000000f, + -0.0870600939f, -0.1681751460f, -0.2390869558f, -0.2979410589f, + -0.3449379802f, -0.3964424431f, -0.4307335615f, -0.4533392787f, + -0.4682839215f, -0.4782521725f, -0.4882142544f, -0.4935186505f, + -0.4964025617f, -0.4979921579f, -0.5000000000f}, + {0.5000000000f, 0.4981160462f, 0.4966207743f, 0.4939002991f, + 0.4888732731f, 0.4793626070f, 0.4697723091f, 0.4552863240f, + 0.4331888258f, 0.3993673325f, 0.3481221795f, 0.3010587096f, + 0.2418579161f, 0.1702777445f, 0.0882006139f, 0.0000000000f, + -0.0882006139f, -0.1702777743f, -0.2418579161f, -0.3010587096f, + -0.3481221795f, -0.3993673027f, -0.4331887960f, -0.4552863240f, + -0.4697723091f, -0.4793626070f, -0.4888732731f, -0.4939003289f, + -0.4966207743f, -0.4981160164f, -0.5000000000f}, + {0.5000000000f, 0.4983044863f, 0.4969531596f, 0.4944825768f, + 0.4898807108f, 0.4810664356f, 0.4720634520f, 0.4582964182f, + 0.4370048046f, 0.4039427638f, 0.3531388044f, 0.3059939146f, + 0.2462634593f, 0.1736325473f, 0.0900245756f, 0.0000000000f, + -0.0900245681f, -0.1736325473f, -0.2462634593f, -0.3059939146f, + -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f, + -0.4720634818f, -0.4810664356f, -0.4898807704f, -0.4944825768f, + -0.4969531298f, -0.4983044863f, -0.5000000000f}, + {0.5000000000f, 0.4987780154f, 0.4977895021f, 0.4959515929f, + 0.4924345016f, 0.4854198098f, 0.4779591858f, 0.4661146402f, + 0.4470350742f, 0.4161445498f, 0.3667378426f, 0.3195213675f, + 0.2584639788f, 0.1830018908f, 0.0951471180f, 0.0000000000f, + -0.0951471031f, -0.1830018908f, -0.2584639788f, -0.3195213974f, + -0.3667378724f, -0.4161445200f, -0.4470350742f, -0.4661146402f, + -0.4779591858f, -0.4854198396f, -0.4924345613f, -0.4959515929f, + -0.4977895319f, -0.4987780452f, -0.5000000000f}, + {0.5000000000f, 0.4992391467f, 0.4986056089f, 0.4973905385f, + 0.4949527979f, 0.4897618592f, 0.4839001894f, 0.4741017818f, + 0.4574657679f, 0.4291163385f, 0.3815677166f, 0.3345352709f, + 0.2722316682f, 0.1937220246f, 0.1010626405f, 0.0000000000f, + -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f, + -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f, + -0.4839001894f, -0.4897618592f, -0.4949527979f, -0.4973905683f, + -0.4986056685f, -0.4992391169f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000000f, 0.5011434555f, 0.5019949079f, 0.5034251213f, + 0.5056989789f, 0.5088702440f, 0.5108084083f, 0.5117562413f, + 0.5094295144f, 0.4987166524f, 0.4690935910f, 0.4298956990f, + 0.3742347658f, 0.2874245048f, 0.1586372405f, 0.0000000000f, + -0.1586372405f, -0.2874245048f, -0.3742347956f, -0.4298956990f, + -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f, + -0.5108084679f, -0.5088702440f, -0.5056990385f, -0.5034251213f, + -0.5019949675f, -0.5011434555f, -0.5000000000f}, + {0.5000000596f, 0.5019482374f, 0.5034363270f, 0.5060207844f, + 0.5104164481f, 0.5175731182f, 0.5235039592f, 0.5304464102f, + 0.5371760726f, 0.5399830937f, 0.5705516338f, 0.5833023787f, + 0.5678069592f, 0.4872313440f, 0.2963676453f, 0.0000000000f, + -0.2963677049f, -0.4872313440f, -0.5678069592f, -0.5833023787f, + -0.5705516338f, -0.5399830341f, -0.5371760726f, -0.5304464102f, + -0.5235040188f, -0.5175731182f, -0.5104165077f, -0.5060207844f, + -0.5034362674f, -0.5019482374f, -0.5000000596f}}, { - {134217728, 133517388, 132968168, 131982689, 130203271, 126958371, - 123812646, 119241372, 112569785, 102830521, 88745154, 76246960, - 60892748, 42668052, 22033146, 0, -22033144, -42668058, - -60892753, -76246960, -88745154, -102830531, -112569785, -119241363, - -123812646, -126958371, -130203280, -131982697, -132968160, -133517380, - -134217736}, - {134217728, 133560667, 133044207, 132115111, 130430074, 127335394, - 124312090, 119884885, 113366063, 103758318, 89731133, 77197209, - 61725371, 43292651, 22369435, 0, -22369434, -43292655, - -61725371, -77197209, -89731143, -103758309, -113366066, -119884894, - -124312098, -127335394, -130430074, -132115119, -133044215, -133560651, - -134217736}, - {134217728, 133626556, 133160120, 132317284, 130777308, 127915335, - 125083431, 120883935, 114610226, 105218855, 91295851, 78713135, - 63059915, 44297538, 22911785, 0, -22911782, -44297538, - -63059910, -78713135, -91295851, -105218855, -114610226, -120883926, - -125083440, -127915335, -130777308, -132317293, -133160128, -133626540, - -134217736}, - {134217728, 133792202, 133452102, 132828323, 131660297, 129405046, - 127082463, 123503081, 117919375, 109170723, 95610055, 82945267, - 66828178, 47161136, 24466610, 0, -24466610, -47161136, - -66828178, -82945267, -95610064, -109170725, -117919366, -123503090, - -127082486, -129405039, -131660312, -132828331, -133452110, -133792210, - -134217736}, - {134217728, 133953625, 133737455, 133330222, 132534982, 130902453, - 129118100, 126216242, 121423078, 113467678, 100443871, 87784612, - 71219202, 50550149, 26325706, 0, -26325706, -50550154, - -71219202, -87784603, -100443871, -113467678, -121423078, -126216226, - -129118109, -130902436, -132534997, -133330214, -133737456, -133953625, - -134217728}, - {134217728, 134209240, 134190888, 134132864, 133949552, 133371536, - 132534624, 130880344, 127640160, 121406192, 109814504, 97493904, - 80326624, 57781472, 30369936, 0, -30369936, -57781472, - -80326624, -97493904, -109814504, -121406184, -127640152, -130880344, - -132534632, -133371536, -133949560, -134132872, -134190888, -134209240, - -134217728}, - {134217744, 134621813, 134927051, 135449572, 136313400, 137636071, - 138622650, 139566056, 139956832, 138536878, 133180717, 129783677, - 118675624, 94628818, 53853299, 0, -53853295, -94628811, - -118675637, -129783677, -133180717, -138536882, -139956832, -139566056, - -138622666, -137636071, -136313400, -135449572, -134927051, -134621813, - -134217744}, - {134217744, 134904883, 135435219, 136368502, 137996233, 140785045, - 143282261, 146575942, 150720567, 165849956, 193015195, 218765208, - 250475834, 276007487, 232012394, 0, -232012528, -276007460, - -250475861, -218765208, -193015222, -165849956, -150720553, -146575942, - -143282275, -140785029, -137996233, -136368502, -135435219, -134904883, - -134217744}, - }, + + {0.5000000000f, 0.4973910451f, 0.4953450263f, 0.4916738272f, + 0.4850449860f, 0.4729567766f, 0.4612380564f, 0.4442087412f, + 0.4193551242f, 0.3830735385f, 0.3306014538f, 0.2840420604f, + 0.2268431634f, 0.1589508802f, 0.0820798650f, 0.0000000000f, + -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420604f, + -0.3306014538f, -0.3830735683f, -0.4193551242f, -0.4442086816f, + -0.4612380564f, -0.4729567766f, -0.4850450158f, -0.4916738570f, + -0.4953449965f, -0.4973909855f, -0.5000000000f}, + {0.5000000000f, 0.4975522459f, 0.4956282973f, 0.4921671450f, + 0.4858898818f, 0.4743613005f, 0.4630986154f, 0.4466060102f, + 0.4223214984f, 0.3865298629f, 0.3342745304f, 0.2875820100f, + 0.2299449295f, 0.1612776965f, 0.0833326429f, 0.0000000000f, + -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f, + -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f, + -0.4630986452f, -0.4743613005f, -0.4858898818f, -0.4921671748f, + -0.4956283271f, -0.4975521863f, -0.5000000000f}, + {0.5000000000f, 0.4977977276f, 0.4960601032f, 0.4929202795f, + 0.4871834517f, 0.4765217602f, 0.4659720957f, 0.4503277540f, + 0.4269563556f, 0.3919707835f, 0.3401035368f, 0.2932292819f, + 0.2349164933f, 0.1650211811f, 0.0853530467f, 0.0000000000f, + -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f, + -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277242f, + -0.4659721255f, -0.4765217602f, -0.4871834517f, -0.4929203391f, + -0.4960601330f, -0.4977976680f, -0.5000000000f}, + {0.5000000000f, 0.4984147847f, 0.4971478283f, 0.4948240519f, + 0.4904728234f, 0.4820713699f, 0.4734190702f, 0.4600848258f, + 0.4392839074f, 0.4066926241f, 0.3561752141f, 0.3089951873f, + 0.2489543557f, 0.1756889224f, 0.0911452249f, 0.0000000000f, + -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f, + -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f, + -0.4734191597f, -0.4820713401f, -0.4904728830f, -0.4948240817f, + -0.4971478581f, -0.4984148145f, -0.5000000000f}, + {0.5000000000f, 0.4990161359f, 0.4982108474f, 0.4966937900f, + 0.4937312901f, 0.4876496494f, 0.4810023904f, 0.4701921344f, + 0.4523362219f, 0.4227000475f, 0.3741825819f, 0.3270231485f, + 0.2653121948f, 0.1883139759f, 0.0980708972f, 0.0000000000f, + -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231187f, + -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f, + -0.4810024500f, -0.4876495600f, -0.4937313497f, -0.4966937602f, + -0.4982108474f, -0.4990161359f, -0.5000000000f}, + {0.5000000000f, 0.4999683797f, 0.4999000132f, 0.4996838570f, + 0.4990009665f, 0.4968476892f, 0.4937299490f, 0.4875672758f, + 0.4754966497f, 0.4522733092f, 0.4090909064f, 0.3631930947f, + 0.2992399931f, 0.2152527571f, 0.1131368279f, 0.0000000000f, + -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f, + -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, + -0.4937299788f, -0.4968476892f, -0.4990009964f, -0.4996838868f, + -0.4999000132f, -0.4999683797f, -0.5000000000f}, + {0.5000000596f, 0.5015053153f, 0.5026424527f, 0.5045889616f, + 0.5078070164f, 0.5127342939f, 0.5164096355f, 0.5199240446f, + 0.5213798285f, 0.5160900950f, 0.4961368442f, 0.4834818840f, + 0.4421011508f, 0.3525198102f, 0.2006191760f, 0.0000000000f, + -0.2006191611f, -0.3525197804f, -0.4421012104f, -0.4834818840f, + -0.4961368442f, -0.5160900950f, -0.5213798285f, -0.5199240446f, + -0.5164096951f, -0.5127342939f, -0.5078070164f, -0.5045889616f, + -0.5026424527f, -0.5015053153f, -0.5000000596f}, + {0.5000000596f, 0.5025598407f, 0.5045354962f, 0.5080122352f, + 0.5140760541f, 0.5244651437f, 0.5337679982f, 0.5460379124f, + 0.5614778399f, 0.6178392172f, 0.7190376520f, 0.8149639368f, + 0.9330952168f, 1.0282080173f, 0.8643135428f, 0.0000000000f, + -0.8643140197f, -1.0282078981f, -0.9330952764f, -0.8149639368f, + -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f, + -0.5337680578f, -0.5244650841f, -0.5140760541f, -0.5080122352f, + -0.5045354962f, -0.5025598407f, -0.5000000596f}} + }; -const WORD32 ixheaacd_beta_Q28[16][8][31] = { +const FLOAT32 ixheaacd_beta[16][8][31] = { { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 524548, 928967, 1639916, 2878403, 5000493, 6908550, - 9455203, 12765894, 16898498, 21732020, 25132388, 28389032, 31149502, - 33022448, 33688388, 33022450, 31149502, 28389032, 25132388, 21732022, - 16898498, 12765894, 9455202, 6908550, 5000493, 2878403, 1639916, - 928967, 524548, 3}, - {5, 812423, 1439377, 2542753, 4468501, 7778568, 10765468, - 14766874, 19992330, 26548934, 34259648, 39707896, 44942048, 49389848, - 52412912, 53488748, 52412912, 49389844, 44942052, 39707896, 34259652, - 26548934, 19992330, 14766874, 10765469, 7778568, 4468501, 2542753, - 1439377, 812423, 5}, - {7, 1202481, 2132639, 3774216, 6653171, 11641950, 16186106, - 22334354, 30462996, 40811628, 53176452, 62028444, 70614328, 77968304, - 82994936, 84789064, 82994936, 77968304, 70614328, 62028448, 53176452, - 40811628, 30462996, 22334354, 16186107, 11641950, 6653172, 3774216, - 2132639, 1202481, 7}, - {8, 1400871, 2486989, 4409108, 7796283, 13714060, - 19156910, 26599080, 36572432, 49482236, 65204176, 76647304, - 87887896, 97621072, 104327480, 106731360, 104327488, 97621064, - 87887896, 76647304, 65204180, 49482240, 36572432, 26599080, - 19156912, 13714061, 7796283, 4409108, 2486989, 1400871, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1223918, 2181987, 3897455, 6984316, 12583060, - 17979762, 25778776, 37085592, 53441976, 78581112, 104374688, - 137112768, 174183376, 206541584, 219922496, 206541600, 174183344, - 137112784, 104374688, 78581120, 53441980, 37085592, 25778774, - 17979764, 12583059, 6984316, 3897455, 2181987, 1223918, - 7}, - {1, 214133, 382441, 685346, 1235544, 2251347, - 3254155, 4749173, 7031145, 11641319, 21058462, 33931652, - 61102220, 133797576, 430779840, 1577812480, 430780608, 133797536, - 61102232, 33931652, 21058464, 11641320, 7031145, 4749173, - 3254155, 2251347, 1235544, 685346, 382441, 214133, - 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019540936f, 0.0034606718f, 0.0061091632f, + 0.0107228868f, 0.0186282881f, 0.0257363543f, 0.0352233760f, + 0.0475566611f, 0.0629518107f, 0.0809580833f, 0.0936254412f, + 0.1057573855f, 0.1160409376f, 0.1230182052f, 0.1254990250f, + 0.1230182126f, 0.1160409376f, 0.1057573855f, 0.0936254412f, + 0.0809580907f, 0.0629518107f, 0.0475566611f, 0.0352233723f, + 0.0257363543f, 0.0186282881f, 0.0107228868f, 0.0061091632f, + 0.0034606718f, 0.0019540936f, 0.0000000112f}, + {0.0000000186f, 0.0030265115f, 0.0053620972f, 0.0094724931f, + 0.0166464634f, 0.0289774239f, 0.0401044935f, 0.0550108925f, + 0.0744772330f, 0.0989024863f, 0.1276271343f, 0.1479234397f, + 0.1674221754f, 0.1839915216f, 0.1952533126f, 0.1992611140f, + 0.1952533126f, 0.1839915067f, 0.1674221903f, 0.1479234397f, + 0.1276271492f, 0.0989024863f, 0.0744772330f, 0.0550108925f, + 0.0401044972f, 0.0289774239f, 0.0166464634f, 0.0094724931f, + 0.0053620972f, 0.0030265115f, 0.0000000186f}, + {0.0000000261f, 0.0044795908f, 0.0079446994f, 0.0140600502f, + 0.0247849934f, 0.0433696434f, 0.0602979437f, 0.0832019523f, + 0.1134835035f, 0.1520351619f, 0.1980977207f, 0.2310739607f, + 0.2630588710f, 0.2904545665f, 0.3091802299f, 0.3158638775f, + 0.3091802299f, 0.2904545665f, 0.2630588710f, 0.2310739756f, + 0.1980977207f, 0.1520351619f, 0.1134835035f, 0.0832019523f, + 0.0602979474f, 0.0433696434f, 0.0247849971f, 0.0140600502f, + 0.0079446994f, 0.0044795908f, 0.0000000261f}, + {0.0000000298f, 0.0052186511f, 0.0092647560f, 0.0164252073f, + 0.0290434174f, 0.0510888547f, 0.0713650510f, 0.0990892947f, + 0.1362429261f, 0.1843356937f, 0.2429044843f, 0.2855334580f, + 0.3274079263f, 0.3636668324f, 0.3886501491f, 0.3976052999f, + 0.3886501789f, 0.3636668026f, 0.3274079263f, 0.2855334580f, + 0.2429044992f, 0.1843357086f, 0.1362429261f, 0.0990892947f, + 0.0713650584f, 0.0510888584f, 0.0290434174f, 0.0164252073f, + 0.0092647560f, 0.0052186511f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045594499f, 0.0081285350f, 0.0145191513f, + 0.0260186046f, 0.0468755513f, 0.0669798329f, 0.0960334241f, + 0.1381545961f, 0.1990868747f, 0.2927374542f, 0.3888260126f, + 0.5107848644f, 0.6488836408f, 0.7694273591f, 0.8192751408f, + 0.7694274187f, 0.6488835216f, 0.5107849240f, 0.3888260126f, + 0.2927374840f, 0.1990868896f, 0.1381545961f, 0.0960334167f, + 0.0669798404f, 0.0468755476f, 0.0260186046f, 0.0145191513f, + 0.0081285350f, 0.0045594499f, 0.0000000261f}, + {0.0000000037f, 0.0007977076f, 0.0014247037f, 0.0025531128f, + 0.0046027601f, 0.0083869211f, 0.0121226721f, 0.0176920481f, + 0.0261930563f, 0.0433672927f, 0.0784488842f, 0.1264052540f, + 0.2276235074f, 0.4984348118f, 1.6047799587f, 5.8778095245f, + 1.6047828197f, 0.4984346628f, 0.2276235521f, 0.1264052540f, + 0.0784488916f, 0.0433672965f, 0.0261930563f, 0.0176920481f, + 0.0121226721f, 0.0083869211f, 0.0046027601f, 0.0025531128f, + 0.0014247037f, 0.0007977076f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 524756, 929618, 1641931, 2884546, 5018684, 6942684, - 9517694, 12876462, 17085148, 22027532, 25515680, 28863994, 31707368, - 33639036, 34326304, 33639036, 31707366, 28863996, 25515680, 22027532, - 17085148, 12876462, 9517694, 6942685, 5018684, 2884546, 1641932, - 929618, 524756, 3}, - {5, 812713, 1440285, 2545568, 4477108, 7804208, 10813826, - 14855985, 20151268, 26819764, 34692788, 40273396, 45646932, 50221664, - 53335084, 54443828, 53335084, 50221660, 45646932, 40273396, 34692788, - 26819762, 20151268, 14855984, 10813826, 7804208, 4477108, 2545568, - 1440285, 812713, 5}, - {7, 1202789, 2133603, 3777225, 6662453, 11670018, 16239749, - 22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256, - 84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904, - 41132176, 30646314, 22434930, 16239752, 11670018, 6662454, 3777225, - 2133603, 1202789, 7}, - {8, 1401091, 2487681, 4411274, 7803027, 13734770, - 19197032, 26675680, 36715348, 49739444, 65641580, 77242592, - 88658976, 98560160, 105390504, 107840400, 105390512, 98560152, - 88658992, 77242592, 65641576, 49739444, 36715348, 26675674, - 19197034, 13734770, 7803028, 4411274, 2487680, 1401091, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1223607, 2180998, 3894286, 6974063, 12549334, - 17910016, 25632730, 36775224, 52772652, 75633064, 99236928, - 128381344, 160330848, 187347760, 198291376, 187347792, 160330816, - 128381360, 99236928, 75633072, 52772648, 36775220, 25632728, - 17910018, 12549334, 6974064, 3894286, 2180998, 1223607, - 7}, - {1, 214041, 382148, 684396, 1232418, 2240724, - 3231452, 4699171, 6913169, 11028142, 19133978, 29199466, - 47298748, 81631520, 140893408, 184843504, 140893488, 81631504, - 47298752, 29199468, 19133982, 11028142, 6913169, 4699170, - 3231452, 2240724, 1232418, 684397, 382148, 214041, - 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f, + 0.0107457712f, 0.0186960548f, 0.0258635134f, 0.0354561731f, + 0.0479685590f, 0.0636471361f, 0.0820589513f, 0.0950533152f, + 0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f, + 0.1253151745f, 0.1181191429f, 0.1075267643f, 0.0950533152f, + 0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f, + 0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f, + 0.0034630969f, 0.0019548684f, 0.0000000112f}, + {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f, + 0.0166785270f, 0.0290729403f, 0.0402846411f, 0.0553428568f, + 0.0750693232f, 0.0999114066f, 0.1292407066f, 0.1500300914f, + 0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190643f, + 0.1986886710f, 0.1870902628f, 0.1700480729f, 0.1500300914f, + 0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428531f, + 0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f, + 0.0053654797f, 0.0030275919f, 0.0000000186f}, + {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f, + 0.0248195715f, 0.0434742048f, 0.0604977794f, 0.0835766271f, + 0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f, + 0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f, + 0.3136188090f, 0.2944217920f, 0.2663741708f, 0.2336882651f, + 0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f, + 0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f, + 0.0079482906f, 0.0044807382f, 0.0000000261f}, + {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f, + 0.0290685408f, 0.0511660054f, 0.0715145171f, 0.0993746519f, + 0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f, + 0.3302804232f, 0.3671652079f, 0.3926102221f, 0.4017367959f, + 0.3926102519f, 0.3671651781f, 0.3302804828f, 0.2877510786f, + 0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f, + 0.0715145245f, 0.0511660054f, 0.0290685445f, 0.0164332762f, + 0.0092673302f, 0.0052194707f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f, + 0.0259804092f, 0.0467499122f, 0.0667200089f, 0.0954893604f, + 0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f, + 0.4782577753f, 0.5972789526f, 0.6979247928f, 0.7386929393f, + 0.6979249120f, 0.5972788334f, 0.4782578349f, 0.3696863651f, + 0.2817551494f, 0.1965934336f, 0.1369983703f, 0.0954893529f, + 0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f, + 0.0081248507f, 0.0045582913f, 0.0000000261f}, + {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f, + 0.0045911148f, 0.0083473474f, 0.0120380968f, 0.0175057761f, + 0.0257535614f, 0.0410830304f, 0.0712796226f, 0.1087764874f, + 0.1762015671f, 0.3041011095f, 0.5248688459f, 0.6885957122f, + 0.5248691440f, 0.3041010499f, 0.1762015820f, 0.1087764949f, + 0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f, + 0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f, + 0.0014236122f, 0.0007973649f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 525351, 931480, 1647714, 2902257, 5071597, 7042735, - 9702682, 13207802, 17652582, 22940042, 26711396, 30359376, 33476790, - 35604100, 36362732, 35604100, 33476786, 30359378, 26711396, 22940042, - 17652582, 13207802, 9702681, 7042735, 5071597, 2902257, 1647714, - 931480, 525351, 3}, - {5, 813540, 1442877, 2553636, 4501896, 7878638, 10955188, - 15118865, 20625528, 27638916, 36022472, 42026548, 47851776, 52842400, - 56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476, - 27638918, 20625528, 15118864, 10955189, 7878638, 4501896, 2553636, - 1442877, 813540, 5}, - {7, 1203665, 2136357, 3785832, 6689100, 11751078, 16395488, - 22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976, - 87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532, - 42088120, 31187070, 22728958, 16395489, 11751078, 6689101, 3785832, - 2136357, 1203665, 7}, - {8, 1401717, 2489652, 4417463, 7822332, 13794262, - 19312684, 26897488, 37131704, 50494456, 66937128, 79016952, - 90971256, 101390632, 108605536, 111198632, 108605544, 101390624, - 90971264, 79016952, 66937124, 50494456, 37131704, 26897486, - 19312686, 13794262, 7822333, 4417463, 2489652, 1401717, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1222724, 2178188, 3885304, 6945113, 12454759, - 17715754, 25230046, 35932316, 50996136, 71510480, 88238104, - 108673696, 130724624, 148143056, 154903104, 148143056, 130724616, - 108673712, 88238104, 71510496, 50996136, 35932312, 25230042, - 17715758, 12454758, 6945114, 3885304, 2178189, 1222724, - 7}, - {1, 213781, 381315, 681714, 1223645, 2211279, 3169313, - 4564991, 6613954, 9638447, 15182689, 20899234, 28782236, 38682308, - 48311500, 52599960, 48311512, 38682304, 28782238, 20899234, 15182691, - 9638447, 6613954, 4564991, 3169313, 2211279, 1223645, 681714, - 381315, 213781, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f, + 0.0108117498f, 0.0188931711f, 0.0262362324f, 0.0361453071f, + 0.0492028967f, 0.0657609925f, 0.0854583159f, 0.0995077044f, + 0.1130974889f, 0.1247107610f, 0.1326356083f, 0.1354617327f, + 0.1326356083f, 0.1247107461f, 0.1130974963f, 0.0995077044f, + 0.0854583159f, 0.0657609925f, 0.0492028967f, 0.0361453034f, + 0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f, + 0.0034700334f, 0.0019570850f, 0.0000000112f}, + {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f, + 0.0167708695f, 0.0293502137f, 0.0408112556f, 0.0563221611f, + 0.0768360794f, 0.1029629856f, 0.1341941655f, 0.1565610915f, + 0.1782617569f, 0.1968532801f, 0.2095632553f, 0.2141001821f, + 0.2095632553f, 0.1968532652f, 0.1782617867f, 0.1565610915f, + 0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f, + 0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f, + 0.0053751357f, 0.0030306727f, 0.0000000186f}, + {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f, + 0.0249188393f, 0.0437761769f, 0.0610779524f, 0.0846719742f, + 0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f, + 0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f, + 0.3273887634f, 0.3066769540f, 0.2765491605f, 0.2416490614f, + 0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f, + 0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f, + 0.0079585500f, 0.0044840015f, 0.0000000261f}, + {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f, + 0.0291404575f, 0.0513876304f, 0.0719453543f, 0.1002009511f, + 0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f, + 0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142471850f, + 0.4045871794f, 0.3777095079f, 0.3388943672f, 0.2943610847f, + 0.2493602186f, 0.1881065071f, 0.1383263767f, 0.1002009436f, + 0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f, + 0.0092746764f, 0.0052218027f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f, + 0.0258725621f, 0.0463975929f, 0.0659963265f, 0.0939892456f, + 0.1338583082f, 0.1899754107f, 0.2663972974f, 0.3287125528f, + 0.4048410654f, 0.4869871736f, 0.5518758893f, 0.5770590305f, + 0.5518758893f, 0.4869871438f, 0.4048411250f, 0.3287125528f, + 0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f, + 0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f, + 0.0081143863f, 0.0045550019f, 0.0000000261f}, + {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f, + 0.0045584328f, 0.0082376562f, 0.0118066110f, 0.0170059167f, + 0.0246388987f, 0.0359060131f, 0.0565599240f, 0.0778557137f, + 0.1072221845f, 0.1441028267f, 0.1799743623f, 0.1959501207f, + 0.1799744070f, 0.1441028118f, 0.1072221920f, 0.0778557137f, + 0.0565599315f, 0.0359060131f, 0.0246388987f, 0.0170059167f, + 0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f, + 0.0014205091f, 0.0007963963f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 526244, 934286, 1656482, 2929383, 5154009, 7200895, - 10000863, 13755239, 18618438, 24545894, 28863348, 33106848, 36783144, - 39317176, 40225672, 39317176, 36783140, 33106852, 28863350, 24545894, - 18618438, 13755239, 10000861, 7200896, 5154009, 2929384, 1656483, - 934287, 526244, 3}, - {5, 814783, 1446784, 2565855, 4539774, 7994119, 11177507, - 15539745, 21402348, 29018418, 38333064, 45138568, 51843732, 57665092, - 61684144, 63126300, 61684144, 57665092, 51843740, 45138568, 38333064, - 29018418, 21402346, 15539743, 11177508, 7994120, 4539775, 2565855, - 1446784, 814783, 5}, - {7, 1204981, 2140499, 3798824, 6729584, 11875611, 16637170, - 23191438, 32052658, 43652108, 57969132, 68517104, 78979352, 88117000, - 94454304, 96733920, 94454304, 88116992, 78979352, 68517104, 57969132, - 43652104, 32052654, 23191436, 16637170, 11875611, 6729584, 3798824, - 2140499, 1204981, 7}, - {8, 1402655, 2492611, 4426772, 7851491, 13884761, - 19489746, 27240036, 37782176, 51691532, 69027848, 81916832, - 94796824, 106122752, 114019032, 116867632, 114019032, 106122744, - 94796832, 81916840, 69027848, 51691532, 37782172, 27240034, - 19489748, 13884760, 7851492, 4426772, 2492611, 1402655, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1221406, 2174004, 3871976, 6902451, 12317130, - 17436482, 24661340, 34772520, 48643564, 66845116, 81092456, - 95994376, 109691784, 119593840, 123240696, 119593848, 109691776, - 95994392, 81092456, 66845116, 48643564, 34772520, 24661336, - 17436482, 12317130, 6902452, 3871976, 2174004, 1221406, - 7}, - {1, 213393, 380079, 677757, 1210858, 2169302, 3082668, - 4384052, 6230857, 8816279, 12308982, 15131108, 18175564, 21641460, - 24357568, 25401718, 24357570, 21641458, 18175566, 15131109, 12308983, - 8816278, 6230857, 4384051, 3082668, 2169302, 1210858, 677757, - 380079, 213393, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f, + 0.0109128021f, 0.0192001797f, 0.0268254243f, 0.0372561179f, + 0.0512422584f, 0.0693590865f, 0.0914405808f, 0.1075243503f, + 0.1233326197f, 0.1370278895f, 0.1464678943f, 0.1498523057f, + 0.1464678943f, 0.1370278746f, 0.1233326346f, 0.1075243577f, + 0.0914405808f, 0.0693590865f, 0.0512422584f, 0.0372561105f, + 0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f, + 0.0034804903f, 0.0019604117f, 0.0000000112f}, + {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f, + 0.0169119760f, 0.0297804140f, 0.0416394584f, 0.0578900613f, + 0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542695f, + 0.1931329519f, 0.2148192078f, 0.2297913432f, 0.2351637930f, + 0.2297913432f, 0.2148192078f, 0.1931329817f, 0.1681542695f, + 0.1428017914f, 0.1081020311f, 0.0797299519f, 0.0578900538f, + 0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f, + 0.0053896904f, 0.0030353032f, 0.0000000186f}, + {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f, + 0.0250696540f, 0.0442400984f, 0.0619782880f, 0.0863948390f, + 0.1194054559f, 0.1626167744f, 0.2159518450f, 0.2552461028f, + 0.2942210138f, 0.3282614052f, 0.3518697023f, 0.3603619337f, + 0.3518697023f, 0.3282613754f, 0.2942210138f, 0.2552461028f, + 0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f, + 0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f, + 0.0079739802f, 0.0044889040f, 0.0000000261f}, + {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f, + 0.0292490833f, 0.0517247654f, 0.0726049617f, 0.1014770418f, + 0.1407495737f, 0.1925659627f, 0.2571487725f, 0.3051639795f, + 0.3531456888f, 0.3953380585f, 0.4247539937f, 0.4353658557f, + 0.4247539937f, 0.3953380287f, 0.3531457186f, 0.3051640093f, + 0.2571487725f, 0.1925659627f, 0.1407495588f, 0.1014770344f, + 0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f, + 0.0092856996f, 0.0052252971f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f, + 0.0257136337f, 0.0458848849f, 0.0649559572f, 0.0918706506f, + 0.1295377314f, 0.1812113971f, 0.2490174621f, 0.3020929396f, + 0.3576069176f, 0.4086337388f, 0.4455217719f, 0.4591073692f, + 0.4455218017f, 0.4086337090f, 0.3576069772f, 0.3020929396f, + 0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f, + 0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f, + 0.0080987960f, 0.0045500919f, 0.0000000261f}, + {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f, + 0.0045107976f, 0.0080812797f, 0.0114838332f, 0.0163318664f, + 0.0232117511f, 0.0328431986f, 0.0458545312f, 0.0563677698f, + 0.0677092522f, 0.0806207210f, 0.0907390118f, 0.0946287736f, + 0.0907390192f, 0.0806207135f, 0.0677092597f, 0.0563677736f, + 0.0458545350f, 0.0328431949f, 0.0232117511f, 0.0163318627f, + 0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f, + 0.0014159046f, 0.0007949509f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 527304, 937630, 1667008, 2962381, 5256587, 7401904, - 10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920, - 45670152, 46886204, 45670152, 42318924, 37562308, 32224264, 26957670, - 19991098, 14497757, 10390626, 7401904, 5256587, 2962381, 1667008, - 937630, 527304, 3}, - {5, 816257, 1451433, 2580496, 4585709, 8137095, 11458003, - 16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872, - 70696504, 72578936, 70696512, 65508868, 58145724, 49882536, 41729952, - 30945832, 22442248, 16084488, 11458004, 8137095, 4585709, 2580496, - 1451434, 816257, 5}, - {7, 1206538, 2145415, 3814322, 6778296, 12027725, - 16936476, 23775046, 33172672, 45742120, 61682500, 73733120, - 85947224, 96830952, 104498976, 107281456, 104498984, 96830952, - 85947232, 73733128, 61682504, 45742116, 33172670, 23775044, - 16936476, 12027724, 6778297, 3814322, 2145415, 1206538, - 7}, - {8, 1403765, 2496115, 4437830, 7886310, 13993836, - 19704996, 27661434, 38595240, 53219352, 71765424, 85785904, - 99996584, 112659424, 121580896, 124818216, 121580904, 112659416, - 99996592, 85785904, 71765432, 53219352, 38595240, 27661430, - 19704998, 13993836, 7886311, 4437830, 2496115, 1403764, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1219857, 2169099, 3856430, 6853125, 12160503, - 17123444, 24037508, 33538878, 46247084, 62363436, 74547088, - 86896032, 97899912, 105652584, 108465784, 105652592, 97899904, - 86896032, 74547096, 62363440, 46247084, 33538876, 24037506, - 17123446, 12160503, 6853125, 3856430, 2169099, 1219857, - 7}, - {1, 212938, 378637, 673176, 1196278, 2122731, 2989060, - 4195976, 5854530, 8072868, 10886130, 13012902, 15168527, 17089358, - 18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130, - 8072867, 5854530, 4195975, 2989060, 2122731, 1196278, 673176, - 378637, 212938, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f, + 0.0110357292f, 0.0195823126f, 0.0275742412f, 0.0387081020f, + 0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f, + 0.1399304867f, 0.1576502621f, 0.1701345742f, 0.1746647209f, + 0.1701345742f, 0.1576502770f, 0.1399305016f, 0.1200447381f, + 0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f, + 0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f, + 0.0034929439f, 0.0019643605f, 0.0000000112f}, + {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f, + 0.0170830972f, 0.0303130411f, 0.0426843874f, 0.0599193908f, + 0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f, + 0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703776062f, + 0.2633650303f, 0.2440395504f, 0.2166097015f, 0.1858269274f, + 0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f, + 0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f, + 0.0054070130f, 0.0030407943f, 0.0000000186f}, + {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f, + 0.0252511203f, 0.0448067673f, 0.0630932897f, 0.0885689482f, + 0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f, + 0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f, + 0.3892890513f, 0.3607234061f, 0.3201783895f, 0.2746773064f, + 0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f, + 0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f, + 0.0079922937f, 0.0044947043f, 0.0000000261f}, + {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f, + 0.0293787941f, 0.0521311015f, 0.0734068304f, 0.1030468717f, + 0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f, + 0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f, + 0.4529241621f, 0.4196890295f, 0.3725163341f, 0.3195773959f, + 0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f, + 0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f, + 0.0092987530f, 0.0052294284f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f, + 0.0255298801f, 0.0453014039f, 0.0637897998f, 0.0895466954f, + 0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f, + 0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f, + 0.3935865760f, 0.3647055626f, 0.3237129450f, 0.2777095735f, + 0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f, + 0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f, + 0.0080805235f, 0.0045443214f, 0.0000000261f}, + {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f, + 0.0044564828f, 0.0079077892f, 0.0111351162f, 0.0156312287f, + 0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f, + 0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f, + 0.0687042698f, 0.0636628196f, 0.0565071702f, 0.0484768413f, + 0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f, + 0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f, + 0.0014105327f, 0.0007932559f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 528371, 941010, 1677737, 2996520, 5365544, 7620743, - 10829829, 15375154, 21720308, 30256412, 37121464, 44492716, 52140904, - 58486168, 60914048, 58486172, 52140900, 44492720, 37121464, 30256412, - 21720308, 15375154, 10829827, 7620744, 5365544, 2996520, 1677737, - 941010, 528371, 3}, - {5, 817738, 1456128, 2595392, 4633066, 8288027, 11760734, - 16690856, 23650124, 33316570, 46226512, 56525852, 67496896, 77774760, - 85824632, 89194720, 85824640, 77774752, 67496904, 56525856, 46226512, - 33316570, 23650120, 16690854, 11760735, 8288027, 4633066, 2595392, - 1456128, 817738, 5}, - {7, 1208101, 2150365, 3830012, 6828082, 12185838, - 17252538, 24405052, 34418948, 48164280, 66215072, 80356216, - 95158664, 108775560, 118626184, 122255560, 118626184, 108775544, - 95158664, 80356216, 66215080, 48164276, 34418944, 24405050, - 17252540, 12185838, 6828083, 3830012, 2150365, 1208101, - 7}, - {8, 1404877, 2499634, 4448971, 7921597, 14105523, - 19927540, 28103010, 39463168, 54891176, 74856880, 90260672, - 106158016, 120574816, 130879072, 134648960, 130879072, 120574816, - 106158024, 90260672, 74856888, 54891176, 39463164, 28103008, - 19927542, 14105523, 7921598, 4448971, 2499634, 1404876, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1218314, 2164227, 3841070, 6804841, 12009704, 16826680, - 23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016, - 95670824, 97983664, 95670824, 89242016, 79974736, 69367448, 58677072, - 44173140, 32427856, 23458742, 16826682, 12009704, 6804841, 3841070, - 2164227, 1218314, 7}, - {1, 212485, 377211, 668688, 1182212, 2079037, 2903492, - 4030197, 5539070, 7490515, 9864627, 11591052, 13285722, 14752220, - 15762207, 16124145, 15762208, 14752220, 13285722, 11591053, 9864628, - 7490515, 5539070, 4030197, 2903492, 2079037, 1182212, 668688, - 377210, 212485, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f, + 0.0111629069f, 0.0199882090f, 0.0283894800f, 0.0403442569f, + 0.0572769120f, 0.0809144527f, 0.1127139181f, 0.1382882297f, + 0.1657482833f, 0.1942400038f, 0.2178779542f, 0.2269225121f, + 0.2178779691f, 0.1942399889f, 0.1657482982f, 0.1382882297f, + 0.1127139181f, 0.0809144527f, 0.0572769120f, 0.0403442495f, + 0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f, + 0.0035055354f, 0.0019683354f, 0.0000000112f}, + {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f, + 0.0172595158f, 0.0308753066f, 0.0438121483f, 0.0621782839f, + 0.0881035775f, 0.1241138950f, 0.1722071767f, 0.2105752081f, + 0.2514455318f, 0.2897335589f, 0.3197216690f, 0.3322762251f, + 0.3197216988f, 0.2897335291f, 0.2514455616f, 0.2105752230f, + 0.1722071767f, 0.1241138950f, 0.0881035626f, 0.0621782765f, + 0.0438121520f, 0.0308753066f, 0.0172595158f, 0.0096685886f, + 0.0054244995f, 0.0030463114f, 0.0000000186f}, + {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f, + 0.0254365876f, 0.0453957841f, 0.0642707124f, 0.0909159034f, + 0.1282205731f, 0.1794259250f, 0.2466703653f, 0.2993502319f, + 0.3544936478f, 0.4052205384f, 0.4419169724f, 0.4554374516f, + 0.4419169724f, 0.4052204788f, 0.3544936478f, 0.2993502319f, + 0.2466703951f, 0.1794259101f, 0.1282205582f, 0.0909158960f, + 0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f, + 0.0080107339f, 0.0045005269f, 0.0000000261f}, + {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f, + 0.0295102485f, 0.0525471680f, 0.0742358714f, 0.1046918705f, + 0.1470117569f, 0.2044855654f, 0.2788636088f, 0.3362472057f, + 0.3954694271f, 0.4491761923f, 0.4875625372f, 0.5016064644f, + 0.4875625372f, 0.4491761923f, 0.3954694569f, 0.3362472057f, + 0.2788636386f, 0.2044855654f, 0.1470117420f, 0.1046918631f, + 0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f, + 0.0093118623f, 0.0052335709f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f, + 0.0253500082f, 0.0447396338f, 0.0626842678f, 0.0873906389f, + 0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f, + 0.2979290783f, 0.3324524164f, 0.3564015925f, 0.3650175929f, + 0.3564015925f, 0.3324524164f, 0.2979291081f, 0.2584138811f, + 0.2185891271f, 0.1645577699f, 0.1208031774f, 0.0873906240f, + 0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f, + 0.0080623738f, 0.0045385733f, 0.0000000261f}, + {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f, + 0.0044040829f, 0.0077450164f, 0.0108163506f, 0.0150136538f, + 0.0206346437f, 0.0279043429f, 0.0367485993f, 0.0431800336f, + 0.0494931713f, 0.0549563020f, 0.0587187968f, 0.0600671209f, + 0.0587188005f, 0.0549563020f, 0.0494931713f, 0.0431800373f, + 0.0367486030f, 0.0279043429f, 0.0206346437f, 0.0150136538f, + 0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f, + 0.0014052168f, 0.0007915683f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 529280, 943904, 1686997, 3026404, 5463419, - 7822298, 11249275, 16258557, 23600720, 36288716, 49305868, - 66713524, 87729680, 107320208, 115788648, 107320216, 87729672, - 66713540, 49305872, 36288720, 23600720, 16258558, 11249274, - 7822299, 5463419, 3026404, 1686997, 943904, 529280, - 3}, - {5, 819001, 1460144, 2608223, 4674384, 8422779, - 12037082, 17262416, 24842774, 35819472, 52848540, 70312664, - 92562776, 117871664, 140063104, 149267152, 140063136, 117871648, - 92562792, 70312664, 52848544, 35819468, 24842772, 17262414, - 12037082, 8422779, 4674385, 2608223, 1460144, 819001, - 5}, - {7, 1209431, 2154588, 3843465, 6871159, 12324878, - 17534810, 24980280, 35593252, 50549888, 70956104, 87630984, - 108587520, 130892864, 148578016, 155457280, 148578016, 130892848, - 108587528, 87630992, 70956112, 50549884, 35593252, 24980278, - 17534812, 12324878, 6871160, 3843465, 2154588, 1209431, - 7}, - {8, 1405821, 2502628, 4458482, 7951885, 14202332, - 20122228, 28494402, 40246696, 56439064, 77816136, 94657800, - 112381552, 128775696, 140691712, 145094384, 140691728, 128775688, - 112381568, 94657808, 77816144, 56439060, 40246696, 28494400, - 20122230, 14202331, 7951885, 4458482, 2502629, 1405821, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1217010, 2160122, 3828190, 6764697, 11886164, 16586827, - 22999516, 31567738, 42617632, 56016164, 65730784, 75244880, 83461560, - 89112016, 91135304, 89112024, 83461552, 75244888, 65730788, 56016164, - 42617628, 31567738, 22999514, 16586829, 11886164, 6764698, 3828190, - 2160122, 1217010, 7}, - {1, 212104, 376014, 664952, 1170669, 2044035, 2836433, - 3904056, 5308151, 7084523, 9192281, 10692476, 12141331, 13377854, - 14220870, 14521357, 14220870, 13377854, 12141331, 10692476, 9192281, - 7084523, 5308151, 3904056, 2836433, 2044035, 1170669, 664952, - 376014, 212104, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f, + 0.0112742335f, 0.0203528218f, 0.0291403309f, 0.0419068150f, + 0.0605678447f, 0.0879195333f, 0.1351860017f, 0.1836786717f, + 0.2485272437f, 0.3268185258f, 0.3997989297f, 0.4313463271f, + 0.3997989595f, 0.3268184960f, 0.2485273033f, 0.1836786866f, + 0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f, + 0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f, + 0.0035163164f, 0.0019717216f, 0.0000000112f}, + {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f, + 0.0174134374f, 0.0313772969f, 0.0448416248f, 0.0643075109f, + 0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619350851f, + 0.3448232114f, 0.4391061664f, 0.5217757225f, 0.5560634732f, + 0.5217758417f, 0.4391061068f, 0.3448232710f, 0.2619350851f, + 0.1968761683f, 0.1334379166f, 0.0925465375f, 0.0643075034f, + 0.0448416248f, 0.0313772969f, 0.0174134411f, 0.0097163878f, + 0.0054394603f, 0.0030510165f, 0.0000000186f}, + {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f, + 0.0255970620f, 0.0459137484f, 0.0653222576f, 0.0930587947f, + 0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f, + 0.4045200348f, 0.4876139164f, 0.5534962416f, 0.5791234970f, + 0.5534962416f, 0.4876138568f, 0.4045200646f, 0.3264508843f, + 0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f, + 0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f, + 0.0080264658f, 0.0045054816f, 0.0000000261f}, + {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f, + 0.0296230800f, 0.0529078096f, 0.0749611408f, 0.1061499193f, + 0.1499306262f, 0.2102518976f, 0.2898876965f, 0.3526277840f, + 0.4186539054f, 0.4797268510f, 0.5241174698f, 0.5405187011f, + 0.5241175294f, 0.4797268212f, 0.4186539650f, 0.3526278138f, + 0.2898877263f, 0.2102518827f, 0.1499306262f, 0.1061499119f, + 0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f, + 0.0093230195f, 0.0052370913f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f, + 0.0252004601f, 0.0442794114f, 0.0617907457f, 0.0856798738f, + 0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662519f, + 0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f, + 0.3319681585f, 0.3109185100f, 0.2803090513f, 0.2448662668f, + 0.2086764723f, 0.1587630361f, 0.1175989881f, 0.0856798664f, + 0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f, + 0.0080470815f, 0.0045337155f, 0.0000000261f}, + {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f, + 0.0043610819f, 0.0076146238f, 0.0105665363f, 0.0145437419f, + 0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f, + 0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962704f, + 0.0529768690f, 0.0498363897f, 0.0452299826f, 0.0398325771f, + 0.0342439152f, 0.0263919048f, 0.0197744034f, 0.0145437419f, + 0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f, + 0.0014007613f, 0.0007901490f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 529890, 945853, 1693270, 3046878, 5531883, - 7966241, 11558316, 16941404, 26405616, 44726228, 66299660, - 102135296, 161287136, 242754912, 290875520, 242754976, 161287104, - 102135328, 66299668, 44726228, 26405616, 16941404, 11558314, - 7966241, 5531883, 3046878, 1693270, 945853, 529890, - 3}, - {5, 819848, 1462845, 2616904, 4702616, 8516569, - 12232970, 17678754, 25748164, 38567944, 62864780, 89227176, - 128392144, 182850000, 242436080, 271403040, 242436160, 182849968, - 128392176, 89227168, 62864788, 38567940, 25748164, 17678752, - 12232972, 8516569, 4702617, 2616904, 1462845, 819848, - 5}, - {7, 1210322, 2157425, 3852534, 6900401, 12420479, - 17731328, 25388104, 36448364, 52356736, 75502992, 99354648, - 128997304, 161739680, 189630656, 200981856, 189630656, 161739664, - 128997328, 99354648, 75503000, 52356740, 36448368, 25388100, - 17731330, 12420478, 6900402, 3852534, 2157425, 1210322, - 7}, - {8, 1406453, 2504636, 4464871, 7972318, 14268137, - 20255542, 28765222, 40797016, 57549412, 80000928, 97981248, - 117206704, 135388800, 151411120, 157516432, 151411136, 135388784, - 117206704, 97981248, 80000928, 57549412, 40797012, 28765220, - 20255542, 14268138, 7972319, 4464871, 2504636, 1406453, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1216142, 2157392, 3819657, 6738267, 11805711, 16432165, - 22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616, - 85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544, - 41665420, 31029756, 22707284, 16432167, 11805712, 6738268, 3819657, - 2157392, 1216142, 7}, - {1, 211851, 375221, 662491, 1163142, 2021609, 2794131, - 3826087, 5169036, 6847367, 8812784, 10196808, 11523252, 12648227, - 13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784, - 6847366, 5169036, 3826086, 2794132, 2021609, 1163142, 662491, - 375221, 211851, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f, + 0.0113505051f, 0.0206078701f, 0.0296765603f, 0.0430580825f, + 0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f, + 0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f, + 0.9043327570f, 0.6008412838f, 0.3804837465f, 0.2469855100f, + 0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f, + 0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f, + 0.0035235770f, 0.0019739941f, 0.0000000112f}, + {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f, + 0.0175186098f, 0.0317266919f, 0.0455713645f, 0.0658584908f, + 0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f, + 0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f, + 0.9031450748f, 0.6811692119f, 0.4782981277f, 0.3323971033f, + 0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f, + 0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f, + 0.0054495223f, 0.0030541718f, 0.0000000186f}, + {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f, + 0.0257059969f, 0.0462698899f, 0.0660543442f, 0.0945780575f, + 0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f, + 0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f, + 0.7064292431f, 0.6025272012f, 0.4805524945f, 0.3701249063f, + 0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f, + 0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f, + 0.0080370344f, 0.0045088008f, 0.0000000261f}, + {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f, + 0.0296991989f, 0.0531529523f, 0.0754577741f, 0.1071588024f, + 0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f, + 0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f, + 0.5640504360f, 0.5043625236f, 0.4366289973f, 0.3650085926f, + 0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f, + 0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f, + 0.0093304962f, 0.0052394457f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f, + 0.0251020007f, 0.0439797007f, 0.0612145849f, 0.0845912322f, + 0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f, + 0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f, + 0.3181905448f, 0.2986625135f, 0.2701408565f, 0.2369178981f, + 0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f, + 0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f, + 0.0080369115f, 0.0045304820f, 0.0000000261f}, + {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f, + 0.0043330416f, 0.0075310804f, 0.0104089491f, 0.0142532848f, + 0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f, + 0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f, + 0.0499628671f, 0.0471183136f, 0.0429274626f, 0.0379860736f, + 0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f, + 0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f, + 0.0013978072f, 0.0007892065f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -858993460, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 530105, 946540, 1695490, 3054166, 5556542, - 8018704, 11673036, 17202416, 27742908, 48702648, 75428704, - 125542128, 228590144, 435938784, 620187584, 435939008, 228590112, - 125542176, 75428712, 48702652, 27742906, 17202416, 11673035, - 8018704, 5556542, 3054167, 1695490, 946540, 530105, - 3}, - {5, 820146, 1463798, 2619972, 4712652, 8550255, - 12304061, 17832260, 26090394, 40209740, 67346928, 98535008, - 148589136, 226742368, 326144352, 380823904, 326144512, 226742336, - 148589184, 98535016, 67346936, 40209736, 26090392, 17832256, - 12304062, 8550254, 4712652, 2619972, 1463798, 820145, - 5}, - {7, 1210636, 2158423, 3855734, 6910758, 12454582, - 17801918, 25536124, 36763592, 53038744, 78536976, 104675848, - 138113008, 176331952, 210006528, 224018288, 210006544, 176331920, - 138113024, 104675856, 78536984, 53038744, 36763592, 25536118, - 17801920, 12454581, 6910759, 3855734, 2158423, 1210636, - 7}, - {8, 1406676, 2505341, 4467122, 7979530, 14291465, - 20302986, 28862170, 40995684, 57955156, 80812936, 99234096, - 119054544, 140506896, 157841056, 164487296, 157841072, 140506896, - 119054552, 99234096, 80812936, 57955148, 40995680, 28862168, - 20302988, 14291464, 7979531, 4467122, 2505342, 1406676, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1215837, 2156436, 3816673, 6729059, 11777845, 16378872, - 22607278, 30847268, 41345884, 53900940, 62895796, 71625096, 79105408, - 84220136, 86046016, 84220136, 79105408, 71625096, 62895796, 53900940, - 41345884, 30847270, 22607276, 16378873, 11777844, 6729060, 3816673, - 2156436, 1215837, 7}, - {1, 211762, 374943, 661633, 1160533, 2013907, 2779720, - 3799796, 5122719, 6769570, 8690265, 10038436, 11327602, 12418982, - 13158826, 13421767, 13158826, 12418981, 11327602, 10038436, 8690264, - 6769570, 5122719, 3799796, 2779720, 2013907, 1160533, 661633, - 374943, 211762, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, -3.2000000477f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019747950f, 0.0035261363f, 0.0063161924f, + 0.0113776550f, 0.0206997320f, 0.0298720002f, 0.0434854478f, + 0.0640839934f, 0.1033503860f, 0.1814315021f, 0.2809938192f, + 0.4676808715f, 0.8515646458f, 1.6239985228f, 2.3103787899f, + 1.6239993572f, 0.8515645266f, 0.4676810503f, 0.2809938490f, + 0.1814315170f, 0.1033503786f, 0.0640839934f, 0.0434854440f, + 0.0298720002f, 0.0206997320f, 0.0113776587f, 0.0063161924f, + 0.0035261363f, 0.0019747950f, 0.0000000112f}, + {0.0000000186f, 0.0030552819f, 0.0054530725f, 0.0097601563f, + 0.0175559968f, 0.0318521820f, 0.0458361991f, 0.0664303452f, + 0.0971942917f, 0.1497929543f, 0.2508868575f, 0.3670715094f, + 0.5535376668f, 0.8446811438f, 1.2149823904f, 1.4186795950f, + 1.2149829865f, 0.8446810246f, 0.5535378456f, 0.3670715392f, + 0.2508868873f, 0.1497929394f, 0.0971942842f, 0.0664303303f, + 0.0458362028f, 0.0318521783f, 0.0175559968f, 0.0097601563f, + 0.0054530725f, 0.0030552782f, 0.0000000186f}, + {0.0000000261f, 0.0045099705f, 0.0080407523f, 0.0143637285f, + 0.0257445797f, 0.0463969335f, 0.0663173124f, 0.0951294750f, + 0.1369550526f, 0.1975847185f, 0.2925730348f, 0.3899479210f, + 0.5145110488f, 0.6568877101f, 0.7823352814f, 0.8345331550f, + 0.7823353410f, 0.6568875909f, 0.5145111084f, 0.3899479508f, + 0.2925730646f, 0.1975847185f, 0.1369550526f, 0.0951294526f, + 0.0663173199f, 0.0463969298f, 0.0257445835f, 0.0143637285f, + 0.0080407523f, 0.0045099705f, 0.0000000261f}, + {0.0000000298f, 0.0052402765f, 0.0093331225f, 0.0166413262f, + 0.0297260657f, 0.0532398559f, 0.0756345168f, 0.1075199619f, + 0.1527208239f, 0.2158997804f, 0.3010516465f, 0.3696758151f, + 0.4435127378f, 0.5234289765f, 0.5880037546f, 0.6127629280f, + 0.5880038142f, 0.5234289765f, 0.4435127676f, 0.3696758151f, + 0.3010516465f, 0.2158997506f, 0.1527208090f, 0.1075199544f, + 0.0756345242f, 0.0532398522f, 0.0297260694f, 0.0166413262f, + 0.0093331262f, 0.0052402765f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045293458f, 0.0080333501f, 0.0142182149f, + 0.0250676982f, 0.0438758917f, 0.0610160530f, 0.0842186734f, + 0.1149150282f, 0.1540254205f, 0.2007966489f, 0.2343050987f, + 0.2668242753f, 0.2946906090f, 0.3137444556f, 0.3205463886f, + 0.3137444556f, 0.2946906090f, 0.2668242753f, 0.2343050987f, + 0.2007966489f, 0.1540254205f, 0.1149150357f, 0.0842186660f, + 0.0610160567f, 0.0438758880f, 0.0250677019f, 0.0142182149f, + 0.0080333501f, 0.0045293458f, 0.0000000261f}, + {0.0000000037f, 0.0007888749f, 0.0013967715f, 0.0024647750f, + 0.0043233223f, 0.0075023882f, 0.0103552639f, 0.0141553432f, + 0.0190836154f, 0.0252186134f, 0.0323737599f, 0.0373960882f, + 0.0421986058f, 0.0462643132f, 0.0490204468f, 0.0499999784f, + 0.0490204468f, 0.0462643094f, 0.0421986058f, 0.0373960882f, + 0.0323737562f, 0.0252186134f, 0.0190836154f, 0.0141553432f, + 0.0103552639f, 0.0075023882f, 0.0043233223f, 0.0024647750f, + 0.0013967715f, 0.0007888749f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 529890, 945853, 1693270, 3046878, 5531883, - 7966241, 11558316, 16941404, 26405616, 44726228, 66299660, - 102135296, 161287136, 242754912, 290875520, 242754976, 161287104, - 102135328, 66299668, 44726228, 26405616, 16941404, 11558314, - 7966241, 5531883, 3046878, 1693270, 945853, 529890, - 3}, - {5, 819848, 1462845, 2616904, 4702616, 8516569, - 12232970, 17678754, 25748164, 38567944, 62864780, 89227176, - 128392144, 182850000, 242436080, 271403040, 242436160, 182849968, - 128392176, 89227168, 62864788, 38567940, 25748164, 17678752, - 12232972, 8516569, 4702617, 2616904, 1462845, 819848, - 5}, - {7, 1210322, 2157425, 3852534, 6900401, 12420479, - 17731328, 25388104, 36448364, 52356736, 75502992, 99354648, - 128997304, 161739680, 189630656, 200981856, 189630656, 161739664, - 128997328, 99354648, 75503000, 52356740, 36448368, 25388100, - 17731330, 12420478, 6900402, 3852534, 2157425, 1210322, - 7}, - {8, 1406453, 2504636, 4464871, 7972318, 14268137, - 20255542, 28765222, 40797016, 57549412, 80000928, 97981248, - 117206704, 135388800, 151411120, 157516432, 151411136, 135388784, - 117206704, 97981248, 80000928, 57549412, 40797012, 28765220, - 20255542, 14268138, 7972319, 4464871, 2504636, 1406453, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1216142, 2157392, 3819657, 6738267, 11805711, 16432165, - 22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616, - 85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544, - 41665420, 31029756, 22707284, 16432167, 11805712, 6738268, 3819657, - 2157392, 1216142, 7}, - {1, 211851, 375221, 662491, 1163142, 2021609, 2794131, - 3826087, 5169036, 6847367, 8812784, 10196808, 11523252, 12648227, - 13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784, - 6847366, 5169036, 3826086, 2794132, 2021609, 1163142, 662491, - 375221, 211851, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f, + 0.0113505051f, 0.0206078701f, 0.0296765603f, 0.0430580825f, + 0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f, + 0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f, + 0.9043327570f, 0.6008412838f, 0.3804837465f, 0.2469855100f, + 0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f, + 0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f, + 0.0035235770f, 0.0019739941f, 0.0000000112f}, + {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f, + 0.0175186098f, 0.0317266919f, 0.0455713645f, 0.0658584908f, + 0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f, + 0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f, + 0.9031450748f, 0.6811692119f, 0.4782981277f, 0.3323971033f, + 0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f, + 0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f, + 0.0054495223f, 0.0030541718f, 0.0000000186f}, + {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f, + 0.0257059969f, 0.0462698899f, 0.0660543442f, 0.0945780575f, + 0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f, + 0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f, + 0.7064292431f, 0.6025272012f, 0.4805524945f, 0.3701249063f, + 0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f, + 0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f, + 0.0080370344f, 0.0045088008f, 0.0000000261f}, + {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f, + 0.0296991989f, 0.0531529523f, 0.0754577741f, 0.1071588024f, + 0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f, + 0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f, + 0.5640504360f, 0.5043625236f, 0.4366289973f, 0.3650085926f, + 0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f, + 0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f, + 0.0093304962f, 0.0052394457f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f, + 0.0251020007f, 0.0439797007f, 0.0612145849f, 0.0845912322f, + 0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f, + 0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f, + 0.3181905448f, 0.2986625135f, 0.2701408565f, 0.2369178981f, + 0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f, + 0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f, + 0.0080369115f, 0.0045304820f, 0.0000000261f}, + {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f, + 0.0043330416f, 0.0075310804f, 0.0104089491f, 0.0142532848f, + 0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f, + 0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f, + 0.0499628671f, 0.0471183136f, 0.0429274626f, 0.0379860736f, + 0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f, + 0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f, + 0.0013978072f, 0.0007892065f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 529280, 943904, 1686997, 3026404, 5463419, - 7822298, 11249275, 16258558, 23600720, 36288720, 49305868, - 66713532, 87729688, 107320216, 115788672, 107320232, 87729680, - 66713548, 49305876, 36288720, 23600720, 16258558, 11249274, - 7822299, 5463419, 3026404, 1686997, 943904, 529280, - 3}, - {5, 819001, 1460144, 2608223, 4674384, 8422779, - 12037082, 17262416, 24842774, 35819472, 52848540, 70312672, - 92562784, 117871672, 140063120, 149267168, 140063152, 117871656, - 92562800, 70312664, 52848548, 35819468, 24842772, 17262414, - 12037084, 8422779, 4674385, 2608223, 1460144, 819001, - 5}, - {7, 1209431, 2154588, 3843465, 6871159, 12324878, - 17534810, 24980280, 35593252, 50549888, 70956104, 87630984, - 108587528, 130892872, 148578032, 155457296, 148578032, 130892856, - 108587536, 87630992, 70956112, 50549884, 35593252, 24980278, - 17534812, 12324878, 6871160, 3843465, 2154588, 1209431, - 7}, - {8, 1405821, 2502628, 4458482, 7951885, 14202332, - 20122228, 28494402, 40246696, 56439064, 77816144, 94657800, - 112381560, 128775712, 140691712, 145094384, 140691728, 128775696, - 112381568, 94657808, 77816144, 56439064, 40246696, 28494400, - 20122230, 14202331, 7951885, 4458482, 2502629, 1405821, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1217010, 2160122, 3828190, 6764697, 11886164, 16586827, - 22999514, 31567738, 42617632, 56016164, 65730788, 75244880, 83461560, - 89112016, 91135304, 89112024, 83461552, 75244880, 65730788, 56016160, - 42617628, 31567738, 22999514, 16586829, 11886164, 6764698, 3828190, - 2160122, 1217010, 7}, - {1, 212104, 376014, 664952, 1170669, 2044035, 2836433, - 3904056, 5308151, 7084523, 9192281, 10692476, 12141331, 13377854, - 14220870, 14521356, 14220870, 13377854, 12141332, 10692476, 9192281, - 7084522, 5308151, 3904056, 2836433, 2044035, 1170669, 664952, - 376014, 212104, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f, + 0.0112742335f, 0.0203528218f, 0.0291403309f, 0.0419068150f, + 0.0605678484f, 0.0879195333f, 0.1351860166f, 0.1836786717f, + 0.2485272735f, 0.3268185556f, 0.3997989595f, 0.4313464165f, + 0.3997990191f, 0.3268185258f, 0.2485273331f, 0.1836787015f, + 0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f, + 0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f, + 0.0035163164f, 0.0019717216f, 0.0000000112f}, + {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f, + 0.0174134374f, 0.0313772969f, 0.0448416248f, 0.0643075109f, + 0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619351149f, + 0.3448232412f, 0.4391061962f, 0.5217757821f, 0.5560635328f, + 0.5217759013f, 0.4391061366f, 0.3448233008f, 0.2619350851f, + 0.1968761832f, 0.1334379166f, 0.0925465375f, 0.0643075034f, + 0.0448416322f, 0.0313772969f, 0.0174134411f, 0.0097163878f, + 0.0054394603f, 0.0030510165f, 0.0000000186f}, + {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f, + 0.0255970620f, 0.0459137484f, 0.0653222576f, 0.0930587947f, + 0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f, + 0.4045200646f, 0.4876139462f, 0.5534963012f, 0.5791235566f, + 0.5534963012f, 0.4876138866f, 0.4045200944f, 0.3264508843f, + 0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f, + 0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f, + 0.0080264658f, 0.0045054816f, 0.0000000261f}, + {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f, + 0.0296230800f, 0.0529078096f, 0.0749611408f, 0.1061499193f, + 0.1499306262f, 0.2102518976f, 0.2898877263f, 0.3526277840f, + 0.4186539352f, 0.4797269106f, 0.5241174698f, 0.5405187011f, + 0.5241175294f, 0.4797268510f, 0.4186539650f, 0.3526278138f, + 0.2898877263f, 0.2102518976f, 0.1499306262f, 0.1061499119f, + 0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f, + 0.0093230195f, 0.0052370913f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f, + 0.0252004601f, 0.0442794114f, 0.0617907457f, 0.0856798664f, + 0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662668f, + 0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f, + 0.3319681585f, 0.3109185100f, 0.2803090215f, 0.2448662668f, + 0.2086764574f, 0.1587630361f, 0.1175989881f, 0.0856798664f, + 0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f, + 0.0080470815f, 0.0045337155f, 0.0000000261f}, + {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f, + 0.0043610819f, 0.0076146238f, 0.0105665363f, 0.0145437419f, + 0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f, + 0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962666f, + 0.0529768690f, 0.0498363897f, 0.0452299863f, 0.0398325771f, + 0.0342439152f, 0.0263919011f, 0.0197744034f, 0.0145437419f, + 0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f, + 0.0014007613f, 0.0007901490f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 528371, 941010, 1677737, 2996520, 5365544, 7620743, - 10829829, 15375155, 21720310, 30256414, 37121464, 44492724, 52140916, - 58486184, 60914064, 58486188, 52140912, 44492720, 37121464, 30256414, - 21720308, 15375156, 10829827, 7620744, 5365544, 2996520, 1677737, - 941010, 528371, 3}, - {5, 817738, 1456128, 2595392, 4633066, 8288027, 11760734, - 16690856, 23650122, 33316574, 46226512, 56525852, 67496904, 77774760, - 85824656, 89194744, 85824656, 77774760, 67496904, 56525852, 46226516, - 33316574, 23650120, 16690854, 11760735, 8288027, 4633067, 2595392, - 1456128, 817738, 5}, - {7, 1208101, 2150365, 3830012, 6828082, 12185838, - 17252538, 24405054, 34418948, 48164280, 66215076, 80356216, - 95158664, 108775560, 118626192, 122255568, 118626200, 108775552, - 95158672, 80356216, 66215080, 48164280, 34418948, 24405052, - 17252540, 12185838, 6828083, 3830012, 2150365, 1208101, - 7}, - {8, 1404877, 2499634, 4448971, 7921597, 14105523, - 19927540, 28103012, 39463168, 54891176, 74856888, 90260672, - 106158024, 120574824, 130879080, 134648944, 130879088, 120574824, - 106158032, 90260672, 74856888, 54891176, 39463168, 28103008, - 19927542, 14105523, 7921598, 4448971, 2499634, 1404876, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1218314, 2164227, 3841070, 6804840, 12009704, 16826680, - 23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016, - 95670816, 97983664, 95670824, 89242008, 79974736, 69367448, 58677076, - 44173140, 32427856, 23458742, 16826682, 12009704, 6804841, 3841070, - 2164227, 1218314, 7}, - {1, 212485, 377211, 668688, 1182212, 2079037, 2903492, - 4030197, 5539070, 7490515, 9864626, 11591052, 13285722, 14752218, - 15762206, 16124144, 15762206, 14752218, 13285723, 11591053, 9864626, - 7490515, 5539070, 4030197, 2903492, 2079037, 1182212, 668688, - 377210, 212485, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f, + 0.0111629069f, 0.0199882090f, 0.0283894800f, 0.0403442569f, + 0.0572769158f, 0.0809144601f, 0.1127139255f, 0.1382882297f, + 0.1657483131f, 0.1942400485f, 0.2178780138f, 0.2269225717f, + 0.2178780288f, 0.1942400336f, 0.1657482982f, 0.1382882297f, + 0.1127139255f, 0.0809144527f, 0.0572769195f, 0.0403442495f, + 0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f, + 0.0035055354f, 0.0019683354f, 0.0000000112f}, + {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f, + 0.0172595158f, 0.0308753066f, 0.0438121483f, 0.0621782839f, + 0.0881035700f, 0.1241139099f, 0.1722071767f, 0.2105752081f, + 0.2514455616f, 0.2897335589f, 0.3197217584f, 0.3322763145f, + 0.3197217584f, 0.2897335589f, 0.2514455616f, 0.2105752081f, + 0.1722071916f, 0.1241139099f, 0.0881035626f, 0.0621782765f, + 0.0438121520f, 0.0308753066f, 0.0172595195f, 0.0096685886f, + 0.0054244995f, 0.0030463114f, 0.0000000186f}, + {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f, + 0.0254365876f, 0.0453957841f, 0.0642707124f, 0.0909159109f, + 0.1282205731f, 0.1794259250f, 0.2466703802f, 0.2993502319f, + 0.3544936478f, 0.4052205384f, 0.4419170022f, 0.4554374814f, + 0.4419170320f, 0.4052205086f, 0.3544936776f, 0.2993502319f, + 0.2466703951f, 0.1794259250f, 0.1282205731f, 0.0909159034f, + 0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f, + 0.0080107339f, 0.0045005269f, 0.0000000261f}, + {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f, + 0.0295102485f, 0.0525471680f, 0.0742358714f, 0.1046918780f, + 0.1470117569f, 0.2044855654f, 0.2788636386f, 0.3362472057f, + 0.3954694569f, 0.4491762221f, 0.4875625670f, 0.5016064048f, + 0.4875625968f, 0.4491762221f, 0.3954694867f, 0.3362472057f, + 0.2788636386f, 0.2044855654f, 0.1470117569f, 0.1046918631f, + 0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f, + 0.0093118623f, 0.0052335709f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f, + 0.0253500044f, 0.0447396338f, 0.0626842678f, 0.0873906389f, + 0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f, + 0.2979290783f, 0.3324524164f, 0.3564015627f, 0.3650175929f, + 0.3564015925f, 0.3324523866f, 0.2979291081f, 0.2584138811f, + 0.2185891420f, 0.1645577699f, 0.1208031774f, 0.0873906240f, + 0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f, + 0.0080623738f, 0.0045385733f, 0.0000000261f}, + {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f, + 0.0044040829f, 0.0077450164f, 0.0108163506f, 0.0150136538f, + 0.0206346437f, 0.0279043429f, 0.0367485955f, 0.0431800336f, + 0.0494931713f, 0.0549562946f, 0.0587187931f, 0.0600671172f, + 0.0587187931f, 0.0549562946f, 0.0494931750f, 0.0431800373f, + 0.0367485955f, 0.0279043429f, 0.0206346437f, 0.0150136538f, + 0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f, + 0.0014052168f, 0.0007915683f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 527304, 937630, 1667008, 2962381, 5256587, 7401904, - 10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920, - 45670148, 46886200, 45670152, 42318920, 37562308, 32224264, 26957670, - 19991098, 14497757, 10390626, 7401904, 5256587, 2962381, 1667008, - 937630, 527304, 3}, - {5, 816257, 1451433, 2580496, 4585709, 8137095, 11458003, - 16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872, - 70696504, 72578928, 70696512, 65508868, 58145724, 49882536, 41729952, - 30945832, 22442248, 16084488, 11458004, 8137095, 4585709, 2580496, - 1451434, 816257, 5}, - {7, 1206538, 2145415, 3814322, 6778296, 12027725, - 16936476, 23775046, 33172672, 45742120, 61682500, 73733120, - 85947224, 96830952, 104498976, 107281456, 104498984, 96830952, - 85947232, 73733128, 61682504, 45742116, 33172670, 23775044, - 16936476, 12027724, 6778297, 3814322, 2145415, 1206538, - 7}, - {8, 1403765, 2496115, 4437830, 7886310, 13993836, - 19704996, 27661434, 38595240, 53219352, 71765424, 85785904, - 99996584, 112659424, 121580896, 124818216, 121580904, 112659416, - 99996592, 85785904, 71765432, 53219352, 38595240, 27661430, - 19704998, 13993836, 7886311, 4437830, 2496115, 1403764, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1219857, 2169099, 3856430, 6853125, 12160503, - 17123444, 24037508, 33538878, 46247084, 62363436, 74547088, - 86896032, 97899912, 105652584, 108465784, 105652592, 97899904, - 86896032, 74547096, 62363440, 46247084, 33538876, 24037506, - 17123446, 12160503, 6853125, 3856430, 2169099, 1219857, - 7}, - {1, 212938, 378637, 673176, 1196278, 2122731, 2989060, - 4195976, 5854530, 8072868, 10886130, 13012902, 15168527, 17089358, - 18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130, - 8072867, 5854530, 4195975, 2989060, 2122731, 1196278, 673176, - 378637, 212938, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f, + 0.0110357292f, 0.0195823126f, 0.0275742412f, 0.0387081020f, + 0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f, + 0.1399304867f, 0.1576502621f, 0.1701345593f, 0.1746647060f, + 0.1701345742f, 0.1576502621f, 0.1399305016f, 0.1200447381f, + 0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f, + 0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f, + 0.0034929439f, 0.0019643605f, 0.0000000112f}, + {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f, + 0.0170830972f, 0.0303130411f, 0.0426843874f, 0.0599193908f, + 0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f, + 0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703775764f, + 0.2633650303f, 0.2440395504f, 0.2166097015f, 0.1858269274f, + 0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f, + 0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f, + 0.0054070130f, 0.0030407943f, 0.0000000186f}, + {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f, + 0.0252511203f, 0.0448067673f, 0.0630932897f, 0.0885689482f, + 0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f, + 0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f, + 0.3892890513f, 0.3607234061f, 0.3201783895f, 0.2746773064f, + 0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f, + 0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f, + 0.0079922937f, 0.0044947043f, 0.0000000261f}, + {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f, + 0.0293787941f, 0.0521311015f, 0.0734068304f, 0.1030468717f, + 0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f, + 0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f, + 0.4529241621f, 0.4196890295f, 0.3725163341f, 0.3195773959f, + 0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f, + 0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f, + 0.0092987530f, 0.0052294284f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f, + 0.0255298801f, 0.0453014039f, 0.0637897998f, 0.0895466954f, + 0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f, + 0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f, + 0.3935865760f, 0.3647055626f, 0.3237129450f, 0.2777095735f, + 0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f, + 0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f, + 0.0080805235f, 0.0045443214f, 0.0000000261f}, + {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f, + 0.0044564828f, 0.0079077892f, 0.0111351162f, 0.0156312287f, + 0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f, + 0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f, + 0.0687042698f, 0.0636628196f, 0.0565071702f, 0.0484768413f, + 0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f, + 0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f, + 0.0014105327f, 0.0007932559f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 526244, 934286, 1656482, 2929383, 5154009, 7200895, - 10000863, 13755239, 18618438, 24545892, 28863346, 33106846, 36783140, - 39317168, 40225668, 39317172, 36783136, 33106846, 28863346, 24545892, - 18618438, 13755238, 10000861, 7200896, 5154009, 2929384, 1656483, - 934287, 526244, 3}, - {5, 814783, 1446784, 2565855, 4539774, 7994119, 11177507, - 15539743, 21402348, 29018418, 38333064, 45138564, 51843736, 57665092, - 61684144, 63126296, 61684144, 57665088, 51843736, 45138564, 38333064, - 29018416, 21402346, 15539743, 11177508, 7994120, 4539775, 2565855, - 1446784, 814783, 5}, - {7, 1204981, 2140499, 3798824, 6729584, 11875611, 16637170, - 23191438, 32052656, 43652104, 57969124, 68517096, 78979352, 88116992, - 94454288, 96733928, 94454296, 88116984, 78979352, 68517096, 57969132, - 43652104, 32052654, 23191436, 16637170, 11875611, 6729584, 3798824, - 2140499, 1204981, 7}, - {8, 1402655, 2492611, 4426772, 7851491, 13884761, - 19489746, 27240036, 37782168, 51691532, 69027848, 81916832, - 94796824, 106122744, 114019024, 116867616, 114019032, 106122736, - 94796832, 81916832, 69027848, 51691532, 37782168, 27240034, - 19489748, 13884760, 7851492, 4426772, 2492611, 1402655, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1221406, 2174004, 3871976, 6902451, 12317130, - 17436482, 24661340, 34772524, 48643564, 66845112, 81092456, - 95994392, 109691792, 119593848, 123240712, 119593864, 109691784, - 95994392, 81092456, 66845116, 48643564, 34772520, 24661336, - 17436482, 12317130, 6902452, 3871976, 2174004, 1221406, - 7}, - {1, 213393, 380079, 677757, 1210858, 2169302, 3082668, - 4384052, 6230858, 8816279, 12308984, 15131109, 18175568, 21641464, - 24357576, 25401724, 24357578, 21641462, 18175570, 15131110, 12308985, - 8816279, 6230857, 4384051, 3082668, 2169302, 1210858, 677757, - 380079, 213393, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f, + 0.0109128021f, 0.0192001797f, 0.0268254243f, 0.0372561179f, + 0.0512422584f, 0.0693590865f, 0.0914405733f, 0.1075243428f, + 0.1233326122f, 0.1370278746f, 0.1464678645f, 0.1498522907f, + 0.1464678794f, 0.1370278597f, 0.1233326122f, 0.1075243428f, + 0.0914405733f, 0.0693590865f, 0.0512422547f, 0.0372561105f, + 0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f, + 0.0034804903f, 0.0019604117f, 0.0000000112f}, + {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f, + 0.0169119760f, 0.0297804140f, 0.0416394584f, 0.0578900538f, + 0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542546f, + 0.1931329668f, 0.2148192078f, 0.2297913432f, 0.2351637781f, + 0.2297913432f, 0.2148191929f, 0.1931329668f, 0.1681542546f, + 0.1428017914f, 0.1081020236f, 0.0797299519f, 0.0578900538f, + 0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f, + 0.0053896904f, 0.0030353032f, 0.0000000186f}, + {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f, + 0.0250696540f, 0.0442400984f, 0.0619782880f, 0.0863948390f, + 0.1194054484f, 0.1626167595f, 0.2159518152f, 0.2552460730f, + 0.2942210138f, 0.3282613754f, 0.3518696427f, 0.3603619635f, + 0.3518696725f, 0.3282613456f, 0.2942210138f, 0.2552460730f, + 0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f, + 0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f, + 0.0079739802f, 0.0044889040f, 0.0000000261f}, + {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f, + 0.0292490833f, 0.0517247654f, 0.0726049617f, 0.1014770418f, + 0.1407495439f, 0.1925659627f, 0.2571487725f, 0.3051639795f, + 0.3531456888f, 0.3953380287f, 0.4247539639f, 0.4353657961f, + 0.4247539937f, 0.3953379989f, 0.3531457186f, 0.3051639795f, + 0.2571487725f, 0.1925659627f, 0.1407495439f, 0.1014770344f, + 0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f, + 0.0092856996f, 0.0052252971f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f, + 0.0257136337f, 0.0458848849f, 0.0649559572f, 0.0918706506f, + 0.1295377463f, 0.1812113971f, 0.2490174472f, 0.3020929396f, + 0.3576069772f, 0.4086337686f, 0.4455218017f, 0.4591074288f, + 0.4455218613f, 0.4086337388f, 0.3576069772f, 0.3020929396f, + 0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f, + 0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f, + 0.0080987960f, 0.0045500919f, 0.0000000261f}, + {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f, + 0.0045107976f, 0.0080812797f, 0.0114838332f, 0.0163318664f, + 0.0232117549f, 0.0328431986f, 0.0458545387f, 0.0563677736f, + 0.0677092671f, 0.0806207359f, 0.0907390416f, 0.0946287960f, + 0.0907390490f, 0.0806207284f, 0.0677092746f, 0.0563677773f, + 0.0458545424f, 0.0328431986f, 0.0232117511f, 0.0163318627f, + 0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f, + 0.0014159046f, 0.0007949509f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 525351, 931480, 1647714, 2902257, 5071597, 7042735, - 9702682, 13207803, 17652582, 22940042, 26711398, 30359378, 33476790, - 35604104, 36362736, 35604104, 33476788, 30359380, 26711396, 22940042, - 17652582, 13207803, 9702681, 7042735, 5071597, 2902257, 1647714, - 931480, 525351, 3}, - {5, 813540, 1442877, 2553636, 4501896, 7878638, 10955188, - 15118865, 20625528, 27638920, 36022472, 42026544, 47851780, 52842400, - 56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476, - 27638918, 20625528, 15118864, 10955189, 7878638, 4501896, 2553636, - 1442877, 813540, 5}, - {7, 1203665, 2136357, 3785832, 6689100, 11751078, 16395488, - 22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976, - 87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532, - 42088120, 31187070, 22728958, 16395489, 11751078, 6689101, 3785832, - 2136357, 1203665, 7}, - {8, 1401717, 2489652, 4417463, 7822332, 13794261, - 19312684, 26897488, 37131704, 50494456, 66937128, 79016952, - 90971256, 101390632, 108605536, 111198640, 108605544, 101390624, - 90971264, 79016952, 66937132, 50494456, 37131704, 26897486, - 19312686, 13794262, 7822333, 4417463, 2489652, 1401717, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1222724, 2178188, 3885304, 6945113, 12454759, - 17715756, 25230046, 35932312, 50996136, 71510480, 88238112, - 108673688, 130724608, 148143040, 154903072, 148143056, 130724600, - 108673704, 88238112, 71510496, 50996136, 35932312, 25230042, - 17715758, 12454758, 6945114, 3885304, 2178189, 1222724, - 7}, - {1, 213781, 381315, 681714, 1223645, 2211279, 3169313, - 4564991, 6613954, 9638446, 15182688, 20899232, 28782230, 38682300, - 48311484, 52599940, 48311496, 38682296, 28782232, 20899232, 15182688, - 9638446, 6613954, 4564991, 3169313, 2211279, 1223645, 681714, - 381315, 213781, 1}, - }, + + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f, + 0.0108117498f, 0.0188931711f, 0.0262362324f, 0.0361453071f, + 0.0492029004f, 0.0657609925f, 0.0854583159f, 0.0995077118f, + 0.1130974963f, 0.1247107610f, 0.1326356232f, 0.1354617476f, + 0.1326356232f, 0.1247107536f, 0.1130975038f, 0.0995077044f, + 0.0854583159f, 0.0657609925f, 0.0492029004f, 0.0361453034f, + 0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f, + 0.0034700334f, 0.0019570850f, 0.0000000112f}, + {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f, + 0.0167708695f, 0.0293502137f, 0.0408112556f, 0.0563221611f, + 0.0768360794f, 0.1029630005f, 0.1341941655f, 0.1565610766f, + 0.1782617718f, 0.1968532801f, 0.2095632553f, 0.2141001821f, + 0.2095632553f, 0.1968532652f, 0.1782617867f, 0.1565610915f, + 0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f, + 0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f, + 0.0053751357f, 0.0030306727f, 0.0000000186f}, + {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f, + 0.0249188393f, 0.0437761769f, 0.0610779524f, 0.0846719742f, + 0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f, + 0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f, + 0.3273887634f, 0.3066769540f, 0.2765491605f, 0.2416490614f, + 0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f, + 0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f, + 0.0079585500f, 0.0044840015f, 0.0000000261f}, + {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f, + 0.0291404575f, 0.0513876267f, 0.0719453543f, 0.1002009511f, + 0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f, + 0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142472148f, + 0.4045871794f, 0.3777095079f, 0.3388943672f, 0.2943610847f, + 0.2493602484f, 0.1881065071f, 0.1383263767f, 0.1002009436f, + 0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f, + 0.0092746764f, 0.0052218027f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f, + 0.0258725621f, 0.0463975929f, 0.0659963340f, 0.0939892456f, + 0.1338582933f, 0.1899754107f, 0.2663972974f, 0.3287125826f, + 0.4048410356f, 0.4869871140f, 0.5518758297f, 0.5770589113f, + 0.5518758893f, 0.4869870842f, 0.4048410952f, 0.3287125826f, + 0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f, + 0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f, + 0.0081143863f, 0.0045550019f, 0.0000000261f}, + {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f, + 0.0045584328f, 0.0082376562f, 0.0118066110f, 0.0170059167f, + 0.0246388987f, 0.0359060094f, 0.0565599203f, 0.0778557062f, + 0.1072221622f, 0.1441027969f, 0.1799743026f, 0.1959500462f, + 0.1799743474f, 0.1441027820f, 0.1072221696f, 0.0778557062f, + 0.0565599203f, 0.0359060094f, 0.0246388987f, 0.0170059167f, + 0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f, + 0.0014205091f, 0.0007963963f, 0.0000000037f}}, { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 524756, 929618, 1641931, 2884546, 5018684, 6942684, - 9517694, 12876462, 17085148, 22027530, 25515680, 28863994, 31707368, - 33639036, 34326304, 33639036, 31707366, 28863994, 25515680, 22027532, - 17085148, 12876462, 9517694, 6942685, 5018684, 2884546, 1641932, - 929618, 524756, 3}, - {5, 812713, 1440285, 2545568, 4477108, 7804208, 10813826, - 14855985, 20151268, 26819762, 34692788, 40273396, 45646932, 50221664, - 53335084, 54443824, 53335084, 50221660, 45646932, 40273400, 34692788, - 26819762, 20151268, 14855983, 10813826, 7804208, 4477108, 2545568, - 1440285, 812713, 5}, - {7, 1202789, 2133603, 3777225, 6662453, 11670018, 16239749, - 22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256, - 84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904, - 41132176, 30646314, 22434930, 16239752, 11670018, 6662454, 3777225, - 2133603, 1202789, 7}, - {8, 1401091, 2487681, 4411274, 7803027, 13734770, - 19197032, 26675680, 36715348, 49739444, 65641580, 77242592, - 88658984, 98560160, 105390504, 107840400, 105390512, 98560152, - 88658992, 77242584, 65641576, 49739444, 36715348, 26675674, - 19197034, 13734769, 7803028, 4411274, 2487680, 1401091, - 8}, - {8, 1509476, 2684086, 4772024, 8480193, 15047650, - 21188892, 29744494, 41501680, 57227068, 77169768, 92246064, - 107526888, 121143312, 130736624, 134217728, 130736624, 121143304, - 107526896, 92246064, 77169768, 57227064, 41501676, 29744492, - 21188894, 15047650, 8480194, 4772024, 2684086, 1509476, - 8}, - {7, 1223607, 2180998, 3894286, 6974063, 12549334, - 17910016, 25632730, 36775224, 52772652, 75633064, 99236928, - 128381352, 160330848, 187347776, 198291392, 187347792, 160330832, - 128381360, 99236928, 75633072, 52772652, 36775220, 25632728, - 17910018, 12549334, 6974064, 3894286, 2180998, 1223607, - 7}, - {1, 214041, 382148, 684396, 1232418, 2240724, - 3231452, 4699171, 6913169, 11028142, 19133980, 29199468, - 47298756, 81631544, 140893488, 184843632, 140893568, 81631528, - 47298760, 29199470, 19133982, 11028142, 6913169, 4699170, - 3231452, 2240724, 1232418, 684397, 382148, 214041, - 1}, - }, -}; -const WORD32 ixheaacd_weight_Q28[16][8][31] = { + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f}, + {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f, + 0.0107457712f, 0.0186960548f, 0.0258635134f, 0.0354561731f, + 0.0479685590f, 0.0636471361f, 0.0820589438f, 0.0950533152f, + 0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f, + 0.1253151745f, 0.1181191429f, 0.1075267568f, 0.0950533152f, + 0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f, + 0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f, + 0.0034630969f, 0.0019548684f, 0.0000000112f}, + {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f, + 0.0166785270f, 0.0290729403f, 0.0402846411f, 0.0553428568f, + 0.0750693232f, 0.0999113992f, 0.1292407066f, 0.1500300914f, + 0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190494f, + 0.1986886710f, 0.1870902628f, 0.1700480729f, 0.1500301063f, + 0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428493f, + 0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f, + 0.0053654797f, 0.0030275919f, 0.0000000186f}, + {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f, + 0.0248195715f, 0.0434742048f, 0.0604977794f, 0.0835766271f, + 0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f, + 0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f, + 0.3136188090f, 0.2944217920f, 0.2663741708f, 0.2336882651f, + 0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f, + 0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f, + 0.0079482906f, 0.0044807382f, 0.0000000261f}, + {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f, + 0.0290685408f, 0.0511660054f, 0.0715145171f, 0.0993746519f, + 0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f, + 0.3302804530f, 0.3671652079f, 0.3926102221f, 0.4017367959f, + 0.3926102519f, 0.3671651781f, 0.3302804828f, 0.2877510488f, + 0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f, + 0.0715145245f, 0.0511660017f, 0.0290685445f, 0.0164332762f, + 0.0092673302f, 0.0052194707f, 0.0000000298f}, + {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, + 0.0315911807f, 0.0560568646f, 0.0789347738f, 0.1108068749f, + 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f, + 0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, + 0.4870318770f, 0.4512939751f, 0.4005689025f, 0.3436433673f, + 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f, + 0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, + 0.0099989995f, 0.0056232363f, 0.0000000298f}, + {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f, + 0.0259804092f, 0.0467499122f, 0.0667200089f, 0.0954893604f, + 0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f, + 0.4782578051f, 0.5972789526f, 0.6979248524f, 0.7386929989f, + 0.6979249120f, 0.5972788930f, 0.4782578349f, 0.3696863651f, + 0.2817551494f, 0.1965934485f, 0.1369983703f, 0.0954893529f, + 0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f, + 0.0081248507f, 0.0045582913f, 0.0000000261f}, + {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f, + 0.0045911148f, 0.0083473474f, 0.0120380968f, 0.0175057761f, + 0.0257535614f, 0.0410830304f, 0.0712796301f, 0.1087764949f, + 0.1762015969f, 0.3041011989f, 0.5248691440f, 0.6885961890f, + 0.5248694420f, 0.3041011393f, 0.1762016118f, 0.1087765023f, + 0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f, + 0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f, + 0.0014236122f, 0.0007973649f, 0.0000000037f}}}; + +const FLOAT32 ixheaacd_weight[16][8][31] = { { - {134217744, 134970352, 135553120, 136582896, 138392880, 141541712, - 144424112, 148346336, 153572976, 160297488, 168439744, 174342928, - 180128864, 185132320, 188577760, 189812528, 188577760, 185132320, - 180128880, 174342928, 168439744, 160297488, 153572976, 148346336, - 144424112, 141541712, 138392880, 136582896, 135553136, 134970352, - 134217744}, - {134217728, 134923056, 135469392, 136435104, 138133568, 141091536, - 143802496, 147496192, 152426160, 158780944, 166491504, 172091408, - 177587152, 182344784, 185623536, 186799072, 185623552, 182344800, - 177587152, 172091392, 166491520, 158780944, 152426160, 147496192, - 143802480, 141091536, 138133568, 136435104, 135469392, 134923056, - 134217744}, - {134217728, 134851104, 135341920, 136210016, 137738240, 140404048, - 142851840, 146193664, 150665168, 156446176, 163483824, 168609296, - 173650000, 178021440, 181037920, 182120160, 181037920, 178021424, - 173650000, 168609296, 163483824, 156446176, 150665168, 146193680, - 142851840, 140404048, 137738240, 136210000, 135341920, 134851104, - 134217744}, - {134217728, 134670496, 135021776, 135643952, 136741952, 138665264, - 140439920, 142875520, 146156352, 150432704, 155687056, 159544432, - 163361216, 166688640, 168993616, 169822288, 168993632, 166688656, - 163361216, 159544432, 155687056, 150432704, 146156352, 142875520, - 140439920, 138665264, 136741952, 135643952, 135021776, 134670496, - 134217744}, - {134217728, 134494912, 134710224, 135092080, 135767616, 136955856, - 138057744, 139578304, 141641264, 144354416, 147723552, 150220400, - 152709488, 154893744, 156414336, 156962448, 156414336, 154893744, - 152709472, 150220400, 147723552, 144354416, 141641264, 139578320, - 138057728, 136955856, 135767600, 135092080, 134710224, 134494912, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 133772440, 133424920, 132804936, 131696632, 129710520, - 127825384, 125151792, 121381688, 116147984, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 116148000, 121381688, 125151792, - 127825384, 129710520, 131696632, 132804936, 133424920, 133772456, - 134217728}, - {134217728, 133468448, 132882456, 131834416, 129952248, 126550128, - 123283864, 118583656, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 118583656, - 123283864, 126550128, 129952248, 131834416, 132882456, 133468448, - 134217728}, - }, + + {0.5000000596f, 0.5028037429f, 0.5049747229f, 0.5088109374f, + 0.5155536532f, 0.5272839665f, 0.5380217433f, 0.5526331663f, + 0.5721039176f, 0.5971546769f, 0.6274869442f, 0.6494780183f, + 0.6710323095f, 0.6896716356f, 0.7025068998f, 0.7071067691f, + 0.7025068998f, 0.6896716356f, 0.6710323691f, 0.6494780183f, + 0.6274869442f, 0.5971546769f, 0.5721039176f, 0.5526331663f, + 0.5380217433f, 0.5272839665f, 0.5155536532f, 0.5088109374f, + 0.5049747825f, 0.5028037429f, 0.5000000596f}, + {0.5000000000f, 0.5026275516f, 0.5046628118f, 0.5082603693f, + 0.5145876408f, 0.5256069303f, 0.5357060432f, 0.5494661331f, + 0.5678316951f, 0.5915051103f, 0.6202291846f, 0.6410904527f, + 0.6615636945f, 0.6792872548f, 0.6915015578f, 0.6958807707f, + 0.6915016174f, 0.6792873144f, 0.6615636945f, 0.6410903931f, + 0.6202292442f, 0.5915051103f, 0.5678316951f, 0.5494661331f, + 0.5357059836f, 0.5256069303f, 0.5145876408f, 0.5082603693f, + 0.5046628118f, 0.5026275516f, 0.5000000596f}, + {0.5000000000f, 0.5023595095f, 0.5041879416f, 0.5074218512f, + 0.5131149292f, 0.5230458379f, 0.5321645737f, 0.5446138382f, + 0.5612714887f, 0.5828074217f, 0.6090247035f, 0.6281185746f, + 0.6468966603f, 0.6631815434f, 0.6744188070f, 0.6784504652f, + 0.6744188070f, 0.6631814837f, 0.6468966603f, 0.6281185746f, + 0.6090247035f, 0.5828074217f, 0.5612714887f, 0.5446138978f, + 0.5321645737f, 0.5230458379f, 0.5131149292f, 0.5074217916f, + 0.5041879416f, 0.5023595095f, 0.5000000596f}, + {0.5000000000f, 0.5016866922f, 0.5029953122f, 0.5053130984f, + 0.5094034672f, 0.5165683627f, 0.5231794715f, 0.5322527885f, + 0.5444748402f, 0.5604054928f, 0.5799794793f, 0.5943493247f, + 0.6085679531f, 0.6209635735f, 0.6295502782f, 0.6326373219f, + 0.6295503378f, 0.6209636331f, 0.6085679531f, 0.5943493247f, + 0.5799794793f, 0.5604054928f, 0.5444748402f, 0.5322527885f, + 0.5231794715f, 0.5165683627f, 0.5094034672f, 0.5053130984f, + 0.5029953122f, 0.5016866922f, 0.5000000596f}, + {0.5000000000f, 0.5010325909f, 0.5018346906f, 0.5032572150f, + 0.5057737827f, 0.5102003217f, 0.5143051744f, 0.5199697018f, + 0.5276548266f, 0.5377621055f, 0.5503131151f, 0.5596145988f, + 0.5688871741f, 0.5770241618f, 0.5826888084f, 0.5847306848f, + 0.5826888084f, 0.5770241618f, 0.5688871145f, 0.5596145988f, + 0.5503131151f, 0.5377621055f, 0.5276548266f, 0.5199697614f, + 0.5143051147f, 0.5102003217f, 0.5057737231f, 0.5032572150f, + 0.5018346906f, 0.5010325909f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4983411729f, 0.4970465600f, 0.4947369397f, + 0.4906081855f, 0.4832093418f, 0.4761866629f, 0.4662267566f, + 0.4521820247f, 0.4326849580f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4326850176f, 0.4521820247f, 0.4662267566f, + 0.4761866629f, 0.4832093418f, 0.4906081855f, 0.4947369397f, + 0.4970465600f, 0.4983412325f, 0.5000000000f}, + {0.5000000000f, 0.4972087145f, 0.4950257242f, 0.4911214709f, + 0.4841098487f, 0.4714359641f, 0.4592681825f, 0.4417585433f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4417585433f, + 0.4592681825f, 0.4714359641f, 0.4841098487f, 0.4911214709f, + 0.4950257242f, 0.4972087145f, 0.5000000000f}}, { - {134217728, 134913216, 135451936, 136404304, 138079504, 140997600, - 143672688, 147318512, 152186224, 158463280, 166082896, 171618768, - 177053216, 181758880, 185002352, 186165328, 185002352, 181758880, - 177053216, 171618768, 166082896, 158463296, 152186224, 147318512, - 143672688, 140997600, 138079504, 136404304, 135451936, 134913216, - 134217744}, - {134217728, 134869504, 135374512, 136267584, 137839408, 140580112, - 143095472, 146527744, 151117280, 157046336, 164257936, 169506256, - 174664912, 179136560, 182221168, 183327616, 182221168, 179136560, - 174664912, 169506256, 164257936, 157046336, 151117280, 146527744, - 143095472, 140580112, 137839408, 136267584, 135374512, 134869504, - 134217744}, - {134217728, 134802992, 135256672, 136059376, 137473424, 139942768, - 142213056, 145316768, 149476832, 154866368, 161442736, 166241760, - 170968496, 175072880, 177907744, 178925312, 177907744, 175072880, - 170968496, 166241760, 161442736, 154866368, 149476832, 145316768, - 142213056, 139942768, 137473424, 136059376, 135256672, 134802992, - 134217744}, - {134217728, 134636080, 134960736, 135535920, 136551440, 138331744, - 139976000, 142235024, 145282080, 149260352, 154157968, 157759584, - 161328032, 164442560, 166601920, 167378576, 166601920, 164442544, - 161328032, 157759584, 154157968, 149260368, 145282080, 142235024, - 139976016, 138331728, 136551456, 135535920, 134960736, 134636096, - 134217744}, - {134217728, 134473824, 134672800, 135025728, 135650240, 136749360, - 137769200, 139177520, 141089920, 143607984, 146739200, 149062688, - 151381312, 153417872, 154836624, 155348256, 154836640, 153417872, - 151381328, 149062688, 146739200, 143607984, 141089920, 139177520, - 137769200, 136749360, 135650256, 135025712, 134672784, 134473824, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 133806400, 133485440, 132913000, 131890240, 130059096, - 128323168, 125864856, 122406120, 117621128, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 117621128, 122406120, 125864856, - 128323168, 130059096, 131890240, 132913000, 133485440, 133806400, - 134217728}, - {134217728, 133525632, 132984568, 132017344, 130281848, 127150040, - 124150024, 119845456, 113664464, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 113664464, 119845456, - 124150032, 127150040, 130281848, 132017344, 132984568, 133525632, - 134217728}, - }, + + {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f, + 0.5143862367f, 0.5252569914f, 0.5352224708f, 0.5488042235f, + 0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f, + 0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935198903f, + 0.6891874671f, 0.6771045923f, 0.6595746279f, 0.6393297315f, + 0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f, + 0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f, + 0.5045977831f, 0.5025908947f, 0.5000000596f}, + {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f, + 0.5134918094f, 0.5237017274f, 0.5330721736f, 0.5458583832f, + 0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f, + 0.6506775022f, 0.6673356891f, 0.6788267493f, 0.6829485893f, + 0.6788267493f, 0.6673356891f, 0.6506775022f, 0.6314600110f, + 0.6119084954f, 0.5850431919f, 0.5629557371f, 0.5458583832f, + 0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f, + 0.5043093562f, 0.5024280548f, 0.5000000596f}, + {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f, + 0.5121284127f, 0.5213274360f, 0.5297849178f, 0.5413471460f, + 0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988157f, + 0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f, + 0.6627579927f, 0.6521973014f, 0.6369072795f, 0.6192988157f, + 0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f, + 0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f, + 0.5038703680f, 0.5021802783f, 0.5000000596f}, + {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f, + 0.5086937547f, 0.5153259039f, 0.5214512348f, 0.5298667550f, + 0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f, + 0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f, + 0.6206405163f, 0.6125962138f, 0.6009937525f, 0.5877002478f, + 0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f, + 0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f, + 0.5027679205f, 0.5015585423f, 0.5000000596f}, + {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f, + 0.5053365231f, 0.5094310641f, 0.5132302642f, 0.5184766650f, + 0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f, + 0.5639393330f, 0.5715261102f, 0.5768113732f, 0.5787173510f, + 0.5768114328f, 0.5715261102f, 0.5639393926f, 0.5553017855f, + 0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f, + 0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f, + 0.5016952157f, 0.5009540319f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f, + 0.4913294315f, 0.4845078886f, 0.4780410528f, 0.4688831270f, + 0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4381728470f, 0.4559983313f, 0.4688831270f, + 0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f, + 0.4972720146f, 0.4984676838f, 0.5000000000f}, + {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f, + 0.4853377044f, 0.4736708105f, 0.4624948800f, 0.4464591146f, + 0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f, + 0.4624949098f, 0.4736708105f, 0.4853377044f, 0.4918029308f, + 0.4954061210f, 0.4974217415f, 0.5000000000f}}, { - {134217728, 134750352, 135163360, 135894416, 137183168, 139436416, - 141510976, 144351440, 148166016, 153119584, 159180064, 163612736, - 167986224, 171789568, 174419392, 175363920, 174419392, 171789568, - 167986224, 163612736, 159180064, 153119584, 148166016, 144351440, - 141510976, 139436432, 137183168, 135894416, 135163360, 134750352, - 134217744}, - {134217728, 134716864, 135103984, 135789392, 136998240, 139113424, - 141062640, 143734096, 147326256, 151998160, 157724080, 161918432, - 166061616, 169668304, 172163984, 173060688, 172163984, 169668288, - 166061616, 161918432, 157724080, 151998160, 147326256, 143734096, - 141062640, 139113424, 136998240, 135789392, 135103984, 134716864, - 134217744}, - {134217728, 134665904, 135013632, 135629504, 136716496, 138620704, - 140377984, 142790048, 146039760, 150276480, 155483472, 159306944, - 163090832, 166390096, 168675808, 169497600, 168675808, 166390096, - 163090848, 159306944, 155483488, 150276480, 146039760, 142790048, - 140377968, 138620720, 136716496, 135629504, 135013616, 134665904, - 134217744}, - {134217728, 134538048, 134786784, 135227776, 136007472, 137377520, - 138646400, 140395008, 142763040, 145870208, 149717968, 152562416, - 155392320, 157871248, 159594640, 160215424, 159594640, 157871248, - 155392320, 152562416, 149717968, 145870208, 142763040, 140395008, - 138646400, 137377520, 136007472, 135227776, 134786784, 134538048, - 134217728}, - {134217728, 134413792, 134566144, 134836576, 135315504, 136159584, - 136944176, 138029792, 139507872, 141460704, 143899120, 145715424, - 147533584, 149135008, 150253024, 150656672, 150253040, 149135008, - 147533584, 145715424, 143899120, 141460688, 139507872, 138029792, - 136944176, 136159584, 135315504, 134836576, 134566160, 134413792, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 133903024, 133657608, 133220288, 132440008, 131046696, - 129730264, 127873712, 125277552, 121718592, 117049664, 113392512, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 113392512, 117049680, 121718592, 125277552, 127873712, - 129730280, 131046696, 132440024, 133220288, 133657624, 133903024, - 134217728}, - {134217728, 133688336, 133274944, 132536912, 131215936, 128843168, - 126584160, 123368104, 118806640, 112416656, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 112416656, 118806632, 123368104, - 126584160, 128843168, 131215936, 132536912, 133274944, 133688336, - 134217728}, - }, + + {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f, + 0.5110471249f, 0.5194411278f, 0.5271694660f, 0.5377510190f, + 0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095049381f, + 0.6257974505f, 0.6399660110f, 0.6497628689f, 0.6532815099f, + 0.6497628689f, 0.6399660110f, 0.6257974505f, 0.6095049381f, + 0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f, + 0.5271694660f, 0.5194411874f, 0.5110471249f, 0.5062461495f, + 0.5035227537f, 0.5019841790f, 0.5000000596f}, + {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f, + 0.5103582144f, 0.5182378888f, 0.5254992843f, 0.5354512334f, + 0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f, + 0.6186277270f, 0.6320636868f, 0.6413608193f, 0.6447013021f, + 0.6413608193f, 0.6320636272f, 0.6186277270f, 0.6031931639f, + 0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f, + 0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f, + 0.5033015609f, 0.5018594265f, 0.5000000596f}, + {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f, + 0.5093086362f, 0.5164023638f, 0.5229487419f, 0.5319343805f, + 0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934646130f, + 0.6075606942f, 0.6198514104f, 0.6283663511f, 0.6314277649f, + 0.6283663511f, 0.6198514104f, 0.6075607538f, 0.5934646130f, + 0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f, + 0.5229486823f, 0.5164024234f, 0.5093086362f, 0.5052592754f, + 0.5029649138f, 0.5016695857f, 0.5000000596f}, + {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f, + 0.5066673160f, 0.5117711425f, 0.5164980888f, 0.5230121613f, + 0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f, + 0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f, + 0.5945363641f, 0.5881162286f, 0.5788815022f, 0.5683392882f, + 0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f, + 0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f, + 0.5021198988f, 0.5011932850f, 0.5000000000f}, + {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f, + 0.5040895343f, 0.5072339773f, 0.5101568103f, 0.5142010450f, + 0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f, + 0.5496054292f, 0.5555711985f, 0.5597361326f, 0.5612398386f, + 0.5597361922f, 0.5555711985f, 0.5496054292f, 0.5428322554f, + 0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f, + 0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f, + 0.5012980103f, 0.5007303953f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f, + 0.4933774769f, 0.4881869853f, 0.4832828939f, 0.4763666987f, + 0.4666952491f, 0.4534370899f, 0.4360439777f, 0.4224200249f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4224200249f, + 0.4360440373f, 0.4534370899f, 0.4666952491f, 0.4763666987f, + 0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f, + 0.4979134500f, 0.4988276362f, 0.5000000000f}, + {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f, + 0.4888174534f, 0.4799782038f, 0.4715627432f, 0.4595820010f, + 0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4187846780f, 0.4425891936f, 0.4595820010f, + 0.4715627432f, 0.4799782038f, 0.4888174534f, 0.4937384725f, + 0.4964878559f, 0.4980278611f, 0.5000000000f}}, { - {134217728, 134506240, 134730320, 135127728, 135830656, 137066736, - 138212592, 139793296, 141936768, 144754096, 148250000, 150839072, - 153418688, 155681312, 157255888, 157823344, 157255888, 155681312, - 153418688, 150839072, 148249984, 144754096, 141936768, 139793296, - 138212592, 137066736, 135830656, 135127728, 134730320, 134506240, - 134217728}, - {134217728, 134488080, 134698096, 135070576, 135729600, 136888992, - 137964320, 139448608, 141462896, 144113040, 147405392, 149846352, - 152280496, 154417184, 155904992, 156441360, 155904992, 154417184, - 152280496, 149846352, 147405392, 144113040, 141462896, 139448592, - 137964336, 136888992, 135729600, 135070576, 134698096, 134488080, - 134217728}, - {134217728, 134460464, 134649040, 134983616, 135575776, 136618224, - 137585872, 138922720, 140739104, 143132528, 146111440, 148323744, - 150532864, 152474416, 153827600, 154315696, 153827600, 152474432, - 150532880, 148323744, 146111440, 143132528, 140739104, 138922720, - 137585872, 136618224, 135575760, 134983616, 134649040, 134460464, - 134217728}, - {134217728, 134391168, 134526000, 134765312, 135189280, 135936912, - 136632336, 137595280, 138907696, 140643920, 142815424, 144435360, - 146058944, 147490640, 148491024, 148852368, 148491024, 147490640, - 146058944, 144435360, 142815424, 140643920, 138907696, 137595280, - 136632320, 135936912, 135189264, 134765312, 134526000, 134391168, - 134217728}, - {134217728, 134323872, 134406416, 134552992, 134812944, 135272112, - 135700080, 136294032, 137106080, 138184736, 139540672, 140557056, - 141579776, 142484928, 143119200, 143348672, 143119200, 142484928, - 141579776, 140557056, 139540672, 138184736, 137106080, 136294032, - 135700080, 135272112, 134812944, 134552992, 134406416, 134323872, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134047496, 133914896, 133678832, 133258584, 132511008, - 131808096, 130822576, 129456008, 127605336, 125219016, 123384368, - 121496560, 119789320, 118571736, 118126816, 118571736, 119789320, - 121496560, 123384368, 125219016, 127605336, 129456008, 130822576, - 131808096, 132511008, 133258584, 133678848, 133914896, 134047496, - 134217728}, - {134217728, 133931488, 133708328, 133310696, 132601600, 131336352, - 130142072, 128459768, 126111336, 122900144, 118702864, 115428560, - 112012208, 111848104, 111848104, 111848104, 111848104, 111848104, - 112012208, 115428560, 118702864, 122900128, 126111336, 128459768, - 130142072, 131336352, 132601616, 133310696, 133708328, 133931488, - 134217728}, - }, + + {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f, + 0.5060086250f, 0.5106133819f, 0.5148820281f, 0.5207706094f, + 0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f, + 0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879377723f, + 0.5858238339f, 0.5799580812f, 0.5715291500f, 0.5619193316f, + 0.5522742271f, 0.5392510295f, 0.5287556648f, 0.5207706094f, + 0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f, + 0.5019095540f, 0.5010747910f, 0.5000000000f}, + {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f, + 0.5056321621f, 0.5099512339f, 0.5139571428f, 0.5194865465f, + 0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f, + 0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f, + 0.5807913542f, 0.5752488375f, 0.5672890544f, 0.5582211614f, + 0.5491278768f, 0.5368629098f, 0.5269903541f, 0.5194864869f, + 0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771064f, + 0.5017895103f, 0.5010071397f, 0.5000000000f}, + {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f, + 0.5050591230f, 0.5089425445f, 0.5125473142f, 0.5175274611f, + 0.5242940187f, 0.5332102180f, 0.5443075299f, 0.5525490046f, + 0.5607786179f, 0.5680114627f, 0.5730524659f, 0.5748707652f, + 0.5730524659f, 0.5680115223f, 0.5607786775f, 0.5525490046f, + 0.5443075299f, 0.5332102180f, 0.5242940187f, 0.5175274611f, + 0.5125473142f, 0.5089425445f, 0.5050590634f, 0.5028531551f, + 0.5016067624f, 0.5009042621f, 0.5000000000f}, + {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f, + 0.5036193132f, 0.5064044595f, 0.5089951158f, 0.5125823617f, + 0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f, + 0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545182824f, + 0.5531721711f, 0.5494454503f, 0.5441119671f, 0.5380636454f, + 0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f, + 0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f, + 0.5011484027f, 0.5006461143f, 0.5000000000f}, + {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f, + 0.5022173524f, 0.5039278865f, 0.5055221915f, 0.5077348351f, + 0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f, + 0.5274257660f, 0.5307977200f, 0.5331605673f, 0.5340154171f, + 0.5331605673f, 0.5307977200f, 0.5274257660f, 0.5236158371f, + 0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f, + 0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f, + 0.5007029176f, 0.5003954172f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f, + 0.4964269102f, 0.4936419725f, 0.4910234213f, 0.4873520732f, + 0.4822612107f, 0.4753669202f, 0.4664771855f, 0.4596425891f, + 0.4526099563f, 0.4462499917f, 0.4417141378f, 0.4400566816f, + 0.4417141378f, 0.4462499917f, 0.4526099563f, 0.4596425891f, + 0.4664771855f, 0.4753669202f, 0.4822612107f, 0.4873520732f, + 0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f, + 0.4988718629f, 0.4993658364f, 0.5000000000f}, + {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f, + 0.4939794540f, 0.4892660379f, 0.4848169982f, 0.4785499275f, + 0.4698013365f, 0.4578387141f, 0.4422026277f, 0.4300048947f, + 0.4172779918f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4172779918f, 0.4300048947f, + 0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f, + 0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f, + 0.4981023371f, 0.4989336729f, 0.5000000000f}}, { - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217744, 134217728, 134217728, 134217744, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - }, + + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000596f, 0.5000000000f, + 0.5000000000f, 0.5000000596f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}}, { - {134217728, 133928592, 133703168, 133301512, 132585192, 131306928, - 130100248, 128400288, 126026792, 122780504, 118535808, 115223152, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 115223152, 118535792, 122780504, 126026792, 128400288, - 130100248, 131306928, 132585192, 133301512, 133703168, 133928592, - 134217728}, - {134217728, 133946816, 133735640, 133359432, 132688632, 131492208, - 130363488, 128774544, 126558464, 123532296, 119584472, 116511248, - 113311296, 111848104, 111848104, 111848104, 111848104, 111848104, - 113311288, 116511248, 119584472, 123532296, 126558464, 128774544, - 130363488, 131492208, 132688632, 133359432, 133735640, 133946816, - 134217728}, - {134217728, 133974552, 133785016, 133447456, 132845800, 131773512, - 130762848, 129341696, 127362872, 124667064, 121162064, 118443520, - 115622880, 113050208, 111848104, 111848104, 111848104, 113050208, - 115622880, 118443520, 121162064, 124667064, 127362856, 129341696, - 130762848, 131773512, 132845800, 133447456, 133785016, 133974552, - 134217728}, - {134217728, 134044048, 133908760, 133667912, 133239096, 132476240, - 131758880, 130752952, 129357832, 127467976, 125030208, 123155288, - 121225344, 119479336, 118233720, 117778472, 118233720, 119479336, - 121225328, 123155288, 125030224, 127467976, 129357832, 130752960, - 131758880, 132476240, 133239096, 133667912, 133908760, 134044048, - 134217728}, - {134217728, 134111512, 134028776, 133881624, 133619856, 133154992, - 132718832, 132108784, 131265840, 130129840, 128674776, 127563760, - 126427688, 125406704, 124682360, 124418480, 124682360, 125406704, - 126427688, 127563760, 128674776, 130129840, 131265840, 132108784, - 132718832, 133154992, 133619856, 133881608, 134028776, 134111512, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134387728, 134519888, 134754464, 135170064, 135903024, - 136584848, 137529104, 138816208, 140519296, 142649904, 144239712, - 145833392, 147238976, 148221248, 148576080, 148221248, 147238976, - 145833392, 144239712, 142649904, 140519312, 138816208, 137529088, - 136584848, 135903024, 135170064, 134754464, 134519888, 134387728, - 134217728}, - {134217728, 134503360, 134725216, 135118656, 135814608, 137038528, - 138173216, 139738624, 141861648, 144652528, 148116256, 150681920, - 153238576, 155481344, 157042224, 157604800, 157042224, 155481344, - 153238576, 150681920, 148116256, 144652528, 141861648, 139738624, - 138173216, 137038528, 135814608, 135118656, 134725200, 134503360, - 134217728}, - }, + + {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f, + 0.4939183295f, 0.4891564250f, 0.4846611917f, 0.4783283472f, + 0.4694863856f, 0.4573930204f, 0.4415802956f, 0.4292396903f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4292396903f, + 0.4415802360f, 0.4573930204f, 0.4694863856f, 0.4783283472f, + 0.4846611917f, 0.4891564250f, 0.4939183295f, 0.4965868294f, + 0.4980831146f, 0.4989228845f, 0.5000000000f}, + {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f, + 0.4943036735f, 0.4898466468f, 0.4856418371f, 0.4797225595f, + 0.4714670181f, 0.4601936638f, 0.4454868734f, 0.4340382218f, + 0.4221174717f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4221174419f, 0.4340382218f, + 0.4454868734f, 0.4601936638f, 0.4714670181f, 0.4797225595f, + 0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025982f, + 0.4982040823f, 0.4989907742f, 0.5000000000f}, + {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f, + 0.4948891699f, 0.4908945858f, 0.4871295691f, 0.4818353653f, + 0.4744636714f, 0.4644210041f, 0.4513638616f, 0.4412364960f, + 0.4307287931f, 0.4211448431f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4211448431f, 0.4307287931f, 0.4412364960f, + 0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f, + 0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f, + 0.4983880222f, 0.4990940988f, 0.5000000000f}, + {0.5000000000f, 0.4993529916f, 0.4988490045f, 0.4979517758f, + 0.4963543117f, 0.4935124516f, 0.4908400774f, 0.4870927036f, + 0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f, + 0.4515995979f, 0.4450952113f, 0.4404549301f, 0.4387589991f, + 0.4404549301f, 0.4450952113f, 0.4515995383f, 0.4587891996f, + 0.4657738805f, 0.4748552144f, 0.4818954766f, 0.4870927334f, + 0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f, + 0.4988490045f, 0.4993529916f, 0.5000000000f}, + {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f, + 0.4977727532f, 0.4960409999f, 0.4944161773f, 0.4921435714f, + 0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f, + 0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634949565f, + 0.4644779861f, 0.4671763778f, 0.4709798396f, 0.4752120376f, + 0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f, + 0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f, + 0.4992960989f, 0.4996043146f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f, + 0.5035477281f, 0.5062782168f, 0.5088182092f, 0.5123358369f, + 0.5171306729f, 0.5234751701f, 0.5314123034f, 0.5373347998f, + 0.5432717204f, 0.5485079288f, 0.5521671772f, 0.5534890294f, + 0.5521671772f, 0.5485079288f, 0.5432717204f, 0.5373347998f, + 0.5314123034f, 0.5234752297f, 0.5171306729f, 0.5123357773f, + 0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f, + 0.5011256337f, 0.5006332994f, 0.5000000000f}, + {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f, + 0.5059488416f, 0.5105082989f, 0.5147353411f, 0.5205669403f, + 0.5284758210f, 0.5388726592f, 0.5517760515f, 0.5613338947f, + 0.5708581805f, 0.5792131424f, 0.5850278735f, 0.5871236324f, + 0.5850278735f, 0.5792131424f, 0.5708581805f, 0.5613338947f, + 0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f, + 0.5147353411f, 0.5105082989f, 0.5059488416f, 0.5033562183f, + 0.5018904805f, 0.5010640621f, 0.5000000000f}}, { - {134217728, 133682984, 133265384, 132519816, 131185264, 128787744, - 126504696, 123253640, 118640752, 112174832, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 112174832, 118640752, 123253640, - 126504696, 128787744, 131185264, 132519816, 133265384, 133682984, - 134217728}, - {134217728, 133716728, 133325584, 132627440, 131378384, 129136568, - 127004448, 123973008, 119681960, 113689744, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 113689744, 119681960, 123973008, - 127004448, 129136568, 131378376, 132627440, 133325584, 133716744, - 134217728}, - {134217728, 133768056, 133417096, 132790928, 131671560, 129665320, - 127760792, 125059176, 121248440, 115955928, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 115955928, 121248440, 125059176, - 127760792, 129665320, 131671560, 132790928, 133417096, 133768056, - 134217728}, - {134217728, 133896640, 133646248, 133200016, 132403792, 130981736, - 129637848, 127742080, 125090024, 121452368, 116676152, 112931424, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 112931424, 116676152, 121452368, 125090024, 127742080, - 129637848, 130981736, 132403792, 133200016, 133646248, 133896640, - 134217728}, - {134217728, 134021376, 133868400, 133596016, 133110896, 132247376, - 131434736, 130294184, 128710328, 126560936, 123781432, 121638024, - 119426296, 117420384, 115986304, 115461520, 115986304, 117420384, - 119426296, 121638024, 123781432, 126560936, 128710328, 130294184, - 131434736, 132247360, 133110896, 133596016, 133868400, 134021376, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134531696, 134775520, 135207824, 135972192, 137315552, - 138559920, 140275120, 142598512, 145648128, 149426144, 152220016, - 155000416, 157436608, 159130592, 159740864, 159130592, 157436608, - 155000416, 152220016, 149426144, 145648128, 142598512, 140275120, - 138559920, 137315536, 135972192, 135207824, 134775504, 134531696, - 134217728}, - {134217728, 134745024, 135153936, 135877760, 137153824, 139385200, - 141439904, 144253616, 148033040, 152942128, 158949856, 163344976, - 167682224, 171454608, 174063344, 175000352, 174063344, 171454608, - 167682208, 163344976, 158949856, 152942128, 148033040, 144253632, - 141439904, 139385200, 137153824, 135877760, 135153936, 134745040, - 134217744}, - }, + + {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f, + 0.4887031913f, 0.4797717333f, 0.4712667167f, 0.4591555893f, + 0.4419712424f, 0.4178838134f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4178838134f, 0.4419712424f, 0.4591555893f, + 0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f, + 0.4964522421f, 0.4980079234f, 0.5000000000f}, + {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f, + 0.4894226193f, 0.4810712039f, 0.4731284380f, 0.4618354440f, + 0.4458500445f, 0.4235273004f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f, + 0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f, + 0.4966765046f, 0.4981336892f, 0.5000000000f}, + {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f, + 0.4905147851f, 0.4830409586f, 0.4759460390f, 0.4658817351f, + 0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f, + 0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f, + 0.4970174134f, 0.4983248413f, 0.5000000000f}, + {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f, + 0.4932425618f, 0.4879449904f, 0.4829386175f, 0.4758763313f, + 0.4659966528f, 0.4524453282f, 0.4346525371f, 0.4207023382f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4207023382f, + 0.4346525371f, 0.4524453282f, 0.4659966528f, 0.4758763313f, + 0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f, + 0.4978710711f, 0.4988038540f, 0.5000000000f}, + {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f, + 0.4958767295f, 0.4926598668f, 0.4896325469f, 0.4853836596f, + 0.4794833362f, 0.4714762270f, 0.4611217678f, 0.4531369507f, + 0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f, + 0.4320826530f, 0.4374250174f, 0.4448976219f, 0.4531369507f, + 0.4611217678f, 0.4714762270f, 0.4794833362f, 0.4853836596f, + 0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f, + 0.4986986518f, 0.4992685318f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f, + 0.5065358877f, 0.5115402937f, 0.5161759257f, 0.5225655437f, + 0.5312208533f, 0.5425815582f, 0.5566557646f, 0.5670637488f, + 0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f, + 0.5928076506f, 0.5864970684f, 0.5774215460f, 0.5670637488f, + 0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f, + 0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f, + 0.5020778775f, 0.5011696219f, 0.5000000000f}, + {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f, + 0.5109378099f, 0.5192503333f, 0.5269047022f, 0.5373865962f, + 0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f, + 0.6246649623f, 0.6387181878f, 0.6484364867f, 0.6519271135f, + 0.6484364867f, 0.6387181878f, 0.6246649027f, 0.6085074544f, + 0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f, + 0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f, + 0.5034876466f, 0.5019643903f, 0.5000000596f}}, { - {134217728, 133518624, 132972056, 131994936, 130241488, 127076656, - 124044168, 119691480, 113437856, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 113437856, 119691480, - 124044168, 127076656, 130241488, 131994936, 132972056, 133518624, - 134217728}, - {134217728, 133562760, 133050888, 132136072, 130495576, 127538336, - 124709592, 120658264, 114858008, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 114858008, 120658264, - 124709592, 127538336, 130495560, 132136072, 133050888, 133562760, - 134217728}, - {134217728, 133629896, 133170680, 132350456, 130881064, 128237360, - 125714928, 122114032, 116984936, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 116984936, 122114032, - 125714928, 128237360, 130881064, 132350456, 133170680, 133629896, - 134217728}, - {134217728, 133798056, 133470584, 132886472, 131842704, 129973568, - 128201072, 125690088, 122155288, 117261000, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 117261000, 122155288, 125690088, - 128201072, 129973568, 131842704, 132886456, 133470584, 133798056, - 134217728}, - {134217728, 133961128, 133761128, 133404840, 132769744, 131637408, - 130569696, 129067480, 126974144, 124119080, 120401016, 117512176, - 114509792, 111848104, 111848104, 111848104, 111848104, 111848104, - 114509792, 117512160, 120401008, 124119080, 126974144, 129067480, - 130569696, 131637424, 132769744, 133404840, 133761128, 133961128, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134627808, 134946048, 135509888, 136505536, 138251328, - 139864096, 142080384, 145070800, 148976736, 153787568, 157326848, - 160834672, 163897216, 166020960, 166784896, 166020960, 163897200, - 160834688, 157326848, 153787568, 148976736, 145070800, 142080384, - 139864096, 138251328, 136505536, 135509888, 134946048, 134627808, - 134217744}, - {134217728, 134906272, 135439648, 136382608, 138041424, 140931408, - 143581232, 147193280, 152017056, 158239216, 165794560, 171285200, - 176676288, 181345168, 184563696, 185717792, 184563696, 181345168, - 176676272, 171285200, 165794560, 158239216, 152017056, 147193280, - 143581216, 140931408, 138041424, 136382608, 135439648, 134906272, - 134217744}, - }, + + {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f, + 0.4851873517f, 0.4733974338f, 0.4621005356f, 0.4458855093f, + 0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f, + 0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f, + 0.4953595102f, 0.4973956347f, 0.5000000000f}, + {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f, + 0.4861339033f, 0.4751173258f, 0.4645794332f, 0.4494870603f, + 0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f, + 0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f, + 0.4956531823f, 0.4975600541f, 0.5000000000f}, + {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f, + 0.4875699580f, 0.4777213931f, 0.4683246017f, 0.4549102187f, + 0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f, + 0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f, + 0.4960994422f, 0.4978101552f, 0.5000000000f}, + {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f, + 0.4911523461f, 0.4841892719f, 0.4775862098f, 0.4682320654f, + 0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f, + 0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f, + 0.4972166717f, 0.4984366000f, 0.5000000000f}, + {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f, + 0.4946058393f, 0.4903875589f, 0.4864100218f, 0.4808138311f, + 0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f, + 0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4265822172f, 0.4377669096f, + 0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f, + 0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f, + 0.4982990324f, 0.4990440905f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f, + 0.5085227489f, 0.5150263309f, 0.5210343599f, 0.5292906761f, + 0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f, + 0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f, + 0.6184762716f, 0.6105646491f, 0.5991559029f, 0.5860881805f, + 0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f, + 0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f, + 0.5027132034f, 0.5015276670f, 0.5000000596f}, + {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f, + 0.5142443776f, 0.5250104070f, 0.5348817706f, 0.5483376980f, + 0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f, + 0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f, + 0.6875533462f, 0.6755633950f, 0.6581704021f, 0.6380870938f, + 0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f, + 0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f, + 0.5045520067f, 0.5025650263f, 0.5000000596f}}, { - {134217728, 133460856, 132868912, 131810120, 129908448, 126470312, - 123168472, 118415200, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 0, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 118415200, - 123168472, 126470312, 129908448, 131810120, 132868912, 133460856, - 134217728}, - {134217728, 133508664, 132954296, 131963096, 130184144, 126972336, - 123893664, 119472480, 113115264, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 113115272, 119472480, - 123893664, 126972336, 130184144, 131963096, 132954280, 133508664, - 134217728}, - {134217728, 133581352, 133084040, 132195432, 130602352, 127732136, - 124988584, 121062824, 115450448, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 115450448, 121062824, - 124988584, 127732136, 130602352, 132195432, 133084040, 133581352, - 134217728}, - {134217728, 133763416, 133408824, 132776176, 131645104, 129617688, - 127692704, 124961536, 121107872, 115753192, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 115753192, 121107872, 124961520, - 127692704, 129617688, 131645120, 132776176, 133408840, 133763416, - 134217728}, - {134217728, 133939968, 133723424, 133337648, 132649736, 131422568, - 130264576, 128633952, 126358808, 123250144, 119191232, 116028568, - 112732488, 111848104, 111848104, 111848104, 111848104, 111848104, - 112732488, 116028552, 119191232, 123250144, 126358808, 128633952, - 130264576, 131422568, 132649736, 133337648, 133723424, 133939968, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134661536, 135005888, 135615808, 136692320, 138578416, - 140319184, 142708880, 145929024, 150128080, 155290032, 159081232, - 162833824, 166106272, 168373648, 169188880, 168373648, 166106272, - 162833824, 159081248, 155290032, 150128080, 145929040, 142708880, - 140319168, 138578416, 136692320, 135615808, 135005872, 134661536, - 134217744}, - {134217744, 134962848, 135539840, 136559456, 138351760, 141470368, - 144325616, 148211728, 153391520, 160057728, 168132016, 173987488, - 179727840, 184692672, 188111936, 189337408, 188111936, 184692672, - 179727824, 173987488, 168132016, 160057728, 153391504, 148211728, - 144325616, 141470352, 138351744, 136559456, 135539840, 134962848, - 134217744}, - }, + + {0.5000000000f, 0.4971804321f, 0.4949752688f, 0.4910309613f, + 0.4839466810f, 0.4711386263f, 0.4588383138f, 0.4411309958f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.0000000000f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4411309958f, + 0.4588383138f, 0.4711386263f, 0.4839466810f, 0.4910309613f, + 0.4949752688f, 0.4971804321f, 0.5000000000f}, + {0.5000000000f, 0.4973585308f, 0.4952933490f, 0.4916008413f, + 0.4849737287f, 0.4730088115f, 0.4615398645f, 0.4450696707f, + 0.4213871956f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4213872254f, 0.4450696707f, + 0.4615398645f, 0.4730088115f, 0.4849737287f, 0.4916008413f, + 0.4952932894f, 0.4973585308f, 0.5000000000f}, + {0.5000000000f, 0.4976293147f, 0.4957766831f, 0.4924663603f, + 0.4865316749f, 0.4758392870f, 0.4656187594f, 0.4509941638f, + 0.4300864339f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4300864339f, 0.4509941638f, + 0.4656187594f, 0.4758392870f, 0.4865316749f, 0.4924663603f, + 0.4957766831f, 0.4976293147f, 0.5000000000f}, + {0.5000000000f, 0.4983075559f, 0.4969865978f, 0.4946298003f, + 0.4904162288f, 0.4828635156f, 0.4756923914f, 0.4655179977f, + 0.4511619806f, 0.4312142432f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4312142432f, 0.4511619806f, 0.4655179381f, + 0.4756923914f, 0.4828635156f, 0.4904162884f, 0.4946298003f, + 0.4969866574f, 0.4983075559f, 0.5000000000f}, + {0.5000000000f, 0.4989652634f, 0.4981585741f, 0.4967214465f, + 0.4941587746f, 0.4895872176f, 0.4852733612f, 0.4791988134f, + 0.4707232416f, 0.4591425657f, 0.4440219402f, 0.4322400987f, + 0.4199612439f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4199612439f, 0.4322400391f, + 0.4440219402f, 0.4591425657f, 0.4707232416f, 0.4791988134f, + 0.4852733612f, 0.4895872176f, 0.4941587746f, 0.4967214465f, + 0.4981585741f, 0.4989652634f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5016533136f, 0.5029361248f, 0.5052082539f, + 0.5092185736f, 0.5162448287f, 0.5227296948f, 0.5316320062f, + 0.5436279774f, 0.5592706800f, 0.5785004497f, 0.5926237702f, + 0.6066032648f, 0.6187940836f, 0.6272407174f, 0.6302776933f, + 0.6272407174f, 0.6187940836f, 0.6066032648f, 0.5926238298f, + 0.5785004497f, 0.5592706800f, 0.5436280370f, 0.5316320062f, + 0.5227296352f, 0.5162448287f, 0.5092185736f, 0.5052082539f, + 0.5029360652f, 0.5016533136f, 0.5000000596f}, + {0.5000000596f, 0.5027757883f, 0.5049252510f, 0.5087236166f, + 0.5154004693f, 0.5270181894f, 0.5376548171f, 0.5521317124f, + 0.5714279413f, 0.5962615013f, 0.6263405681f, 0.6481539011f, + 0.6695383787f, 0.6880338192f, 0.7007715702f, 0.7053368092f, + 0.7007715702f, 0.6880338192f, 0.6695383191f, 0.6481539011f, + 0.6263405681f, 0.5962615013f, 0.5714278817f, 0.5521317124f, + 0.5376548171f, 0.5270181298f, 0.5154004097f, 0.5087236166f, + 0.5049252510f, 0.5027757883f, 0.5000000596f}}, { - {134217728, 133518624, 132972056, 131994936, 130241488, 127076656, - 124044168, 119691480, 113437856, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 113437856, 119691480, - 124044168, 127076656, 130241488, 131994936, 132972056, 133518624, - 134217728}, - {134217728, 133562760, 133050888, 132136072, 130495576, 127538336, - 124709592, 120658264, 114858008, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 114858008, 120658264, - 124709592, 127538336, 130495560, 132136072, 133050888, 133562760, - 134217728}, - {134217728, 133629896, 133170680, 132350456, 130881064, 128237360, - 125714928, 122114032, 116984936, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 116984936, 122114032, - 125714928, 128237360, 130881064, 132350456, 133170680, 133629896, - 134217728}, - {134217728, 133798056, 133470584, 132886472, 131842704, 129973568, - 128201072, 125690088, 122155288, 117261000, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 117261000, 122155288, 125690088, - 128201072, 129973568, 131842704, 132886456, 133470584, 133798056, - 134217728}, - {134217728, 133961128, 133761128, 133404840, 132769744, 131637408, - 130569696, 129067480, 126974144, 124119080, 120401016, 117512176, - 114509792, 111848104, 111848104, 111848104, 111848104, 111848104, - 114509792, 117512160, 120401008, 124119080, 126974144, 129067480, - 130569696, 131637424, 132769744, 133404840, 133761128, 133961128, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134627808, 134946048, 135509888, 136505536, 138251328, - 139864096, 142080384, 145070800, 148976736, 153787568, 157326848, - 160834672, 163897216, 166020960, 166784896, 166020960, 163897200, - 160834688, 157326848, 153787568, 148976736, 145070800, 142080384, - 139864096, 138251328, 136505536, 135509888, 134946048, 134627808, - 134217744}, - {134217728, 134906272, 135439648, 136382608, 138041424, 140931408, - 143581232, 147193280, 152017056, 158239216, 165794560, 171285200, - 176676288, 181345168, 184563696, 185717792, 184563696, 181345168, - 176676272, 171285200, 165794560, 158239216, 152017056, 147193280, - 143581216, 140931408, 138041424, 136382608, 135439648, 134906272, - 134217744}, - }, + + {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f, + 0.4851873517f, 0.4733974338f, 0.4621005356f, 0.4458855093f, + 0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f, + 0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f, + 0.4953595102f, 0.4973956347f, 0.5000000000f}, + {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f, + 0.4861339033f, 0.4751173258f, 0.4645794332f, 0.4494870603f, + 0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f, + 0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f, + 0.4956531823f, 0.4975600541f, 0.5000000000f}, + {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f, + 0.4875699580f, 0.4777213931f, 0.4683246017f, 0.4549102187f, + 0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f, + 0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f, + 0.4960994422f, 0.4978101552f, 0.5000000000f}, + {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f, + 0.4911523461f, 0.4841892719f, 0.4775862098f, 0.4682320654f, + 0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f, + 0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f, + 0.4972166717f, 0.4984366000f, 0.5000000000f}, + {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f, + 0.4946058393f, 0.4903875589f, 0.4864100218f, 0.4808138311f, + 0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f, + 0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4265822172f, 0.4377669096f, + 0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f, + 0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f, + 0.4982990324f, 0.4990440905f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f, + 0.5085227489f, 0.5150263309f, 0.5210343599f, 0.5292906761f, + 0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f, + 0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f, + 0.6184762716f, 0.6105646491f, 0.5991559029f, 0.5860881805f, + 0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f, + 0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f, + 0.5027132034f, 0.5015276670f, 0.5000000596f}, + {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f, + 0.5142443776f, 0.5250104070f, 0.5348817706f, 0.5483376980f, + 0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f, + 0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f, + 0.6875533462f, 0.6755633950f, 0.6581704021f, 0.6380870938f, + 0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f, + 0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f, + 0.5045520067f, 0.5025650263f, 0.5000000596f}}, { - {134217728, 133682984, 133265384, 132519816, 131185264, 128787744, - 126504696, 123253640, 118640752, 112174824, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 112174824, 118640752, 123253640, - 126504696, 128787744, 131185264, 132519816, 133265384, 133682984, - 134217728}, - {134217728, 133716728, 133325584, 132627440, 131378384, 129136568, - 127004448, 123973008, 119681960, 113689736, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 113689744, 119681960, 123973008, - 127004448, 129136568, 131378376, 132627440, 133325584, 133716744, - 134217728}, - {134217728, 133768056, 133417096, 132790928, 131671560, 129665320, - 127760792, 125059176, 121248440, 115955928, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 115955928, 121248440, 125059176, - 127760792, 129665320, 131671560, 132790928, 133417096, 133768056, - 134217728}, - {134217728, 133896640, 133646248, 133200016, 132403792, 130981736, - 129637848, 127742080, 125090024, 121452368, 116676144, 112931424, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 112931424, 116676152, 121452360, 125090024, 127742080, - 129637848, 130981736, 132403792, 133200016, 133646248, 133896640, - 134217728}, - {134217728, 134021376, 133868400, 133596016, 133110896, 132247376, - 131434736, 130294184, 128710328, 126560928, 123781432, 121638024, - 119426296, 117420384, 115986304, 115461520, 115986304, 117420384, - 119426296, 121638024, 123781432, 126560928, 128710328, 130294184, - 131434736, 132247360, 133110896, 133596016, 133868400, 134021376, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134531696, 134775520, 135207824, 135972192, 137315552, - 138559920, 140275120, 142598512, 145648144, 149426144, 152220032, - 155000416, 157436608, 159130592, 159740864, 159130592, 157436608, - 155000416, 152220032, 149426144, 145648128, 142598512, 140275120, - 138559920, 137315536, 135972192, 135207824, 134775504, 134531696, - 134217728}, - {134217728, 134745024, 135153936, 135877760, 137153824, 139385200, - 141439904, 144253632, 148033040, 152942128, 158949856, 163344976, - 167682224, 171454624, 174063344, 175000352, 174063344, 171454624, - 167682224, 163344976, 158949856, 152942128, 148033040, 144253632, - 141439904, 139385200, 137153824, 135877760, 135153936, 134745040, - 134217744}, - }, + + {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f, + 0.4887031913f, 0.4797717333f, 0.4712667167f, 0.4591555893f, + 0.4419712424f, 0.4178837836f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4178837836f, 0.4419712424f, 0.4591555893f, + 0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f, + 0.4964522421f, 0.4980079234f, 0.5000000000f}, + {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f, + 0.4894226193f, 0.4810712039f, 0.4731284380f, 0.4618354440f, + 0.4458500445f, 0.4235272706f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f, + 0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f, + 0.4966765046f, 0.4981336892f, 0.5000000000f}, + {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f, + 0.4905147851f, 0.4830409586f, 0.4759460390f, 0.4658817351f, + 0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f, + 0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f, + 0.4970174134f, 0.4983248413f, 0.5000000000f}, + {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f, + 0.4932425618f, 0.4879449904f, 0.4829386175f, 0.4758763313f, + 0.4659966528f, 0.4524453282f, 0.4346525073f, 0.4207023382f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4207023382f, + 0.4346525371f, 0.4524452984f, 0.4659966528f, 0.4758763313f, + 0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f, + 0.4978710711f, 0.4988038540f, 0.5000000000f}, + {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f, + 0.4958767295f, 0.4926598668f, 0.4896325469f, 0.4853836596f, + 0.4794833362f, 0.4714761972f, 0.4611217678f, 0.4531369507f, + 0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f, + 0.4320826530f, 0.4374250174f, 0.4448976219f, 0.4531369507f, + 0.4611217678f, 0.4714761972f, 0.4794833362f, 0.4853836596f, + 0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f, + 0.4986986518f, 0.4992685318f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f, + 0.5065358877f, 0.5115402937f, 0.5161759257f, 0.5225655437f, + 0.5312208533f, 0.5425816178f, 0.5566557646f, 0.5670638084f, + 0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f, + 0.5928076506f, 0.5864970684f, 0.5774215460f, 0.5670638084f, + 0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f, + 0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f, + 0.5020778775f, 0.5011696219f, 0.5000000000f}, + {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f, + 0.5109378099f, 0.5192503333f, 0.5269047022f, 0.5373866558f, + 0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f, + 0.6246649623f, 0.6387182474f, 0.6484364867f, 0.6519271135f, + 0.6484364867f, 0.6387182474f, 0.6246649623f, 0.6085074544f, + 0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f, + 0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f, + 0.5034876466f, 0.5019643903f, 0.5000000596f}}, { - {134217728, 133928592, 133703168, 133301512, 132585192, 131306928, - 130100248, 128400288, 126026792, 122780488, 118535792, 115223136, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 115223136, 118535792, 122780488, 126026792, 128400288, - 130100248, 131306912, 132585176, 133301512, 133703168, 133928592, - 134217728}, - {134217728, 133946816, 133735640, 133359432, 132688632, 131492208, - 130363488, 128774544, 126558464, 123532296, 119584464, 116511232, - 113311288, 111848104, 111848104, 111848104, 111848104, 111848104, - 113311272, 116511232, 119584464, 123532296, 126558464, 128774544, - 130363488, 131492208, 132688632, 133359416, 133735640, 133946816, - 134217728}, - {134217728, 133974552, 133785016, 133447456, 132845800, 131773512, - 130762848, 129341696, 127362856, 124667064, 121162048, 118443504, - 115622880, 113050192, 111848104, 111848104, 111848104, 113050192, - 115622872, 118443504, 121162064, 124667064, 127362856, 129341696, - 130762848, 131773512, 132845800, 133447456, 133785016, 133974552, - 134217728}, - {134217728, 134044048, 133908744, 133667912, 133239096, 132476240, - 131758880, 130752952, 129357832, 127467976, 125030208, 123155288, - 121225328, 119479320, 118233720, 117778464, 118233720, 119479320, - 121225328, 123155288, 125030208, 127467976, 129357832, 130752952, - 131758880, 132476240, 133239096, 133667912, 133908760, 134044048, - 134217728}, - {134217728, 134111512, 134028776, 133881624, 133619856, 133154992, - 132718832, 132108784, 131265840, 130129840, 128674776, 127563760, - 126427688, 125406704, 124682360, 124418464, 124682360, 125406704, - 126427688, 127563760, 128674776, 130129840, 131265840, 132108784, - 132718832, 133154992, 133619856, 133881608, 134028776, 134111512, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134387728, 134519888, 134754464, 135170064, 135903024, - 136584848, 137529104, 138816208, 140519312, 142649904, 144239712, - 145833408, 147238976, 148221248, 148576080, 148221264, 147238976, - 145833408, 144239712, 142649920, 140519312, 138816208, 137529088, - 136584848, 135903024, 135170064, 134754464, 134519888, 134387744, - 134217728}, - {134217728, 134503360, 134725216, 135118656, 135814608, 137038528, - 138173216, 139738624, 141861664, 144652528, 148116256, 150681936, - 153238592, 155481344, 157042224, 157604816, 157042224, 155481344, - 153238592, 150681936, 148116256, 144652528, 141861648, 139738624, - 138173216, 137038544, 135814624, 135118656, 134725200, 134503360, - 134217728}, - }, + + {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f, + 0.4939183295f, 0.4891564250f, 0.4846611917f, 0.4783283472f, + 0.4694863856f, 0.4573929608f, 0.4415802360f, 0.4292396307f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4292396307f, + 0.4415802360f, 0.4573929608f, 0.4694863856f, 0.4783283472f, + 0.4846611917f, 0.4891563654f, 0.4939182699f, 0.4965868294f, + 0.4980831146f, 0.4989228845f, 0.5000000000f}, + {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f, + 0.4943036735f, 0.4898466468f, 0.4856418371f, 0.4797225595f, + 0.4714670181f, 0.4601936638f, 0.4454868436f, 0.4340381622f, + 0.4221174419f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4221173823f, 0.4340381622f, + 0.4454868436f, 0.4601936638f, 0.4714670181f, 0.4797225595f, + 0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025386f, + 0.4982040823f, 0.4989907742f, 0.5000000000f}, + {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f, + 0.4948891699f, 0.4908945858f, 0.4871295691f, 0.4818353653f, + 0.4744636118f, 0.4644210041f, 0.4513638020f, 0.4412364364f, + 0.4307287931f, 0.4211447835f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4211447835f, 0.4307287633f, 0.4412364364f, + 0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f, + 0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f, + 0.4983880222f, 0.4990940988f, 0.5000000000f}, + {0.5000000000f, 0.4993529916f, 0.4988489449f, 0.4979517758f, + 0.4963543117f, 0.4935124516f, 0.4908400774f, 0.4870927036f, + 0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f, + 0.4515995383f, 0.4450951517f, 0.4404549301f, 0.4387589693f, + 0.4404549301f, 0.4450951517f, 0.4515995383f, 0.4587891996f, + 0.4657738209f, 0.4748552144f, 0.4818954766f, 0.4870927036f, + 0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f, + 0.4988490045f, 0.4993529916f, 0.5000000000f}, + {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f, + 0.4977727532f, 0.4960409999f, 0.4944161773f, 0.4921435714f, + 0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f, + 0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634948969f, + 0.4644779861f, 0.4671763778f, 0.4709798396f, 0.4752120376f, + 0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f, + 0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f, + 0.4992960989f, 0.4996043146f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f, + 0.5035477281f, 0.5062782168f, 0.5088182092f, 0.5123358369f, + 0.5171306729f, 0.5234752297f, 0.5314123034f, 0.5373347998f, + 0.5432717800f, 0.5485079288f, 0.5521671772f, 0.5534890294f, + 0.5521672368f, 0.5485079288f, 0.5432717800f, 0.5373347998f, + 0.5314123631f, 0.5234752297f, 0.5171306729f, 0.5123357773f, + 0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f, + 0.5011256337f, 0.5006333590f, 0.5000000000f}, + {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f, + 0.5059488416f, 0.5105082989f, 0.5147353411f, 0.5205669403f, + 0.5284758806f, 0.5388726592f, 0.5517760515f, 0.5613339543f, + 0.5708582401f, 0.5792131424f, 0.5850278735f, 0.5871236920f, + 0.5850278735f, 0.5792131424f, 0.5708582401f, 0.5613339543f, + 0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f, + 0.5147353411f, 0.5105083585f, 0.5059489012f, 0.5033562183f, + 0.5018904805f, 0.5010640621f, 0.5000000000f}}, { - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - }, + + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}}, { - {134217728, 134506240, 134730320, 135127728, 135830656, 137066736, - 138212592, 139793296, 141936768, 144754096, 148250000, 150839072, - 153418688, 155681312, 157255888, 157823360, 157255888, 155681312, - 153418688, 150839072, 148250000, 144754096, 141936768, 139793296, - 138212592, 137066736, 135830656, 135127728, 134730320, 134506240, - 134217728}, - {134217728, 134488080, 134698096, 135070576, 135729600, 136888992, - 137964336, 139448608, 141462896, 144113040, 147405392, 149846352, - 152280496, 154417184, 155904992, 156441360, 155904992, 154417184, - 152280496, 149846352, 147405392, 144113056, 141462896, 139448592, - 137964336, 136888992, 135729600, 135070592, 134698096, 134488080, - 134217728}, - {134217728, 134460464, 134649040, 134983616, 135575776, 136618224, - 137585888, 138922720, 140739120, 143132528, 146111456, 148323744, - 150532880, 152474432, 153827616, 154315712, 153827616, 152474432, - 150532880, 148323744, 146111456, 143132528, 140739104, 138922720, - 137585872, 136618224, 135575776, 134983616, 134649040, 134460464, - 134217728}, - {134217728, 134391168, 134526000, 134765312, 135189280, 135936912, - 136632336, 137595280, 138907696, 140643920, 142815424, 144435360, - 146058944, 147490640, 148491024, 148852384, 148491024, 147490640, - 146058944, 144435360, 142815424, 140643920, 138907696, 137595280, - 136632320, 135936912, 135189264, 134765312, 134526000, 134391168, - 134217728}, - {134217728, 134323872, 134406416, 134552992, 134812944, 135272112, - 135700080, 136294032, 137106080, 138184736, 139540672, 140557056, - 141579792, 142484928, 143119200, 143348672, 143119200, 142484928, - 141579792, 140557056, 139540672, 138184736, 137106080, 136294032, - 135700080, 135272112, 134812944, 134552992, 134406416, 134323872, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 134047496, 133914896, 133678832, 133258584, 132511008, - 131808096, 130822576, 129456008, 127605336, 125219000, 123384360, - 121496560, 119789320, 118571720, 118126808, 118571736, 119789320, - 121496560, 123384360, 125219000, 127605336, 129456008, 130822576, - 131808096, 132511008, 133258584, 133678848, 133914896, 134047496, - 134217728}, - {134217728, 133931488, 133708328, 133310696, 132601600, 131336352, - 130142072, 128459768, 126111336, 122900128, 118702864, 115428552, - 112012200, 111848104, 111848104, 111848104, 111848104, 111848104, - 112012200, 115428552, 118702864, 122900128, 126111336, 128459768, - 130142072, 131336352, 132601616, 133310696, 133708328, 133931488, - 134217728}, - }, + + {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f, + 0.5060086250f, 0.5106133819f, 0.5148820281f, 0.5207706094f, + 0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f, + 0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879378319f, + 0.5858238339f, 0.5799580812f, 0.5715291500f, 0.5619193316f, + 0.5522742867f, 0.5392510295f, 0.5287556648f, 0.5207706094f, + 0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f, + 0.5019095540f, 0.5010747910f, 0.5000000000f}, + {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f, + 0.5056321621f, 0.5099512339f, 0.5139572024f, 0.5194865465f, + 0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f, + 0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f, + 0.5807913542f, 0.5752488375f, 0.5672890544f, 0.5582211614f, + 0.5491278768f, 0.5368629694f, 0.5269903541f, 0.5194864869f, + 0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771660f, + 0.5017895103f, 0.5010071397f, 0.5000000000f}, + {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f, + 0.5050591230f, 0.5089425445f, 0.5125473738f, 0.5175274611f, + 0.5242940784f, 0.5332102180f, 0.5443075895f, 0.5525490046f, + 0.5607786775f, 0.5680115223f, 0.5730525255f, 0.5748708248f, + 0.5730525255f, 0.5680115223f, 0.5607786775f, 0.5525490046f, + 0.5443075895f, 0.5332102180f, 0.5242940187f, 0.5175274611f, + 0.5125473142f, 0.5089425445f, 0.5050591230f, 0.5028531551f, + 0.5016067624f, 0.5009042621f, 0.5000000000f}, + {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f, + 0.5036193132f, 0.5064044595f, 0.5089951158f, 0.5125823617f, + 0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f, + 0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545183420f, + 0.5531721711f, 0.5494454503f, 0.5441119671f, 0.5380636454f, + 0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f, + 0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f, + 0.5011484027f, 0.5006461143f, 0.5000000000f}, + {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f, + 0.5022173524f, 0.5039278865f, 0.5055221915f, 0.5077348351f, + 0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f, + 0.5274258256f, 0.5307977200f, 0.5331605673f, 0.5340154171f, + 0.5331605673f, 0.5307977200f, 0.5274258256f, 0.5236158371f, + 0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f, + 0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f, + 0.5007029176f, 0.5003954172f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f, + 0.4964269102f, 0.4936419725f, 0.4910234213f, 0.4873520732f, + 0.4822612107f, 0.4753669202f, 0.4664771259f, 0.4596425593f, + 0.4526099563f, 0.4462499917f, 0.4417140782f, 0.4400566518f, + 0.4417141378f, 0.4462499917f, 0.4526099563f, 0.4596425593f, + 0.4664771259f, 0.4753669202f, 0.4822612107f, 0.4873520732f, + 0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f, + 0.4988718629f, 0.4993658364f, 0.5000000000f}, + {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f, + 0.4939794540f, 0.4892660379f, 0.4848169982f, 0.4785499275f, + 0.4698013365f, 0.4578386545f, 0.4422026277f, 0.4300048649f, + 0.4172779620f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4172779620f, 0.4300048649f, + 0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f, + 0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f, + 0.4981023371f, 0.4989336729f, 0.5000000000f}}, { - {134217728, 134750352, 135163360, 135894416, 137183168, 139436416, - 141510976, 144351440, 148166016, 153119584, 159180064, 163612720, - 167986224, 171789568, 174419376, 175363904, 174419392, 171789552, - 167986224, 163612736, 159180064, 153119584, 148166016, 144351440, - 141510976, 139436416, 137183168, 135894416, 135163360, 134750352, - 134217744}, - {134217728, 134716864, 135103984, 135789392, 136998240, 139113424, - 141062640, 143734096, 147326256, 151998160, 157724080, 161918432, - 166061616, 169668288, 172163984, 173060688, 172163968, 169668288, - 166061616, 161918432, 157724080, 151998160, 147326256, 143734096, - 141062640, 139113424, 136998240, 135789392, 135103984, 134716864, - 134217744}, - {134217728, 134665904, 135013632, 135629504, 136716496, 138620704, - 140377968, 142790048, 146039760, 150276480, 155483472, 159306928, - 163090832, 166390080, 168675792, 169497600, 168675792, 166390080, - 163090832, 159306944, 155483488, 150276480, 146039760, 142790048, - 140377968, 138620704, 136716496, 135629504, 135013616, 134665904, - 134217744}, - {134217728, 134538048, 134786784, 135227776, 136007472, 137377520, - 138646400, 140395008, 142763040, 145870208, 149717968, 152562416, - 155392320, 157871248, 159594640, 160215424, 159594624, 157871248, - 155392320, 152562416, 149717968, 145870208, 142763040, 140395008, - 138646400, 137377520, 136007472, 135227776, 134786768, 134538048, - 134217728}, - {134217728, 134413792, 134566144, 134836576, 135315504, 136159568, - 136944176, 138029792, 139507872, 141460704, 143899120, 145715424, - 147533568, 149135008, 150253024, 150656672, 150253024, 149135008, - 147533568, 145715424, 143899120, 141460688, 139507872, 138029792, - 136944176, 136159584, 135315504, 134836576, 134566160, 134413792, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 133903024, 133657608, 133220288, 132440008, 131046696, - 129730280, 127873712, 125277552, 121718608, 117049664, 113392528, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 113392528, 117049680, 121718608, 125277552, 127873712, - 129730280, 131046696, 132440024, 133220288, 133657624, 133903024, - 134217728}, - {134217728, 133688336, 133274944, 132536912, 131215936, 128843168, - 126584160, 123368104, 118806640, 112416656, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 112416656, 118806640, 123368104, - 126584160, 128843168, 131215952, 132536912, 133274944, 133688336, - 134217728}, - }, + + {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f, + 0.5110471249f, 0.5194411278f, 0.5271694660f, 0.5377510190f, + 0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095048785f, + 0.6257974505f, 0.6399660110f, 0.6497628093f, 0.6532814503f, + 0.6497628689f, 0.6399659514f, 0.6257974505f, 0.6095049381f, + 0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f, + 0.5271694660f, 0.5194411278f, 0.5110471249f, 0.5062461495f, + 0.5035227537f, 0.5019841790f, 0.5000000596f}, + {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f, + 0.5103582144f, 0.5182378888f, 0.5254992843f, 0.5354512334f, + 0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f, + 0.6186277270f, 0.6320636272f, 0.6413608193f, 0.6447013021f, + 0.6413607597f, 0.6320636272f, 0.6186277270f, 0.6031931639f, + 0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f, + 0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f, + 0.5033015609f, 0.5018594265f, 0.5000000596f}, + {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f, + 0.5093086362f, 0.5164023638f, 0.5229486823f, 0.5319343805f, + 0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934645534f, + 0.6075606942f, 0.6198513508f, 0.6283662915f, 0.6314277649f, + 0.6283662915f, 0.6198513508f, 0.6075606942f, 0.5934646130f, + 0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f, + 0.5229486823f, 0.5164023638f, 0.5093086362f, 0.5052592754f, + 0.5029649138f, 0.5016695857f, 0.5000000596f}, + {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f, + 0.5066673160f, 0.5117711425f, 0.5164980888f, 0.5230121613f, + 0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f, + 0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f, + 0.5945363045f, 0.5881162286f, 0.5788815022f, 0.5683392882f, + 0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f, + 0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f, + 0.5021198392f, 0.5011932850f, 0.5000000000f}, + {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f, + 0.5040895343f, 0.5072339177f, 0.5101568103f, 0.5142010450f, + 0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f, + 0.5496053696f, 0.5555711985f, 0.5597361326f, 0.5612398386f, + 0.5597361326f, 0.5555711985f, 0.5496053696f, 0.5428322554f, + 0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f, + 0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f, + 0.5012980103f, 0.5007303953f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f, + 0.4933774769f, 0.4881869853f, 0.4832829535f, 0.4763666987f, + 0.4666952491f, 0.4534371495f, 0.4360439777f, 0.4224200845f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4224200845f, + 0.4360440373f, 0.4534371495f, 0.4666952491f, 0.4763666987f, + 0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f, + 0.4979134500f, 0.4988276362f, 0.5000000000f}, + {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f, + 0.4888174534f, 0.4799782038f, 0.4715627432f, 0.4595820010f, + 0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4187846780f, 0.4425892234f, 0.4595820010f, + 0.4715627432f, 0.4799782038f, 0.4888175130f, 0.4937384725f, + 0.4964878559f, 0.4980278611f, 0.5000000000f}}, { - {134217728, 134913216, 135451936, 136404304, 138079504, 140997600, - 143672688, 147318512, 152186224, 158463280, 166082896, 171618768, - 177053216, 181758880, 185002352, 186165344, 185002352, 181758896, - 177053216, 171618768, 166082896, 158463296, 152186224, 147318512, - 143672688, 140997600, 138079504, 136404304, 135451936, 134913216, - 134217744}, - {134217728, 134869504, 135374512, 136267584, 137839408, 140580112, - 143095472, 146527744, 151117280, 157046336, 164257936, 169506256, - 174664912, 179136576, 182221168, 183327616, 182221168, 179136560, - 174664928, 169506256, 164257936, 157046336, 151117296, 146527744, - 143095472, 140580112, 137839408, 136267584, 135374512, 134869504, - 134217744}, - {134217728, 134802992, 135256672, 136059376, 137473424, 139942768, - 142213056, 145316768, 149476832, 154866368, 161442736, 166241776, - 170968496, 175072880, 177907744, 178925312, 177907760, 175072880, - 170968496, 166241776, 161442736, 154866368, 149476832, 145316768, - 142213056, 139942768, 137473424, 136059376, 135256672, 134802992, - 134217744}, - {134217728, 134636080, 134960736, 135535920, 136551440, 138331744, - 139976000, 142235024, 145282080, 149260352, 154157968, 157759584, - 161328032, 164442560, 166601920, 167378576, 166601920, 164442544, - 161328032, 157759584, 154157968, 149260368, 145282080, 142235024, - 139976016, 138331728, 136551456, 135535920, 134960736, 134636096, - 134217744}, - {134217728, 134473824, 134672800, 135025728, 135650240, 136749360, - 137769200, 139177520, 141089920, 143607984, 146739200, 149062688, - 151381328, 153417872, 154836624, 155348256, 154836640, 153417872, - 151381328, 149062688, 146739200, 143607984, 141089920, 139177520, - 137769200, 136749360, 135650256, 135025712, 134672784, 134473824, - 134217728}, - {134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728, 134217728, 134217728, 134217728, 134217728, 134217728, - 134217728}, - {134217728, 133806400, 133485440, 132913000, 131890240, 130059096, - 128323168, 125864856, 122406120, 117621128, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 117621120, 122406120, 125864856, - 128323168, 130059096, 131890240, 132913000, 133485440, 133806400, - 134217728}, - {134217728, 133525632, 132984568, 132017344, 130281848, 127150040, - 124150024, 119845456, 113664464, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 111848104, 111848104, - 111848104, 111848104, 111848104, 111848104, 113664464, 119845456, - 124150024, 127150040, 130281848, 132017344, 132984568, 133525632, - 134217728}, - }, -}; + + {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f, + 0.5143862367f, 0.5252569914f, 0.5352224708f, 0.5488042235f, + 0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f, + 0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935199499f, + 0.6891874671f, 0.6771046519f, 0.6595746279f, 0.6393297315f, + 0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f, + 0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f, + 0.5045977831f, 0.5025908947f, 0.5000000596f}, + {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f, + 0.5134918094f, 0.5237017274f, 0.5330721736f, 0.5458583832f, + 0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f, + 0.6506775022f, 0.6673357487f, 0.6788267493f, 0.6829485893f, + 0.6788267493f, 0.6673356891f, 0.6506775618f, 0.6314600110f, + 0.6119084954f, 0.5850431919f, 0.5629557967f, 0.5458583832f, + 0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f, + 0.5043093562f, 0.5024280548f, 0.5000000596f}, + {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f, + 0.5121284127f, 0.5213274360f, 0.5297849178f, 0.5413471460f, + 0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988753f, + 0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f, + 0.6627580523f, 0.6521973014f, 0.6369072795f, 0.6192988753f, + 0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f, + 0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f, + 0.5038703680f, 0.5021802783f, 0.5000000596f}, + {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f, + 0.5086937547f, 0.5153259039f, 0.5214512348f, 0.5298667550f, + 0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f, + 0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f, + 0.6206405163f, 0.6125962138f, 0.6009937525f, 0.5877002478f, + 0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f, + 0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f, + 0.5027679205f, 0.5015585423f, 0.5000000596f}, + {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f, + 0.5053365231f, 0.5094310641f, 0.5132302642f, 0.5184766650f, + 0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f, + 0.5639393926f, 0.5715261102f, 0.5768113732f, 0.5787173510f, + 0.5768114328f, 0.5715261102f, 0.5639393926f, 0.5553017855f, + 0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f, + 0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f, + 0.5016952157f, 0.5009540319f, 0.5000000000f}, + {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, + 0.5000000000f, 0.5000000000f, 0.5000000000f}, + {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f, + 0.4913294315f, 0.4845078886f, 0.4780410528f, 0.4688831270f, + 0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4381728172f, 0.4559983313f, 0.4688831270f, + 0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f, + 0.4972720146f, 0.4984676838f, 0.5000000000f}, + {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f, + 0.4853377044f, 0.4736708105f, 0.4624948800f, 0.4464591146f, + 0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, + 0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f, + 0.4624948800f, 0.4736708105f, 0.4853377044f, 0.4918029308f, + 0.4954061210f, 0.4974217415f, 0.5000000000f}}}; const WORD32 ixheaacd_atan_table_Q28[16][8][31] = { { @@ -4546,384 +5833,307 @@ const WORD32 ixheaacd_atan_table_Q28[16][8][31] = { -3}, }}; -const WORD32 ixheaacd_c_l_table_Q31[31] = { - 68, 12075997, 21473763, 38182223, 67875466, 120571390, - 170045077, 239449100, 336157459, 469148859, 647490682, 794298694, - 962206904, 1145934076, 1335698887, 1518500250, 1681545272, 1816183116, - 1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347, - 2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694, - 2147483647}; +const FLOAT32 ixheaacd_c_l_table[31] = { + 0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f, + 0.0561454296f, 0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f, + 0.3015113473f, 0.3698741496f, 0.4480625093f, 0.5336171389f, 0.6219832897f, + 0.7071067691f, 0.7830305099f, 0.8457261920f, 0.8940022588f, 0.9290818572f, + 0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f, 0.9968600869f, + 0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f, + 1.0000000000f}; -const WORD32 ixheaacd_sin_table_Q31[8][31] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {750179061, 746245580, 743210706, 737870331, 728548620, 712505595, - 697979429, 678386783, 652421439, 618809885, 576615606, 543587743, - 506876195, 466993926, 424737371, 381140538, 337380886, 294653248, - 254039878, 216406178, 182341865, 138534277, 103401830, 76116249, - 55442477, 40067134, 23038730, 13121396, 7432107, 4196447, - 24}, - {1161262961, 1155790434, 1151559607, 1144096867, 1131016382, 1108345689, - 1087649071, 1059486043, 1021740286, 972201548, 909011376, 858841310, - 802424715, 740453756, 674139243, 605156167, 535487835, 467194735, - 402165023, 341910884, 287454637, 217648816, 161934922, 118876289, - 86395037, 62326858, 35765878, 20345239, 11515596, 6499487, - 37}, - {1716503346, 1710705303, 1706196326, 1698186767, 1683975371, 1658827737, - 1635302807, 1602433676, 1556860619, 1494490287, 1410930784, 1341611885, - 1260794215, 1168902519, 1067487796, 959278806, 847935697, 737527629, - 631893965, 534105311, 446175490, 334574700, 246745780, 179796016, - 129896719, 93282739, 53251977, 30198506, 17061963, 9620003, - 54}, - {1997091453, 1992944085, 1989690856, 1983852214, 1973306896, 1954076825, - 1935447004, 1908416859, 1869093029, 1812001456, 1730062329, 1657802892, - 1569207783, 1463537141, 1341868672, 1207527592, 1065884173, 923429508, - 786466908, 659983219, 547093745, 405656596, 296231282, 214127893, - 153738020, 109885815, 62401443, 35278435, 19896909, 11207148, - 63}, - {2147483647, 2147449694, 2147376282, 2147144182, 2146410711, 2144096210, - 2140740687, 2134092347, 2121010179, 2095610977, 2047545319, 1995188112, - 1919855175, 1816183116, 1681545272, 1518500250, 1335698887, 1145934076, - 962206904, 794298694, 647490682, 469148859, 336157459, 239449100, - 170045077, 120571390, 67875466, 38182223, 21473763, 12075997, - 68}, - {1735452507, 1741201627, 1745677174, 1753637197, 1767790913, 1792923770, - 1816518097, 1849561983, 1895318984, 1957003931, 2034703322, 2089967744, - 2134916861, 2144595142, 2081353083, 1914153740, 1653277521, 1353148056, - 1069993076, 832031145, 643429686, 438118607, 300387816, 207524268, - 144291161, 100823513, 55902457, 31184569, 17456772, 9791496, - 55}, - {302939858, 304635714, 305968630, 308367663, 312727041, 320788003, - 328771547, 340741324, 359192238, 388879484, 440075553, 497870534, - 595446097, 785304289, 1255861595, 2142108211, 997566324, 495493509, - 298429982, 198205829, 139164109, 87059272, 56928133, 38231805, - 26115252, 18039235, 9889297, 5483639, 3059686, 1713093, - 10}}; +const FLOAT32 ixheaacd_sin_table[8][31] = { + {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, + 0.0000000000f}, + {0.3493293524f, 0.3474976718f, 0.3460844457f, 0.3435976505f, 0.3392568827f, + 0.3317862749f, 0.3250220120f, 0.3158984482f, 0.3038074076f, 0.2881557941f, + 0.2685075700f, 0.2531277537f, 0.2360326201f, 0.2174609900f, 0.1977837533f, + 0.1774823964f, 0.1571052223f, 0.1372086108f, 0.1182965338f, 0.1007719785f, + 0.0849095508f, 0.0645100474f, 0.0481502302f, 0.0354443900f, 0.0258174147f, + 0.0186577141f, 0.0107282447f, 0.0061101262f, 0.0034608445f, 0.0019541229f, + 0.0000000112f}, + {0.5407552123f, 0.5382068753f, 0.5362367034f, 0.5327616334f, 0.5266705155f, + 0.5161136985f, 0.5064760447f, 0.4933616221f, 0.4757848978f, 0.4527166188f, + 0.4232914150f, 0.3999291360f, 0.3736581206f, 0.3448006511f, 0.3139205575f, + 0.2817977965f, 0.2493559569f, 0.2175544947f, 0.1872726828f, 0.1592146605f, + 0.1338564903f, 0.1013506278f, 0.0754068270f, 0.0553560853f, 0.0402308255f, + 0.0290232040f, 0.0166547857f, 0.0094739906f, 0.0053623673f, 0.0030265595f, + 0.0000000172f}, + {0.7993091345f, 0.7966092229f, 0.7945095897f, 0.7907798290f, 0.7841621637f, + 0.7724518776f, 0.7614971995f, 0.7461913228f, 0.7249697447f, 0.6959262490f, + 0.6570158601f, 0.6247367263f, 0.5871030688f, 0.5443126559f, 0.4970877469f, + 0.4466989934f, 0.3948508203f, 0.3434380591f, 0.2942485511f, 0.2487121671f, + 0.2077666521f, 0.1557984799f, 0.1148999557f, 0.0837240443f, 0.0604878739f, + 0.0434381589f, 0.0247973837f, 0.0140622752f, 0.0079450961f, 0.0044796630f, + 0.0000000251f}, + {0.9299681783f, 0.9280369282f, 0.9265220165f, 0.9238031507f, 0.9188926220f, + 0.9099379182f, 0.9012627602f, 0.8886758685f, 0.8703642488f, 0.8437789083f, + 0.8056230545f, 0.7719746232f, 0.7307193279f, 0.6815125942f, 0.6248562932f, + 0.5622988343f, 0.4963409901f, 0.4300053716f, 0.3662271798f, 0.3073286414f, + 0.2547603846f, 0.1888985783f, 0.1379434466f, 0.0997110680f, 0.0715898424f, + 0.0511695705f, 0.0290579367f, 0.0164278019f, 0.0092652198f, 0.0052187350f, + 0.0000000293f}, + {1.0000000000f, 0.9999842048f, 0.9999499917f, 0.9998419285f, 0.9995003939f, + 0.9984226227f, 0.9968600869f, 0.9937641621f, 0.9876723289f, 0.9758449197f, + 0.9534626007f, 0.9290818572f, 0.8940022588f, 0.8457261920f, 0.7830305099f, + 0.7071067691f, 0.6219832897f, 0.5336171389f, 0.4480625093f, 0.3698741496f, + 0.3015113473f, 0.2184644639f, 0.1565355211f, 0.1115021780f, 0.0791834071f, + 0.0561454296f, 0.0316069759f, 0.0177799836f, 0.0099995006f, 0.0056233243f, + 0.0000000317f}, + {0.8081330657f, 0.8108102083f, 0.8128942847f, 0.8166009784f, 0.8231918216f, + 0.8348951936f, 0.8458821774f, 0.8612694144f, 0.8825767040f, 0.9113009572f, + 0.9474825859f, 0.9732170701f, 0.9941481352f, 0.9986549616f, 0.9692055583f, + 0.8913472891f, 0.7698673606f, 0.6301086545f, 0.4982543588f, 0.3874447048f, + 0.2996203005f, 0.2040148675f, 0.1398789734f, 0.0966360196f, 0.0671908110f, + 0.0469496064f, 0.0260316096f, 0.0145214461f, 0.0081289429f, 0.0045595206f, + 0.0000000256f}, + {0.1410673708f, 0.1418570578f, 0.1424777508f, 0.1435948759f, 0.1456248760f, + 0.1493785530f, 0.1530961841f, 0.1586700380f, 0.1672619134f, 0.1810861230f, + 0.2049261481f, 0.2318390310f, 0.2772761881f, 0.3656858206f, 0.5848061442f, + 0.9974968433f, 0.4645280242f, 0.2307321429f, 0.1389672905f, 0.0922967792f, + 0.0648033395f, 0.0405401327f, 0.0265092272f, 0.0178030711f, 0.0121608619f, + 0.0084001739f, 0.0046050628f, 0.0025535184f, 0.0014247773f, 0.0007977211f, + 0.0000000047f}}; -const WORD32 ixheaacd_cos_table_Q31[8][31] = { - {2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647, - 2147483647}, - {2012192186, 2013654279, 2014776381, 2016738305, 2020124483, 2025838542, - 2030889149, 2037517458, 2045979541, 2056394987, 2068622842, 2077546241, - 2086806781, 2096092243, 2105061563, 2113390146, 2120815918, 2127173120, - 2132404689, 2136551985, 2139728362, 2143010563, 2144992793, 2146134277, - 2146767838, 2147109835, 2147360062, 2147443561, 2147470787, 2147479548, - 2147483647}, - {1806420315, 1809926653, 1812621442, 1817341018, 1825510329, 1839362893, - 1851676407, 1867933442, 1888844304, 1914813351, 1945606419, 1968267671, - 1991933883, 2015791223, 2038926752, 2060454327, 2079648720, 2096047494, - 2109490297, 2120090320, 2128157854, 2136425756, 2141369445, 2144190861, - 2145745072, 2146578995, 2147185791, 2147387271, 2147452772, 2147473812, - 2147483647}, - {1290465917, 1298142282, 1304062927, 1314476217, 1332633846, 1363809575, - 1391930582, 1429647625, 1479145371, 1542136441, 1618938029, 1676831408, - 1738414210, 1801486309, 1863372164, 1921319908, 1972990388, 2016863658, - 2052412248, 2080004215, 2100622158, 2121260425, 2133261010, 2139943787, - 2143551460, 2145456676, 2146823292, 2147271308, 2147415867, 2147462101, - 2147483647}, - {789500947, 799912428, 807970493, 822202171, 847198862, 890656938, - 930446620, 984698487, 1057439013, 1152534920, 1272230465, 1365055160, - 1466039887, 1571542254, 1676625923, 1775827450, 1864289931, 1938804777, - 1998288223, 2043552830, 2076625737, 2108821648, 2126953936, 2136781520, - 2141973538, 2144670400, 2146576828, 2147193855, 2147391471, 2147454404, - 2147483647}, - {68, 12075997, 21473763, 38182223, 67875466, 120571390, - 170045077, 239449100, 336157459, 469148859, 647490682, 794298694, - 962206904, 1145934076, 1335698887, 1518500250, 1681545272, 1816183116, - 1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347, - 2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694, - 2147483647}, - {-1264867824, -1256941889, -1250718683, -1239533218, -1219262608, - -1181994236, -1145402996, -1091240803, -1009679140, -884206781, - -686781195, -493680916, -231982790, 111344931, 528824509, - 973499603, 1370532546, 1667536014, 1861934703, 1979750033, - 2048825092, 2102317318, 2126370894, 2137432969, 2142630645, - 2145115530, 2146755909, 2147257214, 2147412694, 2147461326, - 2147483647}, - {-2126008810, -2125766474, -2125575032, -2125228318, -2124591212, - -2123389054, -2122167592, -2120278606, -2117230964, -2111979821, - -2101908544, -2088973660, -2063281359, -1998745405, -1741980962, - 151850025, 1901722232, 2089538753, 2126646554, 2138317205, - 2142969755, 2145718225, 2146728955, 2147143299, 2147324850, - 2147407880, 2147460877, 2147476647, 2147481468, 2147482965, - 2147483647}}; +const FLOAT32 ixheaacd_cos_table[8][31] = { + {1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, + 1.0000000000f}, + {0.9369999766f, 0.9376808405f, 0.9382033348f, 0.9391169548f, 0.9406937957f, + 0.9433546066f, 0.9457064271f, 0.9487929940f, 0.9527334571f, 0.9575835466f, + 0.9632775784f, 0.9674328566f, 0.9717451334f, 0.9760690331f, 0.9802456498f, + 0.9841240048f, 0.9875818491f, 0.9905421734f, 0.9929783344f, 0.9949095249f, + 0.9963886738f, 0.9979170561f, 0.9988400936f, 0.9993716478f, 0.9996666908f, + 0.9998259544f, 0.9999424219f, 0.9999813437f, 0.9999940395f, 0.9999980927f, + 1.0000000000f}, + {0.8411800265f, 0.8428127766f, 0.8440676332f, 0.8462653756f, 0.8500694633f, + 0.8565201163f, 0.8622540236f, 0.8698242903f, 0.8795616627f, 0.8916544318f, + 0.9059935808f, 0.9165460467f, 0.9275664687f, 0.9386759400f, 0.9494492412f, + 0.9594737887f, 0.9684119225f, 0.9760481715f, 0.9823079705f, 0.9872440100f, + 0.9910007119f, 0.9948507547f, 0.9971528649f, 0.9984666705f, 0.9991903901f, + 0.9995787144f, 0.9998613000f, 0.9999551177f, 0.9999856353f, 0.9999954104f, + 1.0000000000f}, + {0.6009200215f, 0.6044946313f, 0.6072516441f, 0.6121006608f, 0.6205559969f, + 0.6350733042f, 0.6481682062f, 0.6657315493f, 0.6887807250f, 0.7181132436f, + 0.7538767457f, 0.7808354497f, 0.8095121980f, 0.8388824463f, 0.8677002788f, + 0.8946843147f, 0.9187452197f, 0.9391753078f, 0.9557289481f, 0.9685774446f, + 0.9781784415f, 0.9877888560f, 0.9933770895f, 0.9964889884f, 0.9981689453f, + 0.9990561008f, 0.9996924996f, 0.9999011159f, 0.9999684095f, 0.9999899864f, + 1.0000000000f}, + {0.3676400185f, 0.3724882603f, 0.3762405813f, 0.3828677237f, 0.3945077062f, + 0.4147444665f, 0.4332729578f, 0.4585359693f, 0.4924084246f, 0.5366908908f, + 0.5924285054f, 0.6356533170f, 0.6826780438f, 0.7318063974f, 0.7807397842f, + 0.8269340992f, 0.8681276441f, 0.9028263092f, 0.9305254817f, 0.9516034126f, + 0.9670042396f, 0.9819965959f, 0.9904401302f, 0.9950164557f, 0.9974341393f, + 0.9986900091f, 0.9995777011f, 0.9998650551f, 0.9999570847f, 0.9999864101f, + 1.0000000000f}, + {0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f, + 0.0561454296f, 0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f, + 0.3015113473f, 0.3698741496f, 0.4480625093f, 0.5336171389f, 0.6219832897f, + 0.7071067691f, 0.7830305099f, 0.8457261920f, 0.8940022588f, 0.9290818572f, + 0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f, 0.9968600869f, + 0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f, + 1.0000000000f}, + {-0.5889999866f, -0.5853092074f, -0.5824112892f, -0.5772026181f, + -0.5677633882f, -0.5504089594f, -0.5333698392f, -0.5081486106f, + -0.4701685011f, -0.4117408693f, -0.3198074102f, -0.2298880965f, + -0.1080254018f, 0.0518490225f, 0.2462531030f, 0.4533210695f, + 0.6382039785f, 0.7765069604f, 0.8670309186f, 0.9218929410f, + 0.9540585279f, 0.9789677858f, 0.9901686311f, 0.9953197837f, + 0.9977401495f, 0.9988972545f, 0.9996611476f, 0.9998945594f, + 0.9999669790f, 0.9999896288f, 1.0000000000f}, + {-0.9900000095f, -0.9898871779f, -0.9897980094f, -0.9896365404f, + -0.9893398881f, -0.9887800813f, -0.9882112741f, -0.9873316884f, + -0.9859125018f, -0.9834672213f, -0.9787774086f, -0.9727541804f, + -0.9607902765f, -0.9307383299f, -0.8111730814f, 0.0707106814f, + 0.8855584264f, 0.9730173349f, 0.9902969599f, 0.9957315326f, + 0.9978980422f, 0.9991779327f, 0.9996485710f, 0.9998415112f, + 0.9999260306f, 0.9999647141f, 0.9999893904f, 0.9999967217f, + 0.9999989867f, 0.9999997020f, 1.0000000000f}}; -const WORD32 - ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2] = { - 0x00000000, 0x0055dba0, 0xffede50e, 0x005b5370, 0xffed978a, 0x006090c3, - 0xffefc9b9, 0x0065fde5, 0xfff0065d, 0x006b47fa, 0xffeff6cb, 0x0070c8a4, - 0xffef7b8b, 0x0075fdec, 0xffeedfa4, 0x007b3874, 0xffee1650, 0x00807993, - 0xffed651e, 0x0085c217, 0xffecc31c, 0x008a7dd6, 0xffebe77b, 0x008f4bfc, - 0xffeb50b3, 0x009424c5, 0xffea9193, 0x0098b855, 0xffe9ca76, 0x009d10bf, - 0xffe940f4, 0x00a1039c, 0xffe88ba8, 0x00a520bb, 0xffe83a08, 0x00a8739d, - 0xffe79e16, 0x00abe79d, 0xffe7746f, 0x00af374c, 0xffe6d466, 0x00b1978d, - 0xffe6afee, 0x00b3d15b, 0xffe65416, 0x00b5c866, 0xffe681c6, 0x00b74c36, - 0xffe66dd0, 0x00b8394b, 0xffe66fac, 0x00b8fe0d, 0xffe69424, 0x00b8c6b0, - 0xffe6fed4, 0x00b85f70, 0xffe75361, 0x00b73aaf, 0xffe80415, 0x00b58c8c, - 0xffe85b4b, 0x00b36acd, 0xffe954d1, 0x00b06b68, 0xffea353b, 0x00acbd2e, - 0xffeb3849, 0x00a85e93, 0xffec8409, 0x00a3508f, 0xffedc419, 0x009da525, - 0xffef2395, 0x0096dcc1, 0xfff0e7f0, 0x008f87aa, 0xfff294c4, 0x00872c62, - 0xfff48701, 0x007e0392, 0xfff681d7, 0x007400b7, 0xfff91fca, 0x006928a0, - 0xfffb42b1, 0x005d36de, 0xfffdfa25, 0x00504f40, 0x00007134, 0x00426f36, - 0x00039608, 0x0033b926, 0x0006b1ce, 0x0023b989, 0x0009aa3e, 0x00131c75, - 0x000d31b4, 0x0000e790, 0x0010bc63, 0xffee183b, 0x001471f7, 0xffda17f2, - 0x0018703e, 0xffc4e365, 0x001c3549, 0xffaea5d6, 0x002064f7, 0xff975c02, - 0x0024dd50, 0xff7ee3f2, 0x00293718, 0xff6542d1, 0x002d8e42, 0xff4aabc9, - 0x00329ab6, 0xff2ef726, 0x003745f9, 0xff120d71, 0x003c1fa3, 0xfef3f6ac, - 0x004103f4, 0xfed4bec3, 0x00465347, 0xfeb48d0d, 0x004b6c45, 0xfe933dc1, - 0x0050b176, 0xfe70b8d1, 0x01b2e41c, 0x09015651, 0x01d78bfb, 0x08d3e41b, - 0x01fd3ba0, 0x08a24899, 0x02244a24, 0x086b1eeb, 0x024bf7a1, 0x082f552e, - 0x0274ba42, 0x07ee507b, 0x029e35b4, 0x07a8127c, 0x02c89900, 0x075ca90c, - 0x02f3e48d, 0x070bbf58, 0x03201115, 0x06b559c3, 0x034d01f0, 0x06593911, - 0x037ad437, 0x05f7fb90, 0x03a966bb, 0x0590a67d, 0x03d8afe6, 0x05237f9c, - 0x04083fec, 0x04b0adcb, 0x043889c5, 0x0437fb0a, 0x04694101, 0x03b8f8db, - 0x049aa82e, 0x03343533, 0x04cc2fce, 0x02a99097, 0x04fe20bd, 0x02186a91, - 0x05303f87, 0x01816e05, 0x05626209, 0x00e42fa2, 0x05950122, 0x0040c496, - 0x05c76fec, 0xff96db90, 0x05f9c050, 0xfee723c7, 0x062bf5eb, 0xfe310658, - 0x065dd569, 0xfd7475d8, 0x068f8b44, 0xfcb1d740, 0x06c0f0c0, 0xfbe8f5be, - 0x06f1825c, 0xfb19b7be, 0x0721bf21, 0xfa44a06a, 0x075112a1, 0xf96916f5, - 0x077fedb2, 0xf887507c, 0x07ad8c26, 0xf79fa13b, 0x07da2b7f, 0xf6b1f3c3, - 0x08061671, 0xf5be0fa9, 0x08303897, 0xf4c473c6, 0x08594887, 0xf3c4e887, - 0x0880ffdc, 0xf2bf6ea5, 0x08a75da4, 0xf1b461ab, 0x08cb4e22, 0xf0a395a0, - 0x08edfeaa, 0xef8d4d7c, 0x090ec1fc, 0xee71b2ff, 0x092d796f, 0xed50a31e, - 0x0949eaac, 0xec2a3f60, 0x0963ed46, 0xeafee7f2, 0x097c1ee8, 0xe9cea84b, - 0x099140a6, 0xe89971b7, 0x09a3e163, 0xe75f8bb8, 0x09b3d77f, 0xe620c476, - 0x09c0e59e, 0xe4de0cb0, 0x09cab9f1, 0xe396a45e, 0x09d19ca8, 0xe24b8f67, - 0x09d52709, 0xe0fc421f, 0x09d5560a, 0xdfa93ab5, 0x09d1fa22, 0xde529087, - 0x09caeb0e, 0xdcf898fb, 0x09c018ce, 0xdb9b5b13, 0x09b18a1c, 0xda3b176b, - 0x099ec3db, 0xd8d7f220, 0x09881dc5, 0xd7722f05, 0x096d0e21, 0xd60a46e6, - 0x094d7ec2, 0xd49fd55f, 0x09299ead, 0xd3337b3e, 0x2e3a7532, 0x6d474e1d, - 0x2faa221c, 0x6d41d963, 0x311af3a4, 0x6d32730f, 0x328cc6f0, 0x6d18520d, - 0x33ff670e, 0x6cf4073e, 0x3572ec70, 0x6cc59baa, 0x36e69691, 0x6c8c4c7a, - 0x385a49c3, 0x6c492216, 0x39ce0477, 0x6bfbdd97, 0x3b415115, 0x6ba4629e, - 0x3cb41218, 0x6b42a863, 0x3e25b17e, 0x6ad73e8d, 0x3f962fb8, 0x6a619c5e, - 0x41058bc5, 0x69e29784, 0x4272a385, 0x6959709d, 0x43de620a, 0x68c7269b, - 0x4547daea, 0x682b39a3, 0x46aea856, 0x6785c24d, 0x4812f848, 0x66d76725, - 0x4973fef1, 0x661fd6b7, 0x4ad237a2, 0x655f63f1, 0x4c2ca3df, 0x64964062, - 0x4d83976c, 0x63c45243, 0x4ed62be2, 0x62ea6473, 0x5024d70e, 0x6207f21f, - 0x516eefb9, 0x611d58a2, 0x52b449dd, 0x602b0c7f, 0x53f495a9, 0x5f30ff5f, - 0x552f8ff6, 0x5e2f6366, 0x56654bdd, 0x5d26be9b, 0x579505f5, 0x5c16d0ae, - 0x58befacd, 0x5b001db7, 0x59e2f69e, 0x59e2f69e, 0x5b001db7, 0x58befacd, - 0x5c16d0ae, 0x579505f5, 0x5d26be9b, 0x56654bdd, 0x5e2f6366, 0x552f8ff6, - 0x5f30ff5f, 0x53f495a9, 0x602b0c7f, 0x52b449dd, 0x611d58a2, 0x516eefb9, - 0x6207f21f, 0x5024d70e, 0x62ea6473, 0x4ed62be2, 0x63c45243, 0x4d83976c, - 0x64964062, 0x4c2ca3df, 0x655f63f1, 0x4ad237a2, 0x661fd6b7, 0x4973fef1, - 0x66d76725, 0x4812f848, 0x6785c24d, 0x46aea856, 0x682b39a3, 0x4547daea, - 0x68c7269b, 0x43de620a, 0x6959709d, 0x4272a385, 0x69e29784, 0x41058bc5, - 0x6a619c5e, 0x3f962fb8, 0x6ad73e8d, 0x3e25b17e, 0x6b42a863, 0x3cb41218, - 0x6ba4629e, 0x3b415115, 0x6bfbdd97, 0x39ce0477, 0x6c492216, 0x385a49c3, - 0x6c8c4c7a, 0x36e69691, 0x6cc59baa, 0x3572ec70, 0x6cf4073e, 0x33ff670e, - 0x6d18520d, 0x328cc6f0, 0x6d32730f, 0x311af3a4, 0x6d41d963, 0x2faa221c, - 0xd1c58ace, 0x09015651, 0xd3337b3e, 0x09299ead, 0xd49fd55f, 0x094d7ec2, - 0xd60a46e6, 0x096d0e21, 0xd7722f05, 0x09881dc5, 0xd8d7f220, 0x099ec3db, - 0xda3b176b, 0x09b18a1c, 0xdb9b5b13, 0x09c018ce, 0xdcf898fb, 0x09caeb0e, - 0xde529087, 0x09d1fa22, 0xdfa93ab5, 0x09d5560a, 0xe0fc421f, 0x09d52709, - 0xe24b8f67, 0x09d19ca8, 0xe396a45e, 0x09cab9f1, 0xe4de0cb0, 0x09c0e59e, - 0xe620c476, 0x09b3d77f, 0xe75f8bb8, 0x09a3e163, 0xe89971b7, 0x099140a6, - 0xe9cea84b, 0x097c1ee8, 0xeafee7f2, 0x0963ed46, 0xec2a3f60, 0x0949eaac, - 0xed50a31e, 0x092d796f, 0xee71b2ff, 0x090ec1fc, 0xef8d4d7c, 0x08edfeaa, - 0xf0a395a0, 0x08cb4e22, 0xf1b461ab, 0x08a75da4, 0xf2bf6ea5, 0x0880ffdc, - 0xf3c4e887, 0x08594887, 0xf4c473c6, 0x08303897, 0xf5be0fa9, 0x08061671, - 0xf6b1f3c3, 0x07da2b7f, 0xf79fa13b, 0x07ad8c26, 0xf887507c, 0x077fedb2, - 0xf96916f5, 0x075112a1, 0xfa44a06a, 0x0721bf21, 0xfb19b7be, 0x06f1825c, - 0xfbe8f5be, 0x06c0f0c0, 0xfcb1d740, 0x068f8b44, 0xfd7475d8, 0x065dd569, - 0xfe310658, 0x062bf5eb, 0xfee723c7, 0x05f9c050, 0xff96db90, 0x05c76fec, - 0x0040c496, 0x05950122, 0x00e42fa2, 0x05626209, 0x01816e05, 0x05303f87, - 0x02186a91, 0x04fe20bd, 0x02a99097, 0x04cc2fce, 0x03343533, 0x049aa82e, - 0x03b8f8db, 0x04694101, 0x0437fb0a, 0x043889c5, 0x04b0adcb, 0x04083fec, - 0x05237f9c, 0x03d8afe6, 0x0590a67d, 0x03a966bb, 0x05f7fb90, 0x037ad437, - 0x06593911, 0x034d01f0, 0x06b559c3, 0x03201115, 0x070bbf58, 0x02f3e48d, - 0x075ca90c, 0x02c89900, 0x07a8127c, 0x029e35b4, 0x07ee507b, 0x0274ba42, - 0x082f552e, 0x024bf7a1, 0x086b1eeb, 0x02244a24, 0x08a24899, 0x01fd3ba0, - 0x08d3e41b, 0x01d78bfb, 0xfe4d1be4, 0x0055dba0, 0xfe70b8d1, 0x0050b176, - 0xfe933dc1, 0x004b6c45, 0xfeb48d0d, 0x00465347, 0xfed4bec3, 0x004103f4, - 0xfef3f6ac, 0x003c1fa3, 0xff120d71, 0x003745f9, 0xff2ef726, 0x00329ab6, - 0xff4aabc9, 0x002d8e42, 0xff6542d1, 0x00293718, 0xff7ee3f2, 0x0024dd50, - 0xff975c02, 0x002064f7, 0xffaea5d6, 0x001c3549, 0xffc4e365, 0x0018703e, - 0xffda17f2, 0x001471f7, 0xffee183b, 0x0010bc63, 0x0000e790, 0x000d31b4, - 0x00131c75, 0x0009aa3e, 0x0023b989, 0x0006b1ce, 0x0033b926, 0x00039608, - 0x00426f36, 0x00007134, 0x00504f40, 0xfffdfa25, 0x005d36de, 0xfffb42b1, - 0x006928a0, 0xfff91fca, 0x007400b7, 0xfff681d7, 0x007e0392, 0xfff48701, - 0x00872c62, 0xfff294c4, 0x008f87aa, 0xfff0e7f0, 0x0096dcc1, 0xffef2395, - 0x009da525, 0xffedc419, 0x00a3508f, 0xffec8409, 0x00a85e93, 0xffeb3849, - 0x00acbd2e, 0xffea353b, 0x00b06b68, 0xffe954d1, 0x00b36acd, 0xffe85b4b, - 0x00b58c8c, 0xffe80415, 0x00b73aaf, 0xffe75361, 0x00b85f70, 0xffe6fed4, - 0x00b8c6b0, 0xffe69424, 0x00b8fe0d, 0xffe66fac, 0x00b8394b, 0xffe66dd0, - 0x00b74c36, 0xffe681c6, 0x00b5c866, 0xffe65416, 0x00b3d15b, 0xffe6afee, - 0x00b1978d, 0xffe6d466, 0x00af374c, 0xffe7746f, 0x00abe79d, 0xffe79e16, - 0x00a8739d, 0xffe83a08, 0x00a520bb, 0xffe88ba8, 0x00a1039c, 0xffe940f4, - 0x009d10bf, 0xffe9ca76, 0x0098b855, 0xffea9193, 0x009424c5, 0xffeb50b3, - 0x008f4bfc, 0xffebe77b, 0x008a7dd6, 0xffecc31c, 0x0085c217, 0xffed651e, - 0x00807993, 0xffee1650, 0x007b3874, 0xffeedfa4, 0x0075fdec, 0xffef7b8b, - 0x0070c8a4, 0xffeff6cb, 0x006b47fa, 0xfff0065d, 0x0065fde5, 0xffefc9b9, - 0x006090c3, 0xffed978a, 0x005b5370, 0xffede50e}; +const FLOAT32 + ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2] = { + 0.000000f, 0.002620f, -0.000553f, 0.002787f, -0.000562f, 0.002947f, + -0.000495f, 0.003113f, -0.000488f, 0.003274f, -0.000489f, 0.003442f, + -0.000504f, 0.003601f, -0.000523f, 0.003760f, -0.000547f, 0.003921f, + -0.000568f, 0.004082f, -0.000587f, 0.004226f, -0.000613f, 0.004373f, + -0.000631f, 0.004521f, -0.000654f, 0.004661f, -0.000678f, 0.004793f, + -0.000694f, 0.004914f, -0.000716f, 0.005039f, -0.000726f, 0.005141f, + -0.000744f, 0.005246f, -0.000749f, 0.005347f, -0.000768f, 0.005420f, + -0.000772f, 0.005488f, -0.000783f, 0.005548f, -0.000778f, 0.005594f, + -0.000780f, 0.005622f, -0.000780f, 0.005646f, -0.000776f, 0.005639f, + -0.000763f, 0.005627f, -0.000753f, 0.005592f, -0.000732f, 0.005540f, + -0.000722f, 0.005475f, -0.000692f, 0.005384f, -0.000665f, 0.005272f, + -0.000634f, 0.005138f, -0.000595f, 0.004984f, -0.000556f, 0.004811f, + -0.000515f, 0.004604f, -0.000461f, 0.004380f, -0.000410f, 0.004125f, + -0.000350f, 0.003846f, -0.000290f, 0.003540f, -0.000210f, 0.003209f, + -0.000145f, 0.002845f, -0.000062f, 0.002451f, 0.000013f, 0.002027f, + 0.000109f, 0.001578f, 0.000204f, 0.001090f, 0.000295f, 0.000583f, + 0.000403f, 0.000028f, 0.000511f, -0.000546f, 0.000624f, -0.001157f, + 0.000746f, -0.001804f, 0.000861f, -0.002483f, 0.000989f, -0.003193f, + 0.001125f, -0.003940f, 0.001258f, -0.004722f, 0.001390f, -0.005534f, + 0.001544f, -0.006379f, 0.001687f, -0.007262f, 0.001835f, -0.008180f, + 0.001984f, -0.009133f, 0.002146f, -0.010115f, 0.002302f, -0.011132f, + 0.002463f, -0.012185f, 0.013272f, 0.070353f, 0.014390f, 0.068966f, + 0.015541f, 0.067453f, 0.016732f, 0.065769f, 0.017943f, 0.063944f, + 0.019187f, 0.061960f, 0.020453f, 0.059817f, 0.021747f, 0.057515f, + 0.023068f, 0.055046f, 0.024416f, 0.052409f, 0.025788f, 0.049598f, + 0.027186f, 0.046630f, 0.028607f, 0.043477f, 0.030050f, 0.040146f, + 0.031502f, 0.036642f, 0.032975f, 0.032958f, 0.034462f, 0.029082f, + 0.035970f, 0.025031f, 0.037481f, 0.020800f, 0.039005f, 0.016370f, + 0.040535f, 0.011762f, 0.042065f, 0.006964f, 0.043610f, 0.001977f, + 0.045149f, -0.003209f, 0.046684f, -0.008571f, 0.048217f, -0.014129f, + 0.049739f, -0.019883f, 0.051256f, -0.025823f, 0.052763f, -0.031953f, + 0.054245f, -0.038278f, 0.055717f, -0.044781f, 0.057162f, -0.051480f, + 0.058592f, -0.058371f, 0.059984f, -0.065441f, 0.061346f, -0.072694f, + 0.062686f, -0.080137f, 0.063972f, -0.087755f, 0.065225f, -0.095553f, + 0.066437f, -0.103533f, 0.067608f, -0.111683f, 0.068704f, -0.120008f, + 0.069763f, -0.128500f, 0.070763f, -0.137155f, 0.071700f, -0.145977f, + 0.072568f, -0.154961f, 0.073362f, -0.164096f, 0.074100f, -0.173381f, + 0.074745f, -0.182817f, 0.075314f, -0.192397f, 0.075801f, -0.202125f, + 0.076199f, -0.211974f, 0.076499f, -0.221965f, 0.076709f, -0.232069f, + 0.076817f, -0.242302f, 0.076823f, -0.252648f, 0.076720f, -0.263105f, + 0.076505f, -0.273663f, 0.076175f, -0.284321f, 0.075731f, -0.295072f, + 0.075158f, -0.305910f, 0.074466f, -0.316828f, 0.073641f, -0.327811f, + 0.072677f, -0.338872f, 0.071583f, -0.349991f, 0.361159f, 0.853739f, + 0.372380f, 0.853572f, 0.383635f, 0.853102f, 0.394921f, 0.852305f, + 0.406232f, 0.851197f, 0.417570f, 0.849780f, 0.428912f, 0.848032f, + 0.440255f, 0.845982f, 0.451600f, 0.843624f, 0.462931f, 0.840954f, + 0.474245f, 0.837972f, 0.485525f, 0.834694f, 0.496771f, 0.831104f, + 0.507982f, 0.827228f, 0.519123f, 0.823042f, 0.530224f, 0.818578f, + 0.541255f, 0.813819f, 0.552205f, 0.808770f, 0.563079f, 0.803449f, + 0.573852f, 0.797847f, 0.584540f, 0.791974f, 0.595112f, 0.785835f, + 0.605578f, 0.779429f, 0.615911f, 0.772778f, 0.626124f, 0.765867f, + 0.636198f, 0.758708f, 0.646127f, 0.751314f, 0.655902f, 0.743683f, + 0.665514f, 0.735821f, 0.674966f, 0.727745f, 0.684235f, 0.719446f, + 0.693328f, 0.710941f, 0.702239f, 0.702239f, 0.710941f, 0.693328f, + 0.719446f, 0.684235f, 0.727745f, 0.674966f, 0.735821f, 0.665514f, + 0.743683f, 0.655902f, 0.751314f, 0.646127f, 0.758708f, 0.636198f, + 0.765867f, 0.626124f, 0.772778f, 0.615911f, 0.779429f, 0.605578f, + 0.785835f, 0.595112f, 0.791974f, 0.584540f, 0.797847f, 0.573852f, + 0.803449f, 0.563079f, 0.808770f, 0.552205f, 0.813819f, 0.541255f, + 0.818578f, 0.530224f, 0.823042f, 0.519123f, 0.827228f, 0.507982f, + 0.831104f, 0.496771f, 0.834694f, 0.485525f, 0.837972f, 0.474245f, + 0.840954f, 0.462931f, 0.843624f, 0.451600f, 0.845982f, 0.440255f, + 0.848032f, 0.428912f, 0.849780f, 0.417570f, 0.851197f, 0.406232f, + 0.852305f, 0.394921f, 0.853102f, 0.383635f, 0.853572f, 0.372380f, + -0.361159f, 0.070353f, -0.349991f, 0.071583f, -0.338872f, 0.072677f, + -0.327811f, 0.073641f, -0.316828f, 0.074466f, -0.305910f, 0.075158f, + -0.295072f, 0.075731f, -0.284321f, 0.076175f, -0.273663f, 0.076505f, + -0.263105f, 0.076720f, -0.252648f, 0.076823f, -0.242302f, 0.076817f, + -0.232069f, 0.076709f, -0.221965f, 0.076499f, -0.211974f, 0.076199f, + -0.202125f, 0.075801f, -0.192397f, 0.075314f, -0.182817f, 0.074745f, + -0.173381f, 0.074100f, -0.164096f, 0.073362f, -0.154961f, 0.072568f, + -0.145977f, 0.071700f, -0.137155f, 0.070763f, -0.128500f, 0.069763f, + -0.120008f, 0.068704f, -0.111683f, 0.067608f, -0.103533f, 0.066437f, + -0.095553f, 0.065225f, -0.087755f, 0.063972f, -0.080137f, 0.062686f, + -0.072694f, 0.061346f, -0.065441f, 0.059984f, -0.058371f, 0.058592f, + -0.051480f, 0.057162f, -0.044781f, 0.055717f, -0.038278f, 0.054245f, + -0.031953f, 0.052763f, -0.025823f, 0.051256f, -0.019883f, 0.049739f, + -0.014129f, 0.048217f, -0.008571f, 0.046684f, -0.003209f, 0.045149f, + 0.001977f, 0.043610f, 0.006964f, 0.042065f, 0.011762f, 0.040535f, + 0.016370f, 0.039005f, 0.020800f, 0.037481f, 0.025031f, 0.035970f, + 0.029082f, 0.034462f, 0.032958f, 0.032975f, 0.036642f, 0.031502f, + 0.040146f, 0.030050f, 0.043477f, 0.028607f, 0.046630f, 0.027186f, + 0.049598f, 0.025788f, 0.052409f, 0.024416f, 0.055046f, 0.023068f, + 0.057515f, 0.021747f, 0.059817f, 0.020453f, 0.061960f, 0.019187f, + 0.063944f, 0.017943f, 0.065769f, 0.016732f, 0.067453f, 0.015541f, + 0.068966f, 0.014390f, -0.013272f, 0.002620f, -0.012185f, 0.002463f, + -0.011132f, 0.002302f, -0.010115f, 0.002146f, -0.009133f, 0.001984f, + -0.008180f, 0.001835f, -0.007262f, 0.001687f, -0.006379f, 0.001544f, + -0.005534f, 0.001390f, -0.004722f, 0.001258f, -0.003940f, 0.001125f, + -0.003193f, 0.000989f, -0.002483f, 0.000861f, -0.001804f, 0.000746f, + -0.001157f, 0.000624f, -0.000546f, 0.000511f, 0.000028f, 0.000403f, + 0.000583f, 0.000295f, 0.001090f, 0.000204f, 0.001578f, 0.000109f, + 0.002027f, 0.000013f, 0.002451f, -0.000062f, 0.002845f, -0.000145f, + 0.003209f, -0.000210f, 0.003540f, -0.000290f, 0.003846f, -0.000350f, + 0.004125f, -0.000410f, 0.004380f, -0.000461f, 0.004604f, -0.000515f, + 0.004811f, -0.000556f, 0.004984f, -0.000595f, 0.005138f, -0.000634f, + 0.005272f, -0.000665f, 0.005384f, -0.000692f, 0.005475f, -0.000722f, + 0.005540f, -0.000732f, 0.005592f, -0.000753f, 0.005627f, -0.000763f, + 0.005639f, -0.000776f, 0.005646f, -0.000780f, 0.005622f, -0.000780f, + 0.005594f, -0.000778f, 0.005548f, -0.000783f, 0.005488f, -0.000772f, + 0.005420f, -0.000768f, 0.005347f, -0.000749f, 0.005246f, -0.000744f, + 0.005141f, -0.000726f, 0.005039f, -0.000716f, 0.004914f, -0.000694f, + 0.004793f, -0.000678f, 0.004661f, -0.000654f, 0.004521f, -0.000631f, + 0.004373f, -0.000613f, 0.004226f, -0.000587f, 0.004082f, -0.000568f, + 0.003921f, -0.000547f, 0.003760f, -0.000523f, 0.003601f, -0.000504f, + 0.003442f, -0.000489f, 0.003274f, -0.000488f, 0.003113f, -0.000495f, + 0.002947f, -0.000562f, 0.002787f, -0.000553f}; -const WORD32 ixheaacd_mps_pre_re[64] = { - 0x01fff621, 0x01ffa72e, 0x01ff0956, 0x01fe1caf, 0x01fce15f, 0x01fb5797, - 0x01f97f92, 0x01f7599a, 0x01f4e603, 0x01f2252f, 0x01ef178a, 0x01ebbd8c, - 0x01e817ba, 0x01e426a4, 0x01dfeae6, 0x01db6526, 0x01d69617, 0x01d17e77, - 0x01cc1f0f, 0x01c678b3, 0x01c08c42, 0x01ba5aa6, 0x01b3e4d3, 0x01ad2bc9, - 0x01a63091, 0x019ef43e, 0x019777ee, 0x018fbcc9, 0x0187c400, 0x017f8ecd, - 0x01771e75, 0x016e7444, 0x01659191, 0x015c77bb, 0x01532828, 0x0149a449, - 0x013fed94, 0x0136058a, 0x012bedb1, 0x0121a798, 0x011734d5, 0x010c9704, - 0x0101cfc7, 0x00f6e0c9, 0x00ebcbb9, 0x00e0924d, 0x00d53640, 0x00c9b952, - 0x00be1d48, 0x00b263ed, 0x00a68f10, 0x009aa084, 0x008e9a20, 0x00827dbf, - 0x00764d3e, 0x006a0a7f, 0x005db766, 0x005155d9, 0x0044e7c1, 0x00386f0a, - 0x002bed9e, 0x001f656d, 0x0012d864, 0x00064873}; +const FLOAT32 ixheaacd_mps_post_twid[30] = { + 0.998795f, 0.049068f, 0.995185f, 0.098017f, 0.989177f, 0.146730f, + 0.980785f, 0.195090f, 0.970031f, 0.242980f, 0.956940f, 0.290285f, + 0.941544f, 0.336890f, 0.923880f, 0.382683f, 0.903989f, 0.427555f, + 0.881921f, 0.471397f, 0.857729f, 0.514103f, 0.831470f, 0.555570f, + 0.803208f, 0.595699f, 0.773010f, 0.634393f, 0.740951f, 0.671559f}; -const WORD32 ixheaacd_mps_pre_im[64] = { - 0x00064874, 0x0012d865, 0x001f656e, 0x002beda0, 0x00386f0b, 0x0044e7c3, - 0x005155da, 0x005db767, 0x006a0a80, 0x00764d3f, 0x00827dc0, 0x008e9a22, - 0x009aa086, 0x00a68f12, 0x00b263ef, 0x00be1d49, 0x00c9b953, 0x00d53641, - 0x00e0924f, 0x00ebcbbb, 0x00f6e0cb, 0x0101cfc8, 0x010c9705, 0x011734d6, - 0x0121a79a, 0x012bedb2, 0x0136058b, 0x013fed95, 0x0149a44a, 0x01532829, - 0x015c77bc, 0x01659192, 0x016e7445, 0x01771e76, 0x017f8ece, 0x0187c401, - 0x018fbcca, 0x019777ef, 0x019ef43f, 0x01a63092, 0x01ad2bca, 0x01b3e4d4, - 0x01ba5aa6, 0x01c08c42, 0x01c678b3, 0x01cc1f0f, 0x01d17e77, 0x01d69617, - 0x01db6526, 0x01dfeae6, 0x01e426a5, 0x01e817bb, 0x01ebbd8c, 0x01ef178a, - 0x01f2252f, 0x01f4e603, 0x01f7599a, 0x01f97f92, 0x01fb5797, 0x01fce15f, - 0x01fe1caf, 0x01ff0956, 0x01ffa72f, 0x01fff621}; +const FLOAT32 ixheaacd_mps_pre_twid[64] = { + 0.015624f, 0.000192f, 0.015614f, 0.000575f, 0.015596f, 0.000958f, 0.015567f, + 0.001341f, 0.015530f, 0.001722f, 0.015483f, 0.002103f, 0.015427f, 0.002482f, + 0.015361f, 0.002860f, 0.015286f, 0.003236f, 0.015202f, 0.003610f, 0.015109f, + 0.003982f, 0.015007f, 0.004352f, 0.014895f, 0.004719f, 0.014775f, 0.005083f, + 0.014646f, 0.005444f, 0.014508f, 0.005802f, 0.014361f, 0.006156f, 0.014206f, + 0.006507f, 0.014042f, 0.006853f, 0.013869f, 0.007196f, 0.013689f, 0.007534f, + 0.013500f, 0.007868f, 0.013302f, 0.008197f, 0.013097f, 0.008521f, 0.012884f, + 0.008840f, 0.012663f, 0.009153f, 0.012435f, 0.009461f, 0.012199f, 0.009763f, + 0.011956f, 0.010060f, 0.011705f, 0.010350f, 0.011448f, 0.010634f, 0.011183f, + 0.010912f}; -const WORD32 ixheaacd_mps_post_re[128] = { - 0x7fffffff, 0x7ff62182, 0x7fd8878d, 0x7fa736b3, 0x7f62368e, 0x7f0991c2, - 0x7e9d55fa, 0x7e1d93e8, 0x7d8a5f3d, 0x7ce3ceae, 0x7c29fbea, 0x7b5d0399, - 0x7a7d0555, 0x798a23ab, 0x7884840c, 0x776c4ed3, 0x7641af33, 0x7504d33b, - 0x73b5ebc5, 0x72552c78, 0x70e2cbb8, 0x6f5f02a2, 0x6dca0d03, 0x6c24294e, - 0x6a6d9890, 0x68a69e6b, 0x66cf8109, 0x64e8890d, 0x62f20192, 0x60ec3814, - 0x5ed77c6c, 0x5cb420c0, 0x5a827978, 0x5842dd31, 0x55f5a4ad, 0x539b2ac8, - 0x5133cc6b, 0x4ebfe879, 0x4c3fdfc6, 0x49b41504, 0x471cecb5, 0x447acd1d, - 0x41ce1e2f, 0x3f174981, 0x3c56ba37, 0x398cdcf7, 0x36ba1fd6, 0x33def248, - 0x30fbc50c, 0x2e110a1e, 0x2b1f34a6, 0x2826b8e1, 0x25280c14, 0x2223a47a, - 0x1f19f92e, 0x1c0b821b, 0x18f8b7eb, 0x15e213f2, 0x12c8101a, 0x0fab26d5, - 0x0c8bd306, 0x096a8ff0, 0x0647d921, 0x03242a62, 0xffffffa3, 0xfcdbd4e2, - 0xf9b82624, 0xf6956f55, 0xf3742c3f, 0xf054d871, 0xed37ef2c, 0xea1deb55, - 0xe707475d, 0xe3f47d2e, 0xe0e6061c, 0xdddc5ad1, 0xdad7f338, 0xd7d9466d, - 0xd4e0caa9, 0xd1eef532, 0xcf043a47, 0xcc210d0d, 0xc945df80, 0xc6732261, - 0xc3a94524, 0xc0e8b5dc, 0xbe31e130, 0xbb853244, 0xb8e312ae, 0xb64bea62, - 0xb3c01fa3, 0xb14016f3, 0xaecc3304, 0xac64d4aa, 0xaa0a5ac8, 0xa7bd2247, - 0xa57d8603, 0xa34bdebf, 0xa1288316, 0x9f13c772, 0x9d0dfdf7, 0x9b17767f, - 0x99307e88, 0x97596128, 0x95926708, 0x93dbd64e, 0x9235f29c, 0x90a0fd01, - 0x8f1d33f0, 0x8daad334, 0x8c4a13eb, 0x8afb2c79, 0x89be5085, 0x8893b0ea, - 0x877b7bb4, 0x8675dc1a, 0x8582fa74, 0x84a2fc35, 0x83d603e8, 0x831c3129, - 0x8275a09e, 0x81e26bf8, 0x8162a9ea, 0x80f66e27, 0x809dc95f, 0x8058c93f, - 0x8027786a, 0x8009de7a}; +const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = { + 0.007461f, 0.022704f, 0.045469f, 0.072661f, 0.098851f, 0.117937f, 0.125000f, + 0.117937f, 0.098851f, 0.072661f, 0.045469f, 0.022704f, 0.007462f}; -const WORD32 ixheaacd_mps_post_im[128] = { - 0x00000000, 0x03242ac0, 0x0647d97f, 0x096a904d, 0x0c8bd363, 0x0fab2732, - 0x12c81077, 0x15e2144e, 0x18f8b847, 0x1c0b8277, 0x1f19f989, 0x2223a4d4, - 0x25280c6e, 0x2826b93a, 0x2b1f34fe, 0x2e110a76, 0x30fbc563, 0x33def29e, - 0x36ba202b, 0x398cdd4b, 0x3c56ba89, 0x3f1749d2, 0x41ce1e80, 0x447acd6c, - 0x471ced03, 0x49b41551, 0x4c3fe012, 0x4ebfe8c3, 0x5133ccb3, 0x539b2b0f, - 0x55f5a4f2, 0x5842dd75, 0x5a8279bb, 0x5cb42101, 0x5ed77cab, 0x60ec3851, - 0x62f201cd, 0x64e88947, 0x66cf8141, 0x68a69ea2, 0x6a6d98c4, 0x6c242980, - 0x6dca0d34, 0x6f5f02d0, 0x70e2cbe4, 0x72552ca2, 0x73b5ebed, 0x7504d361, - 0x7641af57, 0x776c4ef5, 0x7884842c, 0x798a23c8, 0x7a7d0571, 0x7b5d03b2, - 0x7c29fc01, 0x7ce3cec3, 0x7d8a5f4f, 0x7e1d93f8, 0x7e9d5608, 0x7f0991ce, - 0x7f623697, 0x7fa736ba, 0x7fd88792, 0x7ff62184, 0x7fffffff, 0x7ff6217f, - 0x7fd88789, 0x7fa736ac, 0x7f623685, 0x7f0991b7, 0x7e9d55ed, 0x7e1d93d7, - 0x7d8a5f2b, 0x7ce3ce9a, 0x7c29fbd3, 0x7b5d0380, 0x7a7d053a, 0x798a238d, - 0x788483ed, 0x776c4eb1, 0x7641af0f, 0x7504d315, 0x73b5eb9d, 0x72552c4e, - 0x70e2cb8b, 0x6f5f0274, 0x6dca0cd3, 0x6c24291c, 0x6a6d985c, 0x68a69e35, - 0x66cf80d1, 0x64e888d4, 0x62f20156, 0x60ec37d6, 0x5ed77c2d, 0x5cb4207f, - 0x5a827936, 0x5842dced, 0x55f5a467, 0x539b2a81, 0x5133cc22, 0x4ebfe82f, - 0x4c3fdf7b, 0x49b414b7, 0x471cec67, 0x447accce, 0x41ce1ddf, 0x3f17492f, - 0x3c56b9e4, 0x398cdca3, 0x36ba1f81, 0x33def1f2, 0x30fbc4b5, 0x2e1109c7, - 0x2b1f344d, 0x2826b888, 0x25280bba, 0x2223a420, 0x1f19f8d3, 0x1c0b81c0, - 0x18f8b78f, 0x15e21395, 0x12c80fbd, 0x0fab2678, 0x0c8bd2a9, 0x096a8f92, - 0x0647d8c3, 0x03242a04}; +const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = { + 0.000000f, 0.018995f, 0.000000f, -0.072931f, 0.000000f, + 0.305966f, 0.500000f, 0.305966f, 0.000000f, -0.072931f, + 0.000000f, 0.018995f, 0.000000f}; -const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = { - 8011005, 24378459, 48821601, 78019304, 106140545, 126634002, 134217728, - 126634002, 106140545, 78019304, 48821601, 24378459, 8011805}; - -const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = { - 0, 20395592, 0, -78309485, 0, 328528819, 536870911, - 328528819, 0, -78309485, 0, 20395592, 0}; - -const WORD32 ixheaacd_cosine[8][13] = { - { - -759250175, -410903263, -46, 410903167, 759250111, 992008063, - 1073741823, 992008063, 759250111, 410903167, -46, -410903263, - -759250175, - }, - { - 759249983, 992008191, 140, -992008063, -759250175, 410903167, - 1073741823, 410903167, -759250175, -992008063, 140, 992008191, - 759249983, - }, - { - 759250367, -992007999, -234, 992008191, -759250047, -410903263, - 1073741823, -410903263, -759250047, 992008191, -234, -992007999, - 759250367, - }, - { - -759249791, 410902815, 328, -410903423, 759250239, -992008127, - 1073741823, -992008127, 759250239, -410903423, 328, 410902815, - -759249791, - }, - { - -759250559, 410903679, -422, -410902911, 759249983, -992008063, - 1073741823, -992008063, 759249983, -410902911, -422, 410903679, - -759250559, - }, - { - 759249599, -992008319, 516, 992007935, -759250303, -410903071, - 1073741823, -410903071, -759250303, 992007935, 516, -992008319, - 759249599, - }, - { - 759250751, 992007807, -610, -992008255, -759249919, 410903359, - 1073741823, 410903359, -759249919, -992008255, -610, 992007807, - 759250751, - }, - {-759249407, -410902399, 704, 410903679, 759250367, 992008191, 1073741823, - 992008191, 759250367, 410903679, 704, -410902399, -759249407}}; +const FLOAT32 ixheaacd_sine[8][8] = { + {0.000000f, -0.382683f, -0.707107f, -0.923880f, -1.000000f, -0.923880f, + -0.707107f, -0.382683f}, + {0.000000f, -0.923880f, -0.707107f, 0.382684f, 1.000000f, 0.382683f, + -0.707107f, -0.923880f}, + {0.000000f, -0.923880f, 0.707107f, 0.382683f, -1.000000f, 0.382684f, + 0.707107f, -0.923880f}, + {0.000000f, -0.382683f, 0.707107f, -0.923879f, 1.000000f, -0.923880f, + 0.707107f, -0.382683f}, + {0.000000f, 0.382684f, -0.707107f, 0.923880f, -1.000000f, 0.923879f, + -0.707106f, 0.382684f}, + {0.000000f, 0.923880f, -0.707107f, -0.382684f, 1.000000f, -0.382683f, + -0.707107f, 0.923880f}, + {0.000000f, 0.923880f, 0.707107f, -0.382683f, -1.000000f, -0.382684f, + 0.707106f, 0.923880f}, + {0.000000f, 0.382683f, 0.707107f, 0.923879f, 1.000000f, 0.923880f, + 0.707107f, 0.382683f}}; -const WORD32 ixheaacd_sine[8][13] = { - { - 759250047, 992008063, 1073741823, 992008127, 759250111, 410903231, 0, - -410903231, -759250111, -992008127, -1073741823, -992008063, -759250047, - }, - { - 759250303, -410903039, -1073741823, -410903295, 759250047, 992008127, 0, - -992008127, -759250047, 410903295, 1073741823, 410903039, -759250303, - }, - { - -759249855, -410903487, 1073741823, -410903039, -759250175, 992008063, - 0, -992008063, 759250175, 410903039, -1073741823, 410903487, 759249855, - }, - { - -759250495, 992008255, -1073741823, 992007999, -759249983, 410903135, 0, - -410903135, 759249983, -992007999, 1073741823, -992008255, 759250495, - }, - { - 759249663, -992007871, 1073741823, -992008191, 759250303, -410903295, 0, - 410903295, -759250303, 992008191, -1073741823, 992007871, -759249663, - }, - { - 759250687, 410902623, -1073741823, 410903551, 759249919, -992008127, 0, - 992008127, -759249919, -410903551, 1073741823, -410902623, -759250687, - }, - { - -759249471, 410903903, 1073741823, 410902783, -759250367, -992008063, 0, - 992008063, 759250367, -410902783, -1073741823, -410903903, 759249471, - }, - {-759250879, -992008447, -1073741823, -992007871, -759249855, -410903039, 0, - 410903039, 759249855, 992007871, 1073741823, 992008447, 759250879}}; +const FLOAT32 ixheaacd_cosine[8][8] = { + {1.000000f, 0.923880f, 0.707107f, 0.382683f, -46.000000f, -0.382683f, + -0.707107f, -0.923880f}, + {1.000000f, 0.382683f, -0.707107f, -0.923880f, 140.000000f, 0.923880f, + 0.707107f, -0.382683f}, + {1.000000f, -0.382683f, -0.707107f, 0.923880f, -234.000000f, -0.923879f, + 0.707107f, 0.382683f}, + {1.000000f, -0.923880f, 0.707107f, -0.382684f, 328.000000f, 0.382683f, + -0.707106f, 0.923880f}, + {1.000000f, -0.923880f, 0.707107f, -0.382683f, -422.000000f, 0.382684f, + -0.707107f, 0.923880f}, + {1.000000f, -0.382683f, -0.707107f, 0.923879f, 516.000000f, -0.923880f, + 0.707106f, 0.382683f}, + {1.000000f, 0.382684f, -0.707107f, -0.923880f, -610.000000f, 0.923879f, + 0.707107f, -0.382684f}, + {1.000000f, 0.923880f, 0.707107f, 0.382684f, 704.000000f, -0.382683f, + -0.707106f, -0.923880f}}; -const WORD32 ixheaacd_cosine2[2][13] = { - { - 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, - 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, - 1073741823, - }, - { - 1073741823, -1073741823, 1073741823, -1073741823, 1073741823, - -1073741823, 1073741823, -1073741823, 1073741823, -1073741823, - 1073741823, -1073741823, 1073741823, - }, -}; +const WORD32 ixheaacd_mps_gain_set_indx[29] = { + 1, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 21, 23, 25, 27, 30, 33, 37, 42, 48, 55, 70}; diff --git a/decoder/ixheaacd_mps_smoothing.c b/decoder/ixheaacd_mps_smoothing.c index f4917a4..38cdc3c 100644 --- a/decoder/ixheaacd_mps_smoothing.c +++ b/decoder/ixheaacd_mps_smoothing.c @@ -32,18 +32,20 @@ VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( ia_mps_dec_state_struct *self) { int smooth_band; - int delta, one_minus_delta; - + FLOAT32 delta, one_minus_delta; +#ifndef MULT +#define MULT(a, b) (a * b) +#endif int ps = 0, pb, row, col; int res_bands = 0; int *p_smoothing_data; - + self->pre_mix_req = 0; if (self->residual_coding) res_bands = self->max_res_bands; p_smoothing_data = &self->smoothing_data[ps][res_bands]; delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps]; - one_minus_delta = 1073741824 - delta; + one_minus_delta = 1.0f - delta; for (pb = res_bands; pb < self->bs_param_bands; pb++) { smooth_band = *p_smoothing_data++; @@ -51,43 +53,32 @@ VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( for (row = 0; row < MAX_M_OUTPUT; row++) { for (col = 0; col < MAX_M_INPUT; col++) { self->m1_param_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m1_param_re_prev[pb][row][col])) - << 2; + (MULT(delta, self->m1_param_re[ps][pb][row][col]) + + MULT(one_minus_delta, self->m1_param_re_prev[pb][row][col])); self->m1_param_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m1_param_im_prev[pb][row][col])) - << 2; + (MULT(delta, self->m1_param_im[ps][pb][row][col]) + + MULT(one_minus_delta, self->m1_param_im_prev[pb][row][col])); self->m2_decor_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_decor_re_prev[pb][row][col])) - << 2; + (MULT(delta, self->m2_decor_re[ps][pb][row][col]) + + MULT(one_minus_delta, self->m2_decor_re_prev[pb][row][col])); self->m2_decor_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_decor_im_prev[pb][row][col])) - << 2; + (MULT(delta, self->m2_decor_im[ps][pb][row][col]) + + MULT(one_minus_delta, self->m2_decor_im_prev[pb][row][col])); self->m2_resid_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_resid_re_prev[pb][row][col])) - << 2; + (MULT(delta, self->m2_resid_re[ps][pb][row][col]) + + MULT(one_minus_delta, self->m2_resid_re_prev[pb][row][col])); self->m2_resid_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_resid_im_prev[pb][row][col])) - << 2; + (MULT(delta, self->m2_resid_im[ps][pb][row][col]) + + MULT(one_minus_delta, self->m2_resid_im_prev[pb][row][col])); } } + self->pre_mix_req++; } } for (ps = 1; ps < self->num_parameter_sets; ps++) { delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps]; - one_minus_delta = 1073741824 - delta; + one_minus_delta = 1.0f - delta; p_smoothing_data = &self->smoothing_data[ps][res_bands]; @@ -97,37 +88,32 @@ VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( for (row = 0; row < MAX_M_OUTPUT; row++) { for (col = 0; col < MAX_M_INPUT; col++) { self->m1_param_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m1_param_re[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m1_param_re[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m1_param_re[ps - 1][pb][row][col])); self->m1_param_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m1_param_im[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m1_param_im[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m1_param_im[ps - 1][pb][row][col])); self->m2_resid_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_resid_re[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m2_resid_re[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m2_resid_re[ps - 1][pb][row][col])); self->m2_decor_re[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_decor_re[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m2_decor_re[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m2_decor_re[ps - 1][pb][row][col])); self->m2_decor_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_decor_im[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m2_decor_im[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m2_decor_im[ps - 1][pb][row][col])); self->m2_resid_im[ps][pb][row][col] = - (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) + - ixheaacd_mult32(one_minus_delta, - self->m2_resid_im[ps - 1][pb][row][col])) - << 2; + (MULT(delta, self->m2_resid_im[ps][pb][row][col]) + + MULT(one_minus_delta, + self->m2_resid_im[ps - 1][pb][row][col])); } } + self->pre_mix_req++; } } } @@ -145,10 +131,15 @@ VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) { if (self->opd_smoothing_mode == 0) { for (pb = 0; pb < self->bs_param_bands; pb++) { +#define Q28_VALUE (1 << 28) self->opd_smooth.smooth_l_phase[pb] = - self->phase_l_fix[self->num_parameter_sets - 1][pb] >> 1; + ((WORD32)(self->phase_l[self->num_parameter_sets - 1][pb] * + Q28_VALUE)) >> + 1; self->opd_smooth.smooth_r_phase[pb] = - self->phase_r_fix[self->num_parameter_sets - 1][pb] >> 1; + ((WORD32)(self->phase_r[self->num_parameter_sets - 1][pb] * + Q28_VALUE)) >> + 1; } return; } @@ -162,9 +153,10 @@ VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) { for (pb = 0; pb < self->bs_param_bands; pb++) { int ltemp, rtemp, tmp; - - ltemp = self->phase_l_fix[ps][pb] >> 1; - rtemp = self->phase_r_fix[ps][pb] >> 1; +#define Q28_FLOAT_VAL ((float)(1 << 28)) +#define ONE_BY_Q28_FLOAT_VAL (1.0 / Q28_FLOAT_VAL) + ltemp = ((WORD32)(self->phase_l[ps][pb] * Q28_FLOAT_VAL)) >> 1; + rtemp = ((WORD32)(self->phase_r[ps][pb] * Q28_FLOAT_VAL)) >> 1; while (ltemp > self->opd_smooth.smooth_l_phase[pb] + PI_IN_Q27) ltemp -= 2 * PI_IN_Q27; @@ -204,9 +196,14 @@ VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) { self->opd_smooth.smooth_r_phase[pb] -= 2 * PI_IN_Q27; while (self->opd_smooth.smooth_r_phase[pb] < 0) self->opd_smooth.smooth_r_phase[pb] += 2 * PI_IN_Q27; - - self->phase_l_fix[ps][pb] = self->opd_smooth.smooth_l_phase[pb] << 1; - self->phase_r_fix[ps][pb] = self->opd_smooth.smooth_r_phase[pb] << 1; +#define Q28_FLOAT_VAL ((float)(1 << 28)) +#ifndef ONE_BY_Q28_FLOAT_VAL +#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL) +#endif + self->phase_l[ps][pb] = + (self->opd_smooth.smooth_l_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL; + self->phase_r[ps][pb] = + (self->opd_smooth.smooth_r_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL; } } } diff --git a/decoder/ixheaacd_mps_temp_process.c b/decoder/ixheaacd_mps_temp_process.c index 736996c..71c11b8 100644 --- a/decoder/ixheaacd_mps_temp_process.c +++ b/decoder/ixheaacd_mps_temp_process.c @@ -80,6 +80,8 @@ static const FLOAT32 ixheaacd_gf[BP_SIZE] = { 9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f, 0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f}; +extern const WORD32 ixheaacd_mps_gain_set_indx[29]; + static VOID ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct* self, WORD32 ts, FLOAT32* scale) { FLOAT32 dir_energy; @@ -182,7 +184,7 @@ static VOID ixheaacd_mps_subbandtp(ia_mps_dec_state_struct* self, WORD32 ts) { no_scaling = !self->temp_shape_enable_ch_stp[ch]; if (no_scaling == 1) { - for (n = 0; n < self->hyb_band_count; n++) { + for (n = 0; n < self->hyb_band_count_max; n++) { self->hyb_dir_out[ch][ts][n].re += self->hyb_diff_out[ch][ts][n].re; self->hyb_dir_out[ch][ts][n].im += self->hyb_diff_out[ch][ts][n].im; } @@ -202,7 +204,7 @@ static VOID ixheaacd_mps_subbandtp(ia_mps_dec_state_struct* self, WORD32 ts) { self->hyb_dir_out[ch][ts][n].im += (self->hyb_diff_out[ch][ts][n].im * temp); } - for (; n < self->hyb_band_count; n++) { + for (; n < self->hyb_band_count_max; n++) { temp = (FLOAT32)(scale[ch]); self->hyb_dir_out[ch][ts][n].re += (self->hyb_diff_out[ch][ts][n].re * temp); @@ -216,20 +218,46 @@ static VOID ixheaacd_mps_subbandtp(ia_mps_dec_state_struct* self, WORD32 ts) { WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) { WORD32 ch, ts, hyb; WORD32 err = 0; + ia_sbr_frame_info_data_struct* ptr_frame_data = + (ia_sbr_frame_info_data_struct*)self->p_sbr_frame[0]; + if (self->res_bands != 28) { + if (self->config->bs_temp_shape_config == 1) { + WORD32 dif_s = ((self->res_bands == 0) + ? 0 + : ixheaacd_mps_gain_set_indx[self->res_bands]); + for (ch = 0; ch < self->out_ch_count; ch++) { + for (ts = 0; ts < self->time_slots; ts++) { + for (hyb = dif_s; hyb < HYBRID_BAND_BORDER; hyb++) { + self->hyb_dir_out[ch][ts][hyb].re += + self->hyb_diff_out[ch][ts][hyb].re; + self->hyb_dir_out[ch][ts][hyb].im += + self->hyb_diff_out[ch][ts][hyb].im; + self->hyb_diff_out[ch][ts][hyb].re = 0; + self->hyb_diff_out[ch][ts][hyb].im = 0; + } + } + } - for (ch = 0; ch < self->out_ch_count; ch++) { - for (ts = 0; ts < self->time_slots; ts++) { - for (hyb = 0; hyb < HYBRID_BAND_BORDER; hyb++) { - self->hyb_dir_out[ch][ts][hyb].re += self->hyb_diff_out[ch][ts][hyb].re; - self->hyb_dir_out[ch][ts][hyb].im += self->hyb_diff_out[ch][ts][hyb].im; - self->hyb_diff_out[ch][ts][hyb].re = 0; - self->hyb_diff_out[ch][ts][hyb].im = 0; + for (ts = 0; ts < self->time_slots; ts++) + ixheaacd_mps_subbandtp(self, ts); + + } else { + WORD32 dif_s = ((self->res_bands == 0) + ? 0 + : ixheaacd_mps_gain_set_indx[self->res_bands]); + for (ch = 0; ch < self->out_ch_count; ch++) { + for (ts = 0; ts < self->time_slots; ts++) { + for (hyb = dif_s; hyb < self->hyb_band_count_max; hyb++) { + self->hyb_dir_out[ch][ts][hyb].re += + self->hyb_diff_out[ch][ts][hyb].re; + self->hyb_dir_out[ch][ts][hyb].im += + self->hyb_diff_out[ch][ts][hyb].im; + } + } } } } - for (ts = 0; ts < self->time_slots; ts++) ixheaacd_mps_subbandtp(self, ts); - ixheaacd_mps_qmf_hyb_synthesis(self); for (ch = 0; ch < self->out_ch_count; ch++) { @@ -239,6 +267,13 @@ WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) { if (err) return err; } + if (ptr_frame_data->mps_sbr_flag) { + self->synth_count = + ptr_frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end; + } else { + self->synth_count = self->band_count[0]; + } + ixheaacd_mps_synt_calc(self); return err; }
\ No newline at end of file diff --git a/decoder/ixheaacd_mps_temp_reshape.c b/decoder/ixheaacd_mps_temp_reshape.c index fd8e62c..69216a8 100644 --- a/decoder/ixheaacd_mps_temp_reshape.c +++ b/decoder/ixheaacd_mps_temp_reshape.c @@ -67,7 +67,7 @@ static VOID ixheaacd_mps_est_normalized_envelope(ia_mps_dec_state_struct *self, case DIR_DIFF_IN: ch_offset = 0; for (ii = 0; ii < self->time_slots; ii++) { - for (jj = 0; jj < self->hyb_band_count; jj++) { + for (jj = 0; jj < self->hyb_band_count_max; jj++) { slot_energy[ii] [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] += ((self->hyb_dir_out[ch][ii][jj].re + @@ -83,14 +83,26 @@ static VOID ixheaacd_mps_est_normalized_envelope(ia_mps_dec_state_struct *self, break; case DOWNMIX_IN: ch_offset = self->out_ch_count; - for (ii = 0; ii < self->time_slots; ii++) { - for (jj = 0; jj < self->hyb_band_count; jj++) { - slot_energy[ii] - [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] += - self->hyb_in[ch][ii][jj].re * self->hyb_in[ch][ii][jj].re + - self->hyb_in[ch][ii][jj].im * self->hyb_in[ch][ii][jj].im; + if ((self->pre_mix_req | self->bs_tsd_enable)) { + for (ii = 0; ii < self->time_slots; ii++) { + for (jj = 0; jj < self->hyb_band_count_max; jj++) { + slot_energy + [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] += + self->hyb_in[ch][jj][ii].re * self->hyb_in[ch][jj][ii].re + + self->hyb_in[ch][jj][ii].im * self->hyb_in[ch][jj][ii].im; + } + } + } else { + for (ii = 0; ii < self->time_slots; ii++) { + for (jj = 0; jj < self->hyb_band_count_max; jj++) { + slot_energy + [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] += + self->w_dir[ch][ii][jj].re * self->w_dir[ch][ii][jj].re + + self->w_dir[ch][ii][jj].im * self->w_dir[ch][ii][jj].im; + } } } + break; default: ch_offset = 0; @@ -168,7 +180,7 @@ VOID ixheaacd_mps_time_env_shaping(ia_mps_dec_state_struct *self) { amp_direct = 0; amp_diff = 0; - for (jj = band_start; jj < self->hyb_band_count; jj++) { + for (jj = band_start; jj < self->hyb_band_count_max; jj++) { amp_direct += self->hyb_dir_out[ch][time_slot][jj].re * self->hyb_dir_out[ch][time_slot][jj].re + self->hyb_dir_out[ch][time_slot][jj].im * @@ -184,7 +196,7 @@ VOID ixheaacd_mps_time_env_shaping(ia_mps_dec_state_struct *self) { ratio = min(max((gain + amp_ratio * (gain - 1)), 1 / LAMDA), LAMDA); - for (jj = band_start; jj < self->hyb_band_count; jj++) { + for (jj = band_start; jj < self->hyb_band_count_max; jj++) { self->hyb_dir_out[ch][time_slot][jj].re *= ratio; self->hyb_dir_out[ch][time_slot][jj].im *= ratio; } diff --git a/decoder/ixheaacd_multichannel.c b/decoder/ixheaacd_multichannel.c index d914ad2..998c194 100644 --- a/decoder/ixheaacd_multichannel.c +++ b/decoder/ixheaacd_multichannel.c @@ -255,35 +255,37 @@ IA_ERRORCODE ixheaacd_dec_coupling_channel_element( return error_status; } -void ixheaacd_dec_couple_channel(WORD16 *p_time_data, WORD16 *out_samp_cc, +void ixheaacd_dec_couple_channel(WORD32 *p_time_data, WORD32 *out_samp_cc, WORD16 frame_size, WORD total_channels, - WORD32 gain_cc) + WORD16 gain_cc) { WORD i; - WORD16 out_cc; - WORD16 *ptr_out_samp = &out_samp_cc[0]; + WORD32 out_cc; + WORD32 *ptr_out_samp = &out_samp_cc[0]; for (i = frame_size - 1; i >= 0; i--) { - out_cc = ixheaacd_round16(ixheaacd_shl32_sat( - ixheaacd_mult32x16in32(gain_cc, *ptr_out_samp++), 3)); - *p_time_data = ixheaacd_add16_sat(out_cc, *p_time_data); + out_cc = (ixheaacd_shl32_sat( + ixheaacd_mult32x16in32(*ptr_out_samp++, gain_cc), 3)); + *p_time_data = ixheaacd_add32_sat(out_cc, *p_time_data); p_time_data += total_channels; } } void ixheaacd_dec_ind_coupling( - ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD16 *coup_ch_output, - WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data) + ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 *coup_ch_output, + WORD16 frame_size, WORD total_channels, VOID *ptr_time_data_tmp) { WORD c, j, k; WORD l; WORD coupling_channel; - WORD16 *out_samp_cc; + WORD32 *out_samp_cc; ia_enhaacplus_dec_ind_cc *ind_channel_info; + WORD32 *ptr_time_data = (WORD32 *)ptr_time_data_tmp; + { coupling_channel = p_obj_exhaacplus_dec->aac_config.ui_coupling_channel; @@ -308,18 +310,18 @@ void ixheaacd_dec_ind_coupling( k = p_obj_exhaacplus_dec->aac_config.slot_element[l]; if (ind_channel_info->cc_target_is_cpe[c] == 0) { - WORD16 *p_time_data = &ptr_time_data[k]; + WORD32 *p_time_data = &ptr_time_data[k]; - WORD32 gain_cc = ind_channel_info->cc_gain[j]; + WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]); ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size, total_channels, gain_cc); } if (ind_channel_info->cc_target_is_cpe[c] == 1) { if (ind_channel_info->cc_l[c] == 1) { - WORD16 *p_time_data = &ptr_time_data[k]; + WORD32 *p_time_data = &ptr_time_data[k]; - WORD32 gain_cc = ind_channel_info->cc_gain[j]; + WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]); ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size, total_channels, gain_cc); @@ -328,8 +330,8 @@ void ixheaacd_dec_ind_coupling( k = p_obj_exhaacplus_dec->aac_config.slot_element[l]; if (ind_channel_info->cc_r[c] == 1) { - WORD16 *p_time_data = &ptr_time_data[k + 1]; - WORD32 gain_cc = ind_channel_info->cc_gain[j + 1]; + WORD32 *p_time_data = &ptr_time_data[k + 1]; + WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j + 1]); ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size, total_channels, gain_cc); diff --git a/decoder/ixheaacd_multichannel.h b/decoder/ixheaacd_multichannel.h index 9156f44..f641421 100644 --- a/decoder/ixheaacd_multichannel.h +++ b/decoder/ixheaacd_multichannel.h @@ -29,11 +29,11 @@ IA_ERRORCODE ixheaacd_dec_coupling_channel_element( ia_eld_specific_config_struct eld_specific_config, WORD32 ele_type); void ixheaacd_dec_ind_coupling( - ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 *coup_ch_output, - WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data); + ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD32 *coup_ch_output, + WORD16 frame_size, WORD total_channels, VOID *ptr_time_data); void ixheaacd_dec_downmix_to_stereo( ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 frame_size, WORD total_elements, WORD16 *ptr_time_data, WORD total_channels); -#endif /* IA_EAACP_DEC_MUTLCHANNEL_H */
\ No newline at end of file +#endif /* IA_EAACP_DEC_MUTLCHANNEL_H */ diff --git a/decoder/ixheaacd_peak_limiter.c b/decoder/ixheaacd_peak_limiter.c new file mode 100644 index 0000000..9c99e94 --- /dev/null +++ b/decoder/ixheaacd_peak_limiter.c @@ -0,0 +1,206 @@ +/****************************************************************************** + * * + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore +*/ +#include <stdlib.h> +#include <math.h> +#include <ixheaacd_type_def.h> +#include "ixheaacd_cnst.h" +#include "ixheaacd_peak_limiter_struct_def.h" +#include "ixheaacd_constants.h" +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#define MIN(x, y) ((x) > (y) ? (y) : (x)) + +/** +* ixheaacd_peak_limiter_init +* +* \brief Peak Limiter initialization +* +* \param [in/out] peak_limiter Pointer to peak_limiter struct +* \param [in] num_channels Number of ouptut channels +* \param [in] sample_rate Sampling rate value +* \param [in] buffer Peak limiter buffer of size PEAK_LIM_BUFFER_SIZE +* +* \return WORD32 +* +*/ +WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter, + UWORD32 num_channels, UWORD32 sample_rate, + FLOAT32 *buffer, UWORD32 *delay_in_samples) { + UWORD32 attack; + + attack = (UWORD32)(DEFAULT_ATTACK_TIME_MS * sample_rate / 1000); + *delay_in_samples = attack; + + if (attack < 1) return 0; + + peak_limiter->max_buf = buffer; + peak_limiter->max_idx = 0; + peak_limiter->cir_buf_pnt = 0; + peak_limiter->delayed_input = buffer + attack + 1; + + peak_limiter->delayed_input_index = 0; + peak_limiter->attack_time = DEFAULT_ATTACK_TIME_MS; + peak_limiter->release_time = DEFAULT_RELEASE_TIME_MS; + peak_limiter->attack_time_samples = attack; + peak_limiter->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1)); + peak_limiter->release_constant = (FLOAT32)pow( + 0.1, 1.0 / (DEFAULT_RELEASE_TIME_MS * sample_rate / 1000 + 1)); + peak_limiter->num_channels = num_channels; + peak_limiter->sample_rate = sample_rate; + peak_limiter->min_gain = 1.0f; + peak_limiter->limiter_on = 1; + peak_limiter->pre_smoothed_gain = 1.0f; + peak_limiter->gain_modified = 1.0f; + + return 0; +} + +/** +* ixheaacd_peak_limiter_process +* +* \brief Peak Limiter process +* +* \param [in/out] peak_limiter +* \param [in] samples +* \param [in] frame_len +* +* \return WORD32 +* +*/ +VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter, + VOID *samples_t, UWORD32 frame_len, + UWORD8 *qshift_adj) { + UWORD32 i, j; + FLOAT32 tmp, gain; + FLOAT32 min_gain = 1.0f; + FLOAT32 maximum; + UWORD32 num_channels = peak_limiter->num_channels; + UWORD32 attack_time_samples = peak_limiter->attack_time_samples; + FLOAT32 attack_constant = peak_limiter->attack_constant; + FLOAT32 release_constant = peak_limiter->release_constant; + FLOAT32 *max_buf = peak_limiter->max_buf; + FLOAT32 gain_modified = peak_limiter->gain_modified; + FLOAT32 *delayed_input = peak_limiter->delayed_input; + UWORD32 delayed_input_index = peak_limiter->delayed_input_index; + FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain; + WORD32 limit_threshold = 2147483647; + + WORD32 *samples = (WORD32 *)samples_t; + + if (peak_limiter->limiter_on || (FLOAT32)pre_smoothed_gain) { + for (i = 0; i < frame_len; i++) { + tmp = 0.0f; + for (j = 0; j < num_channels; j++) { + FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j)); + tmp = MAX(tmp, fabs((samples[i * num_channels + j] * gain_t))); + } + max_buf[peak_limiter->cir_buf_pnt] = tmp; + + if (peak_limiter->max_idx == peak_limiter->cir_buf_pnt) { + peak_limiter->max_idx = 0; + for (j = 1; j < (attack_time_samples); j++) { + if (max_buf[j] > max_buf[peak_limiter->max_idx]) + peak_limiter->max_idx = j; + } + } else if (tmp >= max_buf[peak_limiter->max_idx]) { + peak_limiter->max_idx = peak_limiter->cir_buf_pnt; + } + peak_limiter->cir_buf_pnt++; + + if (peak_limiter->cir_buf_pnt == (WORD32)(attack_time_samples)) + peak_limiter->cir_buf_pnt = 0; + maximum = max_buf[peak_limiter->max_idx]; + + if (maximum > limit_threshold) { + gain = limit_threshold / maximum; + } else { + gain = 1; + } + + if (gain < pre_smoothed_gain) { + gain_modified = + MIN(gain_modified, + (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f); + + } else { + gain_modified = gain; + } + + if (gain_modified < pre_smoothed_gain) { + pre_smoothed_gain = + attack_constant * (pre_smoothed_gain - gain_modified) + + gain_modified; + pre_smoothed_gain = MAX(pre_smoothed_gain, gain); + } else { + pre_smoothed_gain = + release_constant * (pre_smoothed_gain - gain_modified) + + gain_modified; + } + + gain = (FLOAT32)pre_smoothed_gain; + + for (j = 0; j < num_channels; j++) { + WORD64 tmp_fix; + tmp = delayed_input[delayed_input_index * num_channels + j]; + FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j)); + delayed_input[delayed_input_index * num_channels + j] = + samples[i * num_channels + j] * gain_t; + + tmp *= gain; + + tmp_fix = tmp; + + if (tmp_fix > limit_threshold) + tmp_fix = limit_threshold; + else if (tmp_fix < -limit_threshold) + tmp_fix = -limit_threshold; + + samples[i * num_channels + j] = tmp_fix; + } + + delayed_input_index++; + if (delayed_input_index >= attack_time_samples) delayed_input_index = 0; + + if (gain < min_gain) min_gain = gain; + } + } else { + for (i = 0; i < frame_len; i++) { + for (j = 0; j < num_channels; j++) { + tmp = delayed_input[delayed_input_index * num_channels + j]; + FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j)); + delayed_input[delayed_input_index * num_channels + j] = + samples[i * num_channels + j] * gain_t; + samples[i * num_channels + j] = tmp; + } + + delayed_input_index++; + if (delayed_input_index >= attack_time_samples) delayed_input_index = 0; + } + } + + peak_limiter->gain_modified = gain_modified; + peak_limiter->delayed_input_index = delayed_input_index; + peak_limiter->pre_smoothed_gain = pre_smoothed_gain; + peak_limiter->min_gain = min_gain; + + return; +} diff --git a/decoder/ixheaacd_peak_limiter_struct_def.h b/decoder/ixheaacd_peak_limiter_struct_def.h new file mode 100644 index 0000000..1241418 --- /dev/null +++ b/decoder/ixheaacd_peak_limiter_struct_def.h @@ -0,0 +1,52 @@ +/****************************************************************************** + * * + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore +*/ +#ifndef IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H +#define IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H + +#define MAX_CHANNEL 6 +/*(PEAK_LIM_SIZE = ATTACK_TIME * MAX_SAMPLING_RATE / 1000) + 1*/ +#define PEAK_LIM_SIZE 481 +#define PEAK_LIM_BUFFER_SIZE PEAK_LIM_SIZE *(MAX_CHANNEL + 1) + +#define DEFAULT_ATTACK_TIME_MS (5.0f) +#define DEFAULT_RELEASE_TIME_MS (50.0f) + +typedef struct ia_peak_limiter_struct { + FLOAT32 attack_time; + FLOAT32 release_time; + FLOAT32 attack_constant; + FLOAT32 release_constant; + FLOAT32 limit_threshold; + UWORD32 num_channels; + UWORD32 sample_rate; + UWORD32 attack_time_samples; + UWORD32 limiter_on; + FLOAT32 gain_modified; + FLOAT64 pre_smoothed_gain; + FLOAT32 *delayed_input; + UWORD32 delayed_input_index; + FLOAT32 *max_buf; + FLOAT32 min_gain; + FLOAT32 buffer[PEAK_LIM_BUFFER_SIZE]; + WORD32 max_idx; + WORD32 cir_buf_pnt; +} ia_peak_limiter_struct; + +#endif /* IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H */ diff --git a/decoder/ixheaacd_process.c b/decoder/ixheaacd_process.c index f1c7202..672f4c6 100644 --- a/decoder/ixheaacd_process.c +++ b/decoder/ixheaacd_process.c @@ -94,7 +94,9 @@ VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct, VOID *base_scratch_ptr, VOID *output_ptr, WORD total_elements, WORD ch_fac, - WORD32 object_type); + WORD32 object_type, WORD32 total_channels, + WORD8 *p_qshift_arr, UWORD8 slot_element, + WORD32 channel); IA_ERRORCODE ixheaacd_applysbr( ia_handle_sbr_dec_inst_struct self, @@ -117,7 +119,7 @@ IA_ERRORCODE ixheaacd_esbr_process(ia_usac_data_struct *usac_data, ia_sbr_scr_struct sbr_scratch_struct; ixheaacd_allocate_sbr_scr(&sbr_scratch_struct, usac_data->sbr_scratch_mem_base, NULL, 2, 1, - audio_object_type); + audio_object_type, 0, NULL, 0, 0); self->usac_independency_flag = usac_data->usac_independency_flg; @@ -381,6 +383,13 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, pstr_usac_data->usac_independency_flg, it_bit_buff); if (err) return err; + p_state_aac_dec->mps_dec_handle.band_count[0] = + pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[0] + ->str_sbr_dec.band_count; + p_state_aac_dec->mps_dec_handle.band_count[1] = + pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1] + ->str_sbr_dec.band_count; + for (ch = 0; ch < nr_core_coder_channels; ch++) { ptr_inp[2 * ch] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch] diff --git a/decoder/ixheaacd_rom.c b/decoder/ixheaacd_rom.c index 0e10e6a..d09c6cd 100644 --- a/decoder/ixheaacd_rom.c +++ b/decoder/ixheaacd_rom.c @@ -453,6 +453,11 @@ const WORD32 ixheaacd_twiddle_table_fft_32x32[514] = { 0x8009de7e, 0x03242abe, 0x80058d2f, 0x025b26d7, 0x800277a6, 0x01921d1f, 0x80009dea, 0x00c90f87, 0x80000000, 0x00000000}; +const FLOAT32 ixheaacd_twiddle_table_fft_flt[16] = { + 1.000000f, -0.000000f, 0.980785f, -0.195090f, 0.923880f, -0.382683f, + 0.831470f, -0.555570f, 0.707107f, -0.707107f, 0.555570f, -0.831470f, + 0.382683f, -0.923880f, 0.195090f, -0.980785f}; + const WORD32 ixheaacd_twiddle_table_3pr[1155] = { 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1, 0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7fd8878c, 0x7f62368e, @@ -4291,5 +4296,4 @@ const FLOAT32 ixheaacd_dico_lsf_abs_8b_flt[16 * 256] = { 2437.3232f, 2691.4072f, 3030.3025f, 3524.1379f, 3771.7576f, 4083.2375f, 4601.1567f, 4963.4697f, 5434.8530f, 5942.8315f}; -const WORD8 ixheaacd_mps_dig_rev[16] = {0, 8, 16, 24, 2, 10, 18, 26, - 4, 12, 20, 28, 6, 14, 22, 30};
\ No newline at end of file +const WORD8 ixheaacd_mps_dig_rev[8] = {0, 4, 8, 12, 2, 6, 10, 14}; diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c index 671f4d6..2287c6c 100644 --- a/decoder/ixheaacd_sbr_dec.c +++ b/decoder/ixheaacd_sbr_dec.c @@ -285,10 +285,6 @@ VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec, ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = ((FLOAT32)ploc_qmf_buf_imag[z] * gain); } - for (z = core_syn_ch_index; z < num_columns; z++) { - ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f; - ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f; - } } pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1; @@ -735,7 +731,6 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_sbr_dec->p_hbe_txposer->max_stretch); } } - ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); if (!mps_sbr_flag && apply_processing) { WORD32 err_code = 0; @@ -752,6 +747,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; if (sbr_mode == PVC_SBR) { + ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); err_code = ixheaacd_pvc_process( ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start, ptr_frame_data->str_pvc_frame_info.border_vec[0], @@ -788,6 +784,12 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, } } + if (!mps_sbr_flag) { + ptr_sbr_dec->band_count = + ptr_header_data->pstr_freq_band_data->sub_band_end; + } else + ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; + ixheaacd_esbr_synthesis_filt_block( ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr, @@ -1135,6 +1137,8 @@ WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32)); } + ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; + ixheaacd_esbr_synthesis_filt_block( ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables, @@ -1168,6 +1172,8 @@ WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, if (!mps_sbr_flag) { return 0; + } else { + ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; } no_bins = ptr_header_data->output_framesize / 64; diff --git a/decoder/ixheaacd_sbr_dec.h b/decoder/ixheaacd_sbr_dec.h index 0461d39..8bafa92 100644 --- a/decoder/ixheaacd_sbr_dec.h +++ b/decoder/ixheaacd_sbr_dec.h @@ -67,6 +67,7 @@ typedef struct { ia_sbr_scale_fact_struct str_sbr_scale_fact; WORD32 max_samp_val; + WORD32 band_count; ia_esbr_hbe_txposer_struct *p_hbe_txposer; FLOAT32 core_sample_buf[2624]; diff --git a/decoder/ixheaacd_sbrdec_initfuncs.c b/decoder/ixheaacd_sbrdec_initfuncs.c index f779c84..2793fe5 100644 --- a/decoder/ixheaacd_sbrdec_initfuncs.c +++ b/decoder/ixheaacd_sbrdec_initfuncs.c @@ -543,6 +543,7 @@ ia_handle_sbr_dec_inst_struct ixheaacd_init_sbr( audio_object_type); ptr_header_data[i]->status = 1; + ptr_sbr_dec[i]->band_count = 64; if (err) { return NULL; diff --git a/decoder/ixheaacd_sbrdec_lpfuncs.c b/decoder/ixheaacd_sbrdec_lpfuncs.c index 5e535dc..600305f 100644 --- a/decoder/ixheaacd_sbrdec_lpfuncs.c +++ b/decoder/ixheaacd_sbrdec_lpfuncs.c @@ -981,7 +981,7 @@ WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], WORD32 pre_proc_flag = ptr_header_data->pre_proc_flag; WORD32 is_usf_4 = ptr_header_data->is_usf_4; WORD32 fs = ptr_header_data->out_sampling_freq; - + WORD32 cov_count; WORD32 lsb = f_master_tbl[0]; WORD32 usb = f_master_tbl[num_mf_bands]; WORD32 xover_offset = sub_band_start - f_master_tbl[0]; @@ -1023,9 +1023,16 @@ WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], } if (sbr_patching_mode || !hbe_flag) { - FLOAT32 alpha_real[64][2], alpha_imag[64][2]; + FLOAT32 alpha_real[64][2] = {{0}}, alpha_imag[64][2] = {{0}}; + if (ptr_frame_data->mps_sbr_flag) { + cov_count = (f_master_tbl[0] < ptr_frame_data->cov_count) + ? f_master_tbl[0] + : ptr_frame_data->cov_count; + } else { + cov_count = f_master_tbl[0]; + } - for (k = 1; k < f_master_tbl[0]; k++) { + for (k = 1; k < cov_count; k++) { ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_src_buf_real[0], &ptr_src_buf_imag[0], k, co_var_len); if (str_auto_corr.det == 0.0f) { diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h index d348d99..f7fe3fe 100644 --- a/decoder/ixheaacd_struct_def.h +++ b/decoder/ixheaacd_struct_def.h @@ -21,6 +21,8 @@ #define IXHEAACD_STRUCT_DEF_H #include <setjmp.h> +#include <stdbool.h> +#include "ixheaacd_peak_limiter_struct_def.h" #define MAX_OUTPUT_CHANNELS (8) #define MAX_NUM_OTT (1) @@ -46,6 +48,10 @@ #define MAX_TIME_SLOTS (72) #define MAX_NO_TIME_SLOTS_DELAY (14) +#define MAX_PREROLL_FRAME_OFFSET 4 +// max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + 2^8 -1; +#define MAX_PREROLL_SIZE 285 + typedef struct { WORD8 element_instance_tag; WORD32 object_type; @@ -137,6 +143,9 @@ typedef struct { WORD32 ui_flush_cmd; ia_drc_config drc_config_struct; + WORD32 output_level; + WORD32 i_loud_ref_level; + UWORD8 dup_stereo_flag; } ia_aac_dec_config_struct; @@ -180,7 +189,7 @@ typedef struct ia_aac_dec_state_struct { WORD32 last_frame_ok; WORD32 i_bytes_consumed; - WORD16 *coup_ch_output; + WORD32 *coup_ch_output; ia_enhaacplus_dec_ind_cc ind_cc_info; WORD8 protection_absent; @@ -237,6 +246,17 @@ typedef struct ia_aac_dec_state_struct { WORD32 decode_create_done; WORD32 fatal_err_present; WORD8 *pers_mem_ptr; + bool preroll_config_present; + UWORD8 preroll_config_prev[MAX_PREROLL_SIZE]; + + UWORD8 qshift_cnt; + WORD8 qshift_adj[16]; + UWORD32 delay_in_samples; + UWORD8 peak_lim_init; + ia_peak_limiter_struct peak_limiter; + UWORD8 sbr_present; + UWORD8 slot_pos; + } ia_aac_dec_state_struct; typedef struct ia_exhaacplus_dec_api_struct { @@ -256,14 +276,14 @@ typedef struct ia_exhaacplus_dec_api_struct { WORD32 ixheaacd_aacdec_decodeframe( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, - ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data, + ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data, FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel, WORD *element_index_order, WORD skip_full_decode, WORD ch_fac, WORD slot_element, WORD max_channels, WORD32 total_channels, WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 ch_config, ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader, - ia_drc_dec_struct *drc_dummy); + ia_drc_dec_struct *drc_dummy, UWORD8 *slot_pos); WORD ixheaacd_get_channel_mask( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec); diff --git a/decoder/x86/ixheaacd_function_selector_x86.c b/decoder/x86/ixheaacd_function_selector_x86.c index f9c71fa..431d3c9 100644 --- a/decoder/x86/ixheaacd_function_selector_x86.c +++ b/decoder/x86/ixheaacd_function_selector_x86.c @@ -74,7 +74,7 @@ VOID(*ixheaacd_covariance_matrix_calc_2) WORD16) = &ixheaacd_covariance_matrix_calc_2_dec; VOID(*ixheaacd_over_lap_add1) -(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16, +(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16) = &ixheaacd_over_lap_add1_dec; VOID(*ixheaacd_over_lap_add2) @@ -159,13 +159,13 @@ VOID(*ixheaacd_post_twiddle) WORD npoints) = &ixheaacd_post_twiddle_dec; VOID(*ixheaacd_post_twid_overlap_add) -(WORD16 pcm_out[], WORD32 spec_data[], +(WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec; VOID(*ixheaacd_neg_shift_spec) -(WORD32 *coef, WORD16 *out, WORD16 q_shift, +(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec; VOID(*ixheaacd_spec_to_overlapbuf) @@ -173,11 +173,11 @@ VOID(*ixheaacd_spec_to_overlapbuf) WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec; VOID(*ixheaacd_overlap_buf_out) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec; VOID(*ixheaacd_overlap_out_copy) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec; VOID(*ixheaacd_pretwiddle_compute) @@ -193,18 +193,6 @@ VOID(*ixheaacd_complex_fft_p2) (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec; -VOID(*ixheaacd_mps_complex_fft_64) -(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, - WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; - -VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; - -VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; - VOID(*ixheaacd_calc_pre_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec; @@ -213,14 +201,9 @@ VOID(*ixheaacd_calc_post_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; -VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; - VOID(*ixheaacd_mps_synt_out_calc) -(WORD32 resolution, WORD32 *out, WORD32 *state, - const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; +(WORD32 resolution, FLOAT32 *out, FLOAT32 *state, + const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; VOID(*ixheaacd_fft_15_ld) (WORD32 *inp, WORD32 *op, WORD32 *fft3out, @@ -246,4 +229,4 @@ VOID(*ixheaacd_inv_dit_fft_8pt) VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, - WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file + WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec; diff --git a/decoder/x86_64/ixheaacd_function_selector_x86_64.c b/decoder/x86_64/ixheaacd_function_selector_x86_64.c index f9c71fa..431d3c9 100644 --- a/decoder/x86_64/ixheaacd_function_selector_x86_64.c +++ b/decoder/x86_64/ixheaacd_function_selector_x86_64.c @@ -74,7 +74,7 @@ VOID(*ixheaacd_covariance_matrix_calc_2) WORD16) = &ixheaacd_covariance_matrix_calc_2_dec; VOID(*ixheaacd_over_lap_add1) -(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16, +(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16, WORD16) = &ixheaacd_over_lap_add1_dec; VOID(*ixheaacd_over_lap_add2) @@ -159,13 +159,13 @@ VOID(*ixheaacd_post_twiddle) WORD npoints) = &ixheaacd_post_twiddle_dec; VOID(*ixheaacd_post_twid_overlap_add) -(WORD16 pcm_out[], WORD32 spec_data[], +(WORD32 pcm_out[], WORD32 spec_data[], ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints, WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window, WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec; VOID(*ixheaacd_neg_shift_spec) -(WORD32 *coef, WORD16 *out, WORD16 q_shift, +(WORD32 *coef, WORD32 *out, WORD16 q_shift, WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec; VOID(*ixheaacd_spec_to_overlapbuf) @@ -173,11 +173,11 @@ VOID(*ixheaacd_spec_to_overlapbuf) WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec; VOID(*ixheaacd_overlap_buf_out) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size, const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec; VOID(*ixheaacd_overlap_out_copy) -(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, +(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1, const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec; VOID(*ixheaacd_pretwiddle_compute) @@ -193,18 +193,6 @@ VOID(*ixheaacd_complex_fft_p2) (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode, WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec; -VOID(*ixheaacd_mps_complex_fft_64) -(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, - WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; - -VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; - -VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, - WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; - VOID(*ixheaacd_calc_pre_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec; @@ -213,14 +201,9 @@ VOID(*ixheaacd_calc_post_twid) (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; -VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, - const WORD32 *table_im, - WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; - VOID(*ixheaacd_mps_synt_out_calc) -(WORD32 resolution, WORD32 *out, WORD32 *state, - const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; +(WORD32 resolution, FLOAT32 *out, FLOAT32 *state, + const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec; VOID(*ixheaacd_fft_15_ld) (WORD32 *inp, WORD32 *op, WORD32 *fft3out, @@ -246,4 +229,4 @@ VOID(*ixheaacd_inv_dit_fft_8pt) VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, - WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file + WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec; diff --git a/docs/Api_flowchart.png b/docs/Api_flowchart.png Binary files differnew file mode 100644 index 0000000..4fb8418 --- /dev/null +++ b/docs/Api_flowchart.png |