diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index 00f45355dc8ea4b35d0280e42a3a12a0eb98f5d8..783612c13bfcc29a970e6f9d45b4759662fdb0fb 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -30,6 +30,8 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) { } } +def doRedHatBuild = false + pipeline { agent { label 'bellatrix' @@ -38,10 +40,35 @@ pipeline { disableConcurrentBuilds() timestamps() gitLabConnection('OAI GitLab') - gitlabBuilds(builds: ["Build eNb-USRP", "Build basic-sim", "Build phy-sim", "Build eNb-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim"]) + gitlabBuilds(builds: ["Build eNb-USRP", "Build basic-sim", "Build phy-sim", "Build eNb-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test basic-sim", "Test-FDD-Band7", "Test-TDD-Band40"]) + ansiColor('xterm') } stages { + stage ("Verify Parameters") { + steps { + script { + echo '\u2705 \u001B[32mVerify Parameters\u001B[0m' + def allParametersPresent = true + + if (params.RedHatRemoteServer == null) { + allParametersPresent = false + } + if (params.RedHatRemoteCredentials == null) { + allParametersPresent = false + } + if (params.RedHatWorkingPath == null) { + allParametersPresent = false + } + if (allParametersPresent) { + echo "Performing Red Hat Build" + doRedHatBuild = true + } else { + doRedHatBuild = false + } + } + } + } stage ("Verify Guidelines") { steps { echo "Git URL is ${GIT_URL}" @@ -126,14 +153,14 @@ pipeline { stage ("Analysis with cppcheck") { steps { gitlabCommitStatus(name: "Analysis with cppcheck") { - sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" + sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}" } } } stage ("Build eNb-USRP") { steps { gitlabCommitStatus(name: "Build eNb-USRP") { - sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" + sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}" } } } @@ -165,22 +192,52 @@ pipeline { } } } + stage ("Build eNb-USRP on Red Hat") { + when { + expression {doRedHatBuild} + } + steps { + gitlabCommitStatus(name: "Build eNb-USRP-CentOS") { + script { + try { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.RedHatRemoteCredentials}", usernameVariable: 'RH_Username', passwordVariable: 'RH_Password'] + ]) { + sh "./ci-scripts/buildOnRH.sh --workspace $WORKSPACE --job-name ${JOB_NAME} --build-id ${BUILD_ID} --remote-host ${params.RedHatRemoteServer} --remote-path ${params.RedHatWorkingPath} --remote-user-name ${RH_Username} --remote-password ${RH_Password}" + } + } catch (Exception e) { + echo "Red Hat build failed not an error now" + } + } + } + } + } } post { always { script { dir ('archives') { - sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth" + sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth red_hat" } if(fileExists('archives/vm_build_logs.zip')) { archiveArtifacts artifacts: 'archives/vm_build_logs.zip' } if ("MERGE".equals(env.gitlabActionType)) { sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" + sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}" + def res=readFile('./oai_warning_files.txt').trim(); + if ("0".equals(res)) { + echo "No issues w/ warnings/errors in this merge request" + } else { + def fileList=readFile('./oai_warning_files_list.txt').trim(); + def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some modified files in Merge Request MAY have INTRODUCED WARNINGS (" + fileList + ")" + addGitLabMRComment comment: message + } } else { sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}" } if(fileExists('build_results.html')) { + sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: <a href=\"{BUILD_URL}\">${BUILD_ID}</a>#' build_results.html" archiveArtifacts artifacts: 'build_results.html' } } @@ -193,36 +250,113 @@ pipeline { stage ("Test physical simulators") { steps { gitlabCommitStatus(name: "Test phy-sim") { - sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" + sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}" } } } stage ("Test basic simulator") { steps { - //gitlabCommitStatus(name: "Test basic-sim") { + gitlabCommitStatus(name: "Test basic-sim") { sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" - //} + } } } - stage ("Test FDD - Band 7 - B210") { - steps { - script { - if ("MERGE".equals(env.gitlabActionType)) { - build job: 'eNB-CI-FDD-Band7-B210', - parameters: [ - string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), - string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)), - string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)), - booleanParam(name: 'eNB_mergeRequest', value: true) - ] - } else { - build job: 'eNB-CI-FDD-Band7-B210', - parameters: [ - string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), - string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)), - string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)), - booleanParam(name: 'eNB_mergeRequest', value: false) - ] + stage ("Test on CI bench #1") { + stages { + stage ("Test FDD - Band 7 - B210") { + steps { + script { + try { + if ("MERGE".equals(env.gitlabActionType)) { + gitlabCommitStatus(name: "Test-FDD-Band7") { + build job: 'eNB-CI-FDD-Band7-B210', + parameters: [ + string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), + string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)), + string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)), + booleanParam(name: 'eNB_mergeRequest', value: true) + ] + } + } else { + gitlabCommitStatus(name: "Test-FDD-Band7") { + build job: 'eNB-CI-FDD-Band7-B210', + parameters: [ + string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), + string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)), + string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)), + booleanParam(name: 'eNB_mergeRequest', value: false) + ] + } + } + } catch (Exception e) { + currentBuild.result = 'FAILURE' + } + } + } + post { + // In case of any non-success, we are retrieving the HTML report of the last completed + // slave job. + // The only drop-back is that we may retrieve the HTML report of a previous build + always { + script { + if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) { + copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210', + filter: 'test_results*.html', + selector: lastCompleted()) + if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) { + archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html' + } + } + } + } + } + } + stage ("Test TDD - Band 40 - B210") { + steps { + script { + try { + if ("MERGE".equals(env.gitlabActionType)) { + gitlabCommitStatus(name: "Test-TDD-Band40") { + build job: 'eNB-CI-TDD-Band40-B210', + parameters: [ + string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), + string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)), + string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)), + booleanParam(name: 'eNB_mergeRequest', value: true) + ] + } + } else { + gitlabCommitStatus(name: "Test-TDD-Band40") { + build job: 'eNB-CI-TDD-Band40-B210', + parameters: [ + string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), + string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)), + string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)), + booleanParam(name: 'eNB_mergeRequest', value: false) + ] + } + } + } catch (Exception e) { + currentBuild.result = 'FAILURE' + } + } + } + post { + // In case of any non-success, we are retrieving the HTML report of the last completed + // slave job. + // The only drop-back is that we may retrieve the HTML report of a previous build + always { + script { + if (!fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) { + copyArtifacts(projectName: 'eNB-CI-TDD-Band40-B210', + filter: 'test_results*.html', + selector: lastCompleted()) + if (fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) { + archiveArtifacts artifacts: 'test_results-eNB-CI-TDD-Band40-B210.html' + } + } + } + } } } } @@ -232,12 +366,19 @@ pipeline { always { script { dir ('archives') { - sh "if [ -d */test ]; then zip -r -qq vm_tests_logs.zip */test ; fi" + sh "if [ -d basic_sim/test ] || [ -d phy_sim/test ]; then zip -r -qq vm_tests_logs.zip */test ; fi" } if(fileExists('archives/vm_tests_logs.zip')) { archiveArtifacts artifacts: 'archives/vm_tests_logs.zip' - archiveArtifacts artifacts: 'archives/*/test/results_autotests*.xml' - archiveArtifacts artifacts: 'archives/*/test/*.xsl' + if ("MERGE".equals(env.gitlabActionType)) { + sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" + } else { + sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}" + } + if(fileExists('test_simulator_results.html')) { + sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: <a href=\"{BUILD_URL}\">${BUILD_ID}</a>#' test_simulator_results.html" + archiveArtifacts artifacts: 'test_simulator_results.html' + } } } } diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran index b03ec4f4332b061a558d14ea60c5c01e023f3bfb..4db4ec0b2de51b0bb294f99e9b93589b34fc26c0 100644 --- a/ci-scripts/Jenkinsfile-tmp-ran +++ b/ci-scripts/Jenkinsfile-tmp-ran @@ -44,9 +44,12 @@ termStatusArray[termSPGW] = false termStatusArray[termMME] = false termStatusArray[termHSS] = false +// Global Parameters. Normally they should be populated when the master job +// triggers the slave job with parameters def eNB_Repository def eNB_Branch def eNB_CommitID +def eNB_AllowMergeRequestProcess = false pipeline { agent { @@ -118,7 +121,7 @@ pipeline { if (params.eNB_Credentials == null) { allParametersPresent = false } - // the following 3 parameters should be pushed by the master trigger + // the following 4 parameters should be pushed by the master trigger // if not present, take the job GIT variables (used for developing) if (params.eNB_Repository == null) { eNB_Repository = env.GIT_URL @@ -138,6 +141,9 @@ pipeline { eNB_CommitID = params.eNB_CommitID } echo "eNB_CommitID : ${eNB_CommitID}" + if (params.eNB_mergeRequest != null) { + eNB_AllowMergeRequestProcess = params.eNB_mergeRequest + } if (params.EPC_IPAddress == null) { allParametersPresent = false @@ -179,7 +185,7 @@ pipeline { [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'], [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'] ]) { - sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${testXMLFile}" + sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${testXMLFile}" } } catch (Exception e) { currentBuild.result = 'FAILURE' @@ -312,6 +318,11 @@ pipeline { if(fileExists("enb.log.${env.BUILD_ID}.zip")) { archiveArtifacts "enb.log.${env.BUILD_ID}.zip" } + if(fileExists("ci-scripts/test_results.html")) { + sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html" + sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's#TEMPLATE_BUILD_ID#<a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' test_results-${JOB_NAME}.html" + archiveArtifacts "test_results-${JOB_NAME}.html" + } } } } @@ -387,6 +398,24 @@ pipeline { } } } + stage('Log Collection (Iperf)') { + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("iperf.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "iperf.log.${env.BUILD_ID}.zip" + } + } + } + } } } } diff --git a/ci-scripts/buildOnRH.sh b/ci-scripts/buildOnRH.sh new file mode 100755 index 0000000000000000000000000000000000000000..ce5b24dc4931de5238cca91946733378031ce58b --- /dev/null +++ b/ci-scripts/buildOnRH.sh @@ -0,0 +1,209 @@ +#!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 +# * +# * 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. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +function usage { + echo "OAI RedHat Build Check script" + echo " Original Author: Raphael Defosseux" + + echo "" + echo "Usage:" + echo "------" + echo " buildOnRH.sh [OPTIONS]" + echo "" + echo "Options:" + echo "--------" + echo " --job-name #### OR -jn ####" + echo " Specify the name of the Jenkins job." + echo "" + echo " --build-id #### OR -id ####" + echo " Specify the build ID of the Jenkins job." + echo "" + echo " --workspace #### OR -ws ####" + echo " Specify the workspace." + echo "" + echo " --remote-host #### OR -rh ####" + echo " Specify the RedHat remote server." + echo "" + echo " --remote-user-name #### OR -ru ####" + echo " Specify the RedHat remote server username." + echo "" + echo " --remote-password #### OR -rp ####" + echo " Specify the RedHat remote server password." + echo "" + echo " --remote-path #### OR -ra ####" + echo " Specify the RedHat remote server path to work on." + echo "" +} + +if [ $# -lt 1 ] || [ $# -gt 14 ] +then + echo "Syntax Error: not the correct number of arguments" + echo "" + usage + exit 1 +fi + +RH_HOST=XX +RH_USER=XX +RH_PASSWD=XX +RH_PATH=XX +JOB_NAME=XX +BUILD_ID=XX + +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -h|--help) + shift + usage + exit 0 + ;; + -jn|--job-name) + JOB_NAME="$2" + shift + shift + ;; + -id|--build-id) + BUILD_ID="$2" + shift + shift + ;; + -ws|--workspace) + JENKINS_WKSP="$2" + shift + shift + ;; + -rh|--remote-host) + RH_HOST="$2" + shift + shift + ;; + -ru|--remote-user-name) + RH_USER="$2" + shift + shift + ;; + -rp|--remote-password) + RH_PASSWD="$2" + shift + shift + ;; + -ra|--remote-path) + RH_PATH="$2" + shift + shift + ;; + *) + echo "Syntax Error: unknown option: $key" + echo "" + usage + exit 1 +esac +done + +if [ ! -f $JENKINS_WKSP/localZip.zip ] +then + echo "Missing localZip.zip file!" + exit 1 +fi + +if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ] || [ "$RH_HOST" == "XX" ] || [ "$RH_USER" == "XX" ] || [ "$RH_PASSWD" == "XX" ] || [ "$RH_PATH" == "XX" ] +then + echo "Missing options" + usage + exit 1 +fi + +echo "############################################################" +echo "Copying GIT repo into RedHat Server" +echo "############################################################" +echo "rm -Rf ${RH_PATH}" >> rh-cmd.txt +echo "mkdir -p ${RH_PATH}" >> rh-cmd.txt + +sshpass -p ${RH_PASSWD} ssh -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST} < rh-cmd.txt +rm -f rh-cmd.txt + +echo "############################################################" +echo "Running install and build script on RedHat Server" +echo "############################################################" +sshpass -p ${RH_PASSWD} scp -o 'StrictHostKeyChecking no' $JENKINS_WKSP/localZip.zip ${RH_USER}@${RH_HOST}:${RH_PATH} + +echo "cd ${RH_PATH}" > rh-cmd.txt +echo "unzip -qq localZip.zip" >> rh-cmd.txt +echo "source oaienv" >> rh-cmd.txt +echo "cd cmake_targets" >> rh-cmd.txt +echo "mkdir -p log" >> rh-cmd.txt +echo "./build_oai -I -w USRP --eNB > log/install-build.txt 2>&1" >> rh-cmd.txt +sshpass -p ${RH_PASSWD} ssh -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST} < rh-cmd.txt + +rm -f rh-cmd.txt + +echo "############################################################" +echo "Creating a tmp folder to store results and artifacts" +echo "############################################################" +if [ ! -d $JENKINS_WKSP/archives ] +then + mkdir -p $JENKINS_WKSP/archives +fi + +ARCHIVES_LOC=$JENKINS_WKSP/archives/red_hat +if [ ! -d $ARCHIVES_LOC ] +then + mkdir -p $ARCHIVES_LOC +fi + +sshpass -p ${RH_PASSWD} scp -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST}:${RH_PATH}/cmake_targets/log/*.txt $ARCHIVES_LOC + +echo "############################################################" +echo "Checking build status" +echo "############################################################" + +LOG_PATTERN=.Rel14.txt +NB_PATTERN_FILES=4 + +LOG_FILES=`ls $ARCHIVES_LOC/*.txt` +STATUS=0 +NB_FOUND_FILES=0 + +for FULLFILE in $LOG_FILES +do + if [[ $FULLFILE == *"$LOG_PATTERN"* ]] + then + filename=$(basename -- "$FULLFILE") + PASS_PATTERN=`echo $filename | sed -e "s#$LOG_PATTERN##"` + LOCAL_STAT=`egrep -c "Built target $PASS_PATTERN" $FULLFILE` + if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi + NB_FOUND_FILES=$((NB_FOUND_FILES + 1)) + fi +done + +if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]; then STATUS=-1; fi + +if [ $STATUS -eq 0 ] +then + echo "STATUS seems OK" +else + echo "STATUS failed?" +fi +exit $STATUS diff --git a/ci-scripts/buildOnVM.sh b/ci-scripts/buildOnVM.sh index 76a11c6d383eecabf66c5c5c8b8994461cb1dff9..3eb24932bf685b04beaa4b0fa5fe88debb440893 100755 --- a/ci-scripts/buildOnVM.sh +++ b/ci-scripts/buildOnVM.sh @@ -86,6 +86,7 @@ JOB_NAME=XX BUILD_ID=XX VM_NAME=ci-enb-usrp VM_MEMORY=2048 +VM_CPU=4 ARCHIVES_LOC=enb_usrp LOG_PATTERN=.Rel14.txt NB_PATTERN_FILES=4 @@ -135,6 +136,8 @@ case $key in LOG_PATTERN=basic_simulator NB_PATTERN_FILES=2 BUILD_OPTIONS="--basic-simulator" + VM_MEMORY=8192 + VM_CPU=4 shift ;; -v3) @@ -186,6 +189,8 @@ case $key in LOG_PATTERN=basic_simulator NB_PATTERN_FILES=2 BUILD_OPTIONS="--basic-simulator" + VM_MEMORY=8192 + VM_CPU=4 ;; phy-sim) VM_NAME=ci-phy-sim @@ -270,7 +275,7 @@ then echo "############################################################" echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base" echo "############################################################" - uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml + uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml fi echo "Waiting for VM to be started" @@ -289,6 +294,7 @@ echo "############################################################" echo "Running install and build script on VM ($VM_NAME)" echo "############################################################" echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $VM_CMDS +echo "touch /home/ubuntu/.hushlogin" >> $VM_CMDS if [[ "$VM_NAME" == *"-cppcheck"* ]] then echo "echo \"sudo apt-get --yes --quiet install zip cppcheck \"" >> $VM_CMDS diff --git a/ci-scripts/checkAddedWarnings.sh b/ci-scripts/checkAddedWarnings.sh new file mode 100755 index 0000000000000000000000000000000000000000..609261becff992d566369526508374543a5ce528 --- /dev/null +++ b/ci-scripts/checkAddedWarnings.sh @@ -0,0 +1,144 @@ +#!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 +# * +# * 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. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +function usage { + echo "OAI Warning Check script" + echo " Original Author: Raphael Defosseux" + echo "" + echo "Usage:" + echo "------" + echo " checkAddedWarnings.sh [OPTIONS]" + echo "" + echo "Options:" + echo "--------" + echo " --src-branch #### OR -sb ####" + echo " Specify the source branch of the merge request." + echo "" + echo " --target-branch #### OR -tb ####" + echo " Specify the target branch of the merge request (usually develop)." + echo "" + echo " --help OR -h" + echo " Print this help message." + echo "" +} + +if [ $# -ne 4 ] && [ $# -ne 1 ] +then + echo "Syntax Error: not the correct number of arguments" + echo "" + usage + exit 1 +fi + +checker=0 +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -h|--help) + shift + usage + exit 0 + ;; + -sb|--src-branch) + SOURCE_BRANCH="$2" + let "checker|=0x1" + shift + shift + ;; + -tb|--target-branch) + TARGET_BRANCH="$2" + let "checker|=0x2" + shift + shift + ;; + *) + echo "Syntax Error: unknown option: $key" + echo "" + usage + exit 1 +esac + +done + + +if [ $checker -ne 3 ] +then + echo "Source Branch is : $SOURCE_BRANCH" + echo "Target Branch is : $TARGET_BRANCH" + echo "" + echo "Syntax Error: missing option" + echo "" + usage + exit 1 +fi + +# Merge request scenario + +MERGE_COMMMIT=`git log -n1 | grep commit | sed -e "s@commit @@"` +TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH` + +echo " ---- Checking the modified files by the merge request ----" +echo "" +echo "Source Branch is : $SOURCE_BRANCH" +echo "Target Branch is : $TARGET_BRANCH" +echo "Merged Commit is : $MERGE_COMMMIT" +echo "Target Init is : $TARGET_INIT_COMMIT" + +# Retrieve the list of modified files since the latest develop commit +MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq` +NB_WARNINGS_FILES=0 + +# Retrieve list of warnings +LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel14.txt archives/*/basic_simulator_*txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq` + +echo "" +echo "List of files that have been modified by the Merge Request AND" +echo " that have compilation warnings/errors" +echo "--------------------------------------------------------------------" +declare -a ARRAYNAME + +for FULLFILE in $MODIFIED_FILES +do + filename=$(basename -- "$FULLFILE") + EXT="${filename##*.}" + if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ] + then + for WARNING_FILE in $LIST_WARNING_FILES + do + if [ $FULLFILE = $WARNING_FILE ] + then + echo $WARNING_FILE + ARRAYNAME[$NB_WARNINGS_FILES]=$WARNING_FILE + NB_WARNINGS_FILES=$((NB_WARNINGS_FILES + 1)) + fi + done + fi +done + +echo "" +echo "NB Files impacted by warnings/errors in Merge Request: $NB_WARNINGS_FILES" +echo $NB_WARNINGS_FILES > oai_warning_files.txt +echo ${ARRAYNAME[*]} > oai_warning_files_list.txt + +exit 0 diff --git a/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..14230c125f26b3b08ac7d3a5e2177975fa52de0a --- /dev/null +++ b/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf @@ -0,0 +1,220 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 1; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 40; + downlink_frequency = 2350000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower =-29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -106; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "10.0.0.2"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + scheduler_mode = "fairRR"; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [38]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 115; + eNB_instances = [0]; + + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; diff --git a/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..8a66e3131fe59550fde3a414fefe1d5f40c36512 --- /dev/null +++ b/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf @@ -0,0 +1,220 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 1; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 40; + downlink_frequency = 2350000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower =-27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -106; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "10.0.0.2"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + scheduler_mode = "fairRR"; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [38]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 115; + eNB_instances = [0]; + + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; diff --git a/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf new file mode 100644 index 0000000000000000000000000000000000000000..ede864b73364125b15e647292657a74c559038b4 --- /dev/null +++ b/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf @@ -0,0 +1,220 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 1; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 40; + downlink_frequency = 2350000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower =-27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -106; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "10.0.0.2"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24"; + + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + + log_config : + { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + + } +); +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + scheduler_mode = "fairRR"; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [38]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 115; + eNB_instances = [0]; + + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; diff --git a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf index 2feb577f68b6807ec96bac78f7f0132fd771c325..37656de75527716462e60a62de7cf0cf32c2cbaa 100644 --- a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf +++ b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf @@ -33,7 +33,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2685000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); @@ -220,7 +222,7 @@ RUs = ( att_rx = 0; bands = [7]; max_pdschReferenceSignalPower = -27; - max_rxgain = 125; + max_rxgain = 115; eNB_instances = [0]; } diff --git a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf index 38df1a28e50ed26c617bd333a8512fd17a69c0ba..01c1ca1428c5025cb37221914f84079403dfcc06 100644 --- a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf +++ b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf @@ -33,7 +33,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2685000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); @@ -220,7 +222,7 @@ RUs = ( att_rx = 0; bands = [7]; max_pdschReferenceSignalPower = -27; - max_rxgain = 125; + max_rxgain = 115; eNB_instances = [0]; } diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf index 213f2bbcd36d2997468e7425194c0e7d99cb5583..eb5822cb22fcb6f98a48cd3a1fbf406869e1be80 100644 --- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf +++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf @@ -33,7 +33,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2685000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); @@ -220,7 +222,7 @@ RUs = ( att_rx = 0; bands = [7]; max_pdschReferenceSignalPower = -27; - max_rxgain = 125; + max_rxgain = 115; eNB_instances = [0]; } diff --git a/ci-scripts/conf_files/lte-basic-sim.conf b/ci-scripts/conf_files/lte-basic-sim.conf new file mode 100644 index 0000000000000000000000000000000000000000..f0fab0bdcba24e59c043441a1b321c13825db24f --- /dev/null +++ b/ci-scripts/conf_files/lte-basic-sim.conf @@ -0,0 +1,259 @@ +Active_eNBs = ( "eNB-Eurecom-LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB-Eurecom-LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "3GPP_eNODEB"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower = -27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + + //Parameters for SIB18 + rxPool_sc_CP_Len = "normal"; + rxPool_sc_Period = "sf40"; + rxPool_data_CP_Len = "normal"; + rxPool_ResourceConfig_prb_Num = 20; + rxPool_ResourceConfig_prb_Start = 5; + rxPool_ResourceConfig_prb_End = 44; + rxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + rxPool_ResourceConfig_offsetIndicator_choice = 0; + rxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; +/* rxPool_dataHoppingConfig_hoppingParameter = 0; + rxPool_dataHoppingConfig_numSubbands = "ns1"; + rxPool_dataHoppingConfig_rbOffset = 0; + rxPool_commTxResourceUC-ReqAllowed = "TRUE"; +*/ + // Parameters for SIB19 + discRxPool_cp_Len = "normal" + discRxPool_discPeriod = "rf32" + discRxPool_numRetx = 1; + discRxPool_numRepetition = 2; + discRxPool_ResourceConfig_prb_Num = 5; + discRxPool_ResourceConfig_prb_Start = 3; + discRxPool_ResourceConfig_prb_End = 21; + discRxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + discRxPool_ResourceConfig_offsetIndicator_choice = 0; + discRxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + phy_test_mode = 0; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 125; + eNB_instances = [0]; + + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + diff --git a/ci-scripts/createVM.sh b/ci-scripts/createVM.sh index 1c3099e8435bc6aaee68de99fbb40063e3ad659b..f972a921ac8bd85117f16d2c77377779ed7b8a1b 100755 --- a/ci-scripts/createVM.sh +++ b/ci-scripts/createVM.sh @@ -80,6 +80,7 @@ JOB_NAME=XX BUILD_ID=XX VM_NAME=ci-enb-usrp VM_MEMORY=2048 +VM_CPU=4 while [[ $# -gt 0 ]] do @@ -107,6 +108,7 @@ case $key in ;; -v2) VM_NAME=ci-basic-sim + VM_MEMORY=8192 shift ;; -v3) @@ -116,6 +118,7 @@ case $key in -v4) VM_NAME=ci-cppcheck VM_MEMORY=4096 + VM_CPU=4 shift ;; -v7) @@ -134,6 +137,7 @@ case $key in ;; basic-sim) VM_NAME=ci-basic-sim + VM_MEMORY=8192 ;; phy-sim) VM_NAME=ci-phy-sim @@ -141,6 +145,7 @@ case $key in cppcheck) VM_NAME=ci-cppcheck VM_MEMORY=4096 + VM_CPU=4 ;; enb-ethernet) VM_NAME=ci-enb-ethernet @@ -178,11 +183,12 @@ VM_CMDS=${VM_NAME}_cmds.txt echo "VM_NAME = $VM_NAME" echo "VM_MEMORY = $VM_MEMORY MBytes" +echo "VM_CPU = $VM_CPU" echo "############################################################" echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base" echo "############################################################" -uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml +uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml echo "Waiting for VM to be started" uvt-kvm wait $VM_NAME --insecure diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 861e6f3e4e6ce6cb8350acbc80ebe5b22de104cf..f210fd451823fd2abccb5fdbae61348a68476c74 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -45,7 +45,7 @@ import xml.etree.ElementTree as ET import logging import datetime import signal -from multiprocessing import Process,Lock +from multiprocessing import Process, Lock, SimpleQueue logging.basicConfig( level=logging.DEBUG, format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s" @@ -59,6 +59,7 @@ class SSHConnection(): self.eNBIPAddress = '' self.eNBRepository = '' self.eNBBranch = '' + self.eNB_AllowMerge = False self.eNBCommitID = '' self.eNBUserName = '' self.eNBPassword = '' @@ -80,8 +81,13 @@ class SSHConnection(): self.ping_packetloss_threshold = '' self.iperf_args = '' self.iperf_packetloss_threshold = '' + self.iperf_profile = '' self.UEDevices = [] self.UEIPAddresses = [] + self.htmlFile = '' + self.htmlHeaderCreated = False + self.htmlFooterCreated = False + self.htmlUEConnected = 0 def open(self, ipaddress, username, password): self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5) @@ -148,6 +154,34 @@ class SSHConnection(): else: logging.debug('\u001B[1;37;41m Unexpected Others \u001B[0m') + def copy(self, ipaddress, username, password, source, destination): + logging.debug('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination) + scp_spawn = pexpect.spawn('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination, timeout = 5) + scp_response = scp_spawn.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0: + scp_spawn.sendline('yes') + scp_spawn.expect('password:') + scp_spawn.sendline(password) + scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0: + pass + else: + logging.debug('1 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + elif scp_response == 1: + scp_spawn.sendline(password) + scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0 or scp_response == 3: + pass + else: + logging.debug('2 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + elif scp_response == 2: + pass + else: + logging.debug('3 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + def BuildeNB(self): if self.eNBIPAddress == '' or self.eNBRepository == '' or self.eNBBranch == '' or self.eNBUserName == '' or self.eNBPassword == '' or self.eNBSourceCodePath == '': Usage() @@ -165,8 +199,9 @@ class SSHConnection(): self.command('git checkout -f ' + self.eNBCommitID, '\$', 5) # if the branch is not develop, then it is a merge request and we need to do # the potential merge. Note that merge conflicts should already been checked earlier - if (self.eNBBranch != 'develop') and (self.eNBBranch != 'origin/develop'): - self.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5) + if (self.eNB_AllowMerge): + if (self.eNBBranch != 'develop') and (self.eNBBranch != 'origin/develop'): + self.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5) self.command('source oaienv', '\$', 5) self.command('cd cmake_targets', '\$', 5) self.command('mkdir -p log', '\$', 5) @@ -176,6 +211,7 @@ class SSHConnection(): self.command('echo ' + self.eNBPassword + ' | sudo -S mv log/* ' + 'build_log_' + SSH.testCase_id, '\$', 5) self.command('echo ' + self.eNBPassword + ' | sudo -S mv compile_oai_enb.log ' + 'build_log_' + SSH.testCase_id, '\$', 5) self.close() + self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', 0) def InitializeHSS(self): if self.EPCIPAddress == '' or self.EPCUserName == '' or self.EPCPassword == '' or self.EPCSourceCodePath == '' or self.EPCType == '': @@ -196,6 +232,7 @@ class SSHConnection(): self.command('echo ' + self.EPCPassword + ' | sudo -S rm -f hss.log daemon.log', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S echo "Starting sudo session" && sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real ', '\$', 5) self.close() + self.CreateHtmlTestRow(self.EPCType, 'OK', 0) def InitializeMME(self): if self.EPCIPAddress == '' or self.EPCUserName == '' or self.EPCPassword == '' or self.EPCSourceCodePath == '' or self.EPCType == '': @@ -217,6 +254,7 @@ class SSHConnection(): self.command('cd /opt/ltebox/tools', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_mme', '\$', 5) self.close() + self.CreateHtmlTestRow(self.EPCType, 'OK', 0) def InitializeSPGW(self): if self.EPCIPAddress == '' or self.EPCUserName == '' or self.EPCPassword == '' or self.EPCSourceCodePath == '' or self.EPCType == '': @@ -232,29 +270,43 @@ class SSHConnection(): self.command('cd /opt/ltebox/tools', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S ./start_xGw', '\$', 5) self.close() + self.CreateHtmlTestRow(self.EPCType, 'OK', 0) def InitializeeNB(self): if self.eNBIPAddress == '' or self.eNBUserName == '' or self.eNBPassword == '' or self.eNBSourceCodePath == '': Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = True - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow(self.Initialize_eNB_args, 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) self.command('cd ' + self.eNBSourceCodePath, '\$', 5) # Initialize_eNB_args usually start with -O and followed by the location in repository full_config_file = self.Initialize_eNB_args.replace('-O ','') - config_path, config_file = os.path.split(full_config_file) + extIdx = full_config_file.find('.conf') + if (extIdx > 0): + extra_options = full_config_file[extIdx + 5:] + full_config_file = full_config_file[:extIdx + 5] + config_path, config_file = os.path.split(full_config_file) + else: + sys.exit('Insufficient Parameter') ci_full_config_file = config_path + '/ci-' + config_file # Make a copy and adapt to EPC / eNB IP addresses self.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5) self.command('sed -i -e \'s/mme_ip_address.*$/mme_ip_address = ( { ipv4 = "' + self.EPCIPAddress + '";/\' ' + ci_full_config_file, '\$', 2); self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_S1_MME.*$/ENB_IPV4_ADDRESS_FOR_S1_MME = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2); self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_S1U.*$/ENB_IPV4_ADDRESS_FOR_S1U = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2); + self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_X2C.*$/ENB_IPV4_ADDRESS_FOR_X2C = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2); # Launch eNB with the modified config file self.command('source oaienv', '\$', 5) self.command('cd cmake_targets', '\$', 5) - # Replacing with a nohup and a direct redirection of stdout to a file - self.command('echo ' + self.eNBPassword + ' | nohup sudo -S -E stdbuf -o0 ./lte_build_oai/build/lte-softmodem -O ' + self.eNBSourceCodePath + '/' + ci_full_config_file + ' > enb_' + SSH.testCase_id + '.log 2>&1 &', '\$', 5) + self.command('echo "./lte_build_oai/build/lte-softmodem -O ' + self.eNBSourceCodePath + '/' + ci_full_config_file + extra_options + '" > ./my-lte-softmodem-run.sh ', '\$', 5) + self.command('chmod 775 ./my-lte-softmodem-run.sh ', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S rm -Rf enb_' + SSH.testCase_id + '.log', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S -E daemon --inherit --unsafe --name=enb_daemon --chdir=' + self.eNBSourceCodePath + '/cmake_targets -o ' + self.eNBSourceCodePath + '/cmake_targets/enb_' + SSH.testCase_id + '.log ./my-lte-softmodem-run.sh', '\$', 5) time.sleep(6) doLoop = True loopCounter = 10 @@ -262,16 +314,35 @@ class SSHConnection(): loopCounter = loopCounter - 1 if (loopCounter == 0): doLoop = False - logging.debug('\u001B[1;37;41m Starting eNB Failed -- taking too much time \u001B[0m') - sys.exit(1) - self.command('stdbuf -o0 cat enb_' + SSH.testCase_id + '.log', '\$', 10) - result = re.search('got sync', str(self.ssh.before)) - if result is None: - time.sleep(6) + # Checking if process is still alive + #self.command('stdbuf -o0 ps -aux | grep -v grep | grep --color=never lte-softmodem', '\$', 5) + #result = re.search('lte-softmodem', str(self.ssh.before)) + #if result is None: + # self.command('rsync -v enb_' + SSH.testCase_id + '.log enb_' + SSH.testCase_id + '.txt; stdbuf -o0 cat enb_' + SSH.testCase_id + '.log | egrep --color=never -i "segmentation fault"', '\$', 5) + # result = re.search('egmentation fault', str(self.ssh.before)) + # logging.debug('\u001B[1;37;41m eNB process is already down \u001B[0m') + # if result is not None: + # logging.debug('\u001B[1;37;41m Segmentation fault \u001B[0m') + # logging.debug(str(self.ssh.before)) + # self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'KO', 0) + # self.CreateHtmlFooter() + # self.close() + # sys.exit(1) + logging.debug('\u001B[1;30;43m eNB logging system did not show got sync! See with attach later \u001B[0m') + self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'eNB not showing got sync!', 0) + # Not getting got sync is bypassed for the moment + #sys.exit(1) else: - doLoop = False - logging.debug('\u001B[1m Initialize eNB Completed\u001B[0m') + self.command('rsync -v enb_' + SSH.testCase_id + '.log enb_' + SSH.testCase_id + '.txt; stdbuf -o0 cat enb_' + SSH.testCase_id + '.log | grep --color=never -i sync', '\$', 4) + result = re.search('got sync', str(self.ssh.before)) + if result is None: + time.sleep(6) + else: + doLoop = False + self.CreateHtmlTestRow('-O ' + config_file + extra_options, 'OK', 0) + logging.debug('\u001B[1m Initialize eNB Completed\u001B[0m') + self.command('rm -f enb_' + SSH.testCase_id + '.txt', '\$', 5) self.close() def InitializeUE_common(self, device_id): @@ -302,22 +373,34 @@ class SSHConnection(): multi_jobs.append(p) for job in multi_jobs: job.join() + self.CreateHtmlTestRow('N/A', 'OK', 0) - def AttachUE_common(self, device_id): + def AttachUE_common(self, device_id, statusQueue, lock): try: self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60) time.sleep(2) - count = 45 + max_count = 45 + count = max_count while count > 0: self.command('stdbuf -o0 adb -s ' + device_id + ' shell dumpsys telephony.registry | grep mDataConnectionState', '\$', 15) result = re.search('mDataConnectionState.*=(?P<state>[0-9\-]+)', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m mDataConnectionState Not Found! \u001B[0m') - sys.exit(1) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put('mDataConnectionState Not Found!') + lock.release() + break mDataConnectionState = int(result.group('state')) if mDataConnectionState == 2: logging.debug('\u001B[1mUE (' + device_id + ') Attach Completed\u001B[0m') + lock.acquire() + statusQueue.put(max_count - count) + statusQueue.put(device_id) + statusQueue.put('Attach Completed') + lock.release() break count = count - 1 if count == 15 or count == 30: @@ -326,11 +409,15 @@ class SSHConnection(): time.sleep(0.5) self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60) time.sleep(0.5) - logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(45-count) + ' times)\u001B[0m') + logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(max_count-count) + ' times)\u001B[0m') time.sleep(1) if count == 0: logging.debug('\u001B[1;37;41m UE (' + device_id + ') Attach Failed \u001B[0m') - sys.exit(1) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put('Attach Failed') + lock.release() self.close() except: os.kill(os.getppid(),signal.SIGUSR1) @@ -340,16 +427,46 @@ class SSHConnection(): Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = False - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow('N/A', 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) multi_jobs = [] + status_queue = SimpleQueue() + lock = Lock() for device_id in self.UEDevices: - p = Process(target = SSH.AttachUE_common, args = (device_id,)) + p = Process(target = SSH.AttachUE_common, args = (device_id, status_queue, lock,)) p.daemon = True p.start() multi_jobs.append(p) for job in multi_jobs: job.join() + if (status_queue.empty()): + self.CreateHtmlTestRow('N/A', 'KO', 0) + sys.exit(1) + else: + attach_status = True + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + attach_status = False + device_id = status_queue.get() + message = status_queue.get() + if (count < 0): + html_cell = "<pre>UE (" + device_id + ")\n" + message + "</pre>" + else: + html_cell = "<pre>UE (" + device_id + ")\n" + message + ' in ' + str(count + 2) + ' seconds</pre>' + html_queue.put(html_cell) + if (attach_status): + self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) + def DetachUE_common(self, device_id): try: self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) @@ -364,7 +481,11 @@ class SSHConnection(): Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = False - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow('N/A', 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) multi_jobs = [] for device_id in self.UEDevices: p = Process(target = SSH.DetachUE_common, args = (device_id,)) @@ -373,6 +494,7 @@ class SSHConnection(): multi_jobs.append(p) for job in multi_jobs: job.join() + self.CreateHtmlTestRow('N/A', 'OK', 0) def RebootUE_common(self, device_id): try: @@ -418,7 +540,11 @@ class SSHConnection(): Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = False - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow('N/A', 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) multi_jobs = [] for device_id in self.UEDevices: p = Process(target = SSH.RebootUE_common, args = (device_id,)) @@ -427,6 +553,7 @@ class SSHConnection(): multi_jobs.append(p) for job in multi_jobs: job.join() + self.CreateHtmlTestRow('N/A', 'OK', 0) def GetAllUEDevices(self, terminate_ue_flag): if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '': @@ -462,7 +589,7 @@ class SSHConnection(): self.UEIPAddresses.append(UE_IPAddress) self.close() - def Ping_common(self, lock, UE_IPAddress, device_id): + def Ping_common(self, lock, UE_IPAddress, device_id,statusQueue): try: self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) @@ -471,32 +598,65 @@ class SSHConnection(): self.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee -a ping_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5) result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Packet Loss Not Found! \u001B[0m') - sys.exit(1) + message = 'Packet Loss Not Found!' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return packetloss = result.group('packetloss') if float(packetloss) == 100: - logging.debug('\u001B[1;37;41m Packet Loss is 100% \u001B[0m') - sys.exit(1) + message = 'Packet Loss is 100%' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return result = re.search('rtt min\/avg\/max\/mdev = (?P<rtt_min>[0-9\.]+)\/(?P<rtt_avg>[0-9\.]+)\/(?P<rtt_max>[0-9\.]+)\/[0-9\.]+ ms', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Ping RTT_Min RTT_Avg RTT_Max Not Found! \u001B[0m') - sys.exit(1) + message = 'Ping RTT_Min RTT_Avg RTT_Max Not Found!' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return rtt_min = result.group('rtt_min') rtt_avg = result.group('rtt_avg') rtt_max = result.group('rtt_max') + pal_msg = 'Packet Loss : ' + packetloss + '%' + min_msg = 'RTT(Min) : ' + rtt_min + ' ms' + avg_msg = 'RTT(Avg) : ' + rtt_avg + ' ms' + max_msg = 'RTT(Max) : ' + rtt_max + ' ms' lock.acquire() logging.debug('\u001B[1;37;44m ping result (' + UE_IPAddress + ') \u001B[0m') - logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') - logging.debug('\u001B[1;34m RTT(Min) : ' + rtt_min + ' ms' + '\u001B[0m') - logging.debug('\u001B[1;34m RTT(Avg) : ' + rtt_avg + ' ms' + '\u001B[0m') - logging.debug('\u001B[1;34m RTT(Max) : ' + rtt_max + ' ms' + '\u001B[0m') - lock.release() + logging.debug('\u001B[1;34m ' + pal_msg + '\u001B[0m') + logging.debug('\u001B[1;34m ' + min_msg + '\u001B[0m') + logging.debug('\u001B[1;34m ' + avg_msg + '\u001B[0m') + logging.debug('\u001B[1;34m ' + max_msg + '\u001B[0m') + qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg + packetLossOK = True if packetloss is not None: if float(packetloss) > float(self.ping_packetloss_threshold): + qMsg += '\nPacket Loss too high' logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - sys.exit(1) + packetLossOK = False elif float(packetloss) > 0: + qMsg += '\nPacket Loss is not 0%' logging.debug('\u001B[1;37;43m Packet Loss is not 0% \u001B[0m') + if (packetLossOK): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(qMsg) + lock.release() self.close() except: os.kill(os.getppid(),signal.SIGUSR1) @@ -506,14 +666,19 @@ class SSHConnection(): Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = False - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow(self.ping_args, 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) self.GetAllUEIPAddresses() multi_jobs = [] i = 0 lock = Lock() + status_queue = SimpleQueue() for UE_IPAddress in self.UEIPAddresses: device_id = self.UEDevices[i] - p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,)) + p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,)) p.daemon = True p.start() multi_jobs.append(p) @@ -521,103 +686,391 @@ class SSHConnection(): for job in multi_jobs: job.join() - def Iperf_common(self, lock, UE_IPAddress, device_id, ue_num): + if (status_queue.empty()): + self.CreateHtmlTestRow(self.ping_args, 'KO', 0) + self.CreateHtmlFooter() + sys.exit(1) + else: + ping_status = True + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + ping_status = False + device_id = status_queue.get() + ip_addr = status_queue.get() + message = status_queue.get() + html_cell = "<pre>UE (" + device_id + ")\nIP Address : " + ip_addr + "\n" + message + "</pre>" + html_queue.put(html_cell) + if (ping_status): + self.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) + + def Iperf_ComputeTime(self): + result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args)) + if result is None: + logging.debug('\u001B[1;37;41m Iperf time Not Found! \u001B[0m') + sys.exit(1) + return result.group('iperf_time') + + def Iperf_ComputeModifiedBW(self, idx, ue_num): + result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(self.iperf_args)) + if result is None: + logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m') + sys.exit(1) + iperf_bandwidth = result.group('iperf_bandwidth') + if SSH.iperf_profile == 'balanced': + iperf_bandwidth_new = float(iperf_bandwidth)/ue_num + if SSH.iperf_profile == 'single-ue': + iperf_bandwidth_new = float(iperf_bandwidth) + if SSH.iperf_profile == 'unbalanced': + # residual is 2% of max bw + residualBW = float(iperf_bandwidth) / 50 + if idx == 0: + iperf_bandwidth_new = float(iperf_bandwidth) - ((ue_num - 1) * residualBW) + else: + iperf_bandwidth_new = residualBW + iperf_bandwidth_str = '-b ' + iperf_bandwidth + iperf_bandwidth_str_new = '-b ' + ('%.2f' % iperf_bandwidth_new) + result = re.sub(iperf_bandwidth_str, iperf_bandwidth_str_new, str(self.iperf_args)) + if result is None: + logging.debug('\u001B[1;37;41m Calculate Iperf bandwidth Failed! \u001B[0m') + sys.exit(1) + return result + + def Iperf_analyzeV2Output(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options): + result = re.search('Server Report:', str(self.ssh.before)) + if result is None: + result = re.search('read failed: Connection refused', str(self.ssh.before)) + if result is not None: + logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m') + else: + logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m') + return -1 + # Computing the requested bandwidth in float + result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(iperf_real_options)) + if result is not None: + req_bandwidth = result.group('iperf_bandwidth') + req_bw = float(req_bandwidth) + result = re.search('-b [0-9\.]+K', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Kbits/sec' % req_bw + req_bw = req_bw * 1000 + result = re.search('-b [0-9\.]+M', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Mbits/sec' % req_bw + req_bw = req_bw * 1000000 + result = re.search('-b [0-9\.]+G', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Gbits/sec' % req_bw + req_bw = req_bw * 1000000000 + + result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/..\d+) (\((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before)) + if result is not None: + bitrate = result.group('bitrate') + packetloss = result.group('packetloss') + jitter = result.group('jitter') + lock.acquire() + logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') + iperfStatus = True + msg = 'Req Bitrate : ' + req_bandwidth + '\n' + logging.debug('\u001B[1;34m Req Bitrate : ' + req_bandwidth + '\u001B[0m') + if bitrate is not None: + msg += 'Bitrate : ' + bitrate + '\n' + logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') + result = re.search('(?P<real_bw>[0-9\.]+) [KMG]bits/sec', str(bitrate)) + if result is not None: + actual_bw = float(str(result.group('real_bw'))) + result = re.search('[0-9\.]+ K', bitrate) + if result is not None: + actual_bw = actual_bw * 1000 + result = re.search('[0-9\.]+ M', bitrate) + if result is not None: + actual_bw = actual_bw * 1000000 + result = re.search('[0-9\.]+ G', bitrate) + if result is not None: + actual_bw = actual_bw * 1000000000 + br_loss = 100 * actual_bw / req_bw + bitperf = '%.2f ' % br_loss + msg += 'Bitrate Perf: ' + bitperf + '%\n' + logging.debug('\u001B[1;34m Bitrate Perf: ' + bitperf + '%\u001B[0m') + if packetloss is not None: + msg += 'Packet Loss : ' + packetloss + '%\n' + logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') + if float(packetloss) > float(self.iperf_packetloss_threshold): + msg += 'Packet Loss too high!\n' + logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') + iperfStatus = False + if jitter is not None: + msg += 'Jitter : ' + jitter + '\n' + logging.debug('\u001B[1;34m Jitter : ' + jitter + '\u001B[0m') + if (iperfStatus): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(msg) + lock.release() + return 0 + + def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options): + if (not os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not analyze from server log') + lock.release() + return + # Computing the requested bandwidth in float + result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(iperf_real_options)) + if result is None: + logging.debug('Iperf bandwidth Not Found!') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not compute Iperf bandwidth!') + lock.release() + return + else: + req_bandwidth = result.group('iperf_bandwidth') + req_bw = float(req_bandwidth) + result = re.search('-b [0-9\.]+K', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Kbits/sec' % req_bw + req_bw = req_bw * 1000 + result = re.search('-b [0-9\.]+M', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Mbits/sec' % req_bw + req_bw = req_bw * 1000000 + result = re.search('-b [0-9\.]+G', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Gbits/sec' % req_bw + req_bw = req_bw * 1000000000 + + server_file = open('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', 'r') + br_sum = 0.0 + ji_sum = 0.0 + pl_sum = 0 + ps_sum = 0 + row_idx = 0 + for line in server_file.readlines(): + result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)/ +(?P<sentPack>[0-9]+)', str(line)) + if result is not None: + bitrate = result.group('bitrate') + jitter = result.group('jitter') + packetlost = result.group('lostPack') + packetsent = result.group('sentPack') + br = bitrate.split(' ') + ji = jitter.split(' ') + row_idx = row_idx + 1 + curr_br = float(br[0]) + pl_sum = pl_sum + int(packetlost) + ps_sum = ps_sum + int(packetsent) + if (br[1] == 'Kbits/sec'): + curr_br = curr_br * 1000 + if (br[1] == 'Mbits/sec'): + curr_br = curr_br * 1000 * 1000 + br_sum = curr_br + br_sum + ji_sum = float(ji[0]) + ji_sum + if (row_idx > 0): + br_sum = br_sum / row_idx + ji_sum = ji_sum / row_idx + br_loss = 100 * br_sum / req_bw + if (br_sum > 1000): + br_sum = br_sum / 1000 + if (br_sum > 1000): + br_sum = br_sum / 1000 + bitrate = '%.2f Mbits/sec' % br_sum + else: + bitrate = '%.2f Kbits/sec' % br_sum + else: + bitrate = '%.2f bits/sec' % br_sum + bitperf = '%.2f ' % br_loss + bitperf += '%' + jitter = '%.2f ms' % (ji_sum) + if (ps_sum > 0): + pl = float(100 * pl_sum / ps_sum) + packetloss = '%2.1f ' % (pl) + packetloss += '%' + else: + packetloss = 'unknown' + lock.acquire() + if (br_loss < 90): + statusQueue.put(1) + else: + statusQueue.put(0) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + req_msg = 'Req Bitrate : ' + req_bandwidth + bir_msg = 'Bitrate : ' + bitrate + brl_msg = 'Bitrate Perf: ' + bitperf + jit_msg = 'Jitter : ' + jitter + pal_msg = 'Packet Loss : ' + packetloss + statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n') + logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m') + logging.debug('\u001B[1;35m ' + req_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + bir_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + brl_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + jit_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + pal_msg + '\u001B[0m') + lock.release() + else: + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not analyze from server log') + lock.release() + + server_file.close() + + + def Iperf_analyzeV3Output(self, lock, UE_IPAddress, device_id, statusQueue): + result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before)) + if result is None: + result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before)) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + if result is not None: + logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m') + statusQueue.put(result.group('error')) + else: + logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m') + statusQueue.put('Bitrate and/or Packet Loss Not Found!') + lock.release() + + bitrate = result.group('bitrate') + packetloss = result.group('packetloss') + lock.acquire() + logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') + logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') + msg = 'Bitrate : ' + bitrate + '\n' + iperfStatus = True + if packetloss is not None: + logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') + msg += 'Packet Loss : ' + packetloss + '%\n' + if float(packetloss) > float(self.iperf_packetloss_threshold): + logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') + msg += 'Packet Loss too high!\n' + iperfStatus = False + if (iperfStatus): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + lock.release() + + def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue): + ipnumbers = UE_IPAddress.split('.') + if (len(ipnumbers) == 4): + ipnumbers[3] = '1' + EPC_Iperf_UE_IPAddress = ipnumbers[0] + '.' + ipnumbers[1] + '.' + ipnumbers[2] + '.' + ipnumbers[3] + + # Launch iperf server on EPC side + self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) + self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5) + self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) + port = 5001 + idx + self.command('echo $USER; nohup iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.EPCUserName, 5) + time.sleep(0.5) + self.close() + + # Launch iperf client on UE + self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) + self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5) + iperf_time = self.Iperf_ComputeTime() + time.sleep(0.5) + + modified_options = self.Iperf_ComputeModifiedBW(idx, ue_num) + modified_options = modified_options.replace('-R','') + time.sleep(0.5) + + self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) + self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) + clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue, modified_options) + + # Launch iperf server on EPC side + self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) + self.command('killall --signal SIGKILL iperf', self.EPCUserName, 5) + self.close() + if (clientStatus == -1): + time.sleep(1) + if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log') + self.copy(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.') + self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options) + + def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue): try: + # Single-UE profile -- iperf only on one UE + if SSH.iperf_profile == 'single-ue' and idx != 0: + return useIperf3 = False self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) + # if by chance ADB server and EPC are on the same remote host, at least log collection will take care of it + self.command('if [ ! -d ' + self.EPCSourceCodePath + '/scripts ]; then mkdir -p ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5) + self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5) # Checking if iperf / iperf3 are installed self.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5) result = re.search('iperf3', str(self.ssh.before)) if result is None: result = re.search('iperf', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Neither iperf nor iperf3 installed on UE! \u001B[0m') - sys.exit(1) + message = 'Neither iperf nor iperf3 installed on UE!' + lock.acquire() + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(message) + lock.release() + return + #sys.exit(1) else: useIperf3 = True + # in case of iperf, UL has its own function + if (not useIperf3): + result = re.search('-R', str(self.iperf_args)) + if result is not None: + self.close() + self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num, statusQueue) + return + if (useIperf3): self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/iperf3 -s &', '\$', 5) else: - self.command('rm -f /tmp/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) - self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > /tmp/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5) + self.command('rm -f iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) + self.command('echo $USER; nohup adb -s ' + device_id + ' shell "/data/local/tmp/iperf -u -s -i 1" > iperf_server_' + SSH.testCase_id + '_' + device_id + '.log &', self.ADBUserName, 5) time.sleep(0.5) self.close() self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) - self.command('cd ' + self.EPCSourceCodePath, '\$', 5) - self.command('cd scripts', '\$', 5) - result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args)) - if result is None: - logging.debug('\u001B[1;37;41m Iperf time Not Found! \u001B[0m') - sys.exit(1) - iperf_time = result.group('iperf_time') + self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5) + iperf_time = self.Iperf_ComputeTime() time.sleep(0.5) - result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(self.iperf_args)) - if result is None: - logging.debug('\u001B[1;37;41m Iperf bandwidth Not Found! \u001B[0m') - sys.exit(1) - iperf_bandwidth = result.group('iperf_bandwidth') + modified_options = self.Iperf_ComputeModifiedBW(idx, ue_num) time.sleep(0.5) - iperf_bandwidth_new = float(iperf_bandwidth)/ue_num - iperf_bandwidth_str = '-b ' + iperf_bandwidth - iperf_bandwidth_str_new = '-b ' + str(iperf_bandwidth_new) - result = re.sub(iperf_bandwidth_str, iperf_bandwidth_str_new, str(self.iperf_args)) - if result is None: - logging.debug('\u001B[1;37;41m Calculate Iperf bandwidth Failed! \u001B[0m') - sys.exit(1) - self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) if (useIperf3): - self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + result + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) + self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) - result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before)) - if result is None: - result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before)) - if result is not None: - logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m') - else: - logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m') - sys.exit(1) - bitrate = result.group('bitrate') - packetloss = result.group('packetloss') - lock.acquire() - logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') - logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') - if packetloss is not None: - logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') - if float(packetloss) > float(self.iperf_packetloss_threshold): - logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - lock.release() - sys.exit(1) - lock.release() + clientStatus = 0 + self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue) else: - self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + result + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) + self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) - result = re.search('Server Report:', str(self.ssh.before)) - if result is None: - result = re.search('read failed: Connection refused', str(self.ssh.before)) - if result is not None: - logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m') - else: - logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m') - sys.exit(1) - result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before)) - if result is not None: - bitrate = result.group('bitrate') - packetloss = result.group('packetloss') - lock.acquire() - logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') - if bitrate is not None: - logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') - if packetloss is not None: - logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') - if float(packetloss) > float(self.iperf_packetloss_threshold): - logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - lock.release() - sys.exit(1) - lock.release() + clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue, modified_options) self.close() self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) @@ -627,6 +1080,12 @@ class SSHConnection(): pid_iperf = result.group('pid') self.command('stdbuf -o0 adb -s ' + device_id + ' shell kill -KILL ' + pid_iperf, '\$', 5) self.close() + if (clientStatus == -1): + time.sleep(1) + if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log') + self.copy(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.') + self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options) except: os.kill(os.getppid(),signal.SIGUSR1) @@ -635,15 +1094,20 @@ class SSHConnection(): Usage() sys.exit('Insufficient Parameter') initialize_eNB_flag = False - self.CheckProcessExist(initialize_eNB_flag) + pStatus = self.CheckProcessExist(initialize_eNB_flag) + if (pStatus < 0): + self.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus) + self.CreateHtmlFooter() + sys.exit(1) self.GetAllUEIPAddresses() multi_jobs = [] i = 0 ue_num = len(self.UEIPAddresses) lock = Lock() + status_queue = SimpleQueue() for UE_IPAddress in self.UEIPAddresses: device_id = self.UEDevices[i] - p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,ue_num,)) + p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,status_queue,)) p.daemon = True p.start() multi_jobs.append(p) @@ -651,41 +1115,83 @@ class SSHConnection(): for job in multi_jobs: job.join() + if (status_queue.empty()): + self.CreateHtmlTestRow(self.iperf_args, 'KO', 0) + self.CreateHtmlFooter() + sys.exit(1) + else: + iperf_status = True + iperf_noperf = False + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + iperf_status = False + if (count > 0): + iperf_noperf = True + device_id = status_queue.get() + ip_addr = status_queue.get() + message = status_queue.get() + html_cell = "<pre>UE (" + device_id + ")\nIP Address : " + ip_addr + "\n" + message + "</pre>" + html_queue.put(html_cell) + if (iperf_noperf and iperf_status): + self.CreateHtmlTestRowQueue(self.iperf_args, 'PERF NOT MET', len(self.UEDevices), html_queue) + elif (iperf_status): + self.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) + def CheckProcessExist(self, initialize_eNB_flag): multi_jobs = [] - p = Process(target = SSH.CheckHSSProcess, args = ()) + status_queue = SimpleQueue() + p = Process(target = SSH.CheckHSSProcess, args = (status_queue,)) p.daemon = True p.start() multi_jobs.append(p) - p = Process(target = SSH.CheckMMEProcess, args = ()) + p = Process(target = SSH.CheckMMEProcess, args = (status_queue,)) p.daemon = True p.start() multi_jobs.append(p) - p = Process(target = SSH.CheckSPGWProcess, args = ()) + p = Process(target = SSH.CheckSPGWProcess, args = (status_queue,)) p.daemon = True p.start() multi_jobs.append(p) if initialize_eNB_flag == False: - p = Process(target = SSH.CheckeNBProcess, args = ()) + p = Process(target = SSH.CheckeNBProcess, args = (status_queue,)) p.daemon = True p.start() multi_jobs.append(p) for job in multi_jobs: job.join() - def CheckeNBProcess(self): + if (status_queue.empty()): + return -15 + else: + result = 0 + while (not status_queue.empty()): + status = status_queue.get() + if (status < 0): + result = status + return result + + def CheckeNBProcess(self, status_queue): try: self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) self.command('stdbuf -o0 ps -aux | grep -v grep | grep --color=never lte-softmodem', '\$', 5) result = re.search('lte-softmodem', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m eNB Process Not Found! \u001B[0m') - sys.exit(1) + #sys.exit(1) + status_queue.put(-1) + else: + status_queue.put(1) self.close() except: os.kill(os.getppid(),signal.SIGUSR1) - def CheckHSSProcess(self): + def CheckHSSProcess(self, status_queue): try: self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('stdbuf -o0 ps -aux | grep -v grep | grep --color=never hss', '\$', 5) @@ -695,12 +1201,15 @@ class SSHConnection(): result = re.search('hss_sim s6as diam_hss', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m HSS Process Not Found! \u001B[0m') - sys.exit(1) + status_queue.put(-2) + #sys.exit(1) + else: + status_queue.put(2) self.close() except: os.kill(os.getppid(),signal.SIGUSR1) - def CheckMMEProcess(self): + def CheckMMEProcess(self, status_queue): try: self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('stdbuf -o0 ps -aux | grep -v grep | grep --color=never mme', '\$', 5) @@ -710,12 +1219,15 @@ class SSHConnection(): result = re.search('mme', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m MME Process Not Found! \u001B[0m') - sys.exit(1) + status_queue.put(-3) + #sys.exit(1) + else: + status_queue.put(3) self.close() except: os.kill(os.getppid(),signal.SIGUSR1) - def CheckSPGWProcess(self): + def CheckSPGWProcess(self, status_queue): try: self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) if re.match('OAI', self.EPCType, re.IGNORECASE): @@ -726,13 +1238,19 @@ class SSHConnection(): result = re.search('xGw', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m SPGW Process Not Found! \u001B[0m') - sys.exit(1) + status_queue.put(-4) + #sys.exit(1) + else: + status_queue.put(4) self.close() except: os.kill(os.getppid(),signal.SIGUSR1) def TerminateeNB(self): self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) + self.command('cd ' + self.eNBSourceCodePath + '/cmake_targets', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S daemon --name=enb_daemon --stop', '\$', 5) + self.command('rm -f my-lte-softmodem-run.sh', '\$', 5) self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGINT lte-softmodem || true', '\$', 5) time.sleep(5) self.command('stdbuf -o0 ps -aux | grep -v grep | grep lte-softmodem', '\$', 5) @@ -740,6 +1258,7 @@ class SSHConnection(): if result is not None: self.command('echo ' + self.eNBPassword + ' | sudo -S killall --signal SIGKILL lte-softmodem || true', '\$', 5) self.close() + self.CreateHtmlTestRow('N/A', 'OK', 0) def TerminateHSS(self): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) @@ -761,6 +1280,7 @@ class SSHConnection(): self.command('echo ' + self.EPCPassword + ' | sudo -S ./kill_hss.sh', '\$', 5) self.command('rm ./kill_hss.sh', '\$', 5) self.close() + self.CreateHtmlTestRow('N/A', 'OK', 0) def TerminateMME(self): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) @@ -775,6 +1295,7 @@ class SSHConnection(): self.command('cd /opt/ltebox/tools', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S ./stop_mme', '\$', 5) self.close() + self.CreateHtmlTestRow('N/A', 'OK', 0) def TerminateSPGW(self): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) @@ -789,6 +1310,7 @@ class SSHConnection(): self.command('cd /opt/ltebox/tools', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S ./stop_xGw', '\$', 5) self.close() + self.CreateHtmlTestRow('N/A', 'OK', 0) def TerminateUE_common(self, device_id): try: @@ -816,27 +1338,31 @@ class SSHConnection(): multi_jobs.append(p) for job in multi_jobs: job.join() + self.CreateHtmlTestRow('N/A', 'OK', 0) def LogCollectBuild(self): self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) self.command('cd ' + self.eNBSourceCodePath, '\$', 5) self.command('cd cmake_targets', '\$', 5) + self.command('rm -f build.log.zip', '\$', 5) self.command('zip build.log.zip build_log_*/*', '\$', 60) - self.command('rm -rf build_log_*', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S rm -rf build_log_*', '\$', 5) self.close() def LogCollecteNB(self): self.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword) self.command('cd ' + self.eNBSourceCodePath, '\$', 5) self.command('cd cmake_targets', '\$', 5) + self.command('rm -f enb.log.zip', '\$', 5) self.command('zip enb.log.zip enb*.log', '\$', 60) - self.command('rm enb*.log', '\$', 5) + self.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log', '\$', 5) self.close() def LogCollectPing(self): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) self.command('cd scripts', '\$', 5) + self.command('rm -f ping.log.zip', '\$', 5) self.command('zip ping.log.zip ping*.log', '\$', 60) self.command('rm ping*.log', '\$', 5) self.close() @@ -845,6 +1371,7 @@ class SSHConnection(): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) self.command('cd scripts', '\$', 5) + self.command('rm -f iperf.log.zip', '\$', 5) self.command('zip iperf.log.zip iperf*.log', '\$', 60) self.command('rm iperf*.log', '\$', 5) self.close() @@ -853,6 +1380,7 @@ class SSHConnection(): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) self.command('cd scripts', '\$', 5) + self.command('rm -f hss.log.zip', '\$', 5) if re.match('OAI', self.EPCType, re.IGNORECASE): self.command('zip hss.log.zip hss*.log', '\$', 60) self.command('rm hss*.log', '\$', 5) @@ -865,6 +1393,7 @@ class SSHConnection(): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) self.command('cd scripts', '\$', 5) + self.command('rm -f mme.log.zip', '\$', 5) if re.match('OAI', self.EPCType, re.IGNORECASE): self.command('zip mme.log.zip mme*.log', '\$', 60) self.command('rm mme*.log', '\$', 5) @@ -877,6 +1406,7 @@ class SSHConnection(): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) self.command('cd scripts', '\$', 5) + self.command('rm -f spgw.log.zip', '\$', 5) if re.match('OAI', self.EPCType, re.IGNORECASE): self.command('zip spgw.log.zip spgw*.log', '\$', 60) self.command('rm spgw*.log', '\$', 5) @@ -885,6 +1415,152 @@ class SSHConnection(): self.command('zip spgw.log.zip xGwLog.0', '\$', 60) self.close() #----------------------------------------------------------- +# HTML Reporting.... +#----------------------------------------------------------- + def CreateHtmlHeader(self): + if (not self.htmlHeaderCreated): + self.htmlFile = open('test_results.html', 'w') + self.htmlFile.write('<!DOCTYPE html>\n') + self.htmlFile.write('<html class="no-js" lang="en-US">\n') + self.htmlFile.write('<head>\n') + self.htmlFile.write(' <title>Test Results for TEMPLATE_JOB_NAME job build #TEMPLATE_BUILD_ID</title>\n') + self.htmlFile.write(' <base href = "http://www.openairinterface.org/" />\n') + self.htmlFile.write('</head>\n') + self.htmlFile.write('<body>\n') + self.htmlFile.write(' <table style="border-collapse: collapse; border: none;">\n') + self.htmlFile.write(' <tr style="border-collapse: collapse; border: none;">\n') + self.htmlFile.write(' <td style="border-collapse: collapse; border: none;">\n') + self.htmlFile.write(' <a href="http://www.openairinterface.org/">\n') + self.htmlFile.write(' <img src="/wp-content/uploads/2016/03/cropped-oai_final_logo2.png" alt="" border="none" height=50 width=150>\n') + self.htmlFile.write(' </img>\n') + self.htmlFile.write(' </a>\n') + self.htmlFile.write(' </td>\n') + self.htmlFile.write(' <td style="border-collapse: collapse; border: none; vertical-align: center;">\n') + self.htmlFile.write(' <b><font size = "6">Job Summary -- Job: TEMPLATE_JOB_NAME -- Build-ID: TEMPLATE_BUILD_ID</font></b>\n') + self.htmlFile.write(' </td>\n') + self.htmlFile.write(' </tr>\n') + self.htmlFile.write(' </table>\n') + self.htmlFile.write(' <br>\n') + self.htmlFile.write(' <table border = "1">\n') + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >GIT Repository</td>\n') + self.htmlFile.write(' <td><a href="' + SSH.eNBRepository + '">' + SSH.eNBRepository + '</a></td>\n') + self.htmlFile.write(' </tr>\n') + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >Job Trigger</td>\n') + if (SSH.eNB_AllowMerge): + self.htmlFile.write(' <td>Merge-Request</td>\n') + else: + self.htmlFile.write(' <td>Push to Branch</td>\n') + self.htmlFile.write(' </tr>\n') + self.htmlFile.write(' <tr>\n') + if (SSH.eNB_AllowMerge): + self.htmlFile.write(' <td bgcolor = "lightcyan" >Source Branch</td>\n') + else: + self.htmlFile.write(' <td bgcolor = "lightcyan" >Branch</td>\n') + self.htmlFile.write(' <td>' + SSH.eNBBranch + '</td>\n') + self.htmlFile.write(' </tr>\n') + self.htmlFile.write(' <tr>\n') + if (SSH.eNB_AllowMerge): + self.htmlFile.write(' <td bgcolor = "lightcyan" >Source Commit ID</td>\n') + else: + self.htmlFile.write(' <td bgcolor = "lightcyan" >Commit ID</td>\n') + self.htmlFile.write(' <td>' + SSH.eNBCommitID + '</td>\n') + self.htmlFile.write(' </tr>\n') + if (SSH.eNB_AllowMerge): + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >Target Branch</td>\n') + self.htmlFile.write(' <td>develop</td>\n') + self.htmlFile.write(' </tr>\n') + self.htmlFile.write(' </table>\n') + + terminate_ue_flag = True + SSH.GetAllUEDevices(terminate_ue_flag) + self.htmlUEConnected = len(self.UEDevices) + self.htmlFile.write('<h2>' + str(self.htmlUEConnected) + ' UE(s) is(are) connected to ADB bench server</h2>\n') + + self.htmlFile.write(' <br>\n') + self.htmlFile.write(' <h2>Test Summary for ' + SSH.testXMLfile + '</h2>\n') + self.htmlFile.write(' <table border = "1">\n') + self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n') + self.htmlFile.write(' <th>Test Id</th>\n') + self.htmlFile.write(' <th>Test Desc</th>\n') + self.htmlFile.write(' <th>Test Options</th>\n') + self.htmlFile.write(' <th>Test Status</th>\n') + i = 0 + while (i < self.htmlUEConnected): + self.htmlFile.write(' <th>UE' + str(i) + ' Status</th>\n') + i += 1 + self.htmlFile.write(' </tr>\n') + self.htmlHeaderCreated = True + + def CreateHtmlFooter(self): + if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)): + self.htmlFile.write(' </table>\n') + self.htmlFile.write('</body>\n') + self.htmlFile.write('</html>\n') + self.htmlFile.close() + self.htmlFooterCreated = False + + def CreateHtmlTestRow(self, options, status, processesStatus): + if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)): + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >' + SSH.testCase_id + '</td>\n') + self.htmlFile.write(' <td>' + SSH.desc + '</td>\n') + self.htmlFile.write(' <td>' + str(options) + '</td>\n') + if (str(status) == 'OK'): + self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n') + elif (str(status) == 'KO'): + if (processesStatus == 0): + self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n') + elif (processesStatus == -1): + self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - eNB process not found</td>\n') + elif (processesStatus == -2): + self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - HSS process not found</td>\n') + elif (processesStatus == -3): + self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - MME process not found</td>\n') + elif (processesStatus == -4): + self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - SPGW process not found</td>\n') + else: + self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n') + else: + self.htmlFile.write(' <td bgcolor = "orange" >' + str(status) + '</td>\n') + i = 0 + while (i < self.htmlUEConnected): + self.htmlFile.write(' <td>-</td>\n') + i += 1 + self.htmlFile.write(' </tr>\n') + + def CreateHtmlTestRowQueue(self, options, status, ue_status, ue_queue): + if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)): + addOrangeBK = False + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >' + SSH.testCase_id + '</td>\n') + self.htmlFile.write(' <td>' + SSH.desc + '</td>\n') + self.htmlFile.write(' <td>' + str(options) + '</td>\n') + if (str(status) == 'OK'): + self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n') + elif (str(status) == 'KO'): + self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n') + else: + addOrangeBK = True + self.htmlFile.write(' <td bgcolor = "orange" >' + str(status) + '</td>\n') + i = 0 + while (i < self.htmlUEConnected): + if (i < ue_status): + if (not ue_queue.empty()): + if (addOrangeBK): + self.htmlFile.write(' <td bgcolor = "orange" >' + str(ue_queue.get()) + '</td>\n') + else: + self.htmlFile.write(' <td>' + str(ue_queue.get()) + '</td>\n') + else: + self.htmlFile.write(' <td>-</td>\n') + else: + self.htmlFile.write(' <td>-</td>\n') + i += 1 + self.htmlFile.write(' </tr>\n') + +#----------------------------------------------------------- # Usage() #----------------------------------------------------------- def Usage(): @@ -895,8 +1571,8 @@ def Usage(): print(' --help Show this help.') print(' --mode=[Mode]') print(' TesteNB') - print(' TerminateeNB, TerminateEPC') - print(' LogCollectBuild, LogCollecteNB, LogCollectEPC, LogCollectADB') + print(' TerminateeNB, TerminateUE, TerminateHSS, TerminateMME, TerminateSPGW') + print(' LogCollectBuild, LogCollecteNB, LogCollectHSS, LogCollectMME, LogCollectSPGW, LogCollectPing, LogCollectIperf') print(' --eNBIPAddress=[eNB\'s IP Address]') print(' --eNBRepository=[eNB\'s Repository URL]') print(' --eNBBranch=[eNB\'s Branch Name]') @@ -944,6 +1620,13 @@ def GetParametersFromXML(action): if action == 'Iperf': SSH.iperf_args = test.findtext('iperf_args') SSH.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold') + SSH.iperf_profile = test.findtext('iperf_profile') + if (SSH.iperf_profile is None): + SSH.iperf_profile = 'balanced' + else: + if SSH.iperf_profile != 'balanced' and SSH.iperf_profile != 'unbalanced' and SSH.iperf_profile != 'single-ue': + logging.debug('ERROR: test-case has wrong profile ' + SSH.iperf_profile) + SSH.iperf_profile = 'balanced' #check if given test is in list #it is in list if one of the strings in 'list' is at the beginning of 'test' @@ -980,6 +1663,11 @@ while len(argvs) > 1: elif re.match('^\-\-eNBRepository=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBRepository=(.+)$', myArgv, re.IGNORECASE) SSH.eNBRepository = matchReg.group(1) + elif re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE): + matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE) + doMerge = matchReg.group(1) + if ((doMerge == 'true') or (doMerge == 'True')): + SSH.eNB_AllowMerge = True elif re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE): matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE) SSH.eNBBranch = matchReg.group(1) @@ -1098,6 +1786,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE): Usage() sys.exit('Insufficient Parameter') + SSH.CreateHtmlHeader() + #read test_case_list.xml file # if no parameters for XML file, use default value if SSH.testXMLfile == '': @@ -1196,6 +1886,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE): SSH.TerminateSPGW() else: sys.exit('Invalid action') + + SSH.CreateHtmlFooter() else: Usage() sys.exit('Invalid mode') diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh index f8a48d9c170150501d3b023b90a21cd7753571f7..609af5f166b05e2343bc7d7fcb8f5e7d977586a2 100755 --- a/ci-scripts/reportBuildLocally.sh +++ b/ci-scripts/reportBuildLocally.sh @@ -105,7 +105,7 @@ function details_table { do if [[ $MESSAGE == *"/home/ubuntu/tmp"* ]] then - FILENAME=`echo $MESSAGE | sed -e "s#^/home/ubuntu/tmp/##" | awk -F ":" '{print $1}'` + FILENAME=`echo $MESSAGE | sed -e "s#^/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" | awk -F ":" '{print $1}'` LINENB=`echo $MESSAGE | awk -F ":" '{print $2}'` if [ "$COMPLETE_MESSAGE" != "start" ] then @@ -498,6 +498,8 @@ then echo " </table>" >> ./build_results.html fi +echo " <h2>Ubuntu 16.04 LTS -- Summary</h2>" >> ./build_results.html + sca_summary_table_header "OAI Static Code Analysis with CPPCHECK" sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember @@ -547,6 +549,15 @@ summary_table_row "RB Tools - Release 14" ./archives/ue_eth/rb_tool.Rel14.txt "B summary_table_row "NAS Mesh - Release 14" ./archives/ue_eth/nasmesh.Rel14.txt "Built target nasmesh" ./ue_eth_row6.html summary_table_footer +echo " <h2>Red Hat (CentOS Linux release 7.4.1708) -- Summary</h2>" >> ./build_results.html + +summary_table_header "Red Hat -- OAI Build eNB -- USRP option" +summary_table_row "LTE SoftModem - Release 14" ./archives/red_hat/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_rh_row1.html +summary_table_row "Coding - Release 14" ./archives/red_hat/coding.Rel14.txt "Built target coding" ./enb_usrp_rh_row2.html +summary_table_row "OAI USRP device if - Release 14" ./archives/red_hat/oai_usrpdevif.Rel14.txt "Built target oai_usrpdevif" ./enb_usrp_rh_row3.html +summary_table_row "Parameters Lib Config - Release 14" ./archives/red_hat/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_usrp_rh_row4.html +summary_table_footer + echo " <h3>Details</h3>" >> ./build_results.html for DETAILS_TABLE in `ls ./enb_usrp_row*.html` @@ -569,7 +580,11 @@ for DETAILS_TABLE in `ls ./ue_eth_row*.html` do cat $DETAILS_TABLE >> ./build_results.html done -rm -f ./enb_usrp_row*.html ./basic_sim_row*.html ./phy_sim_row*.html ./enb_eth_row*.html ./ue_eth_row*.html +for DETAILS_TABLE in `ls ./enb_usrp_rh_row*.html` +do + cat $DETAILS_TABLE >> ./build_results.html +done +rm -f ./enb_usrp_row*.html ./basic_sim_row*.html ./phy_sim_row*.html ./enb_eth_row*.html ./ue_eth_row*.html ./enb_usrp_rh_row*.html echo "</body>" >> ./build_results.html echo "</html>" >> ./build_results.html diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh new file mode 100755 index 0000000000000000000000000000000000000000..9d7ce0ac40f9810fe5c00f6428cc4cf87e24216f --- /dev/null +++ b/ci-scripts/reportTestLocally.sh @@ -0,0 +1,510 @@ +#!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 +# * +# * 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. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +function usage { + echo "OAI Test Report script" + echo " Original Author: Raphael Defosseux" + echo "" + echo "Usage:" + echo "------" + echo "" + echo " reportTestLocally.sh [OPTIONS]" + echo "" + echo "Options:" + echo "--------" + echo "" + echo " --help OR -h" + echo " Print this help message." + echo "" + echo "Job Options:" + echo "------------" + echo "" + echo " --git-url #### OR -gu ####" + echo " Specify the URL of the GIT Repository." + echo "" + echo " --job-name #### OR -jn ####" + echo " Specify the name of the Jenkins job." + echo "" + echo " --build-id #### OR -id ####" + echo " Specify the build ID of the Jenkins job." + echo "" + echo " --trigger merge-request OR -mr" + echo " --trigger push OR -pu" + echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event." + echo "" + echo "Merge-Request Options:" + echo "----------------------" + echo "" + echo " --src-branch #### OR -sb ####" + echo " Specify the source branch of the merge request." + echo "" + echo " --src-commit #### OR -sc ####" + echo " Specify the source commit ID (SHA-1) of the merge request." + echo "" + echo " --target-branch #### OR -tb ####" + echo " Specify the target branch of the merge request (usually develop)." + echo "" + echo " --target-commit #### OR -tc ####" + echo " Specify the target commit ID (SHA-1) of the merge request." + echo "" + echo "Push Options:" + echo "----------------------" + echo "" + echo " --branch #### OR -br ####" + echo " Specify the branch of the push event." + echo "" + echo " --commit #### OR -co ####" + echo " Specify the commit ID (SHA-1) of the push event." + echo "" + echo "" +} + +function trigger_usage { + echo "OAI Test Report script" + echo " Original Author: Raphael Defosseux" + echo "" + echo " --trigger merge-request OR -mr" + echo " --trigger push OR -pu" + echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event." + echo "" +} + +jb_checker=0 +mr_checker=0 +pu_checker=0 +MR_TRIG=0 +PU_TRIG=0 +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -h|--help) + shift + usage + exit 0 + ;; + -gu|--git-url) + GIT_URL="$2" + let "jb_checker|=0x1" + shift + shift + ;; + -jn|--job-name) + JOB_NAME="$2" + let "jb_checker|=0x2" + shift + shift + ;; + -id|--build-id) + BUILD_ID="$2" + let "jb_checker|=0x4" + shift + shift + ;; + --trigger) + TRIG="$2" + case $TRIG in + merge-request) + MR_TRIG=1 + ;; + push) + PU_TRIG=1 + ;; + *) + echo "" + echo "Syntax Error: Invalid Trigger option -> $TRIG" + echo "" + trigger_usage + exit + ;; + esac + let "jb_checker|=0x8" + shift + shift + ;; + -mr) + MR_TRIG=1 + let "jb_checker|=0x8" + shift + ;; + -pu) + PU_TRIG=1 + let "jb_checker|=0x8" + shift + ;; + -sb|--src-branch) + SOURCE_BRANCH="$2" + let "mr_checker|=0x1" + shift + shift + ;; + -sc|--src-commit) + SOURCE_COMMIT_ID="$2" + let "mr_checker|=0x2" + shift + shift + ;; + -tb|--target-branch) + TARGET_BRANCH="$2" + let "mr_checker|=0x4" + shift + shift + ;; + -tc|--target-commit) + TARGET_COMMIT_ID="$2" + let "mr_checker|=0x8" + shift + shift + ;; + -br|--branch) + SOURCE_BRANCH="$2" + let "pu_checker|=0x1" + shift + shift + ;; + -co|--commit) + SOURCE_COMMIT_ID="$2" + let "pu_checker|=0x2" + shift + shift + ;; + *) + echo "Syntax Error: unknown option: $key" + echo "" + usage + exit 1 + ;; +esac + +done + +if [ $jb_checker -ne 15 ] +then + echo "" + echo "Syntax Error: missing job information." + # TODO : list missing info + echo "" + exit 1 +fi + +if [ $PU_TRIG -eq 1 ] && [ $MR_TRIG -eq 1 ] +then + echo "" + echo "Syntax Error: trigger action incoherent." + echo "" + trigger_usage + exit 1 +fi + +if [ $PU_TRIG -eq 1 ] +then + if [ $pu_checker -ne 3 ] + then + echo "" + echo "Syntax Error: missing push information." + # TODO : list missing info + echo "" + exit 1 + fi +fi + +if [ $MR_TRIG -eq 1 ] +then + if [ $mr_checker -ne 15 ] + then + echo "" + echo "Syntax Error: missing merge-request information." + # TODO : list missing info + echo "" + exit 1 + fi +fi + +echo "<!DOCTYPE html>" > ./test_simulator_results.html +echo "<html class=\"no-js\" lang=\"en-US\">" >> ./test_simulator_results.html +echo "<head>" >> ./test_simulator_results.html +echo " <title>Simulator Results for $JOB_NAME job build #$BUILD_ID</title>" >> ./test_simulator_results.html +echo " <base href = \"http://www.openairinterface.org/\" />" >> ./test_simulator_results.html +echo "</head>" >> ./test_simulator_results.html +echo "<body>" >> ./test_simulator_results.html +echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html +echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html +echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./test_simulator_results.html +echo " <a href=\"http://www.openairinterface.org/\">" >> ./test_simulator_results.html +echo " <img src=\"/wp-content/uploads/2016/03/cropped-oai_final_logo2.png\" alt=\"\" border=\"none\" height=50 width=150>" >> ./test_simulator_results.html +echo " </img>" >> ./test_simulator_results.html +echo " </a>" >> ./test_simulator_results.html +echo " </td>" >> ./test_simulator_results.html +echo " <td style=\"border-collapse: collapse; border: none; vertical-align: center;\">" >> ./test_simulator_results.html +echo " <b><font size = \"6\">Job Summary -- Job: $JOB_NAME -- Build-ID: $BUILD_ID</font></b>" >> ./test_simulator_results.html +echo " </td>" >> ./test_simulator_results.html +echo " </tr>" >> ./test_simulator_results.html +echo " </table>" >> ./test_simulator_results.html +echo " <br>" >> ./test_simulator_results.html +echo " <table border = \"1\">" >> ./test_simulator_results.html +echo " <tr>" >> ./test_simulator_results.html +echo " <td bgcolor = \"lightcyan\" >GIT Repository</td>" >> ./test_simulator_results.html +echo " <td><a href=\"$GIT_URL\">$GIT_URL</a></td>" >> ./test_simulator_results.html +echo " </tr>" >> ./test_simulator_results.html +echo " <tr>" >> ./test_simulator_results.html +echo " <td bgcolor = \"lightcyan\" >Job Trigger</td>" >> ./test_simulator_results.html +if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./test_simulator_results.html; fi +if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./test_simulator_results.html; fi +echo " </tr>" >> ./test_simulator_results.html +if [ $PU_TRIG -eq 1 ] +then + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Branch</td>" >> ./test_simulator_results.html + echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Commit ID</td>" >> ./test_simulator_results.html + echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html +fi +if [ $MR_TRIG -eq 1 ] +then + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Source Branch</td>" >> ./test_simulator_results.html + echo " <td>$SOURCE_BRANCH</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Source Commit ID</td>" >> ./test_simulator_results.html + echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Target Branch</td>" >> ./test_simulator_results.html + echo " <td>$TARGET_BRANCH</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + echo " <tr>" >> ./test_simulator_results.html + echo " <td bgcolor = \"lightcyan\" >Target Commit ID</td>" >> ./test_simulator_results.html + echo " <td>$TARGET_COMMIT_ID</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html +fi +echo " </table>" >> ./test_simulator_results.html +echo " <h2>Test Summary</h2>" >> ./test_simulator_results.html + +ARCHIVES_LOC=archives/basic_sim/test +if [ -d $ARCHIVES_LOC ] +then + echo " <h3>Basic Simulator Check</h3>" >> ./test_simulator_results.html + + echo " <table border = \"1\">" >> ./test_simulator_results.html + echo " <tr bgcolor = \"#33CCFF\" >" >> ./test_simulator_results.html + echo " <th>Log File Name</th>" >> ./test_simulator_results.html + echo " <th>Command</th>" >> ./test_simulator_results.html + echo " <th>Status</th>" >> ./test_simulator_results.html + echo " <th>Statistics</th>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + + PING_TESTS=`ls $ARCHIVES_LOC/*ping*txt` + for PING_CASE in $PING_TESTS + do + echo " <tr>" >> ./test_simulator_results.html + NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"` + echo " <td>$NAME</td>" >> ./test_simulator_results.html + CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"` + echo " <td>$CMD</td>" >> ./test_simulator_results.html + FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE` + if [ $FILE_COMPLETE -eq 0 ] + then + echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html + echo " <td>N/A</td>" >> ./test_simulator_results.html + else + NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"` + NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"` + if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ] + then + echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html + else + echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html + fi + echo " <td>" >> ./test_simulator_results.html + echo " <pre>" >> ./test_simulator_results.html + STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"` + echo "Packet Loss : $STATS" >> ./test_simulator_results.html + RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'` + echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html + RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'` + echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html + RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'` + echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html + echo " </pre>" >> ./test_simulator_results.html + echo " </td>" >> ./test_simulator_results.html + fi + echo " </tr>" >> ./test_simulator_results.html + done + + IPERF_TESTS=`ls $ARCHIVES_LOC/*iperf*client*txt` + for IPERF_CASE in $IPERF_TESTS + do + echo " <tr>" >> ./test_simulator_results.html + NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"` + echo " <td>$NAME</td>" >> ./test_simulator_results.html + CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"` + echo " <td>$CMD</td>" >> ./test_simulator_results.html + REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"` + if [[ $REQ_BITRATE =~ .*K.* ]] + then + REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"` + FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l` + fi + if [[ $REQ_BITRATE =~ .*M.* ]] + then + REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"` + FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l` + fi + if [[ $REQ_BITRATE =~ .*G.* ]] + then + REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"` + FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l` + fi + FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE` + if [ $FILE_COMPLETE -eq 0 ] + then + echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html + SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"` + FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'` + EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'` + PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'` + JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'` + PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'` + PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"` + else + EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"` + if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]] + then + EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"` + FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l` + fi + if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]] + then + EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"` + FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l` + fi + if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]] + then + EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"` + FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l` + fi + PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'` + PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'` + if [[ $PERF_INT -lt 90 ]] + then + echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html + else + echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html + fi + EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"` + JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"` + PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"` + fi + echo " <td>" >> ./test_simulator_results.html + echo " <pre>" >> ./test_simulator_results.html + echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html + echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html + echo "Jitter : $JITTER" >> ./test_simulator_results.html + echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html + echo " </pre>" >> ./test_simulator_results.html + echo " </td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + done + + echo " </table>" >> ./test_simulator_results.html +fi + +ARCHIVES_LOC=archives/phy_sim/test +if [ -d $ARCHIVES_LOC ] +then + echo " <h3>Physical Simulators Check</h3>" >> ./test_simulator_results.html + + echo " <table border = \"1\">" >> ./test_simulator_results.html + echo " <tr bgcolor = \"#33CCFF\" >" >> ./test_simulator_results.html + echo " <th>Log File Name</th>" >> ./test_simulator_results.html + echo " <th>Nb Tests</th>" >> ./test_simulator_results.html + echo " <th>Nb Errors</th>" >> ./test_simulator_results.html + echo " <th>Nb Failures</th>" >> ./test_simulator_results.html + echo " <th>Nb Failures</th>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + + XML_TESTS=`ls $ARCHIVES_LOC/*xml` + for XML_FILE in $XML_TESTS + do + echo " <tr>" >> ./test_simulator_results.html + NAME=`echo $XML_FILE | sed -e "s#$ARCHIVES_LOC/##"` + NB_TESTS=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*tests='##" -e "s#' *time=.*##"` + NB_ERRORS=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*errors='##" -e "s#' *failures=.*##"` + NB_FAILURES=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*failures='##" -e "s#' *hostname=.*##"` + NB_SKIPPED=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*skipped='##" -e "s#' *tests=.*##"` + if [ $NB_ERRORS -eq 0 ] && [ $NB_FAILURES -eq 0 ] + then + echo " <td bgcolor = \"green\" >$NAME</td>" >> ./test_simulator_results.html + else + echo " <td bgcolor = \"red\" >$NAME</td>" >> ./test_simulator_results.html + fi + echo " <td>$NB_TESTS</td>" >> ./test_simulator_results.html + echo " <td>$NB_ERRORS</td>" >> ./test_simulator_results.html + echo " <td>$NB_FAILURES</td>" >> ./test_simulator_results.html + echo " <td>$NB_SKIPPED</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + done + + echo " </table>" >> ./test_simulator_results.html + + echo " <h4>Details</h4>" >> ./test_simulator_results.html + for XML_FILE in $XML_TESTS + do + echo " <table border = \"1\">" >> ./test_simulator_results.html + echo " <tr bgcolor = \"#33CCFF\" >" >> ./test_simulator_results.html + echo " <th>Test Name</th>" >> ./test_simulator_results.html + echo " <th>Description</th>" >> ./test_simulator_results.html + echo " <th>Result</th>" >> ./test_simulator_results.html + echo " <th>Time</th>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + TESTCASES_LIST=`sed -e "s# #@#g" $XML_FILE | grep testcase` + for TESTCASE in $TESTCASES_LIST + do + echo " <tr>" >> ./test_simulator_results.html + NAME=`echo $TESTCASE | sed -e "s#^.*name='##" -e "s#'@description=.*##" | sed -e "s#@# #g"` + echo " <td>$NAME</td>" >> ./test_simulator_results.html + DESC=`echo $TESTCASE | sed -e "s#^.*description='##" -e "s#'@Run_result=.*##" | sed -e "s#@# #g"` + echo " <td>$DESC</td>" >> ./test_simulator_results.html + RESULT=`echo $TESTCASE | sed -e "s#^.*RESULT='##" -e "s#'.*##" | sed -e "s#@# #g"` + if [[ $RESULT =~ .*PASS.* ]] + then + echo " <td bgcolor = \"green\" >$RESULT</td>" >> ./test_simulator_results.html + else + echo " <td bgcolor = \"red\" >$RESULT</td>" >> ./test_simulator_results.html + fi + TIME=`echo $TESTCASE | sed -e "s#^.*time='##" -e "s#'@RESULT=.*##" | sed -e "s#@# #g"` + echo " <td>$TIME</td>" >> ./test_simulator_results.html + echo " </tr>" >> ./test_simulator_results.html + done + echo " </table>" >> ./test_simulator_results.html + done +fi + +echo "</body>" >> ./test_simulator_results.html +echo "</html>" >> ./test_simulator_results.html + +exit 0 diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh index 68438758f5bf41936520958be57f33c9addc86a8..971050fbb3cc65610be89f840756eec912279fe3 100755 --- a/ci-scripts/runTestOnVM.sh +++ b/ci-scripts/runTestOnVM.sh @@ -70,6 +70,196 @@ function variant_usage { echo "" } +function start_basic_sim_enb { + local LOC_VM_IP_ADDR=$2 + local LOC_EPC_IP_ADDR=$3 + local LOC_LOG_FILE=$4 + local LOC_NB_RBS=$5 + echo "cd /home/ubuntu/tmp" > $1 + echo "echo \"sudo apt-get --yes --quiet install daemon \"" >> $1 + echo "sudo apt-get --yes install daemon >> /home/ubuntu/tmp/cmake_targets/log/daemon-install.txt 2>&1" >> $1 + echo "echo \"export ENODEB=1\"" >> $1 + echo "export ENODEB=1" >> $1 + echo "echo \"source oaienv\"" >> $1 + echo "source oaienv" >> $1 + echo "cd ci-scripts/conf_files/" >> $1 + echo "cp lte-basic-sim.conf ci-lte-basic-sim.conf" >> $1 + echo "sed -i -e 's#N_RB_DL.*=.*;#N_RB_DL = $LOC_NB_RBS;#' -e 's#CI_MME_IP_ADDR#$LOC_EPC_IP_ADDR#' -e 's#CI_ENB_IP_ADDR#$LOC_VM_IP_ADDR#' ci-lte-basic-sim.conf" >> $1 + echo "echo \"grep N_RB_DL ci-lte-basic-sim.conf\"" >> $1 + echo "grep N_RB_DL ci-lte-basic-sim.conf | sed -e 's#N_RB_DL.*=#N_RB_DL =#'" >> $1 + echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/\"" >> $1 + echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/" >> $1 + echo "echo \"./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf\" > ./my-lte-softmodem-run.sh " >> $1 + echo "chmod 775 ./my-lte-softmodem-run.sh" >> $1 + echo "cat ./my-lte-softmodem-run.sh" >> $1 + echo "sudo -E daemon --inherit --unsafe --name=enb_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/enb -o /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE ./my-lte-softmodem-run.sh" >> $1 + + ssh -o StrictHostKeyChecking=no ubuntu@$LOC_VM_IP_ADDR < $1 + sleep 60 + rm $1 +} + +function start_basic_sim_ue { + local LOC_UE_LOG_FILE=$3 + local LOC_NB_RBS=$4 + echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue\"" > $1 + echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue" > $1 + echo "echo \"./lte-uesoftmodem -C 2680000000 -r $LOC_NB_RBS --ue-rxgain 140\" > ./my-lte-uesoftmodem-run.sh" >> $1 + echo "chmod 775 ./my-lte-uesoftmodem-run.sh" >> $1 + echo "cat ./my-lte-uesoftmodem-run.sh" >> $1 + echo "sudo -E daemon --inherit --unsafe --name=ue_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/ue -o /home/ubuntu/tmp/cmake_targets/log/$LOC_UE_LOG_FILE ./my-lte-uesoftmodem-run.sh" >> $1 + + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm $1 + + local i="0" + echo "ifconfig oip1 | egrep -c \"inet addr\"" > $1 + while [ $i -lt 40 ] + do + sleep 5 + CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1` + if [ $CONNECTED -eq 1 ] + then + i="100" + else + i=$[$i+1] + fi + done + rm $1 + if [ $i -lt 50 ] + then + UE_SYNC=0 + else + UE_SYNC=1 + fi +} + +function get_ue_ip_addr { + echo "ifconfig oip1 | egrep \"inet addr\" | sed -e 's#^.*inet addr:##' -e 's# P-t-P:.*\$##'" > $1 + UE_IP_ADDR=`ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1` + echo "UE IP Address for EPC is : $UE_IP_ADDR" + rm $1 +} + +function ping_ue_ip_addr { + echo "echo \"ping -c 20 $3\"" > $1 + echo "echo \"COMMAND IS: ping -c 20 $3\" > $4" > $1 + echo "ping -c 20 $UE_IP_ADDR | tee -a $4" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm -f $1 +} + +function check_ping_result { + local LOC_PING_FILE=$1 + local LOC_NB_PINGS=$2 + if [ -f $LOC_PING_FILE ] + then + local FILE_COMPLETE=`egrep -c "ping statistics" $LOC_PING_FILE` + if [ $FILE_COMPLETE -eq 0 ] + then + PING_STATUS=-1 + else + local ALL_PACKET_RECEIVED=`egrep -c "$LOC_NB_PINGS received" $LOC_PING_FILE` + if [ $ALL_PACKET_RECEIVED -eq 1 ] + then + echo "got all ping packets" + else + PING_STATUS=-1 + fi + fi + else + PING_STATUS=-1 + fi +} + +function iperf_dl { + local REQ_BANDWIDTH=$5 + local BASE_LOG_FILE=$6 + echo "echo \"iperf -u -s -i 1\"" > $1 + echo "echo \"COMMAND IS: iperf -u -s -i 1\" > tmp/cmake_targets/log/${BASE_LOG_FILE}_server.txt" > $1 + echo "nohup iperf -u -s -i 1 >> tmp/cmake_targets/log/${BASE_LOG_FILE}_server.txt &" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm $1 + + echo "echo \"iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\"" > $3 + echo "echo \"COMMAND IS: iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\" > ${BASE_LOG_FILE}_client.txt" > $3 + echo "iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1 | tee -a ${BASE_LOG_FILE}_client.txt" >> $3 + ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3 + rm -f $3 + + echo "killall --signal SIGKILL iperf" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm $1 +} + +function iperf_ul { + local REQ_BANDWIDTH=$5 + local BASE_LOG_FILE=$6 + echo "echo \"iperf -u -s -i 1\"" > $3 + echo "echo \"COMMAND IS: iperf -u -s -i 1\" > ${BASE_LOG_FILE}_server.txt" > $3 + echo "nohup iperf -u -s -i 1 >> ${BASE_LOG_FILE}_server.txt &" >> $3 + ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3 + rm $3 + + echo "echo \"iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\"" > $1 + echo "echo \"COMMAND IS: iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\" > /home/ubuntu/tmp/cmake_targets/log/${BASE_LOG_FILE}_client.txt" > $1 + echo "iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1 | tee -a /home/ubuntu/tmp/cmake_targets/log/${BASE_LOG_FILE}_client.txt" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm -f $1 + + echo "killall --signal SIGKILL iperf" >> $3 + ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3 + rm $3 +} + +function check_iperf { + local LOC_BASE_LOG=$1 + local LOC_REQ_BW=$2 + local LOC_REQ_BW_MINUS_ONE=`echo "$LOC_REQ_BW - 1" | bc -l` + if [ -f ${LOC_BASE_LOG}_client.txt ] + then + local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt` + if [ $FILE_COMPLETE -eq 0 ] + then + IPERF_STATUS=-1 + else + local EFFECTIVE_BANDWIDTH=`tail -n3 ${LOC_BASE_LOG}_client.txt | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"` + if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*Mbits.* ]] + then + echo "got requested DL bandwidth: $EFFECTIVE_BANDWIDTH" + else + IPERF_STATUS=-1 + fi + fi + else + IPERF_STATUS=-1 + fi +} + +function terminate_enb_ue_basic_sim { + echo "echo \"sudo daemon --name=enb_daemon --stop\"" > $1 + echo "sudo daemon --name=enb_daemon --stop" >> $1 + echo "echo \"sudo daemon --name=ue_daemon --stop\"" >> $1 + echo "sudo daemon --name=ue_daemon --stop" >> $1 + echo "echo \"sudo killall --signal SIGKILL lte-softmodem\"" >> $1 + echo "sudo killall --signal SIGKILL lte-softmodem" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm -f $1 +} + +function terminate_ltebox_epc { + echo "echo \"cd /opt/ltebox/tools\"" > $1 + echo "cd /opt/ltebox/tools" >> $1 + echo "echo \"sudo ./stop_ltebox\"" >> $1 + echo "sudo ./stop_ltebox" >> $1 + echo "echo \"sudo daemon --name=simulated_hss --stop\"" >> $1 + echo "sudo daemon --name=simulated_hss --stop" >> $1 + echo "echo \"sudo killall --signal SIGKILL hss_sim\"" >> $1 + echo "sudo killall --signal SIGKILL hss_sim" >> $1 + ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1 + rm $1 +} + if [ $# -lt 1 ] || [ $# -gt 9 ] then echo "Syntax Error: not the correct number of arguments" @@ -122,6 +312,8 @@ case $key in ;; -v2) VM_NAME=ci-basic-sim + RUN_OPTIONS="complex" + ARCHIVES_LOC=basic_sim/test shift ;; -v3) @@ -150,6 +342,8 @@ case $key in ;; basic-sim) VM_NAME=ci-basic-sim + RUN_OPTIONS="complex" + ARCHIVES_LOC=basic_sim/test ;; phy-sim) VM_NAME=ci-phy-sim @@ -210,8 +404,11 @@ echo "$VM_NAME has for IP addr = $VM_IP_ADDR" if [ "$RUN_OPTIONS" == "none" ] then echo "No run on VM testing for this variant currently" -else + exit $STATUS +fi +if [[ $RUN_OPTIONS =~ .*run_exec_autotests.* ]] +then echo "############################################################" echo "Running test script on VM ($VM_NAME)" echo "############################################################" @@ -271,7 +468,7 @@ else rm -f $VM_CMDS echo "############################################################" - echo "Checking build status" + echo "Checking run status" echo "############################################################" LOG_FILES=`ls $ARCHIVES_LOC/results_autotests*.xml` @@ -306,13 +503,346 @@ else if [ $NB_RUNS -eq 0 ]; then STATUS=-1; fi if [ $NB_FAILURES -ne 0 ]; then STATUS=-1; fi - if [ $STATUS -eq 0 ] +fi + +if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-basic-sim.* ]] +then + PING_STATUS=0 + IPERF_STATUS=0 + if [ -d $ARCHIVES_LOC ] then - echo "STATUS seems OK" - else - echo "STATUS failed?" + rm -Rf $ARCHIVES_LOC + fi + mkdir --parents $ARCHIVES_LOC + + EPC_VM_NAME=`echo $VM_NAME | sed -e "s#basic-sim#epc#"` + LTEBOX=0 + if [ -d /opt/ltebox-archives/ ] + then + # Checking if all ltebox archives are available to run ltebx epc on a brand new VM + if [ -f /opt/ltebox-archives/ltebox_2.2.70_16_04_amd64.deb ] && [ -f /opt/ltebox-archives/etc-conf.zip ] && [ -f /opt/ltebox-archives/hss-sim.zip ] + then + echo "############################################################" + echo "Test EPC on VM ($EPC_VM_NAME) will be using ltebox" + echo "############################################################" + LTEBOX=1 + fi + fi + # Here we could have other types of EPC detection + + # Do we need to start the EPC VM + EPC_VM_CMDS=`echo $VM_CMDS | sed -e "s#cmds#epc-cmds#"` + echo "EPC_VM_CMD_FILE = $EPC_VM_CMDS" + IS_EPC_VM_ALIVE=`uvt-kvm list | grep -c $EPC_VM_NAME` + if [ $IS_EPC_VM_ALIVE -eq 0 ] + then + echo "############################################################" + echo "Creating test EPC VM ($EPC_VM_NAME) on Ubuntu Cloud Image base" + echo "############################################################" + uvt-kvm create $EPC_VM_NAME release=xenial --unsafe-caching + fi + + uvt-kvm wait $EPC_VM_NAME --insecure + EPC_VM_IP_ADDR=`uvt-kvm ip $EPC_VM_NAME` + echo "$EPC_VM_NAME has for IP addr = $EPC_VM_IP_ADDR" + scp -o StrictHostKeyChecking=no /etc/apt/apt.conf.d/01proxy ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu + + # ltebox specific actions (install and start) + LTE_BOX_TO_INSTALL=1 + if [ $LTEBOX -eq 1 ] + then + echo "ls -ls /opt/ltebox/tools/start_ltebox" > $EPC_VM_CMDS + RESPONSE=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS` + NB_EXES=`echo $RESPONSE | grep -c ltebox` + if [ $NB_EXES -eq 1 ]; then LTE_BOX_TO_INSTALL=0; fi + fi + + if [ $LTEBOX -eq 1 ] && [ $LTE_BOX_TO_INSTALL -eq 1 ] + then + echo "############################################################" + echo "Copying ltebox archives into EPC VM ($EPC_VM_NAME)" + echo "############################################################" + scp -o StrictHostKeyChecking=no /opt/ltebox-archives/ltebox_2.2.70_16_04_amd64.deb ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu + scp -o StrictHostKeyChecking=no /opt/ltebox-archives/etc-conf.zip ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu + scp -o StrictHostKeyChecking=no /opt/ltebox-archives/hss-sim.zip ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu + + echo "############################################################" + echo "Install EPC on EPC VM ($EPC_VM_NAME)" + echo "############################################################" + echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $EPC_VM_CMDS + echo "touch /home/ubuntu/.hushlogin" >> $EPC_VM_CMDS + echo "echo \"sudo apt-get --yes --quiet install zip openjdk-8-jre libconfuse-dev libreadline-dev liblog4c-dev libgcrypt-dev libsctp-dev python2.7 python2.7-dev daemon iperf\"" >> $EPC_VM_CMDS + echo "sudo apt-get update > zip-install.txt 2>&1" >> $EPC_VM_CMDS + echo "sudo apt-get --yes install zip openjdk-8-jre libconfuse-dev libreadline-dev liblog4c-dev libgcrypt-dev libsctp-dev python2.7 python2.7-dev daemon iperf >> zip-install.txt 2>&1" >> $EPC_VM_CMDS + + # Installing HSS + echo "echo \"cd /opt\"" >> $EPC_VM_CMDS + echo "cd /opt" >> $EPC_VM_CMDS + echo "echo \"sudo unzip -qq /home/ubuntu/hss-sim.zip\"" >> $EPC_VM_CMDS + echo "sudo unzip -qq /home/ubuntu/hss-sim.zip" >> $EPC_VM_CMDS + echo "echo \"cd /opt/hss_sim0609\"" >> $EPC_VM_CMDS + echo "cd /opt/hss_sim0609" >> $EPC_VM_CMDS + + # Installing ltebox + echo "echo \"cd /home/ubuntu\"" >> $EPC_VM_CMDS + echo "cd /home/ubuntu" >> $EPC_VM_CMDS + echo "echo \"sudo dpkg -i ltebox_2.2.70_16_04_amd64.deb \"" >> $EPC_VM_CMDS + echo "sudo dpkg -i ltebox_2.2.70_16_04_amd64.deb >> zip-install.txt 2>&1" >> $EPC_VM_CMDS + + echo "echo \"cd /opt/ltebox/etc/\"" >> $EPC_VM_CMDS + echo "cd /opt/ltebox/etc/" >> $EPC_VM_CMDS + echo "echo \"sudo unzip -qq -o /home/ubuntu/etc-conf.zip\"" >> $EPC_VM_CMDS + echo "sudo unzip -qq -o /home/ubuntu/etc-conf.zip" >> $EPC_VM_CMDS + echo "sudo sed -i -e 's#EPC_VM_IP_ADDRESS#$EPC_VM_IP_ADDR#' gw.conf" >> $EPC_VM_CMDS + echo "sudo sed -i -e 's#EPC_VM_IP_ADDRESS#$EPC_VM_IP_ADDR#' mme.conf" >> $EPC_VM_CMDS + fi + + # Starting EPC + if [ $LTEBOX -eq 1 ] + then + echo "############################################################" + echo "Start EPC on EPC VM ($EPC_VM_NAME)" + echo "############################################################" + echo "echo \"cd /opt/hss_sim0609\"" >> $EPC_VM_CMDS + echo "cd /opt/hss_sim0609" >> $EPC_VM_CMDS + echo "echo \"sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real\"" >> $EPC_VM_CMDS + echo "sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real" >> $EPC_VM_CMDS + + echo "echo \"cd /opt/ltebox/tools/\"" >> $EPC_VM_CMDS + echo "cd /opt/ltebox/tools/" >> $EPC_VM_CMDS + echo "echo \"sudo ./start_ltebox\"" >> $EPC_VM_CMDS + echo "nohup sudo ./start_ltebox > /home/ubuntu/ltebox.txt" >> $EPC_VM_CMDS + + ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS + rm -f $EPC_VM_CMDS + + # We may have some adaptation to do + if [ -f /opt/ltebox-archives/adapt_ue_sim.txt ] + then + echo "############################################################" + echo "Doing some adaptation on UE side" + echo "############################################################" + ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < /opt/ltebox-archives/adapt_ue_sim.txt + fi + + i="0" + echo "ifconfig tun5 | egrep -c \"inet addr\"" > $EPC_VM_CMDS + while [ $i -lt 10 ] + do + sleep 2 + CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS` + if [ $CONNECTED -eq 1 ] + then + i="100" + else + i=$[$i+1] + fi + done + rm $EPC_VM_CMDS + if [ $i -lt 50 ] + then + echo "Problem w/ starting ltebox EPC" + exit -1 + fi + fi + + # HERE ADD ANY INSTALL ACTIONS FOR ANOTHER EPC + + # Retrieve EPC real IP address + if [ $LTEBOX -eq 1 ] + then + # in our configuration file, we are using pool 5 + echo "ifconfig tun5 | egrep \"inet addr\" | sed -e 's#^.*inet addr:##' -e 's# P-t-P:.*\$##'" > $EPC_VM_CMDS + REAL_EPC_IP_ADDR=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS` + echo "EPC IP Address is : $REAL_EPC_IP_ADDR" + rm $EPC_VM_CMDS + fi + + echo "############################################################" + echo "Starting the eNB at 5MHz" + echo "############################################################" + CURRENT_ENB_LOG_FILE=enb_05MHz.log + start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 25 + + echo "############################################################" + echo "Starting the UE at 5MHz" + echo "############################################################" + CURRENT_UE_LOG_FILE=ue_05MHz.log + start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 25 + if [ $UE_SYNC -eq 0 ] + then + echo "Problem w/ eNB and UE not syncing" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR + exit -1 + fi + get_ue_ip_addr $VM_CMDS $VM_IP_ADDR + + echo "############################################################" + echo "Pinging the UE" + echo "############################################################" + ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 05MHz_ping_ue.txt + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/05MHz_ping_ue.txt $ARCHIVES_LOC + check_ping_result $ARCHIVES_LOC/05MHz_ping_ue.txt 20 + + echo "############################################################" + echo "Iperf DL" + echo "############################################################" + CURR_IPERF_LOG_BASE=05MHz_iperf_dl + iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15 + + echo "############################################################" + echo "Iperf UL" + echo "############################################################" + CURR_IPERF_LOG_BASE=05MHz_iperf_ul + iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 2 + + echo "############################################################" + echo "Terminate enb/ue simulators" + echo "############################################################" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + + echo "############################################################" + echo "Starting the eNB at 10MHz" + echo "############################################################" + CURRENT_ENB_LOG_FILE=enb_10MHz.log + start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 50 + + echo "############################################################" + echo "Starting the UE at 10MHz" + echo "############################################################" + CURRENT_UE_LOG_FILE=ue_10MHz.log + start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 50 + if [ $UE_SYNC -eq 0 ] + then + echo "Problem w/ eNB and UE not syncing" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR + exit -1 fi + get_ue_ip_addr $VM_CMDS $VM_IP_ADDR + echo "############################################################" + echo "Pinging the UE" + echo "############################################################" + ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 10MHz_ping_ue.txt + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/10MHz_ping_ue.txt $ARCHIVES_LOC + check_ping_result $ARCHIVES_LOC/10MHz_ping_ue.txt 20 + + echo "############################################################" + echo "Iperf DL" + echo "############################################################" + CURR_IPERF_LOG_BASE=10MHz_iperf_dl + iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15 + + echo "############################################################" + echo "Iperf UL" + echo "############################################################" + CURR_IPERF_LOG_BASE=10MHz_iperf_ul + iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 2 + + echo "############################################################" + echo "Terminate enb/ue simulators" + echo "############################################################" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + + echo "############################################################" + echo "Starting the eNB at 20MHz" + echo "############################################################" + CURRENT_ENB_LOG_FILE=enb_20MHz.log + start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 100 + + echo "############################################################" + echo "Starting the UE at 20MHz" + echo "############################################################" + CURRENT_UE_LOG_FILE=ue_20MHz.log + start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 100 + if [ $UE_SYNC -eq 0 ] + then + echo "Problem w/ eNB and UE not syncing" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR + exit -1 + fi + get_ue_ip_addr $VM_CMDS $VM_IP_ADDR + + echo "############################################################" + echo "Pinging the UE" + echo "############################################################" + ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 20MHz_ping_ue.txt + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/20MHz_ping_ue.txt $ARCHIVES_LOC + check_ping_result $ARCHIVES_LOC/20MHz_ping_ue.txt 20 + + echo "############################################################" + echo "Iperf DL" + echo "############################################################" + CURR_IPERF_LOG_BASE=20MHz_iperf_dl + iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15 + + echo "############################################################" + echo "Iperf UL" + echo "############################################################" + CURR_IPERF_LOG_BASE=20MHz_iperf_ul + iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 1 $CURR_IPERF_LOG_BASE + scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC + check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 1 + + echo "############################################################" + echo "Terminate enb/ue simulators" + echo "############################################################" + terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC + scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC + + echo "############################################################" + echo "Terminate EPC" + echo "############################################################" + + if [ $LTEBOX -eq 1 ] + then + terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR + fi + + echo "############################################################" + echo "Checking run status" + echo "############################################################" + + if [ $PING_STATUS -ne 0 ]; then STATUS=-1; fi + if [ $IPERF_STATUS -ne 0 ]; then STATUS=-1; fi + +fi + +if [ $STATUS -eq 0 ] +then + echo "STATUS seems OK" +else + echo "STATUS failed?" fi exit $STATUS diff --git a/ci-scripts/xml_files/enb_usrp210_band7.xml b/ci-scripts/xml_files/enb_usrp210_band7.xml index 5b15d546f30cc051402eabfb525b008e9512b07a..b8a2439106b21632ed5f4bed8f4569da84c785d6 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7.xml @@ -21,25 +21,31 @@ --> <testCaseList> - <TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040401 040201 030201 040101 030111 040301 040511 040611 040612 040613 040401 040201 030201</TestCaseRequestedList> + <TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040642 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040652 040401 040201 030201 030121 040301 040521 040621 040622 040623 040624 040625 040662 040661 040401 040201 030201 </TestCaseRequestedList> <TestCaseExclusionList></TestCaseExclusionList> <testCase id="010101"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w USRP -c --eNB</Build_eNB_args> </testCase> <testCase id="030101"> <class>Initialize_eNB</class> <desc>Initialize eNB (FDD/Band7/5MHz)</desc> - <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf</Initialize_eNB_args> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --codingw --fepw</Initialize_eNB_args> </testCase> <testCase id="030111"> <class>Initialize_eNB</class> <desc>Initialize eNB (FDD/Band7/10MHz)</desc> - <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf --codingw --fepw</Initialize_eNB_args> + </testCase> + + <testCase id="030121"> + <class>Initialize_eNB</class> + <desc>Initialize eNB (FDD/Band7/20MHz)</desc> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf --codingw --fepw</Initialize_eNB_args> </testCase> <testCase id="030201"> @@ -81,6 +87,13 @@ <ping_packetloss_threshold>5</ping_packetloss_threshold> </testCase> + <testCase id="040521"> + <class>Ping</class> + <desc>ping (20MHz - 20 sec)</desc> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>5</ping_packetloss_threshold> + </testCase> + <testCase id="040601"> <class>Iperf</class> <desc>iperf (5MHz - DL/6Mbps/UDP)(60 sec)</desc> @@ -102,27 +115,141 @@ <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> + <testCase id="040604"> + <class>Iperf</class> + <desc>iperf (5MHz - DL/15Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 15M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040605"> + <class>Iperf</class> + <desc>iperf (5MHz - DL/15Mbps/UDP)(60 sec)(unbalanced profile)</desc> + <iperf_args>-u -b 15M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>unbalanced</iperf_profile> + </testCase> + + <testCase id="040641"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040642"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + <testCase id="040611"> <class>Iperf</class> - <desc>iperf (10MHz - DL/6Mbps/UDP)(60 sec)</desc> - <iperf_args>-u -b 6M -t 60 -i 1</iperf_args> + <desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 10M -t 60 -i 1</iperf_args> <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> <testCase id="040612"> <class>Iperf</class> - <desc>iperf (10MHz - DL/13Mbps/UDP)(60 sec)</desc> - <iperf_args>-u -b 13M -t 60 -i 1</iperf_args> + <desc>iperf (10MHz - DL/20Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 20M -t 60 -i 1</iperf_args> <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> <testCase id="040613"> <class>Iperf</class> - <desc>iperf (10MHz - DL/15Mbps/UDP)(60 sec)</desc> - <iperf_args>-u -b 15M -t 60 -i 1</iperf_args> + <desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 30M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040614"> + <class>Iperf</class> + <desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 30M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040615"> + <class>Iperf</class> + <desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)(unbalanced profile)</desc> + <iperf_args>-u -b 30M -t 60 -i 1</iperf_args> <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>unbalanced</iperf_profile> </testCase> + <testCase id="040651"> + <class>Iperf</class> + <desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040652"> + <class>Iperf</class> + <desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040621"> + <class>Iperf</class> + <desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 20M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040622"> + <class>Iperf</class> + <desc>iperf (20MHz - DL/40Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 40M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040623"> + <class>Iperf</class> + <desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 70M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040624"> + <class>Iperf</class> + <desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 70M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040625"> + <class>Iperf</class> + <desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(unbalanced profile)</desc> + <iperf_args>-u -b 70M -t 60 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>unbalanced</iperf_profile> + </testCase> + + <testCase id="040661"> + <class>Iperf</class> + <desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + </testCase> + + <testCase id="040662"> + <class>Iperf</class> + <desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + <testCase id="050101"> <class>Initialize_HSS</class> <desc>Initialize HSS</desc> diff --git a/ci-scripts/xml_files/enb_usrpb210_band40.xml b/ci-scripts/xml_files/enb_usrpb210_band40.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b54d9b8df4c0a45d37ab30723eda86be5f5fbc5 --- /dev/null +++ b/ci-scripts/xml_files/enb_usrpb210_band40.xml @@ -0,0 +1,179 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 + + 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. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <TestCaseRequestedList>010101 050101 060101 070101 040101 030104 040301 040501 040602 040601 040603 040401 040201 030201 030105 040301 040502 040702 040701 040401 040201 030201 050201 060201 070201</TestCaseRequestedList> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="010101"> + <class>Build_eNB</class> + <desc>Build eNB (USRP)</desc> + <Build_eNB_args>-w USRP -c --eNB</Build_eNB_args> + </testCase> + + <testCase id="030104"> + <class>Initialize_eNB</class> + <desc>Initialize eNB (FDD/Band40/10MHz)</desc> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf --codingw --fepw</Initialize_eNB_args> + </testCase> + + <testCase id="030105"> + <class>Initialize_eNB</class> + <desc>Initialize eNB (TDD/Band40/5MHz/info)</desc> + <Initialize_eNB_args>-O ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf --codingw --fepw</Initialize_eNB_args> + </testCase> + + <testCase id="030201"> + <class>Terminate_eNB</class> + <desc>Terminate eNB</desc> + </testCase> + + <testCase id="040101"> + <class>Initialize_UE</class> + <desc>Initialize UE</desc> + </testCase> + + <testCase id="040201"> + <class>Terminate_UE</class> + <desc>Terminate UE</desc> + </testCase> + + <testCase id="040301"> + <class>Attach_UE</class> + <desc>Attach UE</desc> + </testCase> + + <testCase id="040401"> + <class>Detach_UE</class> + <desc>Detach UE</desc> + </testCase> + + <testCase id="040501"> + <class>Ping</class> + <desc>ping (5MHz - 20 sec)</desc> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>25</ping_packetloss_threshold> + </testCase> + + <testCase id="040502"> + <class>Ping</class> + <desc>ping (10MHz - 20 sec)</desc> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>25</ping_packetloss_threshold> + </testCase> + + <testCase id="040601"> + <class>Iperf</class> + <desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)</desc> + <iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>balanced</iperf_profile> + </testCase> + + <testCase id="040602"> + <class>Iperf</class> + <desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)</desc> + <iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040603"> + <class>Iperf</class> + <desc>iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(unbalanced)</desc> + <iperf_args>-u -b 6.5M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>unbalanced</iperf_profile> + </testCase> + + <testCase id="040701"> + <class>Iperf</class> + <desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)</desc> + <iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>balanced</iperf_profile> + </testCase> + + <testCase id="040702"> + <class>Iperf</class> + <desc>iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)</desc> + <iperf_args>-u -b 13.5M -t 30 -i 1</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + + <testCase id="040641"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/1Mbps/UDP)(30 sec)(single-ue)</desc> + <iperf_args>-u -b 1M -t 30 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="040642"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/1Mbps/UDP)(30 sec)(balanced)</desc> + <iperf_args>-u -b 1M -t 30 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>balanced</iperf_profile> + </testCase> + + <testCase id="040643"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/8Mbps/UDP)(30 sec)(unbalanced)</desc> + <iperf_args>-u -b 8M -t 30 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>unbalanced</iperf_profile> + </testCase> + + <testCase id="050101"> + <class>Initialize_HSS</class> + <desc>Initialize HSS</desc> + </testCase> + + <testCase id="060101"> + <class>Initialize_MME</class> + <desc>Initialize MME</desc> + </testCase> + + <testCase id="070101"> + <class>Initialize_SPGW</class> + <desc>Initialize SPGW</desc> + </testCase> + + <testCase id="050201"> + <class>Terminate_HSS</class> + <desc>Terminate HSS</desc> + </testCase> + + <testCase id="060201"> + <class>Terminate_MME</class> + <desc>Terminate MME</desc> + </testCase> + + <testCase id="070201"> + <class>Terminate_SPGW</class> + <desc>Terminate SPGW</desc> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/test_case_list_template.xml b/ci-scripts/xml_files/test_case_list_template.xml index bc06dc75ce9a4a92b5496b5b50d20777360b46b3..25519dcd039f9a9ab1d479e83769a1d834e4acb9 100644 --- a/ci-scripts/xml_files/test_case_list_template.xml +++ b/ci-scripts/xml_files/test_case_list_template.xml @@ -29,13 +29,13 @@ <testCase id="010101"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w USRP -c --eNB</Build_eNB_args> </testCase> <testCase id="010102"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w BLADERF -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w BLADERF -c --eNB</Build_eNB_args> </testCase> <testCase id="030101"> diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index bb06364f10e3e337e18873aa78ad6a23d085e87a..de0da03a17a67945f35b74a9bcceb0913f94c485 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -472,6 +472,16 @@ add_library(X2AP_LIB include_directories ("${X2AP_C_DIR}") include_directories ("${X2AP_DIR}") +#add_library(X2AP_ENB + # ${X2AP_DIR}/x2ap_eNB.c + # ${X2AP_DIR}/x2ap_eNB_decoder.c + # ${X2AP_DIR}/x2ap_eNB_encoder.c + # ${X2AP_DIR}/x2ap_eNB_handler.c + # ${X2AP_DIR}/x2ap_eNB_itti_messaging.c + # ${X2AP_DIR}/x2ap_eNB_management_procedures.c + # ${X2AP_DIR}/x2ap_eNB_generate_messages.c + # ) + # Hardware dependant options ################################### add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4") @@ -883,12 +893,9 @@ add_library(HASHTABLE ) include_directories(${OPENAIR_DIR}/common/utils/hashtable) -if (MESSAGE_CHART_GENERATOR) - add_library(MSC - ${OPENAIR_DIR}/common/utils/msc/msc.c - ) - set(MSC_LIB MSC) -endif() +add_library(msc MODULE ${OPENAIR_DIR}/common/utils/msc/msc.c ) +target_link_libraries (msc LFDS) + include_directories(${OPENAIR_DIR}/common/utils/msc) set(UTIL_SRC @@ -1216,6 +1223,11 @@ set(PHY_MEX_UE ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c ${OPENAIR_DIR}/common/utils/LOG/log.c + ${OPENAIR_DIR}/common/utils/T/T.c + ${OPENAIR_DIR}/common/utils/T/local_tracer.c + ${OPENAIR_DIR}/common/config/config_cmdline.c + ${OPENAIR_DIR}/common/config/config_userapi.c + ${OPENAIR_DIR}/common/config/config_load_configmodule.c ) add_library(PHY_MEX ${PHY_MEX_UE}) @@ -1378,7 +1390,6 @@ include_directories(${NFAPI_USER_DIR}) add_library(CN_UTILS ${OPENAIR3_DIR}/UTILS/conversions.c ${OPENAIR3_DIR}/UTILS/enum_string.c - ${OPENAIR3_DIR}/UTILS/log.c ${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c ) @@ -1553,7 +1564,6 @@ set(libnas_ies_OBJS set (libnas_utils_OBJS ${NAS_SRC}COMMON/UTIL/device.c ${NAS_SRC}COMMON/UTIL/memory.c - ${NAS_SRC}COMMON/UTIL/nas_log.c ${NAS_SRC}COMMON/UTIL/nas_timer.c ${NAS_SRC}COMMON/UTIL/socket.c ${NAS_SRC}COMMON/UTIL/stty.c @@ -1876,9 +1886,13 @@ endif (${T_TRACER}) #This rule and the following deal with it. add_custom_command ( OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h - COMMAND make + COMMAND $(MAKE) clean + COMMAND $(MAKE) + COMMAND $(MAKE) check_vcd WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h ) #This rule is specifically needed to generate T files @@ -1929,7 +1943,7 @@ add_executable(lte-softmodem target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 + RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl) @@ -1966,7 +1980,7 @@ add_executable(lte-softmodem-nos1 ) target_link_libraries (lte-softmodem-nos1 -Wl,--start-group - RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} + RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl ) @@ -2005,7 +2019,7 @@ add_executable(lte-uesoftmodem target_link_libraries (lte-uesoftmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU + RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl) @@ -2044,7 +2058,7 @@ add_executable(lte-uesoftmodem-nos1 target_link_libraries (lte-uesoftmodem-nos1 -Wl,--start-group - RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} + RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl ) @@ -2122,7 +2136,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) add_executable(test_epc_play_scenario @@ -2183,7 +2197,8 @@ if (${T_TRACER}) oai_eth_transpro FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS - GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB) + GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX + coding) if (TARGET ${i}) add_dependencies(${i} generate_T) endif() @@ -2226,7 +2241,7 @@ function(make_driver name dir) endforeach() CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild) add_custom_command(OUTPUT ${name}.ko - COMMAND make -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} + COMMAND $(MAKE) -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name} COMMENT "building ${module}.ko" VERBATIM diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf index e2ea056ea17c1ab0a31c597d057eaf01bb9426a9..08eb76e09de3551c53e440f8a80d4bdfde30fc66 100644 --- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth6"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf index b2ac3ccf4224581389dc09d43d992ea4039bf502..eff42040ad87163f5d6f562377e41394450c18aa 100644 --- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth6"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf index 006d59d2a54ca908d9b2dde9fb9141b9cf086bb5..8eb66d46438e24e943db10c19a62837a42e550a1 100644 --- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth6"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf index 8c76d95d4c86d978198e922168888d368838b6fa..dc3b3bc4f03a5b93efb03eee80f96c1440950ab0 100644 --- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf index 0d2bb27dcc7c18c3b8446699a87357a529567611..6af71831f5416490f0df81a67b6a70f6192c263e 100644 --- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf index c418f355f20903326675577272da21d6dc8230e1..077b6e4ead5def0feab001a00900221b93437f40 100644 --- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf index 89e06d2b1e4511f212507069db0d074b87adeb9f..e2f5981418f4487e92bd9c9d03796b4d3dbe8b05 100644 --- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf index c8e6c861e0fddc61ec4a0cb7c9ce169bb36eaf20..9e08414ab3de7152cb674eac96eb7ee8310cd455 100644 --- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf index cc00f4f3ea584d662e58bfdeb7f95ea3073bc9ac..2a598c31d317478bfe78751745adce6ee8f9cf4f 100644 --- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf @@ -146,12 +146,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf index 6e1e776fed0da4bf219f6525b82db0accd8be758..4966108d034d82e20e0df8d72c619bdb63b03ea3 100644 --- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf @@ -148,12 +148,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth3"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf index 7e7c3c185d41be1f6b7ed09fca0cec75d7fd3e85..4f3b25349a64ad0368875ba70d6e150ec0f3e5b7 100644 --- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf @@ -148,12 +148,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth3"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf index 3098660c8de40e967d5e4adf7dc870b31d3ee1c3..54e5a327cd61e7cc5568f9e6267787a231020826 100644 --- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf @@ -148,12 +148,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth3"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; rrh_gw_config = ( diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index c15e1e8ec788b1057aa07c7aba346656bf4f994f..3954827c0949fde7efa828f436cd54e21246463b 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -40,7 +40,7 @@ set_openair_env gen_nvram_path=$OPENAIR_DIR/targets/bin conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -MSC_GEN="False" +MSC_GEN=0 XFORMS="True" UE_EXPANSION="False" PRINT_STATS="False" @@ -155,6 +155,10 @@ Options Disable all LOG_* macros --build-eclipse Build eclipse project files. Paths are auto corrected by fixprj.sh +--build-telnet + Build telnet server, specify --telnetsrv on command line to start it (eNB only) +--build-msc + Build MSC tracing utility, specify --msc on command line to start it (eNB and UE) --usrp-recplay Build for I/Q record-playback modes --ue-nas-use-tun @@ -345,6 +349,10 @@ function main() { --build-telnetsrv) BUILD_TELNETSRV=1 echo_info "Build embedded telnet server" + shift ;; + --build-msc) + MSC_GEN=1 + echo_info "Build MSC tracing utility" shift ;; --usrp-recplay) USRP_REC_PLAY="True" @@ -690,6 +698,15 @@ function main() { $build_dir telnetsrv \ libtelnetsrv.so $dbin/libtelnetsrv.so + fi + # Telnet server compilation + ##################### + if [ "$MSC_GEN" = "1" ] ; then + build_dir=$lte_build_dir + compilations \ + $build_dir msc \ + libmsc.so $dbin/libmsc.so + fi # build RF device and transport protocol libraries ##################################### diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt index 81e3fe4b3ce7ac256ed4fea630ee30ec9425b2a1..c1a0bb419b74666eccc6a9c522a2394e4a688695 100644 --- a/cmake_targets/nas_sim_tools/CMakeLists.txt +++ b/cmake_targets/nas_sim_tools/CMakeLists.txt @@ -27,7 +27,6 @@ set(CONF2UEDATA_LIB_SRC ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c - ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.c ${OPENAIR_DIR}/common/utils/utils.c diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 4b0ea9cc6b7fe7fe8cca45a726b54eaead84d111..3363bd2e7658feef8f91ec18b80f738b43cc440b 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -597,7 +597,7 @@ check_install_oai_software() { echo "EPEL repos not present. Installing them." $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm fi - $SUDO $INSTALLER install -y python-epdb + $SUDO $INSTALLER install -y python-epdb vim-common else $SUDO $INSTALLER install -y mscgen pydb fi @@ -683,7 +683,7 @@ install_asn1c_from_source(){ # better to use a given commit than a branch in case the branch # is updated and requires modifications in the source of OAI #git checkout velichkov_s1ap_plus_option_group - git checkout ec830d70bbb014b769810355a2f321a91ccd8a58 + git checkout 73d6b23dcec9ab36605b4af884143824392134c1 autoreconf -iv ./configure make -j`nproc` diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c index 47371ea5680488fa1083f822f332ffa97347ea15..2e6b21dea4cd0bbc91b109dc5514351a64947b67 100644 --- a/common/config/config_cmdline.c +++ b/common/config/config_cmdline.c @@ -39,7 +39,7 @@ #include "config_userapi.h" -void parse_stringlist(paramdef_t *cfgoptions, char *val) +int parse_stringlist(paramdef_t *cfgoptions, char *val) { char *atoken; char *tokctx; @@ -64,7 +64,7 @@ int numelt=0; printf_params("[LIBCONFIG] %s[%i]: %s\n", cfgoptions->optname,i,cfgoptions->strlistptr[i]); atoken=strtok_r(NULL, ",",&tokctx); } - cfgoptions->numelt=numelt; + return (cfgoptions->numelt > 0); } int processoption(paramdef_t *cfgoptions, char *value) @@ -96,7 +96,7 @@ char defbool[2]="1"; break; case TYPE_STRINGLIST: - parse_stringlist(cfgoptions,tmpval); + optisset=parse_stringlist(cfgoptions,tmpval); break; case TYPE_UINT32: case TYPE_INT32: diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index 02ee849202e285aeb936312a12b754ae6f21b19f..c1f11c0bfd20cb860276af3f536583bdd0d0650d 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -54,7 +54,6 @@ mapping log_level_names[] = { {"error", OAILOG_ERR}, - {"file", OAILOG_FILE}, {"warn", OAILOG_WARNING}, {"info", OAILOG_INFO}, {"debug", OAILOG_DEBUG}, @@ -70,18 +69,10 @@ mapping log_options[] = { }; -mapping log_maskmap[] = { - {"prach", DEBUG_PRACH}, - {"RU", DEBUG_RU}, - {"LTEESTIM", DEBUG_LTEESTIM}, - {"ctrlsocket", DEBUG_CTRLSOCKET}, - {"UE_PHYPROC", DEBUG_UE_PHYPROC}, - {"UE_TIMING", UE_TIMING}, - {NULL,-1} -}; +mapping log_maskmap[] = LOG_MASKMAP_INIT; -char *log_level_highlight_start[] = {LOG_RED, LOG_GREEN, LOG_ORANGE, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */ -char *log_level_highlight_end[] = {LOG_RESET,LOG_RESET,LOG_RESET,LOG_RESET, LOG_RESET,LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */ +char *log_level_highlight_start[] = {LOG_RED, LOG_ORANGE, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */ +char *log_level_highlight_end[] = {LOG_RESET,LOG_RESET,LOG_RESET, LOG_RESET,LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */ int write_file_matlab(const char *fname,const char *vname,void *data,int length,int dec,char format) @@ -243,14 +234,14 @@ int write_file_matlab(const char *fname,const char *vname,void *data,int length, /* get log parameters from configuration file */ void log_getconfig(log_t *g_log) { char *gloglevel = NULL; - int level; + int consolelog ; paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC; paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS]; paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS]; paramdef_t logparams_debug[sizeof(log_maskmap)/sizeof(mapping)]; - paramdef_t logparams_matlab[sizeof(log_maskmap)/sizeof(mapping)]; + paramdef_t logparams_dump[sizeof(log_maskmap)/sizeof(mapping)]; int ret = config_get( logparams_defaults,sizeof(logparams_defaults)/sizeof(paramdef_t),CONFIG_STRING_LOG_PREFIX); if (ret <0) { @@ -258,6 +249,7 @@ void log_getconfig(log_t *g_log) { return; } +/* set LOG display options (enable/disable color, thread name, level ) */ for(int i=0; i<logparams_defaults[LOG_OPTIONS_IDX].numelt ; i++) { for(int j=0; log_options[j].name != NULL ; j++) { if (strcmp(logparams_defaults[LOG_OPTIONS_IDX].strlistptr[i],log_options[j].name) == 0) { @@ -303,38 +295,40 @@ void log_getconfig(log_t *g_log) { config_get( logparams_logfile, MAX_LOG_PREDEF_COMPONENTS,CONFIG_STRING_LOG_PREFIX); /* now set the log levels and infile option, according to what we read */ for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_PREDEF_COMPONENTS; i++) { - level = map_str_to_int(log_level_names, *(logparams_level[i].strptr)); - set_log(i, level,1); + g_log->log_component[i].level = map_str_to_int(log_level_names, *(logparams_level[i].strptr)); + set_log(i, g_log->log_component[i].level); if (*(logparams_logfile[i].uptr) == 1) set_component_filelog(i); } -/* build then read the debug and matlab parameter array */ +/* build then read the debug and dump parameter array */ for (int i=0;log_maskmap[i].name != NULL ; i++) { - sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name); - sprintf(logparams_matlab[i].optname, LOG_CONFIG_MATLAB_FORMAT, log_maskmap[i].name); + sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name); + sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, log_maskmap[i].name); logparams_debug[i].defuintval = 0; logparams_debug[i].type = TYPE_UINT; logparams_debug[i].paramflags = PARAMFLAG_BOOL; logparams_debug[i].uptr = NULL; logparams_debug[i].chkPptr = NULL; logparams_debug[i].numelt = 0; - logparams_matlab[i].defuintval = 0; - logparams_matlab[i].type = TYPE_UINT; - logparams_matlab[i].paramflags = PARAMFLAG_BOOL; - logparams_matlab[i].uptr = NULL; - logparams_matlab[i].chkPptr = NULL; - logparams_matlab[i].numelt = 0; + logparams_dump[i].defuintval = 0; + logparams_dump[i].type = TYPE_UINT; + logparams_dump[i].paramflags = PARAMFLAG_BOOL; + logparams_dump[i].uptr = NULL; + logparams_dump[i].chkPptr = NULL; + logparams_dump[i].numelt = 0; } config_get( logparams_debug,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX); - config_get( logparams_matlab,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX); + config_get( logparams_dump,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX); /* set the debug mask according to the debug parameters values */ for (int i=0; log_maskmap[i].name != NULL ; i++) { if (*(logparams_debug[i].uptr) ) g_log->debug_mask = g_log->debug_mask | log_maskmap[i].value; - if (*(logparams_matlab[i].uptr) ) - g_log->matlab_mask = g_log->matlab_mask | log_maskmap[i].value; + if (*(logparams_dump[i].uptr) ) + g_log->dump_mask = g_log->dump_mask | log_maskmap[i].value; } +/* log globally enabled/disabled */ + set_glog_onlinelog(consolelog); } int register_log_component(char *name, char *fext, int compidx) @@ -354,11 +348,9 @@ int computed_compidx=compidx; } if (computed_compidx >= 0 && computed_compidx <MAX_LOG_COMPONENTS) { g_log->log_component[computed_compidx].name = strdup(name); - g_log->log_component[computed_compidx].level = LOG_ERR; - g_log->log_component[computed_compidx].interval = 1; - g_log->log_component[computed_compidx].stream = NULL; + g_log->log_component[computed_compidx].stream = stdout; g_log->log_component[computed_compidx].filelog = 0; - g_log->log_component[computed_compidx].filelog_name = malloc(strlen(name)+16);/* /tmp/<name>.%s rounded to ^2 */ + g_log->log_component[computed_compidx].filelog_name = malloc(strlen(name)+16);/* /tmp/<name>.%s */ sprintf(g_log->log_component[computed_compidx].filelog_name,"/tmp/%s.%s",name,fext); } else { fprintf(stderr,"{LOG} %s %d Couldn't register componemt %s\n",__FILE__,__LINE__,name); @@ -421,23 +413,16 @@ int logInit (void) register_log_component("SCTP","",SCTP); - register_log_component("RRH","",RRH); - - + register_log_component("X2AP","",X2AP); + register_log_component("LOADER","log",LOADER); + register_log_component("ASN","log",ASN); + for (int i=0 ; log_level_names[i].name != NULL ; i++) + g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name - g_log->level2string[OAILOG_ERR] = "E"; // ERROR - g_log->level2string[OAILOG_WARNING] = "W"; // WARNING - g_log->level2string[OAILOG_INFO] = "I"; //INFO - g_log->level2string[OAILOG_DEBUG] = "D"; // DEBUG - g_log->level2string[OAILOG_FILE] = "F"; // file - g_log->level2string[OAILOG_TRACE] = "T"; // TRACE - - g_log->onlinelog = 1; //online log file - g_log->filelog = 0; @@ -446,19 +431,6 @@ int logInit (void) log_getconfig(g_log); - // could put a loop here to check for all comps - for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) { - if (g_log->log_component[i].filelog == 1 ) { - g_log->log_component[i].stream = fopen(g_log->log_component[i].filelog_name,"w"); - g_log->log_component[i].fwrite = vfprintf; - } else if (g_log->log_component[i].filelog == 1 ) { - g_log->log_component[i].stream = fopen(g_log->filelog_name,"w"); - g_log->log_component[i].fwrite = vfprintf; - } else if (g_log->onlinelog == 1 ) { - g_log->log_component[i].stream = stdout; - g_log->log_component[i].fwrite = vfprintf; - } - } // set all unused component items to 0, they are for non predefined components for (i=MAX_LOG_PREDEF_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) { @@ -470,8 +442,6 @@ int logInit (void) } - - char *log_getthreadname(char *threadname, int bufsize) { int rt = pthread_getname_np(pthread_self(), threadname,bufsize) ; @@ -483,11 +453,20 @@ int rt = pthread_getname_np(pthread_self(), threadname,bufsize) ; } } +int inline log_header(char *log_buffer, int buffsize, int comp, int level,const char *format) { + char threadname[PR_SET_NAME]; +return snprintf(log_buffer, buffsize , "%s%s[%s]%c %s %s%s", + log_level_highlight_end[level], + ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]), + g_log->log_component[comp].name, + ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:' '), + ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""), + format, + log_level_highlight_end[level]); +} void logRecord_mt(const char *file, const char *func, int line, int comp, int level, const char* format, ... ) { - - char threadname[PR_SET_NAME]; char log_buffer[MAX_LOG_TOTAL]; va_list args; @@ -496,38 +475,63 @@ void logRecord_mt(const char *file, const char *func, int line, int comp, int le - - - snprintf(log_buffer, MAX_LOG_TOTAL , "%s%s[%s]%s %s %s", - log_level_highlight_end[level], - ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]), - g_log->log_component[comp].name, - ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:""), - ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""), - format); - - g_log->log_component[comp].fwrite(g_log->log_component[comp].stream,log_buffer, args); + log_header(log_buffer,MAX_LOG_TOTAL ,comp, level,format); + g_log->log_component[comp].vprint(g_log->log_component[comp].stream,log_buffer, args); va_end(args); } +void log_dump(int component, void *buffer, int buffsize,int datatype, const char* format, ... ) { +va_list args; +char *wbuf; + + switch(datatype) { + case LOG_DUMP_DOUBLE: + wbuf=malloc((buffsize * 10) + 64 + MAX_LOG_TOTAL); + break; + case LOG_DUMP_CHAR: + default: + wbuf=malloc((buffsize * 3 ) + 64 + MAX_LOG_TOTAL); + break; + } + if (wbuf != NULL) { + va_start(args, format); + int pos=log_header(wbuf,MAX_LOG_TOTAL ,component, OAILOG_INFO,""); + int pos2=vsprintf(wbuf+pos,format, args); + pos=pos+pos2; + va_end(args); + + for (int i=0; i<buffsize; i++) { + switch(datatype) { + case LOG_DUMP_DOUBLE: + pos = pos + sprintf(wbuf+pos,"%04.4lf ", (double)((double *)buffer)[i]); + break; + case LOG_DUMP_CHAR: + default: + pos = pos + sprintf(wbuf+pos,"%02x ", (unsigned char)((unsigned char *)buffer)[i]); + break; + } + } + sprintf(wbuf+pos,"\n"); + g_log->log_component[component].print(g_log->log_component[component].stream,wbuf); + free(wbuf); + } +} -int set_log(int component, int level, int interval) +int set_log(int component, int level) { /* Checking parameters */ DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS), component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS); - DevCheck((level < NUM_LOG_LEVEL) && (level >= OAILOG_ERR), level, NUM_LOG_LEVEL, + DevCheck((level < NUM_LOG_LEVEL) && (level >= OAILOG_DISABLE), level, NUM_LOG_LEVEL, OAILOG_ERR); - DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF); + if ( g_log->log_component[component].level != OAILOG_DISABLE ) + g_log->log_component[component].savedlevel = g_log->log_component[component].level; g_log->log_component[component].level = level; - - g_log->log_component[component].interval = interval; - return 0; } @@ -536,32 +540,67 @@ int set_log(int component, int level, int interval) void set_glog(int level) { for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) { - g_log->log_component[c].level = level; + set_log(c, level); } } void set_glog_onlinelog(int enable) { - g_log->onlinelog = enable; + for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) { + if ( enable ) { + g_log->log_component[c].level = g_log->log_component[c].savedlevel; + g_log->log_component[c].vprint = vfprintf; + g_log->log_component[c].print = fprintf; + g_log->log_component[c].stream = stdout; + } else { + g_log->log_component[c].level = OAILOG_DISABLE; + } + } } void set_glog_filelog(int enable) { - g_log->filelog = enable; +static FILE *fptr; + + if ( enable ) { + fptr = fopen(g_log->filelog_name,"w"); + + for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) { + close_component_filelog(c); + g_log->log_component[c].stream = fptr; + g_log->log_component[c].filelog = 1; + } + } else { + for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) { + g_log->log_component[c].filelog = 0; + if (fptr != NULL) { + fclose(fptr); + } + g_log->log_component[c].stream = stdout; + } + } } void set_component_filelog(int comp) { - if (g_log->log_component[comp].filelog == 0) { - g_log->log_component[comp].filelog = 1; - - if (g_log->log_component[comp].stream == NULL) { + if (g_log->log_component[comp].stream == NULL || g_log->log_component[comp].stream == stdout) { g_log->log_component[comp].stream = fopen(g_log->log_component[comp].filelog_name,"w"); } - } + g_log->log_component[comp].vprint = vfprintf; + g_log->log_component[comp].print = fprintf; + g_log->log_component[comp].filelog = 1; +} +void close_component_filelog(int comp) +{ + g_log->log_component[comp].filelog = 0; + if (g_log->log_component[comp].stream != NULL && g_log->log_component[comp].stream != stdout ) { + fclose(g_log->log_component[comp].stream); + g_log->log_component[comp].stream = stdout; + } + g_log->log_component[comp].vprint = vfprintf; + g_log->log_component[comp].print = fprintf; + } - - /* * for the two functions below, the passed array must have a final entry @@ -616,15 +655,13 @@ int is_newline( char *str, int size) void logClean (void) { int i; - LOG_I(PHY,"\n"); + LOG_UI(PHY,"\n"); for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) { - if (g_log->log_component[i].stream != NULL) { - fclose(g_log->log_component[i].stream); - } + close_component_filelog(i); } } @@ -650,8 +687,8 @@ int test_log(void) LOG_D(MAC, "1 debug MAC \n"); LOG_W(MAC, "1 warning MAC \n"); - set_log(EMU, OAILOG_INFO, FLAG_ONLINE); - set_log(MAC, OAILOG_WARNING, 0); + set_log(EMU, OAILOG_INFO); + set_log(MAC, OAILOG_WARNING); LOG_I(EMU, "2 Starting OAI logs version %s Build date: %s on %s\n", BUILD_VERSION, BUILD_DATE, BUILD_HOST); @@ -661,7 +698,7 @@ int test_log(void) LOG_I(MAC, "2 info MAC \n"); - set_log(MAC, OAILOG_NOTICE, 1); + set_log(MAC, OAILOG_NOTICE); LOG_ENTER(MAC); LOG_I(EMU, "3 Starting OAI logs version %s Build date: %s on %s\n", @@ -670,8 +707,8 @@ int test_log(void) LOG_W(MAC, "3 warning MAC \n"); LOG_I(MAC, "3 info MAC \n"); - set_log(MAC, LOG_DEBUG,1); - set_log(EMU, LOG_DEBUG,1); + set_log(MAC, LOG_DEBUG); + set_log(EMU, LOG_DEBUG); LOG_ENTER(MAC); LOG_I(EMU, "4 Starting OAI logs version %s Build date: %s on %s\n", @@ -681,8 +718,8 @@ int test_log(void) LOG_I(MAC, "4 info MAC \n"); - set_log(MAC, LOG_DEBUG,0); - set_log(EMU, LOG_DEBUG,0); + set_log(MAC, LOG_DEBUG); + set_log(EMU, LOG_DEBUG); LOG_I(LOG, "5 Starting OAI logs version %s Build date: %s on %s\n", BUILD_VERSION, BUILD_DATE, BUILD_HOST); @@ -691,8 +728,8 @@ int test_log(void) LOG_I(MAC, "5 info MAC \n"); - set_log(MAC, LOG_TRACE,0X07F); - set_log(EMU, LOG_TRACE,0X07F); + set_log(MAC, LOG_TRACE); + set_log(EMU, LOG_TRACE); LOG_ENTER(MAC); LOG_I(LOG, "6 Starting OAI logs version %s Build date: %s on %s\n", diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index 4a0552d4942843e5a453b6e2e0223ad0c5adf80e..767c1dbb356046a1eec1558fac95f44442d3019f 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -81,15 +81,14 @@ extern "C" { * @ingroup _macro * @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8 * @{*/ - -# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */ -# define OAILOG_FILE 1 /*!< \brief important informational messages, but everything OK */ -# define OAILOG_WARNING 2 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */ -# define OAILOG_INFO 3 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */ -# define OAILOG_DEBUG 4 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */ -# define OAILOG_TRACE 5 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/ - -#define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG */ +# define OAILOG_DISABLE -1 /*!< \brief disable all LOG messages, cannot be used in LOG macros, use only in LOG module */ +# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */ +# define OAILOG_WARNING 1 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */ +# define OAILOG_INFO 2 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */ +# define OAILOG_DEBUG 3 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */ +# define OAILOG_TRACE 4 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/ + +#define NUM_LOG_LEVEL 5 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/ /* @}*/ @@ -128,21 +127,53 @@ extern "C" { /** @defgroup macros to identify a debug entity * @ingroup each macro is a bit mask where the unique bit set identifies an entity to be debugged - * it allows to dynamically activate or not blocks of code + * it allows to dynamically activate or not blocks of code. The LOG_MASKMAP_INIT macro + * is used to map a character string name to each debug bit, it allows to set or clear + * the corresponding bit via the defined name, from the configuration or from the telnet + * server. * @brief * @{*/ #define DEBUG_PRACH (1<<0) #define DEBUG_RU (1<<1) #define DEBUG_UE_PHYPROC (1<<2) #define DEBUG_LTEESTIM (1<<3) +#define DEBUG_DLCELLSPEC (1<<4) +#define DEBUG_ULSCH (1<<5) +#define DEBUG_RRC (1<<6) +#define DEBUG_PDCP (1<<7) +#define DEBUG_DFT (1<<8) +#define DEBUG_ASN1 (1<<9) #define DEBUG_CTRLSOCKET (1<<10) +#define DEBUG_SECURITY (1<<11) +#define DEBUG_NAS (1<<12) #define UE_TIMING (1<<20) -#define SET_LOG_DEBUG(O) g_log->debug_mask = (g_log->debug_mask | O) -#define CLEAR_LOG_DEBUG(O) g_log->debug_mask = (g_log->debug_mask & (~O)) -#define SET_LOG_MATLAB(O) g_log->matlab_mask = (g_log->matlab_mask | O) -#define CLEAR_LOG_MATLAB(O) g_log->matlab_mask = (g_log->matlab_mask & (~O)) +#define LOG_MASKMAP_INIT {\ + {"PRACH", DEBUG_PRACH},\ + {"RU", DEBUG_RU},\ + {"UE_PHYPROC", DEBUG_UE_PHYPROC},\ + {"LTEESTIM", DEBUG_LTEESTIM},\ + {"DLCELLSPEC", DEBUG_DLCELLSPEC},\ + {"ULSCH", DEBUG_ULSCH},\ + {"RRC", DEBUG_RRC},\ + {"PDCP", DEBUG_PDCP},\ + {"DFT", DEBUG_DFT},\ + {"ASN1", DEBUG_ASN1},\ + {"CTRLSOCKET", DEBUG_CTRLSOCKET},\ + {"SECURITY", DEBUG_SECURITY},\ + {"NAS", DEBUG_NAS},\ + {"UE_TIMING", UE_TIMING},\ + {NULL,-1}\ +} + + + +#define SET_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask | B) +#define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B)) + +#define SET_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask | B) +#define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B)) @@ -183,9 +214,9 @@ typedef enum { TMR, USIM, LOCALIZE, - RRH, X2AP, LOADER, + ASN, MAX_LOG_PREDEF_COMPONENTS, } comp_name_t; @@ -199,17 +230,18 @@ typedef struct { int value; /*!< \brief integer value of mapping */ } mapping; -typedef int(*log_write_func_t)(FILE *stream, const char *format, va_list ap ); - +typedef int(*log_vprint_func_t)(FILE *stream, const char *format, va_list ap ); +typedef int(*log_print_func_t)(FILE *stream, const char *format, ... ); typedef struct { - const char *name; - int level; - int flag; - int interval; - int filelog; - char *filelog_name; - FILE *stream; - log_write_func_t fwrite; + const char *name; + int level; + int savedlevel; + int flag; + int filelog; + char *filelog_name; + FILE *stream; + log_vprint_func_t vprint; + log_print_func_t print; /* SR: make the log buffer component relative */ char log_buffer[MAX_LOG_TOTAL]; } log_component_t; @@ -217,13 +249,11 @@ typedef struct { typedef struct { log_component_t log_component[MAX_LOG_COMPONENTS]; - char* level2string[NUM_LOG_LEVEL]; - int onlinelog; + char level2string[NUM_LOG_LEVEL]; int flag; - int filelog; char* filelog_name; uint64_t debug_mask; - uint64_t matlab_mask; + uint64_t dump_mask; } log_t; @@ -254,14 +284,15 @@ extern log_t *g_log; /*----------------------------------------------------------------------------*/ int logInit (void); void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7))); - -int set_log(int component, int level, int interval); +void log_dump(int component, void *buffer, int buffsize,int datatype, const char* format, ... ); +int set_log(int component, int level); void set_glog(int level); void set_glog_onlinelog(int enable); void set_glog_filelog(int enable); void set_component_filelog(int comp); - +void close_component_filelog(int comp); +void set_component_consolelog(int comp); int map_str_to_int(mapping *map, const char *str); char *map_int_to_str(mapping *map, int val); void logClean (void); @@ -293,7 +324,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int #define LOG_CONFIG_LEVEL_FORMAT "%s_log_level" #define LOG_CONFIG_LOGFILE_FORMAT "%s_log_infile" #define LOG_CONFIG_DEBUG_FORMAT "%s_debug" -#define LOG_CONFIG_MATLAB_FORMAT "%s_matlab" +#define LOG_CONFIG_DUMP_FORMAT "%s_dump" #define LOG_CONFIG_HELP_OPTIONS " list of comma separated options to enable log module behavior. Available options: \n"\ " nocolor: disable color usage in log messages\n"\ @@ -309,7 +340,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int /*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define LOG_GLOBALPARAMS_DESC { \ {LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL, "Default log level for all componemts\n", 0, strptr:(char **)&gloglevel, defstrval:log_level_names[2].name, TYPE_STRING, 0}, \ -{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0, iptr:&(g_log->onlinelog), defintval:1, TYPE_INT, 0}, \ +{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0, iptr:&(consolelog), defintval:1, TYPE_INT, 0}, \ {LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS, LOG_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0} \ } @@ -319,23 +350,25 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int * @ingroup _macro * @brief Macro used to call logIt function with different message levels * @{*/ - -// debugging macros(g_log->log_component[component].interval?logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0) +#define LOG_DUMP_CHAR 0 +#define LOG_DUMP_DOUBLE 1 +// debugging macros +#define LOG_F LOG_I /* because LOG_F was originaly to dump a message or buffer but is also used as a regular level...., to dump use LOG_DUMPMSG */ # if T_TRACER /* per component, level dependant macros */ -# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0) -# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0) # define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0) +# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0) +# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0) # define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0) # define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0) -# define LOG_F(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_FILE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_FILE, x) ;}} while (0) /* */ + /* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */ +# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */ # define nfapi_log(FILE, FNC, LN, COMP, LVL, F...) do { if (T_stdout) { logRecord_mt(__FILE__, __FUNCTION__, __LINE__,COMP, LVL, F) ;}} while (0) /* */ /* bitmask dependant macros, to isolate debugging code */ -# define LOG_DEBUG_BEGIN(D) if (g_log->debug_mask & D) { -# define LOG_DEBUG_END } - /* bitmask dependant macros, to generate matlab files */ -# define LOG_M_BEGIN(D) if (g_log->matlab_mask & D) { -# define LOG_M_END } +# define LOG_DEBUGFLAG(D) (g_log->debug_mask & D) + + /* bitmask dependant macros, to generate debug file such as matlab file or message dump */ +# define LOG_DUMPFLAG(D) (g_log->dump_mask & D) # define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)/* */ /* define variable only used in LOG macro's */ # define LOG_VAR(A,B) A B @@ -345,22 +378,22 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int # define LOG_E(c, x...) /* */ # define LOG_D(c, x...) /* */ # define LOG_T(c, x...) /* */ -# define LOG_F(c, x...) /* */ + +# define LOG_DUMPMSG(c, b, s, x...) /* */ # define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...) -# define LOG_DEBUG_BEGIN(D) if (0) { -# define LOG_DEBUG_END } -# define LOG_M_BEGIN(D) if (0) { -# define LOG_M_END } +# define LOG_DEBUGFLAG(D) ( 0 ) +# define LOG_DUMPFLAG(D) ( 0 ) # define LOG_M(file, vector, data, len, dec, format) # define LOG_VAR(A,B) # endif /* T_TRACER */ /* avoid warnings for variables only used in LOG macro's but set outside debug section */ -#define LOG_USEDINLOG_VAR(A,B) __attribute__((unused)) A B +#define GCC_NOTUSED __attribute__((unused)) +#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B /* unfiltered macros, usefull for simulators or messages at init time, before log is configured */ #define LOG_UM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0) - #define LOG_UI(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ; } while(0) +#define LOG_UDUMPMSG(c, b, s, f, x...) do { log_dump(c, b, s, f, x) ;} while (0) /* */ /* @}*/ @@ -368,9 +401,12 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int * @ingroup _macro * @brief Macro of some useful functions defined by LOG * @{*/ -#define LOG_ENTER(c) do {LOG_T(c, "Entering\n");}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */ -#define LOG_EXIT(c) do {LOG_T(c,"Exiting\n"); return;}while(0) /*!< \brief Macro to log a message with severity TRACE when exiting a function */ -#define LOG_RETURN(c,x) do {uint32_t __rv;__rv=(unsigned int)(x);LOG_T(c,"Returning %08x\n", __rv);return((typeof(x))__rv);}while(0) /*!< \brief Macro to log a function exit, including integer value, then to return a value to the calling function */ +#define LOG_ENTER(c) do {LOG_T(c, "Entering %s\n",__FUNCTION__);}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */ +#define LOG_END(c) do {LOG_T(c, "End of %s\n",__FUNCTION__);}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */ +#define LOG_EXIT(c) do { LOG_END(c); return;}while(0) /*!< \brief Macro to log a message with severity TRACE when exiting a function */ +#define LOG_RETURN(c,r) do {LOG_T(c,"Leaving %s (rc = %08lx)\n", __FUNCTION__ , (unsigned long)(r) );return(r);}while(0) /*!< \brief Macro to log a function exit, including integer value, then to return a value to the calling function */ + + /* @}*/ static __inline__ uint64_t rdtsc(void) { diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h index 3c722ac49aa1335b18497e360e142b46040f4f9c..749978bb48da6a0cae665968d04db65b97800925 100644 --- a/common/utils/LOG/vcd_signal_dumper.h +++ b/common/utils/LOG/vcd_signal_dumper.h @@ -39,7 +39,7 @@ /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */ typedef enum { - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB=0, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB, @@ -91,12 +91,12 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, VCD_SIGNAL_DUMPER_VARIABLES_CNT, VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC, - VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_SEND_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_POLL_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_ALLOC_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_MP_ALLOC, + VCD_SIGNAL_DUMPER_VARIABLES_MP_FREE, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO, diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore index 817780592428b38fd48b57f26be6b3a73868ae63..d754ff7c38730801afa6f6629ef45b9c9d4dcc03 100644 --- a/common/utils/T/.gitignore +++ b/common/utils/T/.gitignore @@ -15,4 +15,5 @@ tracer/to_vcd tracer/extract_input_subframe tracer/extract_output_subframe tracer/extract +tracer/multi tracee/tracee diff --git a/common/utils/T/Makefile b/common/utils/T/Makefile index dcb0d12fab9e638f49e812255e29cf61c058b755..87a6e34c5d1e0ecd4636439d9eccf8aeacd26d38 100644 --- a/common/utils/T/Makefile +++ b/common/utils/T/Makefile @@ -13,11 +13,20 @@ $(GENIDS): $(GENIDS_OBJS) $(CC) $(CFLAGS) -c -o $@ $< T_messages.txt.h: T_messages.txt - xxd -i T_messages.txt > T_messages.txt.h + xxd -i T_messages.txt T_messages.txt.h T_IDs.h: $(GENIDS) T_messages.txt ./$(GENIDS) T_messages.txt T_IDs.h +check_vcd: + gcc -Wall -I. -I.. -I../itti -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread + ./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false) + rm -f ./_check_vcd + +.PHONY: check_vcd + clean: - rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h - cd tracer && make clean + rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h _check_vcd + +cleanall: clean + cd tracer && $(MAKE) clean diff --git a/common/utils/T/T.c b/common/utils/T/T.c index 8679a4185fdf2905b2850ce7115641827aef05a9..fbd3f75a0c195fbb9d41e927fe6b3bf13150ee41 100644 --- a/common/utils/T/T.c +++ b/common/utils/T/T.c @@ -31,6 +31,12 @@ volatile int _T_freelist_head; volatile int *T_freelist_head = &_T_freelist_head; T_cache_t *T_cache; +#if BASIC_SIMULATOR +/* global variables used by T_GET_SLOT, see in T.h */ +volatile uint64_t T_next_id; +volatile uint64_t T_active_id; +#endif + static void get_message(int s) { char t; @@ -91,7 +97,7 @@ static void new_thread(void *(*f)(void *), void *data) /* defined in local_tracer.c */ void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file); + int local_socket, void *shm_array); /* We monitor the tracee and the local tracer processes. * When one dies we forcefully kill the other. @@ -114,22 +120,31 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) { int socket_pair[2]; int s; - int T_shm_fd; int child1, child2; - char shm_file[128]; - - sprintf(shm_file, "/%s%d", T_SHM_FILENAME, getpid()); + int i; if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair)) { perror("socketpair"); abort(); } + /* setup shared memory */ + T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (T_cache == MAP_FAILED) + { perror("mmap"); abort(); } + + /* let's garbage the memory to catch some potential problems + * (think multiprocessor sync issues, barriers, etc.) + */ + memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); + for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0; + /* child1 runs the local tracer and child2 (or main) runs the tracee */ child1 = fork(); if (child1 == -1) abort(); if (child1 == 0) { close(socket_pair[1]); T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0], - shm_file); + T_cache); exit(0); } close(socket_pair[0]); @@ -138,6 +153,7 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) child2 = fork(); if (child2 == -1) abort(); if (child2 != 0) { close(socket_pair[1]); + munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t)); monitor_and_kill(child1, child2); } } @@ -148,34 +164,29 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) T_socket = s; - /* setup shared memory */ - T_shm_fd = shm_open(shm_file, O_RDWR /*| O_SYNC*/, 0666); - shm_unlink(shm_file); - if (T_shm_fd == -1) { perror(shm_file); abort(); } - T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, T_shm_fd, 0); - if (T_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(T_shm_fd); - new_thread(T_receive_thread, NULL); } void T_Config_Init(void) { -int T_port; /* by default we wait for the tracer */ -int T_nowait; /* default port to listen to to wait for the tracer */ -int T_dont_fork; /* default is to fork, see 'T_init' to understand */ + int T_port; /* by default we wait for the tracer */ + int T_nowait; /* default port to listen to to wait for the tracer */ + int T_dont_fork; /* default is to fork, see 'T_init' to understand */ -paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ; + paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC; -/* for a cleaner config file, TTracer params should be defined in a specific section... */ - config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX); + /* for a cleaner config file, TTracer params should be defined in a + * specific section... + */ + config_get(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + TTRACER_CONFIG_PREFIX); -/* compatibility: look for TTracer command line options in root section */ - config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL); + /* compatibility: look for TTracer command line options in root section */ + config_process_cmdline(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + NULL); - if (T_stdout == 0) { + if (T_stdout == 0) T_init(T_port, 1-T_nowait, T_dont_fork); - } } diff --git a/common/utils/T/T.h b/common/utils/T/T.h index 755f5d4e3981fa0424a3a89436e343c6b7c83adc..18e4a590d9444d12257d5207b4e00446d2811f6b 100644 --- a/common/utils/T/T.h +++ b/common/utils/T/T.h @@ -112,13 +112,37 @@ extern volatile int *T_freelist_head; extern T_cache_t *T_cache; extern int *T_active; /* When running the basic simulator, we may fill the T cache too fast. - * Let's not crash if it's full, just wait. + * Let's serialize write accesses to the T cache. For that, we use a + * 'ticket' mechanism. To acquire a T slot the caller needs to own the + * current active ticket. We also wait for the slot to be free if + * it is already in use. */ #if BASIC_SIMULATOR -# define T_BASIC_SIMULATOR_WAIT \ - while (T_cache[T_LOCAL_slot].busy) usleep(100) +# define T_GET_SLOT \ + do { \ + extern volatile uint64_t T_next_id; \ + extern volatile uint64_t T_active_id; \ + uint64_t id; \ + /* get a ticket */ \ + id = __sync_fetch_and_add(&T_next_id, 1); \ + /* wait for our turn */ \ + while (id != __sync_fetch_and_add(&T_active_id, 0)) /* busy wait */; \ + /* this is our turn, try to acquire the slot until it's free */ \ + do { \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); \ + if (T_LOCAL_busy & 0x01) usleep(100); \ + } while (T_LOCAL_busy & 0x01); \ + /* check that there are still some tickets */ \ + if (__sync_fetch_and_add(&T_active_id, 0) == 0xffffffffffffffff) { \ + printf("T: reached the end of times, bye...\n"); \ + abort(); \ + } \ + /* free our ticket, which signals the next waiter that it's its turn */ \ + (void)__sync_fetch_and_add(&T_active_id, 1); \ + } while (0) #else -# define T_BASIC_SIMULATOR_WAIT /* */ +# define T_GET_SLOT \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); #endif /* used at header of Tn, allocates buffer */ @@ -126,11 +150,12 @@ extern int *T_active; char *T_LOCAL_buf; \ int T_LOCAL_size = 0; \ int T_LOCAL_slot; \ + int T_LOCAL_busy; \ T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \ & (T_CACHE_SIZE - 1); \ (void)__sync_fetch_and_and(T_freelist_head, T_CACHE_SIZE - 1); \ - T_BASIC_SIMULATOR_WAIT; \ - if (T_cache[T_LOCAL_slot].busy) { \ + T_GET_SLOT; \ + if (T_LOCAL_busy & 0x01) { \ printf("%s:%d:%s: T cache is full - consider increasing its size\n", \ __FILE__, __LINE__, __FUNCTION__); \ abort(); \ @@ -142,7 +167,7 @@ extern int *T_active; #define T_COMMIT() \ T_cache[T_LOCAL_slot].length = T_LOCAL_size; \ __sync_synchronize(); \ - T_cache[T_LOCAL_slot].busy = 1; \ + (void)__sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x02); #define T_CHECK_SIZE(len, argnum) \ if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \ @@ -578,10 +603,10 @@ extern int *T_active; /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_TTRACEPARAMS_DESC { \ -{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ -{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ -{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ -{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ +{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ +{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ +{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ +{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ } diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index b0b9940c30b669832edfe1a817d1f56ebec3a096..83a380662d025fcc8056375667d0d1f0f752998d 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -31,13 +31,15 @@ #endif typedef struct { + /* 'busy' is a bit field + * bit 0: 1 means that slot is acquired by writer + * bit 1: 1 means that slot is ready for consumption + */ volatile int busy; char buffer[T_BUFFER_MAX]; int length; } T_cache_t; -#define T_SHM_FILENAME "/T_shm_segment" - /* number of VCD functions (to be kept up to date! see in T_messages.txt) */ #define VCD_NUM_FUNCTIONS 190 diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index fd4425063b66a9d60f411e4a10560b5825caedce..2bce891ac93c425321f5aa05580498c7e1b9b4b3 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -749,6 +749,28 @@ ID = LEGACY_OSA_TRACE DESC = OSA legacy logs - trace level GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + +ID = LEGACY_ASN_INFO + DESC = ASN legacy logs - info level + GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_INFO:LEGACY + FORMAT = string,log +ID = LEGACY_ASN_ERROR + DESC = ASN legacy logs - error level + GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_ERROR:LEGACY + FORMAT = string,log +ID = LEGACY_ASN_WARNING + DESC = ASN legacy logs - warning level + GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_WARNING:LEGACY + FORMAT = string,log +ID = LEGACY_ASN_DEBUG + DESC = ASN legacy logs - debug level + GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_DEBUG:LEGACY + FORMAT = string,log +ID = LEGACY_ASN_TRACE + DESC = ASN legacy logs - trace level + GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_TRACE:LEGACY + FORMAT = string,log + ID = LEGACY_SIM_INFO DESC = SIM legacy logs - info level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY @@ -769,6 +791,7 @@ ID = LEGACY_SIM_TRACE DESC = SIM legacy logs - trace level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + # this is a bad hack but I won't fix (function util_print_hex_octets # in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c # does funky things with the LOG_x macros but we work on the C pre-processor @@ -922,30 +945,9 @@ ID = buf_test #VCD variables and functions #be careful! this must be synchronized with the code! -#also keep up to date VCD_NUM_VARIABLES and VCD_NUM_FUNCTIONS in T_defs.h - -#to synchronize: copy/paste from openair2/UTIL/LOG/vcd_signal_dumper.h -#the variables and functions name, replace "SIGNAL_DUMPER_VARIABLES" by -#"VARIABLE" and "SIGNAL_DUMPER_FUNCTIONS" by "FUNCTION" (check that -#everything is fine! for example we have -#VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG that has VARIABLE without S) -#and then process with sed - -#to generate variables: -#sed -e "s/ VCD_VARIABLE_\(.*\)/ID = VCD_VARIABLE_\1\n DESC = VCD variable \1\n GROUP = ALL:VCD:ENB\n FORMAT = ulong,value/" < VCD >> T_messages.txt - -#to generate functions: -#sed -e "s/ VCD_FUNCTION_\(.*\)/ID = VCD_FUNCTION_\1\n DESC = VCD function \1\n GROUP = ALL:VCD:ENB\n FORMAT = int,value/" < VCD.functions >> T_messages.txt - -#you may want to manually edit groups for UE instead of eNB - -#then count functions and variables and update VCD_NUM_FUNCTIONS and -#VCD_NUM_VARIABLES in T_defs.h - -#also verify that VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE are correct -#in T_defs.h. They have to point to the first function and variable -#as defined below. Note also that the order of the VCD functions -#and variables must be the same as in the code. +#also keep up to date VCD_NUM_VARIABLES, VCD_NUM_FUNCTIONS, +#VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE in T_defs.h +#to check that everything is correct you can run: make _check_vcd #variables @@ -953,514 +955,642 @@ ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB DESC = VCD variable FRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB DESC = VCD variable FRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB DESC = VCD variable FRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB DESC = VCD variable FRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU DESC = VCD variable FRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU DESC = VCD variable FRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU DESC = VCD variable FRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU DESC = VCD variable FRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU DESC = VCD variable SUBFRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU DESC = VCD variable SUBFRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU DESC = VCD variable SUBFRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU DESC = VCD variable SUBFRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_RU ID = VCD_VARIABLE_RUNTIME_TX_ENB DESC = VCD variable RUNTIME_TX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_TX_eNB ID = VCD_VARIABLE_RUNTIME_RX_ENB DESC = VCD variable RUNTIME_RX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_RX_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE DESC = VCD variable FRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE DESC = VCD variable FRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE DESC = VCD variable FRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE DESC = VCD variable FRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE DESC = VCD variable SUBFRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE DESC = VCD variable SUBFRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE DESC = VCD variable SUBFRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE DESC = VCD variable SUBFRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX1_UE ID = VCD_VARIABLE_UE_RX_OFFSET DESC = VCD variable UE_RX_OFFSET GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_rx_offset ID = VCD_VARIABLE_DIFF DESC = VCD variable DIFF GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = diff2 ID = VCD_VARIABLE_HW_SUBFRAME DESC = VCD variable HW_SUBFRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe ID = VCD_VARIABLE_HW_FRAME DESC = VCD variable HW_FRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame ID = VCD_VARIABLE_HW_SUBFRAME_RX DESC = VCD variable HW_SUBFRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe_rx ID = VCD_VARIABLE_HW_FRAME_RX DESC = VCD variable HW_FRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame_rx ID = VCD_VARIABLE_TXCNT DESC = VCD variable TXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = txcnt ID = VCD_VARIABLE_RXCNT DESC = VCD variable RXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rxcnt ID = VCD_VARIABLE_TRX_TS DESC = VCD variable TRX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts ID = VCD_VARIABLE_TRX_TST DESC = VCD variable TRX_TST GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst ID = VCD_VARIABLE_TRX_TS_UE DESC = VCD variable TRX_TS_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts_ue ID = VCD_VARIABLE_TRX_TST_UE DESC = VCD variable TRX_TST_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst_ue ID = VCD_VARIABLE_TRX_WRITE_FLAGS DESC = VCD variable TRX_WRITE_FLAGS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_write_flags ID = VCD_VARIABLE_TX_TS DESC = VCD variable TX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_ts ID = VCD_VARIABLE_RX_TS DESC = VCD variable RX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_ts ID = VCD_VARIABLE_RX_HWCNT DESC = VCD variable RX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_rx ID = VCD_VARIABLE_RX_LHWCNT DESC = VCD variable RX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_rx ID = VCD_VARIABLE_TX_HWCNT DESC = VCD variable TX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_tx ID = VCD_VARIABLE_TX_LHWCNT DESC = VCD variable TX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_tx ID = VCD_VARIABLE_RX_PCK DESC = VCD variable RX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_rx ID = VCD_VARIABLE_TX_PCK DESC = VCD variable TX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_tx ID = VCD_VARIABLE_RX_SEQ_NUM DESC = VCD variable RX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num ID = VCD_VARIABLE_RX_SEQ_NUM_PRV DESC = VCD variable RX_SEQ_NUM_PRV GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num_prv ID = VCD_VARIABLE_TX_SEQ_NUM DESC = VCD variable TX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_seq_num ID = VCD_VARIABLE_CNT DESC = VCD variable CNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = cnt ID = VCD_VARIABLE_DUMMY_DUMP DESC = VCD variable DUMMY_DUMP GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dummy_dump ID = VCD_VARIABLE_ITTI_SEND_MSG DESC = VCD variable ITTI_SEND_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_send_msg ID = VCD_VARIABLE_ITTI_POLL_MSG DESC = VCD variable ITTI_POLL_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_poll_msg ID = VCD_VARIABLE_ITTI_RECV_MSG DESC = VCD variable ITTI_RECV_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_recv_msg ID = VCD_VARIABLE_ITTI_ALLOC_MSG DESC = VCD variable ITTI_ALLOC_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_alloc_msg ID = VCD_VARIABLE_MP_ALLOC DESC = VCD variable MP_ALLOC GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_alloc ID = VCD_VARIABLE_MP_FREE DESC = VCD variable MP_FREE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_free ID = VCD_VARIABLE_UE_INST_CNT_RX DESC = VCD variable UE_INST_CNT_RX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_rx ID = VCD_VARIABLE_UE_INST_CNT_TX DESC = VCD variable UE_INST_CNT_TX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_tx ID = VCD_VARIABLE_DCI_INFO DESC = VCD variable DCI_INFO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dci_info ID = VCD_VARIABLE_UE0_BSR DESC = VCD variable UE0_BSR GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BSR ID = VCD_VARIABLE_UE0_BO DESC = VCD variable UE0_BO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BO ID = VCD_VARIABLE_UE0_SCHEDULED DESC = VCD variable UE0_SCHEDULED GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_scheduled ID = VCD_VARIABLE_UE0_TIMING_ADVANCE DESC = VCD variable UE0_TIMING_ADVANCE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_timing_advance ID = VCD_VARIABLE_UE0_SR_ENERGY DESC = VCD variable UE0_SR_ENERGY GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_ENERGY ID = VCD_VARIABLE_UE0_SR_THRES DESC = VCD variable UE0_SR_THRES GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_THRES ID = VCD_VARIABLE_UE0_RSSI0 DESC = VCD variable UE0_RSSI0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi0 ID = VCD_VARIABLE_UE0_RSSI1 DESC = VCD variable UE0_RSSI1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi1 ID = VCD_VARIABLE_UE0_RSSI2 DESC = VCD variable UE0_RSSI2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi2 ID = VCD_VARIABLE_UE0_RSSI3 DESC = VCD variable UE0_RSSI3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi3 ID = VCD_VARIABLE_UE0_RSSI4 DESC = VCD variable UE0_RSSI4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi4 ID = VCD_VARIABLE_UE0_RSSI5 DESC = VCD variable UE0_RSSI5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi5 ID = VCD_VARIABLE_UE0_RSSI6 DESC = VCD variable UE0_RSSI6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi6 ID = VCD_VARIABLE_UE0_RSSI7 DESC = VCD variable UE0_RSSI7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi7 ID = VCD_VARIABLE_UE0_RES0 DESC = VCD variable UE0_RES0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res0 ID = VCD_VARIABLE_UE0_RES1 DESC = VCD variable UE0_RES1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res1 ID = VCD_VARIABLE_UE0_RES2 DESC = VCD variable UE0_RES2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res2 ID = VCD_VARIABLE_UE0_RES3 DESC = VCD variable UE0_RES3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res3 ID = VCD_VARIABLE_UE0_RES4 DESC = VCD variable UE0_RES4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res4 ID = VCD_VARIABLE_UE0_RES5 DESC = VCD variable UE0_RES5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res5 ID = VCD_VARIABLE_UE0_RES6 DESC = VCD variable UE0_RES6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res6 ID = VCD_VARIABLE_UE0_RES7 DESC = VCD variable UE0_RES7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res7 ID = VCD_VARIABLE_UE0_MCS0 DESC = VCD variable UE0_MCS0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS0 ID = VCD_VARIABLE_UE0_MCS1 DESC = VCD variable UE0_MCS1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS1 ID = VCD_VARIABLE_UE0_MCS2 DESC = VCD variable UE0_MCS2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS2 ID = VCD_VARIABLE_UE0_MCS3 DESC = VCD variable UE0_MCS3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS3 ID = VCD_VARIABLE_UE0_MCS4 DESC = VCD variable UE0_MCS4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS4 ID = VCD_VARIABLE_UE0_MCS5 DESC = VCD variable UE0_MCS5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS5 ID = VCD_VARIABLE_UE0_MCS6 DESC = VCD variable UE0_MCS6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS6 ID = VCD_VARIABLE_UE0_MCS7 DESC = VCD variable UE0_MCS7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS7 ID = VCD_VARIABLE_UE0_RB0 DESC = VCD variable UE0_RB0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB0 ID = VCD_VARIABLE_UE0_RB1 DESC = VCD variable UE0_RB1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB1 ID = VCD_VARIABLE_UE0_RB2 DESC = VCD variable UE0_RB2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB2 ID = VCD_VARIABLE_UE0_RB3 DESC = VCD variable UE0_RB3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB3 ID = VCD_VARIABLE_UE0_RB4 DESC = VCD variable UE0_RB4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB4 ID = VCD_VARIABLE_UE0_RB5 DESC = VCD variable UE0_RB5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB5 ID = VCD_VARIABLE_UE0_RB6 DESC = VCD variable UE0_RB6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB6 ID = VCD_VARIABLE_UE0_RB7 DESC = VCD variable UE0_RB7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB7 ID = VCD_VARIABLE_UE0_ROUND0 DESC = VCD variable UE0_ROUND0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND0 ID = VCD_VARIABLE_UE0_ROUND1 DESC = VCD variable UE0_ROUND1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND1 ID = VCD_VARIABLE_UE0_ROUND2 DESC = VCD variable UE0_ROUND2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND2 ID = VCD_VARIABLE_UE0_ROUND3 DESC = VCD variable UE0_ROUND3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND3 ID = VCD_VARIABLE_UE0_ROUND4 DESC = VCD variable UE0_ROUND4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND4 ID = VCD_VARIABLE_UE0_ROUND5 DESC = VCD variable UE0_ROUND5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND5 ID = VCD_VARIABLE_UE0_ROUND6 DESC = VCD variable UE0_ROUND6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND6 ID = VCD_VARIABLE_UE0_ROUND7 DESC = VCD variable UE0_ROUND7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND7 ID = VCD_VARIABLE_UE0_SFN0 DESC = VCD variable UE0_SFN0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN0 ID = VCD_VARIABLE_UE0_SFN1 DESC = VCD variable UE0_SFN1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN1 ID = VCD_VARIABLE_UE0_SFN2 DESC = VCD variable UE0_SFN2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN2 ID = VCD_VARIABLE_UE0_SFN3 DESC = VCD variable UE0_SFN3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN3 ID = VCD_VARIABLE_UE0_SFN4 DESC = VCD variable UE0_SFN4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN4 ID = VCD_VARIABLE_UE0_SFN5 DESC = VCD variable UE0_SFN5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN5 ID = VCD_VARIABLE_UE0_SFN6 DESC = VCD variable UE0_SFN6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN6 ID = VCD_VARIABLE_UE0_SFN7 DESC = VCD variable UE0_SFN7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN7 ID = VCD_VARIABLE_SEND_IF4_SYMBOL DESC = VCD variable SEND_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if4_symbol ID = VCD_VARIABLE_RECV_IF4_SYMBOL DESC = VCD variable RECV_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if4_symbol ID = VCD_VARIABLE_SEND_IF5_PKT_ID DESC = VCD variable SEND_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if5_pkt_id ID = VCD_VARIABLE_RECV_IF5_PKT_ID DESC = VCD variable RECV_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if5_pkt_id ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE DESC = VCD variable UE_PDCP_FLUSH_SIZE GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_size ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR DESC = VCD variable UE_PDCP_FLUSH_ERR GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_err ID = VCD_VARIABLE_UE0_TRX_READ_NS DESC = VCD variable UE0_TRX_READ_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns ID = VCD_VARIABLE_UE0_TRX_WRITE_NS DESC = VCD variable UE0_TRX_WRITE_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING DESC = VCD variable UE0_TRX_READ_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns_missing ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING DESC = VCD variable UE0_TRX_WRITE_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns_missing ID = VCD_VARIABLE_CPUID_ENB_THREAD_RXTX DESC = VCD variable CPUID_ENB_THREAD_RXTX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = enb_thread_rxtx_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD DESC = VCD variable CPUID_RU_THREAD GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD_TX DESC = VCD variable CPUID_RU_THREAD_TX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_tx_CPUID #functions @@ -1468,763 +1598,954 @@ ID = VCD_FUNCTION_RT_SLEEP DESC = VCD function RT_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rt_sleep ID = VCD_FUNCTION_TRX_READ DESC = VCD function TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read ID = VCD_FUNCTION_TRX_WRITE DESC = VCD function TRX_WRITE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write ID = VCD_FUNCTION_TRX_READ_UE DESC = VCD function TRX_READ_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_ue ID = VCD_FUNCTION_TRX_WRITE_UE DESC = VCD function TRX_WRITE_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_ue ID = VCD_FUNCTION_TRX_READ_IF DESC = VCD function TRX_READ_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_if ID = VCD_FUNCTION_TRX_WRITE_IF DESC = VCD function TRX_WRITE_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_if ID = VCD_FUNCTION_eNB_PROC_RXTX0 DESC = VCD function eNB_PROC_RXTX0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx0 ID = VCD_FUNCTION_eNB_PROC_RXTX1 DESC = VCD function eNB_PROC_RXTX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx1 ID = VCD_FUNCTION_UE_THREAD_SYNCH DESC = VCD function UE_THREAD_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_synch ID = VCD_FUNCTION_UE_THREAD_RXTX0 DESC = VCD function UE_THREAD_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx0 ID = VCD_FUNCTION_UE_THREAD_RXTX1 DESC = VCD function UE_THREAD_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx1 ID = VCD_FUNCTION_TRX_READ_SF9 DESC = VCD function TRX_READ_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_sf9 ID = VCD_FUNCTION_TRX_WRITE_SF9 DESC = VCD function TRX_WRITE_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_sf9 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0 DESC = VCD function UE_SIGNAL_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx0 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1 DESC = VCD function UE_SIGNAL_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx1 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0 DESC = VCD function UE_WAIT_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx0 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1 DESC = VCD function UE_WAIT_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment1 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL DESC = VCD function SIM_DO_DL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_DL_sig ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL DESC = VCD function SIM_DO_UL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_UL_sig ID = VCD_FUNCTION_SIM_UE_TRX_READ DESC = VCD function SIM_UE_TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = UE_trx_read ID = VCD_FUNCTION_eNB_TX DESC = VCD function eNB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx ID = VCD_FUNCTION_eNB_RX DESC = VCD function eNB_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx ID = VCD_FUNCTION_eNB_TRX DESC = VCD function eNB_TRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_trx ID = VCD_FUNCTION_eNB_TM DESC = VCD function eNB_TM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tm ID = VCD_FUNCTION_eNB_RX_SLEEP DESC = VCD function eNB_RX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx_sleep ID = VCD_FUNCTION_eNB_TX_SLEEP DESC = VCD function eNB_TX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx_sleep ID = VCD_FUNCTION_eNB_PROC_SLEEP DESC = VCD function eNB_PROC_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_proc_sleep ID = VCD_FUNCTION_TRX_READ_RF DESC = VCD function TRX_READ_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_rf ID = VCD_FUNCTION_TRX_WRITE_RF DESC = VCD function TRX_WRITE_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_rf ID = VCD_FUNCTION_UE_SYNCH DESC = VCD function UE_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_synch ID = VCD_FUNCTION_UE_SLOT_FEP DESC = VCD function UE_SLOT_FEP GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_slot_fep ID = VCD_FUNCTION_UE_RRC_MEASUREMENTS DESC = VCD function UE_RRC_MEASUREMENTS GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_rrc_measurements ID = VCD_FUNCTION_UE_GAIN_CONTROL DESC = VCD function UE_GAIN_CONTROL GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_gain_control ID = VCD_FUNCTION_UE_ADJUST_SYNCH DESC = VCD function UE_ADJUST_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_adjust_synch ID = VCD_FUNCTION_UE_MEASUREMENT_PROCEDURES DESC = VCD function UE_MEASUREMENT_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_measurement_procedures ID = VCD_FUNCTION_UE_PDCCH_PROCEDURES DESC = VCD function UE_PDCCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pdcch_procedures ID = VCD_FUNCTION_UE_PBCH_PROCEDURES DESC = VCD function UE_PBCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pbch_procedures ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX DESC = VCD function PHY_PROCEDURES_ENB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1 DESC = VCD function PHY_PROCEDURES_ENB_TX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX DESC = VCD function PHY_PROCEDURES_RU_FEPRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1 DESC = VCD function PHY_PROCEDURES_RU_FEPRX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec1 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1 DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec1 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX DESC = VCD function PHY_PROCEDURES_UE_TX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX DESC = VCD function PHY_PROCEDURES_UE_RX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_rx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_uespec ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_pucch ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_common ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_prach ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_rar ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE DESC = VCD function PHY_PROCEDURES_ENB_LTE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNB_lte ID = VCD_FUNCTION_PHY_PROCEDURES_UE_LTE DESC = VCD function PHY_PROCEDURES_UE_LTE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_UE_lte ID = VCD_FUNCTION_PDSCH_THREAD DESC = VCD function PDSCH_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_thread ID = VCD_FUNCTION_DLSCH_THREAD0 DESC = VCD function DLSCH_THREAD0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread0 ID = VCD_FUNCTION_DLSCH_THREAD1 DESC = VCD function DLSCH_THREAD1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread1 ID = VCD_FUNCTION_DLSCH_THREAD2 DESC = VCD function DLSCH_THREAD2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread2 ID = VCD_FUNCTION_DLSCH_THREAD3 DESC = VCD function DLSCH_THREAD3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread3 ID = VCD_FUNCTION_DLSCH_THREAD4 DESC = VCD function DLSCH_THREAD4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread4 ID = VCD_FUNCTION_DLSCH_THREAD5 DESC = VCD function DLSCH_THREAD5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread5 ID = VCD_FUNCTION_DLSCH_THREAD6 DESC = VCD function DLSCH_THREAD6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread6 ID = VCD_FUNCTION_DLSCH_THREAD7 DESC = VCD function DLSCH_THREAD7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread7 ID = VCD_FUNCTION_DLSCH_DECODING0 DESC = VCD function DLSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding0 ID = VCD_FUNCTION_DLSCH_DECODING1 DESC = VCD function DLSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding1 ID = VCD_FUNCTION_DLSCH_DECODING2 DESC = VCD function DLSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding2 ID = VCD_FUNCTION_DLSCH_DECODING3 DESC = VCD function DLSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding3 ID = VCD_FUNCTION_DLSCH_DECODING4 DESC = VCD function DLSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding4 ID = VCD_FUNCTION_DLSCH_DECODING5 DESC = VCD function DLSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding5 ID = VCD_FUNCTION_DLSCH_DECODING6 DESC = VCD function DLSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding6 ID = VCD_FUNCTION_DLSCH_DECODING7 DESC = VCD function DLSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding7 ID = VCD_FUNCTION_RX_PDCCH DESC = VCD function RX_PDCCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_pdcch ID = VCD_FUNCTION_DCI_DECODING DESC = VCD function DCI_DECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dci_decoding ID = VCD_FUNCTION_RX_PHICH DESC = VCD function RX_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_phich ID = VCD_FUNCTION_PDSCH_PROC DESC = VCD function PDSCH_PROC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures ID = VCD_FUNCTION_PDSCH_PROC_SI DESC = VCD function PDSCH_PROC_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_si ID = VCD_FUNCTION_PDSCH_PROC_P DESC = VCD function PDSCH_PROC_P GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_p ID = VCD_FUNCTION_PDSCH_PROC_RA DESC = VCD function PDSCH_PROC_RA GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_ra ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2 DESC = VCD function PHY_UE_CONFIG_SIB2 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_config_sib2 ID = VCD_FUNCTION_PHY_CONFIG_SIB1_ENB DESC = VCD function PHY_CONFIG_SIB1_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib1_eNB ID = VCD_FUNCTION_PHY_CONFIG_SIB2_ENB DESC = VCD function PHY_CONFIG_SIB2_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib2_eNB ID = VCD_FUNCTION_PHY_CONFIG_DEDICATED_ENB DESC = VCD function PHY_CONFIG_DEDICATED_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_dedicated_eNB ID = VCD_FUNCTION_PHY_UE_COMPUTE_PRACH DESC = VCD function PHY_UE_COMPUTE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_compute_prach ID = VCD_FUNCTION_PHY_ENB_ULSCH_MSG3 DESC = VCD function PHY_ENB_ULSCH_MSG3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_msg3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING0 DESC = VCD function PHY_ENB_ULSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding0 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING1 DESC = VCD function PHY_ENB_ULSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding1 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING2 DESC = VCD function PHY_ENB_ULSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding2 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING3 DESC = VCD function PHY_ENB_ULSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING4 DESC = VCD function PHY_ENB_ULSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding4 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING5 DESC = VCD function PHY_ENB_ULSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding5 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING6 DESC = VCD function PHY_ENB_ULSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding6 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING7 DESC = VCD function PHY_ENB_ULSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding7 ID = VCD_FUNCTION_PHY_ENB_SFGEN DESC = VCD function PHY_ENB_SFGEN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_sfgen ID = VCD_FUNCTION_PHY_ENB_PRACH_RX DESC = VCD function PHY_ENB_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_prach_rx ID = VCD_FUNCTION_PHY_RU_PRACH_RX DESC = VCD function PHY_RU_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ru_prach_rx ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX DESC = VCD function PHY_ENB_PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_pdcch_tx ID = VCD_FUNCTION_PHY_ENB_RS_TX DESC = VCD function PHY_ENB_RS_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_rs_tx ID = VCD_FUNCTION_UE_GENERATE_PRACH DESC = VCD function UE_GENERATE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_generate_prach ID = VCD_FUNCTION_UE_ULSCH_MODULATION DESC = VCD function UE_ULSCH_MODULATION GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_modulation ID = VCD_FUNCTION_UE_ULSCH_ENCODING DESC = VCD function UE_ULSCH_ENCODING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding_fill_cqi ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING DESC = VCD function UE_ULSCH_SCRAMBLING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_scrambling ID = VCD_FUNCTION_ENB_DLSCH_MODULATION DESC = VCD function ENB_DLSCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_modulation ID = VCD_FUNCTION_ENB_DLSCH_ENCODING DESC = VCD function ENB_DLSCH_ENCODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W DESC = VCD function ENB_DLSCH_ENCODING_W GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding_w ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING DESC = VCD function ENB_DLSCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_scrambling ID = VCD_FUNCTION_ENB_BEAM_PRECODING DESC = VCD function ENB_BEAM_PRECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_beam_precoding ID = VCD_FUNCTION_ENB_OFDM_MODULATION DESC = VCD function ENB_OFDM_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_ofdm_mod_l ID = VCD_FUNCTION_MACPHY_INIT DESC = VCD function MACPHY_INIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_init ID = VCD_FUNCTION_MACPHY_EXIT DESC = VCD function MACPHY_EXIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_exit ID = VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER DESC = VCD function ENB_DLSCH_ULSCH_SCHEDULER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_eNB_dlsch_ulsch_scheduler ID = VCD_FUNCTION_FILL_RAR DESC = VCD function FILL_RAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_fill_rar ID = VCD_FUNCTION_TERMINATE_RA_PROC DESC = VCD function TERMINATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_terminate_ra_proc ID = VCD_FUNCTION_INITIATE_RA_PROC DESC = VCD function INITIATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_initiate_ra_proc ID = VCD_FUNCTION_CANCEL_RA_PROC DESC = VCD function CANCEL_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_cancel_ra_proc ID = VCD_FUNCTION_GET_DCI_SDU DESC = VCD function GET_DCI_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dci_sdu ID = VCD_FUNCTION_GET_DLSCH_SDU DESC = VCD function GET_DLSCH_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dlsch_sdu ID = VCD_FUNCTION_RX_SDU DESC = VCD function RX_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_rx_sdu ID = VCD_FUNCTION_MRBCH_PHY_SYNC_FAILURE DESC = VCD function MRBCH_PHY_SYNC_FAILURE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_mrbch_phy_sync_failure ID = VCD_FUNCTION_SR_INDICATION DESC = VCD function SR_INDICATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_SR_indication ID = VCD_FUNCTION_DLSCH_PREPROCESSOR DESC = VCD function DLSCH_PREPROCESSOR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_dlsch_preprocessor ID = VCD_FUNCTION_SCHEDULE_DLSCH DESC = VCD function SCHEDULE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_schedule_dlsch ID = VCD_FUNCTION_FILL_DLSCH_DCI DESC = VCD function FILL_DLSCH_DCI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_fill_dlsch_dci ID = VCD_FUNCTION_OUT_OF_SYNC_IND DESC = VCD function OUT_OF_SYNC_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_out_of_sync_ind ID = VCD_FUNCTION_UE_DECODE_SI DESC = VCD function UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_si ID = VCD_FUNCTION_UE_DECODE_PCCH DESC = VCD function UE_DECODE_PCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_pcch ID = VCD_FUNCTION_UE_DECODE_CCCH DESC = VCD function UE_DECODE_CCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_ccch ID = VCD_FUNCTION_UE_DECODE_BCCH DESC = VCD function UE_DECODE_BCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_bcch ID = VCD_FUNCTION_UE_SEND_SDU DESC = VCD function UE_SEND_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_send_sdu ID = VCD_FUNCTION_UE_GET_SDU DESC = VCD function UE_GET_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sdu ID = VCD_FUNCTION_UE_GET_RACH DESC = VCD function UE_GET_RACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_rach ID = VCD_FUNCTION_UE_PROCESS_RAR DESC = VCD function UE_PROCESS_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_process_rar ID = VCD_FUNCTION_UE_SCHEDULER DESC = VCD function UE_SCHEDULER GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_scheduler ID = VCD_FUNCTION_UE_GET_SR DESC = VCD function UE_GET_SR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sr ID = VCD_FUNCTION_UE_SEND_MCH_SDU DESC = VCD function UE_SEND_MCH_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_send_mch_sdu ID = VCD_FUNCTION_RLC_DATA_REQ DESC = VCD function RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_data_req #ID = VCD_FUNCTION_RLC_DATA_IND # DESC = VCD function RLC_DATA_IND # GROUP = ALL:VCD:ENB:VCD_FUNCTION # FORMAT = int,value +# VCD_NAME = rlc_data_ind ID = VCD_FUNCTION_MAC_RLC_STATUS_IND DESC = VCD function MAC_RLC_STATUS_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_status_ind ID = VCD_FUNCTION_MAC_RLC_DATA_REQ DESC = VCD function MAC_RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_req ID = VCD_FUNCTION_MAC_RLC_DATA_IND DESC = VCD function MAC_RLC_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_ind ID = VCD_FUNCTION_RLC_UM_TRY_REASSEMBLY DESC = VCD function RLC_UM_TRY_REASSEMBLY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_try_reassembly ID = VCD_FUNCTION_RLC_UM_CHECK_TIMER_DAR_TIME_OUT DESC = VCD function RLC_UM_CHECK_TIMER_DAR_TIME_OUT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_check_timer_dar_time_out ID = VCD_FUNCTION_RLC_UM_RECEIVE_PROCESS_DAR DESC = VCD function RLC_UM_RECEIVE_PROCESS_DAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_receive_process_dar ID = VCD_FUNCTION_PDCP_RUN DESC = VCD function PDCP_RUN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_run ID = VCD_FUNCTION_PDCP_DATA_REQ DESC = VCD function PDCP_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_req ID = VCD_FUNCTION_PDCP_DATA_IND DESC = VCD function PDCP_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_ind ID = VCD_FUNCTION_PDCP_APPLY_SECURITY DESC = VCD function PDCP_APPLY_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_apply_security ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY DESC = VCD function PDCP_VALIDATE_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_validate_security ID = VCD_FUNCTION_PDCP_FIFO_READ DESC = VCD function PDCP_FIFO_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER DESC = VCD function PDCP_FIFO_READ_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read_buffer ID = VCD_FUNCTION_PDCP_FIFO_FLUSH DESC = VCD function PDCP_FIFO_FLUSH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER DESC = VCD function PDCP_FIFO_FLUSH_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush_buffer ID = VCD_FUNCTION_RRC_RX_TX DESC = VCD function RRC_RX_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_rx_tx ID = VCD_FUNCTION_RRC_MAC_CONFIG DESC = VCD function RRC_MAC_CONFIG GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_mac_config_req ID = VCD_FUNCTION_RRC_UE_DECODE_SIB1 DESC = VCD function RRC_UE_DECODE_SIB1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_sib1 ID = VCD_FUNCTION_RRC_UE_DECODE_SI DESC = VCD function RRC_UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_si ID = VCD_FUNCTION_GTPV1U_ENB_TASK DESC = VCD function GTPV1U_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_enb_task ID = VCD_FUNCTION_GTPV1U_PROCESS_UDP_REQ DESC = VCD function GTPV1U_PROCESS_UDP_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_udp_req ID = VCD_FUNCTION_GTPV1U_PROCESS_TUNNEL_DATA_REQ DESC = VCD function GTPV1U_PROCESS_TUNNEL_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_tunnel_data_req ID = VCD_FUNCTION_UDP_ENB_TASK DESC = VCD function UDP_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = udp_enb_task ID = VCD_FUNCTION_EMU_TRANSPORT DESC = VCD function EMU_TRANSPORT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = emu_transport ID = VCD_FUNCTION_LOG_RECORD DESC = VCD function LOG_RECORD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = log_record ID = VCD_FUNCTION_ITTI_ENQUEUE_MESSAGE DESC = VCD function ITTI_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message_malloc ID = VCD_FUNCTION_ITTI_RELAY_THREAD DESC = VCD function ITTI_RELAY_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_relay_thread ID = VCD_FUNCTION_TEST DESC = VCD function TEST GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = test ID = VCD_FUNCTION_SEND_IF4 DESC = VCD function SEND_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if4 ID = VCD_FUNCTION_RECV_IF4 DESC = VCD function RECV_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if4 ID = VCD_FUNCTION_SEND_IF5 DESC = VCD function SEND_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if5 ID = VCD_FUNCTION_RECV_IF5 DESC = VCD function RECV_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if5 ID = VCD_FUNCTION_TRX_COMPR_IF DESC = VCD function TRX_COMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = compress_if ID = VCD_FUNCTION_TRX_DECOMPR_IF DESC = VCD function TRX_DECOMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = decompress_if ID = VCD_FUNCTION_NFAPI DESC = VCD function NFAPI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = nfapi_subframe ID = VCD_FUNCTION_GENERATE_PCFICH DESC = VCD function GENERATE_PCFICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_pcfich ID = VCD_FUNCTION_GENERATE_DCI0 DESC = VCD function GENERATE_DCI0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dci0 ID = VCD_FUNCTION_GENERATE_DLSCH DESC = VCD function GENERATE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dlsch ID = VCD_FUNCTION_GENERATE_PHICH DESC = VCD function GENERATE_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_phich ID = VCD_FUNCTION_PDCCH_SCRAMBLING DESC = VCD function PDCCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_scrambling ID = VCD_FUNCTION_PDCCH_MODULATION DESC = VCD function PDCCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_modulation ID = VCD_FUNCTION_PDCCH_INTERLEAVING DESC = VCD function PDCCH_INTERLEAVING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_interleaving ID = VCD_FUNCTION_PDCCH_TX DESC = VCD function PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_tx diff --git a/common/utils/T/check_vcd.c b/common/utils/T/check_vcd.c new file mode 100644 index 0000000000000000000000000000000000000000..1460d7e20a7dd861f39e4a45150e91377e0ed0da --- /dev/null +++ b/common/utils/T/check_vcd.c @@ -0,0 +1,249 @@ +/* + * To disable the checks done by this program, see below at the beginning + * of the function 'main'. + */ + +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include "database.h" + +#define T_TRACER 1 +#include "T.h" + +/* VCD specific defines and includes + * If the codebase changes, it may need to be updated + */ +#define ENB_MODE +#define ENABLE_USE_CPU_EXECUTION_TIME +#include "../LOG/vcd_signal_dumper.c" + +void err(char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +void err(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + printf("\x1b[31m"); + printf("error: "); + vprintf(fmt, ap); + printf("\n" +"\x1b[33m\n" +"You probably added a VCD trace (variable or function) but you did not\n" +"update T_messages.txt and/or T_defs.h in common/utils/T/\n" +"\n" +"Be sure to add the new trace to T_messages.txt, at the right place in the\n" +"file. Do not forget to define VCD_NAME with an identical value as found\n" +"in the array eurecomVariablesNames or eurecomFunctionsNames.\n" +"\n" +"Be sure to update VCD_NUM_FUNCTIONS, VCD_NUM_VARIABLES, VCD_FIRST_FUNCTION\n" +"and VCD_FIRST_VARIABLE in T_defs.h\n" +"\n" +"The same procedure has to be followed when you delete a VCD trace.\n" +"Delete it in T_messages.txt as well and update T_defs.h\n" +"\n" +"You can disable those VCD checks at development time.\n" +"To disable the VCD checks see the file common/utils/T/check_vcd.c\n" +"Do not push any modification that disables the VCD checks to the\n" +"main repository.\n"); + + printf("\x1b[m\n"); + + va_end(ap); + + exit(1); +} + +int main(void) +{ + /* to disable the checks done by this program, uncomment the following + * line, ie. remove the leading '//' + */ + //return 0; + + void *database = parse_database("T_messages.txt"); + int number_of_events; + int first_var = -1; + int last_var; + int first_fun = -1; + int last_fun; + char *prefix; + int prefix_len; + char *name; + char *vcd_name; + int i; + FILE *in; + char *l = NULL; + size_t lsize; + + if (database == NULL) err("something wrong with T_messages.txt"); + + /* check the value of VCD_NUM_FUNCTIONS */ + if (VCD_NUM_FUNCTIONS != sizeof(eurecomFunctionsNames) / sizeof(char *)) + err("VCD_NUM_FUNCTIONS (%d) must be equal to %zd", + VCD_NUM_FUNCTIONS, + sizeof(eurecomFunctionsNames) / sizeof(char *)); + + /* check the value of VCD_NUM_VARIABLES */ + if (VCD_NUM_VARIABLES != sizeof(eurecomVariablesNames) / sizeof(char *)) + err("VCD_NUM_VARIABLES (%d) must be equal to %zd", + VCD_NUM_VARIABLES, + sizeof(eurecomVariablesNames) / sizeof(char *)); + + number_of_events = number_of_ids(database); + if (number_of_events == 0) err("no event defined in T_messages.txt"); + + /* T_messages.txt ends with VCD VARIABLES followed by VCD FUNCTIONS + * followed by nothing. + * Let's check. + */ + + /* check VCD VARIABLES traces in T_messages.txt */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + first_var = i; + break; + } + if (first_var == -1) + err("no VCD_VARIABLE_ found in T_messages.txt"); + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + last_var = i-1; + + /* check VCD FUNCTIONS traces in T_messages.txt */ + if (i == number_of_events) + err("no VCD_FUNCTION_ found in T_messages.txt"); + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + first_fun = i; + + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) + err("last VCD_VARIABLE_ not followed by a VCD_FUNCTION_ in T_messages.txt"); + + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + + if (i != number_of_events) + err("T_messages.txt does not end with a VCD_FUNCTION_ trace"); + + last_fun = i-1; + + if (first_var != (unsigned)VCD_FIRST_VARIABLE) + err("VCD_FIRST_VARIABLE is not correct in T_defs.h"); + if (first_fun != (unsigned)VCD_FIRST_FUNCTION) + err("VCD_FIRST_FUNCTION is not correct in T_defs.h"); + if (last_var-first_var+1 != VCD_NUM_VARIABLES) + err("VCD_NUM_VARIABLES is not correct in T_defs.h"); + if (last_fun-first_fun+1 != VCD_NUM_FUNCTIONS) + err("VCD_NUM_FUNCTIONS is not correct in T_defs.h"); + + /* check that VCD_NAME is identical to + * eurecomVariablesNames[x]/eurecomFunctionsNames[x] + */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomVariablesNames[i - first_var])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomFunctionsNames[i - first_fun])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + /* check IDs - these checks are difficult because we parse + * common/utils/LOG/vcd_signal_dumper.h which is expected to + * be formatted as is: + * - define vcd_signal_dump_variables then vcd_signal_dump_functions + * - one VCD_XXXX per line starting with two spaces + * followed by ',' or '=' with no space in between + * - no #ifdef / #if is taken into account + * - we require VCD_SIGNAL_DUMPER_VARIABLES_END and + * VCD_SIGNAL_DUMPER_FUNCTIONS_END at the end of each array, + * each on a line of its own with two spaces before and nothing after. + * + * If these checks fail, consider formatting + * common/utils/LOG/vcd_signal_dumper.h as expected here, if + * it makes sense of course. Otherwise, change the code below. + * + * In common/utils/LOG/vcd_signal_dumper.h a valid name is + * either VCD_SIGNAL_DUMPER_VARIABLES_ABC or + * VCD_SIGNAL_DUMPER_FUNCTIONS_XYZ + * and in T_messages.txt the corresponding name has to be + * VCD_VARIABLE_ABC or VCD_FUNCTION_XYZ + */ + i = first_var; + in = fopen("../LOG/vcd_signal_dumper.h", "r"); + if (in == NULL) err("could not open ../LOG/vcd_signal_dumper.h"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_VARIABLES_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_VARIABLES_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_var && i <= last_var)) + err("T_messages.txt is not correct with respect to VCD VARIABLES"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_VARIABLE_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + if (i != last_var + 1) err("VCD VARIABLES wrong in T_messages.txt"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_FUNCTIONS_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_FUNCTIONS_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_fun && i <= last_fun)) + err("T_messages.txt is not correct with respect to VCD FUNCTIONS"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_FUNCTION_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + fclose(in); + if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt"); + + return 0; +} diff --git a/common/utils/T/genids.c b/common/utils/T/genids.c index 734c506368ac348ba9db9ae2eae8048fcec929d6..8e5adbf587081322fc2d6047c7b4d246841bdc94 100644 --- a/common/utils/T/genids.c +++ b/common/utils/T/genids.c @@ -14,21 +14,21 @@ int cmp(const void *p1, const void *p2) } /* return 1 if s was not already known, 0 if it was */ -int new_unique_id(char *s) +int new_unique_id(char *s, char *input_file) { if (unique_ids_size) if (bsearch(&s, unique_ids, unique_ids_size, sizeof(char *), cmp) != NULL) { - printf("FATAL: ID %s is not unique\n", s); + printf("error: ID %s is not unique in %s\n", s, input_file); return 0; } if (unique_ids_size == unique_ids_maxsize) { unique_ids_maxsize += 256; unique_ids = realloc(unique_ids, unique_ids_maxsize * sizeof(char *)); - if (unique_ids == NULL) { printf("out of memory\n"); abort(); } + if (unique_ids == NULL) { printf("erorr: out of memory\n"); abort(); } } unique_ids[unique_ids_size] = strdup(s); if (unique_ids[unique_ids_size] == NULL) - { printf("out of memory\n"); abort(); } + { printf("erorr: out of memory\n"); abort(); } unique_ids_size++; qsort(unique_ids, unique_ids_size, sizeof(char *), cmp); return 1; @@ -43,7 +43,8 @@ void putname(int c) if (bufname_size == bufname_maxsize) { bufname_maxsize += 256; bufname = realloc(bufname, bufname_maxsize); - if (bufname == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufname == NULL) + { printf("erorr: memory allocation error\n"); exit(1); } } bufname[bufname_size] = c; bufname_size++; @@ -58,7 +59,8 @@ void putvalue(int c) if (bufvalue_size == bufvalue_maxsize) { bufvalue_maxsize += 256; bufvalue = realloc(bufvalue, bufvalue_maxsize); - if (bufvalue == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufvalue == NULL) + { printf("error: memory allocation error\n"); exit(1); } } bufvalue[bufvalue_size] = c; bufvalue_size++; @@ -119,7 +121,7 @@ int main(int n, char **v) char *in_name; char *out_name; - if (n != 3) { printf("gimme <source> <dest>\n"); exit(1); } + if (n != 3) { printf("error: gimme <source> <dest>\n"); exit(1); } n = 0; @@ -134,14 +136,13 @@ int main(int n, char **v) while (1) { get_line(in, &name, &value); if (name == NULL) break; - printf("name '%s' value '%s'\n", name, value); if (isspace(value[strlen(value)-1])) { - printf("bad value '%s' (no space at the end please!)\n", value); + printf("error: bad value '%s' (no space at the end please!)\n", value); unlink(out_name); exit(1); } if (!strcmp(name, "ID")) { - if (!new_unique_id(value)) { unlink(out_name); exit(1); } + if (!new_unique_id(value, in_name)) { unlink(out_name); exit(1); } fprintf(out, "#define T_%s T_ID(%d)\n", value, n); n++; } diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c index c331daa4a9f0410d918ea317466b738479328d0a..f8e92881a96e79a000e57fcad814e8440719a895 100644 --- a/common/utils/T/local_tracer.c +++ b/common/utils/T/local_tracer.c @@ -337,54 +337,34 @@ static void forward(void *_forwarder, char *buf, int size) static void wait_message(void) { - while (T_local_cache[T_busylist_head].busy == 0) usleep(1000); -} - -static void init_shm(char *shm_file) -{ - int i; - int s = shm_open(shm_file, O_RDWR | O_CREAT /*| O_SYNC*/, 0666); - if (s == -1) { perror(shm_file); abort(); } - if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t))) - { perror(shm_file); abort(); } - T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, s, 0); - if (T_local_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(s); - - /* let's garbage the memory to catch some potential problems - * (think multiprocessor sync issues, barriers, etc.) - */ - memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); - for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0; + while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000); } void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file) + int local_socket, void *shm_array) { int s; int port = remote_port; int dont_wait = wait_for_tracer ? 0 : 1; void *f; - printf("local tracer starting\n"); + /* write on a socket fails if the other end is closed and we get SIGPIPE */ - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { printf("local tracer received SIGPIPE\n"); abort(); - } + } + + T_local_cache = shm_array; - init_shm(shm_file); s = local_socket; - printf("local tracer starting step 2\n"); + if (dont_wait) { char t = 2; - printf("local tracer in no wait mode \n"); if (write(s, &t, 1) != 1) abort(); } - printf("local tracer starting step 3\n"); + f = forwarder(port, s); - printf("local tracer main loop.... \n"); + /* read messages */ while (1) { wait_message(); diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index 1c4a77587c3916c9140a9ef71465b08e8a9313aa..3da4aa13a17528cc1396f5eedc2e40eee91c2cb1 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -7,7 +7,7 @@ LIBS=-lm XLIBS=-lX11 -lpng -lXft all: record replay extract_config textlog enb ue vcd macpdu2wireshark \ - extract_input_subframe extract_output_subframe to_vcd extract + extract_input_subframe extract_output_subframe to_vcd extract multi record: utils.o record.o database.o config.o $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -57,19 +57,22 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \ config.o $(CC) $(CFLAGS) -o $@ $^ $(LIBS) +multi: multi.o utils.o database.o config.o + $(CC) $(CFLAGS) -o multi $^ $(LIBS) + .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a gui/gui.a: - cd gui && make + cd gui && $(MAKE) view/view.a: - cd view && make + cd view && $(MAKE) logger/logger.a: - cd logger && make + cd logger && $(MAKE) filter/filter.a: - cd filter && make + cd filter && $(MAKE) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< @@ -77,9 +80,9 @@ filter/filter.a: clean: rm -f *.o core tracer_remote textlog enb ue vcd record replay rm -f extract_config macpdu2wireshark extract_input_subframe - rm -f extract_output_subframe to_vcd extract - cd gui && make clean - cd view && make clean - cd logger && make clean - cd filter && make clean - cd hacks && make clean + rm -f extract_output_subframe to_vcd extract multi + cd gui && $(MAKE) clean + cd view && $(MAKE) clean + cd logger && $(MAKE) clean + cd filter && $(MAKE) clean + cd hacks && $(MAKE) clean diff --git a/common/utils/T/tracer/config.c b/common/utils/T/tracer/config.c index f88966ed79a111b2ab2d09d7110ae9da0c3781ea..723902ec9c8bbe518ca2eaad902c1903771e87f4 100644 --- a/common/utils/T/tracer/config.c +++ b/common/utils/T/tracer/config.c @@ -60,3 +60,9 @@ void verify_config(void) abort(); } } + +void get_local_config(char **txt, int *len) +{ + *txt = local; + *len = local_size; +} diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h index f90869eb6621f89c5be80fc012e4edc7102a4652..07290c71a35c5605596ff3770a34db40ce5dbc0a 100644 --- a/common/utils/T/tracer/config.h +++ b/common/utils/T/tracer/config.h @@ -5,5 +5,6 @@ void clear_remote_config(void); void append_received_config_chunk(char *buf, int length); void load_config_file(char *filename); void verify_config(void); +void get_local_config(char **txt, int *len); #endif /* _CONFIG_H_ */ diff --git a/common/utils/T/tracer/database.c b/common/utils/T/tracer/database.c index f0908948e23cb81ac2809faa14b8856f53492075..543ab666640309719c2599ad00e7b4ff6b66caea 100644 --- a/common/utils/T/tracer/database.c +++ b/common/utils/T/tracer/database.c @@ -13,6 +13,7 @@ typedef struct { char **arg_type; char **arg_name; int asize; + char *vcd_name; int id; } id; @@ -138,6 +139,7 @@ id *add_id(database *r, char *idname, int i) r->i[r->isize].arg_type = NULL; r->i[r->isize].arg_name = NULL; r->i[r->isize].asize = 0; + r->i[r->isize].vcd_name = NULL; r->i[r->isize].id = i; r->isize++; qsort(r->i, r->isize, sizeof(id), id_cmp); @@ -224,6 +226,12 @@ void add_desc(id *i, char *desc) i->desc = strdup(desc); if (i->desc == NULL) abort(); } +void add_vcd_name(id *i, char *vcd_name) +{ + if (i == NULL) {printf("ERROR: VCD_NAME line before ID line\n");exit(1);} + i->vcd_name = strdup(vcd_name); if (i->vcd_name == NULL) abort(); +} + char *format_get_next_token(char **cur) { char *start; @@ -320,6 +328,7 @@ void *parse_database(char *filename) if (!strcmp(name, "GROUP")) add_groups(r, last_id, value); if (!strcmp(name, "DESC")) add_desc(last_id, value); if (!strcmp(name, "FORMAT")) add_format(last_id, value); + if (!strcmp(name, "VCD_NAME")) add_vcd_name(last_id, value); } fclose(in); @@ -424,6 +433,12 @@ char *event_name_from_id(void *_database, int id) return d->i[d->id_to_pos[id]].name; } +char *event_vcd_name_from_id(void *_database, int id) +{ + database *d = _database; + return d->i[d->id_to_pos[id]].vcd_name; +} + int event_id_from_name(void *_database, char *name) { database *d = _database; diff --git a/common/utils/T/tracer/database.h b/common/utils/T/tracer/database.h index c5cab05d9f7be0da0cc8d50fcf3fda243aec556a..9fdbaed7c685fb77979167f243fdd5732597566b 100644 --- a/common/utils/T/tracer/database.h +++ b/common/utils/T/tracer/database.h @@ -8,6 +8,7 @@ void list_ids(void *database); void list_groups(void *database); void on_off(void *d, char *item, int *a, int onoff); char *event_name_from_id(void *database, int id); +char *event_vcd_name_from_id(void *_database, int id); int event_id_from_name(void *database, char *name); int number_of_ids(void *database); int database_get_ids(void *database, char ***ids); diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c index a30366faf1eb8e645d5efba1cf664985cc60c255..ea499a68f831b5e7d7bbecb144815e2d9ddc81d6 100644 --- a/common/utils/T/tracer/enb.c +++ b/common/utils/T/tracer/enb.c @@ -878,6 +878,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (enb_data.socket != -1) close(enb_data.socket); enb_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/gui/x.c b/common/utils/T/tracer/gui/x.c index 94448eb666c65836437b4fa36224a2acd01e7e3d..ef5334767cb086044d34a4fd1f6f7e6210c8adab 100644 --- a/common/utils/T/tracer/gui/x.c +++ b/common/utils/T/tracer/gui/x.c @@ -150,7 +150,17 @@ x_image *x_create_image(x_connection *_x, unsigned char *data, vs = XGetVisualInfo(x->d, VisualDepthMask | VisualClassMask | VisualRedMaskMask | VisualGreenMaskMask | VisualBlueMaskMask | VisualBitsPerRGBMask, &template, &nvs); - if (vs == NULL || nvs == 0) ERR("no good visual found\n"); + + if (vs == NULL) { + /* try again with 32 bpp */ + template.depth = 32; + vs = XGetVisualInfo(x->d, VisualDepthMask | VisualClassMask | + VisualRedMaskMask | VisualGreenMaskMask | VisualBlueMaskMask | + VisualBitsPerRGBMask, &template, &nvs); + } + + if (vs == NULL) ERR("no good visual found\n"); + v = vs[0].visual; XFree(vs); diff --git a/common/utils/T/tracer/multi.c b/common/utils/T/tracer/multi.c new file mode 100644 index 0000000000000000000000000000000000000000..6a9de838c674b1473e54d99a147d91c9d431311e --- /dev/null +++ b/common/utils/T/tracer/multi.c @@ -0,0 +1,385 @@ +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> +#include <poll.h> +#include <sys/socket.h> +#include <unistd.h> +#include "database.h" +#include "utils.h" +#include "../T.h" +#include "config.h" + +#define DEFAULT_LOCAL_PORT 2022 + +typedef struct { + int id; /* increases at each new tracer's connection */ + int s; /* socket */ + int *is_on; /* local vision of is_on for this tracer */ + int poll_id; /* -1: invalid, otherwise index in fds array */ +} ti_t; + +typedef struct { + ti_t *ti; /* data for tracers */ + int ti_size; + int ti_maxsize; +} multi_t; + +void set_is_on(int *is_on, int pos, int val) +{ + if (val) is_on[pos]++; else is_on[pos]--; + /* TODO: remove check? */ + if (is_on[pos] < 0) { printf("%s:%d:nonono\n",__FILE__,__LINE__); abort(); } +} + +int send_messages_txt(int s, char *T_messages_txt, int T_messages_txt_len) +{ + char buf[T_BUFFER_MAX]; + char *T_LOCAL_buf = buf; + int32_t T_LOCAL_size; + unsigned char *src; + int src_len; + + /* trace T_message.txt + * Send several messages -1 with content followed by message -2. + */ + src = (unsigned char *)T_messages_txt; + src_len = T_messages_txt_len; + while (src_len) { + int send_size = src_len; + if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int)) + send_size = T_PAYLOAD_MAXSIZE - sizeof(int); + /* TODO: be careful, we use internal T stuff, to rewrite? */ + T_LOCAL_size = 0; + T_HEADER(T_ID(-1)); + T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)})); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + if (socket_send(s, buf, T_LOCAL_size) == -1) return -1; + src += send_size; + src_len -= send_size; + } + T_LOCAL_size = 0; + T_HEADER(T_ID(-2)); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + return socket_send(s, buf, T_LOCAL_size); +} + +void new_tracer(multi_t *m, int s, int is_on_size, char *t, int t_size, int id) +{ + if (send_messages_txt(s, t, t_size) == -1) { + printf("error sending T_messages.txt to new tracer %d => remove tracer\n", + id); + return; + } + if (m->ti_size == m->ti_maxsize) { + m->ti_maxsize += 64; + m->ti = realloc(m->ti, m->ti_maxsize * sizeof(ti_t)); + if (m->ti == NULL) abort(); + } + m->ti[m->ti_size].id = id; + m->ti[m->ti_size].s = s; + m->ti[m->ti_size].is_on = calloc(is_on_size, sizeof(int)); + if (m->ti[m->ti_size].is_on == NULL) abort(); + m->ti[m->ti_size].poll_id = -1; + m->ti_size++; +} + +void remove_tracer(multi_t *m, int t) +{ + free(m->ti[t].is_on); + shutdown(m->ti[t].s, SHUT_RDWR); + close(m->ti[t].s); + m->ti_size--; + memmove(&m->ti[t], &m->ti[t+1], (m->ti_size - t) * sizeof(ti_t)); +} + +int send_is_on(int socket, int number_of_events, int *is_on) +{ + int i; + char mt = 1; + if (socket_send(socket, &mt, 1) == -1 || + socket_send(socket, &number_of_events, sizeof(int)) == -1) return -1; + for (i = 0; i < number_of_events; i++) { + int v = is_on[i] ? 1 : 0; + if (socket_send(socket, &v, sizeof(int)) == -1) return -1; + } + return 0; +} + +int read_tracee(int s, OBUF *ebuf, int *_type, int32_t *_length) +{ + int type; + int32_t length; + char *v; + int vpos = 0; + + if (fullread(s, &length, 4) == -1) return -1; + if (ebuf->omaxsize < length) { + ebuf->omaxsize = (length + 65535) & ~65535; + ebuf->obuf = realloc(ebuf->obuf, ebuf->omaxsize); + if (ebuf->obuf == NULL) { printf("out of memory\n"); exit(1); } + } + v = ebuf->obuf; + memcpy(v+vpos, &length, 4); + vpos += 4; +#ifdef T_SEND_TIME + if (fullread(s,v+vpos,sizeof(struct timespec))==-1) return -1; + vpos += sizeof(struct timespec); + length -= sizeof(struct timespec); +#endif + if (fullread(s, &type, sizeof(int)) == -1) return -1; + memcpy(v+vpos, &type, sizeof(int)); + vpos += sizeof(int); + length -= sizeof(int); + if (fullread(s, v+vpos, length) == -1) return -1; + vpos += length; + + ebuf->osize = vpos; + + *_type = type; + *_length = length; + return 0; +} + +void forward_event(multi_t *m, int number_of_events, OBUF *ebuf, int type) +{ + int i; + + if (type < 0 || type >= number_of_events) + { printf("error: bad type of event to forward %d\n", type); abort(); } + + for (i = 0; i < m->ti_size; i++) { + if (!m->ti[i].is_on[type]) continue; + if (socket_send(m->ti[i].s, ebuf->obuf, ebuf->osize) == -1) + printf("warning: error forwarding event to tracer %d\n", m->ti[i].id); + } +} + +int connect_to_tracee(char *ip, int port, int number_of_events, int *is_on) +{ + int s; + + printf("connecting to %s:%d\n", ip, port); + + s = try_connect_to(ip, port); + if (s == -1) return -1; + + if (send_is_on(s, number_of_events, is_on) == -1) { + shutdown(s, SHUT_RDWR); + close(s); + return -1; + } + + return s; +} + +void usage(void) +{ + printf( +"options:\n" +" -d <database file> this option is mandatory\n" +" -ip <host> connect to given IP address (default %s)\n" +" -p <port> connect to given port (default %d)\n" +" -lp <port> listen on local port (default %d)\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT, + DEFAULT_LOCAL_PORT + ); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + int local_port = DEFAULT_LOCAL_PORT; + int *is_on; + int number_of_events; + int i, j; + char *T_messages_txt; + int T_messages_txt_len; + int l; /* listen socket for tracers' connections */ + int s = -1; /* socket connected to tracee. -1 if not connected */ + multi_t m; + int is_on_changed; + int current_nfd; + struct pollfd *fds = NULL; + int next_id = 0; + + memset(&m, 0, sizeof(m)); + + /* write on a socket fails if the other end is closed and we get SIGPIPE */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-lp")) + { if (i > n-2) usage(); local_port = atoi(v[++i]); continue; } + usage(); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + get_local_config(&T_messages_txt, &T_messages_txt_len); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + /* create listener socket */ + l = create_listen_socket("0.0.0.0", local_port); + + OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL }; + + current_nfd = 0; + + while (1) { + int nfd; + int timeout; + + if (s == -1) s = connect_to_tracee(ip, port, number_of_events, is_on); + + /* poll on s (if there), l, and all tracers' sockets */ + nfd = 1 + (s != -1) + m.ti_size; + if (nfd != current_nfd) { + current_nfd = nfd; + free(fds); + fds = calloc(nfd, sizeof(struct pollfd)); + if (fds == NULL) { perror("calloc"); exit(1); } + } + i = 0; + fds[i].fd = l; + fds[i].events = POLLIN; + i++; + if (s != -1) { + fds[i].fd = s; + fds[i].events = POLLIN; + i++; + } + for (j = 0; j < m.ti_size; j++) { + m.ti[j].poll_id = i; + fds[i].fd = m.ti[j].s; + fds[i].events = POLLIN; + i++; + } + if (s == -1) timeout = 1000; else timeout = -1; + if (poll(fds, nfd, timeout) == -1) { perror("poll"); exit(1); } + + if (fds[0].revents & ~POLLIN) { + printf("TODO: error on listen socket?\n"); + exit(1); + } + + /* new tracer connecting? */ + if (fds[0].revents & POLLIN) { + int t; + printf("tracer %d connecting\n", next_id); + t = socket_accept(l); + if (t == -1) perror("accept"); + else new_tracer(&m, t, number_of_events, + T_messages_txt, T_messages_txt_len, next_id); + next_id++; + } + + if (s != -1 && fds[1].revents & ~POLLIN) { + printf("TODO: error on tracee socket?\n"); + exit(1); + } + + /* data from tracee */ + if (s != -1 && fds[1].revents & POLLIN) { + int type; + int32_t length; + if (read_tracee(s, &ebuf, &type, &length) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } else { + if (type == -1) + append_received_config_chunk(ebuf.obuf+ebuf.osize-length, length); + else if (type == -2) verify_config(); + else forward_event(&m, number_of_events, &ebuf, type); + } + } + + /* status of each tracer */ + is_on_changed = 0; + for (j = 0; j < m.ti_size; j++) { + int l; + int s; + int *t_is_on; + if (m.ti[j].poll_id == -1) continue; + i = m.ti[j].poll_id; + s = m.ti[j].s; + t_is_on = m.ti[j].is_on; + if (fds[i].revents & (POLLHUP | POLLERR)) goto tracer_error; + /* error? */ + if (fds[i].revents & ~POLLIN) { + printf("TODO: error with tracer?\n"); + exit(1); + } + /* data in */ + if (fds[i].revents & POLLIN) { + char t; + int len; + int v; + if (fullread(s, &t, 1) != 1) goto tracer_error; + switch (t) { + case 0: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v >= number_of_events) goto tracer_error; + t_is_on[v] = 1 - t_is_on[v]; + set_is_on(is_on, v, t_is_on[v]); + } + break; + case 1: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + if (len < 0 || len > number_of_events) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v > 1) goto tracer_error; + if (t_is_on[l] != v) set_is_on(is_on, l, v); + t_is_on[l] = v; + } + break; + case 2: break; + default: printf("error: unhandled message type %d\n", t); //abort(); + } + } + continue; +tracer_error: + printf("remove tracer %d\n", m.ti[j].id); + for (l = 0; l < number_of_events; l++) + if (m.ti[j].is_on[l]) { is_on_changed = 1; set_is_on(is_on, l, 0); } + remove_tracer(&m, j); + j--; + } + if (is_on_changed && s != -1) + if (send_is_on(s, number_of_events, is_on) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } + } + + return 0; +} diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c index 097fdce93217af2d6b6bc48a204bc120c421775f..998649af01543a531193640112832731657082d9 100644 --- a/common/utils/T/tracer/to_vcd.c +++ b/common/utils/T/tracer/to_vcd.c @@ -12,7 +12,14 @@ #include "logger/logger.h" #include "view/view.h" +enum var_type { + DEFAULT, + VCD_FUNCTION, + VCD_VARIABLE +}; + typedef struct { + enum var_type type; char *event; char *arg; char *vcd_name; @@ -44,16 +51,39 @@ void vcd_write_header(vcd_vars *v, int n) "$version\n" " to_vcd\n" "$end\n" -"$timescale 1ns $end\n" +"$timescale 1ns $end\n") <= 0) abort(); + + if (fprintf(out, "$scope module logic $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == DEFAULT) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + if (fprintf(out, +"$scope module functions $end\n") <= 0) abort(); for (i = 0; i < n; i++) - if (fprintf(out, "$var wire %d %s %s $end\n", - v[i].boolean ? 1 : 64, - v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (v[i].type == VCD_FUNCTION) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + + if (fprintf(out, +"$scope module variables $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == VCD_VARIABLE) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); if (fprintf(out, -"$upscope $end\n" "$enddefinitions $end\n" "$dumpvars\n") <= 0) abort(); @@ -174,7 +204,8 @@ void usage(void) " -ip <host> connect to given IP address (default %s)\n" " -p <port> connect to given port (default %d)\n" " -b <event> <arg> <vcd name> trace as binary (0 off, anything else on)\n" -" -l <event> <arg> <vcd name> trace as uint64_t\n", +" -l <event> <arg> <vcd name> trace as uint64_t\n" +" -vcd trace all VCD variables and functions\n", DEFAULT_REMOTE_IP, DEFAULT_REMOTE_PORT ); @@ -192,6 +223,21 @@ void force_stop(int x) run = 0; } +vcd_vars *add_var(vcd_vars *vars, int nvars, + char *event, char *arg, char *vcd_name, int is_boolean, enum var_type t) +{ + if (nvars % 64 == 0) { + vars = realloc(vars, (nvars+64) * sizeof(vcd_vars)); + if (vars == NULL) abort(); + } + vars[nvars].type = t; + vars[nvars].event = event; + vars[nvars].arg = arg; + vars[nvars].vcd_name = vcd_name; + vars[nvars].boolean = is_boolean; + return vars; +} + int main(int n, char **v) { char *output_filename = NULL; @@ -202,11 +248,12 @@ int main(int n, char **v) int *is_on; int number_of_events; int i; - vcd_vars vars[n]; + vcd_vars *vars = NULL; int nvars = 0; view *vcd_view; event_handler *h; logger *textlog; + int all_vcd = 0; /* write on a socket fails if the other end is closed and we get SIGPIPE */ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); @@ -221,19 +268,22 @@ int main(int n, char **v) if (!strcmp(v[i], "-p")) { if (i > n-2) usage(); port = atoi(v[++i]); continue; } if (!strcmp(v[i], "-b")) { if(i>n-4)usage(); - vars[nvars].event = v[++i]; - vars[nvars].arg = v[++i]; - vars[nvars].vcd_name = v[++i]; - vars[nvars++].boolean = 1; + char *event = v[++i]; + char *arg = v[++i]; + char *vcd_name = v[++i]; + vars = add_var(vars, nvars, event, arg, vcd_name, 1, DEFAULT); + nvars++; continue; } if (!strcmp(v[i], "-l")) { if(i>n-4)usage(); - vars[nvars].event = v[++i]; - vars[nvars].arg = v[++i]; - vars[nvars].vcd_name = v[++i]; - vars[nvars++].boolean = 0; + char *event = v[++i]; + char *arg = v[++i]; + char *vcd_name = v[++i]; + vars = add_var(vars, nvars, event, arg, vcd_name, 0, DEFAULT); + nvars++; continue; } + if (!strcmp(v[i], "-vcd")) { all_vcd = 1; continue; } usage(); } @@ -260,11 +310,42 @@ int main(int n, char **v) /* create the view */ vcd_view = new_view_vcd(); + if (all_vcd) { + /* activate all VCD traces */ + for (i = 0; i < number_of_events; i++) { + int is_boolean; + enum var_type type; + int prefix_length; + char *name = event_name_from_id(database, i); + char *vcd_name; + char *var_prefix = "VCD_VARIABLE_"; + char *fun_prefix = "VCD_FUNCTION_"; + if (!strncmp(name, var_prefix, strlen(var_prefix))) { + prefix_length = strlen(var_prefix); + is_boolean = 0; + type = VCD_VARIABLE; + } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) { + prefix_length = strlen(fun_prefix); + is_boolean = 1; + type = VCD_FUNCTION; + } else + continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) { + vcd_name = name+prefix_length; + printf("WARNING: ID %s does not define VCD_NAME in the file %s, using %s\n", + name, database_filename, vcd_name); + } + vars = add_var(vars, nvars, + name, "value", vcd_name, is_boolean, type); + nvars++; + } + } + /* setup traces */ for (i = 0; i < nvars; i++) { char format[256]; - if (strlen(vars[i].arg) > 256-3) abort(); - if (strlen(vars[i].vcd_name) > 256-1) abort(); + if (strlen(vars[i].arg) + strlen(vars[i].vcd_name) > 256-16) abort(); sprintf(format, "%c [%s] %s", vars[i].boolean ? 'b' : 'l', vars[i].arg, diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c index 6a7d03c897357c5e0d2cbbe07239fcb2bf2ebcfc..7b03210cd2cb3d7884fa57c6531e08d58a3aa141 100644 --- a/common/utils/T/tracer/ue.c +++ b/common/utils/T/tracer/ue.c @@ -857,6 +857,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (ue_data.socket != -1) close(ue_data.socket); ue_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c index 507154673538a4570c058f1af5ecf4db8771871d..7f58b6f5aa0061189d01a5107d8e6dcea035138a 100644 --- a/common/utils/T/tracer/utils.c +++ b/common/utils/T/tracer/utils.c @@ -79,6 +79,36 @@ list *list_append(list *l, void *data) /* socket */ /****************************************************************************/ +int create_listen_socket(char *addr, int port) +{ + struct sockaddr_in a; + int s; + int v; + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s == -1) { perror("socket"); exit(1); } + v = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int))) + { perror("setsockopt"); exit(1); } + + a.sin_family = AF_INET; + a.sin_port = htons(port); + a.sin_addr.s_addr = inet_addr(addr); + + if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } + if (listen(s, 5)) { perror("listen"); exit(1); } + + return s; +} + +int socket_accept(int s) +{ + struct sockaddr_in a; + socklen_t alen; + alen = sizeof(a); + return accept(s, (struct sockaddr *)&a, &alen); +} + int socket_send(int socket, void *buffer, int size) { char *x = buffer; @@ -94,26 +124,13 @@ int socket_send(int socket, void *buffer, int size) int get_connection(char *addr, int port) { - struct sockaddr_in a; - socklen_t alen; int s, t; printf("waiting for connection on %s:%d\n", addr, port); - s = socket(AF_INET, SOCK_STREAM, 0); - if (s == -1) { perror("socket"); exit(1); } - t = 1; - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int))) - { perror("setsockopt"); exit(1); } - - a.sin_family = AF_INET; - a.sin_port = htons(port); - a.sin_addr.s_addr = inet_addr(addr); + s = create_listen_socket(addr, port); - if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } - if (listen(s, 5)) { perror("bind"); exit(1); } - alen = sizeof(a); - t = accept(s, (struct sockaddr *)&a, &alen); + t = socket_accept(s); if (t == -1) { perror("accept"); exit(1); } close(s); @@ -137,14 +154,11 @@ int fullread(int fd, void *_buf, int count) return ret; } -int connect_to(char *addr, int port) +int try_connect_to(char *addr, int port) { int s; struct sockaddr_in a; - printf("connecting to %s:%d\n", addr, port); - -again: s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } @@ -155,6 +169,21 @@ again: if (connect(s, (struct sockaddr *)&a, sizeof(a)) == -1) { perror("connect"); close(s); + return -1; + } + + return s; +} + +int connect_to(char *addr, int port) +{ + int s; + + printf("connecting to %s:%d\n", addr, port); + +again: + s = try_connect_to(addr, port); + if (s == -1) { printf("trying again in 1s\n"); sleep(1); goto again; diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h index 3be6cfe1a7f67af65282d7494c7d1a172fc163d7..6784117fa6cf66d3ffc33e191924f385dacc888d 100644 --- a/common/utils/T/tracer/utils.h +++ b/common/utils/T/tracer/utils.h @@ -24,11 +24,14 @@ list *list_append(list *l, void *data); #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 +int create_listen_socket(char *addr, int port); +int socket_accept(int s); /* socket_send: return 0 if okay, -1 on error */ int socket_send(int socket, void *buffer, int size); int get_connection(char *addr, int port); /* fullread: return length read if okay (that is: 'count'), -1 on error */ int fullread(int fd, void *_buf, int count); +int try_connect_to(char *addr, int port); int connect_to(char *addr, int port); /****************************************************************************/ diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c index 656f6a885224abaf3e6565368bd99d5f95225620..c0afdb0b6493cf95bf96b3e0095816dda73dcf01 100644 --- a/common/utils/load_module_shlib.c +++ b/common/utils/load_module_shlib.c @@ -70,8 +70,8 @@ char *tmpstr; char *shlibpath =NULL; char *shlibversion=NULL; char *cfgprefix; -paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0}, - {"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0}}; +paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0, NULL}, + {"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0, NULL}}; int ret; @@ -118,7 +118,7 @@ int ret; return tmpstr; } -int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf) +int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg) { void *lib_handle; initfunc_t fpi; @@ -155,7 +155,7 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf) fpi = dlsym(lib_handle,afname); if (fpi != NULL ) { - fpi(); + fpi(autoinit_arg); } if (farray != NULL) { diff --git a/common/utils/load_module_shlib.h b/common/utils/load_module_shlib.h index ffbad665708ef0ffe1f890d14e6f04039b5afb80..685b3d1b6552f298c1378dff631a8036d49e15e1 100644 --- a/common/utils/load_module_shlib.h +++ b/common/utils/load_module_shlib.h @@ -59,7 +59,8 @@ typedef struct { /* function type of functions which may be implemented by a module */ /* 1: init function, called when loading, if found in the shared lib */ -typedef int(*initfunc_t)(void); +typedef int(*initfunc_t)(void *); + /* 2: version checking function, called when loading, if it returns -1, trigger main exec abort */ typedef int(*checkverfunc_t)(char * mainexec_version, char ** shlib_version); /* 3: get function array function, called when loading when a module doesn't provide */ @@ -72,18 +73,18 @@ typedef int(*getfarrayfunc_t)(loader_shlibfunc_t **funcarray); #define DEFAULT_MAXSHLIBS 10 loader_data_t loader_data; -/*------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* LOADER parameters */ -/* optname helpstr paramflags XXXptr defXXXval type numelt */ -/*------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* LOADER parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt check func*/ +/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define LOADER_PARAMS_DESC { \ -{"shlibpath", NULL, PARAMFLAG_NOFREE, strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0}, \ -{"maxshlibs", NULL, 0, uptr:&(loader_data.maxshlibs), defintval:DEFAULT_MAXSHLIBS, TYPE_UINT32, 0}, \ +{"shlibpath", NULL, PARAMFLAG_NOFREE, strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0, NULL},\ +{"maxshlibs", NULL, 0, uptr:&(loader_data.maxshlibs), defintval:DEFAULT_MAXSHLIBS, TYPE_UINT32, 0, NULL}\ } /*-------------------------------------------------------------------------------------------------------------*/ #else /* LOAD_MODULE_SHLIB_MAIN */ -extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf); +extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf, void *initfunc_arg); extern void * get_shlibmodule_fptr(char *modname, char *fname); extern loader_data_t loader_data; #endif /* LOAD_MODULE_SHLIB_MAIN */ diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c index 9e556a97de959daef37c937976a42dccdbe6eab8..4c9e3827b069ee20ced71cbb6304533551c3e937 100644 --- a/common/utils/msc/msc.c +++ b/common/utils/msc/msc.c @@ -32,10 +32,14 @@ #include <stdint.h> #include <inttypes.h> +#define MSC_LIBRARY +#include "msc.h" + #include "liblfds611.h" #include "intertask_interface.h" -#include "msc.h" + + #include "assertions.h" //------------------------------- @@ -66,8 +70,8 @@ void *msc_task(void *args_p) //------------------------------------------------------------------------------ { MessageDef *received_message_p = NULL; - const char *msg_name = NULL; - instance_t instance = 0; +// const char *msg_name = NULL; +// instance_t instance = 0; long timer_id; itti_mark_task_ready(TASK_MSC); @@ -87,9 +91,9 @@ void *msc_task(void *args_p) itti_receive_msg(TASK_MSC, &received_message_p); if (received_message_p != NULL) { - msg_name = ITTI_MSG_NAME (received_message_p); - instance = ITTI_MSG_INSTANCE (received_message_p); - +// msg_name = ITTI_MSG_NAME (received_message_p); +// instance = ITTI_MSG_INSTANCE (received_message_p); + switch (ITTI_MSG_ID(received_message_p)) { case TIMER_HAS_EXPIRED: { @@ -570,4 +574,17 @@ error_event: free(new_item_p); } - +//------------------------------------------------------------------------------ +// function called when oai loader loads the msc shared lib +int msc_autoinit(msc_interface_t *msc_interface) +//------------------------------------------------------------------------------ + { + + msc_interface->msc_init = msc_init; + msc_interface->msc_start_use = msc_start_use; + msc_interface->msc_end = msc_end; + msc_interface->msc_log_event = msc_log_event; + msc_interface->msc_log_message = msc_log_message; + msc_interface->msc_loaded = 1; + return 0; + } diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h index 4493a5239a40f2c41aa79461443c8bb51b9737d9..78eb6cdb080665290f80474328110f79a1d61f28 100644 --- a/common/utils/msc/msc.h +++ b/common/utils/msc/msc.h @@ -73,7 +73,23 @@ typedef enum { #define MSC_AS_TIME_ARGS(CTXT_Pp) \ (CTXT_Pp)->frame, \ (CTXT_Pp)->subframe -#if defined(MESSAGE_CHART_GENERATOR) + +typedef int(*msc_init_t)(const msc_env_t, const int ); +typedef void(*msc_start_use_t)(void ); +typedef void(*msc_end_t)(void); +typedef void(*msc_log_event_t)(const msc_proto_t,char *, ...); +typedef void(*msc_log_message_t)(const char * const, const msc_proto_t, const msc_proto_t, + const uint8_t* const, const unsigned int, char * , ...); +typedef struct msc_interface { + int msc_loaded; + msc_init_t msc_init; + msc_start_use_t msc_start_use; + msc_end_t msc_end; + msc_log_event_t msc_log_event; + msc_log_message_t msc_log_message; +} msc_interface_t; + +#ifdef MSC_LIBRARY int msc_init(const msc_env_t envP, const int max_threadsP); void msc_start_use(void); void msc_flush_messages(void); @@ -88,22 +104,17 @@ void msc_log_message( const unsigned int num_bytes, char *format, ...); -#define MSC_INIT(arg1,arg2) msc_init(arg1,arg2) -#define MSC_START_USE msc_start_use -#define MSC_END msc_end -#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...) msc_log_event(mScPaRaMs, fORMAT, ##aRGS) -#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("<-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS) -#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("x-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS) -#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("->",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS) -#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("-x",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS) #else -#define MSC_INIT(arg1,arg2) -#define MSC_START_USE(mScPaRaMs) -#define MSC_END(mScPaRaMs) -#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...) -#define MSC_LOG_RX_MESSAGE(mScPaRaMs, fORMAT, aRGS...) -#define MSC_LOG_RX_DISCARDED_MESSAGE(mScPaRaMs, fORMAT, aRGS...) -#define MSC_LOG_TX_MESSAGE(mScPaRaMs, fORMAT, aRGS...) -#define MSC_LOG_TX_MESSAGE_FAILED(mScPaRaMs, fORMAT, aRGS...) -#endif + +msc_interface_t msc_interface; +#define MSC_INIT(arg1,arg2) if(msc_interface.msc_loaded) msc_interface.msc_init(arg1,arg2) +#define MSC_START_USE if(msc_interface.msc_loaded) msc_interface.msc_start_use +#define MSC_END if(msc_interface.msc_loaded) msc_interface.msc_end +#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_event(mScPaRaMs, fORMAT, ##aRGS) +#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("<-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS) +#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("x-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS) +#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("->",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS) +#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("-x",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS) #endif + +#endif diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 7222161a7edc5bb9c50ff6181e68f80de9ef7cbf..931eb40c0fc04a1798d51cc40ec207837e5688d0 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -1,6 +1,6 @@ /* Author: Laurent THOMAS, Open Cells - copyleft: OpenAirInterface Software Alliance + copyleft: OpenAirInterface Software Alliance and it's licence */ #include <vector> #include <map> diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index 4a8402716b59f061352a19efc7dafa758c60530b..7d07724cc14be3c0b3aee2f2f23de62318a7e799 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -1,6 +1,6 @@ /* Author: Laurent THOMAS, Open Cells - Copyleft: OpenAirInterface software alliance + Copyleft: OpenAirInterface software alliance and it's licence */ #ifndef INTERTASK_INTERFACE_H_ #define INTERTASK_INTERFACE_H_ diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c index cd827490573e845b0ec0a6b20d35ca9b4e0ea3ac..3b423bd4655e47d15e711e972c4b5d722dbcafec 100644 --- a/common/utils/telnetsrv/telnetsrv_proccmd.c +++ b/common/utils/telnetsrv/telnetsrv_proccmd.c @@ -199,28 +199,29 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt) print_threads(buf,debug,prnt); } if (strcasestr(buf,"loglvl") != NULL) { - prnt(" component level enabled\n"); + prnt("\n component level enabled output\n"); for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) { if (g_log->log_component[i].name != NULL) { - prnt("%02i %17.17s:%10.10s %s\n",i ,g_log->log_component[i].name, - map_int_to_str(log_level_names,g_log->log_component[i].level), - ((g_log->log_component[i].interval>0)?"Y":"N") ); + prnt("%02i %17.17s:%10.10s %s %s\n",i ,g_log->log_component[i].name, + map_int_to_str(log_level_names,(g_log->log_component[i].level>=0)?g_log->log_component[i].level:g_log->log_component[i].savedlevel), + ((g_log->log_component[i].level>=0)?"Y":"N"), + ((g_log->log_component[i].filelog>0)?g_log->log_component[i].filelog_name:"stdout")); } } } if (strcasestr(buf,"logopt") != NULL) { - prnt(" option enabled\n"); + prnt("\n option enabled\n"); for (int i=0; log_options[i].name != NULL; i++) { prnt("%02i %17.17s %10.10s \n",i ,log_options[i].name, ((g_log->flag & log_options[i].value)?"Y":"N") ); } } if (strcasestr(buf,"dbgopt") != NULL) { - prnt(" option debug matlab\n"); + prnt("\n module debug dumpfile\n"); for (int i=0; log_maskmap[i].name != NULL ; i++) { - prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name, + prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name, ((g_log->debug_mask & log_maskmap[i].value)?"Y":"N"), - ((g_log->matlab_mask & log_maskmap[i].value)?"Y":"N") ); + ((g_log->dump_mask & log_maskmap[i].value)?"Y":"N") ); } } if (strcasestr(buf,"config") != NULL) { @@ -335,15 +336,15 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); prnt("Available log levels: \n "); for (int i=0; log_level_names[i].name != NULL; i++) prnt("%s ",log_level_names[i].name); - prnt("\n"); + prnt("\n\n"); prnt("Available display options: \n "); for (int i=0; log_options[i].name != NULL; i++) prnt("%s ",log_options[i].name); - prnt("\n"); - prnt("Available debug or matlab options: \n "); + prnt("\n\n"); + prnt("Available debug and dump options: \n "); for (int i=0; log_maskmap[i].name != NULL; i++) prnt("%s ",log_maskmap[i].name); - prnt("\n"); + prnt("\n\n"); proccmd_show("loglvl",debug,prnt); proccmd_show("logopt",debug,prnt); proccmd_show("dbgopt",debug,prnt); @@ -375,7 +376,7 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); else if (l == 2 && strcmp(logparam,"debug") == 0){ optbit=map_str_to_int(log_maskmap,opt); if (optbit < 0) { - prnt("debug flag %s unknown\n",opt); + prnt("module %s unknown\n",opt); } else { if (idx1 > 0) SET_LOG_DEBUG(optbit); @@ -384,42 +385,51 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); proccmd_show("dbgopt",debug,prnt); } } - else if (l == 2 && strcmp(logparam,"matlab") == 0){ + else if (l == 2 && strcmp(logparam,"dump") == 0){ optbit=map_str_to_int(log_maskmap,opt); if (optbit < 0) { - prnt("matlab flag %s unknown\n",opt); + prnt("module %s unknown\n",opt); } else { if (idx1 > 0) - SET_LOG_MATLAB(optbit); + SET_LOG_DUMP(optbit); else - CLEAR_LOG_MATLAB(optbit); + CLEAR_LOG_DUMP(optbit); proccmd_show("dbgopt",debug,prnt); } } if (logparam != NULL) free(logparam); if (opt != NULL) free(opt); } else if ( s == 3 && logsubcmd != NULL) { - int level, interval; + int level, enable,filelog; char *tmpstr=NULL; char *logparam=NULL; int l; - level = interval = -1; + level = OAILOG_DISABLE - 1; + filelog = -1; + enable=-1; l=sscanf(logsubcmd,"%m[^'_']_%m[^'_']",&logparam,&tmpstr); if (debug > 0) prnt("l=%i, %s %s\n",l,((logparam==NULL)?"\"\"":logparam), ((tmpstr==NULL)?"\"\"":tmpstr)); if (l ==2 ) { if (strcmp(logparam,"level") == 0) { level=map_str_to_int(log_level_names,tmpstr); - if (level < 0) prnt("level %s unknown\n",tmpstr); + if (level < 0) { + prnt("level %s unknown\n",tmpstr); + level=OAILOG_DISABLE - 1; + } } else { prnt("%s%s unknown log sub command \n",logparam, tmpstr); } } else if (l ==1 ) { if (strcmp(logparam,"enable") == 0) { - interval = 1; + enable=1; } else if (strcmp(logparam,"disable") == 0) { - interval = 0; + level=OAILOG_DISABLE; + } else if (strcmp(logparam,"file") == 0) { + filelog = 1 ; + } else if (strcmp(logparam,"nofile") == 0) { + filelog = 0 ; } else { prnt("%s%s unknown log sub command \n",logparam, tmpstr); } @@ -429,20 +439,18 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); if (logparam != NULL) free(logparam); if (tmpstr != NULL) free(tmpstr); for (int i=idx1; i<=idx2 ; i++) { - if (level < 0) { - level=g_log->log_component[i].level; - } - if (interval < 0) { - interval=g_log->log_component[i].interval; - } - set_log(i, level, interval); - prnt("log level comp %i %s set to %s (%s)\n", - i,((g_log->log_component[i].name==NULL)?"":g_log->log_component[i].name), - map_int_to_str(log_level_names,g_log->log_component[i].level), - ((g_log->log_component[i].interval>0)?"enabled":"disabled")); - - - } + if (level >= OAILOG_DISABLE) + set_log(i, level); + else if ( enable == 1) + set_log(i,g_log->log_component[i].savedlevel); + else if ( filelog == 1 ) { + set_component_filelog(i); + } else if ( filelog == 0 ) { + close_component_filelog(i); + } + + } + proccmd_show("loglvl",debug,prnt); } else { prnt("%s: wrong log command...\n",buf); } diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.h b/common/utils/telnetsrv/telnetsrv_proccmd.h index 409484455ce9a9d5c0a7e24717f1964fc04d8947..1a0a8d25dc4006c74f5b9afe3c2b82db94db7e45 100644 --- a/common/utils/telnetsrv/telnetsrv_proccmd.h +++ b/common/utils/telnetsrv/telnetsrv_proccmd.h @@ -48,13 +48,15 @@ telnetshell_vardef_t proc_vardef[] = { show: display current log configuration \n\ online, noonline: enable or disable console logs \n\ enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\ + file, nofile id1-id2: enable or disable redirecting logs to file for components index id1 to id2 \n\ + logfile name depends on component name and is printed in the show command \n\ level_<level> id1-id2: set log level to <level> for components index id1 to id2 \n\ -use the show command to get the authorized values for <level> and the list of component \ -indexes that can be used for id1 and id2 \n\ + use the show command to get the authorized values for \n\ + <level> and the list of component indexes that can be used for id1 and id2 \n\ print_<opt> <0|1> disable or enable the \"opt\" log option, use the show command to get \ -the available options\n\ - matlab_<opt> debug_<func> disable or enable the debug code or matlab file generation \ -for \"func\" function. use the show command to get the available options\n" + the available options\n\ + dump_<mod> debug_<mod > disable or enable the debug file generation or debug code\ + for \"mod\" module. use the show command to get the available modules\n" #define PROCCMD_THREAD_HELP_STRING " thread sub commands: \n\ <thread id> aff <core> : set affinity of thread <thread id> to core <core> \n\ diff --git a/openair1/PHY/CODING/coding_load.c b/openair1/PHY/CODING/coding_load.c index a895d9648ec8530b06a1728bc401a1c7e837335c..30b876c654789db2d68584e420840d47495dfc7d 100644 --- a/openair1/PHY/CODING/coding_load.c +++ b/openair1/PHY/CODING/coding_load.c @@ -130,7 +130,7 @@ int load_codinglib(void) { shlib_fdesc[ENCODE_SSE_FPTRIDX].fname= "threegpplte_turbo_encoder_sse"; shlib_fdesc[ENCODE_C_FPTRIDX].fname= "threegpplte_turbo_encoder"; shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fname= "init_encoder_sse"; - ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR); + ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR,NULL); if (ret < 0) exit_fun("Error loading coding library"); /* execute encoder/decoder init functions */ diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index 25f35ab0828c11b31c38c6d6b73700d4a53064d5..e64eda740ca0a9bd8b73335392373e5728c62da4 100644 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -67,15 +67,12 @@ void generate_qpsk_table(void) void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) { - ccodedot11_init(); - ccodedot11_init_inv(); - ccodelte_init(); ccodelte_init_inv(); + init_dfts(); - phy_generate_viterbi_tables(); phy_generate_viterbi_tables_lte(); load_codinglib(); @@ -86,6 +83,7 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) generate_64qam_table(); generate_16qam_table(); + generate_qpsk_table(); generate_RIV_tables(); init_unscrambling_lut(); diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index cbae84f56b6c1643884468f09fbc52db0df62694..bec08732769d0758332f4231fd3b7b4a2f9da721 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -450,11 +450,11 @@ void phy_config_sib2_eNB(uint8_t Mod_id, } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration fp->MBSFN_config[i].fourFrames_flag = 1; fp->MBSFN_config[i].mbsfn_SubframeConfig = - mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| + mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| - (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); + (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16); - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } } diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c index 62d768a50aeee992662826aff4928d8c5d1e5e08..1ed9e20d602ecc39f4f573f37b83142a5fa60d2d 100644 --- a/openair1/PHY/INIT/lte_init_ue.c +++ b/openair1/PHY/INIT/lte_init_ue.c @@ -165,11 +165,11 @@ void phy_config_sib2_ue(module_id_t Mod_id,int CC_id, } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration fp->MBSFN_config[i].fourFrames_flag = 1; fp->MBSFN_config[i].mbsfn_SubframeConfig = - mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| + mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| - (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); + (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]<<16); - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", i, fp->MBSFN_config[i].mbsfn_SubframeConfig); } } diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index 3b8a26125d43fda03bb8a86f1460277a73bd42a5..03f226c6379098a05a56f92ce286db5a83a9d0bb 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -20,7 +20,7 @@ */ #include "phy_init.h" -#include "log.h" +#include "common/utils/LOG/log.h" uint16_t dl_S_table_normal[10]={3,9,10,11,12,3,9,10,11,6}; uint16_t dl_S_table_extended[10]={3,8,9,10,3,8,9,5,0,0}; diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index 8da34fc51cb9bc9ef43349e3fcf750f37e3afdc4..da4050c84824f8eaf9df4c16b454afa433fbcc9f 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -373,6 +373,8 @@ void phy_config_request(PHY_Config_t *phy_config); int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf); void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms); +void init_dfts(void); + /** @} */ #endif diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index e268a5b061c0e06031681909be23cfbb4acc87cd..516cb32999b505aa08f1e36c2c23a1d08c747288 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -61,8 +61,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; - Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; + Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<1)]; + Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<1)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -81,7 +81,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, // do not filter to have proactive timing adjustment max_pos_fil = max_pos; - if(subframe == 6) + if(subframe == 5) { diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_ue.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_ue.c index 732db1fa4e533998a83ede51735111520df19042..c912c8893482c1c00c47b73128a0e7de5b73a052 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_ue.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_ue.c @@ -62,8 +62,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { - Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; - Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; + Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<1)]; + Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<1)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -82,7 +82,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, // do not filter to have proactive timing adjustment max_pos_fil = max_pos; - if(subframe == 6) + if(subframe == 5) { diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index ae33722c90dea75f86bf7bb43cd34f4d21f07c42..87abdfe19cb67567344ec6507b807290c8a2e33e 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -274,11 +274,11 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com -LOG_M_BEGIN(DEBUG_LTEESTIM); - LOG_M("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); - LOG_M("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); - LOG_M("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); -LOG_M_END + if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){ + LOG_M("primary_sync0.m","psync0",primary_synch0_time,frame_parms->ofdm_symbol_size,1,1); + LOG_M("primary_sync1.m","psync1",primary_synch1_time,frame_parms->ofdm_symbol_size,1,1); + LOG_M("primary_sync2.m","psync2",primary_synch2_time,frame_parms->ofdm_symbol_size,1,1); + } return (1); } @@ -460,18 +460,18 @@ int lte_sync_time(int **rxdata, ///rx data in time domain LOG_I(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2); -LOG_M_BEGIN(DEBUG_LTEESTIM) -static int debug_cnt; - if (debug_cnt == 0) { - LOG_M("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2); - LOG_M("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2); - LOG_M("sync_corr2_ue.m","synccorr2",sync_corr_ue2,2*length,1,2); - LOG_M("rxdata0.m","rxd0",rxdata[0],length<<1,1,1); - // exit(-1); - } else { + if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){ + static int debug_cnt; + if (debug_cnt == 0) { + LOG_M("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2); + LOG_M("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2); + LOG_M("sync_corr2_ue.m","synccorr2",sync_corr_ue2,2*length,1,2); + LOG_M("rxdata0.m","rxd0",rxdata[0],length<<1,1,1); + // exit(-1); + } else { debug_cnt++; } -LOG_M_END +} return(peak_pos); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index e8225aa1fd2b9299875cb17e2287c56ab2b08903..de48a855df6b5814b569cc3d5fcc15f24e28e434 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -81,7 +81,7 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq) //compute frequency-domain representation of 6144-sample chunk dft6144((int16_t *)rxp, - sp); + sp,1); /* diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index bf228021452834bb65f3dddf8bfa3a168b367c95..2e4f3e60361eeb564e376435a34fcd8b9443982c 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -23,7 +23,7 @@ #include "PHY/defs_UE.h" #include "PHY/phy_extern_ue.h" -#include "log.h" +#include "common/utils/LOG/log.h" #include "PHY/sse_intrin.h" //#define k1 1000 diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index 1eabfd6c367afa38701d6d82b7f0514d0e8339a2..284a22e2e62567eb1444cca3c410dfcb8dab2251 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -25,9 +25,9 @@ #include "PHY/defs_eNB.h" #include "PHY/defs_UE.h" #include "PHY/impl_defs_top.h" - +#include "common/utils/LOG/log.h" //extern unsigned int lte_gold_table[3][20][2][14]; -//#define DEBUG_DL_CELL_SPEC + @@ -64,7 +64,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB, else if ((p==1) && (l>0)) nu = 0; else { - printf("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l); + LOG_E(PHY,"lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l); return(-1); } @@ -85,19 +85,19 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB, // this is r_mprime from 3GPP 36-211 6.10.1.2 output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; -#ifdef DEBUG_DL_CELL_SPEC - printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); -#endif + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { + LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", + Ns,l,m,mprime_dword,mprime_qpsk_symb); + LOG_I(PHY,"index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + } mprime++; -#ifdef DEBUG_DL_CELL_SPEC + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { if (m<4) - printf("Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); + LOG_I(PHY,"Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); -#endif + } k+=6;//b if (k >= eNB->frame_parms.ofdm_symbol_size) { @@ -105,7 +105,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB, k-=eNB->frame_parms.ofdm_symbol_size; } - // printf("** k %d\n",k); + // LOG_I(PHY,"** k %d\n",k); } return(0); @@ -143,7 +143,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *eNB, else if ((p==1) && (l>0)) nu = 0; else { - printf("lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l); + LOG_E(PHY,"lte_dl_cell_spec: p %d, l %d -> ERROR\n",p,l); return(-1); } @@ -168,27 +168,24 @@ int lte_dl_cell_spec(PHY_VARS_eNB *eNB, // this is r_mprime from 3GPP 36-211 6.10.1.2 output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; -#ifdef DEBUG_DL_CELL_SPEC - printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); -#endif - + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { + LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", + Ns,l,m,mprime_dword,mprime_qpsk_symb); + LOG_I(PHY,"index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + } mprime++; -#ifdef DEBUG_DL_CELL_SPEC - - if (m<4) - printf("Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { + if (m<4) + LOG_I(PHY,"Ns %d, l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); + } -#endif k+=6; - if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier k-=eNB->frame_parms.ofdm_symbol_size; } - // printf("** k %d\n",k); + // LOG_I(PHY,"** k %d\n",k); } return(0); @@ -231,21 +228,21 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *ue, // this is r_mprime from 3GPP 36-211 6.10.1.2 output[k] = qpsk[(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; -#ifdef DEBUG_DL_CELL_SPEC - printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); -#endif + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { + LOG_I(PHY,"Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", + Ns,l,m,mprime_dword,mprime_qpsk_symb); + LOG_I(PHY,"index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + } mprime++; -#ifdef DEBUG_DL_CELL_SPEC + if (LOG_DEBUGFLAG(DEBUG_DLCELLSPEC)) { - if (m<4) - printf("Ns %d l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); + if (m<4) + LOG_I(PHY,"Ns %d l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); -#endif - k++; - // printf("** k %d\n",k); + } + k++; + // LOG_I(PHY,"** k %d\n",k); } return(0); diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index 2c5240e14329452b2c294c8e8bde8b994278531c..1b9c17133c050dceea97d78391659003db3f30d0 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -36,7 +36,7 @@ #include "lte_refsig.h" #include "PHY/defs_eNB.h" #include "PHY/defs_UE.h" -#include "log.h" +#include "common/utils/LOG/log.h" #include "PHY/impl_defs_top.h" //extern unsigned int lte_gold_table[3][20][2][14]; diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 14def309b7bdb11043ef66712b0828d5546898d6..69dbb705db8fd4cd85f215f50a63949f5fb88ed1 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -54,9 +54,9 @@ void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_tabl for (l=0; l<3; l++) { if (l==0) - x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + 2 + (7*(1+(sfn>>1)))))<<9); //cinit + x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + 2 + (7*(1+(sfn<<1)))))<<9); //cinit else - x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + ((l-1)<<2) + (7*(2+(sfn>>1)))))<<9); //cinit + x2 = (Nid_mbsfn) + (((1+(Nid_mbsfn<<1))*(1 + ((l-1)<<2) + (7*(2+(sfn<<1)))))<<9); //cinit //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit //n = 0 diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 1c015b1c84452beb7f0f9d0f3c3b0ec2fe43d51b..520488664d26289952564d1c1a75b15fbc8c01a0 100755 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -346,6 +346,13 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols, y[0] = &yseq0[0]; y[1] = &yseq1[0]; +#if BASIC_SIMULATOR + /* this should be the normal case + * but it has to be validated for all the various cases + * so let's just do it for the basic simulator + */ + memset(e, 2, DCI_BITS_MAX); +#else #if 1 // reset all bits to <NIL>, here we set <NIL> elements as 2 // memset(e, 2, DCI_BITS_MAX); @@ -358,6 +365,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols, * (not sure about this, to be checked somehow) */ //memset(e, 0, DCI_BITS_MAX); +#endif /* BASIC_SIMULATOR */ e_ptr = e; diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index c3a309a424f9c422e62045e400d1812323de56b3..c33d9efe63b35dba960f5c9412fac2e607bd2d4e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -220,7 +220,7 @@ void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_a break; } - LOG_I(PHY,"%d.%d: DCI 1A: rnti %x, PDCCH order to do PRACH\n", + LOG_T(PHY,"%d.%d: DCI 1A: rnti %x, PDCCH order to do PRACH\n", proc->frame_tx, proc->subframe_tx, rel8->rnti); } @@ -1791,7 +1791,7 @@ void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, #ifdef T_TRACER T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), - T_INT(pdu->dci_pdu_rel8.rnti), T_INT(((frame*10+subframe+4) % 8) /* TODO: correct harq pid */), + T_INT(pdu->dci_pdu_rel8.rnti), T_INT(pdu->dci_pdu_rel8.harq_pid), T_INT(mcs), T_INT(-1 /* TODO: remove round? */), T_INT(pdu->dci_pdu_rel8.resource_block_start), T_INT(pdu->dci_pdu_rel8.number_of_resource_block), diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index f29668332040cf94c48120af2d2276dfca0f5137..a766bb82023df5caddfea8982a68a5812c8cca20 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -511,16 +511,15 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, proc->tep[i].total_worker = worker_num; proc->tep[i].current_worker = i; if (pthread_cond_signal(&proc->tep[i].cond_te) != 0) { - printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); - exit_fun( "ERROR pthread_cond_signal" ); - return (-1); + printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (-1); } } } // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // outputs for each code segment, see Section 5.1.5 p.20 - for (r=0,r_offset=0; r<dlsch->harq_processes[harq_pid]->C; r++) { // get information for E for the segments that are handled by the worker thread diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index d42d5c9ac5764e8ae980eec45cbbedccd4e48367..bfdcdc1e94694f0f549e3ed885db322baef8bd2f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -39,7 +39,7 @@ #include "PHY/LTE_TRANSPORT/transport_proto.h" #include "PHY/LTE_TRANSPORT/transport_common_proto.h" //#define DEBUG_DLSCH_MODULATION -#define NEW_ALLOC_RE +//#define NEW_ALLOC_RE //#define is_not_pilot(pilots,re,nushift,use2ndpilots) ((pilots==0) || ((re!=nushift) && (re!=nushift+6)&&((re!=nushift+3)||(use2ndpilots==1))&&((re!=nushift+9)||(use2ndpilots==1)))?1:0) @@ -165,10 +165,19 @@ int allocate_REs_in_RB_no_pilots_QPSK_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re,last_re; + + last_re=12; + first_re=0; + if (skip_half==1) + last_re=6; + else if (skip_half==2) + first_re=6; + re=first_re; if (skip_dc == 0) { - for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; - re<12; + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; + re<last_re; re++,x0p+=2,tti_offset++) { qpsk_table_offset_re=x0p[0]; @@ -199,8 +208,16 @@ int allocate_REs_in_RB_no_pilots_QPSK_siso(PHY_VARS_eNB* phy_vars_eNB, ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qpsk_table_offset_im]; } } - *re_allocated = *re_allocated + 12; - *jj=*jj + 24; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 6; + *jj=*jj + 12; + } + else + { + *re_allocated = *re_allocated + 12; + *jj=*jj + 24; + } return(0); } @@ -238,12 +255,20 @@ int allocate_REs_in_RB_pilots_QPSK_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re,last_re; + last_re=12; + first_re=0; + if (skip_half==1) + last_re=6; + else if (skip_half==2) + first_re=6; + re=first_re+P1_SHIFT[0]; if (skip_dc == 0) { // printf("pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); - for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; - re<12; + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; + re<last_re; x0p+=2) { qpsk_table_offset_re=x0p[0]; @@ -260,8 +285,8 @@ int allocate_REs_in_RB_pilots_QPSK_siso(PHY_VARS_eNB* phy_vars_eNB, re<6; x0p+=2) { - qpsk_table_offset_re+=x0p[0]; - qpsk_table_offset_im+=x0p[1]; + qpsk_table_offset_re=x0p[0]; + qpsk_table_offset_im=x0p[1]; ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qpsk_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qpsk_table_offset_im]; tti_offset+=P1_SHIFT[re+1]; @@ -272,16 +297,24 @@ int allocate_REs_in_RB_pilots_QPSK_siso(PHY_VARS_eNB* phy_vars_eNB, re<12; x0p+=2) { - qpsk_table_offset_re+=x0p[0]; - qpsk_table_offset_im+=x0p[1]; + qpsk_table_offset_re=x0p[0]; + qpsk_table_offset_im=x0p[1]; ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qpsk_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qpsk_table_offset_im]; tti_offset+=P1_SHIFT[re+1]; re+=P1_SHIFT[re+1]; } } - *re_allocated = *re_allocated + 10; - *jj=*jj + 20; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 5; + *jj=*jj + 10; + } + else + { + *re_allocated = *re_allocated + 10; + *jj=*jj + 20; + } return(0); } @@ -317,10 +350,19 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re,last_re; + + last_re=12; + first_re=0; + if (skip_half==1) + last_re=6; + else if (skip_half==2) + first_re=6; + re=first_re; if (skip_dc == 0) { - for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; - re<12; + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; + re<last_re; re++,x0p+=4,tti_offset++) { qam16_table_offset_re=TWO[x0p[0]]; @@ -357,8 +399,16 @@ int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; } } - *re_allocated = *re_allocated + 12; - *jj=*jj + 48; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 6; + *jj=*jj + 24; + } + else + { + *re_allocated = *re_allocated + 12; + *jj=*jj + 48; + } return(0); } @@ -396,12 +446,21 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re,last_re; + + last_re=12; + first_re=0; + if (skip_half==1) + last_re=6; + else if (skip_half==2) + first_re=6; + re=first_re+P1_SHIFT[0]; if (skip_dc == 0) { // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); - for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; - re<12; + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; + re<last_re; x0p+=4) { qam16_table_offset_re=TWO[x0p[0]]; @@ -444,8 +503,16 @@ int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, re+=P1_SHIFT[re+1]; } } - *re_allocated = *re_allocated + 10; - *jj=*jj + 40; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 5; + *jj=*jj + 20; + } + else + { + *re_allocated = *re_allocated + 10; + *jj=*jj + 40; + } return(0); } @@ -482,10 +549,16 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re; + + first_re=0; + if (skip_half==2) + first_re=6; + re=first_re; if (skip_dc == 0) { - x0p=&x0[*jj],tti_offset=symbol_offset+re_offset; + x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; /* for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; re<12; @@ -521,36 +594,38 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, ((int16_t *)&txdataF[0][tti_offset])[10]=qam_table_s0[qam64_table_offset_re]; ((int16_t *)&txdataF[0][tti_offset])[11]=qam_table_s0[qam64_table_offset_im]; - qam64_table_offset_re=(x0p[36]<<2)|(x0p[38]<<1)|x0p[40]; - qam64_table_offset_im=(x0p[37]<<2)|(x0p[39]<<1)|x0p[41]; - ((int16_t *)&txdataF[0][tti_offset])[12]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[13]=qam_table_s0[qam64_table_offset_im]; - - qam64_table_offset_re=(x0p[42]<<2)|(x0p[44]<<1)|x0p[46]; - qam64_table_offset_im=(x0p[43]<<2)|(x0p[45]<<1)|x0p[47]; - ((int16_t *)&txdataF[0][tti_offset])[14]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[15]=qam_table_s0[qam64_table_offset_im]; - - qam64_table_offset_re=(x0p[48]<<2)|(x0p[50]<<1)|x0p[52]; - qam64_table_offset_im=(x0p[49]<<2)|(x0p[51]<<1)|x0p[53]; - ((int16_t *)&txdataF[0][tti_offset])[16]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[17]=qam_table_s0[qam64_table_offset_im]; - - qam64_table_offset_re=(x0p[54]<<2)|(x0p[56]<<1)|x0p[58]; - qam64_table_offset_im=(x0p[55]<<2)|(x0p[57]<<1)|x0p[59]; - ((int16_t *)&txdataF[0][tti_offset])[18]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[19]=qam_table_s0[qam64_table_offset_im]; - - qam64_table_offset_re=(x0p[60]<<2)|(x0p[62]<<1)|x0p[64]; - qam64_table_offset_im=(x0p[61]<<2)|(x0p[63]<<1)|x0p[65]; - ((int16_t *)&txdataF[0][tti_offset])[20]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[21]=qam_table_s0[qam64_table_offset_im]; - - qam64_table_offset_re=(x0p[66]<<2)|(x0p[68]<<1)|x0p[70]; - qam64_table_offset_im=(x0p[67]<<2)|(x0p[69]<<1)|x0p[71]; - ((int16_t *)&txdataF[0][tti_offset])[22]=qam_table_s0[qam64_table_offset_re]; - ((int16_t *)&txdataF[0][tti_offset])[23]=qam_table_s0[qam64_table_offset_im]; - + if(skip_half==0) + { + qam64_table_offset_re=(x0p[36]<<2)|(x0p[38]<<1)|x0p[40]; + qam64_table_offset_im=(x0p[37]<<2)|(x0p[39]<<1)|x0p[41]; + ((int16_t *)&txdataF[0][tti_offset])[12]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[13]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[42]<<2)|(x0p[44]<<1)|x0p[46]; + qam64_table_offset_im=(x0p[43]<<2)|(x0p[45]<<1)|x0p[47]; + ((int16_t *)&txdataF[0][tti_offset])[14]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[15]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[48]<<2)|(x0p[50]<<1)|x0p[52]; + qam64_table_offset_im=(x0p[49]<<2)|(x0p[51]<<1)|x0p[53]; + ((int16_t *)&txdataF[0][tti_offset])[16]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[17]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[54]<<2)|(x0p[56]<<1)|x0p[58]; + qam64_table_offset_im=(x0p[55]<<2)|(x0p[57]<<1)|x0p[59]; + ((int16_t *)&txdataF[0][tti_offset])[18]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[19]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[60]<<2)|(x0p[62]<<1)|x0p[64]; + qam64_table_offset_im=(x0p[61]<<2)|(x0p[63]<<1)|x0p[65]; + ((int16_t *)&txdataF[0][tti_offset])[20]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[21]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[66]<<2)|(x0p[68]<<1)|x0p[70]; + qam64_table_offset_im=(x0p[67]<<2)|(x0p[69]<<1)|x0p[71]; + ((int16_t *)&txdataF[0][tti_offset])[22]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[23]=qam_table_s0[qam64_table_offset_im]; + } // } } @@ -584,8 +659,16 @@ int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, } } - *re_allocated = *re_allocated + 12; - *jj=*jj + 72; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 6; + *jj=*jj + 36; + } + else + { + *re_allocated = *re_allocated + 12; + *jj=*jj + 72; + } return(0); } @@ -623,12 +706,21 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, uint32_t tti_offset; uint8_t re; uint8_t *x0p; + uint8_t first_re,last_re; + + last_re=12; + first_re=0; + if (skip_half==1) + last_re=6; + else if (skip_half==2) + first_re=6; + re=first_re+P1_SHIFT[0]; if (skip_dc == 0) { // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); - for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; - re<12; + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+re; + re<last_re; x0p+=6) { qam64_table_offset_re=FOUR[x0p[0]]; @@ -677,8 +769,16 @@ int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, re+=P1_SHIFT[re+1]; } } - *re_allocated = *re_allocated + 10; - *jj=*jj + 60; + if(skip_half!=0) + { + *re_allocated = *re_allocated + 5; + *jj=*jj + 30; + } + else + { + *re_allocated = *re_allocated + 10; + *jj=*jj + 60; + } return(0); } @@ -706,6 +806,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, int *P2_SHIFT) { + uint8_t *x0 = NULL; MIMO_mode_t mimo_mode = -1; @@ -2099,10 +2200,33 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, uint8_t mod_order0 = 0; uint8_t mod_order1 = 0; int16_t amp_rho_a, amp_rho_b; - int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8];//qpsk_table_a0[2],qpsk_table_b0[2] - int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8];//qpsk_table_a1[2],qpsk_table_b1[2] + int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8],qpsk_table_a0[2],qpsk_table_b0[2]; + int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8],qpsk_table_a1[2],qpsk_table_b1[2]; int16_t *qam_table_s0=NULL,*qam_table_s1=NULL; + int (*allocate_REs)(PHY_VARS_eNB*, + int **, + uint32_t*, + uint32_t*, + uint16_t, + uint32_t, + LTE_DL_eNB_HARQ_t *, + LTE_DL_eNB_HARQ_t *, + uint8_t, + int16_t, + uint8_t, + int16_t *, + int16_t *, + uint32_t *, + uint8_t, + uint8_t, + uint8_t, + uint8_t, + uint8_t, + int *, + int *); + + int P1_SHIFT[13],P2_SHIFT[13]; int offset,nushiftmod3; @@ -2201,7 +2325,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, amp_rho_b = (int16_t)(((int32_t)amp*dlsch1->sqrt_rho_b)>>13); } - /*if(mod_order0 == 2) + if(mod_order0 == 2) { for(i=0;i<2;i++) { @@ -2209,7 +2333,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, qpsk_table_b0[i] = (int16_t)(((int32_t)qpsk_table[i]*amp_rho_b)>>15); } } - else*/ if (mod_order0 == 4) + else if (mod_order0 == 4) for (i=0;i<4; i++) { qam16_table_a0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); qam16_table_b0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); @@ -2220,14 +2344,14 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, qam64_table_b0[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15); } - /*if (mod_order1 == 2) + if (mod_order1 == 2) { for (i=0; i<2; i++) { qpsk_table_a1[i] = (int16_t)(((int32_t)qpsk_table[i]*amp_rho_a)>>15); qpsk_table_b1[i] = (int16_t)(((int32_t)qpsk_table[i]*amp_rho_b)>>15); } } - else*/ if (mod_order1 == 4) + else if (mod_order1 == 4) for (i=0; i<4; i++) { qam16_table_a1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); qam16_table_b1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); @@ -2348,24 +2472,36 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, re_offset = frame_parms->first_carrier_offset; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb)); + allocate_REs = allocate_REs_in_RB; switch (mod_order0) { case 2: qam_table_s0 = NULL; - /*if (pilots) { + if (pilots) { qam_table_s0 = qpsk_table_b0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_QPSK_siso : + allocate_REs_in_RB; } else { qam_table_s0 = qpsk_table_a0; - - }*/ + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_QPSK_siso : + allocate_REs_in_RB; + } break; case 4: if (pilots) { qam_table_s0 = qam16_table_b0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_16QAM_siso : + allocate_REs_in_RB; } else { qam_table_s0 = qam16_table_a0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_16QAM_siso : + allocate_REs_in_RB; } break; @@ -2373,23 +2509,42 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, case 6: if (pilots) { qam_table_s0 = qam64_table_b0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_64QAM_siso : + allocate_REs_in_RB; } else { qam_table_s0 = qam64_table_a0; + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_64QAM_siso : + allocate_REs_in_RB; } + /* TODO: this is a quick hack to be removed. There is a problem + * with above code that needs to be analyzed and fixed. In the + * meantime, let's use the generic function. + */ + //allocate_REs = allocate_REs_in_RB; break; } + /* TODO: hack, to be removed. The power is too different from + * previous version. Some more work/validation is needed before + * we switch to the new version. + */ + //if (frame_parms->N_RB_DL==25) + //allocate_REs = allocate_REs_in_RB; + switch (mod_order1) { case 2: qam_table_s1 = NULL; - /*if (pilots) { + allocate_REs = allocate_REs_in_RB; + if (pilots) { qam_table_s1 = qpsk_table_b1; } else { qam_table_s1 = qpsk_table_a1; - }*/ + } break; case 4: if (pilots) { @@ -2432,8 +2587,6 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb); skip_dc = check_skip_dc(rb,frame_parms); - - if (dlsch0) { if (dlsch0_harq->Nlayers>1) { LOG_E(PHY,"Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); @@ -2465,7 +2618,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, rb); - allocate_REs_in_RB(phy_vars_eNB, + allocate_REs(phy_vars_eNB, txdataF, &jj, &jj2, diff --git a/openair1/PHY/LTE_TRANSPORT/pmch_common.c b/openair1/PHY/LTE_TRANSPORT/pmch_common.c index 1d12c79621ea403c93c1eaa6389da0fa5065aa8c..a4821a420ff27f87731c6b737d515598e5758343 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch_common.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch_common.c @@ -27,6 +27,7 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par uint32_t period; uint8_t i; + uint8_t j; // LOG_D(PHY,"is_pmch_subframe: frame %d, subframe %d, num_MBSFN_config %d\n", // frame,subframe,frame_parms->num_MBSFN_config); @@ -34,8 +35,8 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par for (i=0; i<frame_parms->num_MBSFN_config; i++) { // we have at least one MBSFN configuration period = 1<<frame_parms->MBSFN_config[i].radioframeAllocationPeriod; - if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) { - if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) { + if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) { + if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) { if (frame_parms->frame_type == FDD) { switch (subframe) { @@ -108,9 +109,96 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par break; } } + } + + } else { // handle 4 frames case + + for(j=0;j<4;j++) { + if ((frame % period) == (frame_parms->MBSFN_config[i].radioframeAllocationOffset + j)) { + if (frame_parms->frame_type == FDD) { + switch (subframe) { + case 1: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x800000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x800000>>(j*6)); + return(1); + } + + break; + + case 2: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x400000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x400000>>(j*6)); + return(1); + } + + break; + + case 3: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x200000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x200000>>(j*6)); + return(1); + } + + break; + + case 6: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x100000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x100000>>(j*6)); + return(1); + } + + break; + + case 7: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x80000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x80000>>(j*6)); + return(1); + } + + break; - } else { // handle 4 frames case + case 8: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig) & (0x40000>>(j*6))) > 0) { + //LOG_E(PHY,"SubframeConfig<<6(%x),MBSFN_FDD_SF1(%x)\n",frame_parms->MBSFN_config[i].mbsfn_SubframeConfig,0x40000>>(j*6)); + return(1); + } + break; + } + } else { + switch (subframe) { + case 3: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF3) > 0) + return(1); + + break; + + case 4: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF4) > 0) + return(1); + + break; + + case 7: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF7) > 0) + return(1); + + break; + + case 8: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF8) > 0) + return(1); + + break; + + case 9: + if (((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig>>j*6) & MBSFN_TDD_SF9) > 0) + return(1); + + break; + } + } + } } } } diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 07d1267def271a09e4416b0237da6ce44db26a2f..ec0b7db4ad7d003398dfddd842f935f6639b0743 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -153,25 +153,24 @@ void rx_prach0(PHY_VARS_eNB *eNB, subframe = eNB->proc.subframe_prach_br; prachF = eNB->prach_vars_br.prachF; rxsigF = eNB->prach_vars_br.rxsigF[ce_level]; -LOG_DEBUG_BEGIN(PRACH) - if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n", - br_flag,ce_level,ru->proc.frame_prach,subframe, - fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], - prach_ConfigIndex,rootSequenceIndex, - eNB->prach_vars_br.repetition_number[ce_level], - fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level]); -LOG_DEBUG_END - } - else + if (LOG_DEBUGFLAG(PRACH)){ + if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n", + br_flag,ce_level,ru->proc.frame_prach,subframe, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], + prach_ConfigIndex,rootSequenceIndex, + eNB->prach_vars_br.repetition_number[ce_level], + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level]); + } + } else #endif { prach_ifftp = eNB->prach_vars.prach_ifft[0]; subframe = eNB->proc.subframe_prach; prachF = eNB->prach_vars.prachF; rxsigF = eNB->prach_vars.rxsigF[0]; -LOG_DEBUG_BEGIN(PRACH) - if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)){ + if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex); + } } } else { @@ -179,20 +178,19 @@ LOG_DEBUG_END if (br_flag == 1) { subframe = ru->proc.subframe_prach_br; rxsigF = ru->prach_rxsigF_br[ce_level]; -LOG_DEBUG_BEGIN(PRACH) - if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", - br_flag,ce_level,ru->proc.frame_prach,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex); -LOG_DEBUG_END - } - else + if (LOG_DEBUGFLAG(PRACH)){ + if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", + br_flag,ce_level,ru->proc.frame_prach,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex); + } + } else #endif { subframe = ru->proc.subframe_prach; rxsigF = ru->prach_rxsigF; -LOG_DEBUG_BEGIN(PRACH) - if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", - subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)){ + if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", + subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex); + } } } @@ -204,27 +202,25 @@ LOG_DEBUG_END // DJP - indexing below in subframe zero takes us off the beginning of the array??? prach[aa] = (int16_t*)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset]; -LOG_M_BEGIN(PRACH) - int32_t en0=signal_energy((int32_t*)prach[aa],fp->samples_per_tti); - int8_t dbEn0 = dB_fixed(en0); - int8_t rach_dBm = dbEn0 - ru->rx_total_gain_dB; - char buffer[80]; - if (dbEn0>32 && prach[0]!= NULL) - { - static int counter=0; - sprintf(buffer, "%s%d", "/tmp/prach_rx",counter); - LOG_M(buffer,"prach_rx",prach[0],fp->samples_per_tti,1,13); - } - if (dB_fixed(en0)>32) - { - sprintf(buffer, "rach_dBm:%d",rach_dBm); - if (prach[0]!= NULL) LOG_M("prach_rx","prach_rx",prach[0],fp->samples_per_tti,1,1); - LOG_I(PHY,"RU %d, br_flag %d ce_level %d frame %d subframe %d per_tti:%d prach:%p (energy %d) TA:%d %s rxdata:%p index:%d\n", - ru->idx,br_flag,ce_level,ru->proc.frame_prach,subframe,fp->samples_per_tti, - prach[aa],dbEn0,ru->N_TA_offset,buffer,ru->common.rxdata[aa], - (subframe*fp->samples_per_tti)-ru->N_TA_offset); + if (LOG_DUMPFLAG(PRACH)){ + int32_t en0=signal_energy((int32_t*)prach[aa],fp->samples_per_tti); + int8_t dbEn0 = dB_fixed(en0); + int8_t rach_dBm = dbEn0 - ru->rx_total_gain_dB; + char buffer[80]; + if (dbEn0>32 && prach[0]!= NULL) { + static int counter=0; + sprintf(buffer, "%s%d", "/tmp/prach_rx",counter); + LOG_M(buffer,"prach_rx",prach[0],fp->samples_per_tti,1,13); + } + if (dB_fixed(en0)>32) { + sprintf(buffer, "rach_dBm:%d",rach_dBm); + if (prach[0]!= NULL) LOG_M("prach_rx","prach_rx",prach[0],fp->samples_per_tti,1,1); + LOG_I(PHY,"RU %d, br_flag %d ce_level %d frame %d subframe %d per_tti:%d prach:%p (energy %d) TA:%d %s rxdata:%p index:%d\n", + ru->idx,br_flag,ce_level,ru->proc.frame_prach,subframe,fp->samples_per_tti, + prach[aa],dbEn0,ru->N_TA_offset,buffer,ru->common.rxdata[aa], + (subframe*fp->samples_per_tti)-ru->N_TA_offset); } -LOG_M_END + } } } @@ -306,9 +302,9 @@ LOG_M_END if (((eNB!=NULL) && (ru->function != NGFI_RAU_IF4p5))|| ((eNB==NULL) && (ru->function == NGFI_RRU_IF4p5))) { // compute the DFTs of the PRACH temporal resources // Do forward transform -LOG_DEBUG_BEGIN(PRACH) - LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d nb_rx:%d Ncp:%d\n",fp->N_RB_UL, nb_rx, Ncp); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)) { + LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d nb_rx:%d Ncp:%d\n",fp->N_RB_UL, nb_rx, Ncp); + } for (aa=0; aa<nb_rx; aa++) { AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa); prach2 = prach[aa] + (Ncp<<1); @@ -331,10 +327,10 @@ LOG_DEBUG_END if (prach_fmt == 4) { dft256(prach2,rxsigF[aa],1); } else { - dft3072(prach2,rxsigF[aa]); + dft3072(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft3072(prach2+6144,rxsigF[aa]+6144); + dft3072(prach2+6144,rxsigF[aa]+6144,1); } break; @@ -345,10 +341,10 @@ LOG_DEBUG_END dft1024(prach2,rxsigF[aa],1); fft_size = 1024; } else { - dft6144(prach2,rxsigF[aa]); + dft6144(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft6144(prach2+12288,rxsigF[aa]+12288); + dft6144(prach2+12288,rxsigF[aa]+12288,1); fft_size = 6144; } @@ -359,22 +355,22 @@ LOG_DEBUG_END if (prach_fmt == 4) { dft2048(prach2,rxsigF[aa],1); } else { - dft12288(prach2,rxsigF[aa]); + dft12288(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft12288(prach2+24576,rxsigF[aa]+24576); + dft12288(prach2+24576,rxsigF[aa]+24576,1); } break; case 75: if (prach_fmt == 4) { - dft3072(prach2,rxsigF[aa]); + dft3072(prach2,rxsigF[aa],1); } else { - dft18432(prach2,rxsigF[aa]); + dft18432(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft18432(prach2+36864,rxsigF[aa]+36864); + dft18432(prach2+36864,rxsigF[aa]+36864,1); } break; @@ -384,19 +380,19 @@ LOG_DEBUG_END if (prach_fmt == 4) { dft4096(prach2,rxsigF[aa],1); } else { - dft24576(prach2,rxsigF[aa]); + dft24576(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft24576(prach2+49152,rxsigF[aa]+49152); + dft24576(prach2+49152,rxsigF[aa]+49152,1); } } else { if (prach_fmt == 4) { - dft3072(prach2,rxsigF[aa]); + dft3072(prach2,rxsigF[aa],1); } else { - dft18432(prach2,rxsigF[aa]); + dft18432(prach2,rxsigF[aa],1); if (prach_fmt>1) - dft18432(prach2+36864,rxsigF[aa]+36864); + dft18432(prach2+36864,rxsigF[aa]+36864,1); } } @@ -439,10 +435,10 @@ LOG_DEBUG_END return; } else if (eNB!=NULL) { -LOG_DEBUG_BEGIN(PRACH) - int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); - if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(PRACH)) { + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en); + } } // in case of RAU and prach received rx_thread wakes up prach @@ -477,10 +473,10 @@ LOG_DEBUG_END *max_preamble_energy=0; for (preamble_index=0 ; preamble_index<64 ; preamble_index++) { -LOG_DEBUG_BEGIN(PRACH) - int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); - if (en>60) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",ru->proc.frame_prach,subframe,preamble_index,br_flag); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)){ + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if (en>60) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",ru->proc.frame_prach,subframe,preamble_index,br_flag); + } if (restricted_set == 0) { // This is the relative offset in the root sequence table (5.7.2-4 from 36.211) for the given preamble index preamble_offset = ((NCS==0)? preamble_index : (preamble_index/(N_ZC/NCS))); @@ -563,11 +559,11 @@ LOG_DEBUG_END } // Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex -LOG_DEBUG_BEGIN(PRACH) - int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); - if (en>60) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n", - ru->proc.frame_prach,subframe,preamble_index,preamble_offset,preamble_shift,br_flag,en); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)) { + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if (en>60) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n", + ru->proc.frame_prach,subframe,preamble_index,preamble_offset,preamble_shift,br_flag,en); + } log2_ifft_size = 10; fft_size = 6144; @@ -589,13 +585,13 @@ LOG_DEBUG_END } memset(prachF, 0, sizeof(int16_t)*2*1024 ); -LOG_M_BEGIN(PRACH) - if (prach[0]!= NULL) LOG_M("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); - LOG_M("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); - LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); - LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); -LOG_M_END - + if (LOG_DUMPFLAG(PRACH)) { + if (prach[0]!= NULL) LOG_M("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); + LOG_M("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); + LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); + LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); + } + for (aa=0;aa<nb_rx; aa++) { // Do componentwise product with Xu* on each antenna @@ -623,10 +619,10 @@ LOG_M_END prach_ifft[i] += (prach_ifft_tmp[i<<1]*prach_ifft_tmp[(i<<1)] + prach_ifft_tmp[1+(i<<1)]*prach_ifft_tmp[1+(i<<1)])>>10; } -LOG_M_BEGIN(PRACH) - if (aa==0) LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); - if (aa==1) LOG_M("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); -LOG_M_END + if (LOG_DUMPFLAG(PRACH)) { + if (aa==0) LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + if (aa==1) LOG_M("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); + } }// antennas_rx } // new dft @@ -637,10 +633,10 @@ LOG_M_END eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) #endif { -LOG_DEBUG_BEGIN(PRACH) + if (LOG_DEBUGFLAG(PRACH)){ int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); if (en>60) LOG_I(PHY,"frame %d, subframe %d: Checking for peak in time-domain (br_flag %d, en %d)\n",ru->proc.frame_prach,subframe,br_flag,en); -LOG_DEBUG_END + } preamble_shift2 = ((preamble_shift==0) ? 0 : ((preamble_shift<<log2_ifft_size)/N_ZC)); @@ -652,44 +648,48 @@ LOG_DEBUG_END *max_preamble_energy = levdB; *max_preamble_delay = ((i*fft_size)>>log2_ifft_size)*update_TA/update_TA2; *max_preamble = preamble_index; -LOG_DEBUG_BEGIN(PRACH) - int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); - if ((en>60) && (br_flag==1)) LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",ru->proc.frame_prach,subframe,*max_preamble_energy,*max_preamble_delay,*max_preamble,br_flag,ce_level,levdB,lev); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(PRACH)){ + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if ((en>60) && (br_flag==1)) + LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n", + ru->proc.frame_prach,subframe, + *max_preamble_energy,*max_preamble_delay, + *max_preamble,br_flag,ce_level,levdB,lev); + } } } } }// preamble_index -LOG_M_BEGIN(PRACH) - int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); - if (en>60) { - k = (12*n_ra_prb) - 6*fp->N_RB_UL; - - if (k<0) k+=fp->ofdm_symbol_size; - - k*=12; - k+=13; - k*=2; - - if (br_flag == 0) { - LOG_M("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); - LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); - LOG_M("Xu.m","xu",Xu,N_ZC,1,1); - LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1); - } - else { - LOG_E(PHY,"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb); - LOG_M("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1); - LOG_M("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1); - LOG_M("Xu_br.m","xu_br",Xu,N_ZC,1,1); - LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1); - exit(-1); - } + if (LOG_DUMPFLAG(PRACH)) { + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if (en>60) { + k = (12*n_ra_prb) - 6*fp->N_RB_UL; + + if (k<0) k+=fp->ofdm_symbol_size; + + k*=12; + k+=13; + k*=2; + + if (br_flag == 0) { + LOG_M("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); + LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + LOG_M("Xu.m","xu",Xu,N_ZC,1,1); + LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1); + } + else { + LOG_E(PHY,"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb); + LOG_M("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1); + LOG_M("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1); + LOG_M("Xu_br.m","xu_br",Xu,N_ZC,1,1); + LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1); + exit(-1); + } - } -LOG_M_END + } + } /* LOG_DUMPFLAG(PRACH) */ if (eNB) stop_meas(&eNB->rx_prach); } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 619d84cee203f174a661b8a88377ff22e41d81c3..adb0d1576f31322448cdf6a4a5c53f7486e4a00b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -33,7 +33,6 @@ #include "PHY/defs_eNB.h" #include "PHY/phy_extern.h" #include "transport_eNB.h" -//#define DEBUG_ULSCH #include "PHY/sse_intrin.h" #include "transport_common_proto.h" #include "PHY/LTE_ESTIMATION/lte_estimation.h" @@ -67,7 +66,7 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) - // printf("Doing lte_idft for Msc_PUSCH %d\n",Msc_PUSCH); + LOG_T(PHY,"Doing lte_idft for Msc_PUSCH %d\n",Msc_PUSCH); if (frame_parms->Ncp == 0) { // Normal prefix z0 = z; @@ -388,13 +387,13 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) { z0[i] = ((uint32_t*)idft_out0)[ip]; - /* - printf("out0 (%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", - ((int16_t*)&idft_out0[ip])[0],((int16_t*)&idft_out0[ip])[1], - ((int16_t*)&idft_out0[ip+1])[0],((int16_t*)&idft_out0[ip+1])[1], - ((int16_t*)&idft_out0[ip+2])[0],((int16_t*)&idft_out0[ip+2])[1], - ((int16_t*)&idft_out0[ip+3])[0],((int16_t*)&idft_out0[ip+3])[1]); - */ + if(LOG_DEBUGFLAG(DEBUG_ULSCH)) { + LOG_I(PHY,"out0 (%d,%d),(%d,%d),(%d,%d),(%d,%d)\n", + ((int16_t*)&idft_out0[ip])[0],((int16_t*)&idft_out0[ip])[1], + ((int16_t*)&idft_out0[ip+1])[0],((int16_t*)&idft_out0[ip+1])[1], + ((int16_t*)&idft_out0[ip+2])[0],((int16_t*)&idft_out0[ip+2])[1], + ((int16_t*)&idft_out0[ip+3])[0],((int16_t*)&idft_out0[ip+3])[1]); + } z1[i] = ((uint32_t*)idft_out0)[ip+1]; z2[i] = ((uint32_t*)idft_out0)[ip+2]; z3[i] = ((uint32_t*)idft_out0)[ip+3]; @@ -479,10 +478,7 @@ int32_t ulsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, int i; - // printf("qpsk llr for symbol %d (pos %d), llr offset %d\n",symbol,(symbol*frame_parms->N_RB_DL*12),llr128U-(__m128i*)ulsch_llr); - for (i=0; i<(nb_rb*3); i++) { - //printf("%d,%d,%d,%d,%d,%d,%d,%d\n",((int16_t *)rxF)[0],((int16_t *)rxF)[1],((int16_t *)rxF)[2],((int16_t *)rxF)[3],((int16_t *)rxF)[4],((int16_t *)rxF)[5],((int16_t *)rxF)[6],((int16_t *)rxF)[7]); *(*llrp128) = *rxF; rxF++; (*llrp128)++; @@ -593,7 +589,9 @@ void ulsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, ch_mag =(int16x8_t*)&ul_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; ch_magb =(int16x8_t*)&ul_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; #endif - // printf("symbol %d: mag %d, magb %d\n",symbol,_mm_extract_epi16(ch_mag[0],0),_mm_extract_epi16(ch_magb[0],0)); + if(LOG_DEBUGFLAG(DEBUG_ULSCH)) { + LOG_UI(PHY,"symbol %d: mag %d, magb %d\n",symbol,_mm_extract_epi16(ch_mag[0],0),_mm_extract_epi16(ch_magb[0],0)); + } for (i=0; i<(nb_rb*3); i++) { @@ -736,9 +734,9 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, nb_rb1 = cmin(cmax((int)(frame_parms->N_RB_UL) - (int)(2*first_rb),(int)0),(int)(2*nb_rb)); // 2 times no. RBs before the DC nb_rb2 = 2*nb_rb - nb_rb1; // 2 times no. RBs after the DC -#ifdef DEBUG_ULSCH - printf("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); -#endif + if(LOG_DEBUGFLAG(DEBUG_ULSCH)) { + LOG_UI(PHY,"ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); + } rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)]; @@ -838,7 +836,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, #endif for (rb=0; rb<nb_rb; rb++) { - // printf("comp: symbol %d rb %d\n",symbol,rb); + LOG_D(PHY,"comp: symbol %d rb %d\n",symbol,rb); // just compute channel magnitude without scaling, this is done after equalization for SC-FDMA @@ -861,7 +859,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); - // printf("comp: symbol %d rb %d => %d,%d,%d (output_shift %d)\n",symbol,rb,*((int16_t*)&ul_ch_mag128[0]),*((int16_t*)&ul_ch_mag128[1]),*((int16_t*)&ul_ch_mag128[2]),output_shift); + LOG_D(PHY,"comp: symbol %d rb %d => %d,%d,%d (output_shift %d)\n",symbol,rb,*((int16_t*)&ul_ch_mag128[0]),*((int16_t*)&ul_ch_mag128[1]),*((int16_t*)&ul_ch_mag128[2]),output_shift); #elif defined(__arm__) @@ -1125,10 +1123,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB, harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); Qm = ulsch[UE_id]->harq_processes[harq_pid]->Qm; -#ifdef DEBUG_ULSCH - printf("rx_ulsch: harq_pid %d, nb_rb %d first_rb %d\n",harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb); - -#endif //DEBUG_ULSCH + if(LOG_DEBUGFLAG(DEBUG_ULSCH)) { + LOG_I(PHY,"rx_ulsch: harq_pid %d, nb_rb %d first_rb %d\n",harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb); + } if (ulsch[UE_id]->harq_processes[harq_pid]->nb_rb == 0) { LOG_E(PHY,"PUSCH (%d/%x) nb_rb=0!\n", harq_pid,ulsch[UE_id]->rnti); @@ -1137,13 +1134,13 @@ void rx_ulsch(PHY_VARS_eNB *eNB, for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { -#ifdef DEBUG_ULSCH - printf("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, + if(LOG_DEBUGFLAG(DEBUG_ULSCH)) { + LOG_I(PHY,"rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, common_vars->rxdataF, pusch_vars->rxdataF_ext); -#endif //DEBUG_ULSCH + } ulsch_extract_rbs_single(common_vars->rxdataF, pusch_vars->rxdataF_ext, @@ -1179,21 +1176,16 @@ void rx_ulsch(PHY_VARS_eNB *eNB, pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)/correction_factor; - /* printf("%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_times10(pusch_vars->ulsch_power[i])); - */ + LOG_D(PHY,"%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_times10(pusch_vars->ulsch_power[i])); + } - - //LOG_M("rxdataF_ext.m","rxF_ext",pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); - //LOG_M("ulsch_chest.m","drs_est",pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); - - ulsch_channel_level(pusch_vars->drs_ch_estimates, frame_parms, avgU, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - // printf("[ULSCH] avg[0] %d\n",avgU[0]); + LOG_D(PHY,"[ULSCH] avg[0] %d\n",avgU[0]); avgs = 0; @@ -1205,9 +1197,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB, log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; -#ifdef DEBUG_ULSCH - printf("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); -#endif + + LOG_D(PHY,"[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); + for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { @@ -1229,9 +1221,6 @@ void rx_ulsch(PHY_VARS_eNB *eNB, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, log2_maxh); // log2_maxh+I0_shift - - - if (frame_parms->nb_antennas_rx > 1) ulsch_detection_mrc(frame_parms, pusch_vars->rxdataF_comp, @@ -1240,9 +1229,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - - - // if ((eNB->measurements.n0_power_dB[0]+3)<pusch_vars->ulsch_power[0]) { + // if ((eNB->measurements.n0_power_dB[0]+3)<pusch_vars->ulsch_power[0]) if (23<pusch_vars->ulsch_power[0]) { freq_equalization(frame_parms, pusch_vars->rxdataF_comp, @@ -1254,22 +1241,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB, } } - - - - - //#ifdef DEBUG_ULSCH - // Inverse-Transform equalized outputs - // printf("Doing IDFTs\n"); lte_idft(frame_parms, (uint32_t*)pusch_vars->rxdataF_comp[0], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); - // printf("Done\n"); - //#endif //DEBUG_ULSCH - - - - llrp = (int16_t*)&pusch_vars->llr[0]; @@ -1316,9 +1290,8 @@ void rx_ulsch(PHY_VARS_eNB *eNB, break; default: -#ifdef DEBUG_ULSCH - printf("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); -#endif //DEBUG_ULSCH + LOG_E(PHY,"ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); + break; } } @@ -1329,7 +1302,7 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB, eNB_rxtx_proc_t *proc, uint8_t UE_index) { - printf("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,UE_index); + LOG_I(PHY,"[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,UE_index); eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; @@ -1344,7 +1317,7 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB, harq_pid = subframe2harq_pid(&eNB->frame_parms,frame,subframe); - printf("Dumping ULSCH in subframe %d with harq_pid %d, round %d for NB_rb %d, TBS %d, Qm %d, N_symb %d\n", + LOG_UI(PHY,"Dumping ULSCH in subframe %d with harq_pid %d, round %d for NB_rb %d, TBS %d, Qm %d, N_symb %d\n", subframe,harq_pid,round,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS,eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm, eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c index b9fbcad9c9349cbec14cd23f4c75e4ddbab6b6e4..e0ea796a826fb6b05357f5624942a954706cb389 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c @@ -179,29 +179,29 @@ void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_ uint32_t rballoc=0; uint8_t mcs=0; + uint8_t Ngap=0; switch (N_RB_DL) { case 6: - mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6); - + mcs = ((DCI1C_1_5MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_1_5MHz_t *)dci_pdu)->rballoc, 6); break; case 25: - mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6); - + mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc, 25); break; case 50: - mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,6); - + mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc, 50); + Ngap = ((DCI1C_10MHz_t *)dci_pdu)->Ngap; break; case 100: - mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,6); + mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc, 100); + Ngap = ((DCI1C_20MHz_t *)dci_pdu)->Ngap; break; default: @@ -211,6 +211,7 @@ void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_ pdci_info_extarcted->mcs1 = mcs; pdci_info_extarcted->rballoc = rballoc; + pdci_info_extarcted->Ngap = Ngap; } void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index 4787d94d1a4736e8b19f13b054d665193f32efcc..50b09102d88857b2b1a2cabf439e2e81a28f2d70 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -40,8 +40,14 @@ #include<math.h> #include <stdlib.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> +#endif #include <cblas.h> #include "linear_preprocessing_rec.h" @@ -1314,14 +1320,17 @@ void dlsch_channel_compensation(int **rxdataF_ext, } for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*2 + aarx][symbol*frame_parms->N_RB_DL*12]; + /* TODO: hack to be removed. There is crash for 1 antenna case, so + * for 1 antenna case, I put back the value 2 as it was before + * Elena's commit. + */ + int x = frame_parms->nb_antennas_rx > 1 ? frame_parms->nb_antennas_rx : 2; + dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*x + aarx][symbol*frame_parms->N_RB_DL*12]; //print_shorts("dl_ch128[0]=",&dl_ch128[0]);*/ - dl_ch_mag128 = (__m128i *)&dl_ch_mag[aatx*2 + aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128b = (__m128i *)&dl_ch_magb[aatx*2 + aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128 = (__m128i *)&dl_ch_mag[aatx*x + aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128b = (__m128i *)&dl_ch_magb[aatx*x + aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*2 + aarx][symbol*frame_parms->N_RB_DL*12]; - + rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*x + aarx][symbol*frame_parms->N_RB_DL*12]; for (rb=0; rb<nb_rb; rb++) { if (mod_order>2) { @@ -1771,12 +1780,17 @@ void dlsch_channel_compensation_core(int **rxdataF_ext, } for (aarx=0; aarx<n_rx; aarx++) { - - dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*2 + aarx][start_point]; - dl_ch_mag128 = (__m128i *)&dl_ch_mag[aatx*2 + aarx][start_point]; - dl_ch_mag128b = (__m128i *)&dl_ch_magb[aatx*2 + aarx][start_point]; + /* TODO: hack to be removed. There is crash for 1 antenna case, so + * for 1 antenna case, I put back the value 2 as it was before + * Elena's commit. + */ + int x = n_rx > 1 ? n_rx : 2; + + dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*x + aarx][start_point]; + dl_ch_mag128 = (__m128i *)&dl_ch_mag[aatx*x + aarx][start_point]; + dl_ch_mag128b = (__m128i *)&dl_ch_magb[aatx*x + aarx][start_point]; rxdataF128 = (__m128i *)&rxdataF_ext[aarx][start_point]; - rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*2 + aarx][start_point]; + rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*x + aarx][start_point]; length_mod8 = length&7; if (length_mod8 == 0){ @@ -3974,17 +3988,12 @@ void dlsch_channel_level_median(int **dl_ch_estimates_ext, ((int32_t*)&norm128D)[2] + ((int32_t*)&norm128D)[3]; - if (ii<1){ -// print_ints("norm128D",&norm128D[0]); - printf("norm_pack[%d] %d\n", aatx*n_rx + aarx, norm_pack); - } - if (norm_pack > max) max = norm_pack; if (norm_pack < min) min = norm_pack; - dl_ch128+=1; + dl_ch128+=1; } median[aatx*n_rx + aarx] = (max+min)>>1; diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c index d85d440193757044eedadaf820ef4d46b47eddb6..7d063e326effc919180e5ebe12c02fa19d85b6a2 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c @@ -13,9 +13,14 @@ data storage. */ #include <stdlib.h> #include <cblas.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> - +#endif //#define DEBUG_PREPROC @@ -366,4 +371,4 @@ float sqrt_float(float x, float sqrt_x) { sqrt_x = (float)(sqrt((double)(x))); return sqrt_x; -} \ No newline at end of file +} diff --git a/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c index 1dbe75641ee54a074f3d073e2695178d753551a1..481d0bcaf8510623a8c6c7712d960ab0335a83ee 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c @@ -376,7 +376,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 memmove( prach, prach+1024, Ncp<<2 ); prach_len = 512+Ncp; } else { - idft3072(prachF,prach2); + idft3072(prachF,prach2,1); memmove( prach, prach+6144, Ncp<<2 ); prach_len = 3072+Ncp; @@ -395,7 +395,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 memmove( prach, prach+2048, Ncp<<2 ); prach_len = 1024+Ncp; } else { - idft6144(prachF,prach2); + idft6144(prachF,prach2,1); /*for (i=0;i<6144*2;i++) prach2[i]<<=1;*/ memmove( prach, prach+12288, Ncp<<2 ); @@ -415,7 +415,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 memmove( prach, prach+4096, Ncp<<2 ); prach_len = 2048+Ncp; } else { - idft12288(prachF,prach2); + idft12288(prachF,prach2,1); memmove( prach, prach+24576, Ncp<<2 ); prach_len = 12288+Ncp; @@ -429,12 +429,12 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 case 75: if (prach_fmt == 4) { - idft3072(prachF,prach2); + idft3072(prachF,prach2,1); //TODO: account for repeated format in dft output memmove( prach, prach+6144, Ncp<<2 ); prach_len = 3072+Ncp; } else { - idft18432(prachF,prach2); + idft18432(prachF,prach2,1); memmove( prach, prach+36864, Ncp<<2 ); prach_len = 18432+Ncp; @@ -453,7 +453,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 memmove( prach, prach+8192, Ncp<<2 ); prach_len = 4096+Ncp; } else { - idft24576(prachF,prach2); + idft24576(prachF,prach2,1); memmove( prach, prach+49152, Ncp<<2 ); prach_len = 24576+Ncp; @@ -465,12 +465,12 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 } else { if (prach_fmt == 4) { - idft3072(prachF,prach2); + idft3072(prachF,prach2,1); //TODO: account for repeated format in dft output memmove( prach, prach+6144, Ncp<<2 ); prach_len = 3072+Ncp; } else { - idft18432(prachF,prach2); + idft18432(prachF,prach2,1); memmove( prach, prach+36864, Ncp<<2 ); prach_len = 18432+Ncp; printf("Generated prach for 100 PRB, 3/4 sampling\n"); diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index 59b6a1e03beedc51371c2a611964fb3d5a2682b6..017bc7427643cc3f2ecb51da33c579b71f44a724 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -1,14 +1,14 @@ lte_dfts_sse4: lte_dfts.c - gcc -O2 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -std=gnu99 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS lte_dfts_avx2: lte_dfts.c - gcc -O2 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -std=gnu99 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS lte_dfts_avx2.s: lte_dfts.c - gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -std=gnu99 -mavx2 -S lte_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS lte_dfts_sse4.s: lte_dfts.c - gcc -O2 -msse4.1 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -std=gnu99 -msse4.1 -S lte_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm # -DD256STATS #-DD64STATS dft_cycles_avx2: lte_dfts_avx2 ./lte_dfts_avx2 | egrep cycles diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 4bf6afd1fd367d99d1aa06635f93baefd7082454..7e24af179d756380b1327bb07674d1b6adf5ab97 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -24,6 +24,13 @@ #include <string.h> #include <stdint.h> +#include <math.h> +#include <pthread.h> +#include <execinfo.h> + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif #ifndef MR_MAIN #include "PHY/defs_common.h" @@ -31,18 +38,19 @@ #include "tools_defs.h" #else #include "time_meas.h" -#include <math.h> - +#include "UTIL/LOG/log.h" #define debug_msg #define ONE_OVER_SQRT2_Q15 23170 - +int oai_exit=0; #endif #define ONE_OVER_SQRT3_Q15 18919 #include "PHY/sse_intrin.h" +#include "assertions.h" + #define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7]) #define print_shorts256(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7],(x)[8],(x)[9],(x)[10],(x)[11],(x)[12],(x)[13],(x)[14],(x)[15]) @@ -54,6 +62,8 @@ const static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1, const static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}; + + #if defined(__x86_64__) || defined(__i386__) static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) __attribute__((always_inline)); static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) @@ -3087,10 +3097,10 @@ void dft128(int16_t *x,int16_t *y,int scale) dft64((int16_t*)(xtmp),(int16_t*)ytmp,1); dft64((int16_t*)(xtmp+32),(int16_t*)(ytmp+16),1); - - /* LOG_M("dft128a.m","dfta",ytmp,64,1,1); - LOG_M("dft128b.m","dftb",ytmp+16,64,1,1);*/ - + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft128a.m","dfta",ytmp,64,1,1); + LOG_M("dft128b.m","dftb",ytmp+16,64,1,1);*/ + } for (i=0; i<16; i++) { bfly2_16(ytmpp,ytmpp+16, y128p,y128p+16, @@ -3139,9 +3149,10 @@ void dft128(int16_t *x,int16_t *y,int scale) } - - /* LOG_M("dft128out.m","dft128",y,128,1,1); - exit(-1);*/ + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft128out.m","dft128",y,128,1,1); + exit(-1); + } _mm_empty(); _m_empty(); @@ -3166,17 +3177,17 @@ void dft128(int16_t *x,int16_t *y,int scale) transpose4_ooff_simd256(x256+10,xtmp+5,8); transpose4_ooff_simd256(x256+12,xtmp+6,8); transpose4_ooff_simd256(x256+14,xtmp+7,8); - - /* LOG_M("dft128ina_256.m","dftina",xtmp,64,1,1); - LOG_M("dft128inb_256.m","dftinb",xtmp+8,64,1,1); - */ + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft128ina_256.m","dftina",xtmp,64,1,1); + LOG_M("dft128inb_256.m","dftinb",xtmp+8,64,1,1); + } dft64((int16_t*)(xtmp),(int16_t*)ytmp,1); dft64((int16_t*)(xtmp+8),(int16_t*)(ytmp+8),1); - - /*LOG_M("dft128outa_256.m","dftouta",ytmp,64,1,1); - LOG_M("dft128outb_256.m","dftoutb",ytmp+8,64,1,1); - */ + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft128outa_256.m","dftouta",ytmp,64,1,1); + LOG_M("dft128outb_256.m","dftoutb",ytmp+8,64,1,1); + } for (i=0; i<8; i++) { bfly2_16_256(ytmpp,ytmpp+8, @@ -3209,9 +3220,10 @@ void dft128(int16_t *x,int16_t *y,int scale) y256[15] = mulhi_int16_simd256(y256[15],ONE_OVER_SQRT2_Q15_256); } - - /* LOG_M("dft128.m","dft",y256,128,1,1); - exit(-1);*/ + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft128.m","dft",y256,128,1,1); + exit(-1); + } } #endif @@ -4134,10 +4146,8 @@ void idft512(int16_t *x,int16_t *y,int scale) #endif -int16_t tw1024[1536] __attribute__((aligned(32))) = { 32767,0,32766,-202,32764,-403,32761,-604,32757,-805,32751,-1006,32744,-1207,32736,-1407,32727,-1608,32717,-1809,32705,-2010,32692,-2210,32678,-2411,32662,-2611,32646,-2812,32628,-3012,32609,-3212,32588,-3412,32567,-3612,32544,-3812,32520,-4012,32495,-4211,32468,-4410,32441,-4609,32412,-4808,32382,-5007,32350,-5206,32318,-5404,32284,-5602,32249,-5800,32213,-5998,32176,-6196,32137,-6393,32097,-6590,32056,-6787,32014,-6983,31970,-7180,31926,-7376,31880,-7572,31833,-7767,31785,-7962,31735,-8157,31684,-8352,31633,-8546,31580,-8740,31525,-8933,31470,-9127,31413,-9320,31356,-9512,31297,-9704,31236,-9896,31175,-10088,31113,-10279,31049,-10470,30984,-10660,30918,-10850,30851,-11039,30783,-11228,30713,-11417,30643,-11605,30571,-11793,30498,-11981,30424,-12167,30349,-12354,30272,-12540,30195,-12725,30116,-12910,30036,-13095,29955,-13279,29873,-13463,29790,-13646,29706,-13828,29621,-14010,29534,-14192,29446,-14373,29358,-14553,29268,-14733,29177,-14912,29085,-15091,28992,-15269,28897,-15447,28802,-15624,28706,-15800,28608,-15976,28510,-16151,28410,-16326,28309,-16500,28208,-16673,28105,-16846,28001,-17018,27896,-17190,27790,-17361,27683,-17531,27575,-17700,27466,-17869,27355,-18037,27244,-18205,27132,-18372,27019,-18538,26905,-18703,26789,-18868,26673,-19032,26556,-19195,26437,-19358,26318,-19520,26198,-19681,26077,-19841,25954,-20001,25831,-20160,25707,-20318,25582,-20475,25456,-20632,25329,-20788,25201,-20943,25072,-21097,24942,-21250,24811,-21403,24679,-21555,24546,-21706,24413,-21856,24278,-22005,24143,-22154,24006,-22302,23869,-22449,23731,-22595,23592,-22740,23452,-22884,23311,-23028,23169,-23170,23027,-23312,22883,-23453,22739,-23593,22594,-23732,22448,-23870,22301,-24007,22153,-24144,22004,-24279,21855,-24414,21705,-24547,21554,-24680,21402,-24812,21249,-24943,21096,-25073,20942,-25202,20787,-25330,20631,-25457,20474,-25583,20317,-25708,20159,-25832,20000,-25955,19840,-26078,19680,-26199,19519,-26319,19357,-26438,19194,-26557,19031,-26674,18867,-26790,18702,-26906,18537,-27020,18371,-27133,18204,-27245,18036,-27356,17868,-27467,17699,-27576,17530,-27684,17360,-27791,17189,-27897,17017,-28002,16845,-28106,16672,-28209,16499,-28310,16325,-28411,16150,-28511,15975,-28609,15799,-28707,15623,-28803,15446,-28898,15268,-28993,15090,-29086,14911,-29178,14732,-29269,14552,-29359,14372,-29447,14191,-29535,14009,-29622,13827,-29707,13645,-29791,13462,-29874,13278,-29956,13094,-30037,12909,-30117,12724,-30196,12539,-30273,12353,-30350,12166,-30425,11980,-30499,11792,-30572,11604,-30644,11416,-30714,11227,-30784,11038,-30852,10849,-30919,10659,-30985,10469,-31050,10278,-31114,10087,-31176,9895,-31237,9703,-31298,9511,-31357,9319,-31414,9126,-31471,8932,-31526,8739,-31581,8545,-31634,8351,-31685,8156,-31736,7961,-31786,7766,-31834,7571,-31881,7375,-31927,7179,-31971,6982,-32015,6786,-32057,6589,-32098,6392,-32138,6195,-32177,5997,-32214,5799,-32250,5601,-32285,5403,-32319,5205,-32351,5006,-32383,4807,-32413,4608,-32442,4409,-32469,4210,-32496,4011,-32521,3811,-32545,3611,-32568,3411,-32589,3211,-32610,3011,-32629,2811,-32647,2610,-32663,2410,-32679,2209,-32693,2009,-32706,1808,-32718,1607,-32728,1406,-32737,1206,-32745,1005,-32752,804,-32758,603,-32762,402,-32765,201,-32767, - 32767,0,32764,-403,32757,-805,32744,-1207,32727,-1608,32705,-2010,32678,-2411,32646,-2812,32609,-3212,32567,-3612,32520,-4012,32468,-4410,32412,-4808,32350,-5206,32284,-5602,32213,-5998,32137,-6393,32056,-6787,31970,-7180,31880,-7572,31785,-7962,31684,-8352,31580,-8740,31470,-9127,31356,-9512,31236,-9896,31113,-10279,30984,-10660,30851,-11039,30713,-11417,30571,-11793,30424,-12167,30272,-12540,30116,-12910,29955,-13279,29790,-13646,29621,-14010,29446,-14373,29268,-14733,29085,-15091,28897,-15447,28706,-15800,28510,-16151,28309,-16500,28105,-16846,27896,-17190,27683,-17531,27466,-17869,27244,-18205,27019,-18538,26789,-18868,26556,-19195,26318,-19520,26077,-19841,25831,-20160,25582,-20475,25329,-20788,25072,-21097,24811,-21403,24546,-21706,24278,-22005,24006,-22302,23731,-22595,23452,-22884,23169,-23170,22883,-23453,22594,-23732,22301,-24007,22004,-24279,21705,-24547,21402,-24812,21096,-25073,20787,-25330,20474,-25583,20159,-25832,19840,-26078,19519,-26319,19194,-26557,18867,-26790,18537,-27020,18204,-27245,17868,-27467,17530,-27684,17189,-27897,16845,-28106,16499,-28310,16150,-28511,15799,-28707,15446,-28898,15090,-29086,14732,-29269,14372,-29447,14009,-29622,13645,-29791,13278,-29956,12909,-30117,12539,-30273,12166,-30425,11792,-30572,11416,-30714,11038,-30852,10659,-30985,10278,-31114,9895,-31237,9511,-31357,9126,-31471,8739,-31581,8351,-31685,7961,-31786,7571,-31881,7179,-31971,6786,-32057,6392,-32138,5997,-32214,5601,-32285,5205,-32351,4807,-32413,4409,-32469,4011,-32521,3611,-32568,3211,-32610,2811,-32647,2410,-32679,2009,-32706,1607,-32728,1206,-32745,804,-32758,402,-32765,0,-32767,-403,-32765,-805,-32758,-1207,-32745,-1608,-32728,-2010,-32706,-2411,-32679,-2812,-32647,-3212,-32610,-3612,-32568,-4012,-32521,-4410,-32469,-4808,-32413,-5206,-32351,-5602,-32285,-5998,-32214,-6393,-32138,-6787,-32057,-7180,-31971,-7572,-31881,-7962,-31786,-8352,-31685,-8740,-31581,-9127,-31471,-9512,-31357,-9896,-31237,-10279,-31114,-10660,-30985,-11039,-30852,-11417,-30714,-11793,-30572,-12167,-30425,-12540,-30273,-12910,-30117,-13279,-29956,-13646,-29791,-14010,-29622,-14373,-29447,-14733,-29269,-15091,-29086,-15447,-28898,-15800,-28707,-16151,-28511,-16500,-28310,-16846,-28106,-17190,-27897,-17531,-27684,-17869,-27467,-18205,-27245,-18538,-27020,-18868,-26790,-19195,-26557,-19520,-26319,-19841,-26078,-20160,-25832,-20475,-25583,-20788,-25330,-21097,-25073,-21403,-24812,-21706,-24547,-22005,-24279,-22302,-24007,-22595,-23732,-22884,-23453,-23170,-23170,-23453,-22884,-23732,-22595,-24007,-22302,-24279,-22005,-24547,-21706,-24812,-21403,-25073,-21097,-25330,-20788,-25583,-20475,-25832,-20160,-26078,-19841,-26319,-19520,-26557,-19195,-26790,-18868,-27020,-18538,-27245,-18205,-27467,-17869,-27684,-17531,-27897,-17190,-28106,-16846,-28310,-16500,-28511,-16151,-28707,-15800,-28898,-15447,-29086,-15091,-29269,-14733,-29447,-14373,-29622,-14010,-29791,-13646,-29956,-13279,-30117,-12910,-30273,-12540,-30425,-12167,-30572,-11793,-30714,-11417,-30852,-11039,-30985,-10660,-31114,-10279,-31237,-9896,-31357,-9512,-31471,-9127,-31581,-8740,-31685,-8352,-31786,-7962,-31881,-7572,-31971,-7180,-32057,-6787,-32138,-6393,-32214,-5998,-32285,-5602,-32351,-5206,-32413,-4808,-32469,-4410,-32521,-4012,-32568,-3612,-32610,-3212,-32647,-2812,-32679,-2411,-32706,-2010,-32728,-1608,-32745,-1207,-32758,-805,-32765,-403, - 32767,0,32761,-604,32744,-1207,32717,-1809,32678,-2411,32628,-3012,32567,-3612,32495,-4211,32412,-4808,32318,-5404,32213,-5998,32097,-6590,31970,-7180,31833,-7767,31684,-8352,31525,-8933,31356,-9512,31175,-10088,30984,-10660,30783,-11228,30571,-11793,30349,-12354,30116,-12910,29873,-13463,29621,-14010,29358,-14553,29085,-15091,28802,-15624,28510,-16151,28208,-16673,27896,-17190,27575,-17700,27244,-18205,26905,-18703,26556,-19195,26198,-19681,25831,-20160,25456,-20632,25072,-21097,24679,-21555,24278,-22005,23869,-22449,23452,-22884,23027,-23312,22594,-23732,22153,-24144,21705,-24547,21249,-24943,20787,-25330,20317,-25708,19840,-26078,19357,-26438,18867,-26790,18371,-27133,17868,-27467,17360,-27791,16845,-28106,16325,-28411,15799,-28707,15268,-28993,14732,-29269,14191,-29535,13645,-29791,13094,-30037,12539,-30273,11980,-30499,11416,-30714,10849,-30919,10278,-31114,9703,-31298,9126,-31471,8545,-31634,7961,-31786,7375,-31927,6786,-32057,6195,-32177,5601,-32285,5006,-32383,4409,-32469,3811,-32545,3211,-32610,2610,-32663,2009,-32706,1406,-32737,804,-32758,201,-32767,-403,-32765,-1006,-32752,-1608,-32728,-2210,-32693,-2812,-32647,-3412,-32589,-4012,-32521,-4609,-32442,-5206,-32351,-5800,-32250,-6393,-32138,-6983,-32015,-7572,-31881,-8157,-31736,-8740,-31581,-9320,-31414,-9896,-31237,-10470,-31050,-11039,-30852,-11605,-30644,-12167,-30425,-12725,-30196,-13279,-29956,-13828,-29707,-14373,-29447,-14912,-29178,-15447,-28898,-15976,-28609,-16500,-28310,-17018,-28002,-17531,-27684,-18037,-27356,-18538,-27020,-19032,-26674,-19520,-26319,-20001,-25955,-20475,-25583,-20943,-25202,-21403,-24812,-21856,-24414,-22302,-24007,-22740,-23593,-23170,-23170,-23593,-22740,-24007,-22302,-24414,-21856,-24812,-21403,-25202,-20943,-25583,-20475,-25955,-20001,-26319,-19520,-26674,-19032,-27020,-18538,-27356,-18037,-27684,-17531,-28002,-17018,-28310,-16500,-28609,-15976,-28898,-15447,-29178,-14912,-29447,-14373,-29707,-13828,-29956,-13279,-30196,-12725,-30425,-12167,-30644,-11605,-30852,-11039,-31050,-10470,-31237,-9896,-31414,-9320,-31581,-8740,-31736,-8157,-31881,-7572,-32015,-6983,-32138,-6393,-32250,-5800,-32351,-5206,-32442,-4609,-32521,-4012,-32589,-3412,-32647,-2812,-32693,-2210,-32728,-1608,-32752,-1006,-32765,-403,-32767,201,-32758,804,-32737,1406,-32706,2009,-32663,2610,-32610,3211,-32545,3811,-32469,4409,-32383,5006,-32285,5601,-32177,6195,-32057,6786,-31927,7375,-31786,7961,-31634,8545,-31471,9126,-31298,9703,-31114,10278,-30919,10849,-30714,11416,-30499,11980,-30273,12539,-30037,13094,-29791,13645,-29535,14191,-29269,14732,-28993,15268,-28707,15799,-28411,16325,-28106,16845,-27791,17360,-27467,17868,-27133,18371,-26790,18867,-26438,19357,-26078,19840,-25708,20317,-25330,20787,-24943,21249,-24547,21705,-24144,22153,-23732,22594,-23312,23027,-22884,23452,-22449,23869,-22005,24278,-21555,24679,-21097,25072,-20632,25456,-20160,25831,-19681,26198,-19195,26556,-18703,26905,-18205,27244,-17700,27575,-17190,27896,-16673,28208,-16151,28510,-15624,28802,-15091,29085,-14553,29358,-14010,29621,-13463,29873,-12910,30116,-12354,30349,-11793,30571,-11228,30783,-10660,30984,-10088,31175,-9512,31356,-8933,31525,-8352,31684,-7767,31833,-7180,31970,-6590,32097,-5998,32213,-5404,32318,-4808,32412,-4211,32495,-3612,32567,-3012,32628,-2411,32678,-1809,32717,-1207,32744,-604,32761 - }; +int16_t tw1024[1536] __attribute__((aligned(32))); + #ifndef __AVX2__ void dft1024(int16_t *x,int16_t *y,int scale) { @@ -4365,7 +4375,7 @@ void idft1024(int16_t *x,int16_t *y,int scale) } #endif -int16_t tw2048[2048] __attribute__((aligned(32))) = {32767,0,32766,-101,32766,-202,32765,-302,32764,-403,32763,-503,32761,-604,32759,-704,32757,-805,32754,-905,32751,-1006,32748,-1106,32744,-1207,32740,-1307,32736,-1407,32732,-1508,32727,-1608,32722,-1709,32717,-1809,32711,-1909,32705,-2010,32699,-2110,32692,-2210,32685,-2311,32678,-2411,32670,-2511,32662,-2611,32654,-2712,32646,-2812,32637,-2912,32628,-3012,32618,-3112,32609,-3212,32599,-3312,32588,-3412,32578,-3512,32567,-3612,32556,-3712,32544,-3812,32532,-3912,32520,-4012,32508,-4111,32495,-4211,32482,-4311,32468,-4410,32455,-4510,32441,-4609,32426,-4709,32412,-4808,32397,-4908,32382,-5007,32366,-5107,32350,-5206,32334,-5305,32318,-5404,32301,-5503,32284,-5602,32267,-5701,32249,-5800,32231,-5899,32213,-5998,32194,-6097,32176,-6196,32156,-6294,32137,-6393,32117,-6492,32097,-6590,32077,-6689,32056,-6787,32035,-6885,32014,-6983,31992,-7082,31970,-7180,31948,-7278,31926,-7376,31903,-7474,31880,-7572,31856,-7669,31833,-7767,31809,-7865,31785,-7962,31760,-8060,31735,-8157,31710,-8254,31684,-8352,31659,-8449,31633,-8546,31606,-8643,31580,-8740,31553,-8837,31525,-8933,31498,-9030,31470,-9127,31442,-9223,31413,-9320,31385,-9416,31356,-9512,31326,-9608,31297,-9704,31267,-9800,31236,-9896,31206,-9992,31175,-10088,31144,-10183,31113,-10279,31081,-10374,31049,-10470,31017,-10565,30984,-10660,30951,-10755,30918,-10850,30885,-10945,30851,-11039,30817,-11134,30783,-11228,30748,-11323,30713,-11417,30678,-11511,30643,-11605,30607,-11699,30571,-11793,30535,-11887,30498,-11981,30461,-12074,30424,-12167,30386,-12261,30349,-12354,30311,-12447,30272,-12540,30234,-12633,30195,-12725,30156,-12818,30116,-12910,30076,-13003,30036,-13095,29996,-13187,29955,-13279,29915,-13371,29873,-13463,29832,-13554,29790,-13646,29748,-13737,29706,-13828,29663,-13919,29621,-14010,29577,-14101,29534,-14192,29490,-14282,29446,-14373,29402,-14463,29358,-14553,29313,-14643,29268,-14733,29222,-14823,29177,-14912,29131,-15002,29085,-15091,29038,-15180,28992,-15269,28945,-15358,28897,-15447,28850,-15535,28802,-15624,28754,-15712,28706,-15800,28657,-15888,28608,-15976,28559,-16064,28510,-16151,28460,-16239,28410,-16326,28360,-16413,28309,-16500,28259,-16587,28208,-16673,28156,-16760,28105,-16846,28053,-16932,28001,-17018,27948,-17104,27896,-17190,27843,-17275,27790,-17361,27736,-17446,27683,-17531,27629,-17616,27575,-17700,27520,-17785,27466,-17869,27411,-17953,27355,-18037,27300,-18121,27244,-18205,27188,-18288,27132,-18372,27076,-18455,27019,-18538,26962,-18621,26905,-18703,26847,-18786,26789,-18868,26731,-18950,26673,-19032,26615,-19114,26556,-19195,26497,-19277,26437,-19358,26378,-19439,26318,-19520,26258,-19600,26198,-19681,26137,-19761,26077,-19841,26016,-19921,25954,-20001,25893,-20080,25831,-20160,25769,-20239,25707,-20318,25645,-20397,25582,-20475,25519,-20554,25456,-20632,25392,-20710,25329,-20788,25265,-20865,25201,-20943,25136,-21020,25072,-21097,25007,-21174,24942,-21250,24877,-21327,24811,-21403,24745,-21479,24679,-21555,24613,-21630,24546,-21706,24480,-21781,24413,-21856,24346,-21931,24278,-22005,24211,-22080,24143,-22154,24075,-22228,24006,-22302,23938,-22375,23869,-22449,23800,-22522,23731,-22595,23661,-22667,23592,-22740,23522,-22812,23452,-22884,23382,-22956,23311,-23028,23240,-23099,23169,-23170,23098,-23241,23027,-23312,22955,-23383,22883,-23453,22811,-23523,22739,-23593,22666,-23662,22594,-23732,22521,-23801,22448,-23870,22374,-23939,22301,-24007,22227,-24076,22153,-24144,22079,-24212,22004,-24279,21930,-24347,21855,-24414,21780,-24481,21705,-24547,21629,-24614,21554,-24680,21478,-24746,21402,-24812,21326,-24878,21249,-24943,21173,-25008,21096,-25073,21019,-25137,20942,-25202,20864,-25266,20787,-25330,20709,-25393,20631,-25457,20553,-25520,20474,-25583,20396,-25646,20317,-25708,20238,-25770,20159,-25832,20079,-25894,20000,-25955,19920,-26017,19840,-26078,19760,-26138,19680,-26199,19599,-26259,19519,-26319,19438,-26379,19357,-26438,19276,-26498,19194,-26557,19113,-26616,19031,-26674,18949,-26732,18867,-26790,18785,-26848,18702,-26906,18620,-26963,18537,-27020,18454,-27077,18371,-27133,18287,-27189,18204,-27245,18120,-27301,18036,-27356,17952,-27412,17868,-27467,17784,-27521,17699,-27576,17615,-27630,17530,-27684,17445,-27737,17360,-27791,17274,-27844,17189,-27897,17103,-27949,17017,-28002,16931,-28054,16845,-28106,16759,-28157,16672,-28209,16586,-28260,16499,-28310,16412,-28361,16325,-28411,16238,-28461,16150,-28511,16063,-28560,15975,-28609,15887,-28658,15799,-28707,15711,-28755,15623,-28803,15534,-28851,15446,-28898,15357,-28946,15268,-28993,15179,-29039,15090,-29086,15001,-29132,14911,-29178,14822,-29223,14732,-29269,14642,-29314,14552,-29359,14462,-29403,14372,-29447,14281,-29491,14191,-29535,14100,-29578,14009,-29622,13918,-29664,13827,-29707,13736,-29749,13645,-29791,13553,-29833,13462,-29874,13370,-29916,13278,-29956,13186,-29997,13094,-30037,13002,-30077,12909,-30117,12817,-30157,12724,-30196,12632,-30235,12539,-30273,12446,-30312,12353,-30350,12260,-30387,12166,-30425,12073,-30462,11980,-30499,11886,-30536,11792,-30572,11698,-30608,11604,-30644,11510,-30679,11416,-30714,11322,-30749,11227,-30784,11133,-30818,11038,-30852,10944,-30886,10849,-30919,10754,-30952,10659,-30985,10564,-31018,10469,-31050,10373,-31082,10278,-31114,10182,-31145,10087,-31176,9991,-31207,9895,-31237,9799,-31268,9703,-31298,9607,-31327,9511,-31357,9415,-31386,9319,-31414,9222,-31443,9126,-31471,9029,-31499,8932,-31526,8836,-31554,8739,-31581,8642,-31607,8545,-31634,8448,-31660,8351,-31685,8253,-31711,8156,-31736,8059,-31761,7961,-31786,7864,-31810,7766,-31834,7668,-31857,7571,-31881,7473,-31904,7375,-31927,7277,-31949,7179,-31971,7081,-31993,6982,-32015,6884,-32036,6786,-32057,6688,-32078,6589,-32098,6491,-32118,6392,-32138,6293,-32157,6195,-32177,6096,-32195,5997,-32214,5898,-32232,5799,-32250,5700,-32268,5601,-32285,5502,-32302,5403,-32319,5304,-32335,5205,-32351,5106,-32367,5006,-32383,4907,-32398,4807,-32413,4708,-32427,4608,-32442,4509,-32456,4409,-32469,4310,-32483,4210,-32496,4110,-32509,4011,-32521,3911,-32533,3811,-32545,3711,-32557,3611,-32568,3511,-32579,3411,-32589,3311,-32600,3211,-32610,3111,-32619,3011,-32629,2911,-32638,2811,-32647,2711,-32655,2610,-32663,2510,-32671,2410,-32679,2310,-32686,2209,-32693,2109,-32700,2009,-32706,1908,-32712,1808,-32718,1708,-32723,1607,-32728,1507,-32733,1406,-32737,1306,-32741,1206,-32745,1105,-32749,1005,-32752,904,-32755,804,-32758,703,-32760,603,-32762,502,-32764,402,-32765,301,-32766,201,-32767,100,-32767,0,-32767,-101,-32767,-202,-32767,-302,-32766,-403,-32765,-503,-32764,-604,-32762,-704,-32760,-805,-32758,-905,-32755,-1006,-32752,-1106,-32749,-1207,-32745,-1307,-32741,-1407,-32737,-1508,-32733,-1608,-32728,-1709,-32723,-1809,-32718,-1909,-32712,-2010,-32706,-2110,-32700,-2210,-32693,-2311,-32686,-2411,-32679,-2511,-32671,-2611,-32663,-2712,-32655,-2812,-32647,-2912,-32638,-3012,-32629,-3112,-32619,-3212,-32610,-3312,-32600,-3412,-32589,-3512,-32579,-3612,-32568,-3712,-32557,-3812,-32545,-3912,-32533,-4012,-32521,-4111,-32509,-4211,-32496,-4311,-32483,-4410,-32469,-4510,-32456,-4609,-32442,-4709,-32427,-4808,-32413,-4908,-32398,-5007,-32383,-5107,-32367,-5206,-32351,-5305,-32335,-5404,-32319,-5503,-32302,-5602,-32285,-5701,-32268,-5800,-32250,-5899,-32232,-5998,-32214,-6097,-32195,-6196,-32177,-6294,-32157,-6393,-32138,-6492,-32118,-6590,-32098,-6689,-32078,-6787,-32057,-6885,-32036,-6983,-32015,-7082,-31993,-7180,-31971,-7278,-31949,-7376,-31927,-7474,-31904,-7572,-31881,-7669,-31857,-7767,-31834,-7865,-31810,-7962,-31786,-8060,-31761,-8157,-31736,-8254,-31711,-8352,-31685,-8449,-31660,-8546,-31634,-8643,-31607,-8740,-31581,-8837,-31554,-8933,-31526,-9030,-31499,-9127,-31471,-9223,-31443,-9320,-31414,-9416,-31386,-9512,-31357,-9608,-31327,-9704,-31298,-9800,-31268,-9896,-31237,-9992,-31207,-10088,-31176,-10183,-31145,-10279,-31114,-10374,-31082,-10470,-31050,-10565,-31018,-10660,-30985,-10755,-30952,-10850,-30919,-10945,-30886,-11039,-30852,-11134,-30818,-11228,-30784,-11323,-30749,-11417,-30714,-11511,-30679,-11605,-30644,-11699,-30608,-11793,-30572,-11887,-30536,-11981,-30499,-12074,-30462,-12167,-30425,-12261,-30387,-12354,-30350,-12447,-30312,-12540,-30273,-12633,-30235,-12725,-30196,-12818,-30157,-12910,-30117,-13003,-30077,-13095,-30037,-13187,-29997,-13279,-29956,-13371,-29916,-13463,-29874,-13554,-29833,-13646,-29791,-13737,-29749,-13828,-29707,-13919,-29664,-14010,-29622,-14101,-29578,-14192,-29535,-14282,-29491,-14373,-29447,-14463,-29403,-14553,-29359,-14643,-29314,-14733,-29269,-14823,-29223,-14912,-29178,-15002,-29132,-15091,-29086,-15180,-29039,-15269,-28993,-15358,-28946,-15447,-28898,-15535,-28851,-15624,-28803,-15712,-28755,-15800,-28707,-15888,-28658,-15976,-28609,-16064,-28560,-16151,-28511,-16239,-28461,-16326,-28411,-16413,-28361,-16500,-28310,-16587,-28260,-16673,-28209,-16760,-28157,-16846,-28106,-16932,-28054,-17018,-28002,-17104,-27949,-17190,-27897,-17275,-27844,-17361,-27791,-17446,-27737,-17531,-27684,-17616,-27630,-17700,-27576,-17785,-27521,-17869,-27467,-17953,-27412,-18037,-27356,-18121,-27301,-18205,-27245,-18288,-27189,-18372,-27133,-18455,-27077,-18538,-27020,-18621,-26963,-18703,-26906,-18786,-26848,-18868,-26790,-18950,-26732,-19032,-26674,-19114,-26616,-19195,-26557,-19277,-26498,-19358,-26438,-19439,-26379,-19520,-26319,-19600,-26259,-19681,-26199,-19761,-26138,-19841,-26078,-19921,-26017,-20001,-25955,-20080,-25894,-20160,-25832,-20239,-25770,-20318,-25708,-20397,-25646,-20475,-25583,-20554,-25520,-20632,-25457,-20710,-25393,-20788,-25330,-20865,-25266,-20943,-25202,-21020,-25137,-21097,-25073,-21174,-25008,-21250,-24943,-21327,-24878,-21403,-24812,-21479,-24746,-21555,-24680,-21630,-24614,-21706,-24547,-21781,-24481,-21856,-24414,-21931,-24347,-22005,-24279,-22080,-24212,-22154,-24144,-22228,-24076,-22302,-24007,-22375,-23939,-22449,-23870,-22522,-23801,-22595,-23732,-22667,-23662,-22740,-23593,-22812,-23523,-22884,-23453,-22956,-23383,-23028,-23312,-23099,-23241,-23170,-23170,-23241,-23099,-23312,-23028,-23383,-22956,-23453,-22884,-23523,-22812,-23593,-22740,-23662,-22667,-23732,-22595,-23801,-22522,-23870,-22449,-23939,-22375,-24007,-22302,-24076,-22228,-24144,-22154,-24212,-22080,-24279,-22005,-24347,-21931,-24414,-21856,-24481,-21781,-24547,-21706,-24614,-21630,-24680,-21555,-24746,-21479,-24812,-21403,-24878,-21327,-24943,-21250,-25008,-21174,-25073,-21097,-25137,-21020,-25202,-20943,-25266,-20865,-25330,-20788,-25393,-20710,-25457,-20632,-25520,-20554,-25583,-20475,-25646,-20397,-25708,-20318,-25770,-20239,-25832,-20160,-25894,-20080,-25955,-20001,-26017,-19921,-26078,-19841,-26138,-19761,-26199,-19681,-26259,-19600,-26319,-19520,-26379,-19439,-26438,-19358,-26498,-19277,-26557,-19195,-26616,-19114,-26674,-19032,-26732,-18950,-26790,-18868,-26848,-18786,-26906,-18703,-26963,-18621,-27020,-18538,-27077,-18455,-27133,-18372,-27189,-18288,-27245,-18205,-27301,-18121,-27356,-18037,-27412,-17953,-27467,-17869,-27521,-17785,-27576,-17700,-27630,-17616,-27684,-17531,-27737,-17446,-27791,-17361,-27844,-17275,-27897,-17190,-27949,-17104,-28002,-17018,-28054,-16932,-28106,-16846,-28157,-16760,-28209,-16673,-28260,-16587,-28310,-16500,-28361,-16413,-28411,-16326,-28461,-16239,-28511,-16151,-28560,-16064,-28609,-15976,-28658,-15888,-28707,-15800,-28755,-15712,-28803,-15624,-28851,-15535,-28898,-15447,-28946,-15358,-28993,-15269,-29039,-15180,-29086,-15091,-29132,-15002,-29178,-14912,-29223,-14823,-29269,-14733,-29314,-14643,-29359,-14553,-29403,-14463,-29447,-14373,-29491,-14282,-29535,-14192,-29578,-14101,-29622,-14010,-29664,-13919,-29707,-13828,-29749,-13737,-29791,-13646,-29833,-13554,-29874,-13463,-29916,-13371,-29956,-13279,-29997,-13187,-30037,-13095,-30077,-13003,-30117,-12910,-30157,-12818,-30196,-12725,-30235,-12633,-30273,-12540,-30312,-12447,-30350,-12354,-30387,-12261,-30425,-12167,-30462,-12074,-30499,-11981,-30536,-11887,-30572,-11793,-30608,-11699,-30644,-11605,-30679,-11511,-30714,-11417,-30749,-11323,-30784,-11228,-30818,-11134,-30852,-11039,-30886,-10945,-30919,-10850,-30952,-10755,-30985,-10660,-31018,-10565,-31050,-10470,-31082,-10374,-31114,-10279,-31145,-10183,-31176,-10088,-31207,-9992,-31237,-9896,-31268,-9800,-31298,-9704,-31327,-9608,-31357,-9512,-31386,-9416,-31414,-9320,-31443,-9223,-31471,-9127,-31499,-9030,-31526,-8933,-31554,-8837,-31581,-8740,-31607,-8643,-31634,-8546,-31660,-8449,-31685,-8352,-31711,-8254,-31736,-8157,-31761,-8060,-31786,-7962,-31810,-7865,-31834,-7767,-31857,-7669,-31881,-7572,-31904,-7474,-31927,-7376,-31949,-7278,-31971,-7180,-31993,-7082,-32015,-6983,-32036,-6885,-32057,-6787,-32078,-6689,-32098,-6590,-32118,-6492,-32138,-6393,-32157,-6294,-32177,-6196,-32195,-6097,-32214,-5998,-32232,-5899,-32250,-5800,-32268,-5701,-32285,-5602,-32302,-5503,-32319,-5404,-32335,-5305,-32351,-5206,-32367,-5107,-32383,-5007,-32398,-4908,-32413,-4808,-32427,-4709,-32442,-4609,-32456,-4510,-32469,-4410,-32483,-4311,-32496,-4211,-32509,-4111,-32521,-4012,-32533,-3912,-32545,-3812,-32557,-3712,-32568,-3612,-32579,-3512,-32589,-3412,-32600,-3312,-32610,-3212,-32619,-3112,-32629,-3012,-32638,-2912,-32647,-2812,-32655,-2712,-32663,-2611,-32671,-2511,-32679,-2411,-32686,-2311,-32693,-2210,-32700,-2110,-32706,-2010,-32712,-1909,-32718,-1809,-32723,-1709,-32728,-1608,-32733,-1508,-32737,-1407,-32741,-1307,-32745,-1207,-32749,-1106,-32752,-1006,-32755,-905,-32758,-805,-32760,-704,-32762,-604,-32764,-503,-32765,-403,-32766,-302,-32767,-202,-32767,-101}; +int16_t tw2048[2048] __attribute__((aligned(32))); #ifndef __AVX2__ void dft2048(int16_t *x,int16_t *y,int scale) @@ -4732,7 +4742,9 @@ void idft2048(int16_t *x,int16_t *y,int scale) #endif -#include "twiddles4096.h" + + +int16_t tw4096[3*2*1024]; #ifndef __AVX2__ void dft4096(int16_t *x,int16_t *y,int scale) @@ -4965,7 +4977,7 @@ void idft4096(int16_t *x,int16_t *y,int scale) #endif //__AVX2__ -#include "twiddles8192.h" +int16_t tw8192[2*4096] __attribute__((aligned(32))); #ifndef __AVX2__ void dft8192(int16_t *x,int16_t *y,int scale) @@ -5154,6 +5166,7 @@ void dft8192(int16_t *x,int16_t *y,int scale) simd256_q15_t xtmp[1024],*xtmpp,*x256 = (simd256_q15_t *)x; simd256_q15_t ytmp[1024],*tw8192_256p=(simd256_q15_t *)tw8192,*y256=(simd256_q15_t *)y,*y256p=(simd256_q15_t *)y; + simd256_q15_t *ytmpp = &ytmp[0]; int i; simd256_q15_t ONE_OVER_SQRT2_Q15_128 = set1_int16_simd256(ONE_OVER_SQRT2_Q15); @@ -5332,7 +5345,8 @@ void idft8192(int16_t *x,int16_t *y,int scale) #endif -#include "twiddle1536.h" +int16_t twa1536[1024],twb1536[1024]; + // 512 x 3 void idft1536(int16_t *input, int16_t *output, int scale) { @@ -5410,10 +5424,11 @@ void dft1536(int16_t *input, int16_t *output, int scale) tmpo[1][i] = tmpo[1][i<<1]; tmpo[2][i] = tmpo[2][i<<1]; }*/ - - // LOG_M("out0.m","o0",tmpo[0],2048,1,1); - // LOG_M("out1.m","o1",tmpo[1],2048,1,1); - // LOG_M("out2.m","o2",tmpo[2],2048,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft1536out0.m","o0",tmpo[0],2048,1,1); + LOG_M("dft1536out1.m","o1",tmpo[1],2048,1,1); + LOG_M("dft1536out2.m","o2",tmpo[2],2048,1,1); + } for (i=0,i2=0; i<1024; i+=8,i2+=4) { bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+1024+i),(simd_q15_t*)(output+2048+i), @@ -5447,24 +5462,121 @@ void dft1536(int16_t *input, int16_t *output, int scale) } +int16_t twa3072[2048] __attribute__((aligned(32))); +int16_t twb3072[2048] __attribute__((aligned(32))); // 1024 x 3 -void dft3072(int16_t *input, int16_t *output) +void dft3072(int16_t *input, int16_t *output,int scale) { + int i,i2,j; + uint32_t tmp[3][1024] __attribute__((aligned(32))); + uint32_t tmpo[3][1024] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<1024; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + dft1024((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + dft1024((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + dft1024((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<2048; i+=8,i2+=4) { + bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+2048+i),(simd_q15_t*)(output+4096+i), + (simd_q15_t*)(twa3072+i),(simd_q15_t*)(twb3072+i)); + } + + if (scale==1) { + for (i=0; i<48; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + _mm_empty(); + _m_empty(); } -void idft3072(int16_t *input, int16_t *output) +void idft3072(int16_t *input, int16_t *output,int scale) { + int i,i2,j; + uint32_t tmp[3][1024]__attribute__((aligned(32))); + uint32_t tmpo[3][1024] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<1024; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft1024((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + idft1024((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + idft1024((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<2048; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+2048+i),(simd_q15_t*)(output+4096+i), + (simd_q15_t*)(twa3072+i),(simd_q15_t*)(twb3072+i)); + } + + + if (scale==1) { + for (i=0; i<48; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + _mm_empty(); + _m_empty(); } -#include "twiddle6144.h" -void idft6144(int16_t *input, int16_t *output) +int16_t twa6144[4096] __attribute__((aligned(32))); +int16_t twb6144[4096] __attribute__((aligned(32))); + +void idft6144(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][2048] __attribute__((aligned(32))); uint32_t tmpo[3][2048] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<2048; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5476,17 +5588,12 @@ void idft6144(int16_t *input, int16_t *output) idft2048((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); idft2048((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - /* - for (i=1; i<2048; i++) { - tmpo[0][i] = tmpo[0][i<<1]; - tmpo[1][i] = tmpo[1][i<<1]; - tmpo[2][i] = tmpo[2][i<<1]; - }*/ - - // LOG_M("in.m","in",input,6144,1,1); - // LOG_M("out0.m","o0",tmpo[0],2048,1,1); - // LOG_M("out1.m","o1",tmpo[1],2048,1,1); - // LOG_M("out2.m","o2",tmpo[2],2048,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("idft6144in.m","in",input,6144,1,1); + LOG_M("idft6144out0.m","o0",tmpo[0],2048,1,1); + LOG_M("idft6144out1.m","o1",tmpo[1],2048,1,1); + LOG_M("idft6144out2.m","o2",tmpo[2],2048,1,1); + } for (i=0,i2=0; i<4096; i+=8,i2+=4) { ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]), @@ -5494,18 +5601,42 @@ void idft6144(int16_t *input, int16_t *output) (simd_q15_t*)(twa6144+i),(simd_q15_t*)(twb6144+i)); } - // LOG_M("out.m","out",output,6144,1,1); + + if (scale==1) { + for (i=0; i<96; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + _mm_empty(); _m_empty(); } -void dft6144(int16_t *input, int16_t *output) +void dft6144(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][2048] __attribute__((aligned(32))); uint32_t tmpo[3][2048] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<2048; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5523,29 +5654,55 @@ void dft6144(int16_t *input, int16_t *output) tmpo[1][i] = tmpo[1][i<<1]; tmpo[2][i] = tmpo[2][i<<1]; }*/ - - // LOG_M("out0.m","o0",tmpo[0],2048,1,1); - // LOG_M("out1.m","o1",tmpo[1],2048,1,1); - // LOG_M("out2.m","o2",tmpo[2],2048,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("ft6144out0.m","o0",tmpo[0],2048,1,1); + LOG_M("ft6144out1.m","o1",tmpo[1],2048,1,1); + LOG_M("ft6144out2.m","o2",tmpo[2],2048,1,1); + } for (i=0,i2=0; i<4096; i+=8,i2+=4) { bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+4096+i),(simd_q15_t*)(output+8192+i), (simd_q15_t*)(twa6144+i),(simd_q15_t*)(twb6144+i)); } + if (scale==1) { + for (i=0; i<96; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + _mm_empty(); _m_empty(); } -#include "twiddle12288.h" +int16_t twa12288[8192] __attribute__((aligned(32))); +int16_t twb12288[8192] __attribute__((aligned(32))); // 4096 x 3 -void dft12288(int16_t *input, int16_t *output) +void dft12288(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][4096] __attribute__((aligned(32))); uint32_t tmpo[3][4096] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<4096; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5553,35 +5710,59 @@ void dft12288(int16_t *input, int16_t *output) tmp[2][i] = ((uint32_t *)input)[j++]; } - dft4096((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); - dft4096((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); - dft4096((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + dft4096((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),scale); + dft4096((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),scale); + dft4096((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),scale); /* for (i=1; i<4096; i++) { tmpo[0][i] = tmpo[0][i<<1]; tmpo[1][i] = tmpo[1][i<<1]; tmpo[2][i] = tmpo[2][i<<1]; }*/ - - // LOG_M("out0.m","o0",tmpo[0],4096,1,1); - // LOG_M("out1.m","o1",tmpo[1],4096,1,1); - // LOG_M("out2.m","o2",tmpo[2],4096,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft12288out0.m","o0",tmpo[0],4096,1,1); + LOG_M("dft12288out1.m","o1",tmpo[1],4096,1,1); + LOG_M("dft12288out2.m","o2",tmpo[2],4096,1,1); + } for (i=0,i2=0; i<8192; i+=8,i2+=4) { bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+8192+i),(simd_q15_t*)(output+16384+i), (simd_q15_t*)(twa12288+i),(simd_q15_t*)(twb12288+i)); } + if (scale==1) { + for (i=0; i<192; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } _mm_empty(); _m_empty(); } -void idft12288(int16_t *input, int16_t *output) +void idft12288(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][4096] __attribute__((aligned(32))); uint32_t tmpo[3][4096] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<4096; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5590,34 +5771,62 @@ void idft12288(int16_t *input, int16_t *output) } - idft4096((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); - idft4096((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); - idft4096((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - /* - LOG_M("in.m","in",input,12288,1,1); - LOG_M("out0.m","o0",tmpo[0],4096,1,1); - LOG_M("out1.m","o1",tmpo[1],4096,1,1); - LOG_M("out2.m","o2",tmpo[2],4096,1,1); - */ + + idft4096((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),scale); + idft4096((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),scale); + idft4096((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),scale); + + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("idft12288in.m","in",input,12288,1,1); + LOG_M("idft12288out0.m","o0",tmpo[0],4096,1,1); + LOG_M("idft12288out1.m","o1",tmpo[1],4096,1,1); + LOG_M("idft12288out2.m","o2",tmpo[2],4096,1,1); + } + for (i=0,i2=0; i<8192; i+=8,i2+=4) { ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+8192+i),(simd_q15_t*)(output+16384+i), (simd_q15_t*)(twa12288+i),(simd_q15_t*)(twb12288+i)); } + if (scale==1) { + for (i=0; i<192; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } _mm_empty(); _m_empty(); - - // LOG_M("out.m","out",output,6144,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("idft12288out.m","out",output,6144,1,1); + } } -#include "twiddle18432.h" +int16_t twa18432[12288] __attribute__((aligned(32))); +int16_t twb18432[12288] __attribute__((aligned(32))); // 6144 x 3 -void dft18432(int16_t *input, int16_t *output) { +void dft18432(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][6144] __attribute__((aligned(32))); uint32_t tmpo[3][6144] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<6144; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5625,25 +5834,47 @@ void dft18432(int16_t *input, int16_t *output) { tmp[2][i] = ((uint32_t *)input)[j++]; } - dft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); - dft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); - dft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + dft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),scale); + dft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),scale); + dft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),scale); for (i=0,i2=0; i<12288; i+=8,i2+=4) { bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); } - + if (scale==1) { + for (i=0; i<288; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } _mm_empty(); _m_empty(); } -void idft18432(int16_t *input, int16_t *output) { +void idft18432(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][6144] __attribute__((aligned(32))); uint32_t tmpo[3][6144] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<6144; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5651,28 +5882,52 @@ void idft18432(int16_t *input, int16_t *output) { tmp[2][i] = ((uint32_t *)input)[j++]; } - idft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); - idft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); - idft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + idft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),scale); + idft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),scale); + idft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),scale); for (i=0,i2=0; i<12288; i+=8,i2+=4) { ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); } - - _mm_empty(); - _m_empty(); -} - -#include "twiddle24576.h" -// 8192 x 3 -void dft24576(int16_t *input, int16_t *output) -{ - int i,i2,j; - uint32_t tmp[3][8192] __attribute__((aligned(32))); - uint32_t tmpo[3][8192] __attribute__((aligned(32))); - + if (scale==1) { + for (i=0; i<288; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + _mm_empty(); + _m_empty(); +} + + +int16_t twa24576[16384] __attribute__((aligned(32))); +int16_t twb24576[16384] __attribute__((aligned(32))); +// 8192 x 3 +void dft24576(int16_t *input, int16_t *output,int scale) +{ + int i,i2,j; + uint32_t tmp[3][8192] __attribute__((aligned(32))); + uint32_t tmpo[3][8192] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + for (i=0,j=0; i<8192; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; tmp[1][i] = ((uint32_t *)input)[j++]; @@ -5688,27 +5943,53 @@ void dft24576(int16_t *input, int16_t *output) tmpo[1][i] = tmpo[1][i<<1]; tmpo[2][i] = tmpo[2][i<<1]; }*/ - - // LOG_M("out0.m","o0",tmpo[0],8192,1,1); - // LOG_M("out1.m","o1",tmpo[1],8192,1,1); - // LOG_M("out2.m","o2",tmpo[2],8192,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft24576out0.m","o0",tmpo[0],8192,1,1); + LOG_M("dft24576out1.m","o1",tmpo[1],8192,1,1); + LOG_M("dft24576out2.m","o2",tmpo[2],8192,1,1); + } for (i=0,i2=0; i<16384; i+=8,i2+=4) { bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+16384+i),(simd_q15_t*)(output+32768+i), (simd_q15_t*)(twa24576+i),(simd_q15_t*)(twb24576+i)); } + + if (scale==1) { + for (i=0; i<384; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } _mm_empty(); _m_empty(); - - // LOG_M("out.m","out",output,24576,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("out.m","out",output,24576,1,1); + } } -void idft24576(int16_t *input, int16_t *output) +void idft24576(int16_t *input, int16_t *output,int scale) { int i,i2,j; uint32_t tmp[3][8192] __attribute__((aligned(32))); uint32_t tmpo[3][8192] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); for (i=0,j=0; i<8192; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5720,23 +6001,45 @@ void idft24576(int16_t *input, int16_t *output) idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - /* - LOG_M("in.m","in",input,24576,1,1); - LOG_M("out0.m","o0",tmpo[0],8192,1,1); - LOG_M("out1.m","o1",tmpo[1],8192,1,1); - LOG_M("out2.m","o2",tmpo[2],8192,1,1); - */ + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("idft24576in.m","in",input,24576,1,1); + LOG_M("idft24576out0.m","o0",tmpo[0],8192,1,1); + LOG_M("idft24576out1.m","o1",tmpo[1],8192,1,1); + LOG_M("idft24576out2.m","o2",tmpo[2],8192,1,1); + } for (i=0,i2=0; i<16384; i+=8,i2+=4) { ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]), (simd_q15_t*)(output+i),(simd_q15_t*)(output+16384+i),(simd_q15_t*)(output+32768+i), (simd_q15_t*)(twa24576+i),(simd_q15_t*)(twb24576+i)); } - + if (scale==1) { + for (i=0; i<384; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } _mm_empty(); _m_empty(); - // LOG_M("out.m","out",output,24576,1,1); + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("idft24576out.m","out",output,24576,1,1); + } } /// THIS SECTION IS FOR ALL PUSCH DFTS (i.e. radix 2^a * 3^b * 4^c * 5^d) @@ -6111,23 +6414,7 @@ void dft12_simd256(int16_t *x,int16_t *y) #endif -static int16_t tw24[88]__attribute__((aligned(32))) = {31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 0,-32767,0,-32767,0,-32767,0,-32767, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480 - }; - -//static simd_q15_t ytmp128array[300]; -//static simd_q15_t ytmp128array2[300]; -//static simd_q15_t ytmp128array3[300]; -//static simd_q15_t x2128array[300]; +static int16_t tw24[88]__attribute__((aligned(32))); void dft24(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -6222,31 +6509,8 @@ void dft24(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa36[88]__attribute__((aligned(32))) = {32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 0,-32767,0,-32767,0,-32767,0,-32767, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790 - }; - -static int16_t twb36[88]__attribute__((aligned(32))) = {30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -32767,0,-32767,0,-32767,0,-32767,0, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -25100,21062,-25100,21062,-25100,21062,-25100,21062 - }; +static int16_t twa36[88]__attribute__((aligned(32))); +static int16_t twb36[88]__attribute__((aligned(32))); void dft36(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -6368,44 +6632,9 @@ void dft36(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa48[88]__attribute__((aligned(32))) = {32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486 - }; - -static int16_t twb48[88]__attribute__((aligned(32))) = {31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 0,-32767,0,-32767,0,-32767,0,-32767, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480 - }; - -static int16_t twc48[88]__attribute__((aligned(32))) = {30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 0,-32767,0,-32767,0,-32767,0,-32767, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -32767,0,-32767,0,-32767,0,-32767,0, - -30272,12539,-30272,12539,-30272,12539,-30272,12539, - -23169,23169,-23169,23169,-23169,23169,-23169,23169, - -12539,30272,-12539,30272,-12539,30272,-12539,30272 - }; +static int16_t twa48[88]__attribute__((aligned(32))); +static int16_t twb48[88]__attribute__((aligned(32))); +static int16_t twc48[88]__attribute__((aligned(32))); void dft48(int16_t *x, int16_t *y,unsigned char scale_flag) { @@ -6564,54 +6793,10 @@ void dft48(int16_t *x, int16_t *y,unsigned char scale_flag) } -static int16_t twa60[88]__attribute__((aligned(32))) = {32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934 - }; -static int16_t twb60[88]__attribute__((aligned(32))) = {32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -21925,-24350,-21925,-24350,-21925,-24350,-21925,-24350 - }; -static int16_t twc60[88]__attribute__((aligned(32))) = {31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 0,-32767,0,-32767,0,-32767,0,-32767, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -19259,-26509,-19259,-26509,-19259,-26509,-19259,-26509, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -31163,-10125,-31163,-10125,-31163,-10125,-31163,-10125, - -32767,0,-32767,0,-32767,0,-32767,0, - -31163,10125,-31163,10125,-31163,10125,-31163,10125 - }; -static int16_t twd60[88]__attribute__((aligned(32))) = {29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -32050,-6812,-32050,-6812,-32050,-6812,-32050,-6812, - -32050,6812,-32050,6812,-32050,6812,-32050,6812, - -26509,19259,-26509,19259,-26509,19259,-26509,19259, - -16383,28377,-16383,28377,-16383,28377,-16383,28377, - -3425,32587,-3425,32587,-3425,32587,-3425,32587 - }; +static int16_t twa60[88]__attribute__((aligned(32))); +static int16_t twb60[88]__attribute__((aligned(32))); +static int16_t twc60[88]__attribute__((aligned(32))); +static int16_t twd60[88]__attribute__((aligned(32))); void dft60(int16_t *x,int16_t *y,unsigned char scale) { @@ -6793,42 +6978,7 @@ void dft60(int16_t *x,int16_t *y,unsigned char scale) } -static int16_t tw72[280]__attribute__((aligned(32))) = {32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18794,-26841,-18794,-26841,-18794,-26841,-18794,-26841, - -21062,-25100,-21062,-25100,-21062,-25100,-21062,-25100, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -26841,-18794,-26841,-18794,-26841,-18794,-26841,-18794, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29696,-13847,-29696,-13847,-29696,-13847,-29696,-13847, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32269,-5689,-32269,-5689,-32269,-5689,-32269,-5689, - -32642,-2855,-32642,-2855,-32642,-2855,-32642,-2855, - }; +static int16_t tw72[280]__attribute__((aligned(32))); void dft72(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -6872,54 +7022,7 @@ void dft72(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t tw96[376]__attribute__((aligned(32))) = {32696,-2143,32696,-2143,32696,-2143,32696,-2143, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32137,-6392,32137,-6392,32137,-6392,32137,-6392, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31028,-10532,31028,-10532,31028,-10532,31028,-10532, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29387,-14492,29387,-14492,29387,-14492,29387,-14492, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27244,-18204,27244,-18204,27244,-18204,27244,-18204, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 24635,-21604,24635,-21604,24635,-21604,24635,-21604, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21604,-24635,21604,-24635,21604,-24635,21604,-24635, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 18204,-27244,18204,-27244,18204,-27244,18204,-27244, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14492,-29387,14492,-29387,14492,-29387,14492,-29387, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 10532,-31028,10532,-31028,10532,-31028,10532,-31028, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 6392,-32137,6392,-32137,6392,-32137,6392,-32137, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 2143,-32696,2143,-32696,2143,-32696,2143,-32696, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2143,-32696,-2143,-32696,-2143,-32696,-2143,-32696, - -4276,-32486,-4276,-32486,-4276,-32486,-4276,-32486, - -6392,-32137,-6392,-32137,-6392,-32137,-6392,-32137, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -10532,-31028,-10532,-31028,-10532,-31028,-10532,-31028, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -14492,-29387,-14492,-29387,-14492,-29387,-14492,-29387, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18204,-27244,-18204,-27244,-18204,-27244,-18204,-27244, - -19947,-25995,-19947,-25995,-19947,-25995,-19947,-25995, - -21604,-24635,-21604,-24635,-21604,-24635,-21604,-24635, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24635,-21604,-24635,-21604,-24635,-21604,-24635,-21604, - -25995,-19947,-25995,-19947,-25995,-19947,-25995,-19947, - -27244,-18204,-27244,-18204,-27244,-18204,-27244,-18204, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29387,-14492,-29387,-14492,-29387,-14492,-29387,-14492, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -31028,-10532,-31028,-10532,-31028,-10532,-31028,-10532, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32137,-6392,-32137,-6392,-32137,-6392,-32137,-6392, - -32486,-4276,-32486,-4276,-32486,-4276,-32486,-4276, - -32696,-2143,-32696,-2143,-32696,-2143,-32696,-2143 - }; +static int16_t tw96[376]__attribute__((aligned(32))); void dft96(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -6965,84 +7068,11 @@ void dft96(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa108[280]__attribute__((aligned(32))) = {32711,-1905,32711,-1905,32711,-1905,32711,-1905, - 32545,-3804,32545,-3804,32545,-3804,32545,-3804, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31883,-7556,31883,-7556,31883,-7556,31883,-7556, - 31390,-9397,31390,-9397,31390,-9397,31390,-9397, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30087,-12978,30087,-12978,30087,-12978,30087,-12978, - 29281,-14705,29281,-14705,29281,-14705,29281,-14705, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27376,-18005,27376,-18005,27376,-18005,27376,-18005, - 26283,-19567,26283,-19567,26283,-19567,26283,-19567, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 23833,-22486,23833,-22486,23833,-22486,23833,-22486, - 22486,-23833,22486,-23833,22486,-23833,22486,-23833, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 19567,-26283,19567,-26283,19567,-26283,19567,-26283, - 18005,-27376,18005,-27376,18005,-27376,18005,-27376, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14705,-29281,14705,-29281,14705,-29281,14705,-29281, - 12978,-30087,12978,-30087,12978,-30087,12978,-30087, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 9397,-31390,9397,-31390,9397,-31390,9397,-31390, - 7556,-31883,7556,-31883,7556,-31883,7556,-31883, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 3804,-32545,3804,-32545,3804,-32545,3804,-32545, - 1905,-32711,1905,-32711,1905,-32711,1905,-32711, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1905,-32711,-1905,-32711,-1905,-32711,-1905,-32711, - -3804,-32545,-3804,-32545,-3804,-32545,-3804,-32545, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -7556,-31883,-7556,-31883,-7556,-31883,-7556,-31883, - -9397,-31390,-9397,-31390,-9397,-31390,-9397,-31390, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12978,-30087,-12978,-30087,-12978,-30087,-12978,-30087, - -14705,-29281,-14705,-29281,-14705,-29281,-14705,-29281 - }; - -static int16_t twb108[280]__attribute__((aligned(32))) = {32545,-3804,32545,-3804,32545,-3804,32545,-3804, - 31883,-7556,31883,-7556,31883,-7556,31883,-7556, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 29281,-14705,29281,-14705,29281,-14705,29281,-14705, - 27376,-18005,27376,-18005,27376,-18005,27376,-18005, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 22486,-23833,22486,-23833,22486,-23833,22486,-23833, - 19567,-26283,19567,-26283,19567,-26283,19567,-26283, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 12978,-30087,12978,-30087,12978,-30087,12978,-30087, - 9397,-31390,9397,-31390,9397,-31390,9397,-31390, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 1905,-32711,1905,-32711,1905,-32711,1905,-32711, - -1905,-32711,-1905,-32711,-1905,-32711,-1905,-32711, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -9397,-31390,-9397,-31390,-9397,-31390,-9397,-31390, - -12978,-30087,-12978,-30087,-12978,-30087,-12978,-30087, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -19567,-26283,-19567,-26283,-19567,-26283,-19567,-26283, - -22486,-23833,-22486,-23833,-22486,-23833,-22486,-23833, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -27376,-18005,-27376,-18005,-27376,-18005,-27376,-18005, - -29281,-14705,-29281,-14705,-29281,-14705,-29281,-14705, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31883,-7556,-31883,-7556,-31883,-7556,-31883,-7556, - -32545,-3804,-32545,-3804,-32545,-3804,-32545,-3804, - -32767,0,-32767,0,-32767,0,-32767,0, - -32545,3804,-32545,3804,-32545,3804,-32545,3804, - -31883,7556,-31883,7556,-31883,7556,-31883,7556, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -29281,14705,-29281,14705,-29281,14705,-29281,14705, - -27376,18005,-27376,18005,-27376,18005,-27376,18005, - -25100,21062,-25100,21062,-25100,21062,-25100,21062, - -22486,23833,-22486,23833,-22486,23833,-22486,23833, - -19567,26283,-19567,26283,-19567,26283,-19567,26283 - }; +static int16_t twa108[280]__attribute__((aligned(32))); +static int16_t twb108[280]__attribute__((aligned(32))); void dft108(int16_t *x,int16_t *y,unsigned char scale_flag) { - - int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; @@ -7089,71 +7119,9 @@ void dft108(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t tw120[472]__attribute__((aligned(32))) = {32722,-1714,32722,-1714,32722,-1714,32722,-1714, - 32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32363,-5125,32363,-5125,32363,-5125,32363,-5125, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30590,-11742,30590,-11742,30590,-11742,30590,-11742, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29195,-14875,29195,-14875,29195,-14875,29195,-14875, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27480,-17846,27480,-17846,27480,-17846,27480,-17846, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25464,-20620,25464,-20620,25464,-20620,25464,-20620, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 20620,-25464,20620,-25464,20620,-25464,20620,-25464, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 17846,-27480,17846,-27480,17846,-27480,17846,-27480, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14875,-29195,14875,-29195,14875,-29195,14875,-29195, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934, - 11742,-30590,11742,-30590,11742,-30590,11742,-30590, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 6812,-32050,6812,-32050,6812,-32050,6812,-32050, - 5125,-32363,5125,-32363,5125,-32363,5125,-32363, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 1714,-32722,1714,-32722,1714,-32722,1714,-32722, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1714,-32722,-1714,-32722,-1714,-32722,-1714,-32722, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -5125,-32363,-5125,-32363,-5125,-32363,-5125,-32363, - -6812,-32050,-6812,-32050,-6812,-32050,-6812,-32050, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -11742,-30590,-11742,-30590,-11742,-30590,-11742,-30590, - -13327,-29934,-13327,-29934,-13327,-29934,-13327,-29934, - -14875,-29195,-14875,-29195,-14875,-29195,-14875,-29195, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -17846,-27480,-17846,-27480,-17846,-27480,-17846,-27480, - -19259,-26509,-19259,-26509,-19259,-26509,-19259,-26509, - -20620,-25464,-20620,-25464,-20620,-25464,-20620,-25464, - -21925,-24350,-21925,-24350,-21925,-24350,-21925,-24350, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24350,-21925,-24350,-21925,-24350,-21925,-24350,-21925, - -25464,-20620,-25464,-20620,-25464,-20620,-25464,-20620, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -27480,-17846,-27480,-17846,-27480,-17846,-27480,-17846, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29195,-14875,-29195,-14875,-29195,-14875,-29195,-14875, - -29934,-13327,-29934,-13327,-29934,-13327,-29934,-13327, - -30590,-11742,-30590,-11742,-30590,-11742,-30590,-11742, - -31163,-10125,-31163,-10125,-31163,-10125,-31163,-10125, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32050,-6812,-32050,-6812,-32050,-6812,-32050,-6812, - -32363,-5125,-32363,-5125,-32363,-5125,-32363,-5125, - -32587,-3425,-32587,-3425,-32587,-3425,-32587,-3425, - -32722,-1714,-32722,-1714,-32722,-1714,-32722,-1714 - }; - +static int16_t tw120[472]__attribute__((aligned(32))); void dft120(int16_t *x,int16_t *y, unsigned char scale_flag) { - - int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; @@ -7161,7 +7129,6 @@ void dft120(int16_t *x,int16_t *y, unsigned char scale_flag) simd_q15_t x2128[120];// = (simd_q15_t *)&x2128array[0]; simd_q15_t ytmp128[120];//=&ytmp128array2[0]; - for (i=0,j=0; i<60; i++,j+=2) { x2128[i] = x128[j]; x2128[i+60] = x128[j+1]; @@ -7194,107 +7161,11 @@ void dft120(int16_t *x,int16_t *y, unsigned char scale_flag) } -static int16_t twa144[376]__attribute__((aligned(32))) = {32735,-1429,32735,-1429,32735,-1429,32735,-1429, - 32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31990,-7092,31990,-7092,31990,-7092,31990,-7092, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31250,-9853,31250,-9853,31250,-9853,31250,-9853, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 29064,-15130,29064,-15130,29064,-15130,29064,-15130, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27635,-17605,27635,-17605,27635,-17605,27635,-17605, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 24158,-22137,24158,-22137,24158,-22137,24158,-22137, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22137,-24158,22137,-24158,22137,-24158,22137,-24158, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 17605,-27635,17605,-27635,17605,-27635,17605,-27635, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15130,-29064,15130,-29064,15130,-29064,15130,-29064, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 9853,-31250,9853,-31250,9853,-31250,9853,-31250, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7092,-31990,7092,-31990,7092,-31990,7092,-31990, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 1429,-32735,1429,-32735,1429,-32735,1429,-32735, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1429,-32735,-1429,-32735,-1429,-32735,-1429,-32735, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -4276,-32486,-4276,-32486,-4276,-32486,-4276,-32486, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -7092,-31990,-7092,-31990,-7092,-31990,-7092,-31990, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -9853,-31250,-9853,-31250,-9853,-31250,-9853,-31250, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -15130,-29064,-15130,-29064,-15130,-29064,-15130,-29064 - }; - -static int16_t twb144[376]__attribute__((aligned(32))) = {32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18794,-26841,-18794,-26841,-18794,-26841,-18794,-26841, - -21062,-25100,-21062,-25100,-21062,-25100,-21062,-25100, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -26841,-18794,-26841,-18794,-26841,-18794,-26841,-18794, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29696,-13847,-29696,-13847,-29696,-13847,-29696,-13847, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32269,-5689,-32269,-5689,-32269,-5689,-32269,-5689, - -32642,-2855,-32642,-2855,-32642,-2855,-32642,-2855, - -32767,0,-32767,0,-32767,0,-32767,0, - -32642,2855,-32642,2855,-32642,2855,-32642,2855, - -32269,5689,-32269,5689,-32269,5689,-32269,5689, - -31650,8480,-31650,8480,-31650,8480,-31650,8480, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -29696,13847,-29696,13847,-29696,13847,-29696,13847, - -28377,16383,-28377,16383,-28377,16383,-28377,16383, - -26841,18794,-26841,18794,-26841,18794,-26841,18794, - -25100,21062,-25100,21062,-25100,21062,-25100,21062, - -23169,23169,-23169,23169,-23169,23169,-23169,23169, - -21062,25100,-21062,25100,-21062,25100,-21062,25100, - -18794,26841,-18794,26841,-18794,26841,-18794,26841 - }; +static int16_t twa144[376]__attribute__((aligned(32))); +static int16_t twb144[376]__attribute__((aligned(32))); void dft144(int16_t *x,int16_t *y,unsigned char scale_flag) { - int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; @@ -7341,127 +7212,8 @@ void dft144(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa180[472]__attribute__((aligned(32))) = {32747,-1143,32747,-1143,32747,-1143,32747,-1143, - 32687,-2285,32687,-2285,32687,-2285,32687,-2285, - 32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32448,-4560,32448,-4560,32448,-4560,32448,-4560, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31793,-7927,31793,-7927,31793,-7927,31793,-7927, - 31497,-9031,31497,-9031,31497,-9031,31497,-9031, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30381,-12274,30381,-12274,30381,-12274,30381,-12274, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29450,-14364,29450,-14364,29450,-14364,29450,-14364, - 28931,-15383,28931,-15383,28931,-15383,28931,-15383, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27787,-17363,27787,-17363,27787,-17363,27787,-17363, - 27165,-18323,27165,-18323,27165,-18323,27165,-18323, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25820,-20173,25820,-20173,25820,-20173,25820,-20173, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 23570,-22761,23570,-22761,23570,-22761,23570,-22761, - 22761,-23570,22761,-23570,22761,-23570,22761,-23570, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 20173,-25820,20173,-25820,20173,-25820,20173,-25820, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 18323,-27165,18323,-27165,18323,-27165,18323,-27165, - 17363,-27787,17363,-27787,17363,-27787,17363,-27787, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15383,-28931,15383,-28931,15383,-28931,15383,-28931, - 14364,-29450,14364,-29450,14364,-29450,14364,-29450, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934, - 12274,-30381,12274,-30381,12274,-30381,12274,-30381, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 9031,-31497,9031,-31497,9031,-31497,9031,-31497, - 7927,-31793,7927,-31793,7927,-31793,7927,-31793, - 6812,-32050,6812,-32050,6812,-32050,6812,-32050, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 4560,-32448,4560,-32448,4560,-32448,4560,-32448, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 2285,-32687,2285,-32687,2285,-32687,2285,-32687, - 1143,-32747,1143,-32747,1143,-32747,1143,-32747, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1143,-32747,-1143,-32747,-1143,-32747,-1143,-32747, - -2285,-32687,-2285,-32687,-2285,-32687,-2285,-32687, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -4560,-32448,-4560,-32448,-4560,-32448,-4560,-32448, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -6812,-32050,-6812,-32050,-6812,-32050,-6812,-32050, - -7927,-31793,-7927,-31793,-7927,-31793,-7927,-31793, - -9031,-31497,-9031,-31497,-9031,-31497,-9031,-31497, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12274,-30381,-12274,-30381,-12274,-30381,-12274,-30381, - -13327,-29934,-13327,-29934,-13327,-29934,-13327,-29934, - -14364,-29450,-14364,-29450,-14364,-29450,-14364,-29450, - -15383,-28931,-15383,-28931,-15383,-28931,-15383,-28931 - }; - -static int16_t twb180[472]__attribute__((aligned(32))) = {32687,-2285,32687,-2285,32687,-2285,32687,-2285, - 32448,-4560,32448,-4560,32448,-4560,32448,-4560, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31497,-9031,31497,-9031,31497,-9031,31497,-9031, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 28931,-15383,28931,-15383,28931,-15383,28931,-15383, - 27787,-17363,27787,-17363,27787,-17363,27787,-17363, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 23570,-22761,23570,-22761,23570,-22761,23570,-22761, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 20173,-25820,20173,-25820,20173,-25820,20173,-25820, - 18323,-27165,18323,-27165,18323,-27165,18323,-27165, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14364,-29450,14364,-29450,14364,-29450,14364,-29450, - 12274,-30381,12274,-30381,12274,-30381,12274,-30381, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 7927,-31793,7927,-31793,7927,-31793,7927,-31793, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 1143,-32747,1143,-32747,1143,-32747,1143,-32747, - -1143,-32747,-1143,-32747,-1143,-32747,-1143,-32747, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -7927,-31793,-7927,-31793,-7927,-31793,-7927,-31793, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -12274,-30381,-12274,-30381,-12274,-30381,-12274,-30381, - -14364,-29450,-14364,-29450,-14364,-29450,-14364,-29450, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18323,-27165,-18323,-27165,-18323,-27165,-18323,-27165, - -20173,-25820,-20173,-25820,-20173,-25820,-20173,-25820, - -21925,-24350,-21925,-24350,-21925,-24350,-21925,-24350, - -23570,-22761,-23570,-22761,-23570,-22761,-23570,-22761, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -27787,-17363,-27787,-17363,-27787,-17363,-27787,-17363, - -28931,-15383,-28931,-15383,-28931,-15383,-28931,-15383, - -29934,-13327,-29934,-13327,-29934,-13327,-29934,-13327, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31497,-9031,-31497,-9031,-31497,-9031,-31497,-9031, - -32050,-6812,-32050,-6812,-32050,-6812,-32050,-6812, - -32448,-4560,-32448,-4560,-32448,-4560,-32448,-4560, - -32687,-2285,-32687,-2285,-32687,-2285,-32687,-2285, - -32767,0,-32767,0,-32767,0,-32767,0, - -32687,2285,-32687,2285,-32687,2285,-32687,2285, - -32448,4560,-32448,4560,-32448,4560,-32448,4560, - -32050,6812,-32050,6812,-32050,6812,-32050,6812, - -31497,9031,-31497,9031,-31497,9031,-31497,9031, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -29934,13327,-29934,13327,-29934,13327,-29934,13327, - -28931,15383,-28931,15383,-28931,15383,-28931,15383, - -27787,17363,-27787,17363,-27787,17363,-27787,17363, - -26509,19259,-26509,19259,-26509,19259,-26509,19259, - -25100,21062,-25100,21062,-25100,21062,-25100,21062, - -23570,22761,-23570,22761,-23570,22761,-23570,22761, - -21925,24350,-21925,24350,-21925,24350,-21925,24350, - -20173,25820,-20173,25820,-20173,25820,-20173,25820, - -18323,27165,-18323,27165,-18323,27165,-18323,27165 - }; +static int16_t twa180[472]__attribute__((aligned(32))); +static int16_t twb180[472]__attribute__((aligned(32))); void dft180(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -7512,152 +7264,9 @@ void dft180(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa192[376]__attribute__((aligned(32))) = {32749,-1072,32749,-1072,32749,-1072,32749,-1072, - 32696,-2143,32696,-2143,32696,-2143,32696,-2143, - 32609,-3211,32609,-3211,32609,-3211,32609,-3211, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32329,-5337,32329,-5337,32329,-5337,32329,-5337, - 32137,-6392,32137,-6392,32137,-6392,32137,-6392, - 31911,-7440,31911,-7440,31911,-7440,31911,-7440, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31356,-9511,31356,-9511,31356,-9511,31356,-9511, - 31028,-10532,31028,-10532,31028,-10532,31028,-10532, - 30666,-11542,30666,-11542,30666,-11542,30666,-11542, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29846,-13523,29846,-13523,29846,-13523,29846,-13523, - 29387,-14492,29387,-14492,29387,-14492,29387,-14492, - 28897,-15446,28897,-15446,28897,-15446,28897,-15446, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27825,-17303,27825,-17303,27825,-17303,27825,-17303, - 27244,-18204,27244,-18204,27244,-18204,27244,-18204, - 26634,-19086,26634,-19086,26634,-19086,26634,-19086, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 25329,-20787,25329,-20787,25329,-20787,25329,-20787, - 24635,-21604,24635,-21604,24635,-21604,24635,-21604, - 23915,-22399,23915,-22399,23915,-22399,23915,-22399, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22399,-23915,22399,-23915,22399,-23915,22399,-23915, - 21604,-24635,21604,-24635,21604,-24635,21604,-24635, - 20787,-25329,20787,-25329,20787,-25329,20787,-25329, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 19086,-26634,19086,-26634,19086,-26634,19086,-26634, - 18204,-27244,18204,-27244,18204,-27244,18204,-27244, - 17303,-27825,17303,-27825,17303,-27825,17303,-27825, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15446,-28897,15446,-28897,15446,-28897,15446,-28897, - 14492,-29387,14492,-29387,14492,-29387,14492,-29387, - 13523,-29846,13523,-29846,13523,-29846,13523,-29846, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 11542,-30666,11542,-30666,11542,-30666,11542,-30666, - 10532,-31028,10532,-31028,10532,-31028,10532,-31028, - 9511,-31356,9511,-31356,9511,-31356,9511,-31356, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7440,-31911,7440,-31911,7440,-31911,7440,-31911, - 6392,-32137,6392,-32137,6392,-32137,6392,-32137, - 5337,-32329,5337,-32329,5337,-32329,5337,-32329, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 3211,-32609,3211,-32609,3211,-32609,3211,-32609, - 2143,-32696,2143,-32696,2143,-32696,2143,-32696, - 1072,-32749,1072,-32749,1072,-32749,1072,-32749 - }; - -static int16_t twb192[376]__attribute__((aligned(32))) = {32696,-2143,32696,-2143,32696,-2143,32696,-2143, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32137,-6392,32137,-6392,32137,-6392,32137,-6392, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31028,-10532,31028,-10532,31028,-10532,31028,-10532, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29387,-14492,29387,-14492,29387,-14492,29387,-14492, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27244,-18204,27244,-18204,27244,-18204,27244,-18204, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 24635,-21604,24635,-21604,24635,-21604,24635,-21604, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21604,-24635,21604,-24635,21604,-24635,21604,-24635, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 18204,-27244,18204,-27244,18204,-27244,18204,-27244, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14492,-29387,14492,-29387,14492,-29387,14492,-29387, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 10532,-31028,10532,-31028,10532,-31028,10532,-31028, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 6392,-32137,6392,-32137,6392,-32137,6392,-32137, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 2143,-32696,2143,-32696,2143,-32696,2143,-32696, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2143,-32696,-2143,-32696,-2143,-32696,-2143,-32696, - -4276,-32486,-4276,-32486,-4276,-32486,-4276,-32486, - -6392,-32137,-6392,-32137,-6392,-32137,-6392,-32137, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -10532,-31028,-10532,-31028,-10532,-31028,-10532,-31028, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -14492,-29387,-14492,-29387,-14492,-29387,-14492,-29387, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18204,-27244,-18204,-27244,-18204,-27244,-18204,-27244, - -19947,-25995,-19947,-25995,-19947,-25995,-19947,-25995, - -21604,-24635,-21604,-24635,-21604,-24635,-21604,-24635, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24635,-21604,-24635,-21604,-24635,-21604,-24635,-21604, - -25995,-19947,-25995,-19947,-25995,-19947,-25995,-19947, - -27244,-18204,-27244,-18204,-27244,-18204,-27244,-18204, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29387,-14492,-29387,-14492,-29387,-14492,-29387,-14492, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -31028,-10532,-31028,-10532,-31028,-10532,-31028,-10532, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32137,-6392,-32137,-6392,-32137,-6392,-32137,-6392, - -32486,-4276,-32486,-4276,-32486,-4276,-32486,-4276, - -32696,-2143,-32696,-2143,-32696,-2143,-32696,-2143 - }; - -static int16_t twc192[376]__attribute__((aligned(32))) = {32609,-3211,32609,-3211,32609,-3211,32609,-3211, - 32137,-6392,32137,-6392,32137,-6392,32137,-6392, - 31356,-9511,31356,-9511,31356,-9511,31356,-9511, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 28897,-15446,28897,-15446,28897,-15446,28897,-15446, - 27244,-18204,27244,-18204,27244,-18204,27244,-18204, - 25329,-20787,25329,-20787,25329,-20787,25329,-20787, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 20787,-25329,20787,-25329,20787,-25329,20787,-25329, - 18204,-27244,18204,-27244,18204,-27244,18204,-27244, - 15446,-28897,15446,-28897,15446,-28897,15446,-28897, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 9511,-31356,9511,-31356,9511,-31356,9511,-31356, - 6392,-32137,6392,-32137,6392,-32137,6392,-32137, - 3211,-32609,3211,-32609,3211,-32609,3211,-32609, - 0,-32767,0,-32767,0,-32767,0,-32767, - -3211,-32609,-3211,-32609,-3211,-32609,-3211,-32609, - -6392,-32137,-6392,-32137,-6392,-32137,-6392,-32137, - -9511,-31356,-9511,-31356,-9511,-31356,-9511,-31356, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -15446,-28897,-15446,-28897,-15446,-28897,-15446,-28897, - -18204,-27244,-18204,-27244,-18204,-27244,-18204,-27244, - -20787,-25329,-20787,-25329,-20787,-25329,-20787,-25329, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -25329,-20787,-25329,-20787,-25329,-20787,-25329,-20787, - -27244,-18204,-27244,-18204,-27244,-18204,-27244,-18204, - -28897,-15446,-28897,-15446,-28897,-15446,-28897,-15446, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -31356,-9511,-31356,-9511,-31356,-9511,-31356,-9511, - -32137,-6392,-32137,-6392,-32137,-6392,-32137,-6392, - -32609,-3211,-32609,-3211,-32609,-3211,-32609,-3211, - -32767,0,-32767,0,-32767,0,-32767,0, - -32609,3211,-32609,3211,-32609,3211,-32609,3211, - -32137,6392,-32137,6392,-32137,6392,-32137,6392, - -31356,9511,-31356,9511,-31356,9511,-31356,9511, - -30272,12539,-30272,12539,-30272,12539,-30272,12539, - -28897,15446,-28897,15446,-28897,15446,-28897,15446, - -27244,18204,-27244,18204,-27244,18204,-27244,18204, - -25329,20787,-25329,20787,-25329,20787,-25329,20787, - -23169,23169,-23169,23169,-23169,23169,-23169,23169, - -20787,25329,-20787,25329,-20787,25329,-20787,25329, - -18204,27244,-18204,27244,-18204,27244,-18204,27244, - -15446,28897,-15446,28897,-15446,28897,-15446,28897, - -12539,30272,-12539,30272,-12539,30272,-12539,30272, - -9511,31356,-9511,31356,-9511,31356,-9511,31356, - -6392,32137,-6392,32137,-6392,32137,-6392,32137, - -3211,32609,-3211,32609,-3211,32609,-3211,32609 - }; +static int16_t twa192[376]__attribute__((aligned(32))); +static int16_t twb192[376]__attribute__((aligned(32))); +static int16_t twc192[376]__attribute__((aligned(32))); void dft192(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -7714,151 +7323,8 @@ void dft192(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa216[568]__attribute__((aligned(32))) = {32753,-953,32753,-953,32753,-953,32753,-953, - 32711,-1905,32711,-1905,32711,-1905,32711,-1905, - 32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32545,-3804,32545,-3804,32545,-3804,32545,-3804, - 32421,-4748,32421,-4748,32421,-4748,32421,-4748, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 32090,-6626,32090,-6626,32090,-6626,32090,-6626, - 31883,-7556,31883,-7556,31883,-7556,31883,-7556, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31390,-9397,31390,-9397,31390,-9397,31390,-9397, - 31103,-10306,31103,-10306,31103,-10306,31103,-10306, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30451,-12097,30451,-12097,30451,-12097,30451,-12097, - 30087,-12978,30087,-12978,30087,-12978,30087,-12978, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 29281,-14705,29281,-14705,29281,-14705,29281,-14705, - 28841,-15551,28841,-15551,28841,-15551,28841,-15551, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27888,-17201,27888,-17201,27888,-17201,27888,-17201, - 27376,-18005,27376,-18005,27376,-18005,27376,-18005, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 26283,-19567,26283,-19567,26283,-19567,26283,-19567, - 25702,-20323,25702,-20323,25702,-20323,25702,-20323, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 24477,-21783,24477,-21783,24477,-21783,24477,-21783, - 23833,-22486,23833,-22486,23833,-22486,23833,-22486, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22486,-23833,22486,-23833,22486,-23833,22486,-23833, - 21783,-24477,21783,-24477,21783,-24477,21783,-24477, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 20323,-25702,20323,-25702,20323,-25702,20323,-25702, - 19567,-26283,19567,-26283,19567,-26283,19567,-26283, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 18005,-27376,18005,-27376,18005,-27376,18005,-27376, - 17201,-27888,17201,-27888,17201,-27888,17201,-27888, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15551,-28841,15551,-28841,15551,-28841,15551,-28841, - 14705,-29281,14705,-29281,14705,-29281,14705,-29281, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 12978,-30087,12978,-30087,12978,-30087,12978,-30087, - 12097,-30451,12097,-30451,12097,-30451,12097,-30451, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 10306,-31103,10306,-31103,10306,-31103,10306,-31103, - 9397,-31390,9397,-31390,9397,-31390,9397,-31390, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7556,-31883,7556,-31883,7556,-31883,7556,-31883, - 6626,-32090,6626,-32090,6626,-32090,6626,-32090, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 4748,-32421,4748,-32421,4748,-32421,4748,-32421, - 3804,-32545,3804,-32545,3804,-32545,3804,-32545, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 1905,-32711,1905,-32711,1905,-32711,1905,-32711, - 953,-32753,953,-32753,953,-32753,953,-32753, - 0,-32767,0,-32767,0,-32767,0,-32767, - -953,-32753,-953,-32753,-953,-32753,-953,-32753, - -1905,-32711,-1905,-32711,-1905,-32711,-1905,-32711, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -3804,-32545,-3804,-32545,-3804,-32545,-3804,-32545, - -4748,-32421,-4748,-32421,-4748,-32421,-4748,-32421, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -6626,-32090,-6626,-32090,-6626,-32090,-6626,-32090, - -7556,-31883,-7556,-31883,-7556,-31883,-7556,-31883, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -9397,-31390,-9397,-31390,-9397,-31390,-9397,-31390, - -10306,-31103,-10306,-31103,-10306,-31103,-10306,-31103, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12097,-30451,-12097,-30451,-12097,-30451,-12097,-30451, - -12978,-30087,-12978,-30087,-12978,-30087,-12978,-30087, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -14705,-29281,-14705,-29281,-14705,-29281,-14705,-29281, - -15551,-28841,-15551,-28841,-15551,-28841,-15551,-28841 - }; - -static int16_t twb216[568]__attribute__((aligned(32))) = {32711,-1905,32711,-1905,32711,-1905,32711,-1905, - 32545,-3804,32545,-3804,32545,-3804,32545,-3804, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31883,-7556,31883,-7556,31883,-7556,31883,-7556, - 31390,-9397,31390,-9397,31390,-9397,31390,-9397, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30087,-12978,30087,-12978,30087,-12978,30087,-12978, - 29281,-14705,29281,-14705,29281,-14705,29281,-14705, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27376,-18005,27376,-18005,27376,-18005,27376,-18005, - 26283,-19567,26283,-19567,26283,-19567,26283,-19567, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 23833,-22486,23833,-22486,23833,-22486,23833,-22486, - 22486,-23833,22486,-23833,22486,-23833,22486,-23833, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 19567,-26283,19567,-26283,19567,-26283,19567,-26283, - 18005,-27376,18005,-27376,18005,-27376,18005,-27376, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14705,-29281,14705,-29281,14705,-29281,14705,-29281, - 12978,-30087,12978,-30087,12978,-30087,12978,-30087, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 9397,-31390,9397,-31390,9397,-31390,9397,-31390, - 7556,-31883,7556,-31883,7556,-31883,7556,-31883, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 3804,-32545,3804,-32545,3804,-32545,3804,-32545, - 1905,-32711,1905,-32711,1905,-32711,1905,-32711, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1905,-32711,-1905,-32711,-1905,-32711,-1905,-32711, - -3804,-32545,-3804,-32545,-3804,-32545,-3804,-32545, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -7556,-31883,-7556,-31883,-7556,-31883,-7556,-31883, - -9397,-31390,-9397,-31390,-9397,-31390,-9397,-31390, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12978,-30087,-12978,-30087,-12978,-30087,-12978,-30087, - -14705,-29281,-14705,-29281,-14705,-29281,-14705,-29281, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18005,-27376,-18005,-27376,-18005,-27376,-18005,-27376, - -19567,-26283,-19567,-26283,-19567,-26283,-19567,-26283, - -21062,-25100,-21062,-25100,-21062,-25100,-21062,-25100, - -22486,-23833,-22486,-23833,-22486,-23833,-22486,-23833, - -23833,-22486,-23833,-22486,-23833,-22486,-23833,-22486, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -26283,-19567,-26283,-19567,-26283,-19567,-26283,-19567, - -27376,-18005,-27376,-18005,-27376,-18005,-27376,-18005, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29281,-14705,-29281,-14705,-29281,-14705,-29281,-14705, - -30087,-12978,-30087,-12978,-30087,-12978,-30087,-12978, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31390,-9397,-31390,-9397,-31390,-9397,-31390,-9397, - -31883,-7556,-31883,-7556,-31883,-7556,-31883,-7556, - -32269,-5689,-32269,-5689,-32269,-5689,-32269,-5689, - -32545,-3804,-32545,-3804,-32545,-3804,-32545,-3804, - -32711,-1905,-32711,-1905,-32711,-1905,-32711,-1905, - -32767,0,-32767,0,-32767,0,-32767,0, - -32711,1905,-32711,1905,-32711,1905,-32711,1905, - -32545,3804,-32545,3804,-32545,3804,-32545,3804, - -32269,5689,-32269,5689,-32269,5689,-32269,5689, - -31883,7556,-31883,7556,-31883,7556,-31883,7556, - -31390,9397,-31390,9397,-31390,9397,-31390,9397, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -30087,12978,-30087,12978,-30087,12978,-30087,12978, - -29281,14705,-29281,14705,-29281,14705,-29281,14705, - -28377,16383,-28377,16383,-28377,16383,-28377,16383, - -27376,18005,-27376,18005,-27376,18005,-27376,18005, - -26283,19567,-26283,19567,-26283,19567,-26283,19567, - -25100,21062,-25100,21062,-25100,21062,-25100,21062, - -23833,22486,-23833,22486,-23833,22486,-23833,22486, - -22486,23833,-22486,23833,-22486,23833,-22486,23833, - -21062,25100,-21062,25100,-21062,25100,-21062,25100, - -19567,26283,-19567,26283,-19567,26283,-19567,26283, - -18005,27376,-18005,27376,-18005,27376,-18005,27376 - }; +static int16_t twa216[568]__attribute__((aligned(32))); +static int16_t twb216[568]__attribute__((aligned(32))); void dft216(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -7909,188 +7375,9 @@ void dft216(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa240[472]__attribute__((aligned(32))) = {32755,-857,32755,-857,32755,-857,32755,-857, - 32722,-1714,32722,-1714,32722,-1714,32722,-1714, - 32665,-2570,32665,-2570,32665,-2570,32665,-2570, - 32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32363,-5125,32363,-5125,32363,-5125,32363,-5125, - 32218,-5971,32218,-5971,32218,-5971,32218,-5971, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31861,-7649,31861,-7649,31861,-7649,31861,-7649, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31417,-9306,31417,-9306,31417,-9306,31417,-9306, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30887,-10937,30887,-10937,30887,-10937,30887,-10937, - 30590,-11742,30590,-11742,30590,-11742,30590,-11742, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29575,-14106,29575,-14106,29575,-14106,29575,-14106, - 29195,-14875,29195,-14875,29195,-14875,29195,-14875, - 28796,-15635,28796,-15635,28796,-15635,28796,-15635, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27938,-17120,27938,-17120,27938,-17120,27938,-17120, - 27480,-17846,27480,-17846,27480,-17846,27480,-17846, - 27004,-18559,27004,-18559,27004,-18559,27004,-18559, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 25464,-20620,25464,-20620,25464,-20620,25464,-20620, - 24916,-21280,24916,-21280,24916,-21280,24916,-21280, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 23768,-22555,23768,-22555,23768,-22555,23768,-22555, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22555,-23768,22555,-23768,22555,-23768,22555,-23768, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 21280,-24916,21280,-24916,21280,-24916,21280,-24916, - 20620,-25464,20620,-25464,20620,-25464,20620,-25464, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 18559,-27004,18559,-27004,18559,-27004,18559,-27004, - 17846,-27480,17846,-27480,17846,-27480,17846,-27480, - 17120,-27938,17120,-27938,17120,-27938,17120,-27938, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15635,-28796,15635,-28796,15635,-28796,15635,-28796, - 14875,-29195,14875,-29195,14875,-29195,14875,-29195, - 14106,-29575,14106,-29575,14106,-29575,14106,-29575, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 11742,-30590,11742,-30590,11742,-30590,11742,-30590, - 10937,-30887,10937,-30887,10937,-30887,10937,-30887, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 9306,-31417,9306,-31417,9306,-31417,9306,-31417, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7649,-31861,7649,-31861,7649,-31861,7649,-31861, - 6812,-32050,6812,-32050,6812,-32050,6812,-32050, - 5971,-32218,5971,-32218,5971,-32218,5971,-32218, - 5125,-32363,5125,-32363,5125,-32363,5125,-32363, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 2570,-32665,2570,-32665,2570,-32665,2570,-32665, - 1714,-32722,1714,-32722,1714,-32722,1714,-32722, - 857,-32755,857,-32755,857,-32755,857,-32755 - }; - -static int16_t twb240[472]__attribute__((aligned(32))) = {32722,-1714,32722,-1714,32722,-1714,32722,-1714, - 32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32363,-5125,32363,-5125,32363,-5125,32363,-5125, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30590,-11742,30590,-11742,30590,-11742,30590,-11742, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29195,-14875,29195,-14875,29195,-14875,29195,-14875, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27480,-17846,27480,-17846,27480,-17846,27480,-17846, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25464,-20620,25464,-20620,25464,-20620,25464,-20620, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 20620,-25464,20620,-25464,20620,-25464,20620,-25464, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 17846,-27480,17846,-27480,17846,-27480,17846,-27480, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 14875,-29195,14875,-29195,14875,-29195,14875,-29195, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934, - 11742,-30590,11742,-30590,11742,-30590,11742,-30590, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 6812,-32050,6812,-32050,6812,-32050,6812,-32050, - 5125,-32363,5125,-32363,5125,-32363,5125,-32363, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 1714,-32722,1714,-32722,1714,-32722,1714,-32722, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1714,-32722,-1714,-32722,-1714,-32722,-1714,-32722, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -5125,-32363,-5125,-32363,-5125,-32363,-5125,-32363, - -6812,-32050,-6812,-32050,-6812,-32050,-6812,-32050, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -11742,-30590,-11742,-30590,-11742,-30590,-11742,-30590, - -13327,-29934,-13327,-29934,-13327,-29934,-13327,-29934, - -14875,-29195,-14875,-29195,-14875,-29195,-14875,-29195, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -17846,-27480,-17846,-27480,-17846,-27480,-17846,-27480, - -19259,-26509,-19259,-26509,-19259,-26509,-19259,-26509, - -20620,-25464,-20620,-25464,-20620,-25464,-20620,-25464, - -21925,-24350,-21925,-24350,-21925,-24350,-21925,-24350, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24350,-21925,-24350,-21925,-24350,-21925,-24350,-21925, - -25464,-20620,-25464,-20620,-25464,-20620,-25464,-20620, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -27480,-17846,-27480,-17846,-27480,-17846,-27480,-17846, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29195,-14875,-29195,-14875,-29195,-14875,-29195,-14875, - -29934,-13327,-29934,-13327,-29934,-13327,-29934,-13327, - -30590,-11742,-30590,-11742,-30590,-11742,-30590,-11742, - -31163,-10125,-31163,-10125,-31163,-10125,-31163,-10125, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -32050,-6812,-32050,-6812,-32050,-6812,-32050,-6812, - -32363,-5125,-32363,-5125,-32363,-5125,-32363,-5125, - -32587,-3425,-32587,-3425,-32587,-3425,-32587,-3425, - -32722,-1714,-32722,-1714,-32722,-1714,-32722,-1714 - }; - -static int16_t twc240[472]__attribute__((aligned(32))) = {32665,-2570,32665,-2570,32665,-2570,32665,-2570, - 32363,-5125,32363,-5125,32363,-5125,32363,-5125, - 31861,-7649,31861,-7649,31861,-7649,31861,-7649, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29195,-14875,29195,-14875,29195,-14875,29195,-14875, - 27938,-17120,27938,-17120,27938,-17120,27938,-17120, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 24916,-21280,24916,-21280,24916,-21280,24916,-21280, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 21280,-24916,21280,-24916,21280,-24916,21280,-24916, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 17120,-27938,17120,-27938,17120,-27938,17120,-27938, - 14875,-29195,14875,-29195,14875,-29195,14875,-29195, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 7649,-31861,7649,-31861,7649,-31861,7649,-31861, - 5125,-32363,5125,-32363,5125,-32363,5125,-32363, - 2570,-32665,2570,-32665,2570,-32665,2570,-32665, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2570,-32665,-2570,-32665,-2570,-32665,-2570,-32665, - -5125,-32363,-5125,-32363,-5125,-32363,-5125,-32363, - -7649,-31861,-7649,-31861,-7649,-31861,-7649,-31861, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -14875,-29195,-14875,-29195,-14875,-29195,-14875,-29195, - -17120,-27938,-17120,-27938,-17120,-27938,-17120,-27938, - -19259,-26509,-19259,-26509,-19259,-26509,-19259,-26509, - -21280,-24916,-21280,-24916,-21280,-24916,-21280,-24916, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24916,-21280,-24916,-21280,-24916,-21280,-24916,-21280, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -27938,-17120,-27938,-17120,-27938,-17120,-27938,-17120, - -29195,-14875,-29195,-14875,-29195,-14875,-29195,-14875, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -31163,-10125,-31163,-10125,-31163,-10125,-31163,-10125, - -31861,-7649,-31861,-7649,-31861,-7649,-31861,-7649, - -32363,-5125,-32363,-5125,-32363,-5125,-32363,-5125, - -32665,-2570,-32665,-2570,-32665,-2570,-32665,-2570, - -32767,0,-32767,0,-32767,0,-32767,0, - -32665,2570,-32665,2570,-32665,2570,-32665,2570, - -32363,5125,-32363,5125,-32363,5125,-32363,5125, - -31861,7649,-31861,7649,-31861,7649,-31861,7649, - -31163,10125,-31163,10125,-31163,10125,-31163,10125, - -30272,12539,-30272,12539,-30272,12539,-30272,12539, - -29195,14875,-29195,14875,-29195,14875,-29195,14875, - -27938,17120,-27938,17120,-27938,17120,-27938,17120, - -26509,19259,-26509,19259,-26509,19259,-26509,19259, - -24916,21280,-24916,21280,-24916,21280,-24916,21280, - -23169,23169,-23169,23169,-23169,23169,-23169,23169, - -21280,24916,-21280,24916,-21280,24916,-21280,24916, - -19259,26509,-19259,26509,-19259,26509,-19259,26509, - -17120,27938,-17120,27938,-17120,27938,-17120,27938, - -14875,29195,-14875,29195,-14875,29195,-14875,29195, - -12539,30272,-12539,30272,-12539,30272,-12539,30272, - -10125,31163,-10125,31163,-10125,31163,-10125,31163, - -7649,31861,-7649,31861,-7649,31861,-7649,31861, - -5125,32363,-5125,32363,-5125,32363,-5125,32363, - -2570,32665,-2570,32665,-2570,32665,-2570,32665 - }; +static int16_t twa240[472]__attribute__((aligned(32))); +static int16_t twb240[472]__attribute__((aligned(32))); +static int16_t twc240[472]__attribute__((aligned(32))); void dft240(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -8147,211 +7434,8 @@ void dft240(int16_t *x,int16_t *y,unsigned char scale_flag) } -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:95)/288)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(2:2:190)/288)); -twa2 = zeros(1,191); -twb2 = zeros(1,191); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); - - - */ -static int16_t twa288[760]__attribute__((aligned(32))) = {32759,-714,32759,-714,32759,-714,32759,-714, - 32735,-1429,32735,-1429,32735,-1429,32735,-1429, - 32696,-2143,32696,-2143,32696,-2143,32696,-2143, - 32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32572,-3567,32572,-3567,32572,-3567,32572,-3567, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32385,-4984,32385,-4984,32385,-4984,32385,-4984, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 32137,-6392,32137,-6392,32137,-6392,32137,-6392, - 31990,-7092,31990,-7092,31990,-7092,31990,-7092, - 31827,-7788,31827,-7788,31827,-7788,31827,-7788, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31457,-9169,31457,-9169,31457,-9169,31457,-9169, - 31250,-9853,31250,-9853,31250,-9853,31250,-9853, - 31028,-10532,31028,-10532,31028,-10532,31028,-10532, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30539,-11876,30539,-11876,30539,-11876,30539,-11876, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29992,-13196,29992,-13196,29992,-13196,29992,-13196, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 29387,-14492,29387,-14492,29387,-14492,29387,-14492, - 29064,-15130,29064,-15130,29064,-15130,29064,-15130, - 28727,-15760,28727,-15760,28727,-15760,28727,-15760, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 28012,-16998,28012,-16998,28012,-16998,28012,-16998, - 27635,-17605,27635,-17605,27635,-17605,27635,-17605, - 27244,-18204,27244,-18204,27244,-18204,27244,-18204, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 26424,-19375,26424,-19375,26424,-19375,26424,-19375, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 25554,-20509,25554,-20509,25554,-20509,25554,-20509, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 24635,-21604,24635,-21604,24635,-21604,24635,-21604, - 24158,-22137,24158,-22137,24158,-22137,24158,-22137, - 23669,-22658,23669,-22658,23669,-22658,23669,-22658, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22658,-23669,22658,-23669,22658,-23669,22658,-23669, - 22137,-24158,22137,-24158,22137,-24158,22137,-24158, - 21604,-24635,21604,-24635,21604,-24635,21604,-24635, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 20509,-25554,20509,-25554,20509,-25554,20509,-25554, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 19375,-26424,19375,-26424,19375,-26424,19375,-26424, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 18204,-27244,18204,-27244,18204,-27244,18204,-27244, - 17605,-27635,17605,-27635,17605,-27635,17605,-27635, - 16998,-28012,16998,-28012,16998,-28012,16998,-28012, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15760,-28727,15760,-28727,15760,-28727,15760,-28727, - 15130,-29064,15130,-29064,15130,-29064,15130,-29064, - 14492,-29387,14492,-29387,14492,-29387,14492,-29387, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 13196,-29992,13196,-29992,13196,-29992,13196,-29992, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 11876,-30539,11876,-30539,11876,-30539,11876,-30539, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 10532,-31028,10532,-31028,10532,-31028,10532,-31028, - 9853,-31250,9853,-31250,9853,-31250,9853,-31250, - 9169,-31457,9169,-31457,9169,-31457,9169,-31457, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7788,-31827,7788,-31827,7788,-31827,7788,-31827, - 7092,-31990,7092,-31990,7092,-31990,7092,-31990, - 6392,-32137,6392,-32137,6392,-32137,6392,-32137, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 4984,-32385,4984,-32385,4984,-32385,4984,-32385, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 3567,-32572,3567,-32572,3567,-32572,3567,-32572, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 2143,-32696,2143,-32696,2143,-32696,2143,-32696, - 1429,-32735,1429,-32735,1429,-32735,1429,-32735, - 714,-32759,714,-32759,714,-32759,714,-32759, - 0,-32767,0,-32767,0,-32767,0,-32767, - -714,-32759,-714,-32759,-714,-32759,-714,-32759, - -1429,-32735,-1429,-32735,-1429,-32735,-1429,-32735, - -2143,-32696,-2143,-32696,-2143,-32696,-2143,-32696, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -3567,-32572,-3567,-32572,-3567,-32572,-3567,-32572, - -4276,-32486,-4276,-32486,-4276,-32486,-4276,-32486, - -4984,-32385,-4984,-32385,-4984,-32385,-4984,-32385, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -6392,-32137,-6392,-32137,-6392,-32137,-6392,-32137, - -7092,-31990,-7092,-31990,-7092,-31990,-7092,-31990, - -7788,-31827,-7788,-31827,-7788,-31827,-7788,-31827, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -9169,-31457,-9169,-31457,-9169,-31457,-9169,-31457, - -9853,-31250,-9853,-31250,-9853,-31250,-9853,-31250, - -10532,-31028,-10532,-31028,-10532,-31028,-10532,-31028, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -11876,-30539,-11876,-30539,-11876,-30539,-11876,-30539, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -13196,-29992,-13196,-29992,-13196,-29992,-13196,-29992, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -14492,-29387,-14492,-29387,-14492,-29387,-14492,-29387, - -15130,-29064,-15130,-29064,-15130,-29064,-15130,-29064, - -15760,-28727,-15760,-28727,-15760,-28727,-15760,-28727 - }; - -static int16_t twb288[760]__attribute__((aligned(32))) = {32735,-1429,32735,-1429,32735,-1429,32735,-1429, - 32642,-2855,32642,-2855,32642,-2855,32642,-2855, - 32486,-4276,32486,-4276,32486,-4276,32486,-4276, - 32269,-5689,32269,-5689,32269,-5689,32269,-5689, - 31990,-7092,31990,-7092,31990,-7092,31990,-7092, - 31650,-8480,31650,-8480,31650,-8480,31650,-8480, - 31250,-9853,31250,-9853,31250,-9853,31250,-9853, - 30790,-11206,30790,-11206,30790,-11206,30790,-11206, - 30272,-12539,30272,-12539,30272,-12539,30272,-12539, - 29696,-13847,29696,-13847,29696,-13847,29696,-13847, - 29064,-15130,29064,-15130,29064,-15130,29064,-15130, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 27635,-17605,27635,-17605,27635,-17605,27635,-17605, - 26841,-18794,26841,-18794,26841,-18794,26841,-18794, - 25995,-19947,25995,-19947,25995,-19947,25995,-19947, - 25100,-21062,25100,-21062,25100,-21062,25100,-21062, - 24158,-22137,24158,-22137,24158,-22137,24158,-22137, - 23169,-23169,23169,-23169,23169,-23169,23169,-23169, - 22137,-24158,22137,-24158,22137,-24158,22137,-24158, - 21062,-25100,21062,-25100,21062,-25100,21062,-25100, - 19947,-25995,19947,-25995,19947,-25995,19947,-25995, - 18794,-26841,18794,-26841,18794,-26841,18794,-26841, - 17605,-27635,17605,-27635,17605,-27635,17605,-27635, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15130,-29064,15130,-29064,15130,-29064,15130,-29064, - 13847,-29696,13847,-29696,13847,-29696,13847,-29696, - 12539,-30272,12539,-30272,12539,-30272,12539,-30272, - 11206,-30790,11206,-30790,11206,-30790,11206,-30790, - 9853,-31250,9853,-31250,9853,-31250,9853,-31250, - 8480,-31650,8480,-31650,8480,-31650,8480,-31650, - 7092,-31990,7092,-31990,7092,-31990,7092,-31990, - 5689,-32269,5689,-32269,5689,-32269,5689,-32269, - 4276,-32486,4276,-32486,4276,-32486,4276,-32486, - 2855,-32642,2855,-32642,2855,-32642,2855,-32642, - 1429,-32735,1429,-32735,1429,-32735,1429,-32735, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1429,-32735,-1429,-32735,-1429,-32735,-1429,-32735, - -2855,-32642,-2855,-32642,-2855,-32642,-2855,-32642, - -4276,-32486,-4276,-32486,-4276,-32486,-4276,-32486, - -5689,-32269,-5689,-32269,-5689,-32269,-5689,-32269, - -7092,-31990,-7092,-31990,-7092,-31990,-7092,-31990, - -8480,-31650,-8480,-31650,-8480,-31650,-8480,-31650, - -9853,-31250,-9853,-31250,-9853,-31250,-9853,-31250, - -11206,-30790,-11206,-30790,-11206,-30790,-11206,-30790, - -12539,-30272,-12539,-30272,-12539,-30272,-12539,-30272, - -13847,-29696,-13847,-29696,-13847,-29696,-13847,-29696, - -15130,-29064,-15130,-29064,-15130,-29064,-15130,-29064, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -17605,-27635,-17605,-27635,-17605,-27635,-17605,-27635, - -18794,-26841,-18794,-26841,-18794,-26841,-18794,-26841, - -19947,-25995,-19947,-25995,-19947,-25995,-19947,-25995, - -21062,-25100,-21062,-25100,-21062,-25100,-21062,-25100, - -22137,-24158,-22137,-24158,-22137,-24158,-22137,-24158, - -23169,-23169,-23169,-23169,-23169,-23169,-23169,-23169, - -24158,-22137,-24158,-22137,-24158,-22137,-24158,-22137, - -25100,-21062,-25100,-21062,-25100,-21062,-25100,-21062, - -25995,-19947,-25995,-19947,-25995,-19947,-25995,-19947, - -26841,-18794,-26841,-18794,-26841,-18794,-26841,-18794, - -27635,-17605,-27635,-17605,-27635,-17605,-27635,-17605, - -28377,-16383,-28377,-16383,-28377,-16383,-28377,-16383, - -29064,-15130,-29064,-15130,-29064,-15130,-29064,-15130, - -29696,-13847,-29696,-13847,-29696,-13847,-29696,-13847, - -30272,-12539,-30272,-12539,-30272,-12539,-30272,-12539, - -30790,-11206,-30790,-11206,-30790,-11206,-30790,-11206, - -31250,-9853,-31250,-9853,-31250,-9853,-31250,-9853, - -31650,-8480,-31650,-8480,-31650,-8480,-31650,-8480, - -31990,-7092,-31990,-7092,-31990,-7092,-31990,-7092, - -32269,-5689,-32269,-5689,-32269,-5689,-32269,-5689, - -32486,-4276,-32486,-4276,-32486,-4276,-32486,-4276, - -32642,-2855,-32642,-2855,-32642,-2855,-32642,-2855, - -32735,-1429,-32735,-1429,-32735,-1429,-32735,-1429, - -32767,0,-32767,0,-32767,0,-32767,0, - -32735,1429,-32735,1429,-32735,1429,-32735,1429, - -32642,2855,-32642,2855,-32642,2855,-32642,2855, - -32486,4276,-32486,4276,-32486,4276,-32486,4276, - -32269,5689,-32269,5689,-32269,5689,-32269,5689, - -31990,7092,-31990,7092,-31990,7092,-31990,7092, - -31650,8480,-31650,8480,-31650,8480,-31650,8480, - -31250,9853,-31250,9853,-31250,9853,-31250,9853, - -30790,11206,-30790,11206,-30790,11206,-30790,11206, - -30272,12539,-30272,12539,-30272,12539,-30272,12539, - -29696,13847,-29696,13847,-29696,13847,-29696,13847, - -29064,15130,-29064,15130,-29064,15130,-29064,15130, - -28377,16383,-28377,16383,-28377,16383,-28377,16383, - -27635,17605,-27635,17605,-27635,17605,-27635,17605, - -26841,18794,-26841,18794,-26841,18794,-26841,18794, - -25995,19947,-25995,19947,-25995,19947,-25995,19947, - -25100,21062,-25100,21062,-25100,21062,-25100,21062, - -24158,22137,-24158,22137,-24158,22137,-24158,22137, - -23169,23169,-23169,23169,-23169,23169,-23169,23169, - -22137,24158,-22137,24158,-22137,24158,-22137,24158, - -21062,25100,-21062,25100,-21062,25100,-21062,25100, - -19947,25995,-19947,25995,-19947,25995,-19947,25995, - -18794,26841,-18794,26841,-18794,26841,-18794,26841, - -17605,27635,-17605,27635,-17605,27635,-17605,27635 - }; +static int16_t twa288[760]__attribute__((aligned(32))); +static int16_t twb288[760]__attribute__((aligned(32))); void dft288(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -8402,249 +7486,10 @@ void dft288(int16_t *x,int16_t *y,unsigned char scale_flag) } -static int16_t twa300[472]__attribute__((aligned(32))) = {32759,-686,32759,-686,32759,-686,32759,-686, - 32738,-1372,32738,-1372,32738,-1372,32738,-1372, - 32702,-2057,32702,-2057,32702,-2057,32702,-2057, - 32652,-2741,32652,-2741,32652,-2741,32652,-2741, - 32587,-3425,32587,-3425,32587,-3425,32587,-3425, - 32508,-4106,32508,-4106,32508,-4106,32508,-4106, - 32415,-4786,32415,-4786,32415,-4786,32415,-4786, - 32308,-5464,32308,-5464,32308,-5464,32308,-5464, - 32186,-6139,32186,-6139,32186,-6139,32186,-6139, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31901,-7482,31901,-7482,31901,-7482,31901,-7482, - 31737,-8148,31737,-8148,31737,-8148,31737,-8148, - 31559,-8811,31559,-8811,31559,-8811,31559,-8811, - 31368,-9470,31368,-9470,31368,-9470,31368,-9470, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30944,-10775,30944,-10775,30944,-10775,30944,-10775, - 30711,-11421,30711,-11421,30711,-11421,30711,-11421, - 30465,-12062,30465,-12062,30465,-12062,30465,-12062, - 30206,-12697,30206,-12697,30206,-12697,30206,-12697, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29648,-13951,29648,-13951,29648,-13951,29648,-13951, - 29349,-14569,29349,-14569,29349,-14569,29349,-14569, - 29038,-15180,29038,-15180,29038,-15180,29038,-15180, - 28713,-15785,28713,-15785,28713,-15785,28713,-15785, - 28377,-16383,28377,-16383,28377,-16383,28377,-16383, - 28027,-16974,28027,-16974,28027,-16974,28027,-16974, - 27666,-17557,27666,-17557,27666,-17557,27666,-17557, - 27292,-18132,27292,-18132,27292,-18132,27292,-18132, - 26906,-18700,26906,-18700,26906,-18700,26906,-18700, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 26099,-19810,26099,-19810,26099,-19810,26099,-19810, - 25679,-20353,25679,-20353,25679,-20353,25679,-20353, - 25247,-20886,25247,-20886,25247,-20886,25247,-20886, - 24804,-21410,24804,-21410,24804,-21410,24804,-21410, - 24350,-21925,24350,-21925,24350,-21925,24350,-21925, - 23886,-22430,23886,-22430,23886,-22430,23886,-22430, - 23411,-22925,23411,-22925,23411,-22925,23411,-22925, - 22925,-23411,22925,-23411,22925,-23411,22925,-23411, - 22430,-23886,22430,-23886,22430,-23886,22430,-23886, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 21410,-24804,21410,-24804,21410,-24804,21410,-24804, - 20886,-25247,20886,-25247,20886,-25247,20886,-25247, - 20353,-25679,20353,-25679,20353,-25679,20353,-25679, - 19810,-26099,19810,-26099,19810,-26099,19810,-26099, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 18700,-26906,18700,-26906,18700,-26906,18700,-26906, - 18132,-27292,18132,-27292,18132,-27292,18132,-27292, - 17557,-27666,17557,-27666,17557,-27666,17557,-27666, - 16974,-28027,16974,-28027,16974,-28027,16974,-28027, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15785,-28713,15785,-28713,15785,-28713,15785,-28713, - 15180,-29038,15180,-29038,15180,-29038,15180,-29038, - 14569,-29349,14569,-29349,14569,-29349,14569,-29349, - 13951,-29648,13951,-29648,13951,-29648,13951,-29648, - 13327,-29934,13327,-29934,13327,-29934,13327,-29934, - 12697,-30206,12697,-30206,12697,-30206,12697,-30206, - 12062,-30465,12062,-30465,12062,-30465,12062,-30465, - 11421,-30711,11421,-30711,11421,-30711,11421,-30711, - 10775,-30944,10775,-30944,10775,-30944,10775,-30944 - }; - -static int16_t twb300[472]__attribute__((aligned(32))) = {32738,-1372,32738,-1372,32738,-1372,32738,-1372, - 32652,-2741,32652,-2741,32652,-2741,32652,-2741, - 32508,-4106,32508,-4106,32508,-4106,32508,-4106, - 32308,-5464,32308,-5464,32308,-5464,32308,-5464, - 32050,-6812,32050,-6812,32050,-6812,32050,-6812, - 31737,-8148,31737,-8148,31737,-8148,31737,-8148, - 31368,-9470,31368,-9470,31368,-9470,31368,-9470, - 30944,-10775,30944,-10775,30944,-10775,30944,-10775, - 30465,-12062,30465,-12062,30465,-12062,30465,-12062, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 29349,-14569,29349,-14569,29349,-14569,29349,-14569, - 28713,-15785,28713,-15785,28713,-15785,28713,-15785, - 28027,-16974,28027,-16974,28027,-16974,28027,-16974, - 27292,-18132,27292,-18132,27292,-18132,27292,-18132, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25679,-20353,25679,-20353,25679,-20353,25679,-20353, - 24804,-21410,24804,-21410,24804,-21410,24804,-21410, - 23886,-22430,23886,-22430,23886,-22430,23886,-22430, - 22925,-23411,22925,-23411,22925,-23411,22925,-23411, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 20886,-25247,20886,-25247,20886,-25247,20886,-25247, - 19810,-26099,19810,-26099,19810,-26099,19810,-26099, - 18700,-26906,18700,-26906,18700,-26906,18700,-26906, - 17557,-27666,17557,-27666,17557,-27666,17557,-27666, - 16383,-28377,16383,-28377,16383,-28377,16383,-28377, - 15180,-29038,15180,-29038,15180,-29038,15180,-29038, - 13951,-29648,13951,-29648,13951,-29648,13951,-29648, - 12697,-30206,12697,-30206,12697,-30206,12697,-30206, - 11421,-30711,11421,-30711,11421,-30711,11421,-30711, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 8811,-31559,8811,-31559,8811,-31559,8811,-31559, - 7482,-31901,7482,-31901,7482,-31901,7482,-31901, - 6139,-32186,6139,-32186,6139,-32186,6139,-32186, - 4786,-32415,4786,-32415,4786,-32415,4786,-32415, - 3425,-32587,3425,-32587,3425,-32587,3425,-32587, - 2057,-32702,2057,-32702,2057,-32702,2057,-32702, - 686,-32759,686,-32759,686,-32759,686,-32759, - -686,-32759,-686,-32759,-686,-32759,-686,-32759, - -2057,-32702,-2057,-32702,-2057,-32702,-2057,-32702, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -4786,-32415,-4786,-32415,-4786,-32415,-4786,-32415, - -6139,-32186,-6139,-32186,-6139,-32186,-6139,-32186, - -7482,-31901,-7482,-31901,-7482,-31901,-7482,-31901, - -8811,-31559,-8811,-31559,-8811,-31559,-8811,-31559, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -11421,-30711,-11421,-30711,-11421,-30711,-11421,-30711, - -12697,-30206,-12697,-30206,-12697,-30206,-12697,-30206, - -13951,-29648,-13951,-29648,-13951,-29648,-13951,-29648, - -15180,-29038,-15180,-29038,-15180,-29038,-15180,-29038, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -17557,-27666,-17557,-27666,-17557,-27666,-17557,-27666, - -18700,-26906,-18700,-26906,-18700,-26906,-18700,-26906, - -19810,-26099,-19810,-26099,-19810,-26099,-19810,-26099, - -20886,-25247,-20886,-25247,-20886,-25247,-20886,-25247, - -21925,-24350,-21925,-24350,-21925,-24350,-21925,-24350, - -22925,-23411,-22925,-23411,-22925,-23411,-22925,-23411, - -23886,-22430,-23886,-22430,-23886,-22430,-23886,-22430, - -24804,-21410,-24804,-21410,-24804,-21410,-24804,-21410, - -25679,-20353,-25679,-20353,-25679,-20353,-25679,-20353 - }; - -static int16_t twc300[472]__attribute__((aligned(32))) = {32702,-2057,32702,-2057,32702,-2057,32702,-2057, - 32508,-4106,32508,-4106,32508,-4106,32508,-4106, - 32186,-6139,32186,-6139,32186,-6139,32186,-6139, - 31737,-8148,31737,-8148,31737,-8148,31737,-8148, - 31163,-10125,31163,-10125,31163,-10125,31163,-10125, - 30465,-12062,30465,-12062,30465,-12062,30465,-12062, - 29648,-13951,29648,-13951,29648,-13951,29648,-13951, - 28713,-15785,28713,-15785,28713,-15785,28713,-15785, - 27666,-17557,27666,-17557,27666,-17557,27666,-17557, - 26509,-19259,26509,-19259,26509,-19259,26509,-19259, - 25247,-20886,25247,-20886,25247,-20886,25247,-20886, - 23886,-22430,23886,-22430,23886,-22430,23886,-22430, - 22430,-23886,22430,-23886,22430,-23886,22430,-23886, - 20886,-25247,20886,-25247,20886,-25247,20886,-25247, - 19259,-26509,19259,-26509,19259,-26509,19259,-26509, - 17557,-27666,17557,-27666,17557,-27666,17557,-27666, - 15785,-28713,15785,-28713,15785,-28713,15785,-28713, - 13951,-29648,13951,-29648,13951,-29648,13951,-29648, - 12062,-30465,12062,-30465,12062,-30465,12062,-30465, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 8148,-31737,8148,-31737,8148,-31737,8148,-31737, - 6139,-32186,6139,-32186,6139,-32186,6139,-32186, - 4106,-32508,4106,-32508,4106,-32508,4106,-32508, - 2057,-32702,2057,-32702,2057,-32702,2057,-32702, - 0,-32767,0,-32767,0,-32767,0,-32767, - -2057,-32702,-2057,-32702,-2057,-32702,-2057,-32702, - -4106,-32508,-4106,-32508,-4106,-32508,-4106,-32508, - -6139,-32186,-6139,-32186,-6139,-32186,-6139,-32186, - -8148,-31737,-8148,-31737,-8148,-31737,-8148,-31737, - -10125,-31163,-10125,-31163,-10125,-31163,-10125,-31163, - -12062,-30465,-12062,-30465,-12062,-30465,-12062,-30465, - -13951,-29648,-13951,-29648,-13951,-29648,-13951,-29648, - -15785,-28713,-15785,-28713,-15785,-28713,-15785,-28713, - -17557,-27666,-17557,-27666,-17557,-27666,-17557,-27666, - -19259,-26509,-19259,-26509,-19259,-26509,-19259,-26509, - -20886,-25247,-20886,-25247,-20886,-25247,-20886,-25247, - -22430,-23886,-22430,-23886,-22430,-23886,-22430,-23886, - -23886,-22430,-23886,-22430,-23886,-22430,-23886,-22430, - -25247,-20886,-25247,-20886,-25247,-20886,-25247,-20886, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -27666,-17557,-27666,-17557,-27666,-17557,-27666,-17557, - -28713,-15785,-28713,-15785,-28713,-15785,-28713,-15785, - -29648,-13951,-29648,-13951,-29648,-13951,-29648,-13951, - -30465,-12062,-30465,-12062,-30465,-12062,-30465,-12062, - -31163,-10125,-31163,-10125,-31163,-10125,-31163,-10125, - -31737,-8148,-31737,-8148,-31737,-8148,-31737,-8148, - -32186,-6139,-32186,-6139,-32186,-6139,-32186,-6139, - -32508,-4106,-32508,-4106,-32508,-4106,-32508,-4106, - -32702,-2057,-32702,-2057,-32702,-2057,-32702,-2057, - -32767,0,-32767,0,-32767,0,-32767,0, - -32702,2057,-32702,2057,-32702,2057,-32702,2057, - -32508,4106,-32508,4106,-32508,4106,-32508,4106, - -32186,6139,-32186,6139,-32186,6139,-32186,6139, - -31737,8148,-31737,8148,-31737,8148,-31737,8148, - -31163,10125,-31163,10125,-31163,10125,-31163,10125, - -30465,12062,-30465,12062,-30465,12062,-30465,12062, - -29648,13951,-29648,13951,-29648,13951,-29648,13951, - -28713,15785,-28713,15785,-28713,15785,-28713,15785, - -27666,17557,-27666,17557,-27666,17557,-27666,17557 - }; - -static int16_t twd300[472]__attribute__((aligned(32))) = {32652,-2741,32652,-2741,32652,-2741,32652,-2741, - 32308,-5464,32308,-5464,32308,-5464,32308,-5464, - 31737,-8148,31737,-8148,31737,-8148,31737,-8148, - 30944,-10775,30944,-10775,30944,-10775,30944,-10775, - 29934,-13327,29934,-13327,29934,-13327,29934,-13327, - 28713,-15785,28713,-15785,28713,-15785,28713,-15785, - 27292,-18132,27292,-18132,27292,-18132,27292,-18132, - 25679,-20353,25679,-20353,25679,-20353,25679,-20353, - 23886,-22430,23886,-22430,23886,-22430,23886,-22430, - 21925,-24350,21925,-24350,21925,-24350,21925,-24350, - 19810,-26099,19810,-26099,19810,-26099,19810,-26099, - 17557,-27666,17557,-27666,17557,-27666,17557,-27666, - 15180,-29038,15180,-29038,15180,-29038,15180,-29038, - 12697,-30206,12697,-30206,12697,-30206,12697,-30206, - 10125,-31163,10125,-31163,10125,-31163,10125,-31163, - 7482,-31901,7482,-31901,7482,-31901,7482,-31901, - 4786,-32415,4786,-32415,4786,-32415,4786,-32415, - 2057,-32702,2057,-32702,2057,-32702,2057,-32702, - -686,-32759,-686,-32759,-686,-32759,-686,-32759, - -3425,-32587,-3425,-32587,-3425,-32587,-3425,-32587, - -6139,-32186,-6139,-32186,-6139,-32186,-6139,-32186, - -8811,-31559,-8811,-31559,-8811,-31559,-8811,-31559, - -11421,-30711,-11421,-30711,-11421,-30711,-11421,-30711, - -13951,-29648,-13951,-29648,-13951,-29648,-13951,-29648, - -16383,-28377,-16383,-28377,-16383,-28377,-16383,-28377, - -18700,-26906,-18700,-26906,-18700,-26906,-18700,-26906, - -20886,-25247,-20886,-25247,-20886,-25247,-20886,-25247, - -22925,-23411,-22925,-23411,-22925,-23411,-22925,-23411, - -24804,-21410,-24804,-21410,-24804,-21410,-24804,-21410, - -26509,-19259,-26509,-19259,-26509,-19259,-26509,-19259, - -28027,-16974,-28027,-16974,-28027,-16974,-28027,-16974, - -29349,-14569,-29349,-14569,-29349,-14569,-29349,-14569, - -30465,-12062,-30465,-12062,-30465,-12062,-30465,-12062, - -31368,-9470,-31368,-9470,-31368,-9470,-31368,-9470, - -32050,-6812,-32050,-6812,-32050,-6812,-32050,-6812, - -32508,-4106,-32508,-4106,-32508,-4106,-32508,-4106, - -32738,-1372,-32738,-1372,-32738,-1372,-32738,-1372, - -32738,1372,-32738,1372,-32738,1372,-32738,1372, - -32508,4106,-32508,4106,-32508,4106,-32508,4106, - -32050,6812,-32050,6812,-32050,6812,-32050,6812, - -31368,9470,-31368,9470,-31368,9470,-31368,9470, - -30465,12062,-30465,12062,-30465,12062,-30465,12062, - -29349,14569,-29349,14569,-29349,14569,-29349,14569, - -28027,16974,-28027,16974,-28027,16974,-28027,16974, - -26509,19259,-26509,19259,-26509,19259,-26509,19259, - -24804,21410,-24804,21410,-24804,21410,-24804,21410, - -22925,23411,-22925,23411,-22925,23411,-22925,23411, - -20886,25247,-20886,25247,-20886,25247,-20886,25247, - -18700,26906,-18700,26906,-18700,26906,-18700,26906, - -16383,28377,-16383,28377,-16383,28377,-16383,28377, - -13951,29648,-13951,29648,-13951,29648,-13951,29648, - -11421,30711,-11421,30711,-11421,30711,-11421,30711, - -8811,31559,-8811,31559,-8811,31559,-8811,31559, - -6139,32186,-6139,32186,-6139,32186,-6139,32186, - -3425,32587,-3425,32587,-3425,32587,-3425,32587, - -686,32759,-686,32759,-686,32759,-686,32759, - 2057,32702,2057,32702,2057,32702,2057,32702, - 4786,32415,4786,32415,4786,32415,4786,32415, - 7482,31901,7482,31901,7482,31901,7482,31901 - }; +static int16_t twa300[472]__attribute__((aligned(32))); +static int16_t twb300[472]__attribute__((aligned(32))); +static int16_t twc300[472]__attribute__((aligned(32))); +static int16_t twd300[472]__attribute__((aligned(32))); void dft300(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -8707,246 +7552,8 @@ void dft300(int16_t *x,int16_t *y,unsigned char scale_flag) } -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:107)/324)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:107)/324)); -twa2 = zeros(1,2*107); -twb2 = zeros(1,2*107); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa324[107*2*4] = {"); -for i=1:2:(2*106) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb324[107*2*4] = {"); -for i=1:2:(2*106) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); - */ -static int16_t twa324[107*2*4] = {32760,-636,32760,-636,32760,-636,32760,-636, - 32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32613,-3173,32613,-3173,32613,-3173,32613,-3173, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32465,-4435,32465,-4435,32465,-4435,32465,-4435, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 32024,-6937,32024,-6937,32024,-6937,32024,-6937, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31731,-8174,31731,-8174,31731,-8174,31731,-8174, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 31002,-10608,31002,-10608,31002,-10608,31002,-10608, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30567,-11802,30567,-11802,30567,-11802,30567,-11802, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29561,-14136,29561,-14136,29561,-14136,29561,-14136, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 28990,-15271,28990,-15271,28990,-15271,28990,-15271, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27720,-17472,27720,-17472,27720,-17472,27720,-17472, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27022,-18534,27022,-18534,27022,-18534,27022,-18534, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25504,-20572,25504,-20572,25504,-20572,25504,-20572, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24687,-21546,24687,-21546,24687,-21546,24687,-21546, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 22944,-23394,22944,-23394,22944,-23394,22944,-23394, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22019,-24266,22019,-24266,22019,-24266,22019,-24266, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 20073,-25899,20073,-25899,20073,-25899,20073,-25899, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19053,-26658,19053,-26658,19053,-26658,19053,-26658, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 16930,-28055,16930,-28055,16930,-28055,16930,-28055, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15830,-28690,15830,-28690,15830,-28690,15830,-28690, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 13559,-29830,13559,-29830,13559,-29830,13559,-29830, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12392,-30334,12392,-30334,12392,-30334,12392,-30334, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 10004,-31203,10004,-31203,10004,-31203,10004,-31203, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8787,-31567,8787,-31567,8787,-31567,8787,-31567, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 6314,-32153,6314,-32153,6314,-32153,6314,-32153, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5063,-32374,5063,-32374,5063,-32374,5063,-32374, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 2539,-32669,2539,-32669,2539,-32669,2539,-32669, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1270,-32743,1270,-32743,1270,-32743,1270,-32743, - 635,-32761,635,-32761,635,-32761,635,-32761, - 0,-32767,0,-32767,0,-32767,0,-32767, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690 - }; -static int16_t twb324[107*2*4] = {32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 635,-32761,635,-32761,635,-32761,635,-32761, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, - -18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, - -21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, - -24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, - -26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, - -28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, - -30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, - -31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, - -32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, - -32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32743,1270,-32743,1270,-32743,1270,-32743,1270, - -32669,2539,-32669,2539,-32669,2539,-32669,2539, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32374,5063,-32374,5063,-32374,5063,-32374,5063, - -32153,6314,-32153,6314,-32153,6314,-32153,6314, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31567,8787,-31567,8787,-31567,8787,-31567,8787, - -31203,10004,-31203,10004,-31203,10004,-31203,10004, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30334,12392,-30334,12392,-30334,12392,-30334,12392, - -29830,13559,-29830,13559,-29830,13559,-29830,13559, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -28690,15830,-28690,15830,-28690,15830,-28690,15830, - -28055,16930,-28055,16930,-28055,16930,-28055,16930, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -26658,19053,-26658,19053,-26658,19053,-26658,19053, - -25899,20073,-25899,20073,-25899,20073,-25899,20073, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24266,22019,-24266,22019,-24266,22019,-24266,22019, - -23394,22944,-23394,22944,-23394,22944,-23394,22944, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -21546,24687,-21546,24687,-21546,24687,-21546,24687, - -20572,25504,-20572,25504,-20572,25504,-20572,25504, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -18534,27022,-18534,27022,-18534,27022,-18534,27022, - -17472,27720,-17472,27720,-17472,27720,-17472,27720 - }; +static int16_t twa324[107*2*4]; +static int16_t twb324[107*2*4]; void dft324(int16_t *x,int16_t *y,unsigned char scale_flag) // 108 x 3 { @@ -8996,271 +7603,8 @@ void dft324(int16_t *x,int16_t *y,unsigned char scale_flag) // 108 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:119)/360)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:119)/360)); -twa2 = zeros(1,2*119); -twb2 = zeros(1,2*119); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa360[119*2*4] = {"); -for i=1:2:(2*118) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb360[119*2*4] = {"); -for i=1:2:(2*118) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); - */ -static int16_t twa360[119*2*4] = {32762,-572,32762,-572,32762,-572,32762,-572, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32522,-3994,32522,-3994,32522,-3994,32522,-3994, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32164,-6253,32164,-6253,32164,-6253,32164,-6253, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31927,-7371,31927,-7371,31927,-7371,31927,-7371, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31335,-9581,31335,-9581,31335,-9581,31335,-9581, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30981,-10668,30981,-10668,30981,-10668,30981,-10668, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30162,-12804,30162,-12804,30162,-12804,30162,-12804, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28658,-15886,28658,-15886,28658,-15886,28658,-15886, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28086,-16877,28086,-16877,28086,-16877,28086,-16877, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26168,-19720,26168,-19720,26168,-19720,26168,-19720, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24729,-21498,24729,-21498,24729,-21498,24729,-21498, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 23964,-22348,23964,-22348,23964,-22348,23964,-22348, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22347,-23965,22347,-23965,22347,-23965,22347,-23965, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21497,-24730,21497,-24730,21497,-24730,21497,-24730, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19719,-26169,19719,-26169,19719,-26169,19719,-26169, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 16876,-28087,16876,-28087,16876,-28087,16876,-28087, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15885,-28659,15885,-28659,15885,-28659,15885,-28659, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12803,-30163,12803,-30163,12803,-30163,12803,-30163, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10667,-30982,10667,-30982,10667,-30982,10667,-30982, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9580,-31336,9580,-31336,9580,-31336,9580,-31336, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7370,-31928,7370,-31928,7370,-31928,7370,-31928, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6252,-32165,6252,-32165,6252,-32165,6252,-32165, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 3993,-32523,3993,-32523,3993,-32523,3993,-32523, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 571,-32763,571,-32763,571,-32763,571,-32763, - 0,-32767,0,-32767,0,-32767,0,-32767, - -572,-32763,-572,-32763,-572,-32763,-572,-32763, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659 - }; -static int16_t twb360[119*2*4] = {32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, - -18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, - -23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, - -27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, - -29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, - -31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, - -32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32748,1143,-32748,1143,-32748,1143,-32748,1143, - -32688,2285,-32688,2285,-32688,2285,-32688,2285, - -32588,3425,-32588,3425,-32588,3425,-32588,3425, - -32449,4560,-32449,4560,-32449,4560,-32449,4560, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -32051,6812,-32051,6812,-32051,6812,-32051,6812, - -31794,7927,-31794,7927,-31794,7927,-31794,7927, - -31498,9031,-31498,9031,-31498,9031,-31498,9031, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30382,12274,-30382,12274,-30382,12274,-30382,12274, - -29935,13327,-29935,13327,-29935,13327,-29935,13327, - -29451,14364,-29451,14364,-29451,14364,-29451,14364, - -28932,15383,-28932,15383,-28932,15383,-28932,15383, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -27788,17363,-27788,17363,-27788,17363,-27788,17363, - -27166,18323,-27166,18323,-27166,18323,-27166,18323, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -25821,20173,-25821,20173,-25821,20173,-25821,20173, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24351,21925,-24351,21925,-24351,21925,-24351,21925, - -23571,22761,-23571,22761,-23571,22761,-23571,22761, - -22762,23570,-22762,23570,-22762,23570,-22762,23570, - -21926,24350,-21926,24350,-21926,24350,-21926,24350, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -20174,25820,-20174,25820,-20174,25820,-20174,25820, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18324,27165,-18324,27165,-18324,27165,-18324,27165, - -17364,27787,-17364,27787,-17364,27787,-17364,27787 - }; - +static int16_t twa360[119*2*4]; +static int16_t twb360[119*2*4]; void dft360(int16_t *x,int16_t *y,unsigned char scale_flag) // 120 x 3 { @@ -9310,329 +7654,9 @@ void dft360(int16_t *x,int16_t *y,unsigned char scale_flag) // 120 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:95)/384)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:95)/384)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:95)/384)); -twa2 = zeros(1,2*95); -twb2 = zeros(1,2*95); -twc2 = zeros(1,2*95); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa384[95*2*4] = {"); -for i=1:2:(2*94) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb384[95*2*4] = {"); -for i=1:2:(2*94) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"static int16_t twc384[95*2*4] = {"); -for i=1:2:(2*94) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); - */ - -static int16_t twa384[95*2*4] = {32762,-537,32762,-537,32762,-537,32762,-537, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32727,-1608,32727,-1608,32727,-1608,32727,-1608, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32657,-2678,32657,-2678,32657,-2678,32657,-2678, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32552,-3745,32552,-3745,32552,-3745,32552,-3745, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32412,-4808,32412,-4808,32412,-4808,32412,-4808, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32237,-5866,32237,-5866,32237,-5866,32237,-5866, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32028,-6918,32028,-6918,32028,-6918,32028,-6918, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31785,-7962,31785,-7962,31785,-7962,31785,-7962, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31507,-8998,31507,-8998,31507,-8998,31507,-8998, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31196,-10024,31196,-10024,31196,-10024,31196,-10024, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30851,-11039,30851,-11039,30851,-11039,30851,-11039, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30473,-12043,30473,-12043,30473,-12043,30473,-12043, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30063,-13034,30063,-13034,30063,-13034,30063,-13034, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29621,-14010,29621,-14010,29621,-14010,29621,-14010, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29146,-14972,29146,-14972,29146,-14972,29146,-14972, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28641,-15918,28641,-15918,28641,-15918,28641,-15918, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28105,-16846,28105,-16846,28105,-16846,28105,-16846, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27538,-17757,27538,-17757,27538,-17757,27538,-17757, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26943,-18648,26943,-18648,26943,-18648,26943,-18648, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26318,-19520,26318,-19520,26318,-19520,26318,-19520, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25665,-20370,25665,-20370,25665,-20370,25665,-20370, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 24985,-21199,24985,-21199,24985,-21199,24985,-21199, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24278,-22005,24278,-22005,24278,-22005,24278,-22005, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23545,-22788,23545,-22788,23545,-22788,23545,-22788, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22787,-23546,22787,-23546,22787,-23546,22787,-23546, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22004,-24279,22004,-24279,22004,-24279,22004,-24279, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21198,-24986,21198,-24986,21198,-24986,21198,-24986, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20369,-25666,20369,-25666,20369,-25666,20369,-25666, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19519,-26319,19519,-26319,19519,-26319,19519,-26319, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18647,-26944,18647,-26944,18647,-26944,18647,-26944, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17756,-27539,17756,-27539,17756,-27539,17756,-27539, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 16845,-28106,16845,-28106,16845,-28106,16845,-28106, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15917,-28642,15917,-28642,15917,-28642,15917,-28642, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 14971,-29147,14971,-29147,14971,-29147,14971,-29147, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14009,-29622,14009,-29622,14009,-29622,14009,-29622, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13033,-30064,13033,-30064,13033,-30064,13033,-30064, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12042,-30474,12042,-30474,12042,-30474,12042,-30474, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11038,-30852,11038,-30852,11038,-30852,11038,-30852, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10023,-31197,10023,-31197,10023,-31197,10023,-31197, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 8997,-31508,8997,-31508,8997,-31508,8997,-31508, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7961,-31786,7961,-31786,7961,-31786,7961,-31786, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 6917,-32029,6917,-32029,6917,-32029,6917,-32029, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5865,-32238,5865,-32238,5865,-32238,5865,-32238, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 4807,-32413,4807,-32413,4807,-32413,4807,-32413, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3744,-32553,3744,-32553,3744,-32553,3744,-32553, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2677,-32658,2677,-32658,2677,-32658,2677,-32658, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1607,-32728,1607,-32728,1607,-32728,1607,-32728, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 536,-32763,536,-32763,536,-32763,536,-32763 - }; -static int16_t twb384[95*2*4] = {32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, - -21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, - -22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, - -24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, - -25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, - -29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, - -29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, - -31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, - -31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, - -32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, - -32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073 - }; -static int16_t twc384[95*2*4] = {32727,-1608,32727,-1608,32727,-1608,32727,-1608, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32412,-4808,32412,-4808,32412,-4808,32412,-4808, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 31785,-7962,31785,-7962,31785,-7962,31785,-7962, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 30851,-11039,30851,-11039,30851,-11039,30851,-11039, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29621,-14010,29621,-14010,29621,-14010,29621,-14010, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28105,-16846,28105,-16846,28105,-16846,28105,-16846, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26318,-19520,26318,-19520,26318,-19520,26318,-19520, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 24278,-22005,24278,-22005,24278,-22005,24278,-22005, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22004,-24279,22004,-24279,22004,-24279,22004,-24279, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 19519,-26319,19519,-26319,19519,-26319,19519,-26319, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 16845,-28106,16845,-28106,16845,-28106,16845,-28106, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 14009,-29622,14009,-29622,14009,-29622,14009,-29622, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11038,-30852,11038,-30852,11038,-30852,11038,-30852, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 7961,-31786,7961,-31786,7961,-31786,7961,-31786, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 4807,-32413,4807,-32413,4807,-32413,4807,-32413, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 1607,-32728,1607,-32728,1607,-32728,1607,-32728, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1608,-32728,-1608,-32728,-1608,-32728,-1608,-32728, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -4808,-32413,-4808,-32413,-4808,-32413,-4808,-32413, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -7962,-31786,-7962,-31786,-7962,-31786,-7962,-31786, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -11039,-30852,-11039,-30852,-11039,-30852,-11039,-30852, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -14010,-29622,-14010,-29622,-14010,-29622,-14010,-29622, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -16846,-28106,-16846,-28106,-16846,-28106,-16846,-28106, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -19520,-26319,-19520,-26319,-19520,-26319,-19520,-26319, - -20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, - -22005,-24279,-22005,-24279,-22005,-24279,-22005,-24279, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -24279,-22005,-24279,-22005,-24279,-22005,-24279,-22005, - -25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, - -26319,-19520,-26319,-19520,-26319,-19520,-26319,-19520, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -28106,-16846,-28106,-16846,-28106,-16846,-28106,-16846, - -28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, - -29622,-14010,-29622,-14010,-29622,-14010,-29622,-14010, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30852,-11039,-30852,-11039,-30852,-11039,-30852,-11039, - -31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, - -31786,-7962,-31786,-7962,-31786,-7962,-31786,-7962, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32413,-4808,-32413,-4808,-32413,-4808,-32413,-4808, - -32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, - -32728,-1608,-32728,-1608,-32728,-1608,-32728,-1608, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32728,1607,-32728,1607,-32728,1607,-32728,1607, - -32610,3211,-32610,3211,-32610,3211,-32610,3211, - -32413,4807,-32413,4807,-32413,4807,-32413,4807, - -32138,6392,-32138,6392,-32138,6392,-32138,6392, - -31786,7961,-31786,7961,-31786,7961,-31786,7961, - -31357,9511,-31357,9511,-31357,9511,-31357,9511, - -30852,11038,-30852,11038,-30852,11038,-30852,11038, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -29622,14009,-29622,14009,-29622,14009,-29622,14009, - -28898,15446,-28898,15446,-28898,15446,-28898,15446, - -28106,16845,-28106,16845,-28106,16845,-28106,16845, - -27245,18204,-27245,18204,-27245,18204,-27245,18204, - -26319,19519,-26319,19519,-26319,19519,-26319,19519, - -25330,20787,-25330,20787,-25330,20787,-25330,20787, - -24279,22004,-24279,22004,-24279,22004,-24279,22004, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22005,24278,-22005,24278,-22005,24278,-22005,24278, - -20788,25329,-20788,25329,-20788,25329,-20788,25329, - -19520,26318,-19520,26318,-19520,26318,-19520,26318, - -18205,27244,-18205,27244,-18205,27244,-18205,27244, - -16846,28105,-16846,28105,-16846,28105,-16846,28105, - -15447,28897,-15447,28897,-15447,28897,-15447,28897, - -14010,29621,-14010,29621,-14010,29621,-14010,29621, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -11039,30851,-11039,30851,-11039,30851,-11039,30851, - -9512,31356,-9512,31356,-9512,31356,-9512,31356, - -7962,31785,-7962,31785,-7962,31785,-7962,31785, - -6393,32137,-6393,32137,-6393,32137,-6393,32137, - -4808,32412,-4808,32412,-4808,32412,-4808,32412, - -3212,32609,-3212,32609,-3212,32609,-3212,32609, - -1608,32727,-1608,32727,-1608,32727,-1608,32727 - }; +static int16_t twa384[95*2*4]; +static int16_t twb384[95*2*4]; +static int16_t twc384[95*2*4]; void dft384(int16_t *x,int16_t *y,unsigned char scale_flag) // 96 x 4 { @@ -9688,366 +7712,9 @@ void dft384(int16_t *x,int16_t *y,unsigned char scale_flag) // 96 x 4 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:107)/432)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:107)/432)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:107)/432)); -twa2 = zeros(1,2*107); -twb2 = zeros(1,2*107); -twc2 = zeros(1,2*107); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa432[107*2*4] = {"); -for i=1:2:(2*106) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb432[107*2*4] = {"); -for i=1:2:(2*106) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"static int16_t twc432[107*2*4] = {"); -for i=1:2:(2*106) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); - */ - -static int16_t twa432[107*2*4] = {32763,-477,32763,-477,32763,-477,32763,-477, - 32753,-954,32753,-954,32753,-954,32753,-954, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32680,-2381,32680,-2381,32680,-2381,32680,-2381, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32597,-3331,32597,-3331,32597,-3331,32597,-3331, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32348,-5221,32348,-5221,32348,-5221,32348,-5221, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32183,-6159,32183,-6159,32183,-6159,32183,-6159, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31770,-8020,31770,-8020,31770,-8020,31770,-8020, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31523,-8941,31523,-8941,31523,-8941,31523,-8941, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 30950,-10758,30950,-10758,30950,-10758,30950,-10758, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30624,-11654,30624,-11654,30624,-11654,30624,-11654, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29895,-13415,29895,-13415,29895,-13415,29895,-13415, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29492,-14279,29492,-14279,29492,-14279,29492,-14279, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28612,-15970,28612,-15970,28612,-15970,28612,-15970, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28135,-16795,28135,-16795,28135,-16795,28135,-16795, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27111,-18403,27111,-18403,27111,-18403,27111,-18403, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26564,-19183,26564,-19183,26564,-19183,26564,-19183, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25404,-20695,25404,-20695,25404,-20695,25404,-20695, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24791,-21426,24791,-21426,24791,-21426,24791,-21426, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23504,-22831,23504,-22831,23504,-22831,23504,-22831, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22830,-23505,22830,-23505,22830,-23505,22830,-23505, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21425,-24792,21425,-24792,21425,-24792,21425,-24792, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20694,-25405,20694,-25405,20694,-25405,20694,-25405, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19182,-26565,19182,-26565,19182,-26565,19182,-26565, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18402,-27112,18402,-27112,18402,-27112,18402,-27112, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 16794,-28136,16794,-28136,16794,-28136,16794,-28136, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15969,-28613,15969,-28613,15969,-28613,15969,-28613, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14278,-29493,14278,-29493,14278,-29493,14278,-29493, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13414,-29896,13414,-29896,13414,-29896,13414,-29896, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11653,-30625,11653,-30625,11653,-30625,11653,-30625, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10757,-30951,10757,-30951,10757,-30951,10757,-30951, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8940,-31524,8940,-31524,8940,-31524,8940,-31524, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8019,-31771,8019,-31771,8019,-31771,8019,-31771, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 6158,-32184,6158,-32184,6158,-32184,6158,-32184, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5220,-32349,5220,-32349,5220,-32349,5220,-32349, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3330,-32598,3330,-32598,3330,-32598,3330,-32598, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2380,-32681,2380,-32681,2380,-32681,2380,-32681, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 953,-32754,953,-32754,953,-32754,953,-32754, - 476,-32764,476,-32764,476,-32764,476,-32764 - }; -static int16_t twb432[107*2*4] = {32753,-954,32753,-954,32753,-954,32753,-954, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 953,-32754,953,-32754,953,-32754,953,-32754, - 0,-32767,0,-32767,0,-32767,0,-32767, - -954,-32754,-954,-32754,-954,-32754,-954,-32754, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17202,-27889,-17202,-27889,-17202,-27889,-17202,-27889, - -18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -20324,-25703,-20324,-25703,-20324,-25703,-20324,-25703, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21784,-24478,-21784,-24478,-21784,-24478,-21784,-24478, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, - -24478,-21784,-24478,-21784,-24478,-21784,-24478,-21784, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25703,-20324,-25703,-20324,-25703,-20324,-25703,-20324, - -26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27889,-17202,-27889,-17202,-27889,-17202,-27889,-17202, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28842,-15552,-28842,-15552,-28842,-15552,-28842,-15552, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, - -30452,-12098,-30452,-12098,-30452,-12098,-30452,-12098, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31104,-10307,-31104,-10307,-31104,-10307,-31104,-10307, - -31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -32091,-6627,-32091,-6627,-32091,-6627,-32091,-6627, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32422,-4749,-32422,-4749,-32422,-4749,-32422,-4749, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, - -32754,-954,-32754,-954,-32754,-954,-32754,-954 - }; -static int16_t twc432[107*2*4] = {32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32736,1429,-32736,1429,-32736,1429,-32736,1429, - -32643,2855,-32643,2855,-32643,2855,-32643,2855, - -32487,4276,-32487,4276,-32487,4276,-32487,4276, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -31991,7092,-31991,7092,-31991,7092,-31991,7092, - -31651,8480,-31651,8480,-31651,8480,-31651,8480, - -31251,9853,-31251,9853,-31251,9853,-31251,9853, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -29697,13847,-29697,13847,-29697,13847,-29697,13847, - -29065,15130,-29065,15130,-29065,15130,-29065,15130, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -27636,17605,-27636,17605,-27636,17605,-27636,17605, - -26842,18794,-26842,18794,-26842,18794,-26842,18794, - -25996,19947,-25996,19947,-25996,19947,-25996,19947, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24159,22137,-24159,22137,-24159,22137,-24159,22137, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22138,24158,-22138,24158,-22138,24158,-22138,24158, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -19948,25995,-19948,25995,-19948,25995,-19948,25995, - -18795,26841,-18795,26841,-18795,26841,-18795,26841, - -17606,27635,-17606,27635,-17606,27635,-17606,27635, - -16384,28377,-16384,28377,-16384,28377,-16384,28377, - -15131,29064,-15131,29064,-15131,29064,-15131,29064, - -13848,29696,-13848,29696,-13848,29696,-13848,29696, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -11207,30790,-11207,30790,-11207,30790,-11207,30790, - -9854,31250,-9854,31250,-9854,31250,-9854,31250, - -8481,31650,-8481,31650,-8481,31650,-8481,31650, - -7093,31990,-7093,31990,-7093,31990,-7093,31990, - -5690,32269,-5690,32269,-5690,32269,-5690,32269, - -4277,32486,-4277,32486,-4277,32486,-4277,32486, - -2856,32642,-2856,32642,-2856,32642,-2856,32642, - -1430,32735,-1430,32735,-1430,32735,-1430,32735 - }; - +static int16_t twa432[107*2*4]; +static int16_t twb432[107*2*4]; +static int16_t twc432[107*2*4]; void dft432(int16_t *x,int16_t *y,unsigned char scale_flag) // 108 x 4 { @@ -10101,402 +7768,9 @@ void dft432(int16_t *x,int16_t *y,unsigned char scale_flag) // 108 x 4 _m_empty(); }; -/* -Twiddles generated with - -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:119)/480)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:119)/480)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:119)/480)); -twa2 = zeros(1,2*119); -twb2 = zeros(1,2*119); -twc2 = zeros(1,2*119); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa480[119*2*4] = {"); -for i=1:2:(2*118) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb480[119*2*4] = {"); -for i=1:2:(2*118) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"static int16_t twc480[119*2*4] = {"); -for i=1:2:(2*118) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); -*/ -static int16_t twa480[119*2*4] = {32764,-429,32764,-429,32764,-429,32764,-429, - 32755,-858,32755,-858,32755,-858,32755,-858, - 32741,-1287,32741,-1287,32741,-1287,32741,-1287, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32629,-2999,32629,-2999,32629,-2999,32629,-2999, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32539,-3852,32539,-3852,32539,-3852,32539,-3852, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32427,-4702,32427,-4702,32427,-4702,32427,-4702, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32293,-5550,32293,-5550,32293,-5550,32293,-5550, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31959,-7232,31959,-7232,31959,-7232,31959,-7232, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31758,-8066,31758,-8066,31758,-8066,31758,-8066, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31536,-8895,31536,-8895,31536,-8895,31536,-8895, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31293,-9717,31293,-9717,31293,-9717,31293,-9717, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30741,-11342,30741,-11342,30741,-11342,30741,-11342, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30434,-12143,30434,-12143,30434,-12143,30434,-12143, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30106,-12935,30106,-12935,30106,-12935,30106,-12935, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29757,-13719,29757,-13719,29757,-13719,29757,-13719, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28998,-15257,28998,-15257,28998,-15257,28998,-15257, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28589,-16011,28589,-16011,28589,-16011,28589,-16011, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28160,-16754,28160,-16754,28160,-16754,28160,-16754, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27711,-17485,27711,-17485,27711,-17485,27711,-17485, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26758,-18912,26758,-18912,26758,-18912,26758,-18912, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26254,-19606,26254,-19606,26254,-19606,26254,-19606, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25732,-20286,25732,-20286,25732,-20286,25732,-20286, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25192,-20953,25192,-20953,25192,-20953,25192,-20953, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24061,-22243,24061,-22243,24061,-22243,24061,-22243, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23471,-22865,23471,-22865,23471,-22865,23471,-22865, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22864,-23472,22864,-23472,22864,-23472,22864,-23472, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 22242,-24062,22242,-24062,22242,-24062,22242,-24062, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20952,-25193,20952,-25193,20952,-25193,20952,-25193, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20285,-25733,20285,-25733,20285,-25733,20285,-25733, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19605,-26255,19605,-26255,19605,-26255,19605,-26255, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18911,-26759,18911,-26759,18911,-26759,18911,-26759, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17484,-27712,17484,-27712,17484,-27712,17484,-27712, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16753,-28161,16753,-28161,16753,-28161,16753,-28161, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16010,-28590,16010,-28590,16010,-28590,16010,-28590, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 15256,-28999,15256,-28999,15256,-28999,15256,-28999, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13718,-29758,13718,-29758,13718,-29758,13718,-29758, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12934,-30107,12934,-30107,12934,-30107,12934,-30107, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12142,-30435,12142,-30435,12142,-30435,12142,-30435, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11341,-30742,11341,-30742,11341,-30742,11341,-30742, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9716,-31294,9716,-31294,9716,-31294,9716,-31294, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 8894,-31537,8894,-31537,8894,-31537,8894,-31537, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8065,-31759,8065,-31759,8065,-31759,8065,-31759, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7231,-31960,7231,-31960,7231,-31960,7231,-31960, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5549,-32294,5549,-32294,5549,-32294,5549,-32294, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4701,-32428,4701,-32428,4701,-32428,4701,-32428, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3851,-32540,3851,-32540,3851,-32540,3851,-32540, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2998,-32630,2998,-32630,2998,-32630,2998,-32630, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1286,-32742,1286,-32742,1286,-32742,1286,-32742, - 857,-32756,857,-32756,857,-32756,857,-32756, - 428,-32765,428,-32765,428,-32765,428,-32765 - }; -static int16_t twb480[119*2*4] = {32755,-858,32755,-858,32755,-858,32755,-858, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 857,-32756,857,-32756,857,-32756,857,-32756, - 0,-32767,0,-32767,0,-32767,0,-32767, - -858,-32756,-858,-32756,-858,-32756,-858,-32756, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32756,-858,-32756,-858,-32756,-858,-32756,-858 - }; -static int16_t twc480[119*2*4] = {32741,-1287,32741,-1287,32741,-1287,32741,-1287, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32539,-3852,32539,-3852,32539,-3852,32539,-3852, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31536,-8895,31536,-8895,31536,-8895,31536,-8895, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30741,-11342,30741,-11342,30741,-11342,30741,-11342, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29757,-13719,29757,-13719,29757,-13719,29757,-13719, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28589,-16011,28589,-16011,28589,-16011,28589,-16011, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 25732,-20286,25732,-20286,25732,-20286,25732,-20286, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24061,-22243,24061,-22243,24061,-22243,24061,-22243, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22242,-24062,22242,-24062,22242,-24062,22242,-24062, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20285,-25733,20285,-25733,20285,-25733,20285,-25733, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16010,-28590,16010,-28590,16010,-28590,16010,-28590, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 13718,-29758,13718,-29758,13718,-29758,13718,-29758, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11341,-30742,11341,-30742,11341,-30742,11341,-30742, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 8894,-31537,8894,-31537,8894,-31537,8894,-31537, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 3851,-32540,3851,-32540,3851,-32540,3851,-32540, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 1286,-32742,1286,-32742,1286,-32742,1286,-32742, - 0,-32767,0,-32767,0,-32767,0,-32767, - -1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32742,1286,-32742,1286,-32742,1286,-32742,1286, - -32666,2570,-32666,2570,-32666,2570,-32666,2570, - -32540,3851,-32540,3851,-32540,3851,-32540,3851, - -32364,5125,-32364,5125,-32364,5125,-32364,5125, - -32138,6392,-32138,6392,-32138,6392,-32138,6392, - -31862,7649,-31862,7649,-31862,7649,-31862,7649, - -31537,8894,-31537,8894,-31537,8894,-31537,8894, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -30742,11341,-30742,11341,-30742,11341,-30742,11341, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -29758,13718,-29758,13718,-29758,13718,-29758,13718, - -29196,14875,-29196,14875,-29196,14875,-29196,14875, - -28590,16010,-28590,16010,-28590,16010,-28590,16010, - -27939,17120,-27939,17120,-27939,17120,-27939,17120, - -27245,18204,-27245,18204,-27245,18204,-27245,18204, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -25733,20285,-25733,20285,-25733,20285,-25733,20285, - -24917,21280,-24917,21280,-24917,21280,-24917,21280, - -24062,22242,-24062,22242,-24062,22242,-24062,22242, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22243,24061,-22243,24061,-22243,24061,-22243,24061, - -21281,24916,-21281,24916,-21281,24916,-21281,24916, - -20286,25732,-20286,25732,-20286,25732,-20286,25732, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18205,27244,-18205,27244,-18205,27244,-18205,27244, - -17121,27938,-17121,27938,-17121,27938,-17121,27938, - -16011,28589,-16011,28589,-16011,28589,-16011,28589, - -14876,29195,-14876,29195,-14876,29195,-14876,29195, - -13719,29757,-13719,29757,-13719,29757,-13719,29757, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -11342,30741,-11342,30741,-11342,30741,-11342,30741, - -10126,31163,-10126,31163,-10126,31163,-10126,31163, - -8895,31536,-8895,31536,-8895,31536,-8895,31536, - -7650,31861,-7650,31861,-7650,31861,-7650,31861, - -6393,32137,-6393,32137,-6393,32137,-6393,32137, - -5126,32363,-5126,32363,-5126,32363,-5126,32363, - -3852,32539,-3852,32539,-3852,32539,-3852,32539, - -2571,32665,-2571,32665,-2571,32665,-2571,32665, - -1287,32741,-1287,32741,-1287,32741,-1287,32741 - }; +static int16_t twa480[119*2*4]; +static int16_t twb480[119*2*4]; +static int16_t twc480[119*2*4]; void dft480(int16_t *x,int16_t *y,unsigned char scale_flag) // 120 x 4 { @@ -10552,392 +7826,9 @@ void dft480(int16_t *x,int16_t *y,unsigned char scale_flag) // 120 x 4 }; -/* -Twiddles generated with - -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:179)/540)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:179)/540)); -twa2 = zeros(1,2*179); -twb2 = zeros(1,2*179); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa540[179*2*4] = {"); -for i=1:2:(2*178) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb540[179*2*4] = {"); -for i=1:2:(2*178) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa540[179*2*4] = {32764,-382,32764,-382,32764,-382,32764,-382, - 32758,-763,32758,-763,32758,-763,32758,-763, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32731,-1525,32731,-1525,32731,-1525,32731,-1525, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32658,-2666,32658,-2666,32658,-2666,32658,-2666, - 32625,-3046,32625,-3046,32625,-3046,32625,-3046, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32498,-4183,32498,-4183,32498,-4183,32498,-4183, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32392,-4938,32392,-4938,32392,-4938,32392,-4938, - 32333,-5315,32333,-5315,32333,-5315,32333,-5315, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32200,-6066,32200,-6066,32200,-6066,32200,-6066, - 32128,-6440,32128,-6440,32128,-6440,32128,-6440, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31969,-7186,31969,-7186,31969,-7186,31969,-7186, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31699,-8297,31699,-8297,31699,-8297,31699,-8297, - 31600,-8665,31600,-8665,31600,-8665,31600,-8665, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31278,-9763,31278,-9763,31278,-9763,31278,-9763, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31043,-10488,31043,-10488,31043,-10488,31043,-10488, - 30919,-10848,30919,-10848,30919,-10848,30919,-10848, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30658,-11565,30658,-11565,30658,-11565,30658,-11565, - 30521,-11921,30521,-11921,30521,-11921,30521,-11921, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30236,-12628,30236,-12628,30236,-12628,30236,-12628, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29777,-13675,29777,-13675,29777,-13675,29777,-13675, - 29615,-14021,29615,-14021,29615,-14021,29615,-14021, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29108,-15046,29108,-15046,29108,-15046,29108,-15046, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28750,-15719,28750,-15719,28750,-15719,28750,-15719, - 28565,-16053,28565,-16053,28565,-16053,28565,-16053, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28184,-16713,28184,-16713,28184,-16713,28184,-16713, - 27988,-17040,27988,-17040,27988,-17040,27988,-17040, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27584,-17687,27584,-17687,27584,-17687,27584,-17687, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 26950,-18638,26950,-18638,26950,-18638,26950,-18638, - 26731,-18951,26731,-18951,26731,-18951,26731,-18951, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26053,-19872,26053,-19872,26053,-19872,26053,-19872, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25584,-20473,25584,-20473,25584,-20473,25584,-20473, - 25344,-20769,25344,-20769,25344,-20769,25344,-20769, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24854,-21353,24854,-21353,24854,-21353,24854,-21353, - 24604,-21641,24604,-21641,24604,-21641,24604,-21641, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24093,-22208,24093,-22208,24093,-22208,24093,-22208, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23304,-23035,23304,-23035,23304,-23035,23304,-23035, - 23034,-23305,23034,-23305,23034,-23305,23034,-23305, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22207,-24094,22207,-24094,22207,-24094,22207,-24094, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21640,-24605,21640,-24605,21640,-24605,21640,-24605, - 21352,-24855,21352,-24855,21352,-24855,21352,-24855, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20768,-25345,20768,-25345,20768,-25345,20768,-25345, - 20472,-25585,20472,-25585,20472,-25585,20472,-25585, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19871,-26054,19871,-26054,19871,-26054,19871,-26054, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18950,-26732,18950,-26732,18950,-26732,18950,-26732, - 18637,-26951,18637,-26951,18637,-26951,18637,-26951, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17686,-27585,17686,-27585,17686,-27585,17686,-27585, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 17039,-27989,17039,-27989,17039,-27989,17039,-27989, - 16712,-28185,16712,-28185,16712,-28185,16712,-28185, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16052,-28566,16052,-28566,16052,-28566,16052,-28566, - 15718,-28751,15718,-28751,15718,-28751,15718,-28751, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 15045,-29109,15045,-29109,15045,-29109,15045,-29109, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 14020,-29616,14020,-29616,14020,-29616,14020,-29616, - 13674,-29778,13674,-29778,13674,-29778,13674,-29778, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12627,-30237,12627,-30237,12627,-30237,12627,-30237, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11920,-30522,11920,-30522,11920,-30522,11920,-30522, - 11564,-30659,11564,-30659,11564,-30659,11564,-30659, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10847,-30920,10847,-30920,10847,-30920,10847,-30920, - 10487,-31044,10487,-31044,10487,-31044,10487,-31044, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9762,-31279,9762,-31279,9762,-31279,9762,-31279, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8664,-31601,8664,-31601,8664,-31601,8664,-31601, - 8296,-31700,8296,-31700,8296,-31700,8296,-31700, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7185,-31970,7185,-31970,7185,-31970,7185,-31970, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6439,-32129,6439,-32129,6439,-32129,6439,-32129, - 6065,-32201,6065,-32201,6065,-32201,6065,-32201, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5314,-32334,5314,-32334,5314,-32334,5314,-32334, - 4937,-32393,4937,-32393,4937,-32393,4937,-32393, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 4182,-32499,4182,-32499,4182,-32499,4182,-32499, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3045,-32626,3045,-32626,3045,-32626,3045,-32626, - 2665,-32659,2665,-32659,2665,-32659,2665,-32659, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1524,-32732,1524,-32732,1524,-32732,1524,-32732, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 762,-32759,762,-32759,762,-32759,762,-32759, - 381,-32765,381,-32765,381,-32765,381,-32765, - 0,-32767,0,-32767,0,-32767,0,-32767, - -382,-32765,-382,-32765,-382,-32765,-382,-32765, - -763,-32759,-763,-32759,-763,-32759,-763,-32759, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, - -3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, - -5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, - -6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, - -8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, - -10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, - -11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, - -14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, - -16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566 - }; -static int16_t twb540[179*2*4] = {32758,-763,32758,-763,32758,-763,32758,-763, - 32731,-1525,32731,-1525,32731,-1525,32731,-1525, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32625,-3046,32625,-3046,32625,-3046,32625,-3046, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32333,-5315,32333,-5315,32333,-5315,32333,-5315, - 32200,-6066,32200,-6066,32200,-6066,32200,-6066, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31699,-8297,31699,-8297,31699,-8297,31699,-8297, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31278,-9763,31278,-9763,31278,-9763,31278,-9763, - 31043,-10488,31043,-10488,31043,-10488,31043,-10488, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30521,-11921,30521,-11921,30521,-11921,30521,-11921, - 30236,-12628,30236,-12628,30236,-12628,30236,-12628, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29615,-14021,29615,-14021,29615,-14021,29615,-14021, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28565,-16053,28565,-16053,28565,-16053,28565,-16053, - 28184,-16713,28184,-16713,28184,-16713,28184,-16713, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 26950,-18638,26950,-18638,26950,-18638,26950,-18638, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26053,-19872,26053,-19872,26053,-19872,26053,-19872, - 25584,-20473,25584,-20473,25584,-20473,25584,-20473, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24604,-21641,24604,-21641,24604,-21641,24604,-21641, - 24093,-22208,24093,-22208,24093,-22208,24093,-22208, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23034,-23305,23034,-23305,23034,-23305,23034,-23305, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21352,-24855,21352,-24855,21352,-24855,21352,-24855, - 20768,-25345,20768,-25345,20768,-25345,20768,-25345, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 18950,-26732,18950,-26732,18950,-26732,18950,-26732, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 17686,-27585,17686,-27585,17686,-27585,17686,-27585, - 17039,-27989,17039,-27989,17039,-27989,17039,-27989, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15718,-28751,15718,-28751,15718,-28751,15718,-28751, - 15045,-29109,15045,-29109,15045,-29109,15045,-29109, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 13674,-29778,13674,-29778,13674,-29778,13674,-29778, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11564,-30659,11564,-30659,11564,-30659,11564,-30659, - 10847,-30920,10847,-30920,10847,-30920,10847,-30920, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8664,-31601,8664,-31601,8664,-31601,8664,-31601, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7185,-31970,7185,-31970,7185,-31970,7185,-31970, - 6439,-32129,6439,-32129,6439,-32129,6439,-32129, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4937,-32393,4937,-32393,4937,-32393,4937,-32393, - 4182,-32499,4182,-32499,4182,-32499,4182,-32499, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2665,-32659,2665,-32659,2665,-32659,2665,-32659, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 381,-32765,381,-32765,381,-32765,381,-32765, - -382,-32765,-382,-32765,-382,-32765,-382,-32765, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, - -4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, - -7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, - -11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, - -15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17040,-27989,-17040,-27989,-17040,-27989,-17040,-27989, - -17687,-27585,-17687,-27585,-17687,-27585,-17687,-27585, - -18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, - -18951,-26732,-18951,-26732,-18951,-26732,-18951,-26732, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, - -20769,-25345,-20769,-25345,-20769,-25345,-20769,-25345, - -21353,-24855,-21353,-24855,-21353,-24855,-21353,-24855, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -23035,-23305,-23035,-23305,-23035,-23305,-23035,-23305, - -23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, - -24094,-22208,-24094,-22208,-24094,-22208,-24094,-22208, - -24605,-21641,-24605,-21641,-24605,-21641,-24605,-21641, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25585,-20473,-25585,-20473,-25585,-20473,-25585,-20473, - -26054,-19872,-26054,-19872,-26054,-19872,-26054,-19872, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26951,-18638,-26951,-18638,-26951,-18638,-26951,-18638, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, - -28185,-16713,-28185,-16713,-28185,-16713,-28185,-16713, - -28566,-16053,-28566,-16053,-28566,-16053,-28566,-16053, - -28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29616,-14021,-29616,-14021,-29616,-14021,-29616,-14021, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30237,-12628,-30237,-12628,-30237,-12628,-30237,-12628, - -30522,-11921,-30522,-11921,-30522,-11921,-30522,-11921, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31044,-10488,-31044,-10488,-31044,-10488,-31044,-10488, - -31279,-9763,-31279,-9763,-31279,-9763,-31279,-9763, - -31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, - -31700,-8297,-31700,-8297,-31700,-8297,-31700,-8297, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32201,-6066,-32201,-6066,-32201,-6066,-32201,-6066, - -32334,-5315,-32334,-5315,-32334,-5315,-32334,-5315, - -32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32626,-3046,-32626,-3046,-32626,-3046,-32626,-3046, - -32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, - -32732,-1525,-32732,-1525,-32732,-1525,-32732,-1525, - -32759,-763,-32759,-763,-32759,-763,-32759,-763, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32759,762,-32759,762,-32759,762,-32759,762, - -32732,1524,-32732,1524,-32732,1524,-32732,1524, - -32688,2285,-32688,2285,-32688,2285,-32688,2285, - -32626,3045,-32626,3045,-32626,3045,-32626,3045, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32449,4560,-32449,4560,-32449,4560,-32449,4560, - -32334,5314,-32334,5314,-32334,5314,-32334,5314, - -32201,6065,-32201,6065,-32201,6065,-32201,6065, - -32051,6812,-32051,6812,-32051,6812,-32051,6812, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31700,8296,-31700,8296,-31700,8296,-31700,8296, - -31498,9031,-31498,9031,-31498,9031,-31498,9031, - -31279,9762,-31279,9762,-31279,9762,-31279,9762, - -31044,10487,-31044,10487,-31044,10487,-31044,10487, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30522,11920,-30522,11920,-30522,11920,-30522,11920, - -30237,12627,-30237,12627,-30237,12627,-30237,12627, - -29935,13327,-29935,13327,-29935,13327,-29935,13327, - -29616,14020,-29616,14020,-29616,14020,-29616,14020, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -28932,15383,-28932,15383,-28932,15383,-28932,15383, - -28566,16052,-28566,16052,-28566,16052,-28566,16052, - -28185,16712,-28185,16712,-28185,16712,-28185,16712, - -27788,17363,-27788,17363,-27788,17363,-27788,17363, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -26951,18637,-26951,18637,-26951,18637,-26951,18637, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -26054,19871,-26054,19871,-26054,19871,-26054,19871, - -25585,20472,-25585,20472,-25585,20472,-25585,20472, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24605,21640,-24605,21640,-24605,21640,-24605,21640, - -24094,22207,-24094,22207,-24094,22207,-24094,22207, - -23571,22761,-23571,22761,-23571,22761,-23571,22761, - -23035,23304,-23035,23304,-23035,23304,-23035,23304, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -21926,24350,-21926,24350,-21926,24350,-21926,24350, - -21353,24854,-21353,24854,-21353,24854,-21353,24854, - -20769,25344,-20769,25344,-20769,25344,-20769,25344, - -20174,25820,-20174,25820,-20174,25820,-20174,25820, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -18951,26731,-18951,26731,-18951,26731,-18951,26731, - -18324,27165,-18324,27165,-18324,27165,-18324,27165, - -17687,27584,-17687,27584,-17687,27584,-17687,27584, - -17040,27988,-17040,27988,-17040,27988,-17040,27988 - }; + +static int16_t twa540[179*2*4]; +static int16_t twb540[179*2*4]; void dft540(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 3 { @@ -10987,416 +7878,8 @@ void dft540(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 3 }; -/* -Twiddles generated with - -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:191)/576)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:191)/576)); -twa2 = zeros(1,2*191); -twb2 = zeros(1,2*191); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa576[191*2*4] = {"); -for i=1:2:(2*190) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb576[191*2*4] = {"); -for i=1:2:(2*190) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa576[191*2*4] = {32765,-358,32765,-358,32765,-358,32765,-358, - 32759,-715,32759,-715,32759,-715,32759,-715, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32718,-1787,32718,-1787,32718,-1787,32718,-1787, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32671,-2500,32671,-2500,32671,-2500,32671,-2500, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32572,-3568,32572,-3568,32572,-3568,32572,-3568, - 32531,-3923,32531,-3923,32531,-3923,32531,-3923, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32438,-4632,32438,-4632,32438,-4632,32438,-4632, - 32385,-4985,32385,-4985,32385,-4985,32385,-4985, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32205,-6042,32205,-6042,32205,-6042,32205,-6042, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32065,-6743,32065,-6743,32065,-6743,32065,-6743, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31827,-7789,31827,-7789,31827,-7789,31827,-7789, - 31741,-8135,31741,-8135,31741,-8135,31741,-8135, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31556,-8826,31556,-8826,31556,-8826,31556,-8826, - 31457,-9170,31457,-9170,31457,-9170,31457,-9170, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31141,-10194,31141,-10194,31141,-10194,31141,-10194, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30911,-10871,30911,-10871,30911,-10871,30911,-10871, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30539,-11877,30539,-11877,30539,-11877,30539,-11877, - 30407,-12209,30407,-12209,30407,-12209,30407,-12209, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30134,-12869,30134,-12869,30134,-12869,30134,-12869, - 29992,-13197,29992,-13197,29992,-13197,29992,-13197, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29544,-14172,29544,-14172,29544,-14172,29544,-14172, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29227,-14813,29227,-14813,29227,-14813,29227,-14813, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28727,-15761,28727,-15761,28727,-15761,28727,-15761, - 28554,-16073,28554,-16073,28554,-16073,28554,-16073, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28196,-16693,28196,-16693,28196,-16693,28196,-16693, - 28012,-16999,28012,-16999,28012,-16999,28012,-16999, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27441,-17907,27441,-17907,27441,-17907,27441,-17907, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27044,-18501,27044,-18501,27044,-18501,27044,-18501, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26424,-19376,26424,-19376,26424,-19376,26424,-19376, - 26211,-19663,26211,-19663,26211,-19663,26211,-19663, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25776,-20230,25776,-20230,25776,-20230,25776,-20230, - 25554,-20510,25554,-20510,25554,-20510,25554,-20510, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24869,-21335,24869,-21335,24869,-21335,24869,-21335, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24398,-21873,24398,-21873,24398,-21873,24398,-21873, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23669,-22659,23669,-22659,23669,-22659,23669,-22659, - 23421,-22916,23421,-22916,23421,-22916,23421,-22916, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22915,-23422,22915,-23422,22915,-23422,22915,-23422, - 22658,-23670,22658,-23670,22658,-23670,22658,-23670, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21872,-24399,21872,-24399,21872,-24399,21872,-24399, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21334,-24870,21334,-24870,21334,-24870,21334,-24870, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20509,-25555,20509,-25555,20509,-25555,20509,-25555, - 20229,-25777,20229,-25777,20229,-25777,20229,-25777, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19662,-26212,19662,-26212,19662,-26212,19662,-26212, - 19375,-26425,19375,-26425,19375,-26425,19375,-26425, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18500,-27045,18500,-27045,18500,-27045,18500,-27045, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17906,-27442,17906,-27442,17906,-27442,17906,-27442, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 16998,-28013,16998,-28013,16998,-28013,16998,-28013, - 16692,-28197,16692,-28197,16692,-28197,16692,-28197, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16072,-28555,16072,-28555,16072,-28555,16072,-28555, - 15760,-28728,15760,-28728,15760,-28728,15760,-28728, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14812,-29228,14812,-29228,14812,-29228,14812,-29228, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14171,-29545,14171,-29545,14171,-29545,14171,-29545, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13196,-29993,13196,-29993,13196,-29993,13196,-29993, - 12868,-30135,12868,-30135,12868,-30135,12868,-30135, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12208,-30408,12208,-30408,12208,-30408,12208,-30408, - 11876,-30540,11876,-30540,11876,-30540,11876,-30540, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10870,-30912,10870,-30912,10870,-30912,10870,-30912, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10193,-31142,10193,-31142,10193,-31142,10193,-31142, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 9169,-31458,9169,-31458,9169,-31458,9169,-31458, - 8825,-31557,8825,-31557,8825,-31557,8825,-31557, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8134,-31742,8134,-31742,8134,-31742,8134,-31742, - 7788,-31828,7788,-31828,7788,-31828,7788,-31828, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6742,-32066,6742,-32066,6742,-32066,6742,-32066, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 6041,-32206,6041,-32206,6041,-32206,6041,-32206, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 4984,-32386,4984,-32386,4984,-32386,4984,-32386, - 4631,-32439,4631,-32439,4631,-32439,4631,-32439, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3922,-32532,3922,-32532,3922,-32532,3922,-32532, - 3567,-32573,3567,-32573,3567,-32573,3567,-32573, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2499,-32672,2499,-32672,2499,-32672,2499,-32672, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1786,-32719,1786,-32719,1786,-32719,1786,-32719, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 714,-32760,714,-32760,714,-32760,714,-32760, - 357,-32766,357,-32766,357,-32766,357,-32766, - 0,-32767,0,-32767,0,-32767,0,-32767, - -358,-32766,-358,-32766,-358,-32766,-358,-32766, - -715,-32760,-715,-32760,-715,-32760,-715,-32760, - -1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -1787,-32719,-1787,-32719,-1787,-32719,-1787,-32719, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2500,-32672,-2500,-32672,-2500,-32672,-2500,-32672, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, - -3923,-32532,-3923,-32532,-3923,-32532,-3923,-32532, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4632,-32439,-4632,-32439,-4632,-32439,-4632,-32439, - -4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, - -5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6042,-32206,-6042,-32206,-6042,-32206,-6042,-32206, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -6743,-32066,-6743,-32066,-6743,-32066,-6743,-32066, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, - -7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, - -8135,-31742,-8135,-31742,-8135,-31742,-8135,-31742, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8826,-31557,-8826,-31557,-8826,-31557,-8826,-31557, - -9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -10194,-31142,-10194,-31142,-10194,-31142,-10194,-31142, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -10871,-30912,-10871,-30912,-10871,-30912,-10871,-30912, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, - -11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, - -12209,-30408,-12209,-30408,-12209,-30408,-12209,-30408, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -12869,-30135,-12869,-30135,-12869,-30135,-12869,-30135, - -13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, - -13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14172,-29545,-14172,-29545,-14172,-29545,-14172,-29545, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -14813,-29228,-14813,-29228,-14813,-29228,-14813,-29228, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, - -16073,-28555,-16073,-28555,-16073,-28555,-16073,-28555 - }; -static int16_t twb576[191*2*4] = {32759,-715,32759,-715,32759,-715,32759,-715, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32572,-3568,32572,-3568,32572,-3568,32572,-3568, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32385,-4985,32385,-4985,32385,-4985,32385,-4985, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31827,-7789,31827,-7789,31827,-7789,31827,-7789, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31457,-9170,31457,-9170,31457,-9170,31457,-9170, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30539,-11877,30539,-11877,30539,-11877,30539,-11877, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29992,-13197,29992,-13197,29992,-13197,29992,-13197, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28727,-15761,28727,-15761,28727,-15761,28727,-15761, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28012,-16999,28012,-16999,28012,-16999,28012,-16999, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26424,-19376,26424,-19376,26424,-19376,26424,-19376, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25554,-20510,25554,-20510,25554,-20510,25554,-20510, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23669,-22659,23669,-22659,23669,-22659,23669,-22659, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22658,-23670,22658,-23670,22658,-23670,22658,-23670, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20509,-25555,20509,-25555,20509,-25555,20509,-25555, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19375,-26425,19375,-26425,19375,-26425,19375,-26425, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 16998,-28013,16998,-28013,16998,-28013,16998,-28013, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15760,-28728,15760,-28728,15760,-28728,15760,-28728, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13196,-29993,13196,-29993,13196,-29993,13196,-29993, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11876,-30540,11876,-30540,11876,-30540,11876,-30540, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9169,-31458,9169,-31458,9169,-31458,9169,-31458, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7788,-31828,7788,-31828,7788,-31828,7788,-31828, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 4984,-32386,4984,-32386,4984,-32386,4984,-32386, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3567,-32573,3567,-32573,3567,-32573,3567,-32573, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 714,-32760,714,-32760,714,-32760,714,-32760, - 0,-32767,0,-32767,0,-32767,0,-32767, - -715,-32760,-715,-32760,-715,-32760,-715,-32760, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16999,-28013,-16999,-28013,-16999,-28013,-16999,-28013, - -17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19376,-26425,-19376,-26425,-19376,-26425,-19376,-26425, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20510,-25555,-20510,-25555,-20510,-25555,-20510,-25555, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, - -22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, - -22659,-23670,-22659,-23670,-22659,-23670,-22659,-23670, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23670,-22659,-23670,-22659,-23670,-22659,-23670,-22659, - -24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, - -24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25555,-20510,-25555,-20510,-25555,-20510,-25555,-20510, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26425,-19376,-26425,-19376,-26425,-19376,-26425,-19376, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, - -28013,-16999,-28013,-16999,-28013,-16999,-28013,-16999, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28728,-15761,-28728,-15761,-28728,-15761,-28728,-15761, - -29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, - -29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -29993,-13197,-29993,-13197,-29993,-13197,-29993,-13197, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30540,-11877,-30540,-11877,-30540,-11877,-30540,-11877, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, - -31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, - -31458,-9170,-31458,-9170,-31458,-9170,-31458,-9170, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31828,-7789,-31828,-7789,-31828,-7789,-31828,-7789, - -31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32386,-4985,-32386,-4985,-32386,-4985,-32386,-4985, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32573,-3568,-32573,-3568,-32573,-3568,-32573,-3568, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, - -32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, - -32760,-715,-32760,-715,-32760,-715,-32760,-715, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32760,714,-32760,714,-32760,714,-32760,714, - -32736,1429,-32736,1429,-32736,1429,-32736,1429, - -32697,2143,-32697,2143,-32697,2143,-32697,2143, - -32643,2855,-32643,2855,-32643,2855,-32643,2855, - -32573,3567,-32573,3567,-32573,3567,-32573,3567, - -32487,4276,-32487,4276,-32487,4276,-32487,4276, - -32386,4984,-32386,4984,-32386,4984,-32386,4984, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -32138,6392,-32138,6392,-32138,6392,-32138,6392, - -31991,7092,-31991,7092,-31991,7092,-31991,7092, - -31828,7788,-31828,7788,-31828,7788,-31828,7788, - -31651,8480,-31651,8480,-31651,8480,-31651,8480, - -31458,9169,-31458,9169,-31458,9169,-31458,9169, - -31251,9853,-31251,9853,-31251,9853,-31251,9853, - -31029,10532,-31029,10532,-31029,10532,-31029,10532, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30540,11876,-30540,11876,-30540,11876,-30540,11876, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -29993,13196,-29993,13196,-29993,13196,-29993,13196, - -29697,13847,-29697,13847,-29697,13847,-29697,13847, - -29388,14492,-29388,14492,-29388,14492,-29388,14492, - -29065,15130,-29065,15130,-29065,15130,-29065,15130, - -28728,15760,-28728,15760,-28728,15760,-28728,15760, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -28013,16998,-28013,16998,-28013,16998,-28013,16998, - -27636,17605,-27636,17605,-27636,17605,-27636,17605, - -27245,18204,-27245,18204,-27245,18204,-27245,18204, - -26842,18794,-26842,18794,-26842,18794,-26842,18794, - -26425,19375,-26425,19375,-26425,19375,-26425,19375, - -25996,19947,-25996,19947,-25996,19947,-25996,19947, - -25555,20509,-25555,20509,-25555,20509,-25555,20509, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24636,21604,-24636,21604,-24636,21604,-24636,21604, - -24159,22137,-24159,22137,-24159,22137,-24159,22137, - -23670,22658,-23670,22658,-23670,22658,-23670,22658, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22659,23669,-22659,23669,-22659,23669,-22659,23669, - -22138,24158,-22138,24158,-22138,24158,-22138,24158, - -21605,24635,-21605,24635,-21605,24635,-21605,24635, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -20510,25554,-20510,25554,-20510,25554,-20510,25554, - -19948,25995,-19948,25995,-19948,25995,-19948,25995, - -19376,26424,-19376,26424,-19376,26424,-19376,26424, - -18795,26841,-18795,26841,-18795,26841,-18795,26841, - -18205,27244,-18205,27244,-18205,27244,-18205,27244, - -17606,27635,-17606,27635,-17606,27635,-17606,27635, - -16999,28012,-16999,28012,-16999,28012,-16999,28012 - }; +static int16_t twa576[191*2*4]; +static int16_t twb576[191*2*4]; void dft576(int16_t *x,int16_t *y,unsigned char scale_flag) // 192 x 3 { @@ -11446,320 +7929,8 @@ void dft576(int16_t *x,int16_t *y,unsigned char scale_flag) // 192 x 3 _m_empty(); }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:299)/600)); -twa2 = zeros(1,2*299); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa600[299*2*4] = {"); -for i=1:2:(2*298) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fclose(fd); - */ -static int16_t twa600[299*2*4] = {32765,-344,32765,-344,32765,-344,32765,-344, - 32759,-687,32759,-687,32759,-687,32759,-687, - 32750,-1030,32750,-1030,32750,-1030,32750,-1030, - 32738,-1373,32738,-1373,32738,-1373,32738,-1373, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32702,-2058,32702,-2058,32702,-2058,32702,-2058, - 32679,-2400,32679,-2400,32679,-2400,32679,-2400, - 32652,-2742,32652,-2742,32652,-2742,32652,-2742, - 32621,-3084,32621,-3084,32621,-3084,32621,-3084, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32549,-3767,32549,-3767,32549,-3767,32549,-3767, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32463,-4447,32463,-4447,32463,-4447,32463,-4447, - 32415,-4787,32415,-4787,32415,-4787,32415,-4787, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32308,-5465,32308,-5465,32308,-5465,32308,-5465, - 32249,-5803,32249,-5803,32249,-5803,32249,-5803, - 32186,-6140,32186,-6140,32186,-6140,32186,-6140, - 32120,-6477,32120,-6477,32120,-6477,32120,-6477, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31977,-7148,31977,-7148,31977,-7148,31977,-7148, - 31901,-7483,31901,-7483,31901,-7483,31901,-7483, - 31821,-7817,31821,-7817,31821,-7817,31821,-7817, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31559,-8812,31559,-8812,31559,-8812,31559,-8812, - 31465,-9142,31465,-9142,31465,-9142,31465,-9142, - 31368,-9471,31368,-9471,31368,-9471,31368,-9471, - 31267,-9799,31267,-9799,31267,-9799,31267,-9799, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31055,-10452,31055,-10452,31055,-10452,31055,-10452, - 30944,-10776,30944,-10776,30944,-10776,30944,-10776, - 30829,-11100,30829,-11100,30829,-11100,30829,-11100, - 30711,-11422,30711,-11422,30711,-11422,30711,-11422, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30338,-12381,30338,-12381,30338,-12381,30338,-12381, - 30206,-12698,30206,-12698,30206,-12698,30206,-12698, - 30072,-13014,30072,-13014,30072,-13014,30072,-13014, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29792,-13641,29792,-13641,29792,-13641,29792,-13641, - 29648,-13952,29648,-13952,29648,-13952,29648,-13952, - 29500,-14262,29500,-14262,29500,-14262,29500,-14262, - 29349,-14570,29349,-14570,29349,-14570,29349,-14570, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29038,-15181,29038,-15181,29038,-15181,29038,-15181, - 28877,-15485,28877,-15485,28877,-15485,28877,-15485, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28547,-16086,28547,-16086,28547,-16086,28547,-16086, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28203,-16680,28203,-16680,28203,-16680,28203,-16680, - 28027,-16975,28027,-16975,28027,-16975,28027,-16975, - 27848,-17267,27848,-17267,27848,-17267,27848,-17267, - 27666,-17558,27666,-17558,27666,-17558,27666,-17558, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27292,-18133,27292,-18133,27292,-18133,27292,-18133, - 27100,-18418,27100,-18418,27100,-18418,27100,-18418, - 26906,-18701,26906,-18701,26906,-18701,26906,-18701, - 26709,-18982,26709,-18982,26709,-18982,26709,-18982, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26305,-19537,26305,-19537,26305,-19537,26305,-19537, - 26099,-19811,26099,-19811,26099,-19811,26099,-19811, - 25891,-20084,25891,-20084,25891,-20084,25891,-20084, - 25679,-20354,25679,-20354,25679,-20354,25679,-20354, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25247,-20887,25247,-20887,25247,-20887,25247,-20887, - 25027,-21150,25027,-21150,25027,-21150,25027,-21150, - 24804,-21411,24804,-21411,24804,-21411,24804,-21411, - 24578,-21670,24578,-21670,24578,-21670,24578,-21670, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24119,-22180,24119,-22180,24119,-22180,24119,-22180, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23649,-22680,23649,-22680,23649,-22680,23649,-22680, - 23411,-22926,23411,-22926,23411,-22926,23411,-22926, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22925,-23412,22925,-23412,22925,-23412,22925,-23412, - 22679,-23650,22679,-23650,22679,-23650,22679,-23650, - 22430,-23887,22430,-23887,22430,-23887,22430,-23887, - 22179,-24120,22179,-24120,22179,-24120,22179,-24120, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21669,-24579,21669,-24579,21669,-24579,21669,-24579, - 21410,-24805,21410,-24805,21410,-24805,21410,-24805, - 21149,-25028,21149,-25028,21149,-25028,21149,-25028, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20353,-25680,20353,-25680,20353,-25680,20353,-25680, - 20083,-25892,20083,-25892,20083,-25892,20083,-25892, - 19810,-26100,19810,-26100,19810,-26100,19810,-26100, - 19536,-26306,19536,-26306,19536,-26306,19536,-26306, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18981,-26710,18981,-26710,18981,-26710,18981,-26710, - 18700,-26907,18700,-26907,18700,-26907,18700,-26907, - 18417,-27101,18417,-27101,18417,-27101,18417,-27101, - 18132,-27293,18132,-27293,18132,-27293,18132,-27293, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17266,-27849,17266,-27849,17266,-27849,17266,-27849, - 16974,-28028,16974,-28028,16974,-28028,16974,-28028, - 16679,-28204,16679,-28204,16679,-28204,16679,-28204, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16085,-28548,16085,-28548,16085,-28548,16085,-28548, - 15785,-28714,15785,-28714,15785,-28714,15785,-28714, - 15484,-28878,15484,-28878,15484,-28878,15484,-28878, - 15180,-29039,15180,-29039,15180,-29039,15180,-29039, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14569,-29350,14569,-29350,14569,-29350,14569,-29350, - 14261,-29501,14261,-29501,14261,-29501,14261,-29501, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13640,-29793,13640,-29793,13640,-29793,13640,-29793, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13013,-30073,13013,-30073,13013,-30073,13013,-30073, - 12697,-30207,12697,-30207,12697,-30207,12697,-30207, - 12380,-30339,12380,-30339,12380,-30339,12380,-30339, - 12062,-30466,12062,-30466,12062,-30466,12062,-30466, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11421,-30712,11421,-30712,11421,-30712,11421,-30712, - 11099,-30830,11099,-30830,11099,-30830,11099,-30830, - 10775,-30945,10775,-30945,10775,-30945,10775,-30945, - 10451,-31056,10451,-31056,10451,-31056,10451,-31056, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9798,-31268,9798,-31268,9798,-31268,9798,-31268, - 9470,-31369,9470,-31369,9470,-31369,9470,-31369, - 9141,-31466,9141,-31466,9141,-31466,9141,-31466, - 8811,-31560,8811,-31560,8811,-31560,8811,-31560, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8148,-31738,8148,-31738,8148,-31738,8148,-31738, - 7816,-31822,7816,-31822,7816,-31822,7816,-31822, - 7482,-31902,7482,-31902,7482,-31902,7482,-31902, - 7147,-31978,7147,-31978,7147,-31978,7147,-31978, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6476,-32121,6476,-32121,6476,-32121,6476,-32121, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5802,-32250,5802,-32250,5802,-32250,5802,-32250, - 5464,-32309,5464,-32309,5464,-32309,5464,-32309, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4786,-32416,4786,-32416,4786,-32416,4786,-32416, - 4446,-32464,4446,-32464,4446,-32464,4446,-32464, - 4106,-32509,4106,-32509,4106,-32509,4106,-32509, - 3766,-32550,3766,-32550,3766,-32550,3766,-32550, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3083,-32622,3083,-32622,3083,-32622,3083,-32622, - 2741,-32653,2741,-32653,2741,-32653,2741,-32653, - 2399,-32680,2399,-32680,2399,-32680,2399,-32680, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1372,-32739,1372,-32739,1372,-32739,1372,-32739, - 1029,-32751,1029,-32751,1029,-32751,1029,-32751, - 686,-32760,686,-32760,686,-32760,686,-32760, - 343,-32766,343,-32766,343,-32766,343,-32766, - 0,-32767,0,-32767,0,-32767,0,-32767, - -344,-32766,-344,-32766,-344,-32766,-344,-32766, - -687,-32760,-687,-32760,-687,-32760,-687,-32760, - -1030,-32751,-1030,-32751,-1030,-32751,-1030,-32751, - -1373,-32739,-1373,-32739,-1373,-32739,-1373,-32739, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, - -2400,-32680,-2400,-32680,-2400,-32680,-2400,-32680, - -2742,-32653,-2742,-32653,-2742,-32653,-2742,-32653, - -3084,-32622,-3084,-32622,-3084,-32622,-3084,-32622, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3767,-32550,-3767,-32550,-3767,-32550,-3767,-32550, - -4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, - -4447,-32464,-4447,-32464,-4447,-32464,-4447,-32464, - -4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5465,-32309,-5465,-32309,-5465,-32309,-5465,-32309, - -5803,-32250,-5803,-32250,-5803,-32250,-5803,-32250, - -6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, - -6477,-32121,-6477,-32121,-6477,-32121,-6477,-32121, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7148,-31978,-7148,-31978,-7148,-31978,-7148,-31978, - -7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, - -7817,-31822,-7817,-31822,-7817,-31822,-7817,-31822, - -8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, - -9142,-31466,-9142,-31466,-9142,-31466,-9142,-31466, - -9471,-31369,-9471,-31369,-9471,-31369,-9471,-31369, - -9799,-31268,-9799,-31268,-9799,-31268,-9799,-31268, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10452,-31056,-10452,-31056,-10452,-31056,-10452,-31056, - -10776,-30945,-10776,-30945,-10776,-30945,-10776,-30945, - -11100,-30830,-11100,-30830,-11100,-30830,-11100,-30830, - -11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, - -12381,-30339,-12381,-30339,-12381,-30339,-12381,-30339, - -12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, - -13014,-30073,-13014,-30073,-13014,-30073,-13014,-30073, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13641,-29793,-13641,-29793,-13641,-29793,-13641,-29793, - -13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, - -14262,-29501,-14262,-29501,-14262,-29501,-14262,-29501, - -14570,-29350,-14570,-29350,-14570,-29350,-14570,-29350, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, - -15485,-28878,-15485,-28878,-15485,-28878,-15485,-28878, - -15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, - -16086,-28548,-16086,-28548,-16086,-28548,-16086,-28548, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16680,-28204,-16680,-28204,-16680,-28204,-16680,-28204, - -16975,-28028,-16975,-28028,-16975,-28028,-16975,-28028, - -17267,-27849,-17267,-27849,-17267,-27849,-17267,-27849, - -17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18133,-27293,-18133,-27293,-18133,-27293,-18133,-27293, - -18418,-27101,-18418,-27101,-18418,-27101,-18418,-27101, - -18701,-26907,-18701,-26907,-18701,-26907,-18701,-26907, - -18982,-26710,-18982,-26710,-18982,-26710,-18982,-26710, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19537,-26306,-19537,-26306,-19537,-26306,-19537,-26306, - -19811,-26100,-19811,-26100,-19811,-26100,-19811,-26100, - -20084,-25892,-20084,-25892,-20084,-25892,-20084,-25892, - -20354,-25680,-20354,-25680,-20354,-25680,-20354,-25680, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, - -21150,-25028,-21150,-25028,-21150,-25028,-21150,-25028, - -21411,-24805,-21411,-24805,-21411,-24805,-21411,-24805, - -21670,-24579,-21670,-24579,-21670,-24579,-21670,-24579, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22180,-24120,-22180,-24120,-22180,-24120,-22180,-24120, - -22431,-23887,-22431,-23887,-22431,-23887,-22431,-23887, - -22680,-23650,-22680,-23650,-22680,-23650,-22680,-23650, - -22926,-23412,-22926,-23412,-22926,-23412,-22926,-23412, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23412,-22926,-23412,-22926,-23412,-22926,-23412,-22926, - -23650,-22680,-23650,-22680,-23650,-22680,-23650,-22680, - -23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, - -24120,-22180,-24120,-22180,-24120,-22180,-24120,-22180, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24579,-21670,-24579,-21670,-24579,-21670,-24579,-21670, - -24805,-21411,-24805,-21411,-24805,-21411,-24805,-21411, - -25028,-21150,-25028,-21150,-25028,-21150,-25028,-21150, - -25248,-20887,-25248,-20887,-25248,-20887,-25248,-20887, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25680,-20354,-25680,-20354,-25680,-20354,-25680,-20354, - -25892,-20084,-25892,-20084,-25892,-20084,-25892,-20084, - -26100,-19811,-26100,-19811,-26100,-19811,-26100,-19811, - -26306,-19537,-26306,-19537,-26306,-19537,-26306,-19537, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26710,-18982,-26710,-18982,-26710,-18982,-26710,-18982, - -26907,-18701,-26907,-18701,-26907,-18701,-26907,-18701, - -27101,-18418,-27101,-18418,-27101,-18418,-27101,-18418, - -27293,-18133,-27293,-18133,-27293,-18133,-27293,-18133, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27667,-17558,-27667,-17558,-27667,-17558,-27667,-17558, - -27849,-17267,-27849,-17267,-27849,-17267,-27849,-17267, - -28028,-16975,-28028,-16975,-28028,-16975,-28028,-16975, - -28204,-16680,-28204,-16680,-28204,-16680,-28204,-16680, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28548,-16086,-28548,-16086,-28548,-16086,-28548,-16086, - -28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, - -28878,-15485,-28878,-15485,-28878,-15485,-28878,-15485, - -29039,-15181,-29039,-15181,-29039,-15181,-29039,-15181, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29350,-14570,-29350,-14570,-29350,-14570,-29350,-14570, - -29501,-14262,-29501,-14262,-29501,-14262,-29501,-14262, - -29649,-13952,-29649,-13952,-29649,-13952,-29649,-13952, - -29793,-13641,-29793,-13641,-29793,-13641,-29793,-13641, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30073,-13014,-30073,-13014,-30073,-13014,-30073,-13014, - -30207,-12698,-30207,-12698,-30207,-12698,-30207,-12698, - -30339,-12381,-30339,-12381,-30339,-12381,-30339,-12381, - -30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30712,-11422,-30712,-11422,-30712,-11422,-30712,-11422, - -30830,-11100,-30830,-11100,-30830,-11100,-30830,-11100, - -30945,-10776,-30945,-10776,-30945,-10776,-30945,-10776, - -31056,-10452,-31056,-10452,-31056,-10452,-31056,-10452, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31268,-9799,-31268,-9799,-31268,-9799,-31268,-9799, - -31369,-9471,-31369,-9471,-31369,-9471,-31369,-9471, - -31466,-9142,-31466,-9142,-31466,-9142,-31466,-9142, - -31560,-8812,-31560,-8812,-31560,-8812,-31560,-8812, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, - -31822,-7817,-31822,-7817,-31822,-7817,-31822,-7817, - -31902,-7483,-31902,-7483,-31902,-7483,-31902,-7483, - -31978,-7148,-31978,-7148,-31978,-7148,-31978,-7148, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32121,-6477,-32121,-6477,-32121,-6477,-32121,-6477, - -32187,-6140,-32187,-6140,-32187,-6140,-32187,-6140, - -32250,-5803,-32250,-5803,-32250,-5803,-32250,-5803, - -32309,-5465,-32309,-5465,-32309,-5465,-32309,-5465, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32416,-4787,-32416,-4787,-32416,-4787,-32416,-4787, - -32464,-4447,-32464,-4447,-32464,-4447,-32464,-4447, - -32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, - -32550,-3767,-32550,-3767,-32550,-3767,-32550,-3767, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32622,-3084,-32622,-3084,-32622,-3084,-32622,-3084, - -32653,-2742,-32653,-2742,-32653,-2742,-32653,-2742, - -32680,-2400,-32680,-2400,-32680,-2400,-32680,-2400, - -32703,-2058,-32703,-2058,-32703,-2058,-32703,-2058, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32739,-1373,-32739,-1373,-32739,-1373,-32739,-1373, - -32751,-1030,-32751,-1030,-32751,-1030,-32751,-1030, - -32760,-687,-32760,-687,-32760,-687,-32760,-687, - -32766,-344,-32766,-344,-32766,-344,-32766,-344 - }; + +static int16_t twa600[299*2*4]; void dft600(int16_t *x,int16_t *y,unsigned char scale_flag) // 300 x 2 { @@ -11803,464 +7974,8 @@ void dft600(int16_t *x,int16_t *y,unsigned char scale_flag) // 300 x 2 }; -/* -Twiddles generated with - -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:215)/648)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:215)/648)); -twa2 = zeros(1,2*215); -twb2 = zeros(1,2*215); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa648[215*2*4] = {"); -for i=1:2:(2*214) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb648[215*2*4] = {"); -for i=1:2:(2*214) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa648[215*2*4] = {32765,-318,32765,-318,32765,-318,32765,-318, - 32760,-636,32760,-636,32760,-636,32760,-636, - 32753,-954,32753,-954,32753,-954,32753,-954, - 32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32728,-1588,32728,-1588,32728,-1588,32728,-1588, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32691,-2223,32691,-2223,32691,-2223,32691,-2223, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32613,-3173,32613,-3173,32613,-3173,32613,-3173, - 32580,-3489,32580,-3489,32580,-3489,32580,-3489, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32507,-4120,32507,-4120,32507,-4120,32507,-4120, - 32465,-4435,32465,-4435,32465,-4435,32465,-4435, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32322,-5377,32322,-5377,32322,-5377,32322,-5377, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32212,-6003,32212,-6003,32212,-6003,32212,-6003, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 32024,-6937,32024,-6937,32024,-6937,32024,-6937, - 31955,-7248,31955,-7248,31955,-7248,31955,-7248, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31808,-7866,31808,-7866,31808,-7866,31808,-7866, - 31731,-8174,31731,-8174,31731,-8174,31731,-8174, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31480,-9093,31480,-9093,31480,-9093,31480,-9093, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31297,-9702,31297,-9702,31297,-9702,31297,-9702, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 31002,-10608,31002,-10608,31002,-10608,31002,-10608, - 30898,-10908,30898,-10908,30898,-10908,30898,-10908, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30680,-11505,30680,-11505,30680,-11505,30680,-11505, - 30567,-11802,30567,-11802,30567,-11802,30567,-11802, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 30211,-12687,30211,-12687,30211,-12687,30211,-12687, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29959,-13270,29959,-13270,29959,-13270,29959,-13270, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29561,-14136,29561,-14136,29561,-14136,29561,-14136, - 29422,-14422,29422,-14422,29422,-14422,29422,-14422, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29137,-14990,29137,-14990,29137,-14990,29137,-14990, - 28990,-15271,28990,-15271,28990,-15271,28990,-15271, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28534,-16108,28534,-16108,28534,-16108,28534,-16108, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28216,-16658,28216,-16658,28216,-16658,28216,-16658, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27720,-17472,27720,-17472,27720,-17472,27720,-17472, - 27549,-17740,27549,-17740,27549,-17740,27549,-17740, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27200,-18271,27200,-18271,27200,-18271,27200,-18271, - 27022,-18534,27022,-18534,27022,-18534,27022,-18534, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 26471,-19312,26471,-19312,26471,-19312,26471,-19312, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26092,-19822,26092,-19822,26092,-19822,26092,-19822, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25504,-20572,25504,-20572,25504,-20572,25504,-20572, - 25304,-20818,25304,-20818,25304,-20818,25304,-20818, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24895,-21305,24895,-21305,24895,-21305,24895,-21305, - 24687,-21546,24687,-21546,24687,-21546,24687,-21546, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 24050,-22254,24050,-22254,24050,-22254,24050,-22254, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23614,-22717,23614,-22717,23614,-22717,23614,-22717, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22944,-23394,22944,-23394,22944,-23394,22944,-23394, - 22716,-23615,22716,-23615,22716,-23615,22716,-23615, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22253,-24051,22253,-24051,22253,-24051,22253,-24051, - 22019,-24266,22019,-24266,22019,-24266,22019,-24266, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 21304,-24896,21304,-24896,21304,-24896,21304,-24896, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20817,-25305,20817,-25305,20817,-25305,20817,-25305, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 20073,-25899,20073,-25899,20073,-25899,20073,-25899, - 19821,-26093,19821,-26093,19821,-26093,19821,-26093, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19311,-26472,19311,-26472,19311,-26472,19311,-26472, - 19053,-26658,19053,-26658,19053,-26658,19053,-26658, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 18270,-27201,18270,-27201,18270,-27201,18270,-27201, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17739,-27550,17739,-27550,17739,-27550,17739,-27550, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 16930,-28055,16930,-28055,16930,-28055,16930,-28055, - 16657,-28217,16657,-28217,16657,-28217,16657,-28217, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16107,-28535,16107,-28535,16107,-28535,16107,-28535, - 15830,-28690,15830,-28690,15830,-28690,15830,-28690, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 14989,-29138,14989,-29138,14989,-29138,14989,-29138, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14421,-29423,14421,-29423,14421,-29423,14421,-29423, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13559,-29830,13559,-29830,13559,-29830,13559,-29830, - 13269,-29960,13269,-29960,13269,-29960,13269,-29960, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12686,-30212,12686,-30212,12686,-30212,12686,-30212, - 12392,-30334,12392,-30334,12392,-30334,12392,-30334, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 11504,-30681,11504,-30681,11504,-30681,11504,-30681, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10907,-30899,10907,-30899,10907,-30899,10907,-30899, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 10004,-31203,10004,-31203,10004,-31203,10004,-31203, - 9701,-31298,9701,-31298,9701,-31298,9701,-31298, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9092,-31481,9092,-31481,9092,-31481,9092,-31481, - 8787,-31567,8787,-31567,8787,-31567,8787,-31567, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 7865,-31809,7865,-31809,7865,-31809,7865,-31809, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7247,-31956,7247,-31956,7247,-31956,7247,-31956, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 6314,-32153,6314,-32153,6314,-32153,6314,-32153, - 6002,-32213,6002,-32213,6002,-32213,6002,-32213, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5376,-32323,5376,-32323,5376,-32323,5376,-32323, - 5063,-32374,5063,-32374,5063,-32374,5063,-32374, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 4119,-32508,4119,-32508,4119,-32508,4119,-32508, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3488,-32581,3488,-32581,3488,-32581,3488,-32581, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2539,-32669,2539,-32669,2539,-32669,2539,-32669, - 2222,-32692,2222,-32692,2222,-32692,2222,-32692, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1587,-32729,1587,-32729,1587,-32729,1587,-32729, - 1270,-32743,1270,-32743,1270,-32743,1270,-32743, - 953,-32754,953,-32754,953,-32754,953,-32754, - 635,-32761,635,-32761,635,-32761,635,-32761, - 317,-32766,317,-32766,317,-32766,317,-32766, - 0,-32767,0,-32767,0,-32767,0,-32767, - -318,-32766,-318,-32766,-318,-32766,-318,-32766, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -954,-32754,-954,-32754,-954,-32754,-954,-32754, - -1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, - -1588,-32729,-1588,-32729,-1588,-32729,-1588,-32729, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2223,-32692,-2223,-32692,-2223,-32692,-2223,-32692, - -2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -3489,-32581,-3489,-32581,-3489,-32581,-3489,-32581, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4120,-32508,-4120,-32508,-4120,-32508,-4120,-32508, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, - -5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, - -5377,-32323,-5377,-32323,-5377,-32323,-5377,-32323, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6003,-32213,-6003,-32213,-6003,-32213,-6003,-32213, - -6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, - -6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -7248,-31956,-7248,-31956,-7248,-31956,-7248,-31956, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7866,-31809,-7866,-31809,-7866,-31809,-7866,-31809, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, - -9093,-31481,-9093,-31481,-9093,-31481,-9093,-31481, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9702,-31298,-9702,-31298,-9702,-31298,-9702,-31298, - -10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, - -10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -10908,-30899,-10908,-30899,-10908,-30899,-10908,-30899, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11505,-30681,-11505,-30681,-11505,-30681,-11505,-30681, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, - -12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, - -12687,-30212,-12687,-30212,-12687,-30212,-12687,-30212, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13270,-29960,-13270,-29960,-13270,-29960,-13270,-29960, - -13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -14422,-29423,-14422,-29423,-14422,-29423,-14422,-29423, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -14990,-29138,-14990,-29138,-14990,-29138,-14990,-29138, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, - -15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, - -16108,-28535,-16108,-28535,-16108,-28535,-16108,-28535 - }; -static int16_t twb648[215*2*4] = {32760,-636,32760,-636,32760,-636,32760,-636, - 32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32613,-3173,32613,-3173,32613,-3173,32613,-3173, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32465,-4435,32465,-4435,32465,-4435,32465,-4435, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 32024,-6937,32024,-6937,32024,-6937,32024,-6937, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31731,-8174,31731,-8174,31731,-8174,31731,-8174, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 31002,-10608,31002,-10608,31002,-10608,31002,-10608, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30567,-11802,30567,-11802,30567,-11802,30567,-11802, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29561,-14136,29561,-14136,29561,-14136,29561,-14136, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 28990,-15271,28990,-15271,28990,-15271,28990,-15271, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27720,-17472,27720,-17472,27720,-17472,27720,-17472, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27022,-18534,27022,-18534,27022,-18534,27022,-18534, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25504,-20572,25504,-20572,25504,-20572,25504,-20572, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24687,-21546,24687,-21546,24687,-21546,24687,-21546, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 22944,-23394,22944,-23394,22944,-23394,22944,-23394, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22019,-24266,22019,-24266,22019,-24266,22019,-24266, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 20073,-25899,20073,-25899,20073,-25899,20073,-25899, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19053,-26658,19053,-26658,19053,-26658,19053,-26658, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 16930,-28055,16930,-28055,16930,-28055,16930,-28055, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15830,-28690,15830,-28690,15830,-28690,15830,-28690, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 13559,-29830,13559,-29830,13559,-29830,13559,-29830, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12392,-30334,12392,-30334,12392,-30334,12392,-30334, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 10004,-31203,10004,-31203,10004,-31203,10004,-31203, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8787,-31567,8787,-31567,8787,-31567,8787,-31567, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 6314,-32153,6314,-32153,6314,-32153,6314,-32153, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5063,-32374,5063,-32374,5063,-32374,5063,-32374, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 2539,-32669,2539,-32669,2539,-32669,2539,-32669, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1270,-32743,1270,-32743,1270,-32743,1270,-32743, - 635,-32761,635,-32761,635,-32761,635,-32761, - 0,-32767,0,-32767,0,-32767,0,-32767, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16931,-28055,-16931,-28055,-16931,-28055,-16931,-28055, - -17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, - -18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, - -18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, - -19054,-26658,-19054,-26658,-19054,-26658,-19054,-26658, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -20074,-25899,-20074,-25899,-20074,-25899,-20074,-25899, - -20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, - -22020,-24266,-22020,-24266,-22020,-24266,-22020,-24266, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -22945,-23394,-22945,-23394,-22945,-23394,-22945,-23394, - -23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, - -23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, - -24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, - -24688,-21546,-24688,-21546,-24688,-21546,-24688,-21546, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25505,-20572,-25505,-20572,-25505,-20572,-25505,-20572, - -25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, - -26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, - -26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, - -27023,-18534,-27023,-18534,-27023,-18534,-27023,-18534, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27721,-17472,-27721,-17472,-27721,-17472,-27721,-17472, - -28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, - -28991,-15271,-28991,-15271,-28991,-15271,-28991,-15271, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29562,-14136,-29562,-14136,-29562,-14136,-29562,-14136, - -29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, - -30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, - -30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, - -30568,-11802,-30568,-11802,-30568,-11802,-30568,-11802, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -31003,-10608,-31003,-10608,-31003,-10608,-31003,-10608, - -31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, - -31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, - -31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, - -31732,-8174,-31732,-8174,-31732,-8174,-31732,-8174, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -32025,-6937,-32025,-6937,-32025,-6937,-32025,-6937, - -32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, - -32466,-4435,-32466,-4435,-32466,-4435,-32466,-4435, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32614,-3173,-32614,-3173,-32614,-3173,-32614,-3173, - -32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, - -32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, - -32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, - -32761,-636,-32761,-636,-32761,-636,-32761,-636, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32761,635,-32761,635,-32761,635,-32761,635, - -32743,1270,-32743,1270,-32743,1270,-32743,1270, - -32712,1905,-32712,1905,-32712,1905,-32712,1905, - -32669,2539,-32669,2539,-32669,2539,-32669,2539, - -32614,3172,-32614,3172,-32614,3172,-32614,3172, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32466,4434,-32466,4434,-32466,4434,-32466,4434, - -32374,5063,-32374,5063,-32374,5063,-32374,5063, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -32153,6314,-32153,6314,-32153,6314,-32153,6314, - -32025,6936,-32025,6936,-32025,6936,-32025,6936, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31732,8173,-31732,8173,-31732,8173,-31732,8173, - -31567,8787,-31567,8787,-31567,8787,-31567,8787, - -31391,9397,-31391,9397,-31391,9397,-31391,9397, - -31203,10004,-31203,10004,-31203,10004,-31203,10004, - -31003,10607,-31003,10607,-31003,10607,-31003,10607, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30568,11801,-30568,11801,-30568,11801,-30568,11801, - -30334,12392,-30334,12392,-30334,12392,-30334,12392, - -30088,12978,-30088,12978,-30088,12978,-30088,12978, - -29830,13559,-29830,13559,-29830,13559,-29830,13559, - -29562,14135,-29562,14135,-29562,14135,-29562,14135, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -28991,15270,-28991,15270,-28991,15270,-28991,15270, - -28690,15830,-28690,15830,-28690,15830,-28690,15830, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -28055,16930,-28055,16930,-28055,16930,-28055,16930, - -27721,17471,-27721,17471,-27721,17471,-27721,17471, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -27023,18533,-27023,18533,-27023,18533,-27023,18533, - -26658,19053,-26658,19053,-26658,19053,-26658,19053, - -26284,19567,-26284,19567,-26284,19567,-26284,19567, - -25899,20073,-25899,20073,-25899,20073,-25899,20073, - -25505,20571,-25505,20571,-25505,20571,-25505,20571, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24688,21545,-24688,21545,-24688,21545,-24688,21545, - -24266,22019,-24266,22019,-24266,22019,-24266,22019, - -23834,22486,-23834,22486,-23834,22486,-23834,22486, - -23394,22944,-23394,22944,-23394,22944,-23394,22944, - -22945,23393,-22945,23393,-22945,23393,-22945,23393, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -22020,24265,-22020,24265,-22020,24265,-22020,24265, - -21546,24687,-21546,24687,-21546,24687,-21546,24687, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -20572,25504,-20572,25504,-20572,25504,-20572,25504, - -20074,25898,-20074,25898,-20074,25898,-20074,25898, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -19054,26657,-19054,26657,-19054,26657,-19054,26657, - -18534,27022,-18534,27022,-18534,27022,-18534,27022, - -18006,27376,-18006,27376,-18006,27376,-18006,27376, - -17472,27720,-17472,27720,-17472,27720,-17472,27720, - -16931,28054,-16931,28054,-16931,28054,-16931,28054 - }; +static int16_t twa648[215*2*4]; +static int16_t twb648[215*2*4]; void dft648(int16_t *x,int16_t *y,unsigned char scale_flag) // 216 x 3 { @@ -12311,583 +8026,10 @@ void dft648(int16_t *x,int16_t *y,unsigned char scale_flag) // 216 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:179)/720)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:179)/720)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:179)/720)); -twa2 = zeros(1,2*179); -twb2 = zeros(1,2*179); -twc2 = zeros(1,2*179); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa720[179*2*4] = {"); -for i=1:2:(2*178) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"\nstatic int16_t twb720[179*2*4] = {"); -for i=1:2:(2*178) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"\nstatic int16_t twc720[179*2*4] = {"); -for i=1:2:(2*178) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); - */ +static int16_t twa720[179*2*4]; +static int16_t twb720[179*2*4]; +static int16_t twc720[179*2*4]; -static int16_t twa720[179*2*4] = {32765,-286,32765,-286,32765,-286,32765,-286, - 32762,-572,32762,-572,32762,-572,32762,-572, - 32755,-858,32755,-858,32755,-858,32755,-858, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32705,-2001,32705,-2001,32705,-2001,32705,-2001, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32616,-3141,32616,-3141,32616,-3141,32616,-3141, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32556,-3710,32556,-3710,32556,-3710,32556,-3710, - 32522,-3994,32522,-3994,32522,-3994,32522,-3994, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32407,-4844,32407,-4844,32407,-4844,32407,-4844, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32317,-5409,32317,-5409,32317,-5409,32317,-5409, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32164,-6253,32164,-6253,32164,-6253,32164,-6253, - 32109,-6533,32109,-6533,32109,-6533,32109,-6533, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31927,-7371,31927,-7371,31927,-7371,31927,-7371, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31723,-8205,31723,-8205,31723,-8205,31723,-8205, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31575,-8757,31575,-8757,31575,-8757,31575,-8757, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31335,-9581,31335,-9581,31335,-9581,31335,-9581, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31073,-10398,31073,-10398,31073,-10398,31073,-10398, - 30981,-10668,30981,-10668,30981,-10668,30981,-10668, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30691,-11476,30691,-11476,30691,-11476,30691,-11476, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30486,-12010,30486,-12010,30486,-12010,30486,-12010, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30162,-12804,30162,-12804,30162,-12804,30162,-12804, - 30049,-13066,30049,-13066,30049,-13066,30049,-13066, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29816,-13589,29816,-13589,29816,-13589,29816,-13589, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29324,-14621,29324,-14621,29324,-14621,29324,-14621, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28658,-15886,28658,-15886,28658,-15886,28658,-15886, - 28518,-16136,28518,-16136,28518,-16136,28518,-16136, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28233,-16631,28233,-16631,28233,-16631,28233,-16631, - 28086,-16877,28086,-16877,28086,-16877,28086,-16877, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27323,-18086,27323,-18086,27323,-18086,27323,-18086, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26676,-19028,26676,-19028,26676,-19028,26676,-19028, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26339,-19491,26339,-19491,26339,-19491,26339,-19491, - 26168,-19720,26168,-19720,26168,-19720,26168,-19720, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25643,-20398,25643,-20398,25643,-20398,25643,-20398, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25283,-20843,25283,-20843,25283,-20843,25283,-20843, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24729,-21498,24729,-21498,24729,-21498,24729,-21498, - 24541,-21713,24541,-21713,24541,-21713,24541,-21713, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23964,-22348,23964,-22348,23964,-22348,23964,-22348, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23371,-22967,23371,-22967,23371,-22967,23371,-22967, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22966,-23372,22966,-23372,22966,-23372,22966,-23372, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 22347,-23965,22347,-23965,22347,-23965,22347,-23965, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21712,-24542,21712,-24542,21712,-24542,21712,-24542, - 21497,-24730,21497,-24730,21497,-24730,21497,-24730, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20842,-25284,20842,-25284,20842,-25284,20842,-25284, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20397,-25644,20397,-25644,20397,-25644,20397,-25644, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19719,-26169,19719,-26169,19719,-26169,19719,-26169, - 19490,-26340,19490,-26340,19490,-26340,19490,-26340, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 19027,-26677,19027,-26677,19027,-26677,19027,-26677, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 18085,-27324,18085,-27324,18085,-27324,18085,-27324, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16876,-28087,16876,-28087,16876,-28087,16876,-28087, - 16630,-28234,16630,-28234,16630,-28234,16630,-28234, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16135,-28519,16135,-28519,16135,-28519,16135,-28519, - 15885,-28659,15885,-28659,15885,-28659,15885,-28659, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14620,-29325,14620,-29325,14620,-29325,14620,-29325, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13588,-29817,13588,-29817,13588,-29817,13588,-29817, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13065,-30050,13065,-30050,13065,-30050,13065,-30050, - 12803,-30163,12803,-30163,12803,-30163,12803,-30163, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 12009,-30487,12009,-30487,12009,-30487,12009,-30487, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11475,-30692,11475,-30692,11475,-30692,11475,-30692, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10667,-30982,10667,-30982,10667,-30982,10667,-30982, - 10397,-31074,10397,-31074,10397,-31074,10397,-31074, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9580,-31336,9580,-31336,9580,-31336,9580,-31336, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8756,-31576,8756,-31576,8756,-31576,8756,-31576, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8204,-31724,8204,-31724,8204,-31724,8204,-31724, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7370,-31928,7370,-31928,7370,-31928,7370,-31928, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6532,-32110,6532,-32110,6532,-32110,6532,-32110, - 6252,-32165,6252,-32165,6252,-32165,6252,-32165, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5408,-32318,5408,-32318,5408,-32318,5408,-32318, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4843,-32408,4843,-32408,4843,-32408,4843,-32408, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3993,-32523,3993,-32523,3993,-32523,3993,-32523, - 3709,-32557,3709,-32557,3709,-32557,3709,-32557, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3140,-32617,3140,-32617,3140,-32617,3140,-32617, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 2000,-32706,2000,-32706,2000,-32706,2000,-32706, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 857,-32756,857,-32756,857,-32756,857,-32756, - 571,-32763,571,-32763,571,-32763,571,-32763, - 285,-32766,285,-32766,285,-32766,285,-32766 - }; - -static int16_t twb720[179*2*4] = {32762,-572,32762,-572,32762,-572,32762,-572, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32522,-3994,32522,-3994,32522,-3994,32522,-3994, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32164,-6253,32164,-6253,32164,-6253,32164,-6253, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31927,-7371,31927,-7371,31927,-7371,31927,-7371, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31335,-9581,31335,-9581,31335,-9581,31335,-9581, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30981,-10668,30981,-10668,30981,-10668,30981,-10668, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30162,-12804,30162,-12804,30162,-12804,30162,-12804, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28658,-15886,28658,-15886,28658,-15886,28658,-15886, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28086,-16877,28086,-16877,28086,-16877,28086,-16877, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26168,-19720,26168,-19720,26168,-19720,26168,-19720, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24729,-21498,24729,-21498,24729,-21498,24729,-21498, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 23964,-22348,23964,-22348,23964,-22348,23964,-22348, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22347,-23965,22347,-23965,22347,-23965,22347,-23965, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21497,-24730,21497,-24730,21497,-24730,21497,-24730, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19719,-26169,19719,-26169,19719,-26169,19719,-26169, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 16876,-28087,16876,-28087,16876,-28087,16876,-28087, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15885,-28659,15885,-28659,15885,-28659,15885,-28659, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12803,-30163,12803,-30163,12803,-30163,12803,-30163, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10667,-30982,10667,-30982,10667,-30982,10667,-30982, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9580,-31336,9580,-31336,9580,-31336,9580,-31336, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7370,-31928,7370,-31928,7370,-31928,7370,-31928, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6252,-32165,6252,-32165,6252,-32165,6252,-32165, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 3993,-32523,3993,-32523,3993,-32523,3993,-32523, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 571,-32763,571,-32763,571,-32763,571,-32763, - 0,-32767,0,-32767,0,-32767,0,-32767, - -572,-32763,-572,-32763,-572,-32763,-572,-32763, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16877,-28087,-16877,-28087,-16877,-28087,-16877,-28087, - -17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19720,-26169,-19720,-26169,-19720,-26169,-19720,-26169, - -20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21498,-24730,-21498,-24730,-21498,-24730,-21498,-24730, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22348,-23965,-22348,-23965,-22348,-23965,-22348,-23965, - -22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, - -23965,-22348,-23965,-22348,-23965,-22348,-23965,-22348, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24730,-21498,-24730,-21498,-24730,-21498,-24730,-21498, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, - -26169,-19720,-26169,-19720,-26169,-19720,-26169,-19720, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, - -28087,-16877,-28087,-16877,-28087,-16877,-28087,-16877, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28659,-15886,-28659,-15886,-28659,-15886,-28659,-15886, - -28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30163,-12804,-30163,-12804,-30163,-12804,-30163,-12804, - -30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30982,-10668,-30982,-10668,-30982,-10668,-30982,-10668, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31336,-9581,-31336,-9581,-31336,-9581,-31336,-9581, - -31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, - -31928,-7371,-31928,-7371,-31928,-7371,-31928,-7371, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32165,-6253,-32165,-6253,-32165,-6253,-32165,-6253, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, - -32523,-3994,-32523,-3994,-32523,-3994,-32523,-3994, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, - -32763,-572,-32763,-572,-32763,-572,-32763,-572 - }; - -static int16_t twc720[179*2*4] = {32755,-858,32755,-858,32755,-858,32755,-858, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 857,-32756,857,-32756,857,-32756,857,-32756, - 0,-32767,0,-32767,0,-32767,0,-32767, - -858,-32756,-858,-32756,-858,-32756,-858,-32756, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32756,-858,-32756,-858,-32756,-858,-32756,-858, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32756,857,-32756,857,-32756,857,-32756,857, - -32723,1714,-32723,1714,-32723,1714,-32723,1714, - -32666,2570,-32666,2570,-32666,2570,-32666,2570, - -32588,3425,-32588,3425,-32588,3425,-32588,3425, - -32487,4276,-32487,4276,-32487,4276,-32487,4276, - -32364,5125,-32364,5125,-32364,5125,-32364,5125, - -32219,5971,-32219,5971,-32219,5971,-32219,5971, - -32051,6812,-32051,6812,-32051,6812,-32051,6812, - -31862,7649,-31862,7649,-31862,7649,-31862,7649, - -31651,8480,-31651,8480,-31651,8480,-31651,8480, - -31418,9306,-31418,9306,-31418,9306,-31418,9306, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -30888,10937,-30888,10937,-30888,10937,-30888,10937, - -30591,11742,-30591,11742,-30591,11742,-30591,11742, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -29935,13327,-29935,13327,-29935,13327,-29935,13327, - -29576,14106,-29576,14106,-29576,14106,-29576,14106, - -29196,14875,-29196,14875,-29196,14875,-29196,14875, - -28797,15635,-28797,15635,-28797,15635,-28797,15635, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -27939,17120,-27939,17120,-27939,17120,-27939,17120, - -27481,17846,-27481,17846,-27481,17846,-27481,17846, - -27005,18559,-27005,18559,-27005,18559,-27005,18559, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -25996,19947,-25996,19947,-25996,19947,-25996,19947, - -25465,20620,-25465,20620,-25465,20620,-25465,20620, - -24917,21280,-24917,21280,-24917,21280,-24917,21280, - -24351,21925,-24351,21925,-24351,21925,-24351,21925, - -23769,22555,-23769,22555,-23769,22555,-23769,22555, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22556,23768,-22556,23768,-22556,23768,-22556,23768, - -21926,24350,-21926,24350,-21926,24350,-21926,24350, - -21281,24916,-21281,24916,-21281,24916,-21281,24916, - -20621,25464,-20621,25464,-20621,25464,-20621,25464, - -19948,25995,-19948,25995,-19948,25995,-19948,25995, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18560,27004,-18560,27004,-18560,27004,-18560,27004, - -17847,27480,-17847,27480,-17847,27480,-17847,27480, - -17121,27938,-17121,27938,-17121,27938,-17121,27938, - -16384,28377,-16384,28377,-16384,28377,-16384,28377, - -15636,28796,-15636,28796,-15636,28796,-15636,28796, - -14876,29195,-14876,29195,-14876,29195,-14876,29195, - -14107,29575,-14107,29575,-14107,29575,-14107,29575, - -13328,29934,-13328,29934,-13328,29934,-13328,29934, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -11743,30590,-11743,30590,-11743,30590,-11743,30590, - -10938,30887,-10938,30887,-10938,30887,-10938,30887, - -10126,31163,-10126,31163,-10126,31163,-10126,31163, - -9307,31417,-9307,31417,-9307,31417,-9307,31417, - -8481,31650,-8481,31650,-8481,31650,-8481,31650, - -7650,31861,-7650,31861,-7650,31861,-7650,31861, - -6813,32050,-6813,32050,-6813,32050,-6813,32050, - -5972,32218,-5972,32218,-5972,32218,-5972,32218, - -5126,32363,-5126,32363,-5126,32363,-5126,32363, - -4277,32486,-4277,32486,-4277,32486,-4277,32486, - -3426,32587,-3426,32587,-3426,32587,-3426,32587, - -2571,32665,-2571,32665,-2571,32665,-2571,32665, - -1715,32722,-1715,32722,-1715,32722,-1715,32722, - -858,32755,-858,32755,-858,32755,-858,32755 - }; void dft720(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 4 { @@ -12943,606 +8085,68 @@ void dft720(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 4 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:287)/864)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:287)/864)); -twa2 = zeros(1,2*287); -twb2 = zeros(1,2*287); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa864[287*2*4] = {"); -for i=1:2:(2*286) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb864[287*2*4] = {"); -for i=1:2:(2*286) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa864[287*2*4] = {32766,-239,32766,-239,32766,-239,32766,-239, - 32763,-477,32763,-477,32763,-477,32763,-477, - 32759,-715,32759,-715,32759,-715,32759,-715, - 32753,-954,32753,-954,32753,-954,32753,-954, - 32745,-1192,32745,-1192,32745,-1192,32745,-1192, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32724,-1668,32724,-1668,32724,-1668,32724,-1668, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32680,-2381,32680,-2381,32680,-2381,32680,-2381, - 32662,-2619,32662,-2619,32662,-2619,32662,-2619, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32620,-3094,32620,-3094,32620,-3094,32620,-3094, - 32597,-3331,32597,-3331,32597,-3331,32597,-3331, - 32572,-3568,32572,-3568,32572,-3568,32572,-3568, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32516,-4041,32516,-4041,32516,-4041,32516,-4041, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32454,-4514,32454,-4514,32454,-4514,32454,-4514, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32385,-4985,32385,-4985,32385,-4985,32385,-4985, - 32348,-5221,32348,-5221,32348,-5221,32348,-5221, - 32309,-5456,32309,-5456,32309,-5456,32309,-5456, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32226,-5925,32226,-5925,32226,-5925,32226,-5925, - 32183,-6159,32183,-6159,32183,-6159,32183,-6159, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 32041,-6860,32041,-6860,32041,-6860,32041,-6860, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31937,-7325,31937,-7325,31937,-7325,31937,-7325, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31827,-7789,31827,-7789,31827,-7789,31827,-7789, - 31770,-8020,31770,-8020,31770,-8020,31770,-8020, - 31711,-8251,31711,-8251,31711,-8251,31711,-8251, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31587,-8711,31587,-8711,31587,-8711,31587,-8711, - 31523,-8941,31523,-8941,31523,-8941,31523,-8941, - 31457,-9170,31457,-9170,31457,-9170,31457,-9170, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31321,-9626,31321,-9626,31321,-9626,31321,-9626, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31177,-10081,31177,-10081,31177,-10081,31177,-10081, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30950,-10758,30950,-10758,30950,-10758,30950,-10758, - 30871,-10983,30871,-10983,30871,-10983,30871,-10983, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30708,-11431,30708,-11431,30708,-11431,30708,-11431, - 30624,-11654,30624,-11654,30624,-11654,30624,-11654, - 30539,-11877,30539,-11877,30539,-11877,30539,-11877, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30363,-12319,30363,-12319,30363,-12319,30363,-12319, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30180,-12760,30180,-12760,30180,-12760,30180,-12760, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29992,-13197,29992,-13197,29992,-13197,29992,-13197, - 29895,-13415,29895,-13415,29895,-13415,29895,-13415, - 29796,-13632,29796,-13632,29796,-13632,29796,-13632, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29595,-14064,29595,-14064,29595,-14064,29595,-14064, - 29492,-14279,29492,-14279,29492,-14279,29492,-14279, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29173,-14919,29173,-14919,29173,-14919,29173,-14919, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28953,-15342,28953,-15342,28953,-15342,28953,-15342, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28727,-15761,28727,-15761,28727,-15761,28727,-15761, - 28612,-15970,28612,-15970,28612,-15970,28612,-15970, - 28495,-16177,28495,-16177,28495,-16177,28495,-16177, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28257,-16590,28257,-16590,28257,-16590,28257,-16590, - 28135,-16795,28135,-16795,28135,-16795,28135,-16795, - 28012,-16999,28012,-16999,28012,-16999,28012,-16999, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27762,-17405,27762,-17405,27762,-17405,27762,-17405, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27506,-17807,27506,-17807,27506,-17807,27506,-17807, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27111,-18403,27111,-18403,27111,-18403,27111,-18403, - 26977,-18599,26977,-18599,26977,-18599,26977,-18599, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26703,-18990,26703,-18990,26703,-18990,26703,-18990, - 26564,-19183,26564,-19183,26564,-19183,26564,-19183, - 26424,-19376,26424,-19376,26424,-19376,26424,-19376, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26140,-19758,26140,-19758,26140,-19758,26140,-19758, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25850,-20136,25850,-20136,25850,-20136,25850,-20136, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25554,-20510,25554,-20510,25554,-20510,25554,-20510, - 25404,-20695,25404,-20695,25404,-20695,25404,-20695, - 25253,-20880,25253,-20880,25253,-20880,25253,-20880, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24947,-21245,24947,-21245,24947,-21245,24947,-21245, - 24791,-21426,24791,-21426,24791,-21426,24791,-21426, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 24318,-21961,24318,-21961,24318,-21961,24318,-21961, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23996,-22313,23996,-22313,23996,-22313,23996,-22313, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23669,-22659,23669,-22659,23669,-22659,23669,-22659, - 23504,-22831,23504,-22831,23504,-22831,23504,-22831, - 23337,-23001,23337,-23001,23337,-23001,23337,-23001, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 23000,-23338,23000,-23338,23000,-23338,23000,-23338, - 22830,-23505,22830,-23505,22830,-23505,22830,-23505, - 22658,-23670,22658,-23670,22658,-23670,22658,-23670, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22312,-23997,22312,-23997,22312,-23997,22312,-23997, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21960,-24319,21960,-24319,21960,-24319,21960,-24319, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21425,-24792,21425,-24792,21425,-24792,21425,-24792, - 21244,-24948,21244,-24948,21244,-24948,21244,-24948, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20879,-25254,20879,-25254,20879,-25254,20879,-25254, - 20694,-25405,20694,-25405,20694,-25405,20694,-25405, - 20509,-25555,20509,-25555,20509,-25555,20509,-25555, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 20135,-25851,20135,-25851,20135,-25851,20135,-25851, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19757,-26141,19757,-26141,19757,-26141,19757,-26141, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19375,-26425,19375,-26425,19375,-26425,19375,-26425, - 19182,-26565,19182,-26565,19182,-26565,19182,-26565, - 18989,-26704,18989,-26704,18989,-26704,18989,-26704, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18598,-26978,18598,-26978,18598,-26978,18598,-26978, - 18402,-27112,18402,-27112,18402,-27112,18402,-27112, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17806,-27507,17806,-27507,17806,-27507,17806,-27507, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17404,-27763,17404,-27763,17404,-27763,17404,-27763, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 16998,-28013,16998,-28013,16998,-28013,16998,-28013, - 16794,-28136,16794,-28136,16794,-28136,16794,-28136, - 16589,-28258,16589,-28258,16589,-28258,16589,-28258, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16176,-28496,16176,-28496,16176,-28496,16176,-28496, - 15969,-28613,15969,-28613,15969,-28613,15969,-28613, - 15760,-28728,15760,-28728,15760,-28728,15760,-28728, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 15341,-28954,15341,-28954,15341,-28954,15341,-28954, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14918,-29174,14918,-29174,14918,-29174,14918,-29174, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14278,-29493,14278,-29493,14278,-29493,14278,-29493, - 14063,-29596,14063,-29596,14063,-29596,14063,-29596, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13631,-29797,13631,-29797,13631,-29797,13631,-29797, - 13414,-29896,13414,-29896,13414,-29896,13414,-29896, - 13196,-29993,13196,-29993,13196,-29993,13196,-29993, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12759,-30181,12759,-30181,12759,-30181,12759,-30181, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12318,-30364,12318,-30364,12318,-30364,12318,-30364, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11876,-30540,11876,-30540,11876,-30540,11876,-30540, - 11653,-30625,11653,-30625,11653,-30625,11653,-30625, - 11430,-30709,11430,-30709,11430,-30709,11430,-30709, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10982,-30872,10982,-30872,10982,-30872,10982,-30872, - 10757,-30951,10757,-30951,10757,-30951,10757,-30951, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 10080,-31178,10080,-31178,10080,-31178,10080,-31178, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9625,-31322,9625,-31322,9625,-31322,9625,-31322, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9169,-31458,9169,-31458,9169,-31458,9169,-31458, - 8940,-31524,8940,-31524,8940,-31524,8940,-31524, - 8710,-31588,8710,-31588,8710,-31588,8710,-31588, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8250,-31712,8250,-31712,8250,-31712,8250,-31712, - 8019,-31771,8019,-31771,8019,-31771,8019,-31771, - 7788,-31828,7788,-31828,7788,-31828,7788,-31828, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7324,-31938,7324,-31938,7324,-31938,7324,-31938, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6859,-32042,6859,-32042,6859,-32042,6859,-32042, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 6158,-32184,6158,-32184,6158,-32184,6158,-32184, - 5924,-32227,5924,-32227,5924,-32227,5924,-32227, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5455,-32310,5455,-32310,5455,-32310,5455,-32310, - 5220,-32349,5220,-32349,5220,-32349,5220,-32349, - 4984,-32386,4984,-32386,4984,-32386,4984,-32386, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 4513,-32455,4513,-32455,4513,-32455,4513,-32455, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 4040,-32517,4040,-32517,4040,-32517,4040,-32517, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3567,-32573,3567,-32573,3567,-32573,3567,-32573, - 3330,-32598,3330,-32598,3330,-32598,3330,-32598, - 3093,-32621,3093,-32621,3093,-32621,3093,-32621, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2618,-32663,2618,-32663,2618,-32663,2618,-32663, - 2380,-32681,2380,-32681,2380,-32681,2380,-32681, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1667,-32725,1667,-32725,1667,-32725,1667,-32725, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 1191,-32746,1191,-32746,1191,-32746,1191,-32746, - 953,-32754,953,-32754,953,-32754,953,-32754, - 714,-32760,714,-32760,714,-32760,714,-32760, - 476,-32764,476,-32764,476,-32764,476,-32764, - 238,-32767,238,-32767,238,-32767,238,-32767, - 0,-32767,0,-32767,0,-32767,0,-32767, - -239,-32767,-239,-32767,-239,-32767,-239,-32767, - -477,-32764,-477,-32764,-477,-32764,-477,-32764, - -715,-32760,-715,-32760,-715,-32760,-715,-32760, - -954,-32754,-954,-32754,-954,-32754,-954,-32754, - -1192,-32746,-1192,-32746,-1192,-32746,-1192,-32746, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -1668,-32725,-1668,-32725,-1668,-32725,-1668,-32725, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2381,-32681,-2381,-32681,-2381,-32681,-2381,-32681, - -2619,-32663,-2619,-32663,-2619,-32663,-2619,-32663, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3094,-32621,-3094,-32621,-3094,-32621,-3094,-32621, - -3331,-32598,-3331,-32598,-3331,-32598,-3331,-32598, - -3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4041,-32517,-4041,-32517,-4041,-32517,-4041,-32517, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4514,-32455,-4514,-32455,-4514,-32455,-4514,-32455, - -4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, - -4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, - -5221,-32349,-5221,-32349,-5221,-32349,-5221,-32349, - -5456,-32310,-5456,-32310,-5456,-32310,-5456,-32310, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -5925,-32227,-5925,-32227,-5925,-32227,-5925,-32227, - -6159,-32184,-6159,-32184,-6159,-32184,-6159,-32184, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, - -6860,-32042,-6860,-32042,-6860,-32042,-6860,-32042, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -7325,-31938,-7325,-31938,-7325,-31938,-7325,-31938, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, - -8020,-31771,-8020,-31771,-8020,-31771,-8020,-31771, - -8251,-31712,-8251,-31712,-8251,-31712,-8251,-31712, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8711,-31588,-8711,-31588,-8711,-31588,-8711,-31588, - -8941,-31524,-8941,-31524,-8941,-31524,-8941,-31524, - -9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9626,-31322,-9626,-31322,-9626,-31322,-9626,-31322, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -10081,-31178,-10081,-31178,-10081,-31178,-10081,-31178, - -10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -10758,-30951,-10758,-30951,-10758,-30951,-10758,-30951, - -10983,-30872,-10983,-30872,-10983,-30872,-10983,-30872, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11431,-30709,-11431,-30709,-11431,-30709,-11431,-30709, - -11654,-30625,-11654,-30625,-11654,-30625,-11654,-30625, - -11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, - -12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, - -12319,-30364,-12319,-30364,-12319,-30364,-12319,-30364, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -12760,-30181,-12760,-30181,-12760,-30181,-12760,-30181, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, - -13415,-29896,-13415,-29896,-13415,-29896,-13415,-29896, - -13632,-29797,-13632,-29797,-13632,-29797,-13632,-29797, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14064,-29596,-14064,-29596,-14064,-29596,-14064,-29596, - -14279,-29493,-14279,-29493,-14279,-29493,-14279,-29493, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -14919,-29174,-14919,-29174,-14919,-29174,-14919,-29174, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -15342,-28954,-15342,-28954,-15342,-28954,-15342,-28954, - -15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, - -15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, - -15970,-28613,-15970,-28613,-15970,-28613,-15970,-28613, - -16177,-28496,-16177,-28496,-16177,-28496,-16177,-28496 - }; -static int16_t twb864[287*2*4] = {32763,-477,32763,-477,32763,-477,32763,-477, - 32753,-954,32753,-954,32753,-954,32753,-954, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32680,-2381,32680,-2381,32680,-2381,32680,-2381, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32597,-3331,32597,-3331,32597,-3331,32597,-3331, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32348,-5221,32348,-5221,32348,-5221,32348,-5221, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32183,-6159,32183,-6159,32183,-6159,32183,-6159, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31770,-8020,31770,-8020,31770,-8020,31770,-8020, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31523,-8941,31523,-8941,31523,-8941,31523,-8941, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 30950,-10758,30950,-10758,30950,-10758,30950,-10758, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30624,-11654,30624,-11654,30624,-11654,30624,-11654, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29895,-13415,29895,-13415,29895,-13415,29895,-13415, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29492,-14279,29492,-14279,29492,-14279,29492,-14279, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28612,-15970,28612,-15970,28612,-15970,28612,-15970, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28135,-16795,28135,-16795,28135,-16795,28135,-16795, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27111,-18403,27111,-18403,27111,-18403,27111,-18403, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26564,-19183,26564,-19183,26564,-19183,26564,-19183, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25404,-20695,25404,-20695,25404,-20695,25404,-20695, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24791,-21426,24791,-21426,24791,-21426,24791,-21426, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23504,-22831,23504,-22831,23504,-22831,23504,-22831, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22830,-23505,22830,-23505,22830,-23505,22830,-23505, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21425,-24792,21425,-24792,21425,-24792,21425,-24792, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20694,-25405,20694,-25405,20694,-25405,20694,-25405, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19182,-26565,19182,-26565,19182,-26565,19182,-26565, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18402,-27112,18402,-27112,18402,-27112,18402,-27112, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 16794,-28136,16794,-28136,16794,-28136,16794,-28136, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15969,-28613,15969,-28613,15969,-28613,15969,-28613, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14278,-29493,14278,-29493,14278,-29493,14278,-29493, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13414,-29896,13414,-29896,13414,-29896,13414,-29896, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11653,-30625,11653,-30625,11653,-30625,11653,-30625, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10757,-30951,10757,-30951,10757,-30951,10757,-30951, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8940,-31524,8940,-31524,8940,-31524,8940,-31524, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8019,-31771,8019,-31771,8019,-31771,8019,-31771, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 6158,-32184,6158,-32184,6158,-32184,6158,-32184, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5220,-32349,5220,-32349,5220,-32349,5220,-32349, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3330,-32598,3330,-32598,3330,-32598,3330,-32598, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2380,-32681,2380,-32681,2380,-32681,2380,-32681, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 953,-32754,953,-32754,953,-32754,953,-32754, - 476,-32764,476,-32764,476,-32764,476,-32764, - 0,-32767,0,-32767,0,-32767,0,-32767, - -477,-32764,-477,-32764,-477,-32764,-477,-32764, - -954,-32754,-954,-32754,-954,-32754,-954,-32754, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2381,-32681,-2381,-32681,-2381,-32681,-2381,-32681, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3331,-32598,-3331,-32598,-3331,-32598,-3331,-32598, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, - -5221,-32349,-5221,-32349,-5221,-32349,-5221,-32349, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6159,-32184,-6159,-32184,-6159,-32184,-6159,-32184, - -6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -8020,-31771,-8020,-31771,-8020,-31771,-8020,-31771, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8941,-31524,-8941,-31524,-8941,-31524,-8941,-31524, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, - -10758,-30951,-10758,-30951,-10758,-30951,-10758,-30951, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11654,-30625,-11654,-30625,-11654,-30625,-11654,-30625, - -12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13415,-29896,-13415,-29896,-13415,-29896,-13415,-29896, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14279,-29493,-14279,-29493,-14279,-29493,-14279,-29493, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, - -15970,-28613,-15970,-28613,-15970,-28613,-15970,-28613, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16795,-28136,-16795,-28136,-16795,-28136,-16795,-28136, - -17202,-27889,-17202,-27889,-17202,-27889,-17202,-27889, - -17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, - -18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, - -18403,-27112,-18403,-27112,-18403,-27112,-18403,-27112, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19183,-26565,-19183,-26565,-19183,-26565,-19183,-26565, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20324,-25703,-20324,-25703,-20324,-25703,-20324,-25703, - -20695,-25405,-20695,-25405,-20695,-25405,-20695,-25405, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21426,-24792,-21426,-24792,-21426,-24792,-21426,-24792, - -21784,-24478,-21784,-24478,-21784,-24478,-21784,-24478, - -22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -22831,-23505,-22831,-23505,-22831,-23505,-22831,-23505, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23505,-22831,-23505,-22831,-23505,-22831,-23505,-22831, - -23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, - -24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, - -24478,-21784,-24478,-21784,-24478,-21784,-24478,-21784, - -24792,-21426,-24792,-21426,-24792,-21426,-24792,-21426, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25405,-20695,-25405,-20695,-25405,-20695,-25405,-20695, - -25703,-20324,-25703,-20324,-25703,-20324,-25703,-20324, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, - -26565,-19183,-26565,-19183,-26565,-19183,-26565,-19183, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27112,-18403,-27112,-18403,-27112,-18403,-27112,-18403, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, - -27889,-17202,-27889,-17202,-27889,-17202,-27889,-17202, - -28136,-16795,-28136,-16795,-28136,-16795,-28136,-16795, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28613,-15970,-28613,-15970,-28613,-15970,-28613,-15970, - -28842,-15552,-28842,-15552,-28842,-15552,-28842,-15552, - -29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29493,-14279,-29493,-14279,-29493,-14279,-29493,-14279, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -29896,-13415,-29896,-13415,-29896,-13415,-29896,-13415, - -30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30452,-12098,-30452,-12098,-30452,-12098,-30452,-12098, - -30625,-11654,-30625,-11654,-30625,-11654,-30625,-11654, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30951,-10758,-30951,-10758,-30951,-10758,-30951,-10758, - -31104,-10307,-31104,-10307,-31104,-10307,-31104,-10307, - -31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, - -31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, - -31524,-8941,-31524,-8941,-31524,-8941,-31524,-8941, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31771,-8020,-31771,-8020,-31771,-8020,-31771,-8020, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, - -32091,-6627,-32091,-6627,-32091,-6627,-32091,-6627, - -32184,-6159,-32184,-6159,-32184,-6159,-32184,-6159, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32349,-5221,-32349,-5221,-32349,-5221,-32349,-5221, - -32422,-4749,-32422,-4749,-32422,-4749,-32422,-4749, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32598,-3331,-32598,-3331,-32598,-3331,-32598,-3331, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32681,-2381,-32681,-2381,-32681,-2381,-32681,-2381, - -32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, - -32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, - -32754,-954,-32754,-954,-32754,-954,-32754,-954, - -32764,-477,-32764,-477,-32764,-477,-32764,-477, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32764,476,-32764,476,-32764,476,-32764,476, - -32754,953,-32754,953,-32754,953,-32754,953, - -32736,1429,-32736,1429,-32736,1429,-32736,1429, - -32712,1905,-32712,1905,-32712,1905,-32712,1905, - -32681,2380,-32681,2380,-32681,2380,-32681,2380, - -32643,2855,-32643,2855,-32643,2855,-32643,2855, - -32598,3330,-32598,3330,-32598,3330,-32598,3330, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32487,4276,-32487,4276,-32487,4276,-32487,4276, - -32422,4748,-32422,4748,-32422,4748,-32422,4748, - -32349,5220,-32349,5220,-32349,5220,-32349,5220, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -32184,6158,-32184,6158,-32184,6158,-32184,6158, - -32091,6626,-32091,6626,-32091,6626,-32091,6626, - -31991,7092,-31991,7092,-31991,7092,-31991,7092, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31771,8019,-31771,8019,-31771,8019,-31771,8019, - -31651,8480,-31651,8480,-31651,8480,-31651,8480, - -31524,8940,-31524,8940,-31524,8940,-31524,8940, - -31391,9397,-31391,9397,-31391,9397,-31391,9397, - -31251,9853,-31251,9853,-31251,9853,-31251,9853, - -31104,10306,-31104,10306,-31104,10306,-31104,10306, - -30951,10757,-30951,10757,-30951,10757,-30951,10757, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30625,11653,-30625,11653,-30625,11653,-30625,11653, - -30452,12097,-30452,12097,-30452,12097,-30452,12097, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -30088,12978,-30088,12978,-30088,12978,-30088,12978, - -29896,13414,-29896,13414,-29896,13414,-29896,13414, - -29697,13847,-29697,13847,-29697,13847,-29697,13847, - -29493,14278,-29493,14278,-29493,14278,-29493,14278, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -29065,15130,-29065,15130,-29065,15130,-29065,15130, - -28842,15551,-28842,15551,-28842,15551,-28842,15551, - -28613,15969,-28613,15969,-28613,15969,-28613,15969, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -28136,16794,-28136,16794,-28136,16794,-28136,16794, - -27889,17201,-27889,17201,-27889,17201,-27889,17201, - -27636,17605,-27636,17605,-27636,17605,-27636,17605, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -27112,18402,-27112,18402,-27112,18402,-27112,18402, - -26842,18794,-26842,18794,-26842,18794,-26842,18794, - -26565,19182,-26565,19182,-26565,19182,-26565,19182, - -26284,19567,-26284,19567,-26284,19567,-26284,19567, - -25996,19947,-25996,19947,-25996,19947,-25996,19947, - -25703,20323,-25703,20323,-25703,20323,-25703,20323, - -25405,20694,-25405,20694,-25405,20694,-25405,20694, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24792,21425,-24792,21425,-24792,21425,-24792,21425, - -24478,21783,-24478,21783,-24478,21783,-24478,21783, - -24159,22137,-24159,22137,-24159,22137,-24159,22137, - -23834,22486,-23834,22486,-23834,22486,-23834,22486, - -23505,22830,-23505,22830,-23505,22830,-23505,22830, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22831,23504,-22831,23504,-22831,23504,-22831,23504, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -22138,24158,-22138,24158,-22138,24158,-22138,24158, - -21784,24477,-21784,24477,-21784,24477,-21784,24477, - -21426,24791,-21426,24791,-21426,24791,-21426,24791, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -20695,25404,-20695,25404,-20695,25404,-20695,25404, - -20324,25702,-20324,25702,-20324,25702,-20324,25702, - -19948,25995,-19948,25995,-19948,25995,-19948,25995, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -19183,26564,-19183,26564,-19183,26564,-19183,26564, - -18795,26841,-18795,26841,-18795,26841,-18795,26841, - -18403,27111,-18403,27111,-18403,27111,-18403,27111, - -18006,27376,-18006,27376,-18006,27376,-18006,27376, - -17606,27635,-17606,27635,-17606,27635,-17606,27635, - -17202,27888,-17202,27888,-17202,27888,-17202,27888, - -16795,28135,-16795,28135,-16795,28135,-16795,28135 - }; +static int16_t twa768[191*2*4]; +static int16_t twb768[191*2*4]; +static int16_t twc768[191*2*4]; + +void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; + + int i,j; + simd_q15_t *x128=(simd_q15_t *)x; + simd_q15_t *y128=(simd_q15_t *)y; + simd_q15_t *twa128=(simd_q15_t *)&twa768[0]; + simd_q15_t *twb128=(simd_q15_t *)&twb768[0]; + simd_q15_t *twc128=(simd_q15_t *)&twc768[0]; + simd_q15_t x2128[768];// = (simd_q15_t *)&x2128array[0]; + simd_q15_t ytmp128[768];//=&ytmp128array2[0]; + + + + for (i=0,j=0; i<192; i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+192] = x128[j+1]; + x2128[i+384] = x128[j+2]; + x2128[i+576] = x128[j+3]; + } + + dft192((int16_t *)x2128,(int16_t *)ytmp128,1); + dft192((int16_t *)(x2128+192),(int16_t *)(ytmp128+192),1); + dft192((int16_t *)(x2128+384),(int16_t *)(ytmp128+384),1); + dft192((int16_t *)(x2128+576),(int16_t *)(ytmp128+576),1); + + bfly4_tw1(ytmp128,ytmp128+192,ytmp128+384,ytmp128+576,y128,y128+192,y128+384,y128+576); + + for (i=1,j=0; i<192; i++,j++) { + bfly4(ytmp128+i, + ytmp128+192+i, + ytmp128+384+i, + ytmp128+576+i, + y128+i, + y128+192+i, + y128+384+i, + y128+576+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = set1_int16(16384);//dft_norm_table[13]); + + for (i=0; i<768; i++) { + y128[i] = mulhi_int16(y128[i],norm128); + } + } + + _mm_empty(); + _m_empty(); + + +} + + +static int16_t twa864[287*2*4]; +static int16_t twb864[287*2*4]; void dft864(int16_t *x,int16_t *y,unsigned char scale_flag) // 288 x 3 { @@ -13592,630 +8196,8 @@ void dft864(int16_t *x,int16_t *y,unsigned char scale_flag) // 288 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:299)/900)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:299)/900)); -twa2 = zeros(1,2*299); -twb2 = zeros(1,2*299); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa900[299*2*4] = {"); -for i=1:2:(2*298) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb900[299*2*4] = {"); -for i=1:2:(2*298) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa900[299*2*4] = {32766,-229,32766,-229,32766,-229,32766,-229, - 32763,-458,32763,-458,32763,-458,32763,-458, - 32759,-687,32759,-687,32759,-687,32759,-687, - 32754,-915,32754,-915,32754,-915,32754,-915, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32738,-1373,32738,-1373,32738,-1373,32738,-1373, - 32727,-1601,32727,-1601,32727,-1601,32727,-1601, - 32715,-1830,32715,-1830,32715,-1830,32715,-1830, - 32702,-2058,32702,-2058,32702,-2058,32702,-2058, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32670,-2514,32670,-2514,32670,-2514,32670,-2514, - 32652,-2742,32652,-2742,32652,-2742,32652,-2742, - 32632,-2970,32632,-2970,32632,-2970,32632,-2970, - 32610,-3198,32610,-3198,32610,-3198,32610,-3198, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32562,-3653,32562,-3653,32562,-3653,32562,-3653, - 32536,-3880,32536,-3880,32536,-3880,32536,-3880, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32479,-4334,32479,-4334,32479,-4334,32479,-4334, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32415,-4787,32415,-4787,32415,-4787,32415,-4787, - 32381,-5013,32381,-5013,32381,-5013,32381,-5013, - 32345,-5239,32345,-5239,32345,-5239,32345,-5239, - 32308,-5465,32308,-5465,32308,-5465,32308,-5465, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32228,-5916,32228,-5916,32228,-5916,32228,-5916, - 32186,-6140,32186,-6140,32186,-6140,32186,-6140, - 32142,-6365,32142,-6365,32142,-6365,32142,-6365, - 32097,-6589,32097,-6589,32097,-6589,32097,-6589, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 32002,-7037,32002,-7037,32002,-7037,32002,-7037, - 31952,-7260,31952,-7260,31952,-7260,31952,-7260, - 31901,-7483,31901,-7483,31901,-7483,31901,-7483, - 31848,-7705,31848,-7705,31848,-7705,31848,-7705, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31679,-8371,31679,-8371,31679,-8371,31679,-8371, - 31620,-8592,31620,-8592,31620,-8592,31620,-8592, - 31559,-8812,31559,-8812,31559,-8812,31559,-8812, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31433,-9252,31433,-9252,31433,-9252,31433,-9252, - 31368,-9471,31368,-9471,31368,-9471,31368,-9471, - 31301,-9690,31301,-9690,31301,-9690,31301,-9690, - 31233,-9908,31233,-9908,31233,-9908,31233,-9908, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31091,-10343,31091,-10343,31091,-10343,31091,-10343, - 31018,-10560,31018,-10560,31018,-10560,31018,-10560, - 30944,-10776,30944,-10776,30944,-10776,30944,-10776, - 30868,-10992,30868,-10992,30868,-10992,30868,-10992, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30711,-11422,30711,-11422,30711,-11422,30711,-11422, - 30631,-11636,30631,-11636,30631,-11636,30631,-11636, - 30549,-11850,30549,-11850,30549,-11850,30549,-11850, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30294,-12487,30294,-12487,30294,-12487,30294,-12487, - 30206,-12698,30206,-12698,30206,-12698,30206,-12698, - 30117,-12909,30117,-12909,30117,-12909,30117,-12909, - 30026,-13119,30026,-13119,30026,-13119,30026,-13119, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29840,-13537,29840,-13537,29840,-13537,29840,-13537, - 29745,-13745,29745,-13745,29745,-13745,29745,-13745, - 29648,-13952,29648,-13952,29648,-13952,29648,-13952, - 29550,-14159,29550,-14159,29550,-14159,29550,-14159, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29349,-14570,29349,-14570,29349,-14570,29349,-14570, - 29247,-14774,29247,-14774,29247,-14774,29247,-14774, - 29143,-14978,29143,-14978,29143,-14978,29143,-14978, - 29038,-15181,29038,-15181,29038,-15181,29038,-15181, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28823,-15585,28823,-15585,28823,-15585,28823,-15585, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28603,-15986,28603,-15986,28603,-15986,28603,-15986, - 28490,-16185,28490,-16185,28490,-16185,28490,-16185, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28261,-16582,28261,-16582,28261,-16582,28261,-16582, - 28145,-16779,28145,-16779,28145,-16779,28145,-16779, - 28027,-16975,28027,-16975,28027,-16975,28027,-16975, - 27908,-17170,27908,-17170,27908,-17170,27908,-17170, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27666,-17558,27666,-17558,27666,-17558,27666,-17558, - 27542,-17751,27542,-17751,27542,-17751,27542,-17751, - 27418,-17943,27418,-17943,27418,-17943,27418,-17943, - 27292,-18133,27292,-18133,27292,-18133,27292,-18133, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 27036,-18513,27036,-18513,27036,-18513,27036,-18513, - 26906,-18701,26906,-18701,26906,-18701,26906,-18701, - 26775,-18888,26775,-18888,26775,-18888,26775,-18888, - 26642,-19075,26642,-19075,26642,-19075,26642,-19075, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26373,-19445,26373,-19445,26373,-19445,26373,-19445, - 26237,-19629,26237,-19629,26237,-19629,26237,-19629, - 26099,-19811,26099,-19811,26099,-19811,26099,-19811, - 25960,-19993,25960,-19993,25960,-19993,25960,-19993, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25679,-20354,25679,-20354,25679,-20354,25679,-20354, - 25536,-20532,25536,-20532,25536,-20532,25536,-20532, - 25392,-20710,25392,-20710,25392,-20710,25392,-20710, - 25247,-20887,25247,-20887,25247,-20887,25247,-20887, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24953,-21237,24953,-21237,24953,-21237,24953,-21237, - 24804,-21411,24804,-21411,24804,-21411,24804,-21411, - 24654,-21584,24654,-21584,24654,-21584,24654,-21584, - 24503,-21755,24503,-21755,24503,-21755,24503,-21755, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24196,-22095,24196,-22095,24196,-22095,24196,-22095, - 24042,-22264,24042,-22264,24042,-22264,24042,-22264, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23728,-22597,23728,-22597,23728,-22597,23728,-22597, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23411,-22926,23411,-22926,23411,-22926,23411,-22926, - 23250,-23089,23250,-23089,23250,-23089,23250,-23089, - 23088,-23251,23088,-23251,23088,-23251,23088,-23251, - 22925,-23412,22925,-23412,22925,-23412,22925,-23412, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22596,-23729,22596,-23729,22596,-23729,22596,-23729, - 22430,-23887,22430,-23887,22430,-23887,22430,-23887, - 22263,-24043,22263,-24043,22263,-24043,22263,-24043, - 22094,-24197,22094,-24197,22094,-24197,22094,-24197, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21754,-24504,21754,-24504,21754,-24504,21754,-24504, - 21583,-24655,21583,-24655,21583,-24655,21583,-24655, - 21410,-24805,21410,-24805,21410,-24805,21410,-24805, - 21236,-24954,21236,-24954,21236,-24954,21236,-24954, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20709,-25393,20709,-25393,20709,-25393,20709,-25393, - 20531,-25537,20531,-25537,20531,-25537,20531,-25537, - 20353,-25680,20353,-25680,20353,-25680,20353,-25680, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19992,-25961,19992,-25961,19992,-25961,19992,-25961, - 19810,-26100,19810,-26100,19810,-26100,19810,-26100, - 19628,-26238,19628,-26238,19628,-26238,19628,-26238, - 19444,-26374,19444,-26374,19444,-26374,19444,-26374, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 19074,-26643,19074,-26643,19074,-26643,19074,-26643, - 18887,-26776,18887,-26776,18887,-26776,18887,-26776, - 18700,-26907,18700,-26907,18700,-26907,18700,-26907, - 18512,-27037,18512,-27037,18512,-27037,18512,-27037, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 18132,-27293,18132,-27293,18132,-27293,18132,-27293, - 17942,-27419,17942,-27419,17942,-27419,17942,-27419, - 17750,-27543,17750,-27543,17750,-27543,17750,-27543, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 17169,-27909,17169,-27909,17169,-27909,17169,-27909, - 16974,-28028,16974,-28028,16974,-28028,16974,-28028, - 16778,-28146,16778,-28146,16778,-28146,16778,-28146, - 16581,-28262,16581,-28262,16581,-28262,16581,-28262, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16184,-28491,16184,-28491,16184,-28491,16184,-28491, - 15985,-28604,15985,-28604,15985,-28604,15985,-28604, - 15785,-28714,15785,-28714,15785,-28714,15785,-28714, - 15584,-28824,15584,-28824,15584,-28824,15584,-28824, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 15180,-29039,15180,-29039,15180,-29039,15180,-29039, - 14977,-29144,14977,-29144,14977,-29144,14977,-29144, - 14773,-29248,14773,-29248,14773,-29248,14773,-29248, - 14569,-29350,14569,-29350,14569,-29350,14569,-29350, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 14158,-29551,14158,-29551,14158,-29551,14158,-29551, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13744,-29746,13744,-29746,13744,-29746,13744,-29746, - 13536,-29841,13536,-29841,13536,-29841,13536,-29841, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13118,-30027,13118,-30027,13118,-30027,13118,-30027, - 12908,-30118,12908,-30118,12908,-30118,12908,-30118, - 12697,-30207,12697,-30207,12697,-30207,12697,-30207, - 12486,-30295,12486,-30295,12486,-30295,12486,-30295, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 12062,-30466,12062,-30466,12062,-30466,12062,-30466, - 11849,-30550,11849,-30550,11849,-30550,11849,-30550, - 11635,-30632,11635,-30632,11635,-30632,11635,-30632, - 11421,-30712,11421,-30712,11421,-30712,11421,-30712, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10991,-30869,10991,-30869,10991,-30869,10991,-30869, - 10775,-30945,10775,-30945,10775,-30945,10775,-30945, - 10559,-31019,10559,-31019,10559,-31019,10559,-31019, - 10342,-31092,10342,-31092,10342,-31092,10342,-31092, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9907,-31234,9907,-31234,9907,-31234,9907,-31234, - 9689,-31302,9689,-31302,9689,-31302,9689,-31302, - 9470,-31369,9470,-31369,9470,-31369,9470,-31369, - 9251,-31434,9251,-31434,9251,-31434,9251,-31434, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8811,-31560,8811,-31560,8811,-31560,8811,-31560, - 8591,-31621,8591,-31621,8591,-31621,8591,-31621, - 8370,-31680,8370,-31680,8370,-31680,8370,-31680, - 8148,-31738,8148,-31738,8148,-31738,8148,-31738, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7704,-31849,7704,-31849,7704,-31849,7704,-31849, - 7482,-31902,7482,-31902,7482,-31902,7482,-31902, - 7259,-31953,7259,-31953,7259,-31953,7259,-31953, - 7036,-32003,7036,-32003,7036,-32003,7036,-32003, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6588,-32098,6588,-32098,6588,-32098,6588,-32098, - 6364,-32143,6364,-32143,6364,-32143,6364,-32143, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5915,-32229,5915,-32229,5915,-32229,5915,-32229, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5464,-32309,5464,-32309,5464,-32309,5464,-32309, - 5238,-32346,5238,-32346,5238,-32346,5238,-32346, - 5012,-32382,5012,-32382,5012,-32382,5012,-32382, - 4786,-32416,4786,-32416,4786,-32416,4786,-32416, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 4333,-32480,4333,-32480,4333,-32480,4333,-32480, - 4106,-32509,4106,-32509,4106,-32509,4106,-32509, - 3879,-32537,3879,-32537,3879,-32537,3879,-32537, - 3652,-32563,3652,-32563,3652,-32563,3652,-32563, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3197,-32611,3197,-32611,3197,-32611,3197,-32611, - 2969,-32633,2969,-32633,2969,-32633,2969,-32633, - 2741,-32653,2741,-32653,2741,-32653,2741,-32653, - 2513,-32671,2513,-32671,2513,-32671,2513,-32671, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1829,-32716,1829,-32716,1829,-32716,1829,-32716, - 1600,-32728,1600,-32728,1600,-32728,1600,-32728, - 1372,-32739,1372,-32739,1372,-32739,1372,-32739, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 914,-32755,914,-32755,914,-32755,914,-32755, - 686,-32760,686,-32760,686,-32760,686,-32760, - 457,-32764,457,-32764,457,-32764,457,-32764, - 228,-32767,228,-32767,228,-32767,228,-32767, - 0,-32767,0,-32767,0,-32767,0,-32767, - -229,-32767,-229,-32767,-229,-32767,-229,-32767, - -458,-32764,-458,-32764,-458,-32764,-458,-32764, - -687,-32760,-687,-32760,-687,-32760,-687,-32760, - -915,-32755,-915,-32755,-915,-32755,-915,-32755, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1373,-32739,-1373,-32739,-1373,-32739,-1373,-32739, - -1601,-32728,-1601,-32728,-1601,-32728,-1601,-32728, - -1830,-32716,-1830,-32716,-1830,-32716,-1830,-32716, - -2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2514,-32671,-2514,-32671,-2514,-32671,-2514,-32671, - -2742,-32653,-2742,-32653,-2742,-32653,-2742,-32653, - -2970,-32633,-2970,-32633,-2970,-32633,-2970,-32633, - -3198,-32611,-3198,-32611,-3198,-32611,-3198,-32611, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3653,-32563,-3653,-32563,-3653,-32563,-3653,-32563, - -3880,-32537,-3880,-32537,-3880,-32537,-3880,-32537, - -4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, - -4334,-32480,-4334,-32480,-4334,-32480,-4334,-32480, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, - -5013,-32382,-5013,-32382,-5013,-32382,-5013,-32382, - -5239,-32346,-5239,-32346,-5239,-32346,-5239,-32346, - -5465,-32309,-5465,-32309,-5465,-32309,-5465,-32309, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -5916,-32229,-5916,-32229,-5916,-32229,-5916,-32229, - -6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, - -6365,-32143,-6365,-32143,-6365,-32143,-6365,-32143, - -6589,-32098,-6589,-32098,-6589,-32098,-6589,-32098, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7037,-32003,-7037,-32003,-7037,-32003,-7037,-32003, - -7260,-31953,-7260,-31953,-7260,-31953,-7260,-31953, - -7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, - -7705,-31849,-7705,-31849,-7705,-31849,-7705,-31849, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, - -8371,-31680,-8371,-31680,-8371,-31680,-8371,-31680, - -8592,-31621,-8592,-31621,-8592,-31621,-8592,-31621, - -8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9252,-31434,-9252,-31434,-9252,-31434,-9252,-31434, - -9471,-31369,-9471,-31369,-9471,-31369,-9471,-31369, - -9690,-31302,-9690,-31302,-9690,-31302,-9690,-31302, - -9908,-31234,-9908,-31234,-9908,-31234,-9908,-31234, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10343,-31092,-10343,-31092,-10343,-31092,-10343,-31092, - -10560,-31019,-10560,-31019,-10560,-31019,-10560,-31019, - -10776,-30945,-10776,-30945,-10776,-30945,-10776,-30945, - -10992,-30869,-10992,-30869,-10992,-30869,-10992,-30869, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, - -11636,-30632,-11636,-30632,-11636,-30632,-11636,-30632, - -11850,-30550,-11850,-30550,-11850,-30550,-11850,-30550, - -12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12487,-30295,-12487,-30295,-12487,-30295,-12487,-30295, - -12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, - -12909,-30118,-12909,-30118,-12909,-30118,-12909,-30118, - -13119,-30027,-13119,-30027,-13119,-30027,-13119,-30027, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13537,-29841,-13537,-29841,-13537,-29841,-13537,-29841, - -13745,-29746,-13745,-29746,-13745,-29746,-13745,-29746, - -13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, - -14159,-29551,-14159,-29551,-14159,-29551,-14159,-29551, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14570,-29350,-14570,-29350,-14570,-29350,-14570,-29350, - -14774,-29248,-14774,-29248,-14774,-29248,-14774,-29248, - -14978,-29144,-14978,-29144,-14978,-29144,-14978,-29144, - -15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15585,-28824,-15585,-28824,-15585,-28824,-15585,-28824, - -15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, - -15986,-28604,-15986,-28604,-15986,-28604,-15986,-28604, - -16185,-28491,-16185,-28491,-16185,-28491,-16185,-28491 - }; -static int16_t twb900[299*2*4] = {32763,-458,32763,-458,32763,-458,32763,-458, - 32754,-915,32754,-915,32754,-915,32754,-915, - 32738,-1373,32738,-1373,32738,-1373,32738,-1373, - 32715,-1830,32715,-1830,32715,-1830,32715,-1830, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32652,-2742,32652,-2742,32652,-2742,32652,-2742, - 32610,-3198,32610,-3198,32610,-3198,32610,-3198, - 32562,-3653,32562,-3653,32562,-3653,32562,-3653, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32381,-5013,32381,-5013,32381,-5013,32381,-5013, - 32308,-5465,32308,-5465,32308,-5465,32308,-5465, - 32228,-5916,32228,-5916,32228,-5916,32228,-5916, - 32142,-6365,32142,-6365,32142,-6365,32142,-6365, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31952,-7260,31952,-7260,31952,-7260,31952,-7260, - 31848,-7705,31848,-7705,31848,-7705,31848,-7705, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31620,-8592,31620,-8592,31620,-8592,31620,-8592, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31368,-9471,31368,-9471,31368,-9471,31368,-9471, - 31233,-9908,31233,-9908,31233,-9908,31233,-9908, - 31091,-10343,31091,-10343,31091,-10343,31091,-10343, - 30944,-10776,30944,-10776,30944,-10776,30944,-10776, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30631,-11636,30631,-11636,30631,-11636,30631,-11636, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30294,-12487,30294,-12487,30294,-12487,30294,-12487, - 30117,-12909,30117,-12909,30117,-12909,30117,-12909, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29745,-13745,29745,-13745,29745,-13745,29745,-13745, - 29550,-14159,29550,-14159,29550,-14159,29550,-14159, - 29349,-14570,29349,-14570,29349,-14570,29349,-14570, - 29143,-14978,29143,-14978,29143,-14978,29143,-14978, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28490,-16185,28490,-16185,28490,-16185,28490,-16185, - 28261,-16582,28261,-16582,28261,-16582,28261,-16582, - 28027,-16975,28027,-16975,28027,-16975,28027,-16975, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27542,-17751,27542,-17751,27542,-17751,27542,-17751, - 27292,-18133,27292,-18133,27292,-18133,27292,-18133, - 27036,-18513,27036,-18513,27036,-18513,27036,-18513, - 26775,-18888,26775,-18888,26775,-18888,26775,-18888, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26237,-19629,26237,-19629,26237,-19629,26237,-19629, - 25960,-19993,25960,-19993,25960,-19993,25960,-19993, - 25679,-20354,25679,-20354,25679,-20354,25679,-20354, - 25392,-20710,25392,-20710,25392,-20710,25392,-20710, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24804,-21411,24804,-21411,24804,-21411,24804,-21411, - 24503,-21755,24503,-21755,24503,-21755,24503,-21755, - 24196,-22095,24196,-22095,24196,-22095,24196,-22095, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23250,-23089,23250,-23089,23250,-23089,23250,-23089, - 22925,-23412,22925,-23412,22925,-23412,22925,-23412, - 22596,-23729,22596,-23729,22596,-23729,22596,-23729, - 22263,-24043,22263,-24043,22263,-24043,22263,-24043, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21583,-24655,21583,-24655,21583,-24655,21583,-24655, - 21236,-24954,21236,-24954,21236,-24954,21236,-24954, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20531,-25537,20531,-25537,20531,-25537,20531,-25537, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19810,-26100,19810,-26100,19810,-26100,19810,-26100, - 19444,-26374,19444,-26374,19444,-26374,19444,-26374, - 19074,-26643,19074,-26643,19074,-26643,19074,-26643, - 18700,-26907,18700,-26907,18700,-26907,18700,-26907, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 17942,-27419,17942,-27419,17942,-27419,17942,-27419, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17169,-27909,17169,-27909,17169,-27909,17169,-27909, - 16778,-28146,16778,-28146,16778,-28146,16778,-28146, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15985,-28604,15985,-28604,15985,-28604,15985,-28604, - 15584,-28824,15584,-28824,15584,-28824,15584,-28824, - 15180,-29039,15180,-29039,15180,-29039,15180,-29039, - 14773,-29248,14773,-29248,14773,-29248,14773,-29248, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13536,-29841,13536,-29841,13536,-29841,13536,-29841, - 13118,-30027,13118,-30027,13118,-30027,13118,-30027, - 12697,-30207,12697,-30207,12697,-30207,12697,-30207, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11849,-30550,11849,-30550,11849,-30550,11849,-30550, - 11421,-30712,11421,-30712,11421,-30712,11421,-30712, - 10991,-30869,10991,-30869,10991,-30869,10991,-30869, - 10559,-31019,10559,-31019,10559,-31019,10559,-31019, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9689,-31302,9689,-31302,9689,-31302,9689,-31302, - 9251,-31434,9251,-31434,9251,-31434,9251,-31434, - 8811,-31560,8811,-31560,8811,-31560,8811,-31560, - 8370,-31680,8370,-31680,8370,-31680,8370,-31680, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7482,-31902,7482,-31902,7482,-31902,7482,-31902, - 7036,-32003,7036,-32003,7036,-32003,7036,-32003, - 6588,-32098,6588,-32098,6588,-32098,6588,-32098, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5238,-32346,5238,-32346,5238,-32346,5238,-32346, - 4786,-32416,4786,-32416,4786,-32416,4786,-32416, - 4333,-32480,4333,-32480,4333,-32480,4333,-32480, - 3879,-32537,3879,-32537,3879,-32537,3879,-32537, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2969,-32633,2969,-32633,2969,-32633,2969,-32633, - 2513,-32671,2513,-32671,2513,-32671,2513,-32671, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1600,-32728,1600,-32728,1600,-32728,1600,-32728, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 686,-32760,686,-32760,686,-32760,686,-32760, - 228,-32767,228,-32767,228,-32767,228,-32767, - -229,-32767,-229,-32767,-229,-32767,-229,-32767, - -687,-32760,-687,-32760,-687,-32760,-687,-32760, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1601,-32728,-1601,-32728,-1601,-32728,-1601,-32728, - -2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, - -2514,-32671,-2514,-32671,-2514,-32671,-2514,-32671, - -2970,-32633,-2970,-32633,-2970,-32633,-2970,-32633, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3880,-32537,-3880,-32537,-3880,-32537,-3880,-32537, - -4334,-32480,-4334,-32480,-4334,-32480,-4334,-32480, - -4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, - -5239,-32346,-5239,-32346,-5239,-32346,-5239,-32346, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, - -6589,-32098,-6589,-32098,-6589,-32098,-6589,-32098, - -7037,-32003,-7037,-32003,-7037,-32003,-7037,-32003, - -7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8371,-31680,-8371,-31680,-8371,-31680,-8371,-31680, - -8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, - -9252,-31434,-9252,-31434,-9252,-31434,-9252,-31434, - -9690,-31302,-9690,-31302,-9690,-31302,-9690,-31302, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10560,-31019,-10560,-31019,-10560,-31019,-10560,-31019, - -10992,-30869,-10992,-30869,-10992,-30869,-10992,-30869, - -11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, - -11850,-30550,-11850,-30550,-11850,-30550,-11850,-30550, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, - -13119,-30027,-13119,-30027,-13119,-30027,-13119,-30027, - -13537,-29841,-13537,-29841,-13537,-29841,-13537,-29841, - -13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14774,-29248,-14774,-29248,-14774,-29248,-14774,-29248, - -15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, - -15585,-28824,-15585,-28824,-15585,-28824,-15585,-28824, - -15986,-28604,-15986,-28604,-15986,-28604,-15986,-28604, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16779,-28146,-16779,-28146,-16779,-28146,-16779,-28146, - -17170,-27909,-17170,-27909,-17170,-27909,-17170,-27909, - -17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, - -17943,-27419,-17943,-27419,-17943,-27419,-17943,-27419, - -18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, - -18701,-26907,-18701,-26907,-18701,-26907,-18701,-26907, - -19075,-26643,-19075,-26643,-19075,-26643,-19075,-26643, - -19445,-26374,-19445,-26374,-19445,-26374,-19445,-26374, - -19811,-26100,-19811,-26100,-19811,-26100,-19811,-26100, - -20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, - -20532,-25537,-20532,-25537,-20532,-25537,-20532,-25537, - -20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, - -21237,-24954,-21237,-24954,-21237,-24954,-21237,-24954, - -21584,-24655,-21584,-24655,-21584,-24655,-21584,-24655, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22264,-24043,-22264,-24043,-22264,-24043,-22264,-24043, - -22597,-23729,-22597,-23729,-22597,-23729,-22597,-23729, - -22926,-23412,-22926,-23412,-22926,-23412,-22926,-23412, - -23251,-23089,-23251,-23089,-23251,-23089,-23251,-23089, - -23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, - -23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, - -24197,-22095,-24197,-22095,-24197,-22095,-24197,-22095, - -24504,-21755,-24504,-21755,-24504,-21755,-24504,-21755, - -24805,-21411,-24805,-21411,-24805,-21411,-24805,-21411, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25393,-20710,-25393,-20710,-25393,-20710,-25393,-20710, - -25680,-20354,-25680,-20354,-25680,-20354,-25680,-20354, - -25961,-19993,-25961,-19993,-25961,-19993,-25961,-19993, - -26238,-19629,-26238,-19629,-26238,-19629,-26238,-19629, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26776,-18888,-26776,-18888,-26776,-18888,-26776,-18888, - -27037,-18513,-27037,-18513,-27037,-18513,-27037,-18513, - -27293,-18133,-27293,-18133,-27293,-18133,-27293,-18133, - -27543,-17751,-27543,-17751,-27543,-17751,-27543,-17751, - -27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, - -28028,-16975,-28028,-16975,-28028,-16975,-28028,-16975, - -28262,-16582,-28262,-16582,-28262,-16582,-28262,-16582, - -28491,-16185,-28491,-16185,-28491,-16185,-28491,-16185, - -28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, - -28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, - -29144,-14978,-29144,-14978,-29144,-14978,-29144,-14978, - -29350,-14570,-29350,-14570,-29350,-14570,-29350,-14570, - -29551,-14159,-29551,-14159,-29551,-14159,-29551,-14159, - -29746,-13745,-29746,-13745,-29746,-13745,-29746,-13745, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30118,-12909,-30118,-12909,-30118,-12909,-30118,-12909, - -30295,-12487,-30295,-12487,-30295,-12487,-30295,-12487, - -30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, - -30632,-11636,-30632,-11636,-30632,-11636,-30632,-11636, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30945,-10776,-30945,-10776,-30945,-10776,-30945,-10776, - -31092,-10343,-31092,-10343,-31092,-10343,-31092,-10343, - -31234,-9908,-31234,-9908,-31234,-9908,-31234,-9908, - -31369,-9471,-31369,-9471,-31369,-9471,-31369,-9471, - -31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, - -31621,-8592,-31621,-8592,-31621,-8592,-31621,-8592, - -31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, - -31849,-7705,-31849,-7705,-31849,-7705,-31849,-7705, - -31953,-7260,-31953,-7260,-31953,-7260,-31953,-7260, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32143,-6365,-32143,-6365,-32143,-6365,-32143,-6365, - -32229,-5916,-32229,-5916,-32229,-5916,-32229,-5916, - -32309,-5465,-32309,-5465,-32309,-5465,-32309,-5465, - -32382,-5013,-32382,-5013,-32382,-5013,-32382,-5013, - -32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, - -32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, - -32563,-3653,-32563,-3653,-32563,-3653,-32563,-3653, - -32611,-3198,-32611,-3198,-32611,-3198,-32611,-3198, - -32653,-2742,-32653,-2742,-32653,-2742,-32653,-2742, - -32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, - -32716,-1830,-32716,-1830,-32716,-1830,-32716,-1830, - -32739,-1373,-32739,-1373,-32739,-1373,-32739,-1373, - -32755,-915,-32755,-915,-32755,-915,-32755,-915, - -32764,-458,-32764,-458,-32764,-458,-32764,-458, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32764,457,-32764,457,-32764,457,-32764,457, - -32755,914,-32755,914,-32755,914,-32755,914, - -32739,1372,-32739,1372,-32739,1372,-32739,1372, - -32716,1829,-32716,1829,-32716,1829,-32716,1829, - -32688,2285,-32688,2285,-32688,2285,-32688,2285, - -32653,2741,-32653,2741,-32653,2741,-32653,2741, - -32611,3197,-32611,3197,-32611,3197,-32611,3197, - -32563,3652,-32563,3652,-32563,3652,-32563,3652, - -32509,4106,-32509,4106,-32509,4106,-32509,4106, - -32449,4560,-32449,4560,-32449,4560,-32449,4560, - -32382,5012,-32382,5012,-32382,5012,-32382,5012, - -32309,5464,-32309,5464,-32309,5464,-32309,5464, - -32229,5915,-32229,5915,-32229,5915,-32229,5915, - -32143,6364,-32143,6364,-32143,6364,-32143,6364, - -32051,6812,-32051,6812,-32051,6812,-32051,6812, - -31953,7259,-31953,7259,-31953,7259,-31953,7259, - -31849,7704,-31849,7704,-31849,7704,-31849,7704, - -31738,8148,-31738,8148,-31738,8148,-31738,8148, - -31621,8591,-31621,8591,-31621,8591,-31621,8591, - -31498,9031,-31498,9031,-31498,9031,-31498,9031, - -31369,9470,-31369,9470,-31369,9470,-31369,9470, - -31234,9907,-31234,9907,-31234,9907,-31234,9907, - -31092,10342,-31092,10342,-31092,10342,-31092,10342, - -30945,10775,-30945,10775,-30945,10775,-30945,10775, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30632,11635,-30632,11635,-30632,11635,-30632,11635, - -30466,12062,-30466,12062,-30466,12062,-30466,12062, - -30295,12486,-30295,12486,-30295,12486,-30295,12486, - -30118,12908,-30118,12908,-30118,12908,-30118,12908, - -29935,13327,-29935,13327,-29935,13327,-29935,13327, - -29746,13744,-29746,13744,-29746,13744,-29746,13744, - -29551,14158,-29551,14158,-29551,14158,-29551,14158, - -29350,14569,-29350,14569,-29350,14569,-29350,14569, - -29144,14977,-29144,14977,-29144,14977,-29144,14977, - -28932,15383,-28932,15383,-28932,15383,-28932,15383, - -28714,15785,-28714,15785,-28714,15785,-28714,15785, - -28491,16184,-28491,16184,-28491,16184,-28491,16184, - -28262,16581,-28262,16581,-28262,16581,-28262,16581, - -28028,16974,-28028,16974,-28028,16974,-28028,16974, - -27788,17363,-27788,17363,-27788,17363,-27788,17363, - -27543,17750,-27543,17750,-27543,17750,-27543,17750, - -27293,18132,-27293,18132,-27293,18132,-27293,18132, - -27037,18512,-27037,18512,-27037,18512,-27037,18512, - -26776,18887,-26776,18887,-26776,18887,-26776,18887, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -26238,19628,-26238,19628,-26238,19628,-26238,19628, - -25961,19992,-25961,19992,-25961,19992,-25961,19992, - -25680,20353,-25680,20353,-25680,20353,-25680,20353, - -25393,20709,-25393,20709,-25393,20709,-25393,20709, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24805,21410,-24805,21410,-24805,21410,-24805,21410, - -24504,21754,-24504,21754,-24504,21754,-24504,21754, - -24197,22094,-24197,22094,-24197,22094,-24197,22094, - -23887,22430,-23887,22430,-23887,22430,-23887,22430, - -23571,22761,-23571,22761,-23571,22761,-23571,22761, - -23251,23088,-23251,23088,-23251,23088,-23251,23088, - -22926,23411,-22926,23411,-22926,23411,-22926,23411, - -22597,23728,-22597,23728,-22597,23728,-22597,23728, - -22264,24042,-22264,24042,-22264,24042,-22264,24042, - -21926,24350,-21926,24350,-21926,24350,-21926,24350, - -21584,24654,-21584,24654,-21584,24654,-21584,24654, - -21237,24953,-21237,24953,-21237,24953,-21237,24953, - -20887,25247,-20887,25247,-20887,25247,-20887,25247, - -20532,25536,-20532,25536,-20532,25536,-20532,25536, - -20174,25820,-20174,25820,-20174,25820,-20174,25820, - -19811,26099,-19811,26099,-19811,26099,-19811,26099, - -19445,26373,-19445,26373,-19445,26373,-19445,26373, - -19075,26642,-19075,26642,-19075,26642,-19075,26642, - -18701,26906,-18701,26906,-18701,26906,-18701,26906, - -18324,27165,-18324,27165,-18324,27165,-18324,27165, - -17943,27418,-17943,27418,-17943,27418,-17943,27418, - -17558,27666,-17558,27666,-17558,27666,-17558,27666, - -17170,27908,-17170,27908,-17170,27908,-17170,27908, - -16779,28145,-16779,28145,-16779,28145,-16779,28145 - }; +static int16_t twa900[299*2*4]; +static int16_t twb900[299*2*4]; void dft900(int16_t *x,int16_t *y,unsigned char scale_flag) // 300 x 3 { @@ -14266,762 +8248,10 @@ void dft900(int16_t *x,int16_t *y,unsigned char scale_flag) // 300 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:239)/960)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:239)/960)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:239)/960)); -twa2 = zeros(1,2*239); -twb2 = zeros(1,2*239); -twc2 = zeros(1,2*239); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa960[239*2*4] = {"); -for i=1:2:(2*238) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"\nstatic int16_t twb960[239*2*4] = {"); -for i=1:2:(2*238) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"\nstatic int16_t twc960[239*2*4] = {"); -for i=1:2:(2*238) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); -*/ -static int16_t twa960[239*2*4] = {32766,-215,32766,-215,32766,-215,32766,-215, - 32764,-429,32764,-429,32764,-429,32764,-429, - 32760,-644,32760,-644,32760,-644,32760,-644, - 32755,-858,32755,-858,32755,-858,32755,-858, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32741,-1287,32741,-1287,32741,-1287,32741,-1287, - 32732,-1501,32732,-1501,32732,-1501,32732,-1501, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32710,-1930,32710,-1930,32710,-1930,32710,-1930, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32682,-2358,32682,-2358,32682,-2358,32682,-2358, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32648,-2785,32648,-2785,32648,-2785,32648,-2785, - 32629,-2999,32629,-2999,32629,-2999,32629,-2999, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32564,-3639,32564,-3639,32564,-3639,32564,-3639, - 32539,-3852,32539,-3852,32539,-3852,32539,-3852, - 32513,-4065,32513,-4065,32513,-4065,32513,-4065, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32457,-4490,32457,-4490,32457,-4490,32457,-4490, - 32427,-4702,32427,-4702,32427,-4702,32427,-4702, - 32396,-4914,32396,-4914,32396,-4914,32396,-4914, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32293,-5550,32293,-5550,32293,-5550,32293,-5550, - 32256,-5761,32256,-5761,32256,-5761,32256,-5761, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32178,-6183,32178,-6183,32178,-6183,32178,-6183, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32094,-6603,32094,-6603,32094,-6603,32094,-6603, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 32005,-7023,32005,-7023,32005,-7023,32005,-7023, - 31959,-7232,31959,-7232,31959,-7232,31959,-7232, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31810,-7858,31810,-7858,31810,-7858,31810,-7858, - 31758,-8066,31758,-8066,31758,-8066,31758,-8066, - 31705,-8274,31705,-8274,31705,-8274,31705,-8274, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31594,-8688,31594,-8688,31594,-8688,31594,-8688, - 31536,-8895,31536,-8895,31536,-8895,31536,-8895, - 31477,-9101,31477,-9101,31477,-9101,31477,-9101, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31293,-9717,31293,-9717,31293,-9717,31293,-9717, - 31228,-9922,31228,-9922,31228,-9922,31228,-9922, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31096,-10330,31096,-10330,31096,-10330,31096,-10330, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30958,-10736,30958,-10736,30958,-10736,30958,-10736, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30815,-11140,30815,-11140,30815,-11140,30815,-11140, - 30741,-11342,30741,-11342,30741,-11342,30741,-11342, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30513,-11943,30513,-11943,30513,-11943,30513,-11943, - 30434,-12143,30434,-12143,30434,-12143,30434,-12143, - 30354,-12341,30354,-12341,30354,-12341,30354,-12341, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30190,-12738,30190,-12738,30190,-12738,30190,-12738, - 30106,-12935,30106,-12935,30106,-12935,30106,-12935, - 30020,-13132,30020,-13132,30020,-13132,30020,-13132, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29757,-13719,29757,-13719,29757,-13719,29757,-13719, - 29666,-13913,29666,-13913,29666,-13913,29666,-13913, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29482,-14300,29482,-14300,29482,-14300,29482,-14300, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29292,-14685,29292,-14685,29292,-14685,29292,-14685, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29097,-15067,29097,-15067,29097,-15067,29097,-15067, - 28998,-15257,28998,-15257,28998,-15257,28998,-15257, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28693,-15824,28693,-15824,28693,-15824,28693,-15824, - 28589,-16011,28589,-16011,28589,-16011,28589,-16011, - 28483,-16198,28483,-16198,28483,-16198,28483,-16198, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28269,-16569,28269,-16569,28269,-16569,28269,-16569, - 28160,-16754,28160,-16754,28160,-16754,28160,-16754, - 28049,-16938,28049,-16938,28049,-16938,28049,-16938, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27711,-17485,27711,-17485,27711,-17485,27711,-17485, - 27596,-17666,27596,-17666,27596,-17666,27596,-17666, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27363,-18026,27363,-18026,27363,-18026,27363,-18026, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27125,-18383,27125,-18383,27125,-18383,27125,-18383, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26882,-18736,26882,-18736,26882,-18736,26882,-18736, - 26758,-18912,26758,-18912,26758,-18912,26758,-18912, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26382,-19434,26382,-19434,26382,-19434,26382,-19434, - 26254,-19606,26254,-19606,26254,-19606,26254,-19606, - 26125,-19777,26125,-19777,26125,-19777,26125,-19777, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25864,-20117,25864,-20117,25864,-20117,25864,-20117, - 25732,-20286,25732,-20286,25732,-20286,25732,-20286, - 25599,-20454,25599,-20454,25599,-20454,25599,-20454, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 25192,-20953,25192,-20953,25192,-20953,25192,-20953, - 25054,-21117,25054,-21117,25054,-21117,25054,-21117, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24776,-21444,24776,-21444,24776,-21444,24776,-21444, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24493,-21766,24493,-21766,24493,-21766,24493,-21766, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24206,-22085,24206,-22085,24206,-22085,24206,-22085, - 24061,-22243,24061,-22243,24061,-22243,24061,-22243, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23620,-22711,23620,-22711,23620,-22711,23620,-22711, - 23471,-22865,23471,-22865,23471,-22865,23471,-22865, - 23320,-23018,23320,-23018,23320,-23018,23320,-23018, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 23017,-23321,23017,-23321,23017,-23321,23017,-23321, - 22864,-23472,22864,-23472,22864,-23472,22864,-23472, - 22710,-23621,22710,-23621,22710,-23621,22710,-23621, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22242,-24062,22242,-24062,22242,-24062,22242,-24062, - 22084,-24207,22084,-24207,22084,-24207,22084,-24207, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21765,-24494,21765,-24494,21765,-24494,21765,-24494, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21443,-24777,21443,-24777,21443,-24777,21443,-24777, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 21116,-25055,21116,-25055,21116,-25055,21116,-25055, - 20952,-25193,20952,-25193,20952,-25193,20952,-25193, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20453,-25600,20453,-25600,20453,-25600,20453,-25600, - 20285,-25733,20285,-25733,20285,-25733,20285,-25733, - 20116,-25865,20116,-25865,20116,-25865,20116,-25865, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19776,-26126,19776,-26126,19776,-26126,19776,-26126, - 19605,-26255,19605,-26255,19605,-26255,19605,-26255, - 19433,-26383,19433,-26383,19433,-26383,19433,-26383, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18911,-26759,18911,-26759,18911,-26759,18911,-26759, - 18735,-26883,18735,-26883,18735,-26883,18735,-26883, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 18382,-27126,18382,-27126,18382,-27126,18382,-27126, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 18025,-27364,18025,-27364,18025,-27364,18025,-27364, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17665,-27597,17665,-27597,17665,-27597,17665,-27597, - 17484,-27712,17484,-27712,17484,-27712,17484,-27712, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16937,-28050,16937,-28050,16937,-28050,16937,-28050, - 16753,-28161,16753,-28161,16753,-28161,16753,-28161, - 16568,-28270,16568,-28270,16568,-28270,16568,-28270, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16197,-28484,16197,-28484,16197,-28484,16197,-28484, - 16010,-28590,16010,-28590,16010,-28590,16010,-28590, - 15823,-28694,15823,-28694,15823,-28694,15823,-28694, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 15256,-28999,15256,-28999,15256,-28999,15256,-28999, - 15066,-29098,15066,-29098,15066,-29098,15066,-29098, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14684,-29293,14684,-29293,14684,-29293,14684,-29293, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14299,-29483,14299,-29483,14299,-29483,14299,-29483, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13912,-29667,13912,-29667,13912,-29667,13912,-29667, - 13718,-29758,13718,-29758,13718,-29758,13718,-29758, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13131,-30021,13131,-30021,13131,-30021,13131,-30021, - 12934,-30107,12934,-30107,12934,-30107,12934,-30107, - 12737,-30191,12737,-30191,12737,-30191,12737,-30191, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12340,-30355,12340,-30355,12340,-30355,12340,-30355, - 12142,-30435,12142,-30435,12142,-30435,12142,-30435, - 11942,-30514,11942,-30514,11942,-30514,11942,-30514, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11341,-30742,11341,-30742,11341,-30742,11341,-30742, - 11139,-30816,11139,-30816,11139,-30816,11139,-30816, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10735,-30959,10735,-30959,10735,-30959,10735,-30959, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10329,-31097,10329,-31097,10329,-31097,10329,-31097, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9921,-31229,9921,-31229,9921,-31229,9921,-31229, - 9716,-31294,9716,-31294,9716,-31294,9716,-31294, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 9100,-31478,9100,-31478,9100,-31478,9100,-31478, - 8894,-31537,8894,-31537,8894,-31537,8894,-31537, - 8687,-31595,8687,-31595,8687,-31595,8687,-31595, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8273,-31706,8273,-31706,8273,-31706,8273,-31706, - 8065,-31759,8065,-31759,8065,-31759,8065,-31759, - 7857,-31811,7857,-31811,7857,-31811,7857,-31811, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 7231,-31960,7231,-31960,7231,-31960,7231,-31960, - 7022,-32006,7022,-32006,7022,-32006,7022,-32006, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6602,-32095,6602,-32095,6602,-32095,6602,-32095, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 6182,-32179,6182,-32179,6182,-32179,6182,-32179, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5760,-32257,5760,-32257,5760,-32257,5760,-32257, - 5549,-32294,5549,-32294,5549,-32294,5549,-32294, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4913,-32397,4913,-32397,4913,-32397,4913,-32397, - 4701,-32428,4701,-32428,4701,-32428,4701,-32428, - 4489,-32458,4489,-32458,4489,-32458,4489,-32458, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 4064,-32514,4064,-32514,4064,-32514,4064,-32514, - 3851,-32540,3851,-32540,3851,-32540,3851,-32540, - 3638,-32565,3638,-32565,3638,-32565,3638,-32565, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2998,-32630,2998,-32630,2998,-32630,2998,-32630, - 2784,-32649,2784,-32649,2784,-32649,2784,-32649, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2357,-32683,2357,-32683,2357,-32683,2357,-32683, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1929,-32711,1929,-32711,1929,-32711,1929,-32711, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1500,-32733,1500,-32733,1500,-32733,1500,-32733, - 1286,-32742,1286,-32742,1286,-32742,1286,-32742, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 857,-32756,857,-32756,857,-32756,857,-32756, - 643,-32761,643,-32761,643,-32761,643,-32761, - 428,-32765,428,-32765,428,-32765,428,-32765, - 214,-32767,214,-32767,214,-32767,214,-32767 - }; - -static int16_t twb960[239*2*4] = {32764,-429,32764,-429,32764,-429,32764,-429, - 32755,-858,32755,-858,32755,-858,32755,-858, - 32741,-1287,32741,-1287,32741,-1287,32741,-1287, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32629,-2999,32629,-2999,32629,-2999,32629,-2999, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32539,-3852,32539,-3852,32539,-3852,32539,-3852, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32427,-4702,32427,-4702,32427,-4702,32427,-4702, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32293,-5550,32293,-5550,32293,-5550,32293,-5550, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31959,-7232,31959,-7232,31959,-7232,31959,-7232, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31758,-8066,31758,-8066,31758,-8066,31758,-8066, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31536,-8895,31536,-8895,31536,-8895,31536,-8895, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31293,-9717,31293,-9717,31293,-9717,31293,-9717, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30741,-11342,30741,-11342,30741,-11342,30741,-11342, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30434,-12143,30434,-12143,30434,-12143,30434,-12143, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30106,-12935,30106,-12935,30106,-12935,30106,-12935, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29757,-13719,29757,-13719,29757,-13719,29757,-13719, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28998,-15257,28998,-15257,28998,-15257,28998,-15257, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28589,-16011,28589,-16011,28589,-16011,28589,-16011, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28160,-16754,28160,-16754,28160,-16754,28160,-16754, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27711,-17485,27711,-17485,27711,-17485,27711,-17485, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26758,-18912,26758,-18912,26758,-18912,26758,-18912, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26254,-19606,26254,-19606,26254,-19606,26254,-19606, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25732,-20286,25732,-20286,25732,-20286,25732,-20286, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25192,-20953,25192,-20953,25192,-20953,25192,-20953, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24061,-22243,24061,-22243,24061,-22243,24061,-22243, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23471,-22865,23471,-22865,23471,-22865,23471,-22865, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22864,-23472,22864,-23472,22864,-23472,22864,-23472, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 22242,-24062,22242,-24062,22242,-24062,22242,-24062, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20952,-25193,20952,-25193,20952,-25193,20952,-25193, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20285,-25733,20285,-25733,20285,-25733,20285,-25733, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19605,-26255,19605,-26255,19605,-26255,19605,-26255, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18911,-26759,18911,-26759,18911,-26759,18911,-26759, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17484,-27712,17484,-27712,17484,-27712,17484,-27712, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16753,-28161,16753,-28161,16753,-28161,16753,-28161, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16010,-28590,16010,-28590,16010,-28590,16010,-28590, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 15256,-28999,15256,-28999,15256,-28999,15256,-28999, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13718,-29758,13718,-29758,13718,-29758,13718,-29758, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12934,-30107,12934,-30107,12934,-30107,12934,-30107, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12142,-30435,12142,-30435,12142,-30435,12142,-30435, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11341,-30742,11341,-30742,11341,-30742,11341,-30742, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9716,-31294,9716,-31294,9716,-31294,9716,-31294, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 8894,-31537,8894,-31537,8894,-31537,8894,-31537, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8065,-31759,8065,-31759,8065,-31759,8065,-31759, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7231,-31960,7231,-31960,7231,-31960,7231,-31960, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5549,-32294,5549,-32294,5549,-32294,5549,-32294, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4701,-32428,4701,-32428,4701,-32428,4701,-32428, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3851,-32540,3851,-32540,3851,-32540,3851,-32540, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 2998,-32630,2998,-32630,2998,-32630,2998,-32630, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1286,-32742,1286,-32742,1286,-32742,1286,-32742, - 857,-32756,857,-32756,857,-32756,857,-32756, - 428,-32765,428,-32765,428,-32765,428,-32765, - 0,-32767,0,-32767,0,-32767,0,-32767, - -429,-32765,-429,-32765,-429,-32765,-429,-32765, - -858,-32756,-858,-32756,-858,-32756,-858,-32756, - -1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -2999,-32630,-2999,-32630,-2999,-32630,-2999,-32630, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4702,-32428,-4702,-32428,-4702,-32428,-4702,-32428, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5550,-32294,-5550,-32294,-5550,-32294,-5550,-32294, - -5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7232,-31960,-7232,-31960,-7232,-31960,-7232,-31960, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8066,-31759,-8066,-31759,-8066,-31759,-8066,-31759, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, - -9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, - -9717,-31294,-9717,-31294,-9717,-31294,-9717,-31294, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, - -11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12143,-30435,-12143,-30435,-12143,-30435,-12143,-30435, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -12935,-30107,-12935,-30107,-12935,-30107,-12935,-30107, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, - -14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15257,-28999,-15257,-28999,-15257,-28999,-15257,-28999, - -15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, - -16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16754,-28161,-16754,-28161,-16754,-28161,-16754,-28161, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -17485,-27712,-17485,-27712,-17485,-27712,-17485,-27712, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, - -18912,-26759,-18912,-26759,-18912,-26759,-18912,-26759, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19606,-26255,-19606,-26255,-19606,-26255,-19606,-26255, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -20953,-25193,-20953,-25193,-20953,-25193,-20953,-25193, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, - -22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, - -22865,-23472,-22865,-23472,-22865,-23472,-22865,-23472, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23472,-22865,-23472,-22865,-23472,-22865,-23472,-22865, - -23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, - -24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25193,-20953,-25193,-20953,-25193,-20953,-25193,-20953, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26255,-19606,-26255,-19606,-26255,-19606,-26255,-19606, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26759,-18912,-26759,-18912,-26759,-18912,-26759,-18912, - -27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27712,-17485,-27712,-17485,-27712,-17485,-27712,-17485, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28161,-16754,-28161,-16754,-28161,-16754,-28161,-16754, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, - -28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, - -28999,-15257,-28999,-15257,-28999,-15257,-28999,-15257, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, - -29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, - -29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30107,-12935,-30107,-12935,-30107,-12935,-30107,-12935, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30435,-12143,-30435,-12143,-30435,-12143,-30435,-12143, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, - -30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, - -31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31294,-9717,-31294,-9717,-31294,-9717,-31294,-9717, - -31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, - -31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31759,-8066,-31759,-8066,-31759,-8066,-31759,-8066, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -31960,-7232,-31960,-7232,-31960,-7232,-31960,-7232, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, - -32294,-5550,-32294,-5550,-32294,-5550,-32294,-5550, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32428,-4702,-32428,-4702,-32428,-4702,-32428,-4702, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32630,-2999,-32630,-2999,-32630,-2999,-32630,-2999, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, - -32756,-858,-32756,-858,-32756,-858,-32756,-858, - -32765,-429,-32765,-429,-32765,-429,-32765,-429 - }; - -static int16_t twc960[239*2*4] = {32760,-644,32760,-644,32760,-644,32760,-644, - 32741,-1287,32741,-1287,32741,-1287,32741,-1287, - 32710,-1930,32710,-1930,32710,-1930,32710,-1930, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32539,-3852,32539,-3852,32539,-3852,32539,-3852, - 32457,-4490,32457,-4490,32457,-4490,32457,-4490, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32256,-5761,32256,-5761,32256,-5761,32256,-5761, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32005,-7023,32005,-7023,32005,-7023,32005,-7023, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31705,-8274,31705,-8274,31705,-8274,31705,-8274, - 31536,-8895,31536,-8895,31536,-8895,31536,-8895, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 30958,-10736,30958,-10736,30958,-10736,30958,-10736, - 30741,-11342,30741,-11342,30741,-11342,30741,-11342, - 30513,-11943,30513,-11943,30513,-11943,30513,-11943, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30020,-13132,30020,-13132,30020,-13132,30020,-13132, - 29757,-13719,29757,-13719,29757,-13719,29757,-13719, - 29482,-14300,29482,-14300,29482,-14300,29482,-14300, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28589,-16011,28589,-16011,28589,-16011,28589,-16011, - 28269,-16569,28269,-16569,28269,-16569,28269,-16569, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27596,-17666,27596,-17666,27596,-17666,27596,-17666, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26882,-18736,26882,-18736,26882,-18736,26882,-18736, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26125,-19777,26125,-19777,26125,-19777,26125,-19777, - 25732,-20286,25732,-20286,25732,-20286,25732,-20286, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24493,-21766,24493,-21766,24493,-21766,24493,-21766, - 24061,-22243,24061,-22243,24061,-22243,24061,-22243, - 23620,-22711,23620,-22711,23620,-22711,23620,-22711, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22710,-23621,22710,-23621,22710,-23621,22710,-23621, - 22242,-24062,22242,-24062,22242,-24062,22242,-24062, - 21765,-24494,21765,-24494,21765,-24494,21765,-24494, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20285,-25733,20285,-25733,20285,-25733,20285,-25733, - 19776,-26126,19776,-26126,19776,-26126,19776,-26126, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18735,-26883,18735,-26883,18735,-26883,18735,-26883, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17665,-27597,17665,-27597,17665,-27597,17665,-27597, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16568,-28270,16568,-28270,16568,-28270,16568,-28270, - 16010,-28590,16010,-28590,16010,-28590,16010,-28590, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14299,-29483,14299,-29483,14299,-29483,14299,-29483, - 13718,-29758,13718,-29758,13718,-29758,13718,-29758, - 13131,-30021,13131,-30021,13131,-30021,13131,-30021, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 11942,-30514,11942,-30514,11942,-30514,11942,-30514, - 11341,-30742,11341,-30742,11341,-30742,11341,-30742, - 10735,-30959,10735,-30959,10735,-30959,10735,-30959, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 8894,-31537,8894,-31537,8894,-31537,8894,-31537, - 8273,-31706,8273,-31706,8273,-31706,8273,-31706, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7022,-32006,7022,-32006,7022,-32006,7022,-32006, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5760,-32257,5760,-32257,5760,-32257,5760,-32257, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4489,-32458,4489,-32458,4489,-32458,4489,-32458, - 3851,-32540,3851,-32540,3851,-32540,3851,-32540, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 1929,-32711,1929,-32711,1929,-32711,1929,-32711, - 1286,-32742,1286,-32742,1286,-32742,1286,-32742, - 643,-32761,643,-32761,643,-32761,643,-32761, - 0,-32767,0,-32767,0,-32767,0,-32767, - -644,-32761,-644,-32761,-644,-32761,-644,-32761, - -1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, - -1930,-32711,-1930,-32711,-1930,-32711,-1930,-32711, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, - -4490,-32458,-4490,-32458,-4490,-32458,-4490,-32458, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5761,-32257,-5761,-32257,-5761,-32257,-5761,-32257, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -7023,-32006,-7023,-32006,-7023,-32006,-7023,-32006, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8274,-31706,-8274,-31706,-8274,-31706,-8274,-31706, - -8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10736,-30959,-10736,-30959,-10736,-30959,-10736,-30959, - -11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, - -11943,-30514,-11943,-30514,-11943,-30514,-11943,-30514, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13132,-30021,-13132,-30021,-13132,-30021,-13132,-30021, - -13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, - -14300,-29483,-14300,-29483,-14300,-29483,-14300,-29483, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, - -16569,-28270,-16569,-28270,-16569,-28270,-16569,-28270, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -17666,-27597,-17666,-27597,-17666,-27597,-17666,-27597, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -18736,-26883,-18736,-26883,-18736,-26883,-18736,-26883, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19777,-26126,-19777,-26126,-19777,-26126,-19777,-26126, - -20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, - -20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -21766,-24494,-21766,-24494,-21766,-24494,-21766,-24494, - -22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, - -22711,-23621,-22711,-23621,-22711,-23621,-22711,-23621, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23621,-22711,-23621,-22711,-23621,-22711,-23621,-22711, - -24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, - -24494,-21766,-24494,-21766,-24494,-21766,-24494,-21766, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, - -25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, - -26126,-19777,-26126,-19777,-26126,-19777,-26126,-19777, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26883,-18736,-26883,-18736,-26883,-18736,-26883,-18736, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27597,-17666,-27597,-17666,-27597,-17666,-27597,-17666, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28270,-16569,-28270,-16569,-28270,-16569,-28270,-16569, - -28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, - -28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29483,-14300,-29483,-14300,-29483,-14300,-29483,-14300, - -29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, - -30021,-13132,-30021,-13132,-30021,-13132,-30021,-13132, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30514,-11943,-30514,-11943,-30514,-11943,-30514,-11943, - -30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, - -30959,-10736,-30959,-10736,-30959,-10736,-30959,-10736, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, - -31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, - -31706,-8274,-31706,-8274,-31706,-8274,-31706,-8274, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -32006,-7023,-32006,-7023,-32006,-7023,-32006,-7023, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32257,-5761,-32257,-5761,-32257,-5761,-32257,-5761, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32458,-4490,-32458,-4490,-32458,-4490,-32458,-4490, - -32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, - -32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32711,-1930,-32711,-1930,-32711,-1930,-32711,-1930, - -32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, - -32761,-644,-32761,-644,-32761,-644,-32761,-644, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32761,643,-32761,643,-32761,643,-32761,643, - -32742,1286,-32742,1286,-32742,1286,-32742,1286, - -32711,1929,-32711,1929,-32711,1929,-32711,1929, - -32666,2570,-32666,2570,-32666,2570,-32666,2570, - -32610,3211,-32610,3211,-32610,3211,-32610,3211, - -32540,3851,-32540,3851,-32540,3851,-32540,3851, - -32458,4489,-32458,4489,-32458,4489,-32458,4489, - -32364,5125,-32364,5125,-32364,5125,-32364,5125, - -32257,5760,-32257,5760,-32257,5760,-32257,5760, - -32138,6392,-32138,6392,-32138,6392,-32138,6392, - -32006,7022,-32006,7022,-32006,7022,-32006,7022, - -31862,7649,-31862,7649,-31862,7649,-31862,7649, - -31706,8273,-31706,8273,-31706,8273,-31706,8273, - -31537,8894,-31537,8894,-31537,8894,-31537,8894, - -31357,9511,-31357,9511,-31357,9511,-31357,9511, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -30959,10735,-30959,10735,-30959,10735,-30959,10735, - -30742,11341,-30742,11341,-30742,11341,-30742,11341, - -30514,11942,-30514,11942,-30514,11942,-30514,11942, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -30021,13131,-30021,13131,-30021,13131,-30021,13131, - -29758,13718,-29758,13718,-29758,13718,-29758,13718, - -29483,14299,-29483,14299,-29483,14299,-29483,14299, - -29196,14875,-29196,14875,-29196,14875,-29196,14875, - -28898,15446,-28898,15446,-28898,15446,-28898,15446, - -28590,16010,-28590,16010,-28590,16010,-28590,16010, - -28270,16568,-28270,16568,-28270,16568,-28270,16568, - -27939,17120,-27939,17120,-27939,17120,-27939,17120, - -27597,17665,-27597,17665,-27597,17665,-27597,17665, - -27245,18204,-27245,18204,-27245,18204,-27245,18204, - -26883,18735,-26883,18735,-26883,18735,-26883,18735, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -26126,19776,-26126,19776,-26126,19776,-26126,19776, - -25733,20285,-25733,20285,-25733,20285,-25733,20285, - -25330,20787,-25330,20787,-25330,20787,-25330,20787, - -24917,21280,-24917,21280,-24917,21280,-24917,21280, - -24494,21765,-24494,21765,-24494,21765,-24494,21765, - -24062,22242,-24062,22242,-24062,22242,-24062,22242, - -23621,22710,-23621,22710,-23621,22710,-23621,22710, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22711,23620,-22711,23620,-22711,23620,-22711,23620, - -22243,24061,-22243,24061,-22243,24061,-22243,24061, - -21766,24493,-21766,24493,-21766,24493,-21766,24493, - -21281,24916,-21281,24916,-21281,24916,-21281,24916, - -20788,25329,-20788,25329,-20788,25329,-20788,25329, - -20286,25732,-20286,25732,-20286,25732,-20286,25732, - -19777,26125,-19777,26125,-19777,26125,-19777,26125, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18736,26882,-18736,26882,-18736,26882,-18736,26882, - -18205,27244,-18205,27244,-18205,27244,-18205,27244, - -17666,27596,-17666,27596,-17666,27596,-17666,27596, - -17121,27938,-17121,27938,-17121,27938,-17121,27938, - -16569,28269,-16569,28269,-16569,28269,-16569,28269, - -16011,28589,-16011,28589,-16011,28589,-16011,28589, - -15447,28897,-15447,28897,-15447,28897,-15447,28897, - -14876,29195,-14876,29195,-14876,29195,-14876,29195, - -14300,29482,-14300,29482,-14300,29482,-14300,29482, - -13719,29757,-13719,29757,-13719,29757,-13719,29757, - -13132,30020,-13132,30020,-13132,30020,-13132,30020, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -11943,30513,-11943,30513,-11943,30513,-11943,30513, - -11342,30741,-11342,30741,-11342,30741,-11342,30741, - -10736,30958,-10736,30958,-10736,30958,-10736,30958, - -10126,31163,-10126,31163,-10126,31163,-10126,31163, - -9512,31356,-9512,31356,-9512,31356,-9512,31356, - -8895,31536,-8895,31536,-8895,31536,-8895,31536, - -8274,31705,-8274,31705,-8274,31705,-8274,31705, - -7650,31861,-7650,31861,-7650,31861,-7650,31861, - -7023,32005,-7023,32005,-7023,32005,-7023,32005, - -6393,32137,-6393,32137,-6393,32137,-6393,32137, - -5761,32256,-5761,32256,-5761,32256,-5761,32256, - -5126,32363,-5126,32363,-5126,32363,-5126,32363, - -4490,32457,-4490,32457,-4490,32457,-4490,32457, - -3852,32539,-3852,32539,-3852,32539,-3852,32539, - -3212,32609,-3212,32609,-3212,32609,-3212,32609, - -2571,32665,-2571,32665,-2571,32665,-2571,32665, - -1930,32710,-1930,32710,-1930,32710,-1930,32710, - -1287,32741,-1287,32741,-1287,32741,-1287,32741, - -644,32760,-644,32760,-644,32760,-644,32760 - }; +static int16_t twa960[239*2*4]; +static int16_t twb960[239*2*4]; +static int16_t twc960[239*2*4]; + void dft960(int16_t *x,int16_t *y,unsigned char scale_flag) // 240 x 4 { @@ -15077,678 +8307,9 @@ void dft960(int16_t *x,int16_t *y,unsigned char scale_flag) // 240 x 4 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:323)/972)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:323)/972)); -twa2 = zeros(1,2*323); -twb2 = zeros(1,2*323); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa972[323*2*4] = {"); -for i=1:2:(2*322) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb972[323*2*4] = {"); -for i=1:2:(2*322) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa972[323*2*4] = {32766,-212,32766,-212,32766,-212,32766,-212, - 32764,-424,32764,-424,32764,-424,32764,-424, - 32760,-636,32760,-636,32760,-636,32760,-636, - 32756,-848,32756,-848,32756,-848,32756,-848, - 32749,-1059,32749,-1059,32749,-1059,32749,-1059, - 32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32733,-1483,32733,-1483,32733,-1483,32733,-1483, - 32723,-1694,32723,-1694,32723,-1694,32723,-1694, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32698,-2117,32698,-2117,32698,-2117,32698,-2117, - 32684,-2328,32684,-2328,32684,-2328,32684,-2328, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32651,-2751,32651,-2751,32651,-2751,32651,-2751, - 32632,-2962,32632,-2962,32632,-2962,32632,-2962, - 32613,-3173,32613,-3173,32613,-3173,32613,-3173, - 32591,-3383,32591,-3383,32591,-3383,32591,-3383, - 32569,-3594,32569,-3594,32569,-3594,32569,-3594, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32520,-4015,32520,-4015,32520,-4015,32520,-4015, - 32493,-4225,32493,-4225,32493,-4225,32493,-4225, - 32465,-4435,32465,-4435,32465,-4435,32465,-4435, - 32436,-4645,32436,-4645,32436,-4645,32436,-4645, - 32405,-4854,32405,-4854,32405,-4854,32405,-4854, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32340,-5273,32340,-5273,32340,-5273,32340,-5273, - 32305,-5482,32305,-5482,32305,-5482,32305,-5482, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32231,-5899,32231,-5899,32231,-5899,32231,-5899, - 32192,-6107,32192,-6107,32192,-6107,32192,-6107, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 32111,-6523,32111,-6523,32111,-6523,32111,-6523, - 32068,-6730,32068,-6730,32068,-6730,32068,-6730, - 32024,-6937,32024,-6937,32024,-6937,32024,-6937, - 31978,-7144,31978,-7144,31978,-7144,31978,-7144, - 31931,-7351,31931,-7351,31931,-7351,31931,-7351, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31834,-7763,31834,-7763,31834,-7763,31834,-7763, - 31783,-7969,31783,-7969,31783,-7969,31783,-7969, - 31731,-8174,31731,-8174,31731,-8174,31731,-8174, - 31677,-8379,31677,-8379,31677,-8379,31677,-8379, - 31622,-8583,31622,-8583,31622,-8583,31622,-8583, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31509,-8992,31509,-8992,31509,-8992,31509,-8992, - 31450,-9195,31450,-9195,31450,-9195,31450,-9195, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31329,-9601,31329,-9601,31329,-9601,31329,-9601, - 31266,-9803,31266,-9803,31266,-9803,31266,-9803, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 31136,-10207,31136,-10207,31136,-10207,31136,-10207, - 31070,-10408,31070,-10408,31070,-10408,31070,-10408, - 31002,-10608,31002,-10608,31002,-10608,31002,-10608, - 30933,-10808,30933,-10808,30933,-10808,30933,-10808, - 30862,-11008,30862,-11008,30862,-11008,30862,-11008, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30717,-11406,30717,-11406,30717,-11406,30717,-11406, - 30643,-11605,30643,-11605,30643,-11605,30643,-11605, - 30567,-11802,30567,-11802,30567,-11802,30567,-11802, - 30490,-12000,30490,-12000,30490,-12000,30490,-12000, - 30412,-12197,30412,-12197,30412,-12197,30412,-12197, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 30252,-12589,30252,-12589,30252,-12589,30252,-12589, - 30170,-12784,30170,-12784,30170,-12784,30170,-12784, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 30002,-13173,30002,-13173,30002,-13173,30002,-13173, - 29916,-13367,29916,-13367,29916,-13367,29916,-13367, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29741,-13752,29741,-13752,29741,-13752,29741,-13752, - 29652,-13944,29652,-13944,29652,-13944,29652,-13944, - 29561,-14136,29561,-14136,29561,-14136,29561,-14136, - 29469,-14327,29469,-14327,29469,-14327,29469,-14327, - 29376,-14517,29376,-14517,29376,-14517,29376,-14517, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29185,-14895,29185,-14895,29185,-14895,29185,-14895, - 29089,-15084,29089,-15084,29089,-15084,29089,-15084, - 28990,-15271,28990,-15271,28990,-15271,28990,-15271, - 28891,-15458,28891,-15458,28891,-15458,28891,-15458, - 28791,-15645,28791,-15645,28791,-15645,28791,-15645, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28586,-16016,28586,-16016,28586,-16016,28586,-16016, - 28482,-16200,28482,-16200,28482,-16200,28482,-16200, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28270,-16567,28270,-16567,28270,-16567,28270,-16567, - 28162,-16749,28162,-16749,28162,-16749,28162,-16749, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27943,-17112,27943,-17112,27943,-17112,27943,-17112, - 27832,-17292,27832,-17292,27832,-17292,27832,-17292, - 27720,-17472,27720,-17472,27720,-17472,27720,-17472, - 27606,-17651,27606,-17651,27606,-17651,27606,-17651, - 27492,-17829,27492,-17829,27492,-17829,27492,-17829, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27259,-18183,27259,-18183,27259,-18183,27259,-18183, - 27141,-18359,27141,-18359,27141,-18359,27141,-18359, - 27022,-18534,27022,-18534,27022,-18534,27022,-18534, - 26901,-18708,26901,-18708,26901,-18708,26901,-18708, - 26780,-18882,26780,-18882,26780,-18882,26780,-18882, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 26533,-19226,26533,-19226,26533,-19226,26533,-19226, - 26409,-19397,26409,-19397,26409,-19397,26409,-19397, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26156,-19737,26156,-19737,26156,-19737,26156,-19737, - 26028,-19906,26028,-19906,26028,-19906,26028,-19906, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25768,-20241,25768,-20241,25768,-20241,25768,-20241, - 25637,-20407,25637,-20407,25637,-20407,25637,-20407, - 25504,-20572,25504,-20572,25504,-20572,25504,-20572, - 25371,-20736,25371,-20736,25371,-20736,25371,-20736, - 25236,-20900,25236,-20900,25236,-20900,25236,-20900, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24964,-21225,24964,-21225,24964,-21225,24964,-21225, - 24826,-21385,24826,-21385,24826,-21385,24826,-21385, - 24687,-21546,24687,-21546,24687,-21546,24687,-21546, - 24548,-21705,24548,-21705,24548,-21705,24548,-21705, - 24407,-21863,24407,-21863,24407,-21863,24407,-21863, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 24122,-22177,24122,-22177,24122,-22177,24122,-22177, - 23978,-22332,23978,-22332,23978,-22332,23978,-22332, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23688,-22640,23688,-22640,23688,-22640,23688,-22640, - 23541,-22793,23541,-22793,23541,-22793,23541,-22793, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 23244,-23095,23244,-23095,23244,-23095,23244,-23095, - 23094,-23245,23094,-23245,23094,-23245,23094,-23245, - 22944,-23394,22944,-23394,22944,-23394,22944,-23394, - 22792,-23542,22792,-23542,22792,-23542,22792,-23542, - 22639,-23689,22639,-23689,22639,-23689,22639,-23689, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22331,-23979,22331,-23979,22331,-23979,22331,-23979, - 22176,-24123,22176,-24123,22176,-24123,22176,-24123, - 22019,-24266,22019,-24266,22019,-24266,22019,-24266, - 21862,-24408,21862,-24408,21862,-24408,21862,-24408, - 21704,-24549,21704,-24549,21704,-24549,21704,-24549, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 21384,-24827,21384,-24827,21384,-24827,21384,-24827, - 21224,-24965,21224,-24965,21224,-24965,21224,-24965, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20899,-25237,20899,-25237,20899,-25237,20899,-25237, - 20735,-25372,20735,-25372,20735,-25372,20735,-25372, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 20406,-25638,20406,-25638,20406,-25638,20406,-25638, - 20240,-25769,20240,-25769,20240,-25769,20240,-25769, - 20073,-25899,20073,-25899,20073,-25899,20073,-25899, - 19905,-26029,19905,-26029,19905,-26029,19905,-26029, - 19736,-26157,19736,-26157,19736,-26157,19736,-26157, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19396,-26410,19396,-26410,19396,-26410,19396,-26410, - 19225,-26534,19225,-26534,19225,-26534,19225,-26534, - 19053,-26658,19053,-26658,19053,-26658,19053,-26658, - 18881,-26781,18881,-26781,18881,-26781,18881,-26781, - 18707,-26902,18707,-26902,18707,-26902,18707,-26902, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 18358,-27142,18358,-27142,18358,-27142,18358,-27142, - 18182,-27260,18182,-27260,18182,-27260,18182,-27260, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17828,-27493,17828,-27493,17828,-27493,17828,-27493, - 17650,-27607,17650,-27607,17650,-27607,17650,-27607, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 17291,-27833,17291,-27833,17291,-27833,17291,-27833, - 17111,-27944,17111,-27944,17111,-27944,17111,-27944, - 16930,-28055,16930,-28055,16930,-28055,16930,-28055, - 16748,-28163,16748,-28163,16748,-28163,16748,-28163, - 16566,-28271,16566,-28271,16566,-28271,16566,-28271, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16199,-28483,16199,-28483,16199,-28483,16199,-28483, - 16015,-28587,16015,-28587,16015,-28587,16015,-28587, - 15830,-28690,15830,-28690,15830,-28690,15830,-28690, - 15644,-28792,15644,-28792,15644,-28792,15644,-28792, - 15457,-28892,15457,-28892,15457,-28892,15457,-28892, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 15083,-29090,15083,-29090,15083,-29090,15083,-29090, - 14894,-29186,14894,-29186,14894,-29186,14894,-29186, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14516,-29377,14516,-29377,14516,-29377,14516,-29377, - 14326,-29470,14326,-29470,14326,-29470,14326,-29470, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 13943,-29653,13943,-29653,13943,-29653,13943,-29653, - 13751,-29742,13751,-29742,13751,-29742,13751,-29742, - 13559,-29830,13559,-29830,13559,-29830,13559,-29830, - 13366,-29917,13366,-29917,13366,-29917,13366,-29917, - 13172,-30003,13172,-30003,13172,-30003,13172,-30003, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12783,-30171,12783,-30171,12783,-30171,12783,-30171, - 12588,-30253,12588,-30253,12588,-30253,12588,-30253, - 12392,-30334,12392,-30334,12392,-30334,12392,-30334, - 12196,-30413,12196,-30413,12196,-30413,12196,-30413, - 11999,-30491,11999,-30491,11999,-30491,11999,-30491, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 11604,-30644,11604,-30644,11604,-30644,11604,-30644, - 11405,-30718,11405,-30718,11405,-30718,11405,-30718, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 11007,-30863,11007,-30863,11007,-30863,11007,-30863, - 10807,-30934,10807,-30934,10807,-30934,10807,-30934, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 10407,-31071,10407,-31071,10407,-31071,10407,-31071, - 10206,-31137,10206,-31137,10206,-31137,10206,-31137, - 10004,-31203,10004,-31203,10004,-31203,10004,-31203, - 9802,-31267,9802,-31267,9802,-31267,9802,-31267, - 9600,-31330,9600,-31330,9600,-31330,9600,-31330, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9194,-31451,9194,-31451,9194,-31451,9194,-31451, - 8991,-31510,8991,-31510,8991,-31510,8991,-31510, - 8787,-31567,8787,-31567,8787,-31567,8787,-31567, - 8582,-31623,8582,-31623,8582,-31623,8582,-31623, - 8378,-31678,8378,-31678,8378,-31678,8378,-31678, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 7968,-31784,7968,-31784,7968,-31784,7968,-31784, - 7762,-31835,7762,-31835,7762,-31835,7762,-31835, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7350,-31932,7350,-31932,7350,-31932,7350,-31932, - 7143,-31979,7143,-31979,7143,-31979,7143,-31979, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 6729,-32069,6729,-32069,6729,-32069,6729,-32069, - 6522,-32112,6522,-32112,6522,-32112,6522,-32112, - 6314,-32153,6314,-32153,6314,-32153,6314,-32153, - 6106,-32193,6106,-32193,6106,-32193,6106,-32193, - 5898,-32232,5898,-32232,5898,-32232,5898,-32232, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5481,-32306,5481,-32306,5481,-32306,5481,-32306, - 5272,-32341,5272,-32341,5272,-32341,5272,-32341, - 5063,-32374,5063,-32374,5063,-32374,5063,-32374, - 4853,-32406,4853,-32406,4853,-32406,4853,-32406, - 4644,-32437,4644,-32437,4644,-32437,4644,-32437, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 4224,-32494,4224,-32494,4224,-32494,4224,-32494, - 4014,-32521,4014,-32521,4014,-32521,4014,-32521, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3593,-32570,3593,-32570,3593,-32570,3593,-32570, - 3382,-32592,3382,-32592,3382,-32592,3382,-32592, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 2961,-32633,2961,-32633,2961,-32633,2961,-32633, - 2750,-32652,2750,-32652,2750,-32652,2750,-32652, - 2539,-32669,2539,-32669,2539,-32669,2539,-32669, - 2327,-32685,2327,-32685,2327,-32685,2327,-32685, - 2116,-32699,2116,-32699,2116,-32699,2116,-32699, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1693,-32724,1693,-32724,1693,-32724,1693,-32724, - 1482,-32734,1482,-32734,1482,-32734,1482,-32734, - 1270,-32743,1270,-32743,1270,-32743,1270,-32743, - 1058,-32750,1058,-32750,1058,-32750,1058,-32750, - 847,-32757,847,-32757,847,-32757,847,-32757, - 635,-32761,635,-32761,635,-32761,635,-32761, - 423,-32765,423,-32765,423,-32765,423,-32765, - 211,-32767,211,-32767,211,-32767,211,-32767, - 0,-32767,0,-32767,0,-32767,0,-32767, - -212,-32767,-212,-32767,-212,-32767,-212,-32767, - -424,-32765,-424,-32765,-424,-32765,-424,-32765, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -848,-32757,-848,-32757,-848,-32757,-848,-32757, - -1059,-32750,-1059,-32750,-1059,-32750,-1059,-32750, - -1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, - -1483,-32734,-1483,-32734,-1483,-32734,-1483,-32734, - -1694,-32724,-1694,-32724,-1694,-32724,-1694,-32724, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2117,-32699,-2117,-32699,-2117,-32699,-2117,-32699, - -2328,-32685,-2328,-32685,-2328,-32685,-2328,-32685, - -2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, - -2751,-32652,-2751,-32652,-2751,-32652,-2751,-32652, - -2962,-32633,-2962,-32633,-2962,-32633,-2962,-32633, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -3383,-32592,-3383,-32592,-3383,-32592,-3383,-32592, - -3594,-32570,-3594,-32570,-3594,-32570,-3594,-32570, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4015,-32521,-4015,-32521,-4015,-32521,-4015,-32521, - -4225,-32494,-4225,-32494,-4225,-32494,-4225,-32494, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -4645,-32437,-4645,-32437,-4645,-32437,-4645,-32437, - -4854,-32406,-4854,-32406,-4854,-32406,-4854,-32406, - -5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, - -5273,-32341,-5273,-32341,-5273,-32341,-5273,-32341, - -5482,-32306,-5482,-32306,-5482,-32306,-5482,-32306, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -5899,-32232,-5899,-32232,-5899,-32232,-5899,-32232, - -6107,-32193,-6107,-32193,-6107,-32193,-6107,-32193, - -6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, - -6523,-32112,-6523,-32112,-6523,-32112,-6523,-32112, - -6730,-32069,-6730,-32069,-6730,-32069,-6730,-32069, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -7144,-31979,-7144,-31979,-7144,-31979,-7144,-31979, - -7351,-31932,-7351,-31932,-7351,-31932,-7351,-31932, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7763,-31835,-7763,-31835,-7763,-31835,-7763,-31835, - -7969,-31784,-7969,-31784,-7969,-31784,-7969,-31784, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -8379,-31678,-8379,-31678,-8379,-31678,-8379,-31678, - -8583,-31623,-8583,-31623,-8583,-31623,-8583,-31623, - -8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, - -8992,-31510,-8992,-31510,-8992,-31510,-8992,-31510, - -9195,-31451,-9195,-31451,-9195,-31451,-9195,-31451, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9601,-31330,-9601,-31330,-9601,-31330,-9601,-31330, - -9803,-31267,-9803,-31267,-9803,-31267,-9803,-31267, - -10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, - -10207,-31137,-10207,-31137,-10207,-31137,-10207,-31137, - -10408,-31071,-10408,-31071,-10408,-31071,-10408,-31071, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -10808,-30934,-10808,-30934,-10808,-30934,-10808,-30934, - -11008,-30863,-11008,-30863,-11008,-30863,-11008,-30863, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11406,-30718,-11406,-30718,-11406,-30718,-11406,-30718, - -11605,-30644,-11605,-30644,-11605,-30644,-11605,-30644, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12000,-30491,-12000,-30491,-12000,-30491,-12000,-30491, - -12197,-30413,-12197,-30413,-12197,-30413,-12197,-30413, - -12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, - -12589,-30253,-12589,-30253,-12589,-30253,-12589,-30253, - -12784,-30171,-12784,-30171,-12784,-30171,-12784,-30171, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13173,-30003,-13173,-30003,-13173,-30003,-13173,-30003, - -13367,-29917,-13367,-29917,-13367,-29917,-13367,-29917, - -13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, - -13752,-29742,-13752,-29742,-13752,-29742,-13752,-29742, - -13944,-29653,-13944,-29653,-13944,-29653,-13944,-29653, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -14327,-29470,-14327,-29470,-14327,-29470,-14327,-29470, - -14517,-29377,-14517,-29377,-14517,-29377,-14517,-29377, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -14895,-29186,-14895,-29186,-14895,-29186,-14895,-29186, - -15084,-29090,-15084,-29090,-15084,-29090,-15084,-29090, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -15458,-28892,-15458,-28892,-15458,-28892,-15458,-28892, - -15645,-28792,-15645,-28792,-15645,-28792,-15645,-28792, - -15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, - -16016,-28587,-16016,-28587,-16016,-28587,-16016,-28587, - -16200,-28483,-16200,-28483,-16200,-28483,-16200,-28483 - }; -static int16_t twb972[323*2*4] = {32764,-424,32764,-424,32764,-424,32764,-424, - 32756,-848,32756,-848,32756,-848,32756,-848, - 32742,-1271,32742,-1271,32742,-1271,32742,-1271, - 32723,-1694,32723,-1694,32723,-1694,32723,-1694, - 32698,-2117,32698,-2117,32698,-2117,32698,-2117, - 32668,-2540,32668,-2540,32668,-2540,32668,-2540, - 32632,-2962,32632,-2962,32632,-2962,32632,-2962, - 32591,-3383,32591,-3383,32591,-3383,32591,-3383, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32493,-4225,32493,-4225,32493,-4225,32493,-4225, - 32436,-4645,32436,-4645,32436,-4645,32436,-4645, - 32373,-5064,32373,-5064,32373,-5064,32373,-5064, - 32305,-5482,32305,-5482,32305,-5482,32305,-5482, - 32231,-5899,32231,-5899,32231,-5899,32231,-5899, - 32152,-6315,32152,-6315,32152,-6315,32152,-6315, - 32068,-6730,32068,-6730,32068,-6730,32068,-6730, - 31978,-7144,31978,-7144,31978,-7144,31978,-7144, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31783,-7969,31783,-7969,31783,-7969,31783,-7969, - 31677,-8379,31677,-8379,31677,-8379,31677,-8379, - 31566,-8788,31566,-8788,31566,-8788,31566,-8788, - 31450,-9195,31450,-9195,31450,-9195,31450,-9195, - 31329,-9601,31329,-9601,31329,-9601,31329,-9601, - 31202,-10005,31202,-10005,31202,-10005,31202,-10005, - 31070,-10408,31070,-10408,31070,-10408,31070,-10408, - 30933,-10808,30933,-10808,30933,-10808,30933,-10808, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30643,-11605,30643,-11605,30643,-11605,30643,-11605, - 30490,-12000,30490,-12000,30490,-12000,30490,-12000, - 30333,-12393,30333,-12393,30333,-12393,30333,-12393, - 30170,-12784,30170,-12784,30170,-12784,30170,-12784, - 30002,-13173,30002,-13173,30002,-13173,30002,-13173, - 29829,-13560,29829,-13560,29829,-13560,29829,-13560, - 29652,-13944,29652,-13944,29652,-13944,29652,-13944, - 29469,-14327,29469,-14327,29469,-14327,29469,-14327, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29089,-15084,29089,-15084,29089,-15084,29089,-15084, - 28891,-15458,28891,-15458,28891,-15458,28891,-15458, - 28689,-15831,28689,-15831,28689,-15831,28689,-15831, - 28482,-16200,28482,-16200,28482,-16200,28482,-16200, - 28270,-16567,28270,-16567,28270,-16567,28270,-16567, - 28054,-16931,28054,-16931,28054,-16931,28054,-16931, - 27832,-17292,27832,-17292,27832,-17292,27832,-17292, - 27606,-17651,27606,-17651,27606,-17651,27606,-17651, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27141,-18359,27141,-18359,27141,-18359,27141,-18359, - 26901,-18708,26901,-18708,26901,-18708,26901,-18708, - 26657,-19054,26657,-19054,26657,-19054,26657,-19054, - 26409,-19397,26409,-19397,26409,-19397,26409,-19397, - 26156,-19737,26156,-19737,26156,-19737,26156,-19737, - 25898,-20074,25898,-20074,25898,-20074,25898,-20074, - 25637,-20407,25637,-20407,25637,-20407,25637,-20407, - 25371,-20736,25371,-20736,25371,-20736,25371,-20736, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24826,-21385,24826,-21385,24826,-21385,24826,-21385, - 24548,-21705,24548,-21705,24548,-21705,24548,-21705, - 24265,-22020,24265,-22020,24265,-22020,24265,-22020, - 23978,-22332,23978,-22332,23978,-22332,23978,-22332, - 23688,-22640,23688,-22640,23688,-22640,23688,-22640, - 23393,-22945,23393,-22945,23393,-22945,23393,-22945, - 23094,-23245,23094,-23245,23094,-23245,23094,-23245, - 22792,-23542,22792,-23542,22792,-23542,22792,-23542, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22176,-24123,22176,-24123,22176,-24123,22176,-24123, - 21862,-24408,21862,-24408,21862,-24408,21862,-24408, - 21545,-24688,21545,-24688,21545,-24688,21545,-24688, - 21224,-24965,21224,-24965,21224,-24965,21224,-24965, - 20899,-25237,20899,-25237,20899,-25237,20899,-25237, - 20571,-25505,20571,-25505,20571,-25505,20571,-25505, - 20240,-25769,20240,-25769,20240,-25769,20240,-25769, - 19905,-26029,19905,-26029,19905,-26029,19905,-26029, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19225,-26534,19225,-26534,19225,-26534,19225,-26534, - 18881,-26781,18881,-26781,18881,-26781,18881,-26781, - 18533,-27023,18533,-27023,18533,-27023,18533,-27023, - 18182,-27260,18182,-27260,18182,-27260,18182,-27260, - 17828,-27493,17828,-27493,17828,-27493,17828,-27493, - 17471,-27721,17471,-27721,17471,-27721,17471,-27721, - 17111,-27944,17111,-27944,17111,-27944,17111,-27944, - 16748,-28163,16748,-28163,16748,-28163,16748,-28163, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16015,-28587,16015,-28587,16015,-28587,16015,-28587, - 15644,-28792,15644,-28792,15644,-28792,15644,-28792, - 15270,-28991,15270,-28991,15270,-28991,15270,-28991, - 14894,-29186,14894,-29186,14894,-29186,14894,-29186, - 14516,-29377,14516,-29377,14516,-29377,14516,-29377, - 14135,-29562,14135,-29562,14135,-29562,14135,-29562, - 13751,-29742,13751,-29742,13751,-29742,13751,-29742, - 13366,-29917,13366,-29917,13366,-29917,13366,-29917, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12588,-30253,12588,-30253,12588,-30253,12588,-30253, - 12196,-30413,12196,-30413,12196,-30413,12196,-30413, - 11801,-30568,11801,-30568,11801,-30568,11801,-30568, - 11405,-30718,11405,-30718,11405,-30718,11405,-30718, - 11007,-30863,11007,-30863,11007,-30863,11007,-30863, - 10607,-31003,10607,-31003,10607,-31003,10607,-31003, - 10206,-31137,10206,-31137,10206,-31137,10206,-31137, - 9802,-31267,9802,-31267,9802,-31267,9802,-31267, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 8991,-31510,8991,-31510,8991,-31510,8991,-31510, - 8582,-31623,8582,-31623,8582,-31623,8582,-31623, - 8173,-31732,8173,-31732,8173,-31732,8173,-31732, - 7762,-31835,7762,-31835,7762,-31835,7762,-31835, - 7350,-31932,7350,-31932,7350,-31932,7350,-31932, - 6936,-32025,6936,-32025,6936,-32025,6936,-32025, - 6522,-32112,6522,-32112,6522,-32112,6522,-32112, - 6106,-32193,6106,-32193,6106,-32193,6106,-32193, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5272,-32341,5272,-32341,5272,-32341,5272,-32341, - 4853,-32406,4853,-32406,4853,-32406,4853,-32406, - 4434,-32466,4434,-32466,4434,-32466,4434,-32466, - 4014,-32521,4014,-32521,4014,-32521,4014,-32521, - 3593,-32570,3593,-32570,3593,-32570,3593,-32570, - 3172,-32614,3172,-32614,3172,-32614,3172,-32614, - 2750,-32652,2750,-32652,2750,-32652,2750,-32652, - 2327,-32685,2327,-32685,2327,-32685,2327,-32685, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1482,-32734,1482,-32734,1482,-32734,1482,-32734, - 1058,-32750,1058,-32750,1058,-32750,1058,-32750, - 635,-32761,635,-32761,635,-32761,635,-32761, - 211,-32767,211,-32767,211,-32767,211,-32767, - -212,-32767,-212,-32767,-212,-32767,-212,-32767, - -636,-32761,-636,-32761,-636,-32761,-636,-32761, - -1059,-32750,-1059,-32750,-1059,-32750,-1059,-32750, - -1483,-32734,-1483,-32734,-1483,-32734,-1483,-32734, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2328,-32685,-2328,-32685,-2328,-32685,-2328,-32685, - -2751,-32652,-2751,-32652,-2751,-32652,-2751,-32652, - -3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, - -3594,-32570,-3594,-32570,-3594,-32570,-3594,-32570, - -4015,-32521,-4015,-32521,-4015,-32521,-4015,-32521, - -4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, - -4854,-32406,-4854,-32406,-4854,-32406,-4854,-32406, - -5273,-32341,-5273,-32341,-5273,-32341,-5273,-32341, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6107,-32193,-6107,-32193,-6107,-32193,-6107,-32193, - -6523,-32112,-6523,-32112,-6523,-32112,-6523,-32112, - -6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, - -7351,-31932,-7351,-31932,-7351,-31932,-7351,-31932, - -7763,-31835,-7763,-31835,-7763,-31835,-7763,-31835, - -8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, - -8583,-31623,-8583,-31623,-8583,-31623,-8583,-31623, - -8992,-31510,-8992,-31510,-8992,-31510,-8992,-31510, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9803,-31267,-9803,-31267,-9803,-31267,-9803,-31267, - -10207,-31137,-10207,-31137,-10207,-31137,-10207,-31137, - -10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, - -11008,-30863,-11008,-30863,-11008,-30863,-11008,-30863, - -11406,-30718,-11406,-30718,-11406,-30718,-11406,-30718, - -11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, - -12197,-30413,-12197,-30413,-12197,-30413,-12197,-30413, - -12589,-30253,-12589,-30253,-12589,-30253,-12589,-30253, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13367,-29917,-13367,-29917,-13367,-29917,-13367,-29917, - -13752,-29742,-13752,-29742,-13752,-29742,-13752,-29742, - -14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, - -14517,-29377,-14517,-29377,-14517,-29377,-14517,-29377, - -14895,-29186,-14895,-29186,-14895,-29186,-14895,-29186, - -15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, - -15645,-28792,-15645,-28792,-15645,-28792,-15645,-28792, - -16016,-28587,-16016,-28587,-16016,-28587,-16016,-28587, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16749,-28163,-16749,-28163,-16749,-28163,-16749,-28163, - -17112,-27944,-17112,-27944,-17112,-27944,-17112,-27944, - -17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, - -17829,-27493,-17829,-27493,-17829,-27493,-17829,-27493, - -18183,-27260,-18183,-27260,-18183,-27260,-18183,-27260, - -18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, - -18882,-26781,-18882,-26781,-18882,-26781,-18882,-26781, - -19226,-26534,-19226,-26534,-19226,-26534,-19226,-26534, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -19906,-26029,-19906,-26029,-19906,-26029,-19906,-26029, - -20241,-25769,-20241,-25769,-20241,-25769,-20241,-25769, - -20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, - -20900,-25237,-20900,-25237,-20900,-25237,-20900,-25237, - -21225,-24965,-21225,-24965,-21225,-24965,-21225,-24965, - -21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, - -21863,-24408,-21863,-24408,-21863,-24408,-21863,-24408, - -22177,-24123,-22177,-24123,-22177,-24123,-22177,-24123, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -22793,-23542,-22793,-23542,-22793,-23542,-22793,-23542, - -23095,-23245,-23095,-23245,-23095,-23245,-23095,-23245, - -23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, - -23689,-22640,-23689,-22640,-23689,-22640,-23689,-22640, - -23979,-22332,-23979,-22332,-23979,-22332,-23979,-22332, - -24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, - -24549,-21705,-24549,-21705,-24549,-21705,-24549,-21705, - -24827,-21385,-24827,-21385,-24827,-21385,-24827,-21385, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25372,-20736,-25372,-20736,-25372,-20736,-25372,-20736, - -25638,-20407,-25638,-20407,-25638,-20407,-25638,-20407, - -25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, - -26157,-19737,-26157,-19737,-26157,-19737,-26157,-19737, - -26410,-19397,-26410,-19397,-26410,-19397,-26410,-19397, - -26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, - -26902,-18708,-26902,-18708,-26902,-18708,-26902,-18708, - -27142,-18359,-27142,-18359,-27142,-18359,-27142,-18359, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27607,-17651,-27607,-17651,-27607,-17651,-27607,-17651, - -27833,-17292,-27833,-17292,-27833,-17292,-27833,-17292, - -28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, - -28271,-16567,-28271,-16567,-28271,-16567,-28271,-16567, - -28483,-16200,-28483,-16200,-28483,-16200,-28483,-16200, - -28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, - -28892,-15458,-28892,-15458,-28892,-15458,-28892,-15458, - -29090,-15084,-29090,-15084,-29090,-15084,-29090,-15084, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29470,-14327,-29470,-14327,-29470,-14327,-29470,-14327, - -29653,-13944,-29653,-13944,-29653,-13944,-29653,-13944, - -29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, - -30003,-13173,-30003,-13173,-30003,-13173,-30003,-13173, - -30171,-12784,-30171,-12784,-30171,-12784,-30171,-12784, - -30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, - -30491,-12000,-30491,-12000,-30491,-12000,-30491,-12000, - -30644,-11605,-30644,-11605,-30644,-11605,-30644,-11605, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30934,-10808,-30934,-10808,-30934,-10808,-30934,-10808, - -31071,-10408,-31071,-10408,-31071,-10408,-31071,-10408, - -31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, - -31330,-9601,-31330,-9601,-31330,-9601,-31330,-9601, - -31451,-9195,-31451,-9195,-31451,-9195,-31451,-9195, - -31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, - -31678,-8379,-31678,-8379,-31678,-8379,-31678,-8379, - -31784,-7969,-31784,-7969,-31784,-7969,-31784,-7969, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -31979,-7144,-31979,-7144,-31979,-7144,-31979,-7144, - -32069,-6730,-32069,-6730,-32069,-6730,-32069,-6730, - -32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, - -32232,-5899,-32232,-5899,-32232,-5899,-32232,-5899, - -32306,-5482,-32306,-5482,-32306,-5482,-32306,-5482, - -32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, - -32437,-4645,-32437,-4645,-32437,-4645,-32437,-4645, - -32494,-4225,-32494,-4225,-32494,-4225,-32494,-4225, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32592,-3383,-32592,-3383,-32592,-3383,-32592,-3383, - -32633,-2962,-32633,-2962,-32633,-2962,-32633,-2962, - -32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, - -32699,-2117,-32699,-2117,-32699,-2117,-32699,-2117, - -32724,-1694,-32724,-1694,-32724,-1694,-32724,-1694, - -32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, - -32757,-848,-32757,-848,-32757,-848,-32757,-848, - -32765,-424,-32765,-424,-32765,-424,-32765,-424, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32765,423,-32765,423,-32765,423,-32765,423, - -32757,847,-32757,847,-32757,847,-32757,847, - -32743,1270,-32743,1270,-32743,1270,-32743,1270, - -32724,1693,-32724,1693,-32724,1693,-32724,1693, - -32699,2116,-32699,2116,-32699,2116,-32699,2116, - -32669,2539,-32669,2539,-32669,2539,-32669,2539, - -32633,2961,-32633,2961,-32633,2961,-32633,2961, - -32592,3382,-32592,3382,-32592,3382,-32592,3382, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32494,4224,-32494,4224,-32494,4224,-32494,4224, - -32437,4644,-32437,4644,-32437,4644,-32437,4644, - -32374,5063,-32374,5063,-32374,5063,-32374,5063, - -32306,5481,-32306,5481,-32306,5481,-32306,5481, - -32232,5898,-32232,5898,-32232,5898,-32232,5898, - -32153,6314,-32153,6314,-32153,6314,-32153,6314, - -32069,6729,-32069,6729,-32069,6729,-32069,6729, - -31979,7143,-31979,7143,-31979,7143,-31979,7143, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31784,7968,-31784,7968,-31784,7968,-31784,7968, - -31678,8378,-31678,8378,-31678,8378,-31678,8378, - -31567,8787,-31567,8787,-31567,8787,-31567,8787, - -31451,9194,-31451,9194,-31451,9194,-31451,9194, - -31330,9600,-31330,9600,-31330,9600,-31330,9600, - -31203,10004,-31203,10004,-31203,10004,-31203,10004, - -31071,10407,-31071,10407,-31071,10407,-31071,10407, - -30934,10807,-30934,10807,-30934,10807,-30934,10807, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30644,11604,-30644,11604,-30644,11604,-30644,11604, - -30491,11999,-30491,11999,-30491,11999,-30491,11999, - -30334,12392,-30334,12392,-30334,12392,-30334,12392, - -30171,12783,-30171,12783,-30171,12783,-30171,12783, - -30003,13172,-30003,13172,-30003,13172,-30003,13172, - -29830,13559,-29830,13559,-29830,13559,-29830,13559, - -29653,13943,-29653,13943,-29653,13943,-29653,13943, - -29470,14326,-29470,14326,-29470,14326,-29470,14326, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -29090,15083,-29090,15083,-29090,15083,-29090,15083, - -28892,15457,-28892,15457,-28892,15457,-28892,15457, - -28690,15830,-28690,15830,-28690,15830,-28690,15830, - -28483,16199,-28483,16199,-28483,16199,-28483,16199, - -28271,16566,-28271,16566,-28271,16566,-28271,16566, - -28055,16930,-28055,16930,-28055,16930,-28055,16930, - -27833,17291,-27833,17291,-27833,17291,-27833,17291, - -27607,17650,-27607,17650,-27607,17650,-27607,17650, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -27142,18358,-27142,18358,-27142,18358,-27142,18358, - -26902,18707,-26902,18707,-26902,18707,-26902,18707, - -26658,19053,-26658,19053,-26658,19053,-26658,19053, - -26410,19396,-26410,19396,-26410,19396,-26410,19396, - -26157,19736,-26157,19736,-26157,19736,-26157,19736, - -25899,20073,-25899,20073,-25899,20073,-25899,20073, - -25638,20406,-25638,20406,-25638,20406,-25638,20406, - -25372,20735,-25372,20735,-25372,20735,-25372,20735, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24827,21384,-24827,21384,-24827,21384,-24827,21384, - -24549,21704,-24549,21704,-24549,21704,-24549,21704, - -24266,22019,-24266,22019,-24266,22019,-24266,22019, - -23979,22331,-23979,22331,-23979,22331,-23979,22331, - -23689,22639,-23689,22639,-23689,22639,-23689,22639, - -23394,22944,-23394,22944,-23394,22944,-23394,22944, - -23095,23244,-23095,23244,-23095,23244,-23095,23244, - -22793,23541,-22793,23541,-22793,23541,-22793,23541, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -22177,24122,-22177,24122,-22177,24122,-22177,24122, - -21863,24407,-21863,24407,-21863,24407,-21863,24407, - -21546,24687,-21546,24687,-21546,24687,-21546,24687, - -21225,24964,-21225,24964,-21225,24964,-21225,24964, - -20900,25236,-20900,25236,-20900,25236,-20900,25236, - -20572,25504,-20572,25504,-20572,25504,-20572,25504, - -20241,25768,-20241,25768,-20241,25768,-20241,25768, - -19906,26028,-19906,26028,-19906,26028,-19906,26028, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -19226,26533,-19226,26533,-19226,26533,-19226,26533, - -18882,26780,-18882,26780,-18882,26780,-18882,26780, - -18534,27022,-18534,27022,-18534,27022,-18534,27022, - -18183,27259,-18183,27259,-18183,27259,-18183,27259, - -17829,27492,-17829,27492,-17829,27492,-17829,27492, - -17472,27720,-17472,27720,-17472,27720,-17472,27720, - -17112,27943,-17112,27943,-17112,27943,-17112,27943, - -16749,28162,-16749,28162,-16749,28162,-16749,28162 - }; + +static int16_t twa972[323*2*4]; +static int16_t twb972[323*2*4]; void dft972(int16_t *x,int16_t *y,unsigned char scale_flag) // 324 x 3 { @@ -15798,750 +8359,8 @@ void dft972(int16_t *x,int16_t *y,unsigned char scale_flag) // 324 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:359)/1080)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:359)/1080)); -twa2 = zeros(1,2*359); -twb2 = zeros(1,2*359); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa1080[359*2*4] = {"); -for i=1:2:(2*358) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"static int16_t twb1080[359*2*4] = {"); -for i=1:2:(2*358) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fclose(fd); -*/ -static int16_t twa1080[359*2*4] = {32766,-191,32766,-191,32766,-191,32766,-191, - 32764,-382,32764,-382,32764,-382,32764,-382, - 32762,-572,32762,-572,32762,-572,32762,-572, - 32758,-763,32758,-763,32758,-763,32758,-763, - 32753,-954,32753,-954,32753,-954,32753,-954, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32739,-1335,32739,-1335,32739,-1335,32739,-1335, - 32731,-1525,32731,-1525,32731,-1525,32731,-1525, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32699,-2096,32699,-2096,32699,-2096,32699,-2096, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32673,-2476,32673,-2476,32673,-2476,32673,-2476, - 32658,-2666,32658,-2666,32658,-2666,32658,-2666, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32625,-3046,32625,-3046,32625,-3046,32625,-3046, - 32606,-3236,32606,-3236,32606,-3236,32606,-3236, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32567,-3615,32567,-3615,32567,-3615,32567,-3615, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32522,-3994,32522,-3994,32522,-3994,32522,-3994, - 32498,-4183,32498,-4183,32498,-4183,32498,-4183, - 32474,-4372,32474,-4372,32474,-4372,32474,-4372, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32421,-4749,32421,-4749,32421,-4749,32421,-4749, - 32392,-4938,32392,-4938,32392,-4938,32392,-4938, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32333,-5315,32333,-5315,32333,-5315,32333,-5315, - 32301,-5503,32301,-5503,32301,-5503,32301,-5503, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32235,-5878,32235,-5878,32235,-5878,32235,-5878, - 32200,-6066,32200,-6066,32200,-6066,32200,-6066, - 32164,-6253,32164,-6253,32164,-6253,32164,-6253, - 32128,-6440,32128,-6440,32128,-6440,32128,-6440, - 32090,-6627,32090,-6627,32090,-6627,32090,-6627, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 32010,-6999,32010,-6999,32010,-6999,32010,-6999, - 31969,-7186,31969,-7186,31969,-7186,31969,-7186, - 31927,-7371,31927,-7371,31927,-7371,31927,-7371, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31839,-7742,31839,-7742,31839,-7742,31839,-7742, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31747,-8112,31747,-8112,31747,-8112,31747,-8112, - 31699,-8297,31699,-8297,31699,-8297,31699,-8297, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31600,-8665,31600,-8665,31600,-8665,31600,-8665, - 31549,-8849,31549,-8849,31549,-8849,31549,-8849, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31444,-9215,31444,-9215,31444,-9215,31444,-9215, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31335,-9581,31335,-9581,31335,-9581,31335,-9581, - 31278,-9763,31278,-9763,31278,-9763,31278,-9763, - 31221,-9945,31221,-9945,31221,-9945,31221,-9945, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31103,-10307,31103,-10307,31103,-10307,31103,-10307, - 31043,-10488,31043,-10488,31043,-10488,31043,-10488, - 30981,-10668,30981,-10668,30981,-10668,30981,-10668, - 30919,-10848,30919,-10848,30919,-10848,30919,-10848, - 30855,-11028,30855,-11028,30855,-11028,30855,-11028, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30725,-11386,30725,-11386,30725,-11386,30725,-11386, - 30658,-11565,30658,-11565,30658,-11565,30658,-11565, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30521,-11921,30521,-11921,30521,-11921,30521,-11921, - 30451,-12098,30451,-12098,30451,-12098,30451,-12098, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30309,-12452,30309,-12452,30309,-12452,30309,-12452, - 30236,-12628,30236,-12628,30236,-12628,30236,-12628, - 30162,-12804,30162,-12804,30162,-12804,30162,-12804, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 30011,-13154,30011,-13154,30011,-13154,30011,-13154, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29856,-13502,29856,-13502,29856,-13502,29856,-13502, - 29777,-13675,29777,-13675,29777,-13675,29777,-13675, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29615,-14021,29615,-14021,29615,-14021,29615,-14021, - 29533,-14193,29533,-14193,29533,-14193,29533,-14193, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29366,-14536,29366,-14536,29366,-14536,29366,-14536, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29108,-15046,29108,-15046,29108,-15046,29108,-15046, - 29020,-15215,29020,-15215,29020,-15215,29020,-15215, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28841,-15552,28841,-15552,28841,-15552,28841,-15552, - 28750,-15719,28750,-15719,28750,-15719,28750,-15719, - 28658,-15886,28658,-15886,28658,-15886,28658,-15886, - 28565,-16053,28565,-16053,28565,-16053,28565,-16053, - 28471,-16219,28471,-16219,28471,-16219,28471,-16219, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28281,-16549,28281,-16549,28281,-16549,28281,-16549, - 28184,-16713,28184,-16713,28184,-16713,28184,-16713, - 28086,-16877,28086,-16877,28086,-16877,28086,-16877, - 27988,-17040,27988,-17040,27988,-17040,27988,-17040, - 27888,-17202,27888,-17202,27888,-17202,27888,-17202, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27686,-17526,27686,-17526,27686,-17526,27686,-17526, - 27584,-17687,27584,-17687,27584,-17687,27584,-17687, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27271,-18165,27271,-18165,27271,-18165,27271,-18165, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 27058,-18481,27058,-18481,27058,-18481,27058,-18481, - 26950,-18638,26950,-18638,26950,-18638,26950,-18638, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26731,-18951,26731,-18951,26731,-18951,26731,-18951, - 26620,-19106,26620,-19106,26620,-19106,26620,-19106, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26396,-19414,26396,-19414,26396,-19414,26396,-19414, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26168,-19720,26168,-19720,26168,-19720,26168,-19720, - 26053,-19872,26053,-19872,26053,-19872,26053,-19872, - 25937,-20023,25937,-20023,25937,-20023,25937,-20023, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25702,-20324,25702,-20324,25702,-20324,25702,-20324, - 25584,-20473,25584,-20473,25584,-20473,25584,-20473, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25344,-20769,25344,-20769,25344,-20769,25344,-20769, - 25223,-20916,25223,-20916,25223,-20916,25223,-20916, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24978,-21208,24978,-21208,24978,-21208,24978,-21208, - 24854,-21353,24854,-21353,24854,-21353,24854,-21353, - 24729,-21498,24729,-21498,24729,-21498,24729,-21498, - 24604,-21641,24604,-21641,24604,-21641,24604,-21641, - 24477,-21784,24477,-21784,24477,-21784,24477,-21784, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24222,-22067,24222,-22067,24222,-22067,24222,-22067, - 24093,-22208,24093,-22208,24093,-22208,24093,-22208, - 23964,-22348,23964,-22348,23964,-22348,23964,-22348, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23702,-22625,23702,-22625,23702,-22625,23702,-22625, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23437,-22899,23437,-22899,23437,-22899,23437,-22899, - 23304,-23035,23304,-23035,23304,-23035,23304,-23035, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 23034,-23305,23034,-23305,23034,-23305,23034,-23305, - 22898,-23438,22898,-23438,22898,-23438,22898,-23438, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22624,-23703,22624,-23703,22624,-23703,22624,-23703, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22347,-23965,22347,-23965,22347,-23965,22347,-23965, - 22207,-24094,22207,-24094,22207,-24094,22207,-24094, - 22066,-24223,22066,-24223,22066,-24223,22066,-24223, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21783,-24478,21783,-24478,21783,-24478,21783,-24478, - 21640,-24605,21640,-24605,21640,-24605,21640,-24605, - 21497,-24730,21497,-24730,21497,-24730,21497,-24730, - 21352,-24855,21352,-24855,21352,-24855,21352,-24855, - 21207,-24979,21207,-24979,21207,-24979,21207,-24979, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20915,-25224,20915,-25224,20915,-25224,20915,-25224, - 20768,-25345,20768,-25345,20768,-25345,20768,-25345, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20472,-25585,20472,-25585,20472,-25585,20472,-25585, - 20323,-25703,20323,-25703,20323,-25703,20323,-25703, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 20022,-25938,20022,-25938,20022,-25938,20022,-25938, - 19871,-26054,19871,-26054,19871,-26054,19871,-26054, - 19719,-26169,19719,-26169,19719,-26169,19719,-26169, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19413,-26397,19413,-26397,19413,-26397,19413,-26397, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 19105,-26621,19105,-26621,19105,-26621,19105,-26621, - 18950,-26732,18950,-26732,18950,-26732,18950,-26732, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18637,-26951,18637,-26951,18637,-26951,18637,-26951, - 18480,-27059,18480,-27059,18480,-27059,18480,-27059, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 18164,-27272,18164,-27272,18164,-27272,18164,-27272, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17686,-27585,17686,-27585,17686,-27585,17686,-27585, - 17525,-27687,17525,-27687,17525,-27687,17525,-27687, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 17201,-27889,17201,-27889,17201,-27889,17201,-27889, - 17039,-27989,17039,-27989,17039,-27989,17039,-27989, - 16876,-28087,16876,-28087,16876,-28087,16876,-28087, - 16712,-28185,16712,-28185,16712,-28185,16712,-28185, - 16548,-28282,16548,-28282,16548,-28282,16548,-28282, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16218,-28472,16218,-28472,16218,-28472,16218,-28472, - 16052,-28566,16052,-28566,16052,-28566,16052,-28566, - 15885,-28659,15885,-28659,15885,-28659,15885,-28659, - 15718,-28751,15718,-28751,15718,-28751,15718,-28751, - 15551,-28842,15551,-28842,15551,-28842,15551,-28842, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 15214,-29021,15214,-29021,15214,-29021,15214,-29021, - 15045,-29109,15045,-29109,15045,-29109,15045,-29109, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14535,-29367,14535,-29367,14535,-29367,14535,-29367, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 14192,-29534,14192,-29534,14192,-29534,14192,-29534, - 14020,-29616,14020,-29616,14020,-29616,14020,-29616, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13674,-29778,13674,-29778,13674,-29778,13674,-29778, - 13501,-29857,13501,-29857,13501,-29857,13501,-29857, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13153,-30012,13153,-30012,13153,-30012,13153,-30012, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12803,-30163,12803,-30163,12803,-30163,12803,-30163, - 12627,-30237,12627,-30237,12627,-30237,12627,-30237, - 12451,-30310,12451,-30310,12451,-30310,12451,-30310, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 12097,-30452,12097,-30452,12097,-30452,12097,-30452, - 11920,-30522,11920,-30522,11920,-30522,11920,-30522, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11564,-30659,11564,-30659,11564,-30659,11564,-30659, - 11385,-30726,11385,-30726,11385,-30726,11385,-30726, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 11027,-30856,11027,-30856,11027,-30856,11027,-30856, - 10847,-30920,10847,-30920,10847,-30920,10847,-30920, - 10667,-30982,10667,-30982,10667,-30982,10667,-30982, - 10487,-31044,10487,-31044,10487,-31044,10487,-31044, - 10306,-31104,10306,-31104,10306,-31104,10306,-31104, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9944,-31222,9944,-31222,9944,-31222,9944,-31222, - 9762,-31279,9762,-31279,9762,-31279,9762,-31279, - 9580,-31336,9580,-31336,9580,-31336,9580,-31336, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9214,-31445,9214,-31445,9214,-31445,9214,-31445, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8848,-31550,8848,-31550,8848,-31550,8848,-31550, - 8664,-31601,8664,-31601,8664,-31601,8664,-31601, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8296,-31700,8296,-31700,8296,-31700,8296,-31700, - 8111,-31748,8111,-31748,8111,-31748,8111,-31748, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7741,-31840,7741,-31840,7741,-31840,7741,-31840, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7370,-31928,7370,-31928,7370,-31928,7370,-31928, - 7185,-31970,7185,-31970,7185,-31970,7185,-31970, - 6998,-32011,6998,-32011,6998,-32011,6998,-32011, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6626,-32091,6626,-32091,6626,-32091,6626,-32091, - 6439,-32129,6439,-32129,6439,-32129,6439,-32129, - 6252,-32165,6252,-32165,6252,-32165,6252,-32165, - 6065,-32201,6065,-32201,6065,-32201,6065,-32201, - 5877,-32236,5877,-32236,5877,-32236,5877,-32236, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5502,-32302,5502,-32302,5502,-32302,5502,-32302, - 5314,-32334,5314,-32334,5314,-32334,5314,-32334, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4937,-32393,4937,-32393,4937,-32393,4937,-32393, - 4748,-32422,4748,-32422,4748,-32422,4748,-32422, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 4371,-32475,4371,-32475,4371,-32475,4371,-32475, - 4182,-32499,4182,-32499,4182,-32499,4182,-32499, - 3993,-32523,3993,-32523,3993,-32523,3993,-32523, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3614,-32568,3614,-32568,3614,-32568,3614,-32568, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3235,-32607,3235,-32607,3235,-32607,3235,-32607, - 3045,-32626,3045,-32626,3045,-32626,3045,-32626, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2665,-32659,2665,-32659,2665,-32659,2665,-32659, - 2475,-32674,2475,-32674,2475,-32674,2475,-32674, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 2095,-32700,2095,-32700,2095,-32700,2095,-32700, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1524,-32732,1524,-32732,1524,-32732,1524,-32732, - 1334,-32740,1334,-32740,1334,-32740,1334,-32740, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 953,-32754,953,-32754,953,-32754,953,-32754, - 762,-32759,762,-32759,762,-32759,762,-32759, - 571,-32763,571,-32763,571,-32763,571,-32763, - 381,-32765,381,-32765,381,-32765,381,-32765, - 190,-32767,190,-32767,190,-32767,190,-32767, - 0,-32767,0,-32767,0,-32767,0,-32767, - -191,-32767,-191,-32767,-191,-32767,-191,-32767, - -382,-32765,-382,-32765,-382,-32765,-382,-32765, - -572,-32763,-572,-32763,-572,-32763,-572,-32763, - -763,-32759,-763,-32759,-763,-32759,-763,-32759, - -954,-32754,-954,-32754,-954,-32754,-954,-32754, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1335,-32740,-1335,-32740,-1335,-32740,-1335,-32740, - -1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2096,-32700,-2096,-32700,-2096,-32700,-2096,-32700, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2476,-32674,-2476,-32674,-2476,-32674,-2476,-32674, - -2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, - -3236,-32607,-3236,-32607,-3236,-32607,-3236,-32607, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3615,-32568,-3615,-32568,-3615,-32568,-3615,-32568, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, - -4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, - -4372,-32475,-4372,-32475,-4372,-32475,-4372,-32475, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, - -4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, - -5503,-32302,-5503,-32302,-5503,-32302,-5503,-32302, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -5878,-32236,-5878,-32236,-5878,-32236,-5878,-32236, - -6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, - -6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, - -6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, - -6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -6999,-32011,-6999,-32011,-6999,-32011,-6999,-32011, - -7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, - -7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7742,-31840,-7742,-31840,-7742,-31840,-7742,-31840, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8112,-31748,-8112,-31748,-8112,-31748,-8112,-31748, - -8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, - -8849,-31550,-8849,-31550,-8849,-31550,-8849,-31550, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9215,-31445,-9215,-31445,-9215,-31445,-9215,-31445, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, - -9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, - -9945,-31222,-9945,-31222,-9945,-31222,-9945,-31222, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, - -10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, - -10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, - -10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, - -11028,-30856,-11028,-30856,-11028,-30856,-11028,-30856, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11386,-30726,-11386,-30726,-11386,-30726,-11386,-30726, - -11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, - -12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12452,-30310,-12452,-30310,-12452,-30310,-12452,-30310, - -12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, - -12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13154,-30012,-13154,-30012,-13154,-30012,-13154,-30012, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13502,-29857,-13502,-29857,-13502,-29857,-13502,-29857, - -13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, - -14193,-29534,-14193,-29534,-14193,-29534,-14193,-29534, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14536,-29367,-14536,-29367,-14536,-29367,-14536,-29367, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, - -15215,-29021,-15215,-29021,-15215,-29021,-15215,-29021, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, - -15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, - -15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659, - -16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566, - -16219,-28472,-16219,-28472,-16219,-28472,-16219,-28472 - }; -static int16_t twb1080[359*2*4] = {32764,-382,32764,-382,32764,-382,32764,-382, - 32758,-763,32758,-763,32758,-763,32758,-763, - 32747,-1144,32747,-1144,32747,-1144,32747,-1144, - 32731,-1525,32731,-1525,32731,-1525,32731,-1525, - 32711,-1906,32711,-1906,32711,-1906,32711,-1906, - 32687,-2286,32687,-2286,32687,-2286,32687,-2286, - 32658,-2666,32658,-2666,32658,-2666,32658,-2666, - 32625,-3046,32625,-3046,32625,-3046,32625,-3046, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32545,-3805,32545,-3805,32545,-3805,32545,-3805, - 32498,-4183,32498,-4183,32498,-4183,32498,-4183, - 32448,-4561,32448,-4561,32448,-4561,32448,-4561, - 32392,-4938,32392,-4938,32392,-4938,32392,-4938, - 32333,-5315,32333,-5315,32333,-5315,32333,-5315, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32200,-6066,32200,-6066,32200,-6066,32200,-6066, - 32128,-6440,32128,-6440,32128,-6440,32128,-6440, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31969,-7186,31969,-7186,31969,-7186,31969,-7186, - 31883,-7557,31883,-7557,31883,-7557,31883,-7557, - 31793,-7928,31793,-7928,31793,-7928,31793,-7928, - 31699,-8297,31699,-8297,31699,-8297,31699,-8297, - 31600,-8665,31600,-8665,31600,-8665,31600,-8665, - 31497,-9032,31497,-9032,31497,-9032,31497,-9032, - 31390,-9398,31390,-9398,31390,-9398,31390,-9398, - 31278,-9763,31278,-9763,31278,-9763,31278,-9763, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31043,-10488,31043,-10488,31043,-10488,31043,-10488, - 30919,-10848,30919,-10848,30919,-10848,30919,-10848, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30658,-11565,30658,-11565,30658,-11565,30658,-11565, - 30521,-11921,30521,-11921,30521,-11921,30521,-11921, - 30381,-12275,30381,-12275,30381,-12275,30381,-12275, - 30236,-12628,30236,-12628,30236,-12628,30236,-12628, - 30087,-12979,30087,-12979,30087,-12979,30087,-12979, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29777,-13675,29777,-13675,29777,-13675,29777,-13675, - 29615,-14021,29615,-14021,29615,-14021,29615,-14021, - 29450,-14365,29450,-14365,29450,-14365,29450,-14365, - 29281,-14706,29281,-14706,29281,-14706,29281,-14706, - 29108,-15046,29108,-15046,29108,-15046,29108,-15046, - 28931,-15384,28931,-15384,28931,-15384,28931,-15384, - 28750,-15719,28750,-15719,28750,-15719,28750,-15719, - 28565,-16053,28565,-16053,28565,-16053,28565,-16053, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28184,-16713,28184,-16713,28184,-16713,28184,-16713, - 27988,-17040,27988,-17040,27988,-17040,27988,-17040, - 27787,-17364,27787,-17364,27787,-17364,27787,-17364, - 27584,-17687,27584,-17687,27584,-17687,27584,-17687, - 27376,-18006,27376,-18006,27376,-18006,27376,-18006, - 27165,-18324,27165,-18324,27165,-18324,27165,-18324, - 26950,-18638,26950,-18638,26950,-18638,26950,-18638, - 26731,-18951,26731,-18951,26731,-18951,26731,-18951, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26283,-19568,26283,-19568,26283,-19568,26283,-19568, - 26053,-19872,26053,-19872,26053,-19872,26053,-19872, - 25820,-20174,25820,-20174,25820,-20174,25820,-20174, - 25584,-20473,25584,-20473,25584,-20473,25584,-20473, - 25344,-20769,25344,-20769,25344,-20769,25344,-20769, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24854,-21353,24854,-21353,24854,-21353,24854,-21353, - 24604,-21641,24604,-21641,24604,-21641,24604,-21641, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24093,-22208,24093,-22208,24093,-22208,24093,-22208, - 23833,-22487,23833,-22487,23833,-22487,23833,-22487, - 23570,-22762,23570,-22762,23570,-22762,23570,-22762, - 23304,-23035,23304,-23035,23304,-23035,23304,-23035, - 23034,-23305,23034,-23305,23034,-23305,23034,-23305, - 22761,-23571,22761,-23571,22761,-23571,22761,-23571, - 22486,-23834,22486,-23834,22486,-23834,22486,-23834, - 22207,-24094,22207,-24094,22207,-24094,22207,-24094, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21640,-24605,21640,-24605,21640,-24605,21640,-24605, - 21352,-24855,21352,-24855,21352,-24855,21352,-24855, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20768,-25345,20768,-25345,20768,-25345,20768,-25345, - 20472,-25585,20472,-25585,20472,-25585,20472,-25585, - 20173,-25821,20173,-25821,20173,-25821,20173,-25821, - 19871,-26054,19871,-26054,19871,-26054,19871,-26054, - 19567,-26284,19567,-26284,19567,-26284,19567,-26284, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18950,-26732,18950,-26732,18950,-26732,18950,-26732, - 18637,-26951,18637,-26951,18637,-26951,18637,-26951, - 18323,-27166,18323,-27166,18323,-27166,18323,-27166, - 18005,-27377,18005,-27377,18005,-27377,18005,-27377, - 17686,-27585,17686,-27585,17686,-27585,17686,-27585, - 17363,-27788,17363,-27788,17363,-27788,17363,-27788, - 17039,-27989,17039,-27989,17039,-27989,17039,-27989, - 16712,-28185,16712,-28185,16712,-28185,16712,-28185, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16052,-28566,16052,-28566,16052,-28566,16052,-28566, - 15718,-28751,15718,-28751,15718,-28751,15718,-28751, - 15383,-28932,15383,-28932,15383,-28932,15383,-28932, - 15045,-29109,15045,-29109,15045,-29109,15045,-29109, - 14705,-29282,14705,-29282,14705,-29282,14705,-29282, - 14364,-29451,14364,-29451,14364,-29451,14364,-29451, - 14020,-29616,14020,-29616,14020,-29616,14020,-29616, - 13674,-29778,13674,-29778,13674,-29778,13674,-29778, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 12978,-30088,12978,-30088,12978,-30088,12978,-30088, - 12627,-30237,12627,-30237,12627,-30237,12627,-30237, - 12274,-30382,12274,-30382,12274,-30382,12274,-30382, - 11920,-30522,11920,-30522,11920,-30522,11920,-30522, - 11564,-30659,11564,-30659,11564,-30659,11564,-30659, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10847,-30920,10847,-30920,10847,-30920,10847,-30920, - 10487,-31044,10487,-31044,10487,-31044,10487,-31044, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9762,-31279,9762,-31279,9762,-31279,9762,-31279, - 9397,-31391,9397,-31391,9397,-31391,9397,-31391, - 9031,-31498,9031,-31498,9031,-31498,9031,-31498, - 8664,-31601,8664,-31601,8664,-31601,8664,-31601, - 8296,-31700,8296,-31700,8296,-31700,8296,-31700, - 7927,-31794,7927,-31794,7927,-31794,7927,-31794, - 7556,-31884,7556,-31884,7556,-31884,7556,-31884, - 7185,-31970,7185,-31970,7185,-31970,7185,-31970, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6439,-32129,6439,-32129,6439,-32129,6439,-32129, - 6065,-32201,6065,-32201,6065,-32201,6065,-32201, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5314,-32334,5314,-32334,5314,-32334,5314,-32334, - 4937,-32393,4937,-32393,4937,-32393,4937,-32393, - 4560,-32449,4560,-32449,4560,-32449,4560,-32449, - 4182,-32499,4182,-32499,4182,-32499,4182,-32499, - 3804,-32546,3804,-32546,3804,-32546,3804,-32546, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3045,-32626,3045,-32626,3045,-32626,3045,-32626, - 2665,-32659,2665,-32659,2665,-32659,2665,-32659, - 2285,-32688,2285,-32688,2285,-32688,2285,-32688, - 1905,-32712,1905,-32712,1905,-32712,1905,-32712, - 1524,-32732,1524,-32732,1524,-32732,1524,-32732, - 1143,-32748,1143,-32748,1143,-32748,1143,-32748, - 762,-32759,762,-32759,762,-32759,762,-32759, - 381,-32765,381,-32765,381,-32765,381,-32765, - 0,-32767,0,-32767,0,-32767,0,-32767, - -382,-32765,-382,-32765,-382,-32765,-382,-32765, - -763,-32759,-763,-32759,-763,-32759,-763,-32759, - -1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, - -1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, - -1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, - -2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, - -2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, - -3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, - -4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, - -4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, - -4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, - -5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, - -6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, - -7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, - -7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, - -8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, - -8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, - -9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, - -9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, - -9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, - -10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, - -11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, - -12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, - -12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, - -12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, - -14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, - -14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, - -14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, - -15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, - -15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, - -15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, - -16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16713,-28185,-16713,-28185,-16713,-28185,-16713,-28185, - -17040,-27989,-17040,-27989,-17040,-27989,-17040,-27989, - -17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, - -17687,-27585,-17687,-27585,-17687,-27585,-17687,-27585, - -18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, - -18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, - -18638,-26951,-18638,-26951,-18638,-26951,-18638,-26951, - -18951,-26732,-18951,-26732,-18951,-26732,-18951,-26732, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, - -19872,-26054,-19872,-26054,-19872,-26054,-19872,-26054, - -20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, - -20473,-25585,-20473,-25585,-20473,-25585,-20473,-25585, - -20769,-25345,-20769,-25345,-20769,-25345,-20769,-25345, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21353,-24855,-21353,-24855,-21353,-24855,-21353,-24855, - -21641,-24605,-21641,-24605,-21641,-24605,-21641,-24605, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22208,-24094,-22208,-24094,-22208,-24094,-22208,-24094, - -22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, - -22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, - -23035,-23305,-23035,-23305,-23035,-23305,-23035,-23305, - -23305,-23035,-23305,-23035,-23305,-23035,-23305,-23035, - -23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, - -23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, - -24094,-22208,-24094,-22208,-24094,-22208,-24094,-22208, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24605,-21641,-24605,-21641,-24605,-21641,-24605,-21641, - -24855,-21353,-24855,-21353,-24855,-21353,-24855,-21353, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25345,-20769,-25345,-20769,-25345,-20769,-25345,-20769, - -25585,-20473,-25585,-20473,-25585,-20473,-25585,-20473, - -25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, - -26054,-19872,-26054,-19872,-26054,-19872,-26054,-19872, - -26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26732,-18951,-26732,-18951,-26732,-18951,-26732,-18951, - -26951,-18638,-26951,-18638,-26951,-18638,-26951,-18638, - -27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, - -27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, - -27585,-17687,-27585,-17687,-27585,-17687,-27585,-17687, - -27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, - -27989,-17040,-27989,-17040,-27989,-17040,-27989,-17040, - -28185,-16713,-28185,-16713,-28185,-16713,-28185,-16713, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28566,-16053,-28566,-16053,-28566,-16053,-28566,-16053, - -28751,-15719,-28751,-15719,-28751,-15719,-28751,-15719, - -28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, - -29109,-15046,-29109,-15046,-29109,-15046,-29109,-15046, - -29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, - -29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, - -29616,-14021,-29616,-14021,-29616,-14021,-29616,-14021, - -29778,-13675,-29778,-13675,-29778,-13675,-29778,-13675, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, - -30237,-12628,-30237,-12628,-30237,-12628,-30237,-12628, - -30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, - -30522,-11921,-30522,-11921,-30522,-11921,-30522,-11921, - -30659,-11565,-30659,-11565,-30659,-11565,-30659,-11565, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30920,-10848,-30920,-10848,-30920,-10848,-30920,-10848, - -31044,-10488,-31044,-10488,-31044,-10488,-31044,-10488, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31279,-9763,-31279,-9763,-31279,-9763,-31279,-9763, - -31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, - -31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, - -31601,-8665,-31601,-8665,-31601,-8665,-31601,-8665, - -31700,-8297,-31700,-8297,-31700,-8297,-31700,-8297, - -31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, - -31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, - -31970,-7186,-31970,-7186,-31970,-7186,-31970,-7186, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32129,-6440,-32129,-6440,-32129,-6440,-32129,-6440, - -32201,-6066,-32201,-6066,-32201,-6066,-32201,-6066, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32334,-5315,-32334,-5315,-32334,-5315,-32334,-5315, - -32393,-4938,-32393,-4938,-32393,-4938,-32393,-4938, - -32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, - -32499,-4183,-32499,-4183,-32499,-4183,-32499,-4183, - -32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32626,-3046,-32626,-3046,-32626,-3046,-32626,-3046, - -32659,-2666,-32659,-2666,-32659,-2666,-32659,-2666, - -32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, - -32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, - -32732,-1525,-32732,-1525,-32732,-1525,-32732,-1525, - -32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, - -32759,-763,-32759,-763,-32759,-763,-32759,-763, - -32765,-382,-32765,-382,-32765,-382,-32765,-382, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32765,381,-32765,381,-32765,381,-32765,381, - -32759,762,-32759,762,-32759,762,-32759,762, - -32748,1143,-32748,1143,-32748,1143,-32748,1143, - -32732,1524,-32732,1524,-32732,1524,-32732,1524, - -32712,1905,-32712,1905,-32712,1905,-32712,1905, - -32688,2285,-32688,2285,-32688,2285,-32688,2285, - -32659,2665,-32659,2665,-32659,2665,-32659,2665, - -32626,3045,-32626,3045,-32626,3045,-32626,3045, - -32588,3425,-32588,3425,-32588,3425,-32588,3425, - -32546,3804,-32546,3804,-32546,3804,-32546,3804, - -32499,4182,-32499,4182,-32499,4182,-32499,4182, - -32449,4560,-32449,4560,-32449,4560,-32449,4560, - -32393,4937,-32393,4937,-32393,4937,-32393,4937, - -32334,5314,-32334,5314,-32334,5314,-32334,5314, - -32270,5689,-32270,5689,-32270,5689,-32270,5689, - -32201,6065,-32201,6065,-32201,6065,-32201,6065, - -32129,6439,-32129,6439,-32129,6439,-32129,6439, - -32051,6812,-32051,6812,-32051,6812,-32051,6812, - -31970,7185,-31970,7185,-31970,7185,-31970,7185, - -31884,7556,-31884,7556,-31884,7556,-31884,7556, - -31794,7927,-31794,7927,-31794,7927,-31794,7927, - -31700,8296,-31700,8296,-31700,8296,-31700,8296, - -31601,8664,-31601,8664,-31601,8664,-31601,8664, - -31498,9031,-31498,9031,-31498,9031,-31498,9031, - -31391,9397,-31391,9397,-31391,9397,-31391,9397, - -31279,9762,-31279,9762,-31279,9762,-31279,9762, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -31044,10487,-31044,10487,-31044,10487,-31044,10487, - -30920,10847,-30920,10847,-30920,10847,-30920,10847, - -30791,11206,-30791,11206,-30791,11206,-30791,11206, - -30659,11564,-30659,11564,-30659,11564,-30659,11564, - -30522,11920,-30522,11920,-30522,11920,-30522,11920, - -30382,12274,-30382,12274,-30382,12274,-30382,12274, - -30237,12627,-30237,12627,-30237,12627,-30237,12627, - -30088,12978,-30088,12978,-30088,12978,-30088,12978, - -29935,13327,-29935,13327,-29935,13327,-29935,13327, - -29778,13674,-29778,13674,-29778,13674,-29778,13674, - -29616,14020,-29616,14020,-29616,14020,-29616,14020, - -29451,14364,-29451,14364,-29451,14364,-29451,14364, - -29282,14705,-29282,14705,-29282,14705,-29282,14705, - -29109,15045,-29109,15045,-29109,15045,-29109,15045, - -28932,15383,-28932,15383,-28932,15383,-28932,15383, - -28751,15718,-28751,15718,-28751,15718,-28751,15718, - -28566,16052,-28566,16052,-28566,16052,-28566,16052, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -28185,16712,-28185,16712,-28185,16712,-28185,16712, - -27989,17039,-27989,17039,-27989,17039,-27989,17039, - -27788,17363,-27788,17363,-27788,17363,-27788,17363, - -27585,17686,-27585,17686,-27585,17686,-27585,17686, - -27377,18005,-27377,18005,-27377,18005,-27377,18005, - -27166,18323,-27166,18323,-27166,18323,-27166,18323, - -26951,18637,-26951,18637,-26951,18637,-26951,18637, - -26732,18950,-26732,18950,-26732,18950,-26732,18950, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -26284,19567,-26284,19567,-26284,19567,-26284,19567, - -26054,19871,-26054,19871,-26054,19871,-26054,19871, - -25821,20173,-25821,20173,-25821,20173,-25821,20173, - -25585,20472,-25585,20472,-25585,20472,-25585,20472, - -25345,20768,-25345,20768,-25345,20768,-25345,20768, - -25101,21062,-25101,21062,-25101,21062,-25101,21062, - -24855,21352,-24855,21352,-24855,21352,-24855,21352, - -24605,21640,-24605,21640,-24605,21640,-24605,21640, - -24351,21925,-24351,21925,-24351,21925,-24351,21925, - -24094,22207,-24094,22207,-24094,22207,-24094,22207, - -23834,22486,-23834,22486,-23834,22486,-23834,22486, - -23571,22761,-23571,22761,-23571,22761,-23571,22761, - -23305,23034,-23305,23034,-23305,23034,-23305,23034, - -23035,23304,-23035,23304,-23035,23304,-23035,23304, - -22762,23570,-22762,23570,-22762,23570,-22762,23570, - -22487,23833,-22487,23833,-22487,23833,-22487,23833, - -22208,24093,-22208,24093,-22208,24093,-22208,24093, - -21926,24350,-21926,24350,-21926,24350,-21926,24350, - -21641,24604,-21641,24604,-21641,24604,-21641,24604, - -21353,24854,-21353,24854,-21353,24854,-21353,24854, - -21063,25100,-21063,25100,-21063,25100,-21063,25100, - -20769,25344,-20769,25344,-20769,25344,-20769,25344, - -20473,25584,-20473,25584,-20473,25584,-20473,25584, - -20174,25820,-20174,25820,-20174,25820,-20174,25820, - -19872,26053,-19872,26053,-19872,26053,-19872,26053, - -19568,26283,-19568,26283,-19568,26283,-19568,26283, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18951,26731,-18951,26731,-18951,26731,-18951,26731, - -18638,26950,-18638,26950,-18638,26950,-18638,26950, - -18324,27165,-18324,27165,-18324,27165,-18324,27165, - -18006,27376,-18006,27376,-18006,27376,-18006,27376, - -17687,27584,-17687,27584,-17687,27584,-17687,27584, - -17364,27787,-17364,27787,-17364,27787,-17364,27787, - -17040,27988,-17040,27988,-17040,27988,-17040,27988, - -16713,28184,-16713,28184,-16713,28184,-16713,28184 - }; +static int16_t twa1080[359*2*4]; +static int16_t twb1080[359*2*4]; void dft1080(int16_t *x,int16_t *y,unsigned char scale_flag) // 360 x 3 { @@ -16591,906 +8410,9 @@ void dft1080(int16_t *x,int16_t *y,unsigned char scale_flag) // 360 x 3 }; -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:287)/1152)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:287)/1152)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:287)/1152)); -twa2 = zeros(1,2*287); -twb2 = zeros(1,2*287); -twc2 = zeros(1,2*287); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t twa1152[287*2*4] = {"); -for i=1:2:(2*286) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); -fprintf(fd,"\nstatic int16_t twb1152[287*2*4] = {"); -for i=1:2:(2*286) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); -fprintf(fd,"\nstatic int16_t twc1152[287*2*4] = {"); -for i=1:2:(2*286) - fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -end -i=i+2; -fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); -fclose(fd); -*/ -static int16_t twa1152[287*2*4] = {32766,-179,32766,-179,32766,-179,32766,-179, - 32765,-358,32765,-358,32765,-358,32765,-358, - 32762,-537,32762,-537,32762,-537,32762,-537, - 32759,-715,32759,-715,32759,-715,32759,-715, - 32754,-894,32754,-894,32754,-894,32754,-894, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32743,-1251,32743,-1251,32743,-1251,32743,-1251, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32727,-1608,32727,-1608,32727,-1608,32727,-1608, - 32718,-1787,32718,-1787,32718,-1787,32718,-1787, - 32708,-1965,32708,-1965,32708,-1965,32708,-1965, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32684,-2322,32684,-2322,32684,-2322,32684,-2322, - 32671,-2500,32671,-2500,32671,-2500,32671,-2500, - 32657,-2678,32657,-2678,32657,-2678,32657,-2678, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32626,-3034,32626,-3034,32626,-3034,32626,-3034, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32591,-3390,32591,-3390,32591,-3390,32591,-3390, - 32572,-3568,32572,-3568,32572,-3568,32572,-3568, - 32552,-3745,32552,-3745,32552,-3745,32552,-3745, - 32531,-3923,32531,-3923,32531,-3923,32531,-3923, - 32509,-4100,32509,-4100,32509,-4100,32509,-4100, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32462,-4455,32462,-4455,32462,-4455,32462,-4455, - 32438,-4632,32438,-4632,32438,-4632,32438,-4632, - 32412,-4808,32412,-4808,32412,-4808,32412,-4808, - 32385,-4985,32385,-4985,32385,-4985,32385,-4985, - 32357,-5162,32357,-5162,32357,-5162,32357,-5162, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32299,-5514,32299,-5514,32299,-5514,32299,-5514, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32237,-5866,32237,-5866,32237,-5866,32237,-5866, - 32205,-6042,32205,-6042,32205,-6042,32205,-6042, - 32171,-6218,32171,-6218,32171,-6218,32171,-6218, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32102,-6568,32102,-6568,32102,-6568,32102,-6568, - 32065,-6743,32065,-6743,32065,-6743,32065,-6743, - 32028,-6918,32028,-6918,32028,-6918,32028,-6918, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31951,-7267,31951,-7267,31951,-7267,31951,-7267, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31869,-7615,31869,-7615,31869,-7615,31869,-7615, - 31827,-7789,31827,-7789,31827,-7789,31827,-7789, - 31785,-7962,31785,-7962,31785,-7962,31785,-7962, - 31741,-8135,31741,-8135,31741,-8135,31741,-8135, - 31696,-8308,31696,-8308,31696,-8308,31696,-8308, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31603,-8654,31603,-8654,31603,-8654,31603,-8654, - 31556,-8826,31556,-8826,31556,-8826,31556,-8826, - 31507,-8998,31507,-8998,31507,-8998,31507,-8998, - 31457,-9170,31457,-9170,31457,-9170,31457,-9170, - 31407,-9341,31407,-9341,31407,-9341,31407,-9341, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31303,-9683,31303,-9683,31303,-9683,31303,-9683, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31196,-10024,31196,-10024,31196,-10024,31196,-10024, - 31141,-10194,31141,-10194,31141,-10194,31141,-10194, - 31085,-10364,31085,-10364,31085,-10364,31085,-10364, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30970,-10702,30970,-10702,30970,-10702,30970,-10702, - 30911,-10871,30911,-10871,30911,-10871,30911,-10871, - 30851,-11039,30851,-11039,30851,-11039,30851,-11039, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30729,-11375,30729,-11375,30729,-11375,30729,-11375, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30603,-11710,30603,-11710,30603,-11710,30603,-11710, - 30539,-11877,30539,-11877,30539,-11877,30539,-11877, - 30473,-12043,30473,-12043,30473,-12043,30473,-12043, - 30407,-12209,30407,-12209,30407,-12209,30407,-12209, - 30340,-12375,30340,-12375,30340,-12375,30340,-12375, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30203,-12705,30203,-12705,30203,-12705,30203,-12705, - 30134,-12869,30134,-12869,30134,-12869,30134,-12869, - 30063,-13034,30063,-13034,30063,-13034,30063,-13034, - 29992,-13197,29992,-13197,29992,-13197,29992,-13197, - 29919,-13361,29919,-13361,29919,-13361,29919,-13361, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29772,-13686,29772,-13686,29772,-13686,29772,-13686, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29621,-14010,29621,-14010,29621,-14010,29621,-14010, - 29544,-14172,29544,-14172,29544,-14172,29544,-14172, - 29466,-14332,29466,-14332,29466,-14332,29466,-14332, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29308,-14653,29308,-14653,29308,-14653,29308,-14653, - 29227,-14813,29227,-14813,29227,-14813,29227,-14813, - 29146,-14972,29146,-14972,29146,-14972,29146,-14972, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28981,-15289,28981,-15289,28981,-15289,28981,-15289, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28813,-15604,28813,-15604,28813,-15604,28813,-15604, - 28727,-15761,28727,-15761,28727,-15761,28727,-15761, - 28641,-15918,28641,-15918,28641,-15918,28641,-15918, - 28554,-16073,28554,-16073,28554,-16073,28554,-16073, - 28465,-16229,28465,-16229,28465,-16229,28465,-16229, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28287,-16539,28287,-16539,28287,-16539,28287,-16539, - 28196,-16693,28196,-16693,28196,-16693,28196,-16693, - 28105,-16846,28105,-16846,28105,-16846,28105,-16846, - 28012,-16999,28012,-16999,28012,-16999,28012,-16999, - 27919,-17152,27919,-17152,27919,-17152,27919,-17152, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27731,-17455,27731,-17455,27731,-17455,27731,-17455, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27538,-17757,27538,-17757,27538,-17757,27538,-17757, - 27441,-17907,27441,-17907,27441,-17907,27441,-17907, - 27343,-18056,27343,-18056,27343,-18056,27343,-18056, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27145,-18353,27145,-18353,27145,-18353,27145,-18353, - 27044,-18501,27044,-18501,27044,-18501,27044,-18501, - 26943,-18648,26943,-18648,26943,-18648,26943,-18648, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26738,-18941,26738,-18941,26738,-18941,26738,-18941, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26530,-19232,26530,-19232,26530,-19232,26530,-19232, - 26424,-19376,26424,-19376,26424,-19376,26424,-19376, - 26318,-19520,26318,-19520,26318,-19520,26318,-19520, - 26211,-19663,26211,-19663,26211,-19663,26211,-19663, - 26104,-19806,26104,-19806,26104,-19806,26104,-19806, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25886,-20089,25886,-20089,25886,-20089,25886,-20089, - 25776,-20230,25776,-20230,25776,-20230,25776,-20230, - 25665,-20370,25665,-20370,25665,-20370,25665,-20370, - 25554,-20510,25554,-20510,25554,-20510,25554,-20510, - 25442,-20649,25442,-20649,25442,-20649,25442,-20649, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 25215,-20926,25215,-20926,25215,-20926,25215,-20926, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24985,-21199,24985,-21199,24985,-21199,24985,-21199, - 24869,-21335,24869,-21335,24869,-21335,24869,-21335, - 24753,-21471,24753,-21471,24753,-21471,24753,-21471, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24517,-21739,24517,-21739,24517,-21739,24517,-21739, - 24398,-21873,24398,-21873,24398,-21873,24398,-21873, - 24278,-22005,24278,-22005,24278,-22005,24278,-22005, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 24037,-22269,24037,-22269,24037,-22269,24037,-22269, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23792,-22530,23792,-22530,23792,-22530,23792,-22530, - 23669,-22659,23669,-22659,23669,-22659,23669,-22659, - 23545,-22788,23545,-22788,23545,-22788,23545,-22788, - 23421,-22916,23421,-22916,23421,-22916,23421,-22916, - 23295,-23044,23295,-23044,23295,-23044,23295,-23044, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 23043,-23296,23043,-23296,23043,-23296,23043,-23296, - 22915,-23422,22915,-23422,22915,-23422,22915,-23422, - 22787,-23546,22787,-23546,22787,-23546,22787,-23546, - 22658,-23670,22658,-23670,22658,-23670,22658,-23670, - 22529,-23793,22529,-23793,22529,-23793,22529,-23793, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22268,-24038,22268,-24038,22268,-24038,22268,-24038, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 22004,-24279,22004,-24279,22004,-24279,22004,-24279, - 21872,-24399,21872,-24399,21872,-24399,21872,-24399, - 21738,-24518,21738,-24518,21738,-24518,21738,-24518, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21470,-24754,21470,-24754,21470,-24754,21470,-24754, - 21334,-24870,21334,-24870,21334,-24870,21334,-24870, - 21198,-24986,21198,-24986,21198,-24986,21198,-24986, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20925,-25216,20925,-25216,20925,-25216,20925,-25216, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20648,-25443,20648,-25443,20648,-25443,20648,-25443, - 20509,-25555,20509,-25555,20509,-25555,20509,-25555, - 20369,-25666,20369,-25666,20369,-25666,20369,-25666, - 20229,-25777,20229,-25777,20229,-25777,20229,-25777, - 20088,-25887,20088,-25887,20088,-25887,20088,-25887, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19805,-26105,19805,-26105,19805,-26105,19805,-26105, - 19662,-26212,19662,-26212,19662,-26212,19662,-26212, - 19519,-26319,19519,-26319,19519,-26319,19519,-26319, - 19375,-26425,19375,-26425,19375,-26425,19375,-26425, - 19231,-26531,19231,-26531,19231,-26531,19231,-26531, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18940,-26739,18940,-26739,18940,-26739,18940,-26739, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18647,-26944,18647,-26944,18647,-26944,18647,-26944, - 18500,-27045,18500,-27045,18500,-27045,18500,-27045, - 18352,-27146,18352,-27146,18352,-27146,18352,-27146, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 18055,-27344,18055,-27344,18055,-27344,18055,-27344, - 17906,-27442,17906,-27442,17906,-27442,17906,-27442, - 17756,-27539,17756,-27539,17756,-27539,17756,-27539, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17454,-27732,17454,-27732,17454,-27732,17454,-27732, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 17151,-27920,17151,-27920,17151,-27920,17151,-27920, - 16998,-28013,16998,-28013,16998,-28013,16998,-28013, - 16845,-28106,16845,-28106,16845,-28106,16845,-28106, - 16692,-28197,16692,-28197,16692,-28197,16692,-28197, - 16538,-28288,16538,-28288,16538,-28288,16538,-28288, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16228,-28466,16228,-28466,16228,-28466,16228,-28466, - 16072,-28555,16072,-28555,16072,-28555,16072,-28555, - 15917,-28642,15917,-28642,15917,-28642,15917,-28642, - 15760,-28728,15760,-28728,15760,-28728,15760,-28728, - 15603,-28814,15603,-28814,15603,-28814,15603,-28814, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 15288,-28982,15288,-28982,15288,-28982,15288,-28982, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14971,-29147,14971,-29147,14971,-29147,14971,-29147, - 14812,-29228,14812,-29228,14812,-29228,14812,-29228, - 14652,-29309,14652,-29309,14652,-29309,14652,-29309, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14331,-29467,14331,-29467,14331,-29467,14331,-29467, - 14171,-29545,14171,-29545,14171,-29545,14171,-29545, - 14009,-29622,14009,-29622,14009,-29622,14009,-29622, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13685,-29773,13685,-29773,13685,-29773,13685,-29773, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13360,-29920,13360,-29920,13360,-29920,13360,-29920, - 13196,-29993,13196,-29993,13196,-29993,13196,-29993, - 13033,-30064,13033,-30064,13033,-30064,13033,-30064, - 12868,-30135,12868,-30135,12868,-30135,12868,-30135, - 12704,-30204,12704,-30204,12704,-30204,12704,-30204, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12374,-30341,12374,-30341,12374,-30341,12374,-30341, - 12208,-30408,12208,-30408,12208,-30408,12208,-30408, - 12042,-30474,12042,-30474,12042,-30474,12042,-30474, - 11876,-30540,11876,-30540,11876,-30540,11876,-30540, - 11709,-30604,11709,-30604,11709,-30604,11709,-30604, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11374,-30730,11374,-30730,11374,-30730,11374,-30730, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 11038,-30852,11038,-30852,11038,-30852,11038,-30852, - 10870,-30912,10870,-30912,10870,-30912,10870,-30912, - 10701,-30971,10701,-30971,10701,-30971,10701,-30971, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10363,-31086,10363,-31086,10363,-31086,10363,-31086, - 10193,-31142,10193,-31142,10193,-31142,10193,-31142, - 10023,-31197,10023,-31197,10023,-31197,10023,-31197, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9682,-31304,9682,-31304,9682,-31304,9682,-31304, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 9340,-31408,9340,-31408,9340,-31408,9340,-31408, - 9169,-31458,9169,-31458,9169,-31458,9169,-31458, - 8997,-31508,8997,-31508,8997,-31508,8997,-31508, - 8825,-31557,8825,-31557,8825,-31557,8825,-31557, - 8653,-31604,8653,-31604,8653,-31604,8653,-31604, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8307,-31697,8307,-31697,8307,-31697,8307,-31697, - 8134,-31742,8134,-31742,8134,-31742,8134,-31742, - 7961,-31786,7961,-31786,7961,-31786,7961,-31786, - 7788,-31828,7788,-31828,7788,-31828,7788,-31828, - 7614,-31870,7614,-31870,7614,-31870,7614,-31870, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 7266,-31952,7266,-31952,7266,-31952,7266,-31952, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6917,-32029,6917,-32029,6917,-32029,6917,-32029, - 6742,-32066,6742,-32066,6742,-32066,6742,-32066, - 6567,-32103,6567,-32103,6567,-32103,6567,-32103, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 6217,-32172,6217,-32172,6217,-32172,6217,-32172, - 6041,-32206,6041,-32206,6041,-32206,6041,-32206, - 5865,-32238,5865,-32238,5865,-32238,5865,-32238, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5513,-32300,5513,-32300,5513,-32300,5513,-32300, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 5161,-32358,5161,-32358,5161,-32358,5161,-32358, - 4984,-32386,4984,-32386,4984,-32386,4984,-32386, - 4807,-32413,4807,-32413,4807,-32413,4807,-32413, - 4631,-32439,4631,-32439,4631,-32439,4631,-32439, - 4454,-32463,4454,-32463,4454,-32463,4454,-32463, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 4099,-32510,4099,-32510,4099,-32510,4099,-32510, - 3922,-32532,3922,-32532,3922,-32532,3922,-32532, - 3744,-32553,3744,-32553,3744,-32553,3744,-32553, - 3567,-32573,3567,-32573,3567,-32573,3567,-32573, - 3389,-32592,3389,-32592,3389,-32592,3389,-32592, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 3033,-32627,3033,-32627,3033,-32627,3033,-32627, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2677,-32658,2677,-32658,2677,-32658,2677,-32658, - 2499,-32672,2499,-32672,2499,-32672,2499,-32672, - 2321,-32685,2321,-32685,2321,-32685,2321,-32685, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1964,-32709,1964,-32709,1964,-32709,1964,-32709, - 1786,-32719,1786,-32719,1786,-32719,1786,-32719, - 1607,-32728,1607,-32728,1607,-32728,1607,-32728, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 1250,-32744,1250,-32744,1250,-32744,1250,-32744, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 893,-32755,893,-32755,893,-32755,893,-32755, - 714,-32760,714,-32760,714,-32760,714,-32760, - 536,-32763,536,-32763,536,-32763,536,-32763, - 357,-32766,357,-32766,357,-32766,357,-32766, - 178,-32767,178,-32767,178,-32767,178,-32767 - }; - -static int16_t twb1152[287*2*4] = {32765,-358,32765,-358,32765,-358,32765,-358, - 32759,-715,32759,-715,32759,-715,32759,-715, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32735,-1430,32735,-1430,32735,-1430,32735,-1430, - 32718,-1787,32718,-1787,32718,-1787,32718,-1787, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32671,-2500,32671,-2500,32671,-2500,32671,-2500, - 32642,-2856,32642,-2856,32642,-2856,32642,-2856, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32572,-3568,32572,-3568,32572,-3568,32572,-3568, - 32531,-3923,32531,-3923,32531,-3923,32531,-3923, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32438,-4632,32438,-4632,32438,-4632,32438,-4632, - 32385,-4985,32385,-4985,32385,-4985,32385,-4985, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32269,-5690,32269,-5690,32269,-5690,32269,-5690, - 32205,-6042,32205,-6042,32205,-6042,32205,-6042, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32065,-6743,32065,-6743,32065,-6743,32065,-6743, - 31990,-7093,31990,-7093,31990,-7093,31990,-7093, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31827,-7789,31827,-7789,31827,-7789,31827,-7789, - 31741,-8135,31741,-8135,31741,-8135,31741,-8135, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31556,-8826,31556,-8826,31556,-8826,31556,-8826, - 31457,-9170,31457,-9170,31457,-9170,31457,-9170, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31250,-9854,31250,-9854,31250,-9854,31250,-9854, - 31141,-10194,31141,-10194,31141,-10194,31141,-10194, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30911,-10871,30911,-10871,30911,-10871,30911,-10871, - 30790,-11207,30790,-11207,30790,-11207,30790,-11207, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30539,-11877,30539,-11877,30539,-11877,30539,-11877, - 30407,-12209,30407,-12209,30407,-12209,30407,-12209, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30134,-12869,30134,-12869,30134,-12869,30134,-12869, - 29992,-13197,29992,-13197,29992,-13197,29992,-13197, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29696,-13848,29696,-13848,29696,-13848,29696,-13848, - 29544,-14172,29544,-14172,29544,-14172,29544,-14172, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29227,-14813,29227,-14813,29227,-14813,29227,-14813, - 29064,-15131,29064,-15131,29064,-15131,29064,-15131, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28727,-15761,28727,-15761,28727,-15761,28727,-15761, - 28554,-16073,28554,-16073,28554,-16073,28554,-16073, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28196,-16693,28196,-16693,28196,-16693,28196,-16693, - 28012,-16999,28012,-16999,28012,-16999,28012,-16999, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27635,-17606,27635,-17606,27635,-17606,27635,-17606, - 27441,-17907,27441,-17907,27441,-17907,27441,-17907, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 27044,-18501,27044,-18501,27044,-18501,27044,-18501, - 26841,-18795,26841,-18795,26841,-18795,26841,-18795, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26424,-19376,26424,-19376,26424,-19376,26424,-19376, - 26211,-19663,26211,-19663,26211,-19663,26211,-19663, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25776,-20230,25776,-20230,25776,-20230,25776,-20230, - 25554,-20510,25554,-20510,25554,-20510,25554,-20510, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 25100,-21063,25100,-21063,25100,-21063,25100,-21063, - 24869,-21335,24869,-21335,24869,-21335,24869,-21335, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24398,-21873,24398,-21873,24398,-21873,24398,-21873, - 24158,-22138,24158,-22138,24158,-22138,24158,-22138, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23669,-22659,23669,-22659,23669,-22659,23669,-22659, - 23421,-22916,23421,-22916,23421,-22916,23421,-22916, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22915,-23422,22915,-23422,22915,-23422,22915,-23422, - 22658,-23670,22658,-23670,22658,-23670,22658,-23670, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22137,-24159,22137,-24159,22137,-24159,22137,-24159, - 21872,-24399,21872,-24399,21872,-24399,21872,-24399, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21334,-24870,21334,-24870,21334,-24870,21334,-24870, - 21062,-25101,21062,-25101,21062,-25101,21062,-25101, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20509,-25555,20509,-25555,20509,-25555,20509,-25555, - 20229,-25777,20229,-25777,20229,-25777,20229,-25777, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19662,-26212,19662,-26212,19662,-26212,19662,-26212, - 19375,-26425,19375,-26425,19375,-26425,19375,-26425, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18794,-26842,18794,-26842,18794,-26842,18794,-26842, - 18500,-27045,18500,-27045,18500,-27045,18500,-27045, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17906,-27442,17906,-27442,17906,-27442,17906,-27442, - 17605,-27636,17605,-27636,17605,-27636,17605,-27636, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 16998,-28013,16998,-28013,16998,-28013,16998,-28013, - 16692,-28197,16692,-28197,16692,-28197,16692,-28197, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16072,-28555,16072,-28555,16072,-28555,16072,-28555, - 15760,-28728,15760,-28728,15760,-28728,15760,-28728, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 15130,-29065,15130,-29065,15130,-29065,15130,-29065, - 14812,-29228,14812,-29228,14812,-29228,14812,-29228, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14171,-29545,14171,-29545,14171,-29545,14171,-29545, - 13847,-29697,13847,-29697,13847,-29697,13847,-29697, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13196,-29993,13196,-29993,13196,-29993,13196,-29993, - 12868,-30135,12868,-30135,12868,-30135,12868,-30135, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12208,-30408,12208,-30408,12208,-30408,12208,-30408, - 11876,-30540,11876,-30540,11876,-30540,11876,-30540, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11206,-30791,11206,-30791,11206,-30791,11206,-30791, - 10870,-30912,10870,-30912,10870,-30912,10870,-30912, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10193,-31142,10193,-31142,10193,-31142,10193,-31142, - 9853,-31251,9853,-31251,9853,-31251,9853,-31251, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 9169,-31458,9169,-31458,9169,-31458,9169,-31458, - 8825,-31557,8825,-31557,8825,-31557,8825,-31557, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8134,-31742,8134,-31742,8134,-31742,8134,-31742, - 7788,-31828,7788,-31828,7788,-31828,7788,-31828, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 7092,-31991,7092,-31991,7092,-31991,7092,-31991, - 6742,-32066,6742,-32066,6742,-32066,6742,-32066, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 6041,-32206,6041,-32206,6041,-32206,6041,-32206, - 5689,-32270,5689,-32270,5689,-32270,5689,-32270, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 4984,-32386,4984,-32386,4984,-32386,4984,-32386, - 4631,-32439,4631,-32439,4631,-32439,4631,-32439, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3922,-32532,3922,-32532,3922,-32532,3922,-32532, - 3567,-32573,3567,-32573,3567,-32573,3567,-32573, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2855,-32643,2855,-32643,2855,-32643,2855,-32643, - 2499,-32672,2499,-32672,2499,-32672,2499,-32672, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1786,-32719,1786,-32719,1786,-32719,1786,-32719, - 1429,-32736,1429,-32736,1429,-32736,1429,-32736, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 714,-32760,714,-32760,714,-32760,714,-32760, - 357,-32766,357,-32766,357,-32766,357,-32766, - 0,-32767,0,-32767,0,-32767,0,-32767, - -358,-32766,-358,-32766,-358,-32766,-358,-32766, - -715,-32760,-715,-32760,-715,-32760,-715,-32760, - -1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, - -1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, - -1787,-32719,-1787,-32719,-1787,-32719,-1787,-32719, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2500,-32672,-2500,-32672,-2500,-32672,-2500,-32672, - -2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, - -3923,-32532,-3923,-32532,-3923,-32532,-3923,-32532, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4632,-32439,-4632,-32439,-4632,-32439,-4632,-32439, - -4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, - -5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, - -5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, - -6042,-32206,-6042,-32206,-6042,-32206,-6042,-32206, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -6743,-32066,-6743,-32066,-6743,-32066,-6743,-32066, - -7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, - -7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, - -7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, - -8135,-31742,-8135,-31742,-8135,-31742,-8135,-31742, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8826,-31557,-8826,-31557,-8826,-31557,-8826,-31557, - -9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, - -10194,-31142,-10194,-31142,-10194,-31142,-10194,-31142, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -10871,-30912,-10871,-30912,-10871,-30912,-10871,-30912, - -11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, - -11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, - -11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, - -12209,-30408,-12209,-30408,-12209,-30408,-12209,-30408, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -12869,-30135,-12869,-30135,-12869,-30135,-12869,-30135, - -13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, - -13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, - -13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, - -14172,-29545,-14172,-29545,-14172,-29545,-14172,-29545, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -14813,-29228,-14813,-29228,-14813,-29228,-14813,-29228, - -15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, - -16073,-28555,-16073,-28555,-16073,-28555,-16073,-28555, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16693,-28197,-16693,-28197,-16693,-28197,-16693,-28197, - -16999,-28013,-16999,-28013,-16999,-28013,-16999,-28013, - -17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, - -17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, - -17907,-27442,-17907,-27442,-17907,-27442,-17907,-27442, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -18501,-27045,-18501,-27045,-18501,-27045,-18501,-27045, - -18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, - -19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, - -19376,-26425,-19376,-26425,-19376,-26425,-19376,-26425, - -19663,-26212,-19663,-26212,-19663,-26212,-19663,-26212, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20230,-25777,-20230,-25777,-20230,-25777,-20230,-25777, - -20510,-25555,-20510,-25555,-20510,-25555,-20510,-25555, - -20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, - -21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, - -21335,-24870,-21335,-24870,-21335,-24870,-21335,-24870, - -21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, - -21873,-24399,-21873,-24399,-21873,-24399,-21873,-24399, - -22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, - -22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, - -22659,-23670,-22659,-23670,-22659,-23670,-22659,-23670, - -22916,-23422,-22916,-23422,-22916,-23422,-22916,-23422, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23422,-22916,-23422,-22916,-23422,-22916,-23422,-22916, - -23670,-22659,-23670,-22659,-23670,-22659,-23670,-22659, - -23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, - -24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, - -24399,-21873,-24399,-21873,-24399,-21873,-24399,-21873, - -24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, - -24870,-21335,-24870,-21335,-24870,-21335,-24870,-21335, - -25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, - -25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, - -25555,-20510,-25555,-20510,-25555,-20510,-25555,-20510, - -25777,-20230,-25777,-20230,-25777,-20230,-25777,-20230, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26212,-19663,-26212,-19663,-26212,-19663,-26212,-19663, - -26425,-19376,-26425,-19376,-26425,-19376,-26425,-19376, - -26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, - -26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, - -27045,-18501,-27045,-18501,-27045,-18501,-27045,-18501, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27442,-17907,-27442,-17907,-27442,-17907,-27442,-17907, - -27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, - -27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, - -28013,-16999,-28013,-16999,-28013,-16999,-28013,-16999, - -28197,-16693,-28197,-16693,-28197,-16693,-28197,-16693, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28555,-16073,-28555,-16073,-28555,-16073,-28555,-16073, - -28728,-15761,-28728,-15761,-28728,-15761,-28728,-15761, - -28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, - -29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, - -29228,-14813,-29228,-14813,-29228,-14813,-29228,-14813, - -29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, - -29545,-14172,-29545,-14172,-29545,-14172,-29545,-14172, - -29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, - -29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, - -29993,-13197,-29993,-13197,-29993,-13197,-29993,-13197, - -30135,-12869,-30135,-12869,-30135,-12869,-30135,-12869, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30408,-12209,-30408,-12209,-30408,-12209,-30408,-12209, - -30540,-11877,-30540,-11877,-30540,-11877,-30540,-11877, - -30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, - -30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, - -30912,-10871,-30912,-10871,-30912,-10871,-30912,-10871, - -31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, - -31142,-10194,-31142,-10194,-31142,-10194,-31142,-10194, - -31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, - -31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, - -31458,-9170,-31458,-9170,-31458,-9170,-31458,-9170, - -31557,-8826,-31557,-8826,-31557,-8826,-31557,-8826, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31742,-8135,-31742,-8135,-31742,-8135,-31742,-8135, - -31828,-7789,-31828,-7789,-31828,-7789,-31828,-7789, - -31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, - -31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, - -32066,-6743,-32066,-6743,-32066,-6743,-32066,-6743, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32206,-6042,-32206,-6042,-32206,-6042,-32206,-6042, - -32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, - -32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, - -32386,-4985,-32386,-4985,-32386,-4985,-32386,-4985, - -32439,-4632,-32439,-4632,-32439,-4632,-32439,-4632, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32532,-3923,-32532,-3923,-32532,-3923,-32532,-3923, - -32573,-3568,-32573,-3568,-32573,-3568,-32573,-3568, - -32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, - -32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, - -32672,-2500,-32672,-2500,-32672,-2500,-32672,-2500, - -32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, - -32719,-1787,-32719,-1787,-32719,-1787,-32719,-1787, - -32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, - -32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073, - -32760,-715,-32760,-715,-32760,-715,-32760,-715, - -32766,-358,-32766,-358,-32766,-358,-32766,-358 - }; - -static int16_t twc1152[287*2*4] = {32762,-537,32762,-537,32762,-537,32762,-537, - 32749,-1073,32749,-1073,32749,-1073,32749,-1073, - 32727,-1608,32727,-1608,32727,-1608,32727,-1608, - 32696,-2144,32696,-2144,32696,-2144,32696,-2144, - 32657,-2678,32657,-2678,32657,-2678,32657,-2678, - 32609,-3212,32609,-3212,32609,-3212,32609,-3212, - 32552,-3745,32552,-3745,32552,-3745,32552,-3745, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32412,-4808,32412,-4808,32412,-4808,32412,-4808, - 32329,-5338,32329,-5338,32329,-5338,32329,-5338, - 32237,-5866,32237,-5866,32237,-5866,32237,-5866, - 32137,-6393,32137,-6393,32137,-6393,32137,-6393, - 32028,-6918,32028,-6918,32028,-6918,32028,-6918, - 31911,-7441,31911,-7441,31911,-7441,31911,-7441, - 31785,-7962,31785,-7962,31785,-7962,31785,-7962, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31507,-8998,31507,-8998,31507,-8998,31507,-8998, - 31356,-9512,31356,-9512,31356,-9512,31356,-9512, - 31196,-10024,31196,-10024,31196,-10024,31196,-10024, - 31028,-10533,31028,-10533,31028,-10533,31028,-10533, - 30851,-11039,30851,-11039,30851,-11039,30851,-11039, - 30666,-11543,30666,-11543,30666,-11543,30666,-11543, - 30473,-12043,30473,-12043,30473,-12043,30473,-12043, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30063,-13034,30063,-13034,30063,-13034,30063,-13034, - 29846,-13524,29846,-13524,29846,-13524,29846,-13524, - 29621,-14010,29621,-14010,29621,-14010,29621,-14010, - 29387,-14493,29387,-14493,29387,-14493,29387,-14493, - 29146,-14972,29146,-14972,29146,-14972,29146,-14972, - 28897,-15447,28897,-15447,28897,-15447,28897,-15447, - 28641,-15918,28641,-15918,28641,-15918,28641,-15918, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28105,-16846,28105,-16846,28105,-16846,28105,-16846, - 27825,-17304,27825,-17304,27825,-17304,27825,-17304, - 27538,-17757,27538,-17757,27538,-17757,27538,-17757, - 27244,-18205,27244,-18205,27244,-18205,27244,-18205, - 26943,-18648,26943,-18648,26943,-18648,26943,-18648, - 26634,-19087,26634,-19087,26634,-19087,26634,-19087, - 26318,-19520,26318,-19520,26318,-19520,26318,-19520, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25665,-20370,25665,-20370,25665,-20370,25665,-20370, - 25329,-20788,25329,-20788,25329,-20788,25329,-20788, - 24985,-21199,24985,-21199,24985,-21199,24985,-21199, - 24635,-21605,24635,-21605,24635,-21605,24635,-21605, - 24278,-22005,24278,-22005,24278,-22005,24278,-22005, - 23915,-22400,23915,-22400,23915,-22400,23915,-22400, - 23545,-22788,23545,-22788,23545,-22788,23545,-22788, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22787,-23546,22787,-23546,22787,-23546,22787,-23546, - 22399,-23916,22399,-23916,22399,-23916,22399,-23916, - 22004,-24279,22004,-24279,22004,-24279,22004,-24279, - 21604,-24636,21604,-24636,21604,-24636,21604,-24636, - 21198,-24986,21198,-24986,21198,-24986,21198,-24986, - 20787,-25330,20787,-25330,20787,-25330,20787,-25330, - 20369,-25666,20369,-25666,20369,-25666,20369,-25666, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19519,-26319,19519,-26319,19519,-26319,19519,-26319, - 19086,-26635,19086,-26635,19086,-26635,19086,-26635, - 18647,-26944,18647,-26944,18647,-26944,18647,-26944, - 18204,-27245,18204,-27245,18204,-27245,18204,-27245, - 17756,-27539,17756,-27539,17756,-27539,17756,-27539, - 17303,-27826,17303,-27826,17303,-27826,17303,-27826, - 16845,-28106,16845,-28106,16845,-28106,16845,-28106, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 15917,-28642,15917,-28642,15917,-28642,15917,-28642, - 15446,-28898,15446,-28898,15446,-28898,15446,-28898, - 14971,-29147,14971,-29147,14971,-29147,14971,-29147, - 14492,-29388,14492,-29388,14492,-29388,14492,-29388, - 14009,-29622,14009,-29622,14009,-29622,14009,-29622, - 13523,-29847,13523,-29847,13523,-29847,13523,-29847, - 13033,-30064,13033,-30064,13033,-30064,13033,-30064, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12042,-30474,12042,-30474,12042,-30474,12042,-30474, - 11542,-30667,11542,-30667,11542,-30667,11542,-30667, - 11038,-30852,11038,-30852,11038,-30852,11038,-30852, - 10532,-31029,10532,-31029,10532,-31029,10532,-31029, - 10023,-31197,10023,-31197,10023,-31197,10023,-31197, - 9511,-31357,9511,-31357,9511,-31357,9511,-31357, - 8997,-31508,8997,-31508,8997,-31508,8997,-31508, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 7961,-31786,7961,-31786,7961,-31786,7961,-31786, - 7440,-31912,7440,-31912,7440,-31912,7440,-31912, - 6917,-32029,6917,-32029,6917,-32029,6917,-32029, - 6392,-32138,6392,-32138,6392,-32138,6392,-32138, - 5865,-32238,5865,-32238,5865,-32238,5865,-32238, - 5337,-32330,5337,-32330,5337,-32330,5337,-32330, - 4807,-32413,4807,-32413,4807,-32413,4807,-32413, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 3744,-32553,3744,-32553,3744,-32553,3744,-32553, - 3211,-32610,3211,-32610,3211,-32610,3211,-32610, - 2677,-32658,2677,-32658,2677,-32658,2677,-32658, - 2143,-32697,2143,-32697,2143,-32697,2143,-32697, - 1607,-32728,1607,-32728,1607,-32728,1607,-32728, - 1072,-32750,1072,-32750,1072,-32750,1072,-32750, - 536,-32763,536,-32763,536,-32763,536,-32763, - 0,-32767,0,-32767,0,-32767,0,-32767, - -537,-32763,-537,-32763,-537,-32763,-537,-32763, - -1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, - -1608,-32728,-1608,-32728,-1608,-32728,-1608,-32728, - -2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, - -2678,-32658,-2678,-32658,-2678,-32658,-2678,-32658, - -3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, - -3745,-32553,-3745,-32553,-3745,-32553,-3745,-32553, - -4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, - -4808,-32413,-4808,-32413,-4808,-32413,-4808,-32413, - -5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, - -5866,-32238,-5866,-32238,-5866,-32238,-5866,-32238, - -6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, - -6918,-32029,-6918,-32029,-6918,-32029,-6918,-32029, - -7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, - -7962,-31786,-7962,-31786,-7962,-31786,-7962,-31786, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8998,-31508,-8998,-31508,-8998,-31508,-8998,-31508, - -9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, - -10024,-31197,-10024,-31197,-10024,-31197,-10024,-31197, - -10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, - -11039,-30852,-11039,-30852,-11039,-30852,-11039,-30852, - -11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, - -12043,-30474,-12043,-30474,-12043,-30474,-12043,-30474, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13034,-30064,-13034,-30064,-13034,-30064,-13034,-30064, - -13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, - -14010,-29622,-14010,-29622,-14010,-29622,-14010,-29622, - -14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, - -14972,-29147,-14972,-29147,-14972,-29147,-14972,-29147, - -15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, - -15918,-28642,-15918,-28642,-15918,-28642,-15918,-28642, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16846,-28106,-16846,-28106,-16846,-28106,-16846,-28106, - -17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, - -17757,-27539,-17757,-27539,-17757,-27539,-17757,-27539, - -18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, - -18648,-26944,-18648,-26944,-18648,-26944,-18648,-26944, - -19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, - -19520,-26319,-19520,-26319,-19520,-26319,-19520,-26319, - -19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, - -20370,-25666,-20370,-25666,-20370,-25666,-20370,-25666, - -20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, - -21199,-24986,-21199,-24986,-21199,-24986,-21199,-24986, - -21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, - -22005,-24279,-22005,-24279,-22005,-24279,-22005,-24279, - -22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, - -22788,-23546,-22788,-23546,-22788,-23546,-22788,-23546, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23546,-22788,-23546,-22788,-23546,-22788,-23546,-22788, - -23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, - -24279,-22005,-24279,-22005,-24279,-22005,-24279,-22005, - -24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, - -24986,-21199,-24986,-21199,-24986,-21199,-24986,-21199, - -25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, - -25666,-20370,-25666,-20370,-25666,-20370,-25666,-20370, - -25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, - -26319,-19520,-26319,-19520,-26319,-19520,-26319,-19520, - -26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, - -26944,-18648,-26944,-18648,-26944,-18648,-26944,-18648, - -27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, - -27539,-17757,-27539,-17757,-27539,-17757,-27539,-17757, - -27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, - -28106,-16846,-28106,-16846,-28106,-16846,-28106,-16846, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28642,-15918,-28642,-15918,-28642,-15918,-28642,-15918, - -28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, - -29147,-14972,-29147,-14972,-29147,-14972,-29147,-14972, - -29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, - -29622,-14010,-29622,-14010,-29622,-14010,-29622,-14010, - -29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, - -30064,-13034,-30064,-13034,-30064,-13034,-30064,-13034, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30474,-12043,-30474,-12043,-30474,-12043,-30474,-12043, - -30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, - -30852,-11039,-30852,-11039,-30852,-11039,-30852,-11039, - -31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, - -31197,-10024,-31197,-10024,-31197,-10024,-31197,-10024, - -31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, - -31508,-8998,-31508,-8998,-31508,-8998,-31508,-8998, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31786,-7962,-31786,-7962,-31786,-7962,-31786,-7962, - -31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, - -32029,-6918,-32029,-6918,-32029,-6918,-32029,-6918, - -32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, - -32238,-5866,-32238,-5866,-32238,-5866,-32238,-5866, - -32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, - -32413,-4808,-32413,-4808,-32413,-4808,-32413,-4808, - -32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, - -32553,-3745,-32553,-3745,-32553,-3745,-32553,-3745, - -32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, - -32658,-2678,-32658,-2678,-32658,-2678,-32658,-2678, - -32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, - -32728,-1608,-32728,-1608,-32728,-1608,-32728,-1608, - -32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073, - -32763,-537,-32763,-537,-32763,-537,-32763,-537, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32763,536,-32763,536,-32763,536,-32763,536, - -32750,1072,-32750,1072,-32750,1072,-32750,1072, - -32728,1607,-32728,1607,-32728,1607,-32728,1607, - -32697,2143,-32697,2143,-32697,2143,-32697,2143, - -32658,2677,-32658,2677,-32658,2677,-32658,2677, - -32610,3211,-32610,3211,-32610,3211,-32610,3211, - -32553,3744,-32553,3744,-32553,3744,-32553,3744, - -32487,4276,-32487,4276,-32487,4276,-32487,4276, - -32413,4807,-32413,4807,-32413,4807,-32413,4807, - -32330,5337,-32330,5337,-32330,5337,-32330,5337, - -32238,5865,-32238,5865,-32238,5865,-32238,5865, - -32138,6392,-32138,6392,-32138,6392,-32138,6392, - -32029,6917,-32029,6917,-32029,6917,-32029,6917, - -31912,7440,-31912,7440,-31912,7440,-31912,7440, - -31786,7961,-31786,7961,-31786,7961,-31786,7961, - -31651,8480,-31651,8480,-31651,8480,-31651,8480, - -31508,8997,-31508,8997,-31508,8997,-31508,8997, - -31357,9511,-31357,9511,-31357,9511,-31357,9511, - -31197,10023,-31197,10023,-31197,10023,-31197,10023, - -31029,10532,-31029,10532,-31029,10532,-31029,10532, - -30852,11038,-30852,11038,-30852,11038,-30852,11038, - -30667,11542,-30667,11542,-30667,11542,-30667,11542, - -30474,12042,-30474,12042,-30474,12042,-30474,12042, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -30064,13033,-30064,13033,-30064,13033,-30064,13033, - -29847,13523,-29847,13523,-29847,13523,-29847,13523, - -29622,14009,-29622,14009,-29622,14009,-29622,14009, - -29388,14492,-29388,14492,-29388,14492,-29388,14492, - -29147,14971,-29147,14971,-29147,14971,-29147,14971, - -28898,15446,-28898,15446,-28898,15446,-28898,15446, - -28642,15917,-28642,15917,-28642,15917,-28642,15917, - -28378,16383,-28378,16383,-28378,16383,-28378,16383, - -28106,16845,-28106,16845,-28106,16845,-28106,16845, - -27826,17303,-27826,17303,-27826,17303,-27826,17303, - -27539,17756,-27539,17756,-27539,17756,-27539,17756, - -27245,18204,-27245,18204,-27245,18204,-27245,18204, - -26944,18647,-26944,18647,-26944,18647,-26944,18647, - -26635,19086,-26635,19086,-26635,19086,-26635,19086, - -26319,19519,-26319,19519,-26319,19519,-26319,19519, - -25996,19947,-25996,19947,-25996,19947,-25996,19947, - -25666,20369,-25666,20369,-25666,20369,-25666,20369, - -25330,20787,-25330,20787,-25330,20787,-25330,20787, - -24986,21198,-24986,21198,-24986,21198,-24986,21198, - -24636,21604,-24636,21604,-24636,21604,-24636,21604, - -24279,22004,-24279,22004,-24279,22004,-24279,22004, - -23916,22399,-23916,22399,-23916,22399,-23916,22399, - -23546,22787,-23546,22787,-23546,22787,-23546,22787, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22788,23545,-22788,23545,-22788,23545,-22788,23545, - -22400,23915,-22400,23915,-22400,23915,-22400,23915, - -22005,24278,-22005,24278,-22005,24278,-22005,24278, - -21605,24635,-21605,24635,-21605,24635,-21605,24635, - -21199,24985,-21199,24985,-21199,24985,-21199,24985, - -20788,25329,-20788,25329,-20788,25329,-20788,25329, - -20370,25665,-20370,25665,-20370,25665,-20370,25665, - -19948,25995,-19948,25995,-19948,25995,-19948,25995, - -19520,26318,-19520,26318,-19520,26318,-19520,26318, - -19087,26634,-19087,26634,-19087,26634,-19087,26634, - -18648,26943,-18648,26943,-18648,26943,-18648,26943, - -18205,27244,-18205,27244,-18205,27244,-18205,27244, - -17757,27538,-17757,27538,-17757,27538,-17757,27538, - -17304,27825,-17304,27825,-17304,27825,-17304,27825, - -16846,28105,-16846,28105,-16846,28105,-16846,28105, - -16384,28377,-16384,28377,-16384,28377,-16384,28377, - -15918,28641,-15918,28641,-15918,28641,-15918,28641, - -15447,28897,-15447,28897,-15447,28897,-15447,28897, - -14972,29146,-14972,29146,-14972,29146,-14972,29146, - -14493,29387,-14493,29387,-14493,29387,-14493,29387, - -14010,29621,-14010,29621,-14010,29621,-14010,29621, - -13524,29846,-13524,29846,-13524,29846,-13524,29846, - -13034,30063,-13034,30063,-13034,30063,-13034,30063, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -12043,30473,-12043,30473,-12043,30473,-12043,30473, - -11543,30666,-11543,30666,-11543,30666,-11543,30666, - -11039,30851,-11039,30851,-11039,30851,-11039,30851, - -10533,31028,-10533,31028,-10533,31028,-10533,31028, - -10024,31196,-10024,31196,-10024,31196,-10024,31196, - -9512,31356,-9512,31356,-9512,31356,-9512,31356, - -8998,31507,-8998,31507,-8998,31507,-8998,31507, - -8481,31650,-8481,31650,-8481,31650,-8481,31650, - -7962,31785,-7962,31785,-7962,31785,-7962,31785, - -7441,31911,-7441,31911,-7441,31911,-7441,31911, - -6918,32028,-6918,32028,-6918,32028,-6918,32028, - -6393,32137,-6393,32137,-6393,32137,-6393,32137, - -5866,32237,-5866,32237,-5866,32237,-5866,32237, - -5338,32329,-5338,32329,-5338,32329,-5338,32329, - -4808,32412,-4808,32412,-4808,32412,-4808,32412, - -4277,32486,-4277,32486,-4277,32486,-4277,32486, - -3745,32552,-3745,32552,-3745,32552,-3745,32552, - -3212,32609,-3212,32609,-3212,32609,-3212,32609, - -2678,32657,-2678,32657,-2678,32657,-2678,32657, - -2144,32696,-2144,32696,-2144,32696,-2144,32696, - -1608,32727,-1608,32727,-1608,32727,-1608,32727, - -1073,32749,-1073,32749,-1073,32749,-1073,32749, - -537,32762,-537,32762,-537,32762,-537,32762 - }; +static int16_t twa1152[287*2*4]; +static int16_t twb1152[287*2*4]; +static int16_t twc1152[287*2*4]; void dft1152(int16_t *x,int16_t *y,unsigned char scale_flag) // 288 x 4 { @@ -17546,909 +8468,9 @@ void dft1152(int16_t *x,int16_t *y,unsigned char scale_flag) // 288 x 4 _m_empty(); }; -int16_t twa1200[4784] = { 32766,-172,32766,-172,32766,-172,32766,-172, - 32765,-344,32765,-344,32765,-344,32765,-344, - 32762,-515,32762,-515,32762,-515,32762,-515, - 32759,-687,32759,-687,32759,-687,32759,-687, - 32755,-858,32755,-858,32755,-858,32755,-858, - 32750,-1030,32750,-1030,32750,-1030,32750,-1030, - 32744,-1201,32744,-1201,32744,-1201,32744,-1201, - 32738,-1373,32738,-1373,32738,-1373,32738,-1373, - 32730,-1544,32730,-1544,32730,-1544,32730,-1544, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32712,-1887,32712,-1887,32712,-1887,32712,-1887, - 32702,-2058,32702,-2058,32702,-2058,32702,-2058, - 32691,-2229,32691,-2229,32691,-2229,32691,-2229, - 32679,-2400,32679,-2400,32679,-2400,32679,-2400, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32652,-2742,32652,-2742,32652,-2742,32652,-2742, - 32637,-2913,32637,-2913,32637,-2913,32637,-2913, - 32621,-3084,32621,-3084,32621,-3084,32621,-3084, - 32604,-3255,32604,-3255,32604,-3255,32604,-3255, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32569,-3596,32569,-3596,32569,-3596,32569,-3596, - 32549,-3767,32549,-3767,32549,-3767,32549,-3767, - 32529,-3937,32529,-3937,32529,-3937,32529,-3937, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32486,-4277,32486,-4277,32486,-4277,32486,-4277, - 32463,-4447,32463,-4447,32463,-4447,32463,-4447, - 32440,-4617,32440,-4617,32440,-4617,32440,-4617, - 32415,-4787,32415,-4787,32415,-4787,32415,-4787, - 32389,-4957,32389,-4957,32389,-4957,32389,-4957, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32336,-5296,32336,-5296,32336,-5296,32336,-5296, - 32308,-5465,32308,-5465,32308,-5465,32308,-5465, - 32279,-5634,32279,-5634,32279,-5634,32279,-5634, - 32249,-5803,32249,-5803,32249,-5803,32249,-5803, - 32218,-5972,32218,-5972,32218,-5972,32218,-5972, - 32186,-6140,32186,-6140,32186,-6140,32186,-6140, - 32154,-6309,32154,-6309,32154,-6309,32154,-6309, - 32120,-6477,32120,-6477,32120,-6477,32120,-6477, - 32086,-6645,32086,-6645,32086,-6645,32086,-6645, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 32014,-6981,32014,-6981,32014,-6981,32014,-6981, - 31977,-7148,31977,-7148,31977,-7148,31977,-7148, - 31940,-7316,31940,-7316,31940,-7316,31940,-7316, - 31901,-7483,31901,-7483,31901,-7483,31901,-7483, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31821,-7817,31821,-7817,31821,-7817,31821,-7817, - 31779,-7983,31779,-7983,31779,-7983,31779,-7983, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31694,-8315,31694,-8315,31694,-8315,31694,-8315, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31605,-8647,31605,-8647,31605,-8647,31605,-8647, - 31559,-8812,31559,-8812,31559,-8812,31559,-8812, - 31513,-8977,31513,-8977,31513,-8977,31513,-8977, - 31465,-9142,31465,-9142,31465,-9142,31465,-9142, - 31417,-9307,31417,-9307,31417,-9307,31417,-9307, - 31368,-9471,31368,-9471,31368,-9471,31368,-9471, - 31318,-9635,31318,-9635,31318,-9635,31318,-9635, - 31267,-9799,31267,-9799,31267,-9799,31267,-9799, - 31215,-9963,31215,-9963,31215,-9963,31215,-9963, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31109,-10289,31109,-10289,31109,-10289,31109,-10289, - 31055,-10452,31055,-10452,31055,-10452,31055,-10452, - 31000,-10614,31000,-10614,31000,-10614,31000,-10614, - 30944,-10776,30944,-10776,30944,-10776,30944,-10776, - 30887,-10938,30887,-10938,30887,-10938,30887,-10938, - 30829,-11100,30829,-11100,30829,-11100,30829,-11100, - 30771,-11261,30771,-11261,30771,-11261,30771,-11261, - 30711,-11422,30711,-11422,30711,-11422,30711,-11422, - 30651,-11583,30651,-11583,30651,-11583,30651,-11583, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30528,-11903,30528,-11903,30528,-11903,30528,-11903, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30402,-12222,30402,-12222,30402,-12222,30402,-12222, - 30338,-12381,30338,-12381,30338,-12381,30338,-12381, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30206,-12698,30206,-12698,30206,-12698,30206,-12698, - 30139,-12856,30139,-12856,30139,-12856,30139,-12856, - 30072,-13014,30072,-13014,30072,-13014,30072,-13014, - 30003,-13171,30003,-13171,30003,-13171,30003,-13171, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29863,-13485,29863,-13485,29863,-13485,29863,-13485, - 29792,-13641,29792,-13641,29792,-13641,29792,-13641, - 29721,-13797,29721,-13797,29721,-13797,29721,-13797, - 29648,-13952,29648,-13952,29648,-13952,29648,-13952, - 29575,-14107,29575,-14107,29575,-14107,29575,-14107, - 29500,-14262,29500,-14262,29500,-14262,29500,-14262, - 29425,-14416,29425,-14416,29425,-14416,29425,-14416, - 29349,-14570,29349,-14570,29349,-14570,29349,-14570, - 29273,-14723,29273,-14723,29273,-14723,29273,-14723, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29117,-15029,29117,-15029,29117,-15029,29117,-15029, - 29038,-15181,29038,-15181,29038,-15181,29038,-15181, - 28958,-15333,28958,-15333,28958,-15333,28958,-15333, - 28877,-15485,28877,-15485,28877,-15485,28877,-15485, - 28796,-15636,28796,-15636,28796,-15636,28796,-15636, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28630,-15936,28630,-15936,28630,-15936,28630,-15936, - 28547,-16086,28547,-16086,28547,-16086,28547,-16086, - 28462,-16235,28462,-16235,28462,-16235,28462,-16235, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28290,-16532,28290,-16532,28290,-16532,28290,-16532, - 28203,-16680,28203,-16680,28203,-16680,28203,-16680, - 28116,-16828,28116,-16828,28116,-16828,28116,-16828, - 28027,-16975,28027,-16975,28027,-16975,28027,-16975, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27848,-17267,27848,-17267,27848,-17267,27848,-17267, - 27757,-17413,27757,-17413,27757,-17413,27757,-17413, - 27666,-17558,27666,-17558,27666,-17558,27666,-17558, - 27573,-17703,27573,-17703,27573,-17703,27573,-17703, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27386,-17990,27386,-17990,27386,-17990,27386,-17990, - 27292,-18133,27292,-18133,27292,-18133,27292,-18133, - 27197,-18276,27197,-18276,27197,-18276,27197,-18276, - 27100,-18418,27100,-18418,27100,-18418,27100,-18418, - 27004,-18560,27004,-18560,27004,-18560,27004,-18560, - 26906,-18701,26906,-18701,26906,-18701,26906,-18701, - 26808,-18842,26808,-18842,26808,-18842,26808,-18842, - 26709,-18982,26709,-18982,26709,-18982,26709,-18982, - 26609,-19121,26609,-19121,26609,-19121,26609,-19121, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26407,-19399,26407,-19399,26407,-19399,26407,-19399, - 26305,-19537,26305,-19537,26305,-19537,26305,-19537, - 26203,-19674,26203,-19674,26203,-19674,26203,-19674, - 26099,-19811,26099,-19811,26099,-19811,26099,-19811, - 25995,-19948,25995,-19948,25995,-19948,25995,-19948, - 25891,-20084,25891,-20084,25891,-20084,25891,-20084, - 25785,-20219,25785,-20219,25785,-20219,25785,-20219, - 25679,-20354,25679,-20354,25679,-20354,25679,-20354, - 25572,-20488,25572,-20488,25572,-20488,25572,-20488, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25356,-20754,25356,-20754,25356,-20754,25356,-20754, - 25247,-20887,25247,-20887,25247,-20887,25247,-20887, - 25137,-21019,25137,-21019,25137,-21019,25137,-21019, - 25027,-21150,25027,-21150,25027,-21150,25027,-21150, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24804,-21411,24804,-21411,24804,-21411,24804,-21411, - 24692,-21541,24692,-21541,24692,-21541,24692,-21541, - 24578,-21670,24578,-21670,24578,-21670,24578,-21670, - 24465,-21798,24465,-21798,24465,-21798,24465,-21798, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24235,-22053,24235,-22053,24235,-22053,24235,-22053, - 24119,-22180,24119,-22180,24119,-22180,24119,-22180, - 24003,-22306,24003,-22306,24003,-22306,24003,-22306, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23768,-22556,23768,-22556,23768,-22556,23768,-22556, - 23649,-22680,23649,-22680,23649,-22680,23649,-22680, - 23530,-22803,23530,-22803,23530,-22803,23530,-22803, - 23411,-22926,23411,-22926,23411,-22926,23411,-22926, - 23290,-23049,23290,-23049,23290,-23049,23290,-23049, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 23048,-23291,23048,-23291,23048,-23291,23048,-23291, - 22925,-23412,22925,-23412,22925,-23412,22925,-23412, - 22802,-23531,22802,-23531,22802,-23531,22802,-23531, - 22679,-23650,22679,-23650,22679,-23650,22679,-23650, - 22555,-23769,22555,-23769,22555,-23769,22555,-23769, - 22430,-23887,22430,-23887,22430,-23887,22430,-23887, - 22305,-24004,22305,-24004,22305,-24004,22305,-24004, - 22179,-24120,22179,-24120,22179,-24120,22179,-24120, - 22052,-24236,22052,-24236,22052,-24236,22052,-24236, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21797,-24466,21797,-24466,21797,-24466,21797,-24466, - 21669,-24579,21669,-24579,21669,-24579,21669,-24579, - 21540,-24693,21540,-24693,21540,-24693,21540,-24693, - 21410,-24805,21410,-24805,21410,-24805,21410,-24805, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 21149,-25028,21149,-25028,21149,-25028,21149,-25028, - 21018,-25138,21018,-25138,21018,-25138,21018,-25138, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20753,-25357,20753,-25357,20753,-25357,20753,-25357, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20487,-25573,20487,-25573,20487,-25573,20487,-25573, - 20353,-25680,20353,-25680,20353,-25680,20353,-25680, - 20218,-25786,20218,-25786,20218,-25786,20218,-25786, - 20083,-25892,20083,-25892,20083,-25892,20083,-25892, - 19947,-25996,19947,-25996,19947,-25996,19947,-25996, - 19810,-26100,19810,-26100,19810,-26100,19810,-26100, - 19673,-26204,19673,-26204,19673,-26204,19673,-26204, - 19536,-26306,19536,-26306,19536,-26306,19536,-26306, - 19398,-26408,19398,-26408,19398,-26408,19398,-26408, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 19120,-26610,19120,-26610,19120,-26610,19120,-26610, - 18981,-26710,18981,-26710,18981,-26710,18981,-26710, - 18841,-26809,18841,-26809,18841,-26809,18841,-26809, - 18700,-26907,18700,-26907,18700,-26907,18700,-26907, - 18559,-27005,18559,-27005,18559,-27005,18559,-27005, - 18417,-27101,18417,-27101,18417,-27101,18417,-27101, - 18275,-27198,18275,-27198,18275,-27198,18275,-27198, - 18132,-27293,18132,-27293,18132,-27293,18132,-27293, - 17989,-27387,17989,-27387,17989,-27387,17989,-27387, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17702,-27574,17702,-27574,17702,-27574,17702,-27574, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17412,-27758,17412,-27758,17412,-27758,17412,-27758, - 17266,-27849,17266,-27849,17266,-27849,17266,-27849, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16974,-28028,16974,-28028,16974,-28028,16974,-28028, - 16827,-28117,16827,-28117,16827,-28117,16827,-28117, - 16679,-28204,16679,-28204,16679,-28204,16679,-28204, - 16531,-28291,16531,-28291,16531,-28291,16531,-28291, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16234,-28463,16234,-28463,16234,-28463,16234,-28463, - 16085,-28548,16085,-28548,16085,-28548,16085,-28548, - 15935,-28631,15935,-28631,15935,-28631,15935,-28631, - 15785,-28714,15785,-28714,15785,-28714,15785,-28714, - 15635,-28797,15635,-28797,15635,-28797,15635,-28797, - 15484,-28878,15484,-28878,15484,-28878,15484,-28878, - 15332,-28959,15332,-28959,15332,-28959,15332,-28959, - 15180,-29039,15180,-29039,15180,-29039,15180,-29039, - 15028,-29118,15028,-29118,15028,-29118,15028,-29118, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14722,-29274,14722,-29274,14722,-29274,14722,-29274, - 14569,-29350,14569,-29350,14569,-29350,14569,-29350, - 14415,-29426,14415,-29426,14415,-29426,14415,-29426, - 14261,-29501,14261,-29501,14261,-29501,14261,-29501, - 14106,-29576,14106,-29576,14106,-29576,14106,-29576, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13796,-29722,13796,-29722,13796,-29722,13796,-29722, - 13640,-29793,13640,-29793,13640,-29793,13640,-29793, - 13484,-29864,13484,-29864,13484,-29864,13484,-29864, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13170,-30004,13170,-30004,13170,-30004,13170,-30004, - 13013,-30073,13013,-30073,13013,-30073,13013,-30073, - 12855,-30140,12855,-30140,12855,-30140,12855,-30140, - 12697,-30207,12697,-30207,12697,-30207,12697,-30207, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12380,-30339,12380,-30339,12380,-30339,12380,-30339, - 12221,-30403,12221,-30403,12221,-30403,12221,-30403, - 12062,-30466,12062,-30466,12062,-30466,12062,-30466, - 11902,-30529,11902,-30529,11902,-30529,11902,-30529, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11582,-30652,11582,-30652,11582,-30652,11582,-30652, - 11421,-30712,11421,-30712,11421,-30712,11421,-30712, - 11260,-30772,11260,-30772,11260,-30772,11260,-30772, - 11099,-30830,11099,-30830,11099,-30830,11099,-30830, - 10937,-30888,10937,-30888,10937,-30888,10937,-30888, - 10775,-30945,10775,-30945,10775,-30945,10775,-30945, - 10613,-31001,10613,-31001,10613,-31001,10613,-31001, - 10451,-31056,10451,-31056,10451,-31056,10451,-31056, - 10288,-31110,10288,-31110,10288,-31110,10288,-31110, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9962,-31216,9962,-31216,9962,-31216,9962,-31216, - 9798,-31268,9798,-31268,9798,-31268,9798,-31268, - 9634,-31319,9634,-31319,9634,-31319,9634,-31319, - 9470,-31369,9470,-31369,9470,-31369,9470,-31369, - 9306,-31418,9306,-31418,9306,-31418,9306,-31418, - 9141,-31466,9141,-31466,9141,-31466,9141,-31466, - 8976,-31514,8976,-31514,8976,-31514,8976,-31514, - 8811,-31560,8811,-31560,8811,-31560,8811,-31560, - 8646,-31606,8646,-31606,8646,-31606,8646,-31606, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8314,-31695,8314,-31695,8314,-31695,8314,-31695, - 8148,-31738,8148,-31738,8148,-31738,8148,-31738, - 7982,-31780,7982,-31780,7982,-31780,7982,-31780, - 7816,-31822,7816,-31822,7816,-31822,7816,-31822, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7482,-31902,7482,-31902,7482,-31902,7482,-31902, - 7315,-31941,7315,-31941,7315,-31941,7315,-31941, - 7147,-31978,7147,-31978,7147,-31978,7147,-31978, - 6980,-32015,6980,-32015,6980,-32015,6980,-32015, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6644,-32087,6644,-32087,6644,-32087,6644,-32087, - 6476,-32121,6476,-32121,6476,-32121,6476,-32121, - 6308,-32155,6308,-32155,6308,-32155,6308,-32155, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5971,-32219,5971,-32219,5971,-32219,5971,-32219, - 5802,-32250,5802,-32250,5802,-32250,5802,-32250, - 5633,-32280,5633,-32280,5633,-32280,5633,-32280, - 5464,-32309,5464,-32309,5464,-32309,5464,-32309, - 5295,-32337,5295,-32337,5295,-32337,5295,-32337, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4956,-32390,4956,-32390,4956,-32390,4956,-32390, - 4786,-32416,4786,-32416,4786,-32416,4786,-32416, - 4616,-32441,4616,-32441,4616,-32441,4616,-32441, - 4446,-32464,4446,-32464,4446,-32464,4446,-32464, - 4276,-32487,4276,-32487,4276,-32487,4276,-32487, - 4106,-32509,4106,-32509,4106,-32509,4106,-32509, - 3936,-32530,3936,-32530,3936,-32530,3936,-32530, - 3766,-32550,3766,-32550,3766,-32550,3766,-32550, - 3595,-32570,3595,-32570,3595,-32570,3595,-32570, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3254,-32605,3254,-32605,3254,-32605,3254,-32605, - 3083,-32622,3083,-32622,3083,-32622,3083,-32622, - 2912,-32638,2912,-32638,2912,-32638,2912,-32638, - 2741,-32653,2741,-32653,2741,-32653,2741,-32653, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2399,-32680,2399,-32680,2399,-32680,2399,-32680, - 2228,-32692,2228,-32692,2228,-32692,2228,-32692, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1886,-32713,1886,-32713,1886,-32713,1886,-32713, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1543,-32731,1543,-32731,1543,-32731,1543,-32731, - 1372,-32739,1372,-32739,1372,-32739,1372,-32739, - 1200,-32745,1200,-32745,1200,-32745,1200,-32745, - 1029,-32751,1029,-32751,1029,-32751,1029,-32751, - 857,-32756,857,-32756,857,-32756,857,-32756, - 686,-32760,686,-32760,686,-32760,686,-32760, - 514,-32763,514,-32763,514,-32763,514,-32763, - 343,-32766,343,-32766,343,-32766,343,-32766, - 171,-32767,171,-32767,171,-32767,171,-32767 - }; - -int16_t twb1200[4784] = {32765,-344,32765,-344,32765,-344,32765,-344, - 32759,-687,32759,-687,32759,-687,32759,-687, - 32750,-1030,32750,-1030,32750,-1030,32750,-1030, - 32738,-1373,32738,-1373,32738,-1373,32738,-1373, - 32722,-1715,32722,-1715,32722,-1715,32722,-1715, - 32702,-2058,32702,-2058,32702,-2058,32702,-2058, - 32679,-2400,32679,-2400,32679,-2400,32679,-2400, - 32652,-2742,32652,-2742,32652,-2742,32652,-2742, - 32621,-3084,32621,-3084,32621,-3084,32621,-3084, - 32587,-3426,32587,-3426,32587,-3426,32587,-3426, - 32549,-3767,32549,-3767,32549,-3767,32549,-3767, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32463,-4447,32463,-4447,32463,-4447,32463,-4447, - 32415,-4787,32415,-4787,32415,-4787,32415,-4787, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32308,-5465,32308,-5465,32308,-5465,32308,-5465, - 32249,-5803,32249,-5803,32249,-5803,32249,-5803, - 32186,-6140,32186,-6140,32186,-6140,32186,-6140, - 32120,-6477,32120,-6477,32120,-6477,32120,-6477, - 32050,-6813,32050,-6813,32050,-6813,32050,-6813, - 31977,-7148,31977,-7148,31977,-7148,31977,-7148, - 31901,-7483,31901,-7483,31901,-7483,31901,-7483, - 31821,-7817,31821,-7817,31821,-7817,31821,-7817, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31650,-8481,31650,-8481,31650,-8481,31650,-8481, - 31559,-8812,31559,-8812,31559,-8812,31559,-8812, - 31465,-9142,31465,-9142,31465,-9142,31465,-9142, - 31368,-9471,31368,-9471,31368,-9471,31368,-9471, - 31267,-9799,31267,-9799,31267,-9799,31267,-9799, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31055,-10452,31055,-10452,31055,-10452,31055,-10452, - 30944,-10776,30944,-10776,30944,-10776,30944,-10776, - 30829,-11100,30829,-11100,30829,-11100,30829,-11100, - 30711,-11422,30711,-11422,30711,-11422,30711,-11422, - 30590,-11743,30590,-11743,30590,-11743,30590,-11743, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30338,-12381,30338,-12381,30338,-12381,30338,-12381, - 30206,-12698,30206,-12698,30206,-12698,30206,-12698, - 30072,-13014,30072,-13014,30072,-13014,30072,-13014, - 29934,-13328,29934,-13328,29934,-13328,29934,-13328, - 29792,-13641,29792,-13641,29792,-13641,29792,-13641, - 29648,-13952,29648,-13952,29648,-13952,29648,-13952, - 29500,-14262,29500,-14262,29500,-14262,29500,-14262, - 29349,-14570,29349,-14570,29349,-14570,29349,-14570, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 29038,-15181,29038,-15181,29038,-15181,29038,-15181, - 28877,-15485,28877,-15485,28877,-15485,28877,-15485, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28547,-16086,28547,-16086,28547,-16086,28547,-16086, - 28377,-16384,28377,-16384,28377,-16384,28377,-16384, - 28203,-16680,28203,-16680,28203,-16680,28203,-16680, - 28027,-16975,28027,-16975,28027,-16975,28027,-16975, - 27848,-17267,27848,-17267,27848,-17267,27848,-17267, - 27666,-17558,27666,-17558,27666,-17558,27666,-17558, - 27480,-17847,27480,-17847,27480,-17847,27480,-17847, - 27292,-18133,27292,-18133,27292,-18133,27292,-18133, - 27100,-18418,27100,-18418,27100,-18418,27100,-18418, - 26906,-18701,26906,-18701,26906,-18701,26906,-18701, - 26709,-18982,26709,-18982,26709,-18982,26709,-18982, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26305,-19537,26305,-19537,26305,-19537,26305,-19537, - 26099,-19811,26099,-19811,26099,-19811,26099,-19811, - 25891,-20084,25891,-20084,25891,-20084,25891,-20084, - 25679,-20354,25679,-20354,25679,-20354,25679,-20354, - 25464,-20621,25464,-20621,25464,-20621,25464,-20621, - 25247,-20887,25247,-20887,25247,-20887,25247,-20887, - 25027,-21150,25027,-21150,25027,-21150,25027,-21150, - 24804,-21411,24804,-21411,24804,-21411,24804,-21411, - 24578,-21670,24578,-21670,24578,-21670,24578,-21670, - 24350,-21926,24350,-21926,24350,-21926,24350,-21926, - 24119,-22180,24119,-22180,24119,-22180,24119,-22180, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23649,-22680,23649,-22680,23649,-22680,23649,-22680, - 23411,-22926,23411,-22926,23411,-22926,23411,-22926, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22925,-23412,22925,-23412,22925,-23412,22925,-23412, - 22679,-23650,22679,-23650,22679,-23650,22679,-23650, - 22430,-23887,22430,-23887,22430,-23887,22430,-23887, - 22179,-24120,22179,-24120,22179,-24120,22179,-24120, - 21925,-24351,21925,-24351,21925,-24351,21925,-24351, - 21669,-24579,21669,-24579,21669,-24579,21669,-24579, - 21410,-24805,21410,-24805,21410,-24805,21410,-24805, - 21149,-25028,21149,-25028,21149,-25028,21149,-25028, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20620,-25465,20620,-25465,20620,-25465,20620,-25465, - 20353,-25680,20353,-25680,20353,-25680,20353,-25680, - 20083,-25892,20083,-25892,20083,-25892,20083,-25892, - 19810,-26100,19810,-26100,19810,-26100,19810,-26100, - 19536,-26306,19536,-26306,19536,-26306,19536,-26306, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18981,-26710,18981,-26710,18981,-26710,18981,-26710, - 18700,-26907,18700,-26907,18700,-26907,18700,-26907, - 18417,-27101,18417,-27101,18417,-27101,18417,-27101, - 18132,-27293,18132,-27293,18132,-27293,18132,-27293, - 17846,-27481,17846,-27481,17846,-27481,17846,-27481, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17266,-27849,17266,-27849,17266,-27849,17266,-27849, - 16974,-28028,16974,-28028,16974,-28028,16974,-28028, - 16679,-28204,16679,-28204,16679,-28204,16679,-28204, - 16383,-28378,16383,-28378,16383,-28378,16383,-28378, - 16085,-28548,16085,-28548,16085,-28548,16085,-28548, - 15785,-28714,15785,-28714,15785,-28714,15785,-28714, - 15484,-28878,15484,-28878,15484,-28878,15484,-28878, - 15180,-29039,15180,-29039,15180,-29039,15180,-29039, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14569,-29350,14569,-29350,14569,-29350,14569,-29350, - 14261,-29501,14261,-29501,14261,-29501,14261,-29501, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13640,-29793,13640,-29793,13640,-29793,13640,-29793, - 13327,-29935,13327,-29935,13327,-29935,13327,-29935, - 13013,-30073,13013,-30073,13013,-30073,13013,-30073, - 12697,-30207,12697,-30207,12697,-30207,12697,-30207, - 12380,-30339,12380,-30339,12380,-30339,12380,-30339, - 12062,-30466,12062,-30466,12062,-30466,12062,-30466, - 11742,-30591,11742,-30591,11742,-30591,11742,-30591, - 11421,-30712,11421,-30712,11421,-30712,11421,-30712, - 11099,-30830,11099,-30830,11099,-30830,11099,-30830, - 10775,-30945,10775,-30945,10775,-30945,10775,-30945, - 10451,-31056,10451,-31056,10451,-31056,10451,-31056, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9798,-31268,9798,-31268,9798,-31268,9798,-31268, - 9470,-31369,9470,-31369,9470,-31369,9470,-31369, - 9141,-31466,9141,-31466,9141,-31466,9141,-31466, - 8811,-31560,8811,-31560,8811,-31560,8811,-31560, - 8480,-31651,8480,-31651,8480,-31651,8480,-31651, - 8148,-31738,8148,-31738,8148,-31738,8148,-31738, - 7816,-31822,7816,-31822,7816,-31822,7816,-31822, - 7482,-31902,7482,-31902,7482,-31902,7482,-31902, - 7147,-31978,7147,-31978,7147,-31978,7147,-31978, - 6812,-32051,6812,-32051,6812,-32051,6812,-32051, - 6476,-32121,6476,-32121,6476,-32121,6476,-32121, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5802,-32250,5802,-32250,5802,-32250,5802,-32250, - 5464,-32309,5464,-32309,5464,-32309,5464,-32309, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4786,-32416,4786,-32416,4786,-32416,4786,-32416, - 4446,-32464,4446,-32464,4446,-32464,4446,-32464, - 4106,-32509,4106,-32509,4106,-32509,4106,-32509, - 3766,-32550,3766,-32550,3766,-32550,3766,-32550, - 3425,-32588,3425,-32588,3425,-32588,3425,-32588, - 3083,-32622,3083,-32622,3083,-32622,3083,-32622, - 2741,-32653,2741,-32653,2741,-32653,2741,-32653, - 2399,-32680,2399,-32680,2399,-32680,2399,-32680, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1714,-32723,1714,-32723,1714,-32723,1714,-32723, - 1372,-32739,1372,-32739,1372,-32739,1372,-32739, - 1029,-32751,1029,-32751,1029,-32751,1029,-32751, - 686,-32760,686,-32760,686,-32760,686,-32760, - 343,-32766,343,-32766,343,-32766,343,-32766, - 0,-32767,0,-32767,0,-32767,0,-32767, - -344,-32766,-344,-32766,-344,-32766,-344,-32766, - -687,-32760,-687,-32760,-687,-32760,-687,-32760, - -1030,-32751,-1030,-32751,-1030,-32751,-1030,-32751, - -1373,-32739,-1373,-32739,-1373,-32739,-1373,-32739, - -1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, - -2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, - -2400,-32680,-2400,-32680,-2400,-32680,-2400,-32680, - -2742,-32653,-2742,-32653,-2742,-32653,-2742,-32653, - -3084,-32622,-3084,-32622,-3084,-32622,-3084,-32622, - -3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, - -3767,-32550,-3767,-32550,-3767,-32550,-3767,-32550, - -4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, - -4447,-32464,-4447,-32464,-4447,-32464,-4447,-32464, - -4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5465,-32309,-5465,-32309,-5465,-32309,-5465,-32309, - -5803,-32250,-5803,-32250,-5803,-32250,-5803,-32250, - -6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, - -6477,-32121,-6477,-32121,-6477,-32121,-6477,-32121, - -6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, - -7148,-31978,-7148,-31978,-7148,-31978,-7148,-31978, - -7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, - -7817,-31822,-7817,-31822,-7817,-31822,-7817,-31822, - -8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, - -8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, - -8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, - -9142,-31466,-9142,-31466,-9142,-31466,-9142,-31466, - -9471,-31369,-9471,-31369,-9471,-31369,-9471,-31369, - -9799,-31268,-9799,-31268,-9799,-31268,-9799,-31268, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10452,-31056,-10452,-31056,-10452,-31056,-10452,-31056, - -10776,-30945,-10776,-30945,-10776,-30945,-10776,-30945, - -11100,-30830,-11100,-30830,-11100,-30830,-11100,-30830, - -11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, - -11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, - -12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, - -12381,-30339,-12381,-30339,-12381,-30339,-12381,-30339, - -12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, - -13014,-30073,-13014,-30073,-13014,-30073,-13014,-30073, - -13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, - -13641,-29793,-13641,-29793,-13641,-29793,-13641,-29793, - -13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, - -14262,-29501,-14262,-29501,-14262,-29501,-14262,-29501, - -14570,-29350,-14570,-29350,-14570,-29350,-14570,-29350, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, - -15485,-28878,-15485,-28878,-15485,-28878,-15485,-28878, - -15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, - -16086,-28548,-16086,-28548,-16086,-28548,-16086,-28548, - -16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, - -16680,-28204,-16680,-28204,-16680,-28204,-16680,-28204, - -16975,-28028,-16975,-28028,-16975,-28028,-16975,-28028, - -17267,-27849,-17267,-27849,-17267,-27849,-17267,-27849, - -17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, - -17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, - -18133,-27293,-18133,-27293,-18133,-27293,-18133,-27293, - -18418,-27101,-18418,-27101,-18418,-27101,-18418,-27101, - -18701,-26907,-18701,-26907,-18701,-26907,-18701,-26907, - -18982,-26710,-18982,-26710,-18982,-26710,-18982,-26710, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19537,-26306,-19537,-26306,-19537,-26306,-19537,-26306, - -19811,-26100,-19811,-26100,-19811,-26100,-19811,-26100, - -20084,-25892,-20084,-25892,-20084,-25892,-20084,-25892, - -20354,-25680,-20354,-25680,-20354,-25680,-20354,-25680, - -20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, - -20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, - -21150,-25028,-21150,-25028,-21150,-25028,-21150,-25028, - -21411,-24805,-21411,-24805,-21411,-24805,-21411,-24805, - -21670,-24579,-21670,-24579,-21670,-24579,-21670,-24579, - -21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, - -22180,-24120,-22180,-24120,-22180,-24120,-22180,-24120, - -22431,-23887,-22431,-23887,-22431,-23887,-22431,-23887, - -22680,-23650,-22680,-23650,-22680,-23650,-22680,-23650, - -22926,-23412,-22926,-23412,-22926,-23412,-22926,-23412, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23412,-22926,-23412,-22926,-23412,-22926,-23412,-22926, - -23650,-22680,-23650,-22680,-23650,-22680,-23650,-22680, - -23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, - -24120,-22180,-24120,-22180,-24120,-22180,-24120,-22180, - -24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, - -24579,-21670,-24579,-21670,-24579,-21670,-24579,-21670, - -24805,-21411,-24805,-21411,-24805,-21411,-24805,-21411, - -25028,-21150,-25028,-21150,-25028,-21150,-25028,-21150, - -25248,-20887,-25248,-20887,-25248,-20887,-25248,-20887, - -25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, - -25680,-20354,-25680,-20354,-25680,-20354,-25680,-20354, - -25892,-20084,-25892,-20084,-25892,-20084,-25892,-20084, - -26100,-19811,-26100,-19811,-26100,-19811,-26100,-19811, - -26306,-19537,-26306,-19537,-26306,-19537,-26306,-19537, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26710,-18982,-26710,-18982,-26710,-18982,-26710,-18982, - -26907,-18701,-26907,-18701,-26907,-18701,-26907,-18701, - -27101,-18418,-27101,-18418,-27101,-18418,-27101,-18418, - -27293,-18133,-27293,-18133,-27293,-18133,-27293,-18133, - -27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, - -27667,-17558,-27667,-17558,-27667,-17558,-27667,-17558, - -27849,-17267,-27849,-17267,-27849,-17267,-27849,-17267, - -28028,-16975,-28028,-16975,-28028,-16975,-28028,-16975, - -28204,-16680,-28204,-16680,-28204,-16680,-28204,-16680, - -28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, - -28548,-16086,-28548,-16086,-28548,-16086,-28548,-16086, - -28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, - -28878,-15485,-28878,-15485,-28878,-15485,-28878,-15485, - -29039,-15181,-29039,-15181,-29039,-15181,-29039,-15181, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29350,-14570,-29350,-14570,-29350,-14570,-29350,-14570, - -29501,-14262,-29501,-14262,-29501,-14262,-29501,-14262, - -29649,-13952,-29649,-13952,-29649,-13952,-29649,-13952, - -29793,-13641,-29793,-13641,-29793,-13641,-29793,-13641, - -29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, - -30073,-13014,-30073,-13014,-30073,-13014,-30073,-13014, - -30207,-12698,-30207,-12698,-30207,-12698,-30207,-12698, - -30339,-12381,-30339,-12381,-30339,-12381,-30339,-12381, - -30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, - -30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, - -30712,-11422,-30712,-11422,-30712,-11422,-30712,-11422, - -30830,-11100,-30830,-11100,-30830,-11100,-30830,-11100, - -30945,-10776,-30945,-10776,-30945,-10776,-30945,-10776, - -31056,-10452,-31056,-10452,-31056,-10452,-31056,-10452, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31268,-9799,-31268,-9799,-31268,-9799,-31268,-9799, - -31369,-9471,-31369,-9471,-31369,-9471,-31369,-9471, - -31466,-9142,-31466,-9142,-31466,-9142,-31466,-9142, - -31560,-8812,-31560,-8812,-31560,-8812,-31560,-8812, - -31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, - -31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, - -31822,-7817,-31822,-7817,-31822,-7817,-31822,-7817, - -31902,-7483,-31902,-7483,-31902,-7483,-31902,-7483, - -31978,-7148,-31978,-7148,-31978,-7148,-31978,-7148, - -32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, - -32121,-6477,-32121,-6477,-32121,-6477,-32121,-6477, - -32187,-6140,-32187,-6140,-32187,-6140,-32187,-6140, - -32250,-5803,-32250,-5803,-32250,-5803,-32250,-5803, - -32309,-5465,-32309,-5465,-32309,-5465,-32309,-5465, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32416,-4787,-32416,-4787,-32416,-4787,-32416,-4787, - -32464,-4447,-32464,-4447,-32464,-4447,-32464,-4447, - -32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, - -32550,-3767,-32550,-3767,-32550,-3767,-32550,-3767, - -32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, - -32622,-3084,-32622,-3084,-32622,-3084,-32622,-3084, - -32653,-2742,-32653,-2742,-32653,-2742,-32653,-2742, - -32680,-2400,-32680,-2400,-32680,-2400,-32680,-2400, - -32703,-2058,-32703,-2058,-32703,-2058,-32703,-2058, - -32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, - -32739,-1373,-32739,-1373,-32739,-1373,-32739,-1373, - -32751,-1030,-32751,-1030,-32751,-1030,-32751,-1030, - -32760,-687,-32760,-687,-32760,-687,-32760,-687, - -32766,-344,-32766,-344,-32766,-344,-32766,-344 - }; - -int16_t twc1200[4784] = { 32762,-515,32762,-515,32762,-515,32762,-515, - 32750,-1030,32750,-1030,32750,-1030,32750,-1030, - 32730,-1544,32730,-1544,32730,-1544,32730,-1544, - 32702,-2058,32702,-2058,32702,-2058,32702,-2058, - 32665,-2571,32665,-2571,32665,-2571,32665,-2571, - 32621,-3084,32621,-3084,32621,-3084,32621,-3084, - 32569,-3596,32569,-3596,32569,-3596,32569,-3596, - 32508,-4107,32508,-4107,32508,-4107,32508,-4107, - 32440,-4617,32440,-4617,32440,-4617,32440,-4617, - 32363,-5126,32363,-5126,32363,-5126,32363,-5126, - 32279,-5634,32279,-5634,32279,-5634,32279,-5634, - 32186,-6140,32186,-6140,32186,-6140,32186,-6140, - 32086,-6645,32086,-6645,32086,-6645,32086,-6645, - 31977,-7148,31977,-7148,31977,-7148,31977,-7148, - 31861,-7650,31861,-7650,31861,-7650,31861,-7650, - 31737,-8149,31737,-8149,31737,-8149,31737,-8149, - 31605,-8647,31605,-8647,31605,-8647,31605,-8647, - 31465,-9142,31465,-9142,31465,-9142,31465,-9142, - 31318,-9635,31318,-9635,31318,-9635,31318,-9635, - 31163,-10126,31163,-10126,31163,-10126,31163,-10126, - 31000,-10614,31000,-10614,31000,-10614,31000,-10614, - 30829,-11100,30829,-11100,30829,-11100,30829,-11100, - 30651,-11583,30651,-11583,30651,-11583,30651,-11583, - 30465,-12063,30465,-12063,30465,-12063,30465,-12063, - 30272,-12540,30272,-12540,30272,-12540,30272,-12540, - 30072,-13014,30072,-13014,30072,-13014,30072,-13014, - 29863,-13485,29863,-13485,29863,-13485,29863,-13485, - 29648,-13952,29648,-13952,29648,-13952,29648,-13952, - 29425,-14416,29425,-14416,29425,-14416,29425,-14416, - 29195,-14876,29195,-14876,29195,-14876,29195,-14876, - 28958,-15333,28958,-15333,28958,-15333,28958,-15333, - 28713,-15786,28713,-15786,28713,-15786,28713,-15786, - 28462,-16235,28462,-16235,28462,-16235,28462,-16235, - 28203,-16680,28203,-16680,28203,-16680,28203,-16680, - 27938,-17121,27938,-17121,27938,-17121,27938,-17121, - 27666,-17558,27666,-17558,27666,-17558,27666,-17558, - 27386,-17990,27386,-17990,27386,-17990,27386,-17990, - 27100,-18418,27100,-18418,27100,-18418,27100,-18418, - 26808,-18842,26808,-18842,26808,-18842,26808,-18842, - 26509,-19260,26509,-19260,26509,-19260,26509,-19260, - 26203,-19674,26203,-19674,26203,-19674,26203,-19674, - 25891,-20084,25891,-20084,25891,-20084,25891,-20084, - 25572,-20488,25572,-20488,25572,-20488,25572,-20488, - 25247,-20887,25247,-20887,25247,-20887,25247,-20887, - 24916,-21281,24916,-21281,24916,-21281,24916,-21281, - 24578,-21670,24578,-21670,24578,-21670,24578,-21670, - 24235,-22053,24235,-22053,24235,-22053,24235,-22053, - 23886,-22431,23886,-22431,23886,-22431,23886,-22431, - 23530,-22803,23530,-22803,23530,-22803,23530,-22803, - 23169,-23170,23169,-23170,23169,-23170,23169,-23170, - 22802,-23531,22802,-23531,22802,-23531,22802,-23531, - 22430,-23887,22430,-23887,22430,-23887,22430,-23887, - 22052,-24236,22052,-24236,22052,-24236,22052,-24236, - 21669,-24579,21669,-24579,21669,-24579,21669,-24579, - 21280,-24917,21280,-24917,21280,-24917,21280,-24917, - 20886,-25248,20886,-25248,20886,-25248,20886,-25248, - 20487,-25573,20487,-25573,20487,-25573,20487,-25573, - 20083,-25892,20083,-25892,20083,-25892,20083,-25892, - 19673,-26204,19673,-26204,19673,-26204,19673,-26204, - 19259,-26510,19259,-26510,19259,-26510,19259,-26510, - 18841,-26809,18841,-26809,18841,-26809,18841,-26809, - 18417,-27101,18417,-27101,18417,-27101,18417,-27101, - 17989,-27387,17989,-27387,17989,-27387,17989,-27387, - 17557,-27667,17557,-27667,17557,-27667,17557,-27667, - 17120,-27939,17120,-27939,17120,-27939,17120,-27939, - 16679,-28204,16679,-28204,16679,-28204,16679,-28204, - 16234,-28463,16234,-28463,16234,-28463,16234,-28463, - 15785,-28714,15785,-28714,15785,-28714,15785,-28714, - 15332,-28959,15332,-28959,15332,-28959,15332,-28959, - 14875,-29196,14875,-29196,14875,-29196,14875,-29196, - 14415,-29426,14415,-29426,14415,-29426,14415,-29426, - 13951,-29649,13951,-29649,13951,-29649,13951,-29649, - 13484,-29864,13484,-29864,13484,-29864,13484,-29864, - 13013,-30073,13013,-30073,13013,-30073,13013,-30073, - 12539,-30273,12539,-30273,12539,-30273,12539,-30273, - 12062,-30466,12062,-30466,12062,-30466,12062,-30466, - 11582,-30652,11582,-30652,11582,-30652,11582,-30652, - 11099,-30830,11099,-30830,11099,-30830,11099,-30830, - 10613,-31001,10613,-31001,10613,-31001,10613,-31001, - 10125,-31164,10125,-31164,10125,-31164,10125,-31164, - 9634,-31319,9634,-31319,9634,-31319,9634,-31319, - 9141,-31466,9141,-31466,9141,-31466,9141,-31466, - 8646,-31606,8646,-31606,8646,-31606,8646,-31606, - 8148,-31738,8148,-31738,8148,-31738,8148,-31738, - 7649,-31862,7649,-31862,7649,-31862,7649,-31862, - 7147,-31978,7147,-31978,7147,-31978,7147,-31978, - 6644,-32087,6644,-32087,6644,-32087,6644,-32087, - 6139,-32187,6139,-32187,6139,-32187,6139,-32187, - 5633,-32280,5633,-32280,5633,-32280,5633,-32280, - 5125,-32364,5125,-32364,5125,-32364,5125,-32364, - 4616,-32441,4616,-32441,4616,-32441,4616,-32441, - 4106,-32509,4106,-32509,4106,-32509,4106,-32509, - 3595,-32570,3595,-32570,3595,-32570,3595,-32570, - 3083,-32622,3083,-32622,3083,-32622,3083,-32622, - 2570,-32666,2570,-32666,2570,-32666,2570,-32666, - 2057,-32703,2057,-32703,2057,-32703,2057,-32703, - 1543,-32731,1543,-32731,1543,-32731,1543,-32731, - 1029,-32751,1029,-32751,1029,-32751,1029,-32751, - 514,-32763,514,-32763,514,-32763,514,-32763, - 0,-32767,0,-32767,0,-32767,0,-32767, - -515,-32763,-515,-32763,-515,-32763,-515,-32763, - -1030,-32751,-1030,-32751,-1030,-32751,-1030,-32751, - -1544,-32731,-1544,-32731,-1544,-32731,-1544,-32731, - -2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, - -2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, - -3084,-32622,-3084,-32622,-3084,-32622,-3084,-32622, - -3596,-32570,-3596,-32570,-3596,-32570,-3596,-32570, - -4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, - -4617,-32441,-4617,-32441,-4617,-32441,-4617,-32441, - -5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, - -5634,-32280,-5634,-32280,-5634,-32280,-5634,-32280, - -6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, - -6645,-32087,-6645,-32087,-6645,-32087,-6645,-32087, - -7148,-31978,-7148,-31978,-7148,-31978,-7148,-31978, - -7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, - -8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, - -8647,-31606,-8647,-31606,-8647,-31606,-8647,-31606, - -9142,-31466,-9142,-31466,-9142,-31466,-9142,-31466, - -9635,-31319,-9635,-31319,-9635,-31319,-9635,-31319, - -10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, - -10614,-31001,-10614,-31001,-10614,-31001,-10614,-31001, - -11100,-30830,-11100,-30830,-11100,-30830,-11100,-30830, - -11583,-30652,-11583,-30652,-11583,-30652,-11583,-30652, - -12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, - -12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, - -13014,-30073,-13014,-30073,-13014,-30073,-13014,-30073, - -13485,-29864,-13485,-29864,-13485,-29864,-13485,-29864, - -13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, - -14416,-29426,-14416,-29426,-14416,-29426,-14416,-29426, - -14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, - -15333,-28959,-15333,-28959,-15333,-28959,-15333,-28959, - -15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, - -16235,-28463,-16235,-28463,-16235,-28463,-16235,-28463, - -16680,-28204,-16680,-28204,-16680,-28204,-16680,-28204, - -17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, - -17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, - -17990,-27387,-17990,-27387,-17990,-27387,-17990,-27387, - -18418,-27101,-18418,-27101,-18418,-27101,-18418,-27101, - -18842,-26809,-18842,-26809,-18842,-26809,-18842,-26809, - -19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, - -19674,-26204,-19674,-26204,-19674,-26204,-19674,-26204, - -20084,-25892,-20084,-25892,-20084,-25892,-20084,-25892, - -20488,-25573,-20488,-25573,-20488,-25573,-20488,-25573, - -20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, - -21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, - -21670,-24579,-21670,-24579,-21670,-24579,-21670,-24579, - -22053,-24236,-22053,-24236,-22053,-24236,-22053,-24236, - -22431,-23887,-22431,-23887,-22431,-23887,-22431,-23887, - -22803,-23531,-22803,-23531,-22803,-23531,-22803,-23531, - -23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, - -23531,-22803,-23531,-22803,-23531,-22803,-23531,-22803, - -23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, - -24236,-22053,-24236,-22053,-24236,-22053,-24236,-22053, - -24579,-21670,-24579,-21670,-24579,-21670,-24579,-21670, - -24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, - -25248,-20887,-25248,-20887,-25248,-20887,-25248,-20887, - -25573,-20488,-25573,-20488,-25573,-20488,-25573,-20488, - -25892,-20084,-25892,-20084,-25892,-20084,-25892,-20084, - -26204,-19674,-26204,-19674,-26204,-19674,-26204,-19674, - -26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, - -26809,-18842,-26809,-18842,-26809,-18842,-26809,-18842, - -27101,-18418,-27101,-18418,-27101,-18418,-27101,-18418, - -27387,-17990,-27387,-17990,-27387,-17990,-27387,-17990, - -27667,-17558,-27667,-17558,-27667,-17558,-27667,-17558, - -27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, - -28204,-16680,-28204,-16680,-28204,-16680,-28204,-16680, - -28463,-16235,-28463,-16235,-28463,-16235,-28463,-16235, - -28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, - -28959,-15333,-28959,-15333,-28959,-15333,-28959,-15333, - -29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, - -29426,-14416,-29426,-14416,-29426,-14416,-29426,-14416, - -29649,-13952,-29649,-13952,-29649,-13952,-29649,-13952, - -29864,-13485,-29864,-13485,-29864,-13485,-29864,-13485, - -30073,-13014,-30073,-13014,-30073,-13014,-30073,-13014, - -30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, - -30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, - -30652,-11583,-30652,-11583,-30652,-11583,-30652,-11583, - -30830,-11100,-30830,-11100,-30830,-11100,-30830,-11100, - -31001,-10614,-31001,-10614,-31001,-10614,-31001,-10614, - -31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, - -31319,-9635,-31319,-9635,-31319,-9635,-31319,-9635, - -31466,-9142,-31466,-9142,-31466,-9142,-31466,-9142, - -31606,-8647,-31606,-8647,-31606,-8647,-31606,-8647, - -31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, - -31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, - -31978,-7148,-31978,-7148,-31978,-7148,-31978,-7148, - -32087,-6645,-32087,-6645,-32087,-6645,-32087,-6645, - -32187,-6140,-32187,-6140,-32187,-6140,-32187,-6140, - -32280,-5634,-32280,-5634,-32280,-5634,-32280,-5634, - -32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, - -32441,-4617,-32441,-4617,-32441,-4617,-32441,-4617, - -32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, - -32570,-3596,-32570,-3596,-32570,-3596,-32570,-3596, - -32622,-3084,-32622,-3084,-32622,-3084,-32622,-3084, - -32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, - -32703,-2058,-32703,-2058,-32703,-2058,-32703,-2058, - -32731,-1544,-32731,-1544,-32731,-1544,-32731,-1544, - -32751,-1030,-32751,-1030,-32751,-1030,-32751,-1030, - -32763,-515,-32763,-515,-32763,-515,-32763,-515, - -32767,-1,-32767,-1,-32767,-1,-32767,-1, - -32763,514,-32763,514,-32763,514,-32763,514, - -32751,1029,-32751,1029,-32751,1029,-32751,1029, - -32731,1543,-32731,1543,-32731,1543,-32731,1543, - -32703,2057,-32703,2057,-32703,2057,-32703,2057, - -32666,2570,-32666,2570,-32666,2570,-32666,2570, - -32622,3083,-32622,3083,-32622,3083,-32622,3083, - -32570,3595,-32570,3595,-32570,3595,-32570,3595, - -32509,4106,-32509,4106,-32509,4106,-32509,4106, - -32441,4616,-32441,4616,-32441,4616,-32441,4616, - -32364,5125,-32364,5125,-32364,5125,-32364,5125, - -32280,5633,-32280,5633,-32280,5633,-32280,5633, - -32187,6139,-32187,6139,-32187,6139,-32187,6139, - -32087,6644,-32087,6644,-32087,6644,-32087,6644, - -31978,7147,-31978,7147,-31978,7147,-31978,7147, - -31862,7649,-31862,7649,-31862,7649,-31862,7649, - -31738,8148,-31738,8148,-31738,8148,-31738,8148, - -31606,8646,-31606,8646,-31606,8646,-31606,8646, - -31466,9141,-31466,9141,-31466,9141,-31466,9141, - -31319,9634,-31319,9634,-31319,9634,-31319,9634, - -31164,10125,-31164,10125,-31164,10125,-31164,10125, - -31001,10613,-31001,10613,-31001,10613,-31001,10613, - -30830,11099,-30830,11099,-30830,11099,-30830,11099, - -30652,11582,-30652,11582,-30652,11582,-30652,11582, - -30466,12062,-30466,12062,-30466,12062,-30466,12062, - -30273,12539,-30273,12539,-30273,12539,-30273,12539, - -30073,13013,-30073,13013,-30073,13013,-30073,13013, - -29864,13484,-29864,13484,-29864,13484,-29864,13484, - -29649,13951,-29649,13951,-29649,13951,-29649,13951, - -29426,14415,-29426,14415,-29426,14415,-29426,14415, - -29196,14875,-29196,14875,-29196,14875,-29196,14875, - -28959,15332,-28959,15332,-28959,15332,-28959,15332, - -28714,15785,-28714,15785,-28714,15785,-28714,15785, - -28463,16234,-28463,16234,-28463,16234,-28463,16234, - -28204,16679,-28204,16679,-28204,16679,-28204,16679, - -27939,17120,-27939,17120,-27939,17120,-27939,17120, - -27667,17557,-27667,17557,-27667,17557,-27667,17557, - -27387,17989,-27387,17989,-27387,17989,-27387,17989, - -27101,18417,-27101,18417,-27101,18417,-27101,18417, - -26809,18841,-26809,18841,-26809,18841,-26809,18841, - -26510,19259,-26510,19259,-26510,19259,-26510,19259, - -26204,19673,-26204,19673,-26204,19673,-26204,19673, - -25892,20083,-25892,20083,-25892,20083,-25892,20083, - -25573,20487,-25573,20487,-25573,20487,-25573,20487, - -25248,20886,-25248,20886,-25248,20886,-25248,20886, - -24917,21280,-24917,21280,-24917,21280,-24917,21280, - -24579,21669,-24579,21669,-24579,21669,-24579,21669, - -24236,22052,-24236,22052,-24236,22052,-24236,22052, - -23887,22430,-23887,22430,-23887,22430,-23887,22430, - -23531,22802,-23531,22802,-23531,22802,-23531,22802, - -23170,23169,-23170,23169,-23170,23169,-23170,23169, - -22803,23530,-22803,23530,-22803,23530,-22803,23530, - -22431,23886,-22431,23886,-22431,23886,-22431,23886, - -22053,24235,-22053,24235,-22053,24235,-22053,24235, - -21670,24578,-21670,24578,-21670,24578,-21670,24578, - -21281,24916,-21281,24916,-21281,24916,-21281,24916, - -20887,25247,-20887,25247,-20887,25247,-20887,25247, - -20488,25572,-20488,25572,-20488,25572,-20488,25572, - -20084,25891,-20084,25891,-20084,25891,-20084,25891, - -19674,26203,-19674,26203,-19674,26203,-19674,26203, - -19260,26509,-19260,26509,-19260,26509,-19260,26509, - -18842,26808,-18842,26808,-18842,26808,-18842,26808, - -18418,27100,-18418,27100,-18418,27100,-18418,27100, - -17990,27386,-17990,27386,-17990,27386,-17990,27386, - -17558,27666,-17558,27666,-17558,27666,-17558,27666, - -17121,27938,-17121,27938,-17121,27938,-17121,27938, - -16680,28203,-16680,28203,-16680,28203,-16680,28203, - -16235,28462,-16235,28462,-16235,28462,-16235,28462, - -15786,28713,-15786,28713,-15786,28713,-15786,28713, - -15333,28958,-15333,28958,-15333,28958,-15333,28958, - -14876,29195,-14876,29195,-14876,29195,-14876,29195, - -14416,29425,-14416,29425,-14416,29425,-14416,29425, - -13952,29648,-13952,29648,-13952,29648,-13952,29648, - -13485,29863,-13485,29863,-13485,29863,-13485,29863, - -13014,30072,-13014,30072,-13014,30072,-13014,30072, - -12540,30272,-12540,30272,-12540,30272,-12540,30272, - -12063,30465,-12063,30465,-12063,30465,-12063,30465, - -11583,30651,-11583,30651,-11583,30651,-11583,30651, - -11100,30829,-11100,30829,-11100,30829,-11100,30829, - -10614,31000,-10614,31000,-10614,31000,-10614,31000, - -10126,31163,-10126,31163,-10126,31163,-10126,31163, - -9635,31318,-9635,31318,-9635,31318,-9635,31318, - -9142,31465,-9142,31465,-9142,31465,-9142,31465, - -8647,31605,-8647,31605,-8647,31605,-8647,31605, - -8149,31737,-8149,31737,-8149,31737,-8149,31737, - -7650,31861,-7650,31861,-7650,31861,-7650,31861, - -7148,31977,-7148,31977,-7148,31977,-7148,31977, - -6645,32086,-6645,32086,-6645,32086,-6645,32086, - -6140,32186,-6140,32186,-6140,32186,-6140,32186, - -5634,32279,-5634,32279,-5634,32279,-5634,32279, - -5126,32363,-5126,32363,-5126,32363,-5126,32363, - -4617,32440,-4617,32440,-4617,32440,-4617,32440, - -4107,32508,-4107,32508,-4107,32508,-4107,32508, - -3596,32569,-3596,32569,-3596,32569,-3596,32569, - -3084,32621,-3084,32621,-3084,32621,-3084,32621, - -2571,32665,-2571,32665,-2571,32665,-2571,32665, - -2058,32702,-2058,32702,-2058,32702,-2058,32702, - -1544,32730,-1544,32730,-1544,32730,-1544,32730, - -1030,32750,-1030,32750,-1030,32750,-1030,32750, - -515,32762,-515,32762,-515,32762,-515,32762 - }; - +int16_t twa1200[4784]; +int16_t twb1200[4784]; +int16_t twc1200[4784]; void dft1200(int16_t *x,int16_t *y,unsigned char scale_flag) { @@ -18504,11 +8526,335 @@ void dft1200(int16_t *x,int16_t *y,unsigned char scale_flag) } +void init_rad4(int N,int16_t *tw) { + + int16_t *twa = tw; + int16_t *twb = twa+(N/2); + int16_t *twc = twb+(N/2); + int i; + + for (i=0;i<(N/4);i++) { + *twa = (int16_t)round(32767.0*cos(2*M_PI*i/N)); twa++; + *twa = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); twa++; + *twb = (int16_t)round(32767.0*cos(2*M_PI*2*i/N)); twb++; + *twb = -(int16_t)round(32767.0*sin(2*M_PI*2*i/N)); twb++; + *twc = (int16_t)round(32767.0*cos(2*M_PI*3*i/N)); twc++; + *twc = -(int16_t)round(32767.0*sin(2*M_PI*3*i/N)); twc++; + } +} +void init_rad4_rep(int N,int16_t *twa,int16_t *twb,int16_t *twc) { + + int i,j; + + for (i=1;i<(N/4);i++) { + twa[0] = (int16_t)round(32767.0*cos(2*M_PI*i/N)); + twa[1] = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); + twb[0] = (int16_t)round(32767.0*cos(2*M_PI*2*i/N)); + twb[1] = -(int16_t)round(32767.0*sin(2*M_PI*2*i/N)); + twc[0] = (int16_t)round(32767.0*cos(2*M_PI*3*i/N)); + twc[1] = -(int16_t)round(32767.0*sin(2*M_PI*3*i/N)); + for (j=1;j<4;j++) { + ((int32_t*)twa)[j]=((int32_t*)twa)[0]; + ((int32_t*)twb)[j]=((int32_t*)twb)[0]; + ((int32_t*)twc)[j]=((int32_t*)twc)[0]; + } + twa+=8; + twb+=8; + twc+=8; + } +} + +void init_rad2(int N,int16_t *tw) { + + int16_t *twa = tw; + int i; + + for (i=0;i<(N>>1);i++) { + *twa = (int16_t)round(32767.0*cos(2*M_PI*i/N)); twa++; + *twa = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); twa++; + } +} + +void init_rad2_rep(int N,int16_t *twa) { + + int i,j; + + for (i=1;i<(N/2);i++) { + twa[0] = (int16_t)round(32767.0*cos(2*M_PI*i/N)); + twa[1] = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); + for (j=1;j<4;j++) { + ((int32_t*)twa)[j]=((int32_t*)twa)[0]; + } + twa+=8; + } +} + +void init_rad3(int N,int16_t *twa,int16_t *twb) { + + int i; + + for (i=0;i<(N/3);i++) { + *twa = (int16_t)round(32767.0*cos(2*M_PI*i/N)); twa++; + *twa = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); twa++; + *twb = (int16_t)round(32767.0*cos(2*M_PI*2*i/N)); twb++; + *twb = -(int16_t)round(32767.0*sin(2*M_PI*2*i/N)); twb++; + } +} + +void init_rad3_rep(int N,int16_t *twa,int16_t *twb) { + + int i,j; + + for (i=1;i<(N/3);i++) { + twa[0] = (int16_t)round(32767.0*cos(2*M_PI*i/N)); + twa[1] = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); + twb[0] = (int16_t)round(32767.0*cos(2*M_PI*2*i/N)); + twb[1] = -(int16_t)round(32767.0*sin(2*M_PI*2*i/N)); + for (j=1;j<4;j++) { + ((int32_t*)twa)[j]=((int32_t*)twa)[0]; + ((int32_t*)twb)[j]=((int32_t*)twb)[0]; + } + twa+=8; + twb+=8; + } +} + +void init_rad5_rep(int N,int16_t *twa,int16_t *twb,int16_t *twc,int16_t *twd) { + + int i,j; + + for (i=1;i<(N/5);i++) { + twa[0] = (int16_t)round(32767.0*cos(2*M_PI*i/N)); + twa[1] = -(int16_t)round(32767.0*sin(2*M_PI*i/N)); + twb[0] = (int16_t)round(32767.0*cos(2*M_PI*2*i/N)); + twb[1] = -(int16_t)round(32767.0*sin(2*M_PI*2*i/N)); + twc[0] = (int16_t)round(32767.0*cos(2*M_PI*3*i/N)); + twc[1] = -(int16_t)round(32767.0*sin(2*M_PI*3*i/N)); + twd[0] = (int16_t)round(32767.0*cos(2*M_PI*4*i/N)); + twd[1] = -(int16_t)round(32767.0*sin(2*M_PI*4*i/N)); + for (j=1;j<4;j++) { + ((int32_t*)twa)[j]=((int32_t*)twa)[0]; + ((int32_t*)twb)[j]=((int32_t*)twb)[0]; + ((int32_t*)twc)[j]=((int32_t*)twc)[0]; + ((int32_t*)twd)[j]=((int32_t*)twd)[0]; + } + twa+=8; + twb+=8; + twc+=8; + twd+=8; + } +} + + +void init_dfts(void) +{ + init_rad4(1024,tw1024); + init_rad2(2048,tw2048); + init_rad4(4096,tw4096); + init_rad2(8192,tw8192); + + init_rad3(1536,twa1536,twb1536); + init_rad3(3072,twa3072,twb3072); + init_rad3(6144,twa6144,twb6144); + init_rad3(12288,twa12288,twb12288); + init_rad3(18432,twa18432,twb18432); + init_rad3(24576,twa24576,twb24576); + + init_rad2_rep(24,tw24); + init_rad3_rep(36,twa36,twb36); + init_rad4_rep(48,twa48,twb48,twc48); + init_rad5_rep(60,twa60,twb60,twc60,twd60); + init_rad2_rep(72,tw72); + init_rad2_rep(96,tw96); + init_rad3_rep(108,twa108,twb108); + init_rad2_rep(120,tw120); + init_rad3_rep(144,twa144,twb144); + init_rad3_rep(180,twa180,twb180); + init_rad4_rep(192,twa192,twb192,twc192); + init_rad3_rep(216,twa216,twb216); + init_rad4_rep(240,twa240,twb240,twc240); + init_rad3_rep(288,twa288,twb288); + init_rad5_rep(300,twa300,twb300,twc300,twd300); + init_rad3_rep(324,twa324,twb324); + init_rad3_rep(360,twa360,twb360); + init_rad4_rep(384,twa384,twb384,twc384); + init_rad4_rep(432,twa432,twb432,twc432); + init_rad4_rep(480,twa480,twb480,twc480); + init_rad3_rep(540,twa540,twb540); + init_rad3_rep(576,twa576,twb576); + init_rad2_rep(600,twa600); + init_rad3_rep(648,twa648,twb648); + init_rad4_rep(720,twa720,twb720,twc720); + init_rad4_rep(768,twa768,twb768,twc768); + init_rad3_rep(864,twa864,twb864); + init_rad3_rep(900,twa900,twb900); + init_rad4_rep(960,twa960,twb960,twc960); + init_rad3_rep(972,twa972,twb972); + init_rad3_rep(1080,twa1080,twb1080); + init_rad4_rep(1152,twa1152,twb1152,twc1152); + init_rad4_rep(1200,twa1200,twb1200,twc1200); +} #ifdef MR_MAIN #include <string.h> #include <stdio.h> +#define LOG_M write_output +int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format) +{ + + FILE *fp=NULL; + int i; + + + printf("Writing %d elements of type %d to %s\n",length,format,fname); + + + if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) { + fp = fopen(fname,"a+"); + } else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) { + fp = fopen(fname,"w+"); + } + + + + if (fp== NULL) { + printf("[OPENAIR][FILE OUTPUT] Cannot open file %s\n",fname); + return(-1); + } + + if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) + fprintf(fp,"%s = [",vname); + + + switch (format) { + case 0: // real 16-bit + + for (i=0; i<length; i+=dec) { + fprintf(fp,"%d\n",((short *)data)[i]); + } + + break; + + case 1: // complex 16-bit + case 13: + case 14: + case 15: + + for (i=0; i<length<<1; i+=(2*dec)) { + fprintf(fp,"%d + j*(%d)\n",((short *)data)[i],((short *)data)[i+1]); + + } + + + break; + + case 2: // real 32-bit + for (i=0; i<length; i+=dec) { + fprintf(fp,"%d\n",((int *)data)[i]); + } + + break; + + case 3: // complex 32-bit + for (i=0; i<length<<1; i+=(2*dec)) { + fprintf(fp,"%d + j*(%d)\n",((int *)data)[i],((int *)data)[i+1]); + } + + break; + + case 4: // real 8-bit + for (i=0; i<length; i+=dec) { + fprintf(fp,"%d\n",((char *)data)[i]); + } + + break; + + case 5: // complex 8-bit + for (i=0; i<length<<1; i+=(2*dec)) { + fprintf(fp,"%d + j*(%d)\n",((char *)data)[i],((char *)data)[i+1]); + } + + break; + + case 6: // real 64-bit + for (i=0; i<length; i+=dec) { + fprintf(fp,"%lld\n",((long long*)data)[i]); + } + + break; + + case 7: // real double + for (i=0; i<length; i+=dec) { + fprintf(fp,"%g\n",((double *)data)[i]); + } + + break; + + case 8: // complex double + for (i=0; i<length<<1; i+=2*dec) { + fprintf(fp,"%g + j*(%g)\n",((double *)data)[i], ((double *)data)[i+1]); + } + + break; + + case 9: // real unsigned 8-bit + for (i=0; i<length; i+=dec) { + fprintf(fp,"%d\n",((unsigned char *)data)[i]); + } + + break; + + + case 10 : // case eren 16 bit complex : + + for (i=0; i<length<<1; i+=(2*dec)) { + + if((i < 2*(length-1)) && (i > 0)) + fprintf(fp,"%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]); + else if (i == 2*(length-1)) + fprintf(fp,"%d + j*(%d);",((short *)data)[i],((short *)data)[i+1]); + else if (i == 0) + fprintf(fp,"\n%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]); + + + + } + + break; + + case 11 : //case eren 16 bit real for channel magnitudes: + for (i=0; i<length; i+=dec) { + + if((i <(length-1))&& (i > 0)) + fprintf(fp,"%d,",((short *)data)[i]); + else if (i == (length-1)) + fprintf(fp,"%d;",((short *)data)[i]); + else if (i == 0) + fprintf(fp,"\n%d,",((short *)data)[i]); + } + + printf("\n erennnnnnnnnnnnnnn: length :%d",length); + break; + + case 12 : // case eren for log2_maxh real unsigned 8 bit + fprintf(fp,"%d \n",((unsigned char *)&data)[0]); + break; + + } + + if (format != 10 && format !=11 && format !=12 && format != 13 && format != 15) { + fprintf(fp,"];\n"); + fclose(fp); + return(0); + } else if (format == 10 || format ==11 || format == 12 || format == 13 || format == 15) { + fclose(fp); + return(0); + } + + return 0; +} + int main(int argc, char**argv) { @@ -18516,12 +8862,14 @@ int main(int argc, char**argv) time_stats_t ts; #ifdef __AVX2__ - simd256_q15_t x[2048],y[2048],tw0,tw1,tw2,tw3; + simd256_q15_t x[4096],y[4096],tw0,tw1,tw2,tw3; #else - simd_q15_t x[4096],y[4096],tw0,tw1,tw2,tw3; + simd_q15_t x[8192],y[8192],tw0,tw1,tw2,tw3; #endif int i; - simd_q15_t *x128=x,*y128=y; + simd_q15_t *x128=(simd_q15_t*)x,*y128=(simd_q15_t*)y; + + init_dfts(); set_taus_seed(0); opp_enabled = 1; @@ -18688,155 +9036,7 @@ int main(int argc, char**argv) printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); printf("\n"); - dft24((int16_t *)x,(int16_t *)y,1); - printf("\n\n24-point\n"); - printf("X: "); - for (i=0;i<24;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<24;i++) - printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft36((int16_t *)x,(int16_t *)y,1); - printf("\n\n36-point\n"); - printf("X: "); - for (i=0;i<36;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<36;i++) - printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft48((int16_t *)x,(int16_t *)y,1); - printf("\n\n48-point\n"); - printf("X: "); - for (i=0;i<48;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<48;i++) - printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); */ - dft60((int16_t *)x,(int16_t *)y,1); - printf("\n\n60-point\n"); - printf("X: "); - for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); - printf("\nY:"); - for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); - printf("\n"); - - dft72((int16_t *)x,(int16_t *)y,1); - printf("\n\n72-point\n"); - printf("X: "); - for (i=0;i<72;i++) - printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); - printf("\nY:"); - for (i=0;i<72;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); - printf("\n"); - /* - dft96((int16_t *)x,(int16_t *)y,1); - printf("\n\n96-point\n"); - printf("X: "); - for (i=0;i<96;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<96;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft108((int16_t *)x,(int16_t *)y,1); - printf("\n\n108-point\n"); - printf("X: "); - for (i=0;i<108;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<108;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - */ - dft120((int16_t *)x,(int16_t *)y,1); - printf("\n\n120-point\n"); - printf("X: "); - for (i=0;i<120;i++) - printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); - printf("\nY:"); - for (i=0;i<120;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); - printf("\n"); - /* - dft144((int16_t *)x,(int16_t *)y,1); - printf("\n\n144-point\n"); - printf("X: "); - for (i=0;i<144;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<144;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft180((int16_t *)x,(int16_t *)y,1); - printf("\n\n180-point\n"); - printf("X: "); - for (i=0;i<180;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<180;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft192((int16_t *)x,(int16_t *)y,1); - printf("\n\n192-point\n"); - printf("X: "); - for (i=0;i<192;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<192;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft216((int16_t *)x,(int16_t *)y,1); - printf("\n\n216-point\n"); - printf("X: "); - for (i=0;i<216;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<216;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft240((int16_t *)x,(int16_t *)y,1); - printf("\n\n240-point\n"); - printf("X: "); - for (i=0;i<240;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<240;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft288((int16_t *)x,(int16_t *)y,1); - printf("\n\n288-point\n"); - printf("X: "); - for (i=0;i<288;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<288;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); - - dft300((int16_t *)x,(int16_t *)y,1); - printf("\n\n300-point\n"); - printf("X: "); - for (i=0;i<300;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); - printf("\nY:"); - for (i=0;i<300;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); - printf("\n"); for (i=0;i<32;i++) { ((int16_t*)x)[i] = (int16_t)((taus()&0xffff))>>5; @@ -18852,7 +9052,7 @@ int main(int argc, char**argv) for (i=0;i<4;i++) printf("%d,%d,%d,%d,%d,%d,%d,%d,",((int16_t*)&y[i])[0],((int16_t *)&y[i])[1],((int16_t*)&y[i])[2],((int16_t *)&y[i])[3],((int16_t*)&y[i])[4],((int16_t *)&y[i])[5],((int16_t*)&y[i])[6],((int16_t *)&y[i])[7]); printf("\n"); - */ + memset((void*)&x[0],0,2048*4); for (i=0; i<2048; i+=4) { @@ -18918,12 +9118,12 @@ int main(int argc, char**argv) stop_meas(&ts); } - + /* printf("\n\n64-point (%f cycles, #trials %d)\n",(double)ts.diff/(double)ts.trials,ts.trials); // LOG_M("x64.m","x64",x,64,1,1); LOG_M("y64.m","y64",y,64,1,1); LOG_M("x64.m","x64",x,64,1,1); - + */ /* printf("X: "); for (i=0;i<16;i++) @@ -19128,7 +9328,7 @@ int main(int argc, char**argv) else ((int16_t*)x)[i] = -364; } - for (i=2*(4096-1200);i<8192;i++) { + for (i=2*(8192-2400);i<16384;i++) { if ((taus() & 1)==0) ((int16_t*)x)[i] = 364; else @@ -19141,10 +9341,192 @@ int main(int argc, char**argv) stop_meas(&ts); } - printf("\n\n8192-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + printf("\n\n1536-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y8192.m","y8192",y,8192,1,1); + LOG_M("x8192.m","x8192",x,8192,1,1); + + memset((void*)x,0,1536*sizeof(int32_t)); + for (i=2;i<1202;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(1536-600);i<3072;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft1536((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n1536-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y1536.m","y1536",y,1536,1,1); + LOG_M("x1536.m","x1536",x,1536,1,1); + + printf("\n\n1536-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); LOG_M("y8192.m","y8192",y,8192,1,1); LOG_M("x8192.m","x8192",x,8192,1,1); + memset((void*)x,0,3072*sizeof(int32_t)); + for (i=2;i<1202;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(3072-600);i<3072;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft3072((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n3072-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y3072.m","y3072",y,3072,1,1); + LOG_M("x3072.m","x3072",x,3072,1,1); + + memset((void*)x,0,6144*sizeof(int32_t)); + for (i=2;i<4802;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(6144-2400);i<12288;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft6144((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n6144-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y6144.m","y6144",y,6144,1,1); + LOG_M("x6144.m","x6144",x,6144,1,1); + + memset((void*)x,0,12288*sizeof(int32_t)); + for (i=2;i<9602;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(12288-4800);i<24576;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft12288((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n12288-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y12288.m","y12288",y,12288,1,1); + LOG_M("x12288.m","x12288",x,12288,1,1); + + memset((void*)x,0,18432*sizeof(int32_t)); + for (i=2;i<14402;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(18432-7200);i<36864;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft18432((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n18432-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y18432.m","y18432",y,18432,1,1); + LOG_M("x18432.m","x18432",x,18432,1,1); + + memset((void*)x,0,24576*sizeof(int32_t)); + for (i=2;i<19202;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(24576-19200);i<49152;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft24576((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n24576-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + LOG_M("y24576.m","y24576",y,24576,1,1); + LOG_M("x24576.m","x24576",x,24576,1,1); + + int dftsizes[33]={24,36,48,60,72,96,108,120,144,180,192,216,240,288,300,324,360,384,432,480,540,576,600,648,720,768,864,900,960,972,1080,1152,1200}; + void (*dft[33])(int16_t *x,int16_t *y,uint8_t scale) = {dft24,dft36,dft48,dft60,dft72,dft96,dft108,dft120,dft144,dft180,dft192,dft216,dft240,dft288,dft300,dft324,dft360,dft384,dft432,dft480,dft540,dft576,dft600,dft648,dft720,dft768,dft864,dft900,dft960,dft972,dft1080,dft1152,dft1200}; + for (int n=0;n<33;n++) { + // 4xN-point DFT + memset((void*)x,0,dftsizes[n]*8*sizeof(int16_t)); + for (i=0;i<dftsizes[n]*8;i+=8) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + if ((taus() & 1)==0) + ((int16_t*)x)[i+1] = 364; + else + ((int16_t*)x)[i+1] = -364; + } + + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + (dft[n])((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n4x%d-point(%f cycles)\n",dftsizes[n],(double)ts.diff/(double)ts.trials); + char ystr[5],xstr[5],ystr2[5],xstr2[5]; + sprintf(ystr,"y%d.m",dftsizes[n]); + sprintf(xstr,"x%d.m",dftsizes[n]); + sprintf(ystr2,"y%d",dftsizes[n]); + sprintf(xstr2,"x%d",dftsizes[n]); + LOG_M(ystr,ystr2,y,dftsizes[n]*4,1,1); + LOG_M(xstr,xstr2,x,dftsizes[n]*4,1,1); + } + + return(0); } diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index e09cfb5ed84ee65a272f9ceb0f1b3bef2cb72215..a5e8d49eb7d95eeeca4120fe5705eeb80fc3df61 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -174,27 +174,27 @@ This function performs optimized fixed-point radix-2 FFT/IFFT. void idft1536(int16_t *sigF,int16_t *sig,int scale); -void idft6144(int16_t *sigF,int16_t *sig); +void idft6144(int16_t *sigF,int16_t *sig,int scale); -void idft12288(int16_t *sigF,int16_t *sig); +void idft12288(int16_t *sigF,int16_t *sig,int scale); -void idft18432(int16_t *sigF,int16_t *sig); +void idft18432(int16_t *sigF,int16_t *sig,int scale); -void idft3072(int16_t *sigF,int16_t *sig); +void idft3072(int16_t *sigF,int16_t *sig,int scale); -void idft24576(int16_t *sigF,int16_t *sig); +void idft24576(int16_t *sigF,int16_t *sig,int scale); void dft1536(int16_t *sigF,int16_t *sig,int scale); -void dft6144(int16_t *sigF,int16_t *sig); +void dft6144(int16_t *sigF,int16_t *sig,int scale); -void dft12288(int16_t *sigF,int16_t *sig); +void dft12288(int16_t *sigF,int16_t *sig,int scale); -void dft18432(int16_t *sigF,int16_t *sig); +void dft18432(int16_t *sigF,int16_t *sig,int scale); -void dft3072(int16_t *sigF,int16_t *sig); +void dft3072(int16_t *sigF,int16_t *sig,int scale); -void dft24576(int16_t *sigF,int16_t *sig); +void dft24576(int16_t *sigF,int16_t *sig,int scale); /*!\fn int32_t rotate_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N,uint16_t output_shift) diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h deleted file mode 100644 index 17fa92f4e9b341ccb0dd05cc44e83817ed6a2475..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/12288)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:8190)/12288)); -twa2 = zeros(1,8192); -twb2 = zeros(1,8192); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); - - - */ - -int16_t twa12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386}; - -int16_t twb12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394,-16384,-28378,-16413,-28361,-16442,-28344,-16471,-28327,-16500,-28310,-16529,-28293,-16558,-28276,-16587,-28260,-16616,-28243,-16644,-28226,-16673,-28209,-16702,-28191,-16731,-28174,-16760,-28157,-16789,-28140,-16817,-28123,-16846,-28106,-16875,-28088,-16904,-28071,-16932,-28054,-16961,-28037,-16990,-28019,-17018,-28002,-17047,-27984,-17075,-27967,-17104,-27949,-17133,-27932,-17161,-27914,-17190,-27897,-17218,-27879,-17247,-27862,-17275,-27844,-17304,-27826,-17332,-27809,-17361,-27791,-17389,-27773,-17417,-27755,-17446,-27737,-17474,-27720,-17502,-27702,-17531,-27684,-17559,-27666,-17587,-27648,-17616,-27630,-17644,-27612,-17672,-27594,-17700,-27576,-17728,-27558,-17757,-27539,-17785,-27521,-17813,-27503,-17841,-27485,-17869,-27467,-17897,-27448,-17925,-27430,-17953,-27412,-17981,-27393,-18009,-27375,-18037,-27356,-18065,-27338,-18093,-27320,-18121,-27301,-18149,-27282,-18177,-27264,-18205,-27245,-18233,-27227,-18261,-27208,-18288,-27189,-18316,-27171,-18344,-27152,-18372,-27133,-18399,-27114,-18427,-27095,-18455,-27077,-18483,-27058,-18510,-27039,-18538,-27020,-18565,-27001,-18593,-26982,-18621,-26963,-18648,-26944,-18676,-26925,-18703,-26906,-18731,-26886,-18758,-26867,-18786,-26848,-18813,-26829,-18841,-26810,-18868,-26790,-18895,-26771,-18923,-26752,-18950,-26732,-18977,-26713,-19005,-26693,-19032,-26674,-19059,-26655,-19087,-26635,-19114,-26616,-19141,-26596,-19168,-26576,-19195,-26557,-19222,-26537,-19250,-26517,-19277,-26498,-19304,-26478,-19331,-26458,-19358,-26438,-19385,-26419,-19412,-26399,-19439,-26379,-19466,-26359,-19493,-26339,-19520,-26319,-19547,-26299,-19574,-26279,-19600,-26259,-19627,-26239,-19654,-26219,-19681,-26199,-19708,-26179,-19734,-26159,-19761,-26138,-19788,-26118,-19815,-26098,-19841,-26078,-19868,-26057,-19895,-26037,-19921,-26017,-19948,-25996,-19974,-25976,-20001,-25955,-20027,-25935,-20054,-25914,-20080,-25894,-20107,-25873,-20133,-25853,-20160,-25832,-20186,-25812,-20213,-25791,-20239,-25770,-20265,-25750,-20292,-25729,-20318,-25708,-20344,-25687,-20370,-25666,-20397,-25646,-20423,-25625,-20449,-25604,-20475,-25583,-20501,-25562,-20528,-25541,-20554,-25520,-20580,-25499,-20606,-25478,-20632,-25457,-20658,-25436,-20684,-25415,-20710,-25393,-20736,-25372,-20762,-25351,-20788,-25330,-20814,-25308,-20839,-25287,-20865,-25266,-20891,-25244,-20917,-25223,-20943,-25202,-20968,-25180,-20994,-25159,-21020,-25137,-21046,-25116,-21071,-25094,-21097,-25073,-21123,-25051,-21148,-25030,-21174,-25008,-21199,-24986,-21225,-24965,-21250,-24943,-21276,-24921,-21301,-24899,-21327,-24878,-21352,-24856,-21378,-24834,-21403,-24812,-21428,-24790,-21454,-24768,-21479,-24746,-21504,-24724,-21530,-24702,-21555,-24680,-21580,-24658,-21605,-24636,-21630,-24614,-21656,-24592,-21681,-24570,-21706,-24547,-21731,-24525,-21756,-24503,-21781,-24481,-21806,-24458,-21831,-24436,-21856,-24414,-21881,-24391,-21906,-24369,-21931,-24347,-21956,-24324,-21981,-24302,-22005,-24279,-22030,-24257,-22055,-24234,-22080,-24212,-22105,-24189,-22129,-24166,-22154,-24144,-22179,-24121,-22203,-24098,-22228,-24076,-22253,-24053,-22277,-24030,-22302,-24007,-22326,-23985,-22351,-23962,-22375,-23939,-22400,-23916,-22424,-23893,-22449,-23870,-22473,-23847,-22497,-23824,-22522,-23801,-22546,-23778,-22570,-23755,-22595,-23732,-22619,-23709,-22643,-23686,-22667,-23662,-22692,-23639,-22716,-23616,-22740,-23593,-22764,-23570,-22788,-23546,-22812,-23523,-22836,-23500,-22860,-23476,-22884,-23453,-22908,-23429,-22932,-23406,-22956,-23383,-22980,-23359,-23004,-23336,-23028,-23312,-23051,-23288,-23075,-23265,-23099,-23241,-23123,-23218,-23147,-23194,-23170,-23170,-23194,-23147,-23218,-23123,-23241,-23099,-23265,-23075,-23288,-23051,-23312,-23028,-23336,-23004,-23359,-22980,-23383,-22956,-23406,-22932,-23429,-22908,-23453,-22884,-23476,-22860,-23500,-22836,-23523,-22812,-23546,-22788,-23570,-22764,-23593,-22740,-23616,-22716,-23639,-22692,-23662,-22667,-23686,-22643,-23709,-22619,-23732,-22595,-23755,-22570,-23778,-22546,-23801,-22522,-23824,-22497,-23847,-22473,-23870,-22449,-23893,-22424,-23916,-22400,-23939,-22375,-23962,-22351,-23985,-22326,-24007,-22302,-24030,-22277,-24053,-22253,-24076,-22228,-24098,-22203,-24121,-22179,-24144,-22154,-24166,-22129,-24189,-22105,-24212,-22080,-24234,-22055,-24257,-22030,-24279,-22005,-24302,-21981,-24324,-21956,-24347,-21931,-24369,-21906,-24391,-21881,-24414,-21856,-24436,-21831,-24458,-21806,-24481,-21781,-24503,-21756,-24525,-21731,-24547,-21706,-24570,-21681,-24592,-21656,-24614,-21630,-24636,-21605,-24658,-21580,-24680,-21555,-24702,-21530,-24724,-21504,-24746,-21479,-24768,-21454,-24790,-21428,-24812,-21403,-24834,-21378,-24856,-21352,-24878,-21327,-24899,-21301,-24921,-21276,-24943,-21250,-24965,-21225,-24986,-21199,-25008,-21174,-25030,-21148,-25051,-21123,-25073,-21097,-25094,-21071,-25116,-21046,-25137,-21020,-25159,-20994,-25180,-20968,-25202,-20943,-25223,-20917,-25244,-20891,-25266,-20865,-25287,-20839,-25308,-20814,-25330,-20788,-25351,-20762,-25372,-20736,-25393,-20710,-25415,-20684,-25436,-20658,-25457,-20632,-25478,-20606,-25499,-20580,-25520,-20554,-25541,-20528,-25562,-20501,-25583,-20475,-25604,-20449,-25625,-20423,-25646,-20397,-25666,-20370,-25687,-20344,-25708,-20318,-25729,-20292,-25750,-20265,-25770,-20239,-25791,-20213,-25812,-20186,-25832,-20160,-25853,-20133,-25873,-20107,-25894,-20080,-25914,-20054,-25935,-20027,-25955,-20001,-25976,-19974,-25996,-19948,-26017,-19921,-26037,-19895,-26057,-19868,-26078,-19841,-26098,-19815,-26118,-19788,-26138,-19761,-26159,-19734,-26179,-19708,-26199,-19681,-26219,-19654,-26239,-19627,-26259,-19600,-26279,-19574,-26299,-19547,-26319,-19520,-26339,-19493,-26359,-19466,-26379,-19439,-26399,-19412,-26419,-19385,-26438,-19358,-26458,-19331,-26478,-19304,-26498,-19277,-26517,-19250,-26537,-19222,-26557,-19195,-26576,-19168,-26596,-19141,-26616,-19114,-26635,-19087,-26655,-19059,-26674,-19032,-26693,-19005,-26713,-18977,-26732,-18950,-26752,-18923,-26771,-18895,-26790,-18868,-26810,-18841,-26829,-18813,-26848,-18786,-26867,-18758,-26886,-18731,-26906,-18703,-26925,-18676,-26944,-18648,-26963,-18621,-26982,-18593,-27001,-18565,-27020,-18538,-27039,-18510,-27058,-18483,-27077,-18455,-27095,-18427,-27114,-18399,-27133,-18372,-27152,-18344,-27171,-18316,-27189,-18288,-27208,-18261,-27227,-18233,-27245,-18205,-27264,-18177,-27282,-18149,-27301,-18121,-27320,-18093,-27338,-18065,-27356,-18037,-27375,-18009,-27393,-17981,-27412,-17953,-27430,-17925,-27448,-17897,-27467,-17869,-27485,-17841,-27503,-17813,-27521,-17785,-27539,-17757,-27558,-17728,-27576,-17700,-27594,-17672,-27612,-17644,-27630,-17616,-27648,-17587,-27666,-17559,-27684,-17531,-27702,-17502,-27720,-17474,-27737,-17446,-27755,-17417,-27773,-17389,-27791,-17361,-27809,-17332,-27826,-17304,-27844,-17275,-27862,-17247,-27879,-17218,-27897,-17190,-27914,-17161,-27932,-17133,-27949,-17104,-27967,-17075,-27984,-17047,-28002,-17018,-28019,-16990,-28037,-16961,-28054,-16932,-28071,-16904,-28088,-16875,-28106,-16846,-28123,-16817,-28140,-16789,-28157,-16760,-28174,-16731,-28191,-16702,-28209,-16673,-28226,-16644,-28243,-16616,-28260,-16587,-28276,-16558,-28293,-16529,-28310,-16500,-28327,-16471,-28344,-16442,-28361,-16413,-28378,-16384,-28394,-16355,-28411,-16326,-28428,-16297,-28444,-16268,-28461,-16239,-28478,-16210,-28494,-16180,-28511,-16151,-28527,-16122,-28544,-16093,-28560,-16064,-28576,-16035,-28593,-16005,-28609,-15976,-28626,-15947,-28642,-15918,-28658,-15888,-28674,-15859,-28691,-15830,-28707,-15800,-28723,-15771,-28739,-15741,-28755,-15712,-28771,-15683,-28787,-15653,-28803,-15624,-28819,-15594,-28835,-15565,-28851,-15535,-28867,-15506,-28883,-15476,-28898,-15447,-28914,-15417,-28930,-15388,-28946,-15358,-28961,-15328,-28977,-15299,-28993,-15269,-29008,-15239,-29024,-15210,-29039,-15180,-29055,-15150,-29070,-15121,-29086,-15091,-29101,-15061,-29117,-15031,-29132,-15002,-29147,-14972,-29163,-14942,-29178,-14912,-29193,-14882,-29208,-14853,-29223,-14823,-29239,-14793,-29254,-14763,-29269,-14733,-29284,-14703,-29299,-14673,-29314,-14643,-29329,-14613,-29344,-14583,-29359,-14553,-29373,-14523,-29388,-14493,-29403,-14463,-29418,-14433,-29433,-14403,-29447,-14373,-29462,-14343,-29477,-14312,-29491,-14282,-29506,-14252,-29520,-14222,-29535,-14192,-29549,-14161,-29564,-14131,-29578,-14101,-29593,-14071,-29607,-14040,-29622,-14010,-29636,-13980,-29650,-13950,-29664,-13919,-29679,-13889,-29693,-13859,-29707,-13828,-29721,-13798,-29735,-13767,-29749,-13737,-29763,-13707,-29777,-13676,-29791,-13646,-29805,-13615,-29819,-13585,-29833,-13554,-29847,-13524,-29861,-13493,-29874,-13463,-29888,-13432,-29902,-13401,-29916,-13371,-29929,-13340,-29943,-13310,-29956,-13279,-29970,-13248,-29984,-13218,-29997,-13187,-30010,-13156,-30024,-13126,-30037,-13095,-30051,-13064,-30064,-13034,-30077,-13003,-30091,-12972,-30104,-12941,-30117,-12910,-30130,-12880,-30143,-12849,-30157,-12818,-30170,-12787,-30183,-12756,-30196,-12725,-30209,-12695,-30222,-12664,-30235,-12633,-30248,-12602,-30260,-12571,-30273,-12540,-30286,-12509,-30299,-12478,-30312,-12447,-30324,-12416,-30337,-12385,-30350,-12354,-30362,-12323,-30375,-12292,-30387,-12261,-30400,-12230,-30412,-12199,-30425,-12167,-30437,-12136,-30450,-12105,-30462,-12074,-30474,-12043,-30487,-12012,-30499,-11981,-30511,-11949,-30523,-11918,-30536,-11887,-30548,-11856,-30560,-11824,-30572,-11793,-30584,-11762,-30596,-11731,-30608,-11699,-30620,-11668,-30632,-11637,-30644,-11605,-30656,-11574,-30667,-11543,-30679,-11511,-30691,-11480,-30703,-11449,-30714,-11417,-30726,-11386,-30738,-11354,-30749,-11323,-30761,-11291,-30772,-11260,-30784,-11228,-30795,-11197,-30807,-11165,-30818,-11134,-30829,-11102,-30841,-11071,-30852,-11039,-30863,-11008,-30875,-10976,-30886,-10945,-30897,-10913,-30908,-10881,-30919,-10850,-30930,-10818,-30941,-10787,-30952,-10755,-30963,-10723,-30974,-10692,-30985,-10660,-30996,-10628,-31007,-10597,-31018,-10565,-31029,-10533,-31039,-10501,-31050,-10470,-31061,-10438,-31071,-10406,-31082,-10374,-31093,-10343,-31103,-10311,-31114,-10279,-31124,-10247,-31135,-10215,-31145,-10183,-31155,-10152,-31166,-10120,-31176,-10088,-31186,-10056,-31197,-10024,-31207,-9992,-31217,-9960,-31227,-9928,-31237,-9896,-31248,-9864,-31258,-9832,-31268,-9800,-31278,-9768,-31288,-9736,-31298,-9704,-31308,-9672,-31317,-9640,-31327,-9608,-31337,-9576,-31347,-9544,-31357,-9512,-31366,-9480,-31376,-9448,-31386,-9416,-31395,-9384,-31405,-9352,-31414,-9320,-31424,-9288,-31433,-9255,-31443,-9223,-31452,-9191,-31462,-9159,-31471,-9127,-31480,-9095,-31490,-9062,-31499,-9030,-31508,-8998,-31517,-8966,-31526,-8933,-31535,-8901,-31545,-8869,-31554,-8837,-31563,-8804,-31572,-8772,-31581,-8740,-31589,-8708,-31598,-8675,-31607,-8643,-31616,-8611,-31625,-8578,-31634,-8546,-31642,-8514,-31651,-8481,-31660,-8449,-31668,-8416,-31677,-8384,-31685,-8352,-31694,-8319,-31702,-8287,-31711,-8254,-31719,-8222,-31728,-8190,-31736,-8157,-31744,-8125,-31753,-8092,-31761,-8060,-31769,-8027,-31777,-7995,-31786,-7962,-31794,-7930,-31802,-7897,-31810,-7865,-31818,-7832,-31826,-7800,-31834,-7767,-31842,-7734,-31850,-7702,-31857,-7669,-31865,-7637,-31873,-7604,-31881,-7572,-31889,-7539,-31896,-7506,-31904,-7474,-31912,-7441,-31919,-7408,-31927,-7376,-31934,-7343,-31942,-7311,-31949,-7278,-31957,-7245,-31964,-7212,-31971,-7180,-31979,-7147,-31986,-7114,-31993,-7082,-32000,-7049,-32008,-7016,-32015,-6983,-32022,-6951,-32029,-6918,-32036,-6885,-32043,-6852,-32050,-6820,-32057,-6787,-32064,-6754,-32071,-6721,-32078,-6689,-32085,-6656,-32091,-6623,-32098,-6590,-32105,-6557,-32111,-6524,-32118,-6492,-32125,-6459,-32131,-6426,-32138,-6393,-32144,-6360,-32151,-6327,-32157,-6294,-32164,-6262,-32170,-6229,-32177,-6196,-32183,-6163,-32189,-6130,-32195,-6097,-32202,-6064,-32208,-6031,-32214,-5998,-32220,-5965,-32226,-5932,-32232,-5899,-32238,-5866,-32244,-5833,-32250,-5800,-32256,-5767,-32262,-5734,-32268,-5701,-32274,-5668,-32279,-5635,-32285,-5602,-32291,-5569,-32296,-5536,-32302,-5503,-32308,-5470,-32313,-5437,-32319,-5404,-32324,-5371,-32330,-5338,-32335,-5305,-32341,-5272,-32346,-5239,-32351,-5206,-32357,-5173,-32362,-5140,-32367,-5107,-32372,-5073,-32378,-5040,-32383,-5007,-32388,-4974,-32393,-4941,-32398,-4908,-32403,-4875,-32408,-4842,-32413,-4808,-32418,-4775,-32423,-4742,-32427,-4709,-32432,-4676,-32437,-4643,-32442,-4609,-32446,-4576,-32451,-4543,-32456,-4510,-32460,-4477,-32465,-4444,-32469,-4410,-32474,-4377,-32478,-4344,-32483,-4311,-32487,-4277,-32492,-4244,-32496,-4211,-32500,-4178,-32504,-4145,-32509,-4111,-32513,-4078,-32517,-4045,-32521,-4012,-32525,-3978,-32529,-3945,-32533,-3912,-32537,-3878,-32541,-3845,-32545,-3812,-32549,-3779,-32553,-3745,-32557,-3712,-32560,-3679,-32564,-3645,-32568,-3612,-32572,-3579,-32575,-3546,-32579,-3512,-32582,-3479,-32586,-3446,-32589,-3412,-32593,-3379,-32596,-3346,-32600,-3312,-32603,-3279,-32606,-3246,-32610,-3212,-32613,-3179,-32616,-3146,-32619,-3112,-32623,-3079,-32626,-3045,-32629,-3012,-32632,-2979,-32635,-2945,-32638,-2912,-32641,-2879,-32644,-2845,-32647,-2812,-32650,-2778,-32652,-2745,-32655,-2712,-32658,-2678,-32661,-2645,-32663,-2611,-32666,-2578,-32669,-2545,-32671,-2511,-32674,-2478,-32676,-2444,-32679,-2411,-32681,-2378,-32684,-2344,-32686,-2311,-32688,-2277,-32691,-2244,-32693,-2210,-32695,-2177,-32697,-2144,-32700,-2110,-32702,-2077,-32704,-2043,-32706,-2010,-32708,-1976,-32710,-1943,-32712,-1909,-32714,-1876,-32716,-1843,-32718,-1809,-32719,-1776,-32721,-1742,-32723,-1709,-32725,-1675,-32726,-1642,-32728,-1608,-32730,-1575,-32731,-1541,-32733,-1508,-32734,-1474,-32736,-1441,-32737,-1407,-32739,-1374,-32740,-1340,-32741,-1307,-32743,-1274,-32744,-1240,-32745,-1207,-32747,-1173,-32748,-1140,-32749,-1106,-32750,-1073,-32751,-1039,-32752,-1006,-32753,-972,-32754,-939,-32755,-905,-32756,-872,-32757,-838,-32758,-805,-32758,-771,-32759,-738,-32760,-704,-32761,-671,-32761,-637,-32762,-604,-32763,-570,-32763,-537,-32764,-503,-32764,-470,-32765,-436,-32765,-403,-32765,-369,-32766,-336,-32766,-302,-32766,-269,-32767,-235,-32767,-202,-32767,-168,-32767,-135,-32767,-101,-32767,-68,-32767,-34,-32767,-1,-32767,33,-32767,67,-32767,100,-32767,134,-32767,167,-32767,201,-32767,234,-32766,268,-32766,301,-32766,335,-32765,368,-32765,402,-32765,435,-32764,469,-32764,502,-32763,536,-32763,569,-32762,603,-32761,636,-32761,670,-32760,703,-32759,737,-32758,770,-32758,804,-32757,837,-32756,871,-32755,904,-32754,938,-32753,971,-32752,1005,-32751,1038,-32750,1072,-32749,1105,-32748,1139,-32747,1172,-32745,1206,-32744,1239,-32743,1273,-32741,1306,-32740,1339,-32739,1373,-32737,1406,-32736,1440,-32734,1473,-32733,1507,-32731,1540,-32730,1574,-32728,1607,-32726,1641,-32725,1674,-32723,1708,-32721,1741,-32719,1775,-32718,1808,-32716,1842,-32714,1875,-32712,1908,-32710,1942,-32708,1975,-32706,2009,-32704,2042,-32702,2076,-32700,2109,-32697,2143,-32695,2176,-32693,2209,-32691,2243,-32688,2276,-32686,2310,-32684,2343,-32681,2377,-32679,2410,-32676,2443,-32674,2477,-32671,2510,-32669,2544,-32666,2577,-32663,2610,-32661,2644,-32658,2677,-32655,2711,-32652,2744,-32650,2777,-32647,2811,-32644,2844,-32641,2878,-32638,2911,-32635,2944,-32632,2978,-32629,3011,-32626,3044,-32623,3078,-32619,3111,-32616,3145,-32613,3178,-32610,3211,-32606,3245,-32603,3278,-32600,3311,-32596,3345,-32593,3378,-32589,3411,-32586,3445,-32582,3478,-32579,3511,-32575,3545,-32572,3578,-32568,3611,-32564,3644,-32560,3678,-32557,3711,-32553,3744,-32549,3778,-32545,3811,-32541,3844,-32537,3877,-32533,3911,-32529,3944,-32525,3977,-32521,4011,-32517,4044,-32513,4077,-32509,4110,-32504,4144,-32500,4177,-32496,4210,-32492,4243,-32487,4276,-32483,4310,-32478,4343,-32474,4376,-32469,4409,-32465,4443,-32460,4476,-32456,4509,-32451,4542,-32446,4575,-32442,4608,-32437,4642,-32432,4675,-32427,4708,-32423,4741,-32418,4774,-32413,4807,-32408,4841,-32403,4874,-32398,4907,-32393,4940,-32388,4973,-32383,5006,-32378,5039,-32372,5072,-32367,5106,-32362,5139,-32357,5172,-32351,5205,-32346,5238,-32341,5271,-32335,5304,-32330,5337,-32324,5370,-32319,5403,-32313,5436,-32308,5469,-32302,5502,-32296,5535,-32291,5568,-32285,5601,-32279,5634,-32274,5667,-32268,5700,-32262,5733,-32256,5766,-32250,5799,-32244,5832,-32238,5865,-32232,5898,-32226,5931,-32220,5964,-32214,5997,-32208,6030,-32202,6063,-32195,6096,-32189,6129,-32183,6162,-32177,6195,-32170,6228,-32164,6261,-32157,6293,-32151,6326,-32144,6359,-32138,6392,-32131,6425,-32125,6458,-32118,6491,-32111,6523,-32105,6556,-32098,6589,-32091,6622,-32085,6655,-32078,6688,-32071,6720,-32064,6753,-32057,6786,-32050,6819,-32043,6851,-32036,6884,-32029,6917,-32022,6950,-32015,6982,-32008,7015,-32000,7048,-31993,7081,-31986,7113,-31979,7146,-31971,7179,-31964,7211,-31957,7244,-31949,7277,-31942,7310,-31934,7342,-31927,7375,-31919,7407,-31912,7440,-31904,7473,-31896,7505,-31889,7538,-31881,7571,-31873,7603,-31865,7636,-31857,7668,-31850,7701,-31842,7733,-31834,7766,-31826,7799,-31818,7831,-31810,7864,-31802,7896,-31794,7929,-31786,7961,-31777,7994,-31769,8026,-31761,8059,-31753,8091,-31744,8124,-31736,8156,-31728,8189,-31719,8221,-31711,8253,-31702,8286,-31694,8318,-31685,8351,-31677,8383,-31668,8415,-31660,8448,-31651,8480,-31642,8513,-31634,8545,-31625,8577,-31616,8610,-31607,8642,-31598,8674,-31589,8707,-31581,8739,-31572,8771,-31563,8803,-31554,8836,-31545,8868,-31535,8900,-31526,8932,-31517,8965,-31508,8997,-31499,9029,-31490,9061,-31480,9094,-31471,9126,-31462,9158,-31452,9190,-31443,9222,-31433,9254,-31424,9287,-31414,9319,-31405,9351,-31395,9383,-31386,9415,-31376,9447,-31366,9479,-31357,9511,-31347,9543,-31337,9575,-31327,9607,-31317,9639,-31308,9671,-31298,9703,-31288,9735,-31278,9767,-31268,9799,-31258,9831,-31248,9863,-31237,9895,-31227,9927,-31217,9959,-31207,9991,-31197,10023,-31186,10055,-31176,10087,-31166,10119,-31155,10151,-31145,10182,-31135,10214,-31124,10246,-31114,10278,-31103,10310,-31093,10342,-31082,10373,-31071,10405,-31061,10437,-31050,10469,-31039,10500,-31029,10532,-31018,10564,-31007,10596,-30996,10627,-30985,10659,-30974,10691,-30963,10722,-30952,10754,-30941,10786,-30930,10817,-30919,10849,-30908,10880,-30897,10912,-30886,10944,-30875,10975,-30863,11007,-30852,11038,-30841,11070,-30829,11101,-30818,11133,-30807,11164,-30795,11196,-30784,11227,-30772,11259,-30761,11290,-30749,11322,-30738,11353,-30726,11385,-30714,11416,-30703,11448,-30691,11479,-30679,11510,-30667,11542,-30656,11573,-30644,11604,-30632,11636,-30620,11667,-30608,11698,-30596,11730,-30584,11761,-30572,11792,-30560,11823,-30548,11855,-30536,11886,-30523,11917,-30511,11948,-30499,11980,-30487,12011,-30474,12042,-30462,12073,-30450,12104,-30437,12135,-30425,12166,-30412,12198,-30400,12229,-30387,12260,-30375,12291,-30362,12322,-30350,12353,-30337,12384,-30324,12415,-30312,12446,-30299,12477,-30286,12508,-30273,12539,-30260,12570,-30248,12601,-30235,12632,-30222,12663,-30209,12694,-30196,12724,-30183,12755,-30170,12786,-30157,12817,-30143,12848,-30130,12879,-30117,12909,-30104,12940,-30091,12971,-30077,13002,-30064,13033,-30051,13063,-30037,13094,-30024,13125,-30010,13155,-29997,13186,-29984,13217,-29970,13247,-29956,13278,-29943,13309,-29929,13339,-29916,13370,-29902,13400,-29888,13431,-29874,13462,-29861,13492,-29847,13523,-29833,13553,-29819,13584,-29805,13614,-29791,13645,-29777,13675,-29763,13706,-29749,13736,-29735,13766,-29721,13797,-29707,13827,-29693,13858,-29679,13888,-29664,13918,-29650,13949,-29636,13979,-29622,14009,-29607,14039,-29593,14070,-29578,14100,-29564,14130,-29549,14160,-29535,14191,-29520,14221,-29506,14251,-29491,14281,-29477,14311,-29462,14342,-29447,14372,-29433,14402,-29418,14432,-29403,14462,-29388,14492,-29373,14522,-29359,14552,-29344,14582,-29329,14612,-29314,14642,-29299,14672,-29284,14702,-29269,14732,-29254,14762,-29239,14792,-29223,14822,-29208,14852,-29193,14881,-29178,14911,-29163,14941,-29147,14971,-29132,15001,-29117,15030,-29101,15060,-29086,15090,-29070,15120,-29055,15149,-29039,15179,-29024,15209,-29008,15238,-28993,15268,-28977,15298,-28961,15327,-28946,15357,-28930,15387,-28914,15416,-28898,15446,-28883,15475,-28867,15505,-28851,15534,-28835,15564,-28819,15593,-28803,15623,-28787,15652,-28771,15682,-28755,15711,-28739,15740,-28723,15770,-28707,15799,-28691,15829,-28674,15858,-28658,15887,-28642,15917,-28626,15946,-28609,15975,-28593,16004,-28576,16034,-28560,16063,-28544,16092,-28527,16121,-28511,16150,-28494,16179,-28478,16209,-28461,16238,-28444,16267,-28428,16296,-28411,16325,-28394,16354,-28378,16383,-28361,16412,-28344,16441,-28327,16470,-28310,16499,-28293,16528,-28276,16557,-28260,16586,-28243,16615,-28226,16643,-28209,16672,-28191,16701,-28174,16730,-28157,16759,-28140,16788,-28123,16816,-28106,16845,-28088,16874,-28071,16903,-28054,16931,-28037,16960,-28019,16989,-28002,17017,-27984,17046,-27967,17074,-27949,17103,-27932,17132,-27914,17160,-27897,17189,-27879,17217,-27862,17246,-27844,17274,-27826,17303,-27809,17331,-27791,17360,-27773,17388,-27755,17416,-27737,17445,-27720,17473,-27702,17501,-27684,17530,-27666,17558,-27648,17586,-27630,17615,-27612,17643,-27594,17671,-27576,17699,-27558,17727,-27539,17756,-27521,17784,-27503,17812,-27485,17840,-27467,17868,-27448,17896,-27430,17924,-27412,17952,-27393,17980,-27375,18008,-27356,18036,-27338,18064,-27320,18092,-27301,18120,-27282,18148,-27264,18176,-27245,18204,-27227,18232,-27208,18260,-27189,18287,-27171,18315,-27152,18343,-27133,18371,-27114,18398,-27095,18426,-27077,18454,-27058,18482,-27039,18509,-27020,18537,-27001,18564,-26982,18592,-26963,18620,-26944,18647,-26925,18675,-26906,18702,-26886,18730,-26867,18757,-26848,18785,-26829,18812,-26810,18840,-26790,18867,-26771,18894,-26752,18922,-26732,18949,-26713,18976,-26693,19004,-26674,19031,-26655,19058,-26635,19086,-26616,19113,-26596,19140,-26576,19167,-26557,19194,-26537,19221,-26517,19249,-26498,19276,-26478,19303,-26458,19330,-26438,19357,-26419,19384,-26399,19411,-26379,19438,-26359,19465,-26339,19492,-26319,19519,-26299,19546,-26279,19573,-26259,19599,-26239,19626,-26219,19653,-26199,19680,-26179,19707,-26159,19733,-26138,19760,-26118,19787,-26098,19814,-26078,19840,-26057,19867,-26037,19894,-26017,19920,-25996,19947,-25976,19973,-25955,20000,-25935,20026,-25914,20053,-25894,20079,-25873,20106,-25853,20132,-25832,20159,-25812,20185,-25791,20212,-25770,20238,-25750,20264,-25729,20291,-25708,20317,-25687,20343,-25666,20369,-25646,20396,-25625,20422,-25604,20448,-25583,20474,-25562,20500,-25541,20527,-25520,20553,-25499,20579,-25478,20605,-25457,20631,-25436,20657,-25415,20683,-25393,20709,-25372,20735,-25351,20761,-25330,20787,-25308,20813,-25287,20838,-25266,20864,-25244,20890,-25223,20916,-25202,20942,-25180,20967,-25159,20993,-25137,21019,-25116,21045,-25094,21070,-25073,21096,-25051,21122,-25030,21147,-25008,21173,-24986,21198,-24965,21224,-24943,21249,-24921,21275,-24899,21300,-24878,21326,-24856,21351,-24834,21377,-24812,21402,-24790,21427,-24768,21453,-24746,21478,-24724,21503,-24702,21529,-24680,21554,-24658,21579,-24636,21604,-24614,21629,-24592,21655,-24570,21680,-24547,21705,-24525,21730,-24503,21755,-24481,21780,-24458,21805,-24436,21830,-24414,21855,-24391,21880,-24369,21905,-24347,21930,-24324,21955,-24302,21980,-24279,22004,-24257,22029,-24234,22054,-24212,22079,-24189,22104,-24166,22128,-24144,22153,-24121,22178,-24098,22202,-24076,22227,-24053,22252,-24030,22276,-24007,22301,-23985,22325,-23962,22350,-23939,22374,-23916,22399,-23893,22423,-23870,22448,-23847,22472,-23824,22496,-23801,22521,-23778,22545,-23755,22569,-23732,22594,-23709,22618,-23686,22642,-23662,22666,-23639,22691,-23616,22715,-23593,22739,-23570,22763,-23546,22787,-23523,22811,-23500,22835,-23476,22859,-23453,22883,-23429,22907,-23406,22931,-23383,22955,-23359,22979,-23336,23003,-23312,23027,-23288,23050,-23265,23074,-23241,23098,-23218,23122,-23194,23146,-23170,23169,-23147,23193,-23123,23217,-23099,23240,-23075,23264,-23051,23287,-23028,23311,-23004,23335,-22980,23358,-22956,23382,-22932,23405,-22908,23428,-22884,23452,-22860,23475,-22836,23499,-22812,23522,-22788,23545,-22764,23569,-22740,23592,-22716,23615,-22692,23638,-22667,23661,-22643,23685,-22619,23708,-22595,23731,-22570,23754,-22546,23777,-22522,23800,-22497,23823,-22473,23846,-22449,23869,-22424,23892,-22400,23915,-22375,23938,-22351,23961,-22326,23984,-22302,24006,-22277,24029,-22253,24052,-22228,24075,-22203,24097,-22179,24120,-22154,24143,-22129,24165,-22105,24188,-22080,24211,-22055,24233,-22030,24256,-22005,24278,-21981,24301,-21956,24323,-21931,24346,-21906,24368,-21881,24390,-21856,24413,-21831,24435,-21806,24457,-21781,24480,-21756,24502,-21731,24524,-21706,24546,-21681,24569,-21656,24591,-21630,24613,-21605,24635,-21580,24657,-21555,24679,-21530,24701,-21504,24723,-21479,24745,-21454,24767,-21428,24789,-21403,24811,-21378,24833,-21352,24855,-21327,24877,-21301,24898,-21276,24920,-21250,24942,-21225,24964,-21199,24985,-21174,25007,-21148,25029,-21123,25050,-21097,25072,-21071,25093,-21046,25115,-21020,25136,-20994,25158,-20968,25179,-20943,25201,-20917,25222,-20891,25243,-20865,25265,-20839,25286,-20814,25307,-20788,25329,-20762,25350,-20736,25371,-20710,25392,-20684,25414,-20658,25435,-20632,25456,-20606,25477,-20580,25498,-20554,25519,-20528,25540,-20501,25561,-20475,25582,-20449,25603,-20423,25624,-20397,25645,-20370,25665,-20344,25686,-20318,25707,-20292,25728,-20265,25749,-20239,25769,-20213,25790,-20186,25811,-20160,25831,-20133,25852,-20107,25872,-20080,25893,-20054,25913,-20027,25934,-20001,25954,-19974,25975,-19948,25995,-19921,26016,-19895,26036,-19868,26056,-19841,26077,-19815,26097,-19788,26117,-19761,26137,-19734,26158,-19708,26178,-19681,26198,-19654,26218,-19627,26238,-19600,26258,-19574,26278,-19547,26298,-19520,26318,-19493,26338,-19466,26358,-19439,26378,-19412,26398,-19385,26418,-19358,26437,-19331,26457,-19304,26477,-19277,26497,-19250,26516,-19222,26536,-19195,26556,-19168,26575,-19141,26595,-19114,26615,-19087,26634,-19059,26654,-19032,26673,-19005,26692,-18977,26712,-18950,26731,-18923,26751,-18895,26770,-18868,26789,-18841,26809,-18813,26828,-18786,26847,-18758,26866,-18731,26885,-18703,26905,-18676,26924,-18648,26943,-18621,26962,-18593,26981,-18565,27000,-18538,27019,-18510,27038,-18483,27057,-18455,27076,-18427,27094,-18399,27113,-18372,27132,-18344,27151,-18316,27170,-18288,27188,-18261,27207,-18233,27226,-18205,27244,-18177,27263,-18149,27281,-18121,27300,-18093,27319,-18065,27337,-18037,27355,-18009,27374,-17981,27392,-17953,27411,-17925,27429,-17897,27447,-17869,27466,-17841,27484,-17813,27502,-17785,27520,-17757,27538,-17728,27557,-17700,27575,-17672,27593,-17644,27611,-17616,27629,-17587,27647,-17559,27665,-17531,27683,-17502,27701,-17474,27719,-17446,27736,-17417,27754,-17389,27772,-17361,27790,-17332,27808,-17304,27825,-17275,27843,-17247,27861,-17218,27878,-17190,27896,-17161,27913,-17133,27931,-17104,27948,-17075,27966,-17047,27983,-17018,28001,-16990,28018,-16961,28036,-16932,28053,-16904,28070,-16875,28087,-16846,28105,-16817,28122,-16789,28139,-16760,28156,-16731,28173,-16702,28190,-16673,28208,-16644,28225,-16616,28242,-16587,28259,-16558,28275,-16529,28292,-16500,28309,-16471,28326,-16442,28343,-16413,28360}; - diff --git a/openair1/PHY/TOOLS/twiddle1536.h b/openair1/PHY/TOOLS/twiddle1536.h deleted file mode 100644 index 304766caaf13fc507afa08a357b82c5562f50dae..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddle1536.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include <stdint.h> - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:511)/1536)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:1022)/1536)); -twa2 = zeros(1,1024); -twb2 = zeros(1,1024); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); - - - */ - -int16_t twa1536[1024] __attribute__((aligned(16))) = {32767,0,32766,-135,32765,-269,32764,-403,32762,-537,32760,-671,32757,-805,32753,-939,32749,-1073,32744,-1207,32739,-1340,32733,-1474,32727,-1608,32720,-1742,32713,-1876,32705,-2010,32696,-2144,32687,-2277,32678,-2411,32668,-2545,32657,-2678,32646,-2812,32634,-2945,32622,-3079,32609,-3212,32595,-3346,32581,-3479,32567,-3612,32552,-3745,32536,-3878,32520,-4012,32503,-4145,32486,-4277,32468,-4410,32450,-4543,32431,-4676,32412,-4808,32392,-4941,32371,-5073,32350,-5206,32329,-5338,32307,-5470,32284,-5602,32261,-5734,32237,-5866,32213,-5998,32188,-6130,32163,-6262,32137,-6393,32110,-6524,32084,-6656,32056,-6787,32028,-6918,31999,-7049,31970,-7180,31941,-7311,31911,-7441,31880,-7572,31849,-7702,31817,-7832,31785,-7962,31752,-8092,31718,-8222,31684,-8352,31650,-8481,31615,-8611,31580,-8740,31544,-8869,31507,-8998,31470,-9127,31432,-9255,31394,-9384,31356,-9512,31316,-9640,31277,-9768,31236,-9896,31196,-10024,31154,-10152,31113,-10279,31070,-10406,31028,-10533,30984,-10660,30940,-10787,30896,-10913,30851,-11039,30806,-11165,30760,-11291,30713,-11417,30666,-11543,30619,-11668,30571,-11793,30522,-11918,30473,-12043,30424,-12167,30374,-12292,30323,-12416,30272,-12540,30221,-12664,30169,-12787,30116,-12910,30063,-13034,30009,-13156,29955,-13279,29901,-13401,29846,-13524,29790,-13646,29734,-13767,29678,-13889,29621,-14010,29563,-14131,29505,-14252,29446,-14373,29387,-14493,29328,-14613,29268,-14733,29207,-14853,29146,-14972,29085,-15091,29023,-15210,28960,-15328,28897,-15447,28834,-15565,28770,-15683,28706,-15800,28641,-15918,28575,-16035,28510,-16151,28443,-16268,28377,-16384,28309,-16500,28242,-16616,28173,-16731,28105,-16846,28036,-16961,27966,-17075,27896,-17190,27825,-17304,27754,-17417,27683,-17531,27611,-17644,27538,-17757,27466,-17869,27392,-17981,27319,-18093,27244,-18205,27170,-18316,27094,-18427,27019,-18538,26943,-18648,26866,-18758,26789,-18868,26712,-18977,26634,-19087,26556,-19195,26477,-19304,26398,-19412,26318,-19520,26238,-19627,26158,-19734,26077,-19841,25995,-19948,25913,-20054,25831,-20160,25749,-20265,25665,-20370,25582,-20475,25498,-20580,25414,-20684,25329,-20788,25243,-20891,25158,-20994,25072,-21097,24985,-21199,24898,-21301,24811,-21403,24723,-21504,24635,-21605,24546,-21706,24457,-21806,24368,-21906,24278,-22005,24188,-22105,24097,-22203,24006,-22302,23915,-22400,23823,-22497,23731,-22595,23638,-22692,23545,-22788,23452,-22884,23358,-22980,23264,-23075,23169,-23170,23074,-23265,22979,-23359,22883,-23453,22787,-23546,22691,-23639,22594,-23732,22496,-23824,22399,-23916,22301,-24007,22202,-24098,22104,-24189,22004,-24279,21905,-24369,21805,-24458,21705,-24547,21604,-24636,21503,-24724,21402,-24812,21300,-24899,21198,-24986,21096,-25073,20993,-25159,20890,-25244,20787,-25330,20683,-25415,20579,-25499,20474,-25583,20369,-25666,20264,-25750,20159,-25832,20053,-25914,19947,-25996,19840,-26078,19733,-26159,19626,-26239,19519,-26319,19411,-26399,19303,-26478,19194,-26557,19086,-26635,18976,-26713,18867,-26790,18757,-26867,18647,-26944,18537,-27020,18426,-27095,18315,-27171,18204,-27245,18092,-27320,17980,-27393,17868,-27467,17756,-27539,17643,-27612,17530,-27684,17416,-27755,17303,-27826,17189,-27897,17074,-27967,16960,-28037,16845,-28106,16730,-28174,16615,-28243,16499,-28310,16383,-28378,16267,-28444,16150,-28511,16034,-28576,15917,-28642,15799,-28707,15682,-28771,15564,-28835,15446,-28898,15327,-28961,15209,-29024,15090,-29086,14971,-29147,14852,-29208,14732,-29269,14612,-29329,14492,-29388,14372,-29447,14251,-29506,14130,-29564,14009,-29622,13888,-29679,13766,-29735,13645,-29791,13523,-29847,13400,-29902,13278,-29956,13155,-30010,13033,-30064,12909,-30117,12786,-30170,12663,-30222,12539,-30273,12415,-30324,12291,-30375,12166,-30425,12042,-30474,11917,-30523,11792,-30572,11667,-30620,11542,-30667,11416,-30714,11290,-30761,11164,-30807,11038,-30852,10912,-30897,10786,-30941,10659,-30985,10532,-31029,10405,-31071,10278,-31114,10151,-31155,10023,-31197,9895,-31237,9767,-31278,9639,-31317,9511,-31357,9383,-31395,9254,-31433,9126,-31471,8997,-31508,8868,-31545,8739,-31581,8610,-31616,8480,-31651,8351,-31685,8221,-31719,8091,-31753,7961,-31786,7831,-31818,7701,-31850,7571,-31881,7440,-31912,7310,-31942,7179,-31971,7048,-32000,6917,-32029,6786,-32057,6655,-32085,6523,-32111,6392,-32138,6261,-32164,6129,-32189,5997,-32214,5865,-32238,5733,-32262,5601,-32285,5469,-32308,5337,-32330,5205,-32351,5072,-32372,4940,-32393,4807,-32413,4675,-32432,4542,-32451,4409,-32469,4276,-32487,4144,-32504,4011,-32521,3877,-32537,3744,-32553,3611,-32568,3478,-32582,3345,-32596,3211,-32610,3078,-32623,2944,-32635,2811,-32647,2677,-32658,2544,-32669,2410,-32679,2276,-32688,2143,-32697,2009,-32706,1875,-32714,1741,-32721,1607,-32728,1473,-32734,1339,-32740,1206,-32745,1072,-32750,938,-32754,804,-32758,670,-32761,536,-32763,402,-32765,268,-32766,134,-32767,0,-32767,-135,-32767,-269,-32766,-403,-32765,-537,-32763,-671,-32761,-805,-32758,-939,-32754,-1073,-32750,-1207,-32745,-1340,-32740,-1474,-32734,-1608,-32728,-1742,-32721,-1876,-32714,-2010,-32706,-2144,-32697,-2277,-32688,-2411,-32679,-2545,-32669,-2678,-32658,-2812,-32647,-2945,-32635,-3079,-32623,-3212,-32610,-3346,-32596,-3479,-32582,-3612,-32568,-3745,-32553,-3878,-32537,-4012,-32521,-4145,-32504,-4277,-32487,-4410,-32469,-4543,-32451,-4676,-32432,-4808,-32413,-4941,-32393,-5073,-32372,-5206,-32351,-5338,-32330,-5470,-32308,-5602,-32285,-5734,-32262,-5866,-32238,-5998,-32214,-6130,-32189,-6262,-32164,-6393,-32138,-6524,-32111,-6656,-32085,-6787,-32057,-6918,-32029,-7049,-32000,-7180,-31971,-7311,-31942,-7441,-31912,-7572,-31881,-7702,-31850,-7832,-31818,-7962,-31786,-8092,-31753,-8222,-31719,-8352,-31685,-8481,-31651,-8611,-31616,-8740,-31581,-8869,-31545,-8998,-31508,-9127,-31471,-9255,-31433,-9384,-31395,-9512,-31357,-9640,-31317,-9768,-31278,-9896,-31237,-10024,-31197,-10152,-31155,-10279,-31114,-10406,-31071,-10533,-31029,-10660,-30985,-10787,-30941,-10913,-30897,-11039,-30852,-11165,-30807,-11291,-30761,-11417,-30714,-11543,-30667,-11668,-30620,-11793,-30572,-11918,-30523,-12043,-30474,-12167,-30425,-12292,-30375,-12416,-30324,-12540,-30273,-12664,-30222,-12787,-30170,-12910,-30117,-13034,-30064,-13156,-30010,-13279,-29956,-13401,-29902,-13524,-29847,-13646,-29791,-13767,-29735,-13889,-29679,-14010,-29622,-14131,-29564,-14252,-29506,-14373,-29447,-14493,-29388,-14613,-29329,-14733,-29269,-14853,-29208,-14972,-29147,-15091,-29086,-15210,-29024,-15328,-28961,-15447,-28898,-15565,-28835,-15683,-28771,-15800,-28707,-15918,-28642,-16035,-28576,-16151,-28511,-16268,-28444}; - -int16_t twb1536[1024] __attribute__((aligned(16))) = {32767,0,32765,-269,32762,-537,32757,-805,32749,-1073,32739,-1340,32727,-1608,32713,-1876,32696,-2144,32678,-2411,32657,-2678,32634,-2945,32609,-3212,32581,-3479,32552,-3745,32520,-4012,32486,-4277,32450,-4543,32412,-4808,32371,-5073,32329,-5338,32284,-5602,32237,-5866,32188,-6130,32137,-6393,32084,-6656,32028,-6918,31970,-7180,31911,-7441,31849,-7702,31785,-7962,31718,-8222,31650,-8481,31580,-8740,31507,-8998,31432,-9255,31356,-9512,31277,-9768,31196,-10024,31113,-10279,31028,-10533,30940,-10787,30851,-11039,30760,-11291,30666,-11543,30571,-11793,30473,-12043,30374,-12292,30272,-12540,30169,-12787,30063,-13034,29955,-13279,29846,-13524,29734,-13767,29621,-14010,29505,-14252,29387,-14493,29268,-14733,29146,-14972,29023,-15210,28897,-15447,28770,-15683,28641,-15918,28510,-16151,28377,-16384,28242,-16616,28105,-16846,27966,-17075,27825,-17304,27683,-17531,27538,-17757,27392,-17981,27244,-18205,27094,-18427,26943,-18648,26789,-18868,26634,-19087,26477,-19304,26318,-19520,26158,-19734,25995,-19948,25831,-20160,25665,-20370,25498,-20580,25329,-20788,25158,-20994,24985,-21199,24811,-21403,24635,-21605,24457,-21806,24278,-22005,24097,-22203,23915,-22400,23731,-22595,23545,-22788,23358,-22980,23169,-23170,22979,-23359,22787,-23546,22594,-23732,22399,-23916,22202,-24098,22004,-24279,21805,-24458,21604,-24636,21402,-24812,21198,-24986,20993,-25159,20787,-25330,20579,-25499,20369,-25666,20159,-25832,19947,-25996,19733,-26159,19519,-26319,19303,-26478,19086,-26635,18867,-26790,18647,-26944,18426,-27095,18204,-27245,17980,-27393,17756,-27539,17530,-27684,17303,-27826,17074,-27967,16845,-28106,16615,-28243,16383,-28378,16150,-28511,15917,-28642,15682,-28771,15446,-28898,15209,-29024,14971,-29147,14732,-29269,14492,-29388,14251,-29506,14009,-29622,13766,-29735,13523,-29847,13278,-29956,13033,-30064,12786,-30170,12539,-30273,12291,-30375,12042,-30474,11792,-30572,11542,-30667,11290,-30761,11038,-30852,10786,-30941,10532,-31029,10278,-31114,10023,-31197,9767,-31278,9511,-31357,9254,-31433,8997,-31508,8739,-31581,8480,-31651,8221,-31719,7961,-31786,7701,-31850,7440,-31912,7179,-31971,6917,-32029,6655,-32085,6392,-32138,6129,-32189,5865,-32238,5601,-32285,5337,-32330,5072,-32372,4807,-32413,4542,-32451,4276,-32487,4011,-32521,3744,-32553,3478,-32582,3211,-32610,2944,-32635,2677,-32658,2410,-32679,2143,-32697,1875,-32714,1607,-32728,1339,-32740,1072,-32750,804,-32758,536,-32763,268,-32766,0,-32767,-269,-32766,-537,-32763,-805,-32758,-1073,-32750,-1340,-32740,-1608,-32728,-1876,-32714,-2144,-32697,-2411,-32679,-2678,-32658,-2945,-32635,-3212,-32610,-3479,-32582,-3745,-32553,-4012,-32521,-4277,-32487,-4543,-32451,-4808,-32413,-5073,-32372,-5338,-32330,-5602,-32285,-5866,-32238,-6130,-32189,-6393,-32138,-6656,-32085,-6918,-32029,-7180,-31971,-7441,-31912,-7702,-31850,-7962,-31786,-8222,-31719,-8481,-31651,-8740,-31581,-8998,-31508,-9255,-31433,-9512,-31357,-9768,-31278,-10024,-31197,-10279,-31114,-10533,-31029,-10787,-30941,-11039,-30852,-11291,-30761,-11543,-30667,-11793,-30572,-12043,-30474,-12292,-30375,-12540,-30273,-12787,-30170,-13034,-30064,-13279,-29956,-13524,-29847,-13767,-29735,-14010,-29622,-14252,-29506,-14493,-29388,-14733,-29269,-14972,-29147,-15210,-29024,-15447,-28898,-15683,-28771,-15918,-28642,-16151,-28511,-16384,-28378,-16616,-28243,-16846,-28106,-17075,-27967,-17304,-27826,-17531,-27684,-17757,-27539,-17981,-27393,-18205,-27245,-18427,-27095,-18648,-26944,-18868,-26790,-19087,-26635,-19304,-26478,-19520,-26319,-19734,-26159,-19948,-25996,-20160,-25832,-20370,-25666,-20580,-25499,-20788,-25330,-20994,-25159,-21199,-24986,-21403,-24812,-21605,-24636,-21806,-24458,-22005,-24279,-22203,-24098,-22400,-23916,-22595,-23732,-22788,-23546,-22980,-23359,-23170,-23170,-23359,-22980,-23546,-22788,-23732,-22595,-23916,-22400,-24098,-22203,-24279,-22005,-24458,-21806,-24636,-21605,-24812,-21403,-24986,-21199,-25159,-20994,-25330,-20788,-25499,-20580,-25666,-20370,-25832,-20160,-25996,-19948,-26159,-19734,-26319,-19520,-26478,-19304,-26635,-19087,-26790,-18868,-26944,-18648,-27095,-18427,-27245,-18205,-27393,-17981,-27539,-17757,-27684,-17531,-27826,-17304,-27967,-17075,-28106,-16846,-28243,-16616,-28378,-16384,-28511,-16151,-28642,-15918,-28771,-15683,-28898,-15447,-29024,-15210,-29147,-14972,-29269,-14733,-29388,-14493,-29506,-14252,-29622,-14010,-29735,-13767,-29847,-13524,-29956,-13279,-30064,-13034,-30170,-12787,-30273,-12540,-30375,-12292,-30474,-12043,-30572,-11793,-30667,-11543,-30761,-11291,-30852,-11039,-30941,-10787,-31029,-10533,-31114,-10279,-31197,-10024,-31278,-9768,-31357,-9512,-31433,-9255,-31508,-8998,-31581,-8740,-31651,-8481,-31719,-8222,-31786,-7962,-31850,-7702,-31912,-7441,-31971,-7180,-32029,-6918,-32085,-6656,-32138,-6393,-32189,-6130,-32238,-5866,-32285,-5602,-32330,-5338,-32372,-5073,-32413,-4808,-32451,-4543,-32487,-4277,-32521,-4012,-32553,-3745,-32582,-3479,-32610,-3212,-32635,-2945,-32658,-2678,-32679,-2411,-32697,-2144,-32714,-1876,-32728,-1608,-32740,-1340,-32750,-1073,-32758,-805,-32763,-537,-32766,-269,-32767,-1,-32766,268,-32763,536,-32758,804,-32750,1072,-32740,1339,-32728,1607,-32714,1875,-32697,2143,-32679,2410,-32658,2677,-32635,2944,-32610,3211,-32582,3478,-32553,3744,-32521,4011,-32487,4276,-32451,4542,-32413,4807,-32372,5072,-32330,5337,-32285,5601,-32238,5865,-32189,6129,-32138,6392,-32085,6655,-32029,6917,-31971,7179,-31912,7440,-31850,7701,-31786,7961,-31719,8221,-31651,8480,-31581,8739,-31508,8997,-31433,9254,-31357,9511,-31278,9767,-31197,10023,-31114,10278,-31029,10532,-30941,10786,-30852,11038,-30761,11290,-30667,11542,-30572,11792,-30474,12042,-30375,12291,-30273,12539,-30170,12786,-30064,13033,-29956,13278,-29847,13523,-29735,13766,-29622,14009,-29506,14251,-29388,14492,-29269,14732,-29147,14971,-29024,15209,-28898,15446,-28771,15682,-28642,15917,-28511,16150,-28378,16383,-28243,16615,-28106,16845,-27967,17074,-27826,17303,-27684,17530,-27539,17756,-27393,17980,-27245,18204,-27095,18426,-26944,18647,-26790,18867,-26635,19086,-26478,19303,-26319,19519,-26159,19733,-25996,19947,-25832,20159,-25666,20369,-25499,20579,-25330,20787,-25159,20993,-24986,21198,-24812,21402,-24636,21604,-24458,21805,-24279,22004,-24098,22202,-23916,22399,-23732,22594,-23546,22787,-23359,22979,-23170,23169,-22980,23358,-22788,23545,-22595,23731,-22400,23915,-22203,24097,-22005,24278,-21806,24457,-21605,24635,-21403,24811,-21199,24985,-20994,25158,-20788,25329,-20580,25498,-20370,25665,-20160,25831,-19948,25995,-19734,26158,-19520,26318,-19304,26477,-19087,26634,-18868,26789,-18648,26943,-18427,27094,-18205,27244,-17981,27392,-17757,27538,-17531,27683,-17304,27825,-17075,27966,-16846,28105,-16616,28242}; diff --git a/openair1/PHY/TOOLS/twiddle18432.h b/openair1/PHY/TOOLS/twiddle18432.h deleted file mode 100644 index 696c7f37aeb2fe25dbc4edabc6bccaef1d53fdc7..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddle18432.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:6143)/18432)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:12286)/18432)); -twa2 = zeros(1,12288); -twb2 = zeros(1,12288); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -*/ - -int16_t twa18432[12288] = {32767,0,32766,-12,32766,-23,32766,-34,32766,-45,32766,-56,32766,-68,32766,-79,32766,-90,32766,-101,32766,-112,32766,-123,32766,-135,32766,-146,32766,-157,32766,-168,32766,-179,32766,-190,32766,-202,32766,-213,32766,-224,32766,-235,32766,-246,32765,-257,32765,-269,32765,-280,32765,-291,32765,-302,32765,-313,32765,-324,32765,-336,32765,-347,32765,-358,32764,-369,32764,-380,32764,-391,32764,-403,32764,-414,32764,-425,32764,-436,32763,-447,32763,-458,32763,-470,32763,-481,32763,-492,32763,-503,32762,-514,32762,-525,32762,-537,32762,-548,32762,-559,32762,-570,32761,-581,32761,-592,32761,-604,32761,-615,32761,-626,32760,-637,32760,-648,32760,-659,32760,-671,32759,-682,32759,-693,32759,-704,32759,-715,32758,-726,32758,-738,32758,-749,32758,-760,32757,-771,32757,-782,32757,-793,32757,-805,32756,-816,32756,-827,32756,-838,32756,-849,32755,-860,32755,-872,32755,-883,32754,-894,32754,-905,32754,-916,32753,-927,32753,-939,32753,-950,32752,-961,32752,-972,32752,-983,32751,-994,32751,-1006,32751,-1017,32750,-1028,32750,-1039,32750,-1050,32749,-1061,32749,-1073,32749,-1084,32748,-1095,32748,-1106,32747,-1117,32747,-1128,32747,-1140,32746,-1151,32746,-1162,32746,-1173,32745,-1184,32745,-1195,32744,-1207,32744,-1218,32743,-1229,32743,-1240,32743,-1251,32742,-1262,32742,-1274,32741,-1285,32741,-1296,32740,-1307,32740,-1318,32740,-1329,32739,-1340,32739,-1352,32738,-1363,32738,-1374,32737,-1385,32737,-1396,32736,-1407,32736,-1419,32735,-1430,32735,-1441,32734,-1452,32734,-1463,32733,-1474,32733,-1486,32732,-1497,32732,-1508,32731,-1519,32731,-1530,32730,-1541,32730,-1553,32729,-1564,32729,-1575,32728,-1586,32728,-1597,32727,-1608,32726,-1619,32726,-1631,32725,-1642,32725,-1653,32724,-1664,32724,-1675,32723,-1686,32723,-1698,32722,-1709,32721,-1720,32721,-1731,32720,-1742,32720,-1753,32719,-1764,32718,-1776,32718,-1787,32717,-1798,32717,-1809,32716,-1820,32715,-1831,32715,-1843,32714,-1854,32713,-1865,32713,-1876,32712,-1887,32711,-1898,32711,-1909,32710,-1921,32710,-1932,32709,-1943,32708,-1954,32708,-1965,32707,-1976,32706,-1987,32706,-1999,32705,-2010,32704,-2021,32703,-2032,32703,-2043,32702,-2054,32701,-2066,32701,-2077,32700,-2088,32699,-2099,32699,-2110,32698,-2121,32697,-2132,32696,-2144,32696,-2155,32695,-2166,32694,-2177,32693,-2188,32693,-2199,32692,-2210,32691,-2222,32690,-2233,32690,-2244,32689,-2255,32688,-2266,32687,-2277,32687,-2288,32686,-2300,32685,-2311,32684,-2322,32683,-2333,32683,-2344,32682,-2355,32681,-2366,32680,-2378,32679,-2389,32679,-2400,32678,-2411,32677,-2422,32676,-2433,32675,-2444,32674,-2456,32674,-2467,32673,-2478,32672,-2489,32671,-2500,32670,-2511,32669,-2522,32668,-2534,32668,-2545,32667,-2556,32666,-2567,32665,-2578,32664,-2589,32663,-2600,32662,-2611,32661,-2623,32661,-2634,32660,-2645,32659,-2656,32658,-2667,32657,-2678,32656,-2689,32655,-2701,32654,-2712,32653,-2723,32652,-2734,32651,-2745,32650,-2756,32649,-2767,32649,-2778,32648,-2790,32647,-2801,32646,-2812,32645,-2823,32644,-2834,32643,-2845,32642,-2856,32641,-2867,32640,-2879,32639,-2890,32638,-2901,32637,-2912,32636,-2923,32635,-2934,32634,-2945,32633,-2956,32632,-2968,32631,-2979,32630,-2990,32629,-3001,32628,-3012,32627,-3023,32626,-3034,32625,-3045,32624,-3057,32623,-3068,32622,-3079,32621,-3090,32619,-3101,32618,-3112,32617,-3123,32616,-3134,32615,-3146,32614,-3157,32613,-3168,32612,-3179,32611,-3190,32610,-3201,32609,-3212,32608,-3223,32607,-3234,32605,-3246,32604,-3257,32603,-3268,32602,-3279,32601,-3290,32600,-3301,32599,-3312,32598,-3323,32596,-3334,32595,-3346,32594,-3357,32593,-3368,32592,-3379,32591,-3390,32590,-3401,32588,-3412,32587,-3423,32586,-3434,32585,-3446,32584,-3457,32583,-3468,32581,-3479,32580,-3490,32579,-3501,32578,-3512,32577,-3523,32575,-3534,32574,-3546,32573,-3557,32572,-3568,32571,-3579,32569,-3590,32568,-3601,32567,-3612,32566,-3623,32564,-3634,32563,-3645,32562,-3657,32561,-3668,32559,-3679,32558,-3690,32557,-3701,32556,-3712,32554,-3723,32553,-3734,32552,-3745,32551,-3756,32549,-3768,32548,-3779,32547,-3790,32545,-3801,32544,-3812,32543,-3823,32541,-3834,32540,-3845,32539,-3856,32538,-3867,32536,-3878,32535,-3890,32534,-3901,32532,-3912,32531,-3923,32530,-3934,32528,-3945,32527,-3956,32526,-3967,32524,-3978,32523,-3989,32521,-4000,32520,-4012,32519,-4023,32517,-4034,32516,-4045,32515,-4056,32513,-4067,32512,-4078,32510,-4089,32509,-4100,32508,-4111,32506,-4122,32505,-4133,32503,-4145,32502,-4156,32501,-4167,32499,-4178,32498,-4189,32496,-4200,32495,-4211,32493,-4222,32492,-4233,32491,-4244,32489,-4255,32488,-4266,32486,-4277,32485,-4289,32483,-4300,32482,-4311,32480,-4322,32479,-4333,32477,-4344,32476,-4355,32474,-4366,32473,-4377,32471,-4388,32470,-4399,32468,-4410,32467,-4421,32465,-4432,32464,-4444,32462,-4455,32461,-4466,32459,-4477,32458,-4488,32456,-4499,32455,-4510,32453,-4521,32452,-4532,32450,-4543,32449,-4554,32447,-4565,32445,-4576,32444,-4587,32442,-4598,32441,-4609,32439,-4621,32438,-4632,32436,-4643,32434,-4654,32433,-4665,32431,-4676,32430,-4687,32428,-4698,32426,-4709,32425,-4720,32423,-4731,32422,-4742,32420,-4753,32418,-4764,32417,-4775,32415,-4786,32413,-4797,32412,-4808,32410,-4819,32409,-4831,32407,-4842,32405,-4853,32404,-4864,32402,-4875,32400,-4886,32399,-4897,32397,-4908,32395,-4919,32394,-4930,32392,-4941,32390,-4952,32389,-4963,32387,-4974,32385,-4985,32383,-4996,32382,-5007,32380,-5018,32378,-5029,32377,-5040,32375,-5051,32373,-5062,32371,-5073,32370,-5084,32368,-5095,32366,-5107,32364,-5118,32363,-5129,32361,-5140,32359,-5151,32357,-5162,32356,-5173,32354,-5184,32352,-5195,32350,-5206,32349,-5217,32347,-5228,32345,-5239,32343,-5250,32341,-5261,32340,-5272,32338,-5283,32336,-5294,32334,-5305,32332,-5316,32331,-5327,32329,-5338,32327,-5349,32325,-5360,32323,-5371,32322,-5382,32320,-5393,32318,-5404,32316,-5415,32314,-5426,32312,-5437,32310,-5448,32309,-5459,32307,-5470,32305,-5481,32303,-5492,32301,-5503,32299,-5514,32297,-5525,32295,-5536,32294,-5547,32292,-5558,32290,-5569,32288,-5580,32286,-5591,32284,-5602,32282,-5613,32280,-5624,32278,-5635,32276,-5646,32274,-5657,32273,-5668,32271,-5679,32269,-5690,32267,-5701,32265,-5712,32263,-5723,32261,-5734,32259,-5745,32257,-5756,32255,-5767,32253,-5778,32251,-5789,32249,-5800,32247,-5811,32245,-5822,32243,-5833,32241,-5844,32239,-5855,32237,-5866,32235,-5877,32233,-5888,32231,-5899,32229,-5910,32227,-5921,32225,-5932,32223,-5943,32221,-5954,32219,-5965,32217,-5976,32215,-5987,32213,-5998,32211,-6009,32209,-6020,32207,-6031,32205,-6042,32203,-6053,32201,-6064,32199,-6075,32196,-6086,32194,-6097,32192,-6108,32190,-6119,32188,-6130,32186,-6141,32184,-6152,32182,-6163,32180,-6174,32178,-6185,32176,-6196,32173,-6207,32171,-6218,32169,-6229,32167,-6240,32165,-6251,32163,-6262,32161,-6272,32158,-6283,32156,-6294,32154,-6305,32152,-6316,32150,-6327,32148,-6338,32146,-6349,32143,-6360,32141,-6371,32139,-6382,32137,-6393,32135,-6404,32133,-6415,32130,-6426,32128,-6437,32126,-6448,32124,-6459,32122,-6470,32119,-6481,32117,-6492,32115,-6503,32113,-6513,32110,-6524,32108,-6535,32106,-6546,32104,-6557,32102,-6568,32099,-6579,32097,-6590,32095,-6601,32093,-6612,32090,-6623,32088,-6634,32086,-6645,32084,-6656,32081,-6667,32079,-6678,32077,-6689,32074,-6699,32072,-6710,32070,-6721,32068,-6732,32065,-6743,32063,-6754,32061,-6765,32058,-6776,32056,-6787,32054,-6798,32051,-6809,32049,-6820,32047,-6831,32044,-6842,32042,-6852,32040,-6863,32037,-6874,32035,-6885,32033,-6896,32030,-6907,32028,-6918,32026,-6929,32023,-6940,32021,-6951,32019,-6962,32016,-6973,32014,-6983,32011,-6994,32009,-7005,32007,-7016,32004,-7027,32002,-7038,31999,-7049,31997,-7060,31995,-7071,31992,-7082,31990,-7093,31987,-7103,31985,-7114,31983,-7125,31980,-7136,31978,-7147,31975,-7158,31973,-7169,31970,-7180,31968,-7191,31965,-7202,31963,-7212,31961,-7223,31958,-7234,31956,-7245,31953,-7256,31951,-7267,31948,-7278,31946,-7289,31943,-7300,31941,-7311,31938,-7321,31936,-7332,31933,-7343,31931,-7354,31928,-7365,31926,-7376,31923,-7387,31921,-7398,31918,-7408,31916,-7419,31913,-7430,31911,-7441,31908,-7452,31905,-7463,31903,-7474,31900,-7485,31898,-7495,31895,-7506,31893,-7517,31890,-7528,31888,-7539,31885,-7550,31882,-7561,31880,-7572,31877,-7582,31875,-7593,31872,-7604,31869,-7615,31867,-7626,31864,-7637,31862,-7648,31859,-7658,31856,-7669,31854,-7680,31851,-7691,31849,-7702,31846,-7713,31843,-7724,31841,-7734,31838,-7745,31835,-7756,31833,-7767,31830,-7778,31827,-7789,31825,-7800,31822,-7810,31819,-7821,31817,-7832,31814,-7843,31811,-7854,31809,-7865,31806,-7876,31803,-7886,31801,-7897,31798,-7908,31795,-7919,31793,-7930,31790,-7941,31787,-7951,31785,-7962,31782,-7973,31779,-7984,31776,-7995,31774,-8006,31771,-8016,31768,-8027,31765,-8038,31763,-8049,31760,-8060,31757,-8071,31754,-8081,31752,-8092,31749,-8103,31746,-8114,31743,-8125,31741,-8135,31738,-8146,31735,-8157,31732,-8168,31729,-8179,31727,-8190,31724,-8200,31721,-8211,31718,-8222,31716,-8233,31713,-8244,31710,-8254,31707,-8265,31704,-8276,31701,-8287,31699,-8298,31696,-8308,31693,-8319,31690,-8330,31687,-8341,31684,-8352,31682,-8362,31679,-8373,31676,-8384,31673,-8395,31670,-8406,31667,-8416,31664,-8427,31662,-8438,31659,-8449,31656,-8460,31653,-8470,31650,-8481,31647,-8492,31644,-8503,31641,-8514,31638,-8524,31635,-8535,31633,-8546,31630,-8557,31627,-8568,31624,-8578,31621,-8589,31618,-8600,31615,-8611,31612,-8621,31609,-8632,31606,-8643,31603,-8654,31600,-8664,31597,-8675,31594,-8686,31591,-8697,31588,-8708,31586,-8718,31583,-8729,31580,-8740,31577,-8751,31574,-8761,31571,-8772,31568,-8783,31565,-8794,31562,-8804,31559,-8815,31556,-8826,31553,-8837,31550,-8847,31547,-8858,31544,-8869,31541,-8880,31537,-8890,31534,-8901,31531,-8912,31528,-8923,31525,-8933,31522,-8944,31519,-8955,31516,-8966,31513,-8976,31510,-8987,31507,-8998,31504,-9009,31501,-9019,31498,-9030,31495,-9041,31492,-9052,31489,-9062,31485,-9073,31482,-9084,31479,-9095,31476,-9105,31473,-9116,31470,-9127,31467,-9137,31464,-9148,31461,-9159,31457,-9170,31454,-9180,31451,-9191,31448,-9202,31445,-9213,31442,-9223,31439,-9234,31435,-9245,31432,-9255,31429,-9266,31426,-9277,31423,-9288,31420,-9298,31417,-9309,31413,-9320,31410,-9330,31407,-9341,31404,-9352,31401,-9363,31397,-9373,31394,-9384,31391,-9395,31388,-9405,31385,-9416,31381,-9427,31378,-9437,31375,-9448,31372,-9459,31369,-9469,31365,-9480,31362,-9491,31359,-9502,31356,-9512,31352,-9523,31349,-9534,31346,-9544,31343,-9555,31339,-9566,31336,-9576,31333,-9587,31330,-9598,31326,-9608,31323,-9619,31320,-9630,31316,-9640,31313,-9651,31310,-9662,31307,-9672,31303,-9683,31300,-9694,31297,-9704,31293,-9715,31290,-9726,31287,-9736,31283,-9747,31280,-9758,31277,-9768,31273,-9779,31270,-9790,31267,-9800,31263,-9811,31260,-9822,31257,-9832,31253,-9843,31250,-9854,31247,-9864,31243,-9875,31240,-9886,31236,-9896,31233,-9907,31230,-9918,31226,-9928,31223,-9939,31220,-9950,31216,-9960,31213,-9971,31209,-9981,31206,-9992,31203,-10003,31199,-10013,31196,-10024,31192,-10035,31189,-10045,31185,-10056,31182,-10067,31179,-10077,31175,-10088,31172,-10098,31168,-10109,31165,-10120,31161,-10130,31158,-10141,31154,-10152,31151,-10162,31148,-10173,31144,-10183,31141,-10194,31137,-10205,31134,-10215,31130,-10226,31127,-10236,31123,-10247,31120,-10258,31116,-10268,31113,-10279,31109,-10290,31106,-10300,31102,-10311,31099,-10321,31095,-10332,31092,-10343,31088,-10353,31085,-10364,31081,-10374,31077,-10385,31074,-10396,31070,-10406,31067,-10417,31063,-10427,31060,-10438,31056,-10448,31053,-10459,31049,-10470,31045,-10480,31042,-10491,31038,-10501,31035,-10512,31031,-10523,31028,-10533,31024,-10544,31020,-10554,31017,-10565,31013,-10575,31010,-10586,31006,-10597,31002,-10607,30999,-10618,30995,-10628,30991,-10639,30988,-10649,30984,-10660,30981,-10671,30977,-10681,30973,-10692,30970,-10702,30966,-10713,30962,-10723,30959,-10734,30955,-10744,30951,-10755,30948,-10766,30944,-10776,30940,-10787,30937,-10797,30933,-10808,30929,-10818,30926,-10829,30922,-10839,30918,-10850,30915,-10860,30911,-10871,30907,-10881,30903,-10892,30900,-10903,30896,-10913,30892,-10924,30889,-10934,30885,-10945,30881,-10955,30877,-10966,30874,-10976,30870,-10987,30866,-10997,30862,-11008,30859,-11018,30855,-11029,30851,-11039,30847,-11050,30844,-11060,30840,-11071,30836,-11081,30832,-11092,30828,-11102,30825,-11113,30821,-11123,30817,-11134,30813,-11144,30809,-11155,30806,-11165,30802,-11176,30798,-11186,30794,-11197,30790,-11207,30787,-11218,30783,-11228,30779,-11239,30775,-11249,30771,-11260,30767,-11270,30764,-11281,30760,-11291,30756,-11302,30752,-11312,30748,-11323,30744,-11333,30740,-11344,30737,-11354,30733,-11365,30729,-11375,30725,-11386,30721,-11396,30717,-11407,30713,-11417,30709,-11428,30705,-11438,30702,-11449,30698,-11459,30694,-11469,30690,-11480,30686,-11490,30682,-11501,30678,-11511,30674,-11522,30670,-11532,30666,-11543,30662,-11553,30658,-11564,30655,-11574,30651,-11584,30647,-11595,30643,-11605,30639,-11616,30635,-11626,30631,-11637,30627,-11647,30623,-11658,30619,-11668,30615,-11678,30611,-11689,30607,-11699,30603,-11710,30599,-11720,30595,-11731,30591,-11741,30587,-11751,30583,-11762,30579,-11772,30575,-11783,30571,-11793,30567,-11804,30563,-11814,30559,-11824,30555,-11835,30551,-11845,30547,-11856,30543,-11866,30539,-11877,30535,-11887,30530,-11897,30526,-11908,30522,-11918,30518,-11929,30514,-11939,30510,-11949,30506,-11960,30502,-11970,30498,-11981,30494,-11991,30490,-12001,30486,-12012,30482,-12022,30477,-12033,30473,-12043,30469,-12053,30465,-12064,30461,-12074,30457,-12084,30453,-12095,30449,-12105,30445,-12116,30440,-12126,30436,-12136,30432,-12147,30428,-12157,30424,-12167,30420,-12178,30416,-12188,30411,-12199,30407,-12209,30403,-12219,30399,-12230,30395,-12240,30391,-12250,30386,-12261,30382,-12271,30378,-12281,30374,-12292,30370,-12302,30365,-12313,30361,-12323,30357,-12333,30353,-12344,30349,-12354,30344,-12364,30340,-12375,30336,-12385,30332,-12395,30328,-12406,30323,-12416,30319,-12426,30315,-12437,30311,-12447,30306,-12457,30302,-12468,30298,-12478,30294,-12488,30289,-12499,30285,-12509,30281,-12519,30277,-12530,30272,-12540,30268,-12550,30264,-12561,30259,-12571,30255,-12581,30251,-12591,30247,-12602,30242,-12612,30238,-12622,30234,-12633,30229,-12643,30225,-12653,30221,-12664,30216,-12674,30212,-12684,30208,-12695,30203,-12705,30199,-12715,30195,-12725,30190,-12736,30186,-12746,30182,-12756,30177,-12767,30173,-12777,30169,-12787,30164,-12797,30160,-12808,30156,-12818,30151,-12828,30147,-12839,30142,-12849,30138,-12859,30134,-12869,30129,-12880,30125,-12890,30121,-12900,30116,-12910,30112,-12921,30107,-12931,30103,-12941,30098,-12951,30094,-12962,30090,-12972,30085,-12982,30081,-12993,30076,-13003,30072,-13013,30067,-13023,30063,-13034,30059,-13044,30054,-13054,30050,-13064,30045,-13075,30041,-13085,30036,-13095,30032,-13105,30027,-13115,30023,-13126,30018,-13136,30014,-13146,30009,-13156,30005,-13167,30001,-13177,29996,-13187,29992,-13197,29987,-13208,29983,-13218,29978,-13228,29973,-13238,29969,-13248,29964,-13259,29960,-13269,29955,-13279,29951,-13289,29946,-13299,29942,-13310,29937,-13320,29933,-13330,29928,-13340,29924,-13350,29919,-13361,29915,-13371,29910,-13381,29905,-13391,29901,-13401,29896,-13412,29892,-13422,29887,-13432,29883,-13442,29878,-13452,29873,-13463,29869,-13473,29864,-13483,29860,-13493,29855,-13503,29850,-13513,29846,-13524,29841,-13534,29837,-13544,29832,-13554,29827,-13564,29823,-13575,29818,-13585,29813,-13595,29809,-13605,29804,-13615,29800,-13625,29795,-13635,29790,-13646,29786,-13656,29781,-13666,29776,-13676,29772,-13686,29767,-13696,29762,-13707,29758,-13717,29753,-13727,29748,-13737,29744,-13747,29739,-13757,29734,-13767,29729,-13778,29725,-13788,29720,-13798,29715,-13808,29711,-13818,29706,-13828,29701,-13838,29696,-13848,29692,-13859,29687,-13869,29682,-13879,29678,-13889,29673,-13899,29668,-13909,29663,-13919,29659,-13929,29654,-13939,29649,-13950,29644,-13960,29640,-13970,29635,-13980,29630,-13990,29625,-14000,29621,-14010,29616,-14020,29611,-14030,29606,-14040,29601,-14051,29597,-14061,29592,-14071,29587,-14081,29582,-14091,29577,-14101,29573,-14111,29568,-14121,29563,-14131,29558,-14141,29553,-14151,29548,-14161,29544,-14172,29539,-14182,29534,-14192,29529,-14202,29524,-14212,29519,-14222,29515,-14232,29510,-14242,29505,-14252,29500,-14262,29495,-14272,29490,-14282,29485,-14292,29481,-14302,29476,-14312,29471,-14322,29466,-14332,29461,-14343,29456,-14353,29451,-14363,29446,-14373,29441,-14383,29437,-14393,29432,-14403,29427,-14413,29422,-14423,29417,-14433,29412,-14443,29407,-14453,29402,-14463,29397,-14473,29392,-14483,29387,-14493,29382,-14503,29377,-14513,29372,-14523,29368,-14533,29363,-14543,29358,-14553,29353,-14563,29348,-14573,29343,-14583,29338,-14593,29333,-14603,29328,-14613,29323,-14623,29318,-14633,29313,-14643,29308,-14653,29303,-14663,29298,-14673,29293,-14683,29288,-14693,29283,-14703,29278,-14713,29273,-14723,29268,-14733,29263,-14743,29258,-14753,29253,-14763,29248,-14773,29243,-14783,29238,-14793,29233,-14803,29227,-14813,29222,-14823,29217,-14833,29212,-14843,29207,-14853,29202,-14862,29197,-14872,29192,-14882,29187,-14892,29182,-14902,29177,-14912,29172,-14922,29167,-14932,29162,-14942,29156,-14952,29151,-14962,29146,-14972,29141,-14982,29136,-14992,29131,-15002,29126,-15012,29121,-15022,29116,-15031,29110,-15041,29105,-15051,29100,-15061,29095,-15071,29090,-15081,29085,-15091,29080,-15101,29074,-15111,29069,-15121,29064,-15131,29059,-15141,29054,-15150,29049,-15160,29044,-15170,29038,-15180,29033,-15190,29028,-15200,29023,-15210,29018,-15220,29012,-15230,29007,-15239,29002,-15249,28997,-15259,28992,-15269,28986,-15279,28981,-15289,28976,-15299,28971,-15309,28966,-15319,28960,-15328,28955,-15338,28950,-15348,28945,-15358,28939,-15368,28934,-15378,28929,-15388,28924,-15397,28918,-15407,28913,-15417,28908,-15427,28903,-15437,28897,-15447,28892,-15457,28887,-15466,28882,-15476,28876,-15486,28871,-15496,28866,-15506,28860,-15516,28855,-15526,28850,-15535,28845,-15545,28839,-15555,28834,-15565,28829,-15575,28823,-15584,28818,-15594,28813,-15604,28807,-15614,28802,-15624,28797,-15634,28791,-15643,28786,-15653,28781,-15663,28775,-15673,28770,-15683,28765,-15692,28759,-15702,28754,-15712,28749,-15722,28743,-15732,28738,-15741,28733,-15751,28727,-15761,28722,-15771,28716,-15781,28711,-15790,28706,-15800,28700,-15810,28695,-15820,28690,-15830,28684,-15839,28679,-15849,28673,-15859,28668,-15869,28662,-15878,28657,-15888,28652,-15898,28646,-15908,28641,-15918,28635,-15927,28630,-15937,28625,-15947,28619,-15957,28614,-15966,28608,-15976,28603,-15986,28597,-15996,28592,-16005,28586,-16015,28581,-16025,28575,-16035,28570,-16044,28565,-16054,28559,-16064,28554,-16073,28548,-16083,28543,-16093,28537,-16103,28532,-16112,28526,-16122,28521,-16132,28515,-16142,28510,-16151,28504,-16161,28499,-16171,28493,-16180,28488,-16190,28482,-16200,28477,-16210,28471,-16219,28465,-16229,28460,-16239,28454,-16248,28449,-16258,28443,-16268,28438,-16277,28432,-16287,28427,-16297,28421,-16307,28416,-16316,28410,-16326,28404,-16336,28399,-16345,28393,-16355,28388,-16365,28382,-16374,28377,-16384,28371,-16394,28365,-16403,28360,-16413,28354,-16423,28349,-16432,28343,-16442,28337,-16452,28332,-16461,28326,-16471,28321,-16481,28315,-16490,28309,-16500,28304,-16510,28298,-16519,28292,-16529,28287,-16539,28281,-16548,28275,-16558,28270,-16567,28264,-16577,28259,-16587,28253,-16596,28247,-16606,28242,-16616,28236,-16625,28230,-16635,28225,-16644,28219,-16654,28213,-16664,28208,-16673,28202,-16683,28196,-16693,28190,-16702,28185,-16712,28179,-16721,28173,-16731,28168,-16741,28162,-16750,28156,-16760,28151,-16769,28145,-16779,28139,-16789,28133,-16798,28128,-16808,28122,-16817,28116,-16827,28110,-16837,28105,-16846,28099,-16856,28093,-16865,28087,-16875,28082,-16884,28076,-16894,28070,-16904,28064,-16913,28059,-16923,28053,-16932,28047,-16942,28041,-16951,28036,-16961,28030,-16970,28024,-16980,28018,-16990,28012,-16999,28007,-17009,28001,-17018,27995,-17028,27989,-17037,27983,-17047,27978,-17056,27972,-17066,27966,-17075,27960,-17085,27954,-17095,27948,-17104,27943,-17114,27937,-17123,27931,-17133,27925,-17142,27919,-17152,27913,-17161,27908,-17171,27902,-17180,27896,-17190,27890,-17199,27884,-17209,27878,-17218,27872,-17228,27867,-17237,27861,-17247,27855,-17256,27849,-17266,27843,-17275,27837,-17285,27831,-17294,27825,-17304,27819,-17313,27814,-17323,27808,-17332,27802,-17342,27796,-17351,27790,-17361,27784,-17370,27778,-17380,27772,-17389,27766,-17398,27760,-17408,27754,-17417,27748,-17427,27742,-17436,27736,-17446,27731,-17455,27725,-17465,27719,-17474,27713,-17484,27707,-17493,27701,-17502,27695,-17512,27689,-17521,27683,-17531,27677,-17540,27671,-17550,27665,-17559,27659,-17568,27653,-17578,27647,-17587,27641,-17597,27635,-17606,27629,-17616,27623,-17625,27617,-17634,27611,-17644,27605,-17653,27599,-17663,27593,-17672,27587,-17681,27581,-17691,27575,-17700,27569,-17710,27563,-17719,27557,-17728,27551,-17738,27545,-17747,27538,-17757,27532,-17766,27526,-17775,27520,-17785,27514,-17794,27508,-17804,27502,-17813,27496,-17822,27490,-17832,27484,-17841,27478,-17850,27472,-17860,27466,-17869,27460,-17879,27453,-17888,27447,-17897,27441,-17907,27435,-17916,27429,-17925,27423,-17935,27417,-17944,27411,-17953,27405,-17963,27398,-17972,27392,-17981,27386,-17991,27380,-18000,27374,-18009,27368,-18019,27362,-18028,27355,-18037,27349,-18047,27343,-18056,27337,-18065,27331,-18075,27325,-18084,27319,-18093,27312,-18103,27306,-18112,27300,-18121,27294,-18131,27288,-18140,27281,-18149,27275,-18158,27269,-18168,27263,-18177,27257,-18186,27250,-18196,27244,-18205,27238,-18214,27232,-18223,27226,-18233,27219,-18242,27213,-18251,27207,-18261,27201,-18270,27195,-18279,27188,-18288,27182,-18298,27176,-18307,27170,-18316,27163,-18325,27157,-18335,27151,-18344,27145,-18353,27138,-18362,27132,-18372,27126,-18381,27120,-18390,27113,-18399,27107,-18409,27101,-18418,27094,-18427,27088,-18436,27082,-18446,27076,-18455,27069,-18464,27063,-18473,27057,-18483,27050,-18492,27044,-18501,27038,-18510,27031,-18519,27025,-18529,27019,-18538,27012,-18547,27006,-18556,27000,-18565,26994,-18575,26987,-18584,26981,-18593,26975,-18602,26968,-18611,26962,-18621,26955,-18630,26949,-18639,26943,-18648,26936,-18657,26930,-18667,26924,-18676,26917,-18685,26911,-18694,26905,-18703,26898,-18712,26892,-18722,26885,-18731,26879,-18740,26873,-18749,26866,-18758,26860,-18767,26853,-18777,26847,-18786,26841,-18795,26834,-18804,26828,-18813,26821,-18822,26815,-18831,26809,-18841,26802,-18850,26796,-18859,26789,-18868,26783,-18877,26776,-18886,26770,-18895,26764,-18905,26757,-18914,26751,-18923,26744,-18932,26738,-18941,26731,-18950,26725,-18959,26718,-18968,26712,-18977,26705,-18987,26699,-18996,26692,-19005,26686,-19014,26680,-19023,26673,-19032,26667,-19041,26660,-19050,26654,-19059,26647,-19068,26641,-19077,26634,-19087,26628,-19096,26621,-19105,26615,-19114,26608,-19123,26601,-19132,26595,-19141,26588,-19150,26582,-19159,26575,-19168,26569,-19177,26562,-19186,26556,-19195,26549,-19204,26543,-19213,26536,-19222,26530,-19232,26523,-19241,26516,-19250,26510,-19259,26503,-19268,26497,-19277,26490,-19286,26484,-19295,26477,-19304,26470,-19313,26464,-19322,26457,-19331,26451,-19340,26444,-19349,26437,-19358,26431,-19367,26424,-19376,26418,-19385,26411,-19394,26404,-19403,26398,-19412,26391,-19421,26385,-19430,26378,-19439,26371,-19448,26365,-19457,26358,-19466,26351,-19475,26345,-19484,26338,-19493,26332,-19502,26325,-19511,26318,-19520,26312,-19529,26305,-19538,26298,-19547,26292,-19556,26285,-19565,26278,-19574,26272,-19583,26265,-19591,26258,-19600,26252,-19609,26245,-19618,26238,-19627,26231,-19636,26225,-19645,26218,-19654,26211,-19663,26205,-19672,26198,-19681,26191,-19690,26185,-19699,26178,-19708,26171,-19717,26164,-19726,26158,-19734,26151,-19743,26144,-19752,26137,-19761,26131,-19770,26124,-19779,26117,-19788,26110,-19797,26104,-19806,26097,-19815,26090,-19823,26083,-19832,26077,-19841,26070,-19850,26063,-19859,26056,-19868,26050,-19877,26043,-19886,26036,-19895,26029,-19903,26022,-19912,26016,-19921,26009,-19930,26002,-19939,25995,-19948,25989,-19957,25982,-19966,25975,-19974,25968,-19983,25961,-19992,25954,-20001,25948,-20010,25941,-20019,25934,-20027,25927,-20036,25920,-20045,25913,-20054,25907,-20063,25900,-20072,25893,-20080,25886,-20089,25879,-20098,25872,-20107,25866,-20116,25859,-20125,25852,-20133,25845,-20142,25838,-20151,25831,-20160,25824,-20169,25817,-20177,25811,-20186,25804,-20195,25797,-20204,25790,-20213,25783,-20221,25776,-20230,25769,-20239,25762,-20248,25755,-20257,25749,-20265,25742,-20274,25735,-20283,25728,-20292,25721,-20300,25714,-20309,25707,-20318,25700,-20327,25693,-20335,25686,-20344,25679,-20353,25672,-20362,25665,-20370,25659,-20379,25652,-20388,25645,-20397,25638,-20405,25631,-20414,25624,-20423,25617,-20432,25610,-20440,25603,-20449,25596,-20458,25589,-20467,25582,-20475,25575,-20484,25568,-20493,25561,-20501,25554,-20510,25547,-20519,25540,-20528,25533,-20536,25526,-20545,25519,-20554,25512,-20562,25505,-20571,25498,-20580,25491,-20588,25484,-20597,25477,-20606,25470,-20614,25463,-20623,25456,-20632,25449,-20641,25442,-20649,25435,-20658,25428,-20667,25421,-20675,25414,-20684,25407,-20693,25399,-20701,25392,-20710,25385,-20719,25378,-20727,25371,-20736,25364,-20744,25357,-20753,25350,-20762,25343,-20770,25336,-20779,25329,-20788,25322,-20796,25315,-20805,25307,-20814,25300,-20822,25293,-20831,25286,-20839,25279,-20848,25272,-20857,25265,-20865,25258,-20874,25251,-20882,25243,-20891,25236,-20900,25229,-20908,25222,-20917,25215,-20926,25208,-20934,25201,-20943,25194,-20951,25186,-20960,25179,-20968,25172,-20977,25165,-20986,25158,-20994,25151,-21003,25144,-21011,25136,-21020,25129,-21028,25122,-21037,25115,-21046,25108,-21054,25100,-21063,25093,-21071,25086,-21080,25079,-21088,25072,-21097,25065,-21105,25057,-21114,25050,-21123,25043,-21131,25036,-21140,25029,-21148,25021,-21157,25014,-21165,25007,-21174,25000,-21182,24992,-21191,24985,-21199,24978,-21208,24971,-21216,24964,-21225,24956,-21233,24949,-21242,24942,-21250,24935,-21259,24927,-21267,24920,-21276,24913,-21284,24906,-21293,24898,-21301,24891,-21310,24884,-21318,24877,-21327,24869,-21335,24862,-21344,24855,-21352,24847,-21361,24840,-21369,24833,-21378,24826,-21386,24818,-21395,24811,-21403,24804,-21411,24796,-21420,24789,-21428,24782,-21437,24774,-21445,24767,-21454,24760,-21462,24753,-21471,24745,-21479,24738,-21487,24731,-21496,24723,-21504,24716,-21513,24709,-21521,24701,-21530,24694,-21538,24687,-21546,24679,-21555,24672,-21563,24664,-21572,24657,-21580,24650,-21588,24642,-21597,24635,-21605,24628,-21614,24620,-21622,24613,-21630,24606,-21639,24598,-21647,24591,-21656,24583,-21664,24576,-21672,24569,-21681,24561,-21689,24554,-21698,24546,-21706,24539,-21714,24532,-21723,24524,-21731,24517,-21739,24509,-21748,24502,-21756,24495,-21764,24487,-21773,24480,-21781,24472,-21789,24465,-21798,24457,-21806,24450,-21814,24443,-21823,24435,-21831,24428,-21839,24420,-21848,24413,-21856,24405,-21864,24398,-21873,24390,-21881,24383,-21889,24376,-21898,24368,-21906,24361,-21914,24353,-21923,24346,-21931,24338,-21939,24331,-21947,24323,-21956,24316,-21964,24308,-21972,24301,-21981,24293,-21989,24286,-21997,24278,-22005,24271,-22014,24263,-22022,24256,-22030,24248,-22039,24241,-22047,24233,-22055,24226,-22063,24218,-22072,24211,-22080,24203,-22088,24196,-22096,24188,-22105,24180,-22113,24173,-22121,24165,-22129,24158,-22138,24150,-22146,24143,-22154,24135,-22162,24128,-22170,24120,-22179,24113,-22187,24105,-22195,24097,-22203,24090,-22212,24082,-22220,24075,-22228,24067,-22236,24060,-22244,24052,-22253,24044,-22261,24037,-22269,24029,-22277,24022,-22285,24014,-22294,24006,-22302,23999,-22310,23991,-22318,23984,-22326,23976,-22334,23968,-22343,23961,-22351,23953,-22359,23945,-22367,23938,-22375,23930,-22383,23923,-22392,23915,-22400,23907,-22408,23900,-22416,23892,-22424,23884,-22432,23877,-22440,23869,-22449,23861,-22457,23854,-22465,23846,-22473,23838,-22481,23831,-22489,23823,-22497,23815,-22506,23808,-22514,23800,-22522,23792,-22530,23785,-22538,23777,-22546,23769,-22554,23762,-22562,23754,-22570,23746,-22578,23739,-22587,23731,-22595,23723,-22603,23715,-22611,23708,-22619,23700,-22627,23692,-22635,23685,-22643,23677,-22651,23669,-22659,23661,-22667,23654,-22675,23646,-22684,23638,-22692,23631,-22700,23623,-22708,23615,-22716,23607,-22724,23600,-22732,23592,-22740,23584,-22748,23576,-22756,23569,-22764,23561,-22772,23553,-22780,23545,-22788,23537,-22796,23530,-22804,23522,-22812,23514,-22820,23506,-22828,23499,-22836,23491,-22844,23483,-22852,23475,-22860,23467,-22868,23460,-22876,23452,-22884,23444,-22892,23436,-22900,23428,-22908,23421,-22916,23413,-22924,23405,-22932,23397,-22940,23389,-22948,23382,-22956,23374,-22964,23366,-22972,23358,-22980,23350,-22988,23342,-22996,23335,-23004,23327,-23012,23319,-23020,23311,-23028,23303,-23036,23295,-23044,23287,-23051,23280,-23059,23272,-23067,23264,-23075,23256,-23083,23248,-23091,23240,-23099,23232,-23107,23224,-23115,23217,-23123,23209,-23131,23201,-23139,23193,-23147,23185,-23154,23177,-23162,23169,-23170,23161,-23178,23153,-23186,23146,-23194,23138,-23202,23130,-23210,23122,-23218,23114,-23225,23106,-23233,23098,-23241,23090,-23249,23082,-23257,23074,-23265,23066,-23273,23058,-23281,23050,-23288,23043,-23296,23035,-23304,23027,-23312,23019,-23320,23011,-23328,23003,-23336,22995,-23343,22987,-23351,22979,-23359,22971,-23367,22963,-23375,22955,-23383,22947,-23390,22939,-23398,22931,-23406,22923,-23414,22915,-23422,22907,-23429,22899,-23437,22891,-23445,22883,-23453,22875,-23461,22867,-23468,22859,-23476,22851,-23484,22843,-23492,22835,-23500,22827,-23507,22819,-23515,22811,-23523,22803,-23531,22795,-23538,22787,-23546,22779,-23554,22771,-23562,22763,-23570,22755,-23577,22747,-23585,22739,-23593,22731,-23601,22723,-23608,22715,-23616,22707,-23624,22699,-23632,22691,-23639,22683,-23647,22674,-23655,22666,-23662,22658,-23670,22650,-23678,22642,-23686,22634,-23693,22626,-23701,22618,-23709,22610,-23716,22602,-23724,22594,-23732,22586,-23740,22577,-23747,22569,-23755,22561,-23763,22553,-23770,22545,-23778,22537,-23786,22529,-23793,22521,-23801,22513,-23809,22505,-23816,22496,-23824,22488,-23832,22480,-23839,22472,-23847,22464,-23855,22456,-23862,22448,-23870,22439,-23878,22431,-23885,22423,-23893,22415,-23901,22407,-23908,22399,-23916,22391,-23924,22382,-23931,22374,-23939,22366,-23946,22358,-23954,22350,-23962,22342,-23969,22333,-23977,22325,-23985,22317,-23992,22309,-24000,22301,-24007,22293,-24015,22284,-24023,22276,-24030,22268,-24038,22260,-24045,22252,-24053,22243,-24061,22235,-24068,22227,-24076,22219,-24083,22211,-24091,22202,-24098,22194,-24106,22186,-24114,22178,-24121,22169,-24129,22161,-24136,22153,-24144,22145,-24151,22137,-24159,22128,-24166,22120,-24174,22112,-24181,22104,-24189,22095,-24197,22087,-24204,22079,-24212,22071,-24219,22062,-24227,22054,-24234,22046,-24242,22038,-24249,22029,-24257,22021,-24264,22013,-24272,22004,-24279,21996,-24287,21988,-24294,21980,-24302,21971,-24309,21963,-24317,21955,-24324,21946,-24332,21938,-24339,21930,-24347,21922,-24354,21913,-24362,21905,-24369,21897,-24377,21888,-24384,21880,-24391,21872,-24399,21863,-24406,21855,-24414,21847,-24421,21838,-24429,21830,-24436,21822,-24444,21813,-24451,21805,-24458,21797,-24466,21788,-24473,21780,-24481,21772,-24488,21763,-24496,21755,-24503,21747,-24510,21738,-24518,21730,-24525,21722,-24533,21713,-24540,21705,-24547,21697,-24555,21688,-24562,21680,-24570,21671,-24577,21663,-24584,21655,-24592,21646,-24599,21638,-24607,21629,-24614,21621,-24621,21613,-24629,21604,-24636,21596,-24643,21587,-24651,21579,-24658,21571,-24665,21562,-24673,21554,-24680,21545,-24688,21537,-24695,21529,-24702,21520,-24710,21512,-24717,21503,-24724,21495,-24732,21486,-24739,21478,-24746,21470,-24754,21461,-24761,21453,-24768,21444,-24775,21436,-24783,21427,-24790,21419,-24797,21410,-24805,21402,-24812,21394,-24819,21385,-24827,21377,-24834,21368,-24841,21360,-24848,21351,-24856,21343,-24863,21334,-24870,21326,-24878,21317,-24885,21309,-24892,21300,-24899,21292,-24907,21283,-24914,21275,-24921,21266,-24928,21258,-24936,21249,-24943,21241,-24950,21232,-24957,21224,-24965,21215,-24972,21207,-24979,21198,-24986,21190,-24993,21181,-25001,21173,-25008,21164,-25015,21156,-25022,21147,-25030,21139,-25037,21130,-25044,21122,-25051,21113,-25058,21104,-25066,21096,-25073,21087,-25080,21079,-25087,21070,-25094,21062,-25101,21053,-25109,21045,-25116,21036,-25123,21027,-25130,21019,-25137,21010,-25145,21002,-25152,20993,-25159,20985,-25166,20976,-25173,20967,-25180,20959,-25187,20950,-25195,20942,-25202,20933,-25209,20925,-25216,20916,-25223,20907,-25230,20899,-25237,20890,-25244,20881,-25252,20873,-25259,20864,-25266,20856,-25273,20847,-25280,20838,-25287,20830,-25294,20821,-25301,20813,-25308,20804,-25316,20795,-25323,20787,-25330,20778,-25337,20769,-25344,20761,-25351,20752,-25358,20743,-25365,20735,-25372,20726,-25379,20718,-25386,20709,-25393,20700,-25400,20692,-25408,20683,-25415,20674,-25422,20666,-25429,20657,-25436,20648,-25443,20640,-25450,20631,-25457,20622,-25464,20613,-25471,20605,-25478,20596,-25485,20587,-25492,20579,-25499,20570,-25506,20561,-25513,20553,-25520,20544,-25527,20535,-25534,20527,-25541,20518,-25548,20509,-25555,20500,-25562,20492,-25569,20483,-25576,20474,-25583,20466,-25590,20457,-25597,20448,-25604,20439,-25611,20431,-25618,20422,-25625,20413,-25632,20404,-25639,20396,-25646,20387,-25653,20378,-25660,20369,-25666,20361,-25673,20352,-25680,20343,-25687,20334,-25694,20326,-25701,20317,-25708,20308,-25715,20299,-25722,20291,-25729,20282,-25736,20273,-25743,20264,-25750,20256,-25756,20247,-25763,20238,-25770,20229,-25777,20220,-25784,20212,-25791,20203,-25798,20194,-25805,20185,-25812,20176,-25818,20168,-25825,20159,-25832,20150,-25839,20141,-25846,20132,-25853,20124,-25860,20115,-25867,20106,-25873,20097,-25880,20088,-25887,20079,-25894,20071,-25901,20062,-25908,20053,-25914,20044,-25921,20035,-25928,20026,-25935,20018,-25942,20009,-25949,20000,-25955,19991,-25962,19982,-25969,19973,-25976,19965,-25983,19956,-25990,19947,-25996,19938,-26003,19929,-26010,19920,-26017,19911,-26023,19902,-26030,19894,-26037,19885,-26044,19876,-26051,19867,-26057,19858,-26064,19849,-26071,19840,-26078,19831,-26084,19822,-26091,19814,-26098,19805,-26105,19796,-26111,19787,-26118,19778,-26125,19769,-26132,19760,-26138,19751,-26145,19742,-26152,19733,-26159,19725,-26165,19716,-26172,19707,-26179,19698,-26186,19689,-26192,19680,-26199,19671,-26206,19662,-26212,19653,-26219,19644,-26226,19635,-26232,19626,-26239,19617,-26246,19608,-26253,19599,-26259,19590,-26266,19582,-26273,19573,-26279,19564,-26286,19555,-26293,19546,-26299,19537,-26306,19528,-26313,19519,-26319,19510,-26326,19501,-26333,19492,-26339,19483,-26346,19474,-26352,19465,-26359,19456,-26366,19447,-26372,19438,-26379,19429,-26386,19420,-26392,19411,-26399,19402,-26405,19393,-26412,19384,-26419,19375,-26425,19366,-26432,19357,-26438,19348,-26445,19339,-26452,19330,-26458,19321,-26465,19312,-26471,19303,-26478,19294,-26485,19285,-26491,19276,-26498,19267,-26504,19258,-26511,19249,-26517,19240,-26524,19231,-26531,19221,-26537,19212,-26544,19203,-26550,19194,-26557,19185,-26563,19176,-26570,19167,-26576,19158,-26583,19149,-26589,19140,-26596,19131,-26602,19122,-26609,19113,-26616,19104,-26622,19095,-26629,19086,-26635,19076,-26642,19067,-26648,19058,-26655,19049,-26661,19040,-26668,19031,-26674,19022,-26681,19013,-26687,19004,-26693,18995,-26700,18986,-26706,18976,-26713,18967,-26719,18958,-26726,18949,-26732,18940,-26739,18931,-26745,18922,-26752,18913,-26758,18904,-26765,18894,-26771,18885,-26777,18876,-26784,18867,-26790,18858,-26797,18849,-26803,18840,-26810,18830,-26816,18821,-26822,18812,-26829,18803,-26835,18794,-26842,18785,-26848,18776,-26854,18766,-26861,18757,-26867,18748,-26874,18739,-26880,18730,-26886,18721,-26893,18711,-26899,18702,-26906,18693,-26912,18684,-26918,18675,-26925,18666,-26931,18656,-26937,18647,-26944,18638,-26950,18629,-26956,18620,-26963,18610,-26969,18601,-26976,18592,-26982,18583,-26988,18574,-26995,18564,-27001,18555,-27007,18546,-27013,18537,-27020,18528,-27026,18518,-27032,18509,-27039,18500,-27045,18491,-27051,18482,-27058,18472,-27064,18463,-27070,18454,-27077,18445,-27083,18435,-27089,18426,-27095,18417,-27102,18408,-27108,18398,-27114,18389,-27121,18380,-27127,18371,-27133,18361,-27139,18352,-27146,18343,-27152,18334,-27158,18324,-27164,18315,-27171,18306,-27177,18297,-27183,18287,-27189,18278,-27196,18269,-27202,18260,-27208,18250,-27214,18241,-27220,18232,-27227,18222,-27233,18213,-27239,18204,-27245,18195,-27251,18185,-27258,18176,-27264,18167,-27270,18157,-27276,18148,-27282,18139,-27289,18130,-27295,18120,-27301,18111,-27307,18102,-27313,18092,-27320,18083,-27326,18074,-27332,18064,-27338,18055,-27344,18046,-27350,18036,-27356,18027,-27363,18018,-27369,18008,-27375,17999,-27381,17990,-27387,17980,-27393,17971,-27399,17962,-27406,17952,-27412,17943,-27418,17934,-27424,17924,-27430,17915,-27436,17906,-27442,17896,-27448,17887,-27454,17878,-27461,17868,-27467,17859,-27473,17849,-27479,17840,-27485,17831,-27491,17821,-27497,17812,-27503,17803,-27509,17793,-27515,17784,-27521,17774,-27527,17765,-27533,17756,-27539,17746,-27546,17737,-27552,17727,-27558,17718,-27564,17709,-27570,17699,-27576,17690,-27582,17680,-27588,17671,-27594,17662,-27600,17652,-27606,17643,-27612,17633,-27618,17624,-27624,17615,-27630,17605,-27636,17596,-27642,17586,-27648,17577,-27654,17567,-27660,17558,-27666,17549,-27672,17539,-27678,17530,-27684,17520,-27690,17511,-27696,17501,-27702,17492,-27708,17483,-27714,17473,-27720,17464,-27726,17454,-27732,17445,-27737,17435,-27743,17426,-27749,17416,-27755,17407,-27761,17397,-27767,17388,-27773,17379,-27779,17369,-27785,17360,-27791,17350,-27797,17341,-27803,17331,-27809,17322,-27815,17312,-27820,17303,-27826,17293,-27832,17284,-27838,17274,-27844,17265,-27850,17255,-27856,17246,-27862,17236,-27868,17227,-27873,17217,-27879,17208,-27885,17198,-27891,17189,-27897,17179,-27903,17170,-27909,17160,-27914,17151,-27920,17141,-27926,17132,-27932,17122,-27938,17113,-27944,17103,-27949,17094,-27955,17084,-27961,17074,-27967,17065,-27973,17055,-27979,17046,-27984,17036,-27990,17027,-27996,17017,-28002,17008,-28008,16998,-28013,16989,-28019,16979,-28025,16969,-28031,16960,-28037,16950,-28042,16941,-28048,16931,-28054,16922,-28060,16912,-28065,16903,-28071,16893,-28077,16883,-28083,16874,-28088,16864,-28094,16855,-28100,16845,-28106,16836,-28111,16826,-28117,16816,-28123,16807,-28129,16797,-28134,16788,-28140,16778,-28146,16768,-28152,16759,-28157,16749,-28163,16740,-28169,16730,-28174,16720,-28180,16711,-28186,16701,-28191,16692,-28197,16682,-28203,16672,-28209,16663,-28214,16653,-28220,16643,-28226,16634,-28231,16624,-28237,16615,-28243,16605,-28248,16595,-28254,16586,-28260,16576,-28265,16566,-28271,16557,-28276,16547,-28282,16538,-28288,16528,-28293,16518,-28299,16509,-28305,16499,-28310,16489,-28316,16480,-28322,16470,-28327,16460,-28333,16451,-28338,16441,-28344,16431,-28350,16422,-28355,16412,-28361,16402,-28366,16393,-28372,16383,-28378,16373,-28383,16364,-28389,16354,-28394,16344,-28400,16335,-28405,16325,-28411,16315,-28417,16306,-28422,16296,-28428,16286,-28433,16276,-28439,16267,-28444,16257,-28450,16247,-28455,16238,-28461,16228,-28466,16218,-28472,16209,-28478,16199,-28483,16189,-28489,16179,-28494,16170,-28500,16160,-28505,16150,-28511,16141,-28516,16131,-28522,16121,-28527,16111,-28533,16102,-28538,16092,-28544,16082,-28549,16072,-28555,16063,-28560,16053,-28566,16043,-28571,16034,-28576,16024,-28582,16014,-28587,16004,-28593,15995,-28598,15985,-28604,15975,-28609,15965,-28615,15956,-28620,15946,-28626,15936,-28631,15926,-28636,15917,-28642,15907,-28647,15897,-28653,15887,-28658,15877,-28663,15868,-28669,15858,-28674,15848,-28680,15838,-28685,15829,-28691,15819,-28696,15809,-28701,15799,-28707,15789,-28712,15780,-28717,15770,-28723,15760,-28728,15750,-28734,15740,-28739,15731,-28744,15721,-28750,15711,-28755,15701,-28760,15691,-28766,15682,-28771,15672,-28776,15662,-28782,15652,-28787,15642,-28792,15633,-28798,15623,-28803,15613,-28808,15603,-28814,15593,-28819,15583,-28824,15574,-28830,15564,-28835,15554,-28840,15544,-28846,15534,-28851,15525,-28856,15515,-28861,15505,-28867,15495,-28872,15485,-28877,15475,-28883,15465,-28888,15456,-28893,15446,-28898,15436,-28904,15426,-28909,15416,-28914,15406,-28919,15396,-28925,15387,-28930,15377,-28935,15367,-28940,15357,-28946,15347,-28951,15337,-28956,15327,-28961,15318,-28967,15308,-28972,15298,-28977,15288,-28982,15278,-28987,15268,-28993,15258,-28998,15248,-29003,15238,-29008,15229,-29013,15219,-29019,15209,-29024,15199,-29029,15189,-29034,15179,-29039,15169,-29045,15159,-29050,15149,-29055,15140,-29060,15130,-29065,15120,-29070,15110,-29075,15100,-29081,15090,-29086,15080,-29091,15070,-29096,15060,-29101,15050,-29106,15040,-29111,15030,-29117,15021,-29122,15011,-29127,15001,-29132,14991,-29137,14981,-29142,14971,-29147,14961,-29152,14951,-29157,14941,-29163,14931,-29168,14921,-29173,14911,-29178,14901,-29183,14891,-29188,14881,-29193,14871,-29198,14861,-29203,14852,-29208,14842,-29213,14832,-29218,14822,-29223,14812,-29228,14802,-29234,14792,-29239,14782,-29244,14772,-29249,14762,-29254,14752,-29259,14742,-29264,14732,-29269,14722,-29274,14712,-29279,14702,-29284,14692,-29289,14682,-29294,14672,-29299,14662,-29304,14652,-29309,14642,-29314,14632,-29319,14622,-29324,14612,-29329,14602,-29334,14592,-29339,14582,-29344,14572,-29349,14562,-29354,14552,-29359,14542,-29364,14532,-29369,14522,-29373,14512,-29378,14502,-29383,14492,-29388,14482,-29393,14472,-29398,14462,-29403,14452,-29408,14442,-29413,14432,-29418,14422,-29423,14412,-29428,14402,-29433,14392,-29438,14382,-29442,14372,-29447,14362,-29452,14352,-29457,14342,-29462,14331,-29467,14321,-29472,14311,-29477,14301,-29482,14291,-29486,14281,-29491,14271,-29496,14261,-29501,14251,-29506,14241,-29511,14231,-29516,14221,-29520,14211,-29525,14201,-29530,14191,-29535,14181,-29540,14171,-29545,14160,-29549,14150,-29554,14140,-29559,14130,-29564,14120,-29569,14110,-29574,14100,-29578,14090,-29583,14080,-29588,14070,-29593,14060,-29598,14050,-29602,14039,-29607,14029,-29612,14019,-29617,14009,-29622,13999,-29626,13989,-29631,13979,-29636,13969,-29641,13959,-29645,13949,-29650,13938,-29655,13928,-29660,13918,-29664,13908,-29669,13898,-29674,13888,-29679,13878,-29683,13868,-29688,13858,-29693,13847,-29697,13837,-29702,13827,-29707,13817,-29712,13807,-29716,13797,-29721,13787,-29726,13777,-29730,13766,-29735,13756,-29740,13746,-29745,13736,-29749,13726,-29754,13716,-29759,13706,-29763,13695,-29768,13685,-29773,13675,-29777,13665,-29782,13655,-29787,13645,-29791,13634,-29796,13624,-29801,13614,-29805,13604,-29810,13594,-29814,13584,-29819,13574,-29824,13563,-29828,13553,-29833,13543,-29838,13533,-29842,13523,-29847,13512,-29851,13502,-29856,13492,-29861,13482,-29865,13472,-29870,13462,-29874,13451,-29879,13441,-29884,13431,-29888,13421,-29893,13411,-29897,13400,-29902,13390,-29906,13380,-29911,13370,-29916,13360,-29920,13349,-29925,13339,-29929,13329,-29934,13319,-29938,13309,-29943,13298,-29947,13288,-29952,13278,-29956,13268,-29961,13258,-29965,13247,-29970,13237,-29974,13227,-29979,13217,-29984,13207,-29988,13196,-29993,13186,-29997,13176,-30002,13166,-30006,13155,-30010,13145,-30015,13135,-30019,13125,-30024,13114,-30028,13104,-30033,13094,-30037,13084,-30042,13074,-30046,13063,-30051,13053,-30055,13043,-30060,13033,-30064,13022,-30068,13012,-30073,13002,-30077,12992,-30082,12981,-30086,12971,-30091,12961,-30095,12950,-30099,12940,-30104,12930,-30108,12920,-30113,12909,-30117,12899,-30122,12889,-30126,12879,-30130,12868,-30135,12858,-30139,12848,-30143,12838,-30148,12827,-30152,12817,-30157,12807,-30161,12796,-30165,12786,-30170,12776,-30174,12766,-30178,12755,-30183,12745,-30187,12735,-30191,12724,-30196,12714,-30200,12704,-30204,12694,-30209,12683,-30213,12673,-30217,12663,-30222,12652,-30226,12642,-30230,12632,-30235,12621,-30239,12611,-30243,12601,-30248,12590,-30252,12580,-30256,12570,-30260,12560,-30265,12549,-30269,12539,-30273,12529,-30278,12518,-30282,12508,-30286,12498,-30290,12487,-30295,12477,-30299,12467,-30303,12456,-30307,12446,-30312,12436,-30316,12425,-30320,12415,-30324,12405,-30329,12394,-30333,12384,-30337,12374,-30341,12363,-30345,12353,-30350,12343,-30354,12332,-30358,12322,-30362,12312,-30366,12301,-30371,12291,-30375,12280,-30379,12270,-30383,12260,-30387,12249,-30392,12239,-30396,12229,-30400,12218,-30404,12208,-30408,12198,-30412,12187,-30417,12177,-30421,12166,-30425,12156,-30429,12146,-30433,12135,-30437,12125,-30441,12115,-30446,12104,-30450,12094,-30454,12083,-30458,12073,-30462,12063,-30466,12052,-30470,12042,-30474,12032,-30478,12021,-30483,12011,-30487,12000,-30491,11990,-30495,11980,-30499,11969,-30503,11959,-30507,11948,-30511,11938,-30515,11928,-30519,11917,-30523,11907,-30527,11896,-30531,11886,-30536,11876,-30540,11865,-30544,11855,-30548,11844,-30552,11834,-30556,11823,-30560,11813,-30564,11803,-30568,11792,-30572,11782,-30576,11771,-30580,11761,-30584,11750,-30588,11740,-30592,11730,-30596,11719,-30600,11709,-30604,11698,-30608,11688,-30612,11677,-30616,11667,-30620,11657,-30624,11646,-30628,11636,-30632,11625,-30636,11615,-30640,11604,-30644,11594,-30648,11583,-30652,11573,-30656,11563,-30659,11552,-30663,11542,-30667,11531,-30671,11521,-30675,11510,-30679,11500,-30683,11489,-30687,11479,-30691,11468,-30695,11458,-30699,11448,-30703,11437,-30706,11427,-30710,11416,-30714,11406,-30718,11395,-30722,11385,-30726,11374,-30730,11364,-30734,11353,-30738,11343,-30741,11332,-30745,11322,-30749,11311,-30753,11301,-30757,11290,-30761,11280,-30765,11269,-30768,11259,-30772,11248,-30776,11238,-30780,11227,-30784,11217,-30788,11206,-30791,11196,-30795,11185,-30799,11175,-30803,11164,-30807,11154,-30810,11143,-30814,11133,-30818,11122,-30822,11112,-30826,11101,-30829,11091,-30833,11080,-30837,11070,-30841,11059,-30845,11049,-30848,11038,-30852,11028,-30856,11017,-30860,11007,-30863,10996,-30867,10986,-30871,10975,-30875,10965,-30878,10954,-30882,10944,-30886,10933,-30890,10923,-30893,10912,-30897,10902,-30901,10891,-30904,10880,-30908,10870,-30912,10859,-30916,10849,-30919,10838,-30923,10828,-30927,10817,-30930,10807,-30934,10796,-30938,10786,-30941,10775,-30945,10765,-30949,10754,-30952,10743,-30956,10733,-30960,10722,-30963,10712,-30967,10701,-30971,10691,-30974,10680,-30978,10670,-30982,10659,-30985,10648,-30989,10638,-30992,10627,-30996,10617,-31000,10606,-31003,10596,-31007,10585,-31011,10574,-31014,10564,-31018,10553,-31021,10543,-31025,10532,-31029,10522,-31032,10511,-31036,10500,-31039,10490,-31043,10479,-31046,10469,-31050,10458,-31054,10447,-31057,10437,-31061,10426,-31064,10416,-31068,10405,-31071,10395,-31075,10384,-31078,10373,-31082,10363,-31086,10352,-31089,10342,-31093,10331,-31096,10320,-31100,10310,-31103,10299,-31107,10289,-31110,10278,-31114,10267,-31117,10257,-31121,10246,-31124,10235,-31128,10225,-31131,10214,-31135,10204,-31138,10193,-31142,10182,-31145,10172,-31149,10161,-31152,10151,-31155,10140,-31159,10129,-31162,10119,-31166,10108,-31169,10097,-31173,10087,-31176,10076,-31180,10066,-31183,10055,-31186,10044,-31190,10034,-31193,10023,-31197,10012,-31200,10002,-31204,9991,-31207,9980,-31210,9970,-31214,9959,-31217,9949,-31221,9938,-31224,9927,-31227,9917,-31231,9906,-31234,9895,-31237,9885,-31241,9874,-31244,9863,-31248,9853,-31251,9842,-31254,9831,-31258,9821,-31261,9810,-31264,9799,-31268,9789,-31271,9778,-31274,9767,-31278,9757,-31281,9746,-31284,9735,-31288,9725,-31291,9714,-31294,9703,-31298,9693,-31301,9682,-31304,9671,-31308,9661,-31311,9650,-31314,9639,-31317,9629,-31321,9618,-31324,9607,-31327,9597,-31331,9586,-31334,9575,-31337,9565,-31340,9554,-31344,9543,-31347,9533,-31350,9522,-31353,9511,-31357,9501,-31360,9490,-31363,9479,-31366,9468,-31370,9458,-31373,9447,-31376,9436,-31379,9426,-31382,9415,-31386,9404,-31389,9394,-31392,9383,-31395,9372,-31398,9362,-31402,9351,-31405,9340,-31408,9329,-31411,9319,-31414,9308,-31418,9297,-31421,9287,-31424,9276,-31427,9265,-31430,9254,-31433,9244,-31436,9233,-31440,9222,-31443,9212,-31446,9201,-31449,9190,-31452,9179,-31455,9169,-31458,9158,-31462,9147,-31465,9136,-31468,9126,-31471,9115,-31474,9104,-31477,9094,-31480,9083,-31483,9072,-31486,9061,-31490,9051,-31493,9040,-31496,9029,-31499,9018,-31502,9008,-31505,8997,-31508,8986,-31511,8975,-31514,8965,-31517,8954,-31520,8943,-31523,8932,-31526,8922,-31529,8911,-31532,8900,-31535,8889,-31538,8879,-31542,8868,-31545,8857,-31548,8846,-31551,8836,-31554,8825,-31557,8814,-31560,8803,-31563,8793,-31566,8782,-31569,8771,-31572,8760,-31575,8750,-31578,8739,-31581,8728,-31584,8717,-31587,8707,-31589,8696,-31592,8685,-31595,8674,-31598,8663,-31601,8653,-31604,8642,-31607,8631,-31610,8620,-31613,8610,-31616,8599,-31619,8588,-31622,8577,-31625,8567,-31628,8556,-31631,8545,-31634,8534,-31636,8523,-31639,8513,-31642,8502,-31645,8491,-31648,8480,-31651,8469,-31654,8459,-31657,8448,-31660,8437,-31663,8426,-31665,8415,-31668,8405,-31671,8394,-31674,8383,-31677,8372,-31680,8361,-31683,8351,-31685,8340,-31688,8329,-31691,8318,-31694,8307,-31697,8297,-31700,8286,-31702,8275,-31705,8264,-31708,8253,-31711,8243,-31714,8232,-31717,8221,-31719,8210,-31722,8199,-31725,8189,-31728,8178,-31730,8167,-31733,8156,-31736,8145,-31739,8134,-31742,8124,-31744,8113,-31747,8102,-31750,8091,-31753,8080,-31755,8070,-31758,8059,-31761,8048,-31764,8037,-31766,8026,-31769,8015,-31772,8005,-31775,7994,-31777,7983,-31780,7972,-31783,7961,-31786,7950,-31788,7940,-31791,7929,-31794,7918,-31796,7907,-31799,7896,-31802,7885,-31804,7875,-31807,7864,-31810,7853,-31812,7842,-31815,7831,-31818,7820,-31820,7809,-31823,7799,-31826,7788,-31828,7777,-31831,7766,-31834,7755,-31836,7744,-31839,7733,-31842,7723,-31844,7712,-31847,7701,-31850,7690,-31852,7679,-31855,7668,-31857,7657,-31860,7647,-31863,7636,-31865,7625,-31868,7614,-31870,7603,-31873,7592,-31876,7581,-31878,7571,-31881,7560,-31883,7549,-31886,7538,-31889,7527,-31891,7516,-31894,7505,-31896,7494,-31899,7484,-31901,7473,-31904,7462,-31906,7451,-31909,7440,-31912,7429,-31914,7418,-31917,7407,-31919,7397,-31922,7386,-31924,7375,-31927,7364,-31929,7353,-31932,7342,-31934,7331,-31937,7320,-31939,7310,-31942,7299,-31944,7288,-31947,7277,-31949,7266,-31952,7255,-31954,7244,-31957,7233,-31959,7222,-31962,7211,-31964,7201,-31966,7190,-31969,7179,-31971,7168,-31974,7157,-31976,7146,-31979,7135,-31981,7124,-31984,7113,-31986,7102,-31988,7092,-31991,7081,-31993,7070,-31996,7059,-31998,7048,-32000,7037,-32003,7026,-32005,7015,-32008,7004,-32010,6993,-32012,6982,-32015,6972,-32017,6961,-32020,6950,-32022,6939,-32024,6928,-32027,6917,-32029,6906,-32031,6895,-32034,6884,-32036,6873,-32038,6862,-32041,6851,-32043,6841,-32045,6830,-32048,6819,-32050,6808,-32052,6797,-32055,6786,-32057,6775,-32059,6764,-32062,6753,-32064,6742,-32066,6731,-32069,6720,-32071,6709,-32073,6698,-32075,6688,-32078,6677,-32080,6666,-32082,6655,-32085,6644,-32087,6633,-32089,6622,-32091,6611,-32094,6600,-32096,6589,-32098,6578,-32100,6567,-32103,6556,-32105,6545,-32107,6534,-32109,6523,-32111,6512,-32114,6502,-32116,6491,-32118,6480,-32120,6469,-32123,6458,-32125,6447,-32127,6436,-32129,6425,-32131,6414,-32134,6403,-32136,6392,-32138,6381,-32140,6370,-32142,6359,-32144,6348,-32147,6337,-32149,6326,-32151,6315,-32153,6304,-32155,6293,-32157,6282,-32159,6271,-32162,6261,-32164,6250,-32166,6239,-32168,6228,-32170,6217,-32172,6206,-32174,6195,-32177,6184,-32179,6173,-32181,6162,-32183,6151,-32185,6140,-32187,6129,-32189,6118,-32191,6107,-32193,6096,-32195,6085,-32197,6074,-32200,6063,-32202,6052,-32204,6041,-32206,6030,-32208,6019,-32210,6008,-32212,5997,-32214,5986,-32216,5975,-32218,5964,-32220,5953,-32222,5942,-32224,5931,-32226,5920,-32228,5909,-32230,5898,-32232,5887,-32234,5876,-32236,5865,-32238,5854,-32240,5843,-32242,5832,-32244,5821,-32246,5810,-32248,5799,-32250,5788,-32252,5777,-32254,5766,-32256,5755,-32258,5744,-32260,5733,-32262,5722,-32264,5711,-32266,5700,-32268,5689,-32270,5678,-32272,5667,-32274,5656,-32275,5645,-32277,5634,-32279,5623,-32281,5612,-32283,5601,-32285,5590,-32287,5579,-32289,5568,-32291,5557,-32293,5546,-32295,5535,-32296,5524,-32298,5513,-32300,5502,-32302,5491,-32304,5480,-32306,5469,-32308,5458,-32310,5447,-32311,5436,-32313,5425,-32315,5414,-32317,5403,-32319,5392,-32321,5381,-32323,5370,-32324,5359,-32326,5348,-32328,5337,-32330,5326,-32332,5315,-32333,5304,-32335,5293,-32337,5282,-32339,5271,-32341,5260,-32342,5249,-32344,5238,-32346,5227,-32348,5216,-32350,5205,-32351,5194,-32353,5183,-32355,5172,-32357,5161,-32358,5150,-32360,5139,-32362,5128,-32364,5117,-32365,5106,-32367,5094,-32369,5083,-32371,5072,-32372,5061,-32374,5050,-32376,5039,-32378,5028,-32379,5017,-32381,5006,-32383,4995,-32384,4984,-32386,4973,-32388,4962,-32390,4951,-32391,4940,-32393,4929,-32395,4918,-32396,4907,-32398,4896,-32400,4885,-32401,4874,-32403,4863,-32405,4852,-32406,4841,-32408,4830,-32410,4818,-32411,4807,-32413,4796,-32414,4785,-32416,4774,-32418,4763,-32419,4752,-32421,4741,-32423,4730,-32424,4719,-32426,4708,-32427,4697,-32429,4686,-32431,4675,-32432,4664,-32434,4653,-32435,4642,-32437,4631,-32439,4620,-32440,4608,-32442,4597,-32443,4586,-32445,4575,-32446,4564,-32448,4553,-32450,4542,-32451,4531,-32453,4520,-32454,4509,-32456,4498,-32457,4487,-32459,4476,-32460,4465,-32462,4454,-32463,4443,-32465,4431,-32466,4420,-32468,4409,-32469,4398,-32471,4387,-32472,4376,-32474,4365,-32475,4354,-32477,4343,-32478,4332,-32480,4321,-32481,4310,-32483,4299,-32484,4288,-32486,4276,-32487,4265,-32489,4254,-32490,4243,-32492,4232,-32493,4221,-32494,4210,-32496,4199,-32497,4188,-32499,4177,-32500,4166,-32502,4155,-32503,4144,-32504,4132,-32506,4121,-32507,4110,-32509,4099,-32510,4088,-32511,4077,-32513,4066,-32514,4055,-32516,4044,-32517,4033,-32518,4022,-32520,4011,-32521,3999,-32522,3988,-32524,3977,-32525,3966,-32527,3955,-32528,3944,-32529,3933,-32531,3922,-32532,3911,-32533,3900,-32535,3889,-32536,3877,-32537,3866,-32539,3855,-32540,3844,-32541,3833,-32542,3822,-32544,3811,-32545,3800,-32546,3789,-32548,3778,-32549,3767,-32550,3755,-32552,3744,-32553,3733,-32554,3722,-32555,3711,-32557,3700,-32558,3689,-32559,3678,-32560,3667,-32562,3656,-32563,3644,-32564,3633,-32565,3622,-32567,3611,-32568,3600,-32569,3589,-32570,3578,-32572,3567,-32573,3556,-32574,3545,-32575,3533,-32576,3522,-32578,3511,-32579,3500,-32580,3489,-32581,3478,-32582,3467,-32584,3456,-32585,3445,-32586,3433,-32587,3422,-32588,3411,-32589,3400,-32591,3389,-32592,3378,-32593,3367,-32594,3356,-32595,3345,-32596,3333,-32597,3322,-32599,3311,-32600,3300,-32601,3289,-32602,3278,-32603,3267,-32604,3256,-32605,3245,-32606,3233,-32608,3222,-32609,3211,-32610,3200,-32611,3189,-32612,3178,-32613,3167,-32614,3156,-32615,3145,-32616,3133,-32617,3122,-32618,3111,-32619,3100,-32620,3089,-32622,3078,-32623,3067,-32624,3056,-32625,3044,-32626,3033,-32627,3022,-32628,3011,-32629,3000,-32630,2989,-32631,2978,-32632,2967,-32633,2955,-32634,2944,-32635,2933,-32636,2922,-32637,2911,-32638,2900,-32639,2889,-32640,2878,-32641,2866,-32642,2855,-32643,2844,-32644,2833,-32645,2822,-32646,2811,-32647,2800,-32648,2789,-32649,2777,-32650,2766,-32650,2755,-32651,2744,-32652,2733,-32653,2722,-32654,2711,-32655,2700,-32656,2688,-32657,2677,-32658,2666,-32659,2655,-32660,2644,-32661,2633,-32662,2622,-32662,2610,-32663,2599,-32664,2588,-32665,2577,-32666,2566,-32667,2555,-32668,2544,-32669,2533,-32669,2521,-32670,2510,-32671,2499,-32672,2488,-32673,2477,-32674,2466,-32675,2455,-32675,2443,-32676,2432,-32677,2421,-32678,2410,-32679,2399,-32680,2388,-32680,2377,-32681,2365,-32682,2354,-32683,2343,-32684,2332,-32684,2321,-32685,2310,-32686,2299,-32687,2287,-32688,2276,-32688,2265,-32689,2254,-32690,2243,-32691,2232,-32691,2221,-32692,2209,-32693,2198,-32694,2187,-32694,2176,-32695,2165,-32696,2154,-32697,2143,-32697,2131,-32698,2120,-32699,2109,-32700,2098,-32700,2087,-32701,2076,-32702,2065,-32702,2053,-32703,2042,-32704,2031,-32704,2020,-32705,2009,-32706,1998,-32707,1986,-32707,1975,-32708,1964,-32709,1953,-32709,1942,-32710,1931,-32711,1920,-32711,1908,-32712,1897,-32712,1886,-32713,1875,-32714,1864,-32714,1853,-32715,1842,-32716,1830,-32716,1819,-32717,1808,-32718,1797,-32718,1786,-32719,1775,-32719,1763,-32720,1752,-32721,1741,-32721,1730,-32722,1719,-32722,1708,-32723,1697,-32724,1685,-32724,1674,-32725,1663,-32725,1652,-32726,1641,-32726,1630,-32727,1618,-32727,1607,-32728,1596,-32729,1585,-32729,1574,-32730,1563,-32730,1552,-32731,1540,-32731,1529,-32732,1518,-32732,1507,-32733,1496,-32733,1485,-32734,1473,-32734,1462,-32735,1451,-32735,1440,-32736,1429,-32736,1418,-32737,1406,-32737,1395,-32738,1384,-32738,1373,-32739,1362,-32739,1351,-32740,1339,-32740,1328,-32741,1317,-32741,1306,-32741,1295,-32742,1284,-32742,1273,-32743,1261,-32743,1250,-32744,1239,-32744,1228,-32744,1217,-32745,1206,-32745,1194,-32746,1183,-32746,1172,-32747,1161,-32747,1150,-32747,1139,-32748,1127,-32748,1116,-32748,1105,-32749,1094,-32749,1083,-32750,1072,-32750,1060,-32750,1049,-32751,1038,-32751,1027,-32751,1016,-32752,1005,-32752,993,-32752,982,-32753,971,-32753,960,-32753,949,-32754,938,-32754,926,-32754,915,-32755,904,-32755,893,-32755,882,-32756,871,-32756,859,-32756,848,-32757,837,-32757,826,-32757,815,-32757,804,-32758,792,-32758,781,-32758,770,-32758,759,-32759,748,-32759,737,-32759,725,-32759,714,-32760,703,-32760,692,-32760,681,-32760,670,-32761,658,-32761,647,-32761,636,-32761,625,-32762,614,-32762,603,-32762,591,-32762,580,-32762,569,-32763,558,-32763,547,-32763,536,-32763,524,-32763,513,-32763,502,-32764,491,-32764,480,-32764,469,-32764,457,-32764,446,-32764,435,-32765,424,-32765,413,-32765,402,-32765,390,-32765,379,-32765,368,-32765,357,-32766,346,-32766,335,-32766,323,-32766,312,-32766,301,-32766,290,-32766,279,-32766,268,-32766,256,-32766,245,-32767,234,-32767,223,-32767,212,-32767,201,-32767,189,-32767,178,-32767,167,-32767,156,-32767,145,-32767,134,-32767,122,-32767,111,-32767,100,-32767,89,-32767,78,-32767,67,-32767,55,-32767,44,-32767,33,-32767,22,-32767,11,-32767,0,-32767,-12,-32767,-23,-32767,-34,-32767,-45,-32767,-56,-32767,-68,-32767,-79,-32767,-90,-32767,-101,-32767,-112,-32767,-123,-32767,-135,-32767,-146,-32767,-157,-32767,-168,-32767,-179,-32767,-190,-32767,-202,-32767,-213,-32767,-224,-32767,-235,-32767,-246,-32767,-257,-32766,-269,-32766,-280,-32766,-291,-32766,-302,-32766,-313,-32766,-324,-32766,-336,-32766,-347,-32766,-358,-32766,-369,-32765,-380,-32765,-391,-32765,-403,-32765,-414,-32765,-425,-32765,-436,-32765,-447,-32764,-458,-32764,-470,-32764,-481,-32764,-492,-32764,-503,-32764,-514,-32763,-525,-32763,-537,-32763,-548,-32763,-559,-32763,-570,-32763,-581,-32762,-592,-32762,-604,-32762,-615,-32762,-626,-32762,-637,-32761,-648,-32761,-659,-32761,-671,-32761,-682,-32760,-693,-32760,-704,-32760,-715,-32760,-726,-32759,-738,-32759,-749,-32759,-760,-32759,-771,-32758,-782,-32758,-793,-32758,-805,-32758,-816,-32757,-827,-32757,-838,-32757,-849,-32757,-860,-32756,-872,-32756,-883,-32756,-894,-32755,-905,-32755,-916,-32755,-927,-32754,-939,-32754,-950,-32754,-961,-32753,-972,-32753,-983,-32753,-994,-32752,-1006,-32752,-1017,-32752,-1028,-32751,-1039,-32751,-1050,-32751,-1061,-32750,-1073,-32750,-1084,-32750,-1095,-32749,-1106,-32749,-1117,-32748,-1128,-32748,-1140,-32748,-1151,-32747,-1162,-32747,-1173,-32747,-1184,-32746,-1195,-32746,-1207,-32745,-1218,-32745,-1229,-32744,-1240,-32744,-1251,-32744,-1262,-32743,-1274,-32743,-1285,-32742,-1296,-32742,-1307,-32741,-1318,-32741,-1329,-32741,-1340,-32740,-1352,-32740,-1363,-32739,-1374,-32739,-1385,-32738,-1396,-32738,-1407,-32737,-1419,-32737,-1430,-32736,-1441,-32736,-1452,-32735,-1463,-32735,-1474,-32734,-1486,-32734,-1497,-32733,-1508,-32733,-1519,-32732,-1530,-32732,-1541,-32731,-1553,-32731,-1564,-32730,-1575,-32730,-1586,-32729,-1597,-32729,-1608,-32728,-1619,-32727,-1631,-32727,-1642,-32726,-1653,-32726,-1664,-32725,-1675,-32725,-1686,-32724,-1698,-32724,-1709,-32723,-1720,-32722,-1731,-32722,-1742,-32721,-1753,-32721,-1764,-32720,-1776,-32719,-1787,-32719,-1798,-32718,-1809,-32718,-1820,-32717,-1831,-32716,-1843,-32716,-1854,-32715,-1865,-32714,-1876,-32714,-1887,-32713,-1898,-32712,-1909,-32712,-1921,-32711,-1932,-32711,-1943,-32710,-1954,-32709,-1965,-32709,-1976,-32708,-1987,-32707,-1999,-32707,-2010,-32706,-2021,-32705,-2032,-32704,-2043,-32704,-2054,-32703,-2066,-32702,-2077,-32702,-2088,-32701,-2099,-32700,-2110,-32700,-2121,-32699,-2132,-32698,-2144,-32697,-2155,-32697,-2166,-32696,-2177,-32695,-2188,-32694,-2199,-32694,-2210,-32693,-2222,-32692,-2233,-32691,-2244,-32691,-2255,-32690,-2266,-32689,-2277,-32688,-2288,-32688,-2300,-32687,-2311,-32686,-2322,-32685,-2333,-32684,-2344,-32684,-2355,-32683,-2366,-32682,-2378,-32681,-2389,-32680,-2400,-32680,-2411,-32679,-2422,-32678,-2433,-32677,-2444,-32676,-2456,-32675,-2467,-32675,-2478,-32674,-2489,-32673,-2500,-32672,-2511,-32671,-2522,-32670,-2534,-32669,-2545,-32669,-2556,-32668,-2567,-32667,-2578,-32666,-2589,-32665,-2600,-32664,-2611,-32663,-2623,-32662,-2634,-32662,-2645,-32661,-2656,-32660,-2667,-32659,-2678,-32658,-2689,-32657,-2701,-32656,-2712,-32655,-2723,-32654,-2734,-32653,-2745,-32652,-2756,-32651,-2767,-32650,-2778,-32650,-2790,-32649,-2801,-32648,-2812,-32647,-2823,-32646,-2834,-32645,-2845,-32644,-2856,-32643,-2867,-32642,-2879,-32641,-2890,-32640,-2901,-32639,-2912,-32638,-2923,-32637,-2934,-32636,-2945,-32635,-2956,-32634,-2968,-32633,-2979,-32632,-2990,-32631,-3001,-32630,-3012,-32629,-3023,-32628,-3034,-32627,-3045,-32626,-3057,-32625,-3068,-32624,-3079,-32623,-3090,-32622,-3101,-32620,-3112,-32619,-3123,-32618,-3134,-32617,-3146,-32616,-3157,-32615,-3168,-32614,-3179,-32613,-3190,-32612,-3201,-32611,-3212,-32610,-3223,-32609,-3234,-32608,-3246,-32606,-3257,-32605,-3268,-32604,-3279,-32603,-3290,-32602,-3301,-32601,-3312,-32600,-3323,-32599,-3334,-32597,-3346,-32596,-3357,-32595,-3368,-32594,-3379,-32593,-3390,-32592,-3401,-32591,-3412,-32589,-3423,-32588,-3434,-32587,-3446,-32586,-3457,-32585,-3468,-32584,-3479,-32582,-3490,-32581,-3501,-32580,-3512,-32579,-3523,-32578,-3534,-32576,-3546,-32575,-3557,-32574,-3568,-32573,-3579,-32572,-3590,-32570,-3601,-32569,-3612,-32568,-3623,-32567,-3634,-32565,-3645,-32564,-3657,-32563,-3668,-32562,-3679,-32560,-3690,-32559,-3701,-32558,-3712,-32557,-3723,-32555,-3734,-32554,-3745,-32553,-3756,-32552,-3768,-32550,-3779,-32549,-3790,-32548,-3801,-32546,-3812,-32545,-3823,-32544,-3834,-32542,-3845,-32541,-3856,-32540,-3867,-32539,-3878,-32537,-3890,-32536,-3901,-32535,-3912,-32533,-3923,-32532,-3934,-32531,-3945,-32529,-3956,-32528,-3967,-32527,-3978,-32525,-3989,-32524,-4000,-32522,-4012,-32521,-4023,-32520,-4034,-32518,-4045,-32517,-4056,-32516,-4067,-32514,-4078,-32513,-4089,-32511,-4100,-32510,-4111,-32509,-4122,-32507,-4133,-32506,-4145,-32504,-4156,-32503,-4167,-32502,-4178,-32500,-4189,-32499,-4200,-32497,-4211,-32496,-4222,-32494,-4233,-32493,-4244,-32492,-4255,-32490,-4266,-32489,-4277,-32487,-4289,-32486,-4300,-32484,-4311,-32483,-4322,-32481,-4333,-32480,-4344,-32478,-4355,-32477,-4366,-32475,-4377,-32474,-4388,-32472,-4399,-32471,-4410,-32469,-4421,-32468,-4432,-32466,-4444,-32465,-4455,-32463,-4466,-32462,-4477,-32460,-4488,-32459,-4499,-32457,-4510,-32456,-4521,-32454,-4532,-32453,-4543,-32451,-4554,-32450,-4565,-32448,-4576,-32446,-4587,-32445,-4598,-32443,-4609,-32442,-4621,-32440,-4632,-32439,-4643,-32437,-4654,-32435,-4665,-32434,-4676,-32432,-4687,-32431,-4698,-32429,-4709,-32427,-4720,-32426,-4731,-32424,-4742,-32423,-4753,-32421,-4764,-32419,-4775,-32418,-4786,-32416,-4797,-32414,-4808,-32413,-4819,-32411,-4831,-32410,-4842,-32408,-4853,-32406,-4864,-32405,-4875,-32403,-4886,-32401,-4897,-32400,-4908,-32398,-4919,-32396,-4930,-32395,-4941,-32393,-4952,-32391,-4963,-32390,-4974,-32388,-4985,-32386,-4996,-32384,-5007,-32383,-5018,-32381,-5029,-32379,-5040,-32378,-5051,-32376,-5062,-32374,-5073,-32372,-5084,-32371,-5095,-32369,-5107,-32367,-5118,-32365,-5129,-32364,-5140,-32362,-5151,-32360,-5162,-32358,-5173,-32357,-5184,-32355,-5195,-32353,-5206,-32351,-5217,-32350,-5228,-32348,-5239,-32346,-5250,-32344,-5261,-32342,-5272,-32341,-5283,-32339,-5294,-32337,-5305,-32335,-5316,-32333,-5327,-32332,-5338,-32330,-5349,-32328,-5360,-32326,-5371,-32324,-5382,-32323,-5393,-32321,-5404,-32319,-5415,-32317,-5426,-32315,-5437,-32313,-5448,-32311,-5459,-32310,-5470,-32308,-5481,-32306,-5492,-32304,-5503,-32302,-5514,-32300,-5525,-32298,-5536,-32296,-5547,-32295,-5558,-32293,-5569,-32291,-5580,-32289,-5591,-32287,-5602,-32285,-5613,-32283,-5624,-32281,-5635,-32279,-5646,-32277,-5657,-32275,-5668,-32274,-5679,-32272,-5690,-32270,-5701,-32268,-5712,-32266,-5723,-32264,-5734,-32262,-5745,-32260,-5756,-32258,-5767,-32256,-5778,-32254,-5789,-32252,-5800,-32250,-5811,-32248,-5822,-32246,-5833,-32244,-5844,-32242,-5855,-32240,-5866,-32238,-5877,-32236,-5888,-32234,-5899,-32232,-5910,-32230,-5921,-32228,-5932,-32226,-5943,-32224,-5954,-32222,-5965,-32220,-5976,-32218,-5987,-32216,-5998,-32214,-6009,-32212,-6020,-32210,-6031,-32208,-6042,-32206,-6053,-32204,-6064,-32202,-6075,-32200,-6086,-32197,-6097,-32195,-6108,-32193,-6119,-32191,-6130,-32189,-6141,-32187,-6152,-32185,-6163,-32183,-6174,-32181,-6185,-32179,-6196,-32177,-6207,-32174,-6218,-32172,-6229,-32170,-6240,-32168,-6251,-32166,-6262,-32164,-6272,-32162,-6283,-32159,-6294,-32157,-6305,-32155,-6316,-32153,-6327,-32151,-6338,-32149,-6349,-32147,-6360,-32144,-6371,-32142,-6382,-32140,-6393,-32138,-6404,-32136,-6415,-32134,-6426,-32131,-6437,-32129,-6448,-32127,-6459,-32125,-6470,-32123,-6481,-32120,-6492,-32118,-6503,-32116,-6513,-32114,-6524,-32111,-6535,-32109,-6546,-32107,-6557,-32105,-6568,-32103,-6579,-32100,-6590,-32098,-6601,-32096,-6612,-32094,-6623,-32091,-6634,-32089,-6645,-32087,-6656,-32085,-6667,-32082,-6678,-32080,-6689,-32078,-6699,-32075,-6710,-32073,-6721,-32071,-6732,-32069,-6743,-32066,-6754,-32064,-6765,-32062,-6776,-32059,-6787,-32057,-6798,-32055,-6809,-32052,-6820,-32050,-6831,-32048,-6842,-32045,-6852,-32043,-6863,-32041,-6874,-32038,-6885,-32036,-6896,-32034,-6907,-32031,-6918,-32029,-6929,-32027,-6940,-32024,-6951,-32022,-6962,-32020,-6973,-32017,-6983,-32015,-6994,-32012,-7005,-32010,-7016,-32008,-7027,-32005,-7038,-32003,-7049,-32000,-7060,-31998,-7071,-31996,-7082,-31993,-7093,-31991,-7103,-31988,-7114,-31986,-7125,-31984,-7136,-31981,-7147,-31979,-7158,-31976,-7169,-31974,-7180,-31971,-7191,-31969,-7202,-31966,-7212,-31964,-7223,-31962,-7234,-31959,-7245,-31957,-7256,-31954,-7267,-31952,-7278,-31949,-7289,-31947,-7300,-31944,-7311,-31942,-7321,-31939,-7332,-31937,-7343,-31934,-7354,-31932,-7365,-31929,-7376,-31927,-7387,-31924,-7398,-31922,-7408,-31919,-7419,-31917,-7430,-31914,-7441,-31912,-7452,-31909,-7463,-31906,-7474,-31904,-7485,-31901,-7495,-31899,-7506,-31896,-7517,-31894,-7528,-31891,-7539,-31889,-7550,-31886,-7561,-31883,-7572,-31881,-7582,-31878,-7593,-31876,-7604,-31873,-7615,-31870,-7626,-31868,-7637,-31865,-7648,-31863,-7658,-31860,-7669,-31857,-7680,-31855,-7691,-31852,-7702,-31850,-7713,-31847,-7724,-31844,-7734,-31842,-7745,-31839,-7756,-31836,-7767,-31834,-7778,-31831,-7789,-31828,-7800,-31826,-7810,-31823,-7821,-31820,-7832,-31818,-7843,-31815,-7854,-31812,-7865,-31810,-7876,-31807,-7886,-31804,-7897,-31802,-7908,-31799,-7919,-31796,-7930,-31794,-7941,-31791,-7951,-31788,-7962,-31786,-7973,-31783,-7984,-31780,-7995,-31777,-8006,-31775,-8016,-31772,-8027,-31769,-8038,-31766,-8049,-31764,-8060,-31761,-8071,-31758,-8081,-31755,-8092,-31753,-8103,-31750,-8114,-31747,-8125,-31744,-8135,-31742,-8146,-31739,-8157,-31736,-8168,-31733,-8179,-31730,-8190,-31728,-8200,-31725,-8211,-31722,-8222,-31719,-8233,-31717,-8244,-31714,-8254,-31711,-8265,-31708,-8276,-31705,-8287,-31702,-8298,-31700,-8308,-31697,-8319,-31694,-8330,-31691,-8341,-31688,-8352,-31685,-8362,-31683,-8373,-31680,-8384,-31677,-8395,-31674,-8406,-31671,-8416,-31668,-8427,-31665,-8438,-31663,-8449,-31660,-8460,-31657,-8470,-31654,-8481,-31651,-8492,-31648,-8503,-31645,-8514,-31642,-8524,-31639,-8535,-31636,-8546,-31634,-8557,-31631,-8568,-31628,-8578,-31625,-8589,-31622,-8600,-31619,-8611,-31616,-8621,-31613,-8632,-31610,-8643,-31607,-8654,-31604,-8664,-31601,-8675,-31598,-8686,-31595,-8697,-31592,-8708,-31589,-8718,-31587,-8729,-31584,-8740,-31581,-8751,-31578,-8761,-31575,-8772,-31572,-8783,-31569,-8794,-31566,-8804,-31563,-8815,-31560,-8826,-31557,-8837,-31554,-8847,-31551,-8858,-31548,-8869,-31545,-8880,-31542,-8890,-31538,-8901,-31535,-8912,-31532,-8923,-31529,-8933,-31526,-8944,-31523,-8955,-31520,-8966,-31517,-8976,-31514,-8987,-31511,-8998,-31508,-9009,-31505,-9019,-31502,-9030,-31499,-9041,-31496,-9052,-31493,-9062,-31490,-9073,-31486,-9084,-31483,-9095,-31480,-9105,-31477,-9116,-31474,-9127,-31471,-9137,-31468,-9148,-31465,-9159,-31462,-9170,-31458,-9180,-31455,-9191,-31452,-9202,-31449,-9213,-31446,-9223,-31443,-9234,-31440,-9245,-31436,-9255,-31433,-9266,-31430,-9277,-31427,-9288,-31424,-9298,-31421,-9309,-31418,-9320,-31414,-9330,-31411,-9341,-31408,-9352,-31405,-9363,-31402,-9373,-31398,-9384,-31395,-9395,-31392,-9405,-31389,-9416,-31386,-9427,-31382,-9437,-31379,-9448,-31376,-9459,-31373,-9469,-31370,-9480,-31366,-9491,-31363,-9502,-31360,-9512,-31357,-9523,-31353,-9534,-31350,-9544,-31347,-9555,-31344,-9566,-31340,-9576,-31337,-9587,-31334,-9598,-31331,-9608,-31327,-9619,-31324,-9630,-31321,-9640,-31317,-9651,-31314,-9662,-31311,-9672,-31308,-9683,-31304,-9694,-31301,-9704,-31298,-9715,-31294,-9726,-31291,-9736,-31288,-9747,-31284,-9758,-31281,-9768,-31278,-9779,-31274,-9790,-31271,-9800,-31268,-9811,-31264,-9822,-31261,-9832,-31258,-9843,-31254,-9854,-31251,-9864,-31248,-9875,-31244,-9886,-31241,-9896,-31237,-9907,-31234,-9918,-31231,-9928,-31227,-9939,-31224,-9950,-31221,-9960,-31217,-9971,-31214,-9981,-31210,-9992,-31207,-10003,-31204,-10013,-31200,-10024,-31197,-10035,-31193,-10045,-31190,-10056,-31186,-10067,-31183,-10077,-31180,-10088,-31176,-10098,-31173,-10109,-31169,-10120,-31166,-10130,-31162,-10141,-31159,-10152,-31155,-10162,-31152,-10173,-31149,-10183,-31145,-10194,-31142,-10205,-31138,-10215,-31135,-10226,-31131,-10236,-31128,-10247,-31124,-10258,-31121,-10268,-31117,-10279,-31114,-10290,-31110,-10300,-31107,-10311,-31103,-10321,-31100,-10332,-31096,-10343,-31093,-10353,-31089,-10364,-31086,-10374,-31082,-10385,-31078,-10396,-31075,-10406,-31071,-10417,-31068,-10427,-31064,-10438,-31061,-10448,-31057,-10459,-31054,-10470,-31050,-10480,-31046,-10491,-31043,-10501,-31039,-10512,-31036,-10523,-31032,-10533,-31029,-10544,-31025,-10554,-31021,-10565,-31018,-10575,-31014,-10586,-31011,-10597,-31007,-10607,-31003,-10618,-31000,-10628,-30996,-10639,-30992,-10649,-30989,-10660,-30985,-10671,-30982,-10681,-30978,-10692,-30974,-10702,-30971,-10713,-30967,-10723,-30963,-10734,-30960,-10744,-30956,-10755,-30952,-10766,-30949,-10776,-30945,-10787,-30941,-10797,-30938,-10808,-30934,-10818,-30930,-10829,-30927,-10839,-30923,-10850,-30919,-10860,-30916,-10871,-30912,-10881,-30908,-10892,-30904,-10903,-30901,-10913,-30897,-10924,-30893,-10934,-30890,-10945,-30886,-10955,-30882,-10966,-30878,-10976,-30875,-10987,-30871,-10997,-30867,-11008,-30863,-11018,-30860,-11029,-30856,-11039,-30852,-11050,-30848,-11060,-30845,-11071,-30841,-11081,-30837,-11092,-30833,-11102,-30829,-11113,-30826,-11123,-30822,-11134,-30818,-11144,-30814,-11155,-30810,-11165,-30807,-11176,-30803,-11186,-30799,-11197,-30795,-11207,-30791,-11218,-30788,-11228,-30784,-11239,-30780,-11249,-30776,-11260,-30772,-11270,-30768,-11281,-30765,-11291,-30761,-11302,-30757,-11312,-30753,-11323,-30749,-11333,-30745,-11344,-30741,-11354,-30738,-11365,-30734,-11375,-30730,-11386,-30726,-11396,-30722,-11407,-30718,-11417,-30714,-11428,-30710,-11438,-30706,-11449,-30703,-11459,-30699,-11469,-30695,-11480,-30691,-11490,-30687,-11501,-30683,-11511,-30679,-11522,-30675,-11532,-30671,-11543,-30667,-11553,-30663,-11564,-30659,-11574,-30656,-11584,-30652,-11595,-30648,-11605,-30644,-11616,-30640,-11626,-30636,-11637,-30632,-11647,-30628,-11658,-30624,-11668,-30620,-11678,-30616,-11689,-30612,-11699,-30608,-11710,-30604,-11720,-30600,-11731,-30596,-11741,-30592,-11751,-30588,-11762,-30584,-11772,-30580,-11783,-30576,-11793,-30572,-11804,-30568,-11814,-30564,-11824,-30560,-11835,-30556,-11845,-30552,-11856,-30548,-11866,-30544,-11877,-30540,-11887,-30536,-11897,-30531,-11908,-30527,-11918,-30523,-11929,-30519,-11939,-30515,-11949,-30511,-11960,-30507,-11970,-30503,-11981,-30499,-11991,-30495,-12001,-30491,-12012,-30487,-12022,-30483,-12033,-30478,-12043,-30474,-12053,-30470,-12064,-30466,-12074,-30462,-12084,-30458,-12095,-30454,-12105,-30450,-12116,-30446,-12126,-30441,-12136,-30437,-12147,-30433,-12157,-30429,-12167,-30425,-12178,-30421,-12188,-30417,-12199,-30412,-12209,-30408,-12219,-30404,-12230,-30400,-12240,-30396,-12250,-30392,-12261,-30387,-12271,-30383,-12281,-30379,-12292,-30375,-12302,-30371,-12313,-30366,-12323,-30362,-12333,-30358,-12344,-30354,-12354,-30350,-12364,-30345,-12375,-30341,-12385,-30337,-12395,-30333,-12406,-30329,-12416,-30324,-12426,-30320,-12437,-30316,-12447,-30312,-12457,-30307,-12468,-30303,-12478,-30299,-12488,-30295,-12499,-30290,-12509,-30286,-12519,-30282,-12530,-30278,-12540,-30273,-12550,-30269,-12561,-30265,-12571,-30260,-12581,-30256,-12591,-30252,-12602,-30248,-12612,-30243,-12622,-30239,-12633,-30235,-12643,-30230,-12653,-30226,-12664,-30222,-12674,-30217,-12684,-30213,-12695,-30209,-12705,-30204,-12715,-30200,-12725,-30196,-12736,-30191,-12746,-30187,-12756,-30183,-12767,-30178,-12777,-30174,-12787,-30170,-12797,-30165,-12808,-30161,-12818,-30157,-12828,-30152,-12839,-30148,-12849,-30143,-12859,-30139,-12869,-30135,-12880,-30130,-12890,-30126,-12900,-30122,-12910,-30117,-12921,-30113,-12931,-30108,-12941,-30104,-12951,-30099,-12962,-30095,-12972,-30091,-12982,-30086,-12993,-30082,-13003,-30077,-13013,-30073,-13023,-30068,-13034,-30064,-13044,-30060,-13054,-30055,-13064,-30051,-13075,-30046,-13085,-30042,-13095,-30037,-13105,-30033,-13115,-30028,-13126,-30024,-13136,-30019,-13146,-30015,-13156,-30010,-13167,-30006,-13177,-30002,-13187,-29997,-13197,-29993,-13208,-29988,-13218,-29984,-13228,-29979,-13238,-29974,-13248,-29970,-13259,-29965,-13269,-29961,-13279,-29956,-13289,-29952,-13299,-29947,-13310,-29943,-13320,-29938,-13330,-29934,-13340,-29929,-13350,-29925,-13361,-29920,-13371,-29916,-13381,-29911,-13391,-29906,-13401,-29902,-13412,-29897,-13422,-29893,-13432,-29888,-13442,-29884,-13452,-29879,-13463,-29874,-13473,-29870,-13483,-29865,-13493,-29861,-13503,-29856,-13513,-29851,-13524,-29847,-13534,-29842,-13544,-29838,-13554,-29833,-13564,-29828,-13575,-29824,-13585,-29819,-13595,-29814,-13605,-29810,-13615,-29805,-13625,-29801,-13635,-29796,-13646,-29791,-13656,-29787,-13666,-29782,-13676,-29777,-13686,-29773,-13696,-29768,-13707,-29763,-13717,-29759,-13727,-29754,-13737,-29749,-13747,-29745,-13757,-29740,-13767,-29735,-13778,-29730,-13788,-29726,-13798,-29721,-13808,-29716,-13818,-29712,-13828,-29707,-13838,-29702,-13848,-29697,-13859,-29693,-13869,-29688,-13879,-29683,-13889,-29679,-13899,-29674,-13909,-29669,-13919,-29664,-13929,-29660,-13939,-29655,-13950,-29650,-13960,-29645,-13970,-29641,-13980,-29636,-13990,-29631,-14000,-29626,-14010,-29622,-14020,-29617,-14030,-29612,-14040,-29607,-14051,-29602,-14061,-29598,-14071,-29593,-14081,-29588,-14091,-29583,-14101,-29578,-14111,-29574,-14121,-29569,-14131,-29564,-14141,-29559,-14151,-29554,-14161,-29549,-14172,-29545,-14182,-29540,-14192,-29535,-14202,-29530,-14212,-29525,-14222,-29520,-14232,-29516,-14242,-29511,-14252,-29506,-14262,-29501,-14272,-29496,-14282,-29491,-14292,-29486,-14302,-29482,-14312,-29477,-14322,-29472,-14332,-29467,-14343,-29462,-14353,-29457,-14363,-29452,-14373,-29447,-14383,-29442,-14393,-29438,-14403,-29433,-14413,-29428,-14423,-29423,-14433,-29418,-14443,-29413,-14453,-29408,-14463,-29403,-14473,-29398,-14483,-29393,-14493,-29388,-14503,-29383,-14513,-29378,-14523,-29373,-14533,-29369,-14543,-29364,-14553,-29359,-14563,-29354,-14573,-29349,-14583,-29344,-14593,-29339,-14603,-29334,-14613,-29329,-14623,-29324,-14633,-29319,-14643,-29314,-14653,-29309,-14663,-29304,-14673,-29299,-14683,-29294,-14693,-29289,-14703,-29284,-14713,-29279,-14723,-29274,-14733,-29269,-14743,-29264,-14753,-29259,-14763,-29254,-14773,-29249,-14783,-29244,-14793,-29239,-14803,-29234,-14813,-29228,-14823,-29223,-14833,-29218,-14843,-29213,-14853,-29208,-14862,-29203,-14872,-29198,-14882,-29193,-14892,-29188,-14902,-29183,-14912,-29178,-14922,-29173,-14932,-29168,-14942,-29163,-14952,-29157,-14962,-29152,-14972,-29147,-14982,-29142,-14992,-29137,-15002,-29132,-15012,-29127,-15022,-29122,-15031,-29117,-15041,-29111,-15051,-29106,-15061,-29101,-15071,-29096,-15081,-29091,-15091,-29086,-15101,-29081,-15111,-29075,-15121,-29070,-15131,-29065,-15141,-29060,-15150,-29055,-15160,-29050,-15170,-29045,-15180,-29039,-15190,-29034,-15200,-29029,-15210,-29024,-15220,-29019,-15230,-29013,-15239,-29008,-15249,-29003,-15259,-28998,-15269,-28993,-15279,-28987,-15289,-28982,-15299,-28977,-15309,-28972,-15319,-28967,-15328,-28961,-15338,-28956,-15348,-28951,-15358,-28946,-15368,-28940,-15378,-28935,-15388,-28930,-15397,-28925,-15407,-28919,-15417,-28914,-15427,-28909,-15437,-28904,-15447,-28898,-15457,-28893,-15466,-28888,-15476,-28883,-15486,-28877,-15496,-28872,-15506,-28867,-15516,-28861,-15526,-28856,-15535,-28851,-15545,-28846,-15555,-28840,-15565,-28835,-15575,-28830,-15584,-28824,-15594,-28819,-15604,-28814,-15614,-28808,-15624,-28803,-15634,-28798,-15643,-28792,-15653,-28787,-15663,-28782,-15673,-28776,-15683,-28771,-15692,-28766,-15702,-28760,-15712,-28755,-15722,-28750,-15732,-28744,-15741,-28739,-15751,-28734,-15761,-28728,-15771,-28723,-15781,-28717,-15790,-28712,-15800,-28707,-15810,-28701,-15820,-28696,-15830,-28691,-15839,-28685,-15849,-28680,-15859,-28674,-15869,-28669,-15878,-28663,-15888,-28658,-15898,-28653,-15908,-28647,-15918,-28642,-15927,-28636,-15937,-28631,-15947,-28626,-15957,-28620,-15966,-28615,-15976,-28609,-15986,-28604,-15996,-28598,-16005,-28593,-16015,-28587,-16025,-28582,-16035,-28576,-16044,-28571,-16054,-28566,-16064,-28560,-16073,-28555,-16083,-28549,-16093,-28544,-16103,-28538,-16112,-28533,-16122,-28527,-16132,-28522,-16142,-28516,-16151,-28511,-16161,-28505,-16171,-28500,-16180,-28494,-16190,-28489,-16200,-28483,-16210,-28478,-16219,-28472,-16229,-28466,-16239,-28461,-16248,-28455,-16258,-28450,-16268,-28444,-16277,-28439,-16287,-28433,-16297,-28428,-16307,-28422,-16316,-28417,-16326,-28411,-16336,-28405,-16345,-28400,-16355,-28394,-16365,-28389,-16374,-28383}; - -int16_t twb18432[12288] = { 32767,0,32766,-23,32766,-45,32766,-68,32766,-90,32766,-112,32766,-135,32766,-157,32766,-179,32766,-202,32766,-224,32766,-246,32765,-269,32765,-291,32765,-313,32765,-336,32765,-358,32764,-380,32764,-403,32764,-425,32763,-447,32763,-470,32763,-492,32762,-514,32762,-537,32762,-559,32761,-581,32761,-604,32761,-626,32760,-648,32760,-671,32759,-693,32759,-715,32758,-738,32758,-760,32757,-782,32757,-805,32756,-827,32756,-849,32755,-872,32754,-894,32754,-916,32753,-939,32752,-961,32752,-983,32751,-1006,32750,-1028,32750,-1050,32749,-1073,32748,-1095,32747,-1117,32747,-1140,32746,-1162,32745,-1184,32744,-1207,32743,-1229,32743,-1251,32742,-1274,32741,-1296,32740,-1318,32739,-1340,32738,-1363,32737,-1385,32736,-1407,32735,-1430,32734,-1452,32733,-1474,32732,-1497,32731,-1519,32730,-1541,32729,-1564,32728,-1586,32727,-1608,32726,-1631,32725,-1653,32724,-1675,32723,-1698,32721,-1720,32720,-1742,32719,-1764,32718,-1787,32717,-1809,32715,-1831,32714,-1854,32713,-1876,32711,-1898,32710,-1921,32709,-1943,32708,-1965,32706,-1987,32705,-2010,32703,-2032,32702,-2054,32701,-2077,32699,-2099,32698,-2121,32696,-2144,32695,-2166,32693,-2188,32692,-2210,32690,-2233,32689,-2255,32687,-2277,32686,-2300,32684,-2322,32683,-2344,32681,-2366,32679,-2389,32678,-2411,32676,-2433,32674,-2456,32673,-2478,32671,-2500,32669,-2522,32668,-2545,32666,-2567,32664,-2589,32662,-2611,32661,-2634,32659,-2656,32657,-2678,32655,-2701,32653,-2723,32651,-2745,32649,-2767,32648,-2790,32646,-2812,32644,-2834,32642,-2856,32640,-2879,32638,-2901,32636,-2923,32634,-2945,32632,-2968,32630,-2990,32628,-3012,32626,-3034,32624,-3057,32622,-3079,32619,-3101,32617,-3123,32615,-3146,32613,-3168,32611,-3190,32609,-3212,32607,-3234,32604,-3257,32602,-3279,32600,-3301,32598,-3323,32595,-3346,32593,-3368,32591,-3390,32588,-3412,32586,-3434,32584,-3457,32581,-3479,32579,-3501,32577,-3523,32574,-3546,32572,-3568,32569,-3590,32567,-3612,32564,-3634,32562,-3657,32559,-3679,32557,-3701,32554,-3723,32552,-3745,32549,-3768,32547,-3790,32544,-3812,32541,-3834,32539,-3856,32536,-3878,32534,-3901,32531,-3923,32528,-3945,32526,-3967,32523,-3989,32520,-4012,32517,-4034,32515,-4056,32512,-4078,32509,-4100,32506,-4122,32503,-4145,32501,-4167,32498,-4189,32495,-4211,32492,-4233,32489,-4255,32486,-4277,32483,-4300,32480,-4322,32477,-4344,32474,-4366,32471,-4388,32468,-4410,32465,-4432,32462,-4455,32459,-4477,32456,-4499,32453,-4521,32450,-4543,32447,-4565,32444,-4587,32441,-4609,32438,-4632,32434,-4654,32431,-4676,32428,-4698,32425,-4720,32422,-4742,32418,-4764,32415,-4786,32412,-4808,32409,-4831,32405,-4853,32402,-4875,32399,-4897,32395,-4919,32392,-4941,32389,-4963,32385,-4985,32382,-5007,32378,-5029,32375,-5051,32371,-5073,32368,-5095,32364,-5118,32361,-5140,32357,-5162,32354,-5184,32350,-5206,32347,-5228,32343,-5250,32340,-5272,32336,-5294,32332,-5316,32329,-5338,32325,-5360,32322,-5382,32318,-5404,32314,-5426,32310,-5448,32307,-5470,32303,-5492,32299,-5514,32295,-5536,32292,-5558,32288,-5580,32284,-5602,32280,-5624,32276,-5646,32273,-5668,32269,-5690,32265,-5712,32261,-5734,32257,-5756,32253,-5778,32249,-5800,32245,-5822,32241,-5844,32237,-5866,32233,-5888,32229,-5910,32225,-5932,32221,-5954,32217,-5976,32213,-5998,32209,-6020,32205,-6042,32201,-6064,32196,-6086,32192,-6108,32188,-6130,32184,-6152,32180,-6174,32176,-6196,32171,-6218,32167,-6240,32163,-6262,32158,-6283,32154,-6305,32150,-6327,32146,-6349,32141,-6371,32137,-6393,32133,-6415,32128,-6437,32124,-6459,32119,-6481,32115,-6503,32110,-6524,32106,-6546,32102,-6568,32097,-6590,32093,-6612,32088,-6634,32084,-6656,32079,-6678,32074,-6699,32070,-6721,32065,-6743,32061,-6765,32056,-6787,32051,-6809,32047,-6831,32042,-6852,32037,-6874,32033,-6896,32028,-6918,32023,-6940,32019,-6962,32014,-6983,32009,-7005,32004,-7027,31999,-7049,31995,-7071,31990,-7093,31985,-7114,31980,-7136,31975,-7158,31970,-7180,31965,-7202,31961,-7223,31956,-7245,31951,-7267,31946,-7289,31941,-7311,31936,-7332,31931,-7354,31926,-7376,31921,-7398,31916,-7419,31911,-7441,31905,-7463,31900,-7485,31895,-7506,31890,-7528,31885,-7550,31880,-7572,31875,-7593,31869,-7615,31864,-7637,31859,-7658,31854,-7680,31849,-7702,31843,-7724,31838,-7745,31833,-7767,31827,-7789,31822,-7810,31817,-7832,31811,-7854,31806,-7876,31801,-7897,31795,-7919,31790,-7941,31785,-7962,31779,-7984,31774,-8006,31768,-8027,31763,-8049,31757,-8071,31752,-8092,31746,-8114,31741,-8135,31735,-8157,31729,-8179,31724,-8200,31718,-8222,31713,-8244,31707,-8265,31701,-8287,31696,-8308,31690,-8330,31684,-8352,31679,-8373,31673,-8395,31667,-8416,31662,-8438,31656,-8460,31650,-8481,31644,-8503,31638,-8524,31633,-8546,31627,-8568,31621,-8589,31615,-8611,31609,-8632,31603,-8654,31597,-8675,31591,-8697,31586,-8718,31580,-8740,31574,-8761,31568,-8783,31562,-8804,31556,-8826,31550,-8847,31544,-8869,31537,-8890,31531,-8912,31525,-8933,31519,-8955,31513,-8976,31507,-8998,31501,-9019,31495,-9041,31489,-9062,31482,-9084,31476,-9105,31470,-9127,31464,-9148,31457,-9170,31451,-9191,31445,-9213,31439,-9234,31432,-9255,31426,-9277,31420,-9298,31413,-9320,31407,-9341,31401,-9363,31394,-9384,31388,-9405,31381,-9427,31375,-9448,31369,-9469,31362,-9491,31356,-9512,31349,-9534,31343,-9555,31336,-9576,31330,-9598,31323,-9619,31316,-9640,31310,-9662,31303,-9683,31297,-9704,31290,-9726,31283,-9747,31277,-9768,31270,-9790,31263,-9811,31257,-9832,31250,-9854,31243,-9875,31236,-9896,31230,-9918,31223,-9939,31216,-9960,31209,-9981,31203,-10003,31196,-10024,31189,-10045,31182,-10067,31175,-10088,31168,-10109,31161,-10130,31154,-10152,31148,-10173,31141,-10194,31134,-10215,31127,-10236,31120,-10258,31113,-10279,31106,-10300,31099,-10321,31092,-10343,31085,-10364,31077,-10385,31070,-10406,31063,-10427,31056,-10448,31049,-10470,31042,-10491,31035,-10512,31028,-10533,31020,-10554,31013,-10575,31006,-10597,30999,-10618,30991,-10639,30984,-10660,30977,-10681,30970,-10702,30962,-10723,30955,-10744,30948,-10766,30940,-10787,30933,-10808,30926,-10829,30918,-10850,30911,-10871,30903,-10892,30896,-10913,30889,-10934,30881,-10955,30874,-10976,30866,-10997,30859,-11018,30851,-11039,30844,-11060,30836,-11081,30828,-11102,30821,-11123,30813,-11144,30806,-11165,30798,-11186,30790,-11207,30783,-11228,30775,-11249,30767,-11270,30760,-11291,30752,-11312,30744,-11333,30737,-11354,30729,-11375,30721,-11396,30713,-11417,30705,-11438,30698,-11459,30690,-11480,30682,-11501,30674,-11522,30666,-11543,30658,-11564,30651,-11584,30643,-11605,30635,-11626,30627,-11647,30619,-11668,30611,-11689,30603,-11710,30595,-11731,30587,-11751,30579,-11772,30571,-11793,30563,-11814,30555,-11835,30547,-11856,30539,-11877,30530,-11897,30522,-11918,30514,-11939,30506,-11960,30498,-11981,30490,-12001,30482,-12022,30473,-12043,30465,-12064,30457,-12084,30449,-12105,30440,-12126,30432,-12147,30424,-12167,30416,-12188,30407,-12209,30399,-12230,30391,-12250,30382,-12271,30374,-12292,30365,-12313,30357,-12333,30349,-12354,30340,-12375,30332,-12395,30323,-12416,30315,-12437,30306,-12457,30298,-12478,30289,-12499,30281,-12519,30272,-12540,30264,-12561,30255,-12581,30247,-12602,30238,-12622,30229,-12643,30221,-12664,30212,-12684,30203,-12705,30195,-12725,30186,-12746,30177,-12767,30169,-12787,30160,-12808,30151,-12828,30142,-12849,30134,-12869,30125,-12890,30116,-12910,30107,-12931,30098,-12951,30090,-12972,30081,-12993,30072,-13013,30063,-13034,30054,-13054,30045,-13075,30036,-13095,30027,-13115,30018,-13136,30009,-13156,30001,-13177,29992,-13197,29983,-13218,29973,-13238,29964,-13259,29955,-13279,29946,-13299,29937,-13320,29928,-13340,29919,-13361,29910,-13381,29901,-13401,29892,-13422,29883,-13442,29873,-13463,29864,-13483,29855,-13503,29846,-13524,29837,-13544,29827,-13564,29818,-13585,29809,-13605,29800,-13625,29790,-13646,29781,-13666,29772,-13686,29762,-13707,29753,-13727,29744,-13747,29734,-13767,29725,-13788,29715,-13808,29706,-13828,29696,-13848,29687,-13869,29678,-13889,29668,-13909,29659,-13929,29649,-13950,29640,-13970,29630,-13990,29621,-14010,29611,-14030,29601,-14051,29592,-14071,29582,-14091,29573,-14111,29563,-14131,29553,-14151,29544,-14172,29534,-14192,29524,-14212,29515,-14232,29505,-14252,29495,-14272,29485,-14292,29476,-14312,29466,-14332,29456,-14353,29446,-14373,29437,-14393,29427,-14413,29417,-14433,29407,-14453,29397,-14473,29387,-14493,29377,-14513,29368,-14533,29358,-14553,29348,-14573,29338,-14593,29328,-14613,29318,-14633,29308,-14653,29298,-14673,29288,-14693,29278,-14713,29268,-14733,29258,-14753,29248,-14773,29238,-14793,29227,-14813,29217,-14833,29207,-14853,29197,-14872,29187,-14892,29177,-14912,29167,-14932,29156,-14952,29146,-14972,29136,-14992,29126,-15012,29116,-15031,29105,-15051,29095,-15071,29085,-15091,29074,-15111,29064,-15131,29054,-15150,29044,-15170,29033,-15190,29023,-15210,29012,-15230,29002,-15249,28992,-15269,28981,-15289,28971,-15309,28960,-15328,28950,-15348,28939,-15368,28929,-15388,28918,-15407,28908,-15427,28897,-15447,28887,-15466,28876,-15486,28866,-15506,28855,-15526,28845,-15545,28834,-15565,28823,-15584,28813,-15604,28802,-15624,28791,-15643,28781,-15663,28770,-15683,28759,-15702,28749,-15722,28738,-15741,28727,-15761,28716,-15781,28706,-15800,28695,-15820,28684,-15839,28673,-15859,28662,-15878,28652,-15898,28641,-15918,28630,-15937,28619,-15957,28608,-15976,28597,-15996,28586,-16015,28575,-16035,28565,-16054,28554,-16073,28543,-16093,28532,-16112,28521,-16132,28510,-16151,28499,-16171,28488,-16190,28477,-16210,28465,-16229,28454,-16248,28443,-16268,28432,-16287,28421,-16307,28410,-16326,28399,-16345,28388,-16365,28377,-16384,28365,-16403,28354,-16423,28343,-16442,28332,-16461,28321,-16481,28309,-16500,28298,-16519,28287,-16539,28275,-16558,28264,-16577,28253,-16596,28242,-16616,28230,-16635,28219,-16654,28208,-16673,28196,-16693,28185,-16712,28173,-16731,28162,-16750,28151,-16769,28139,-16789,28128,-16808,28116,-16827,28105,-16846,28093,-16865,28082,-16884,28070,-16904,28059,-16923,28047,-16942,28036,-16961,28024,-16980,28012,-16999,28001,-17018,27989,-17037,27978,-17056,27966,-17075,27954,-17095,27943,-17114,27931,-17133,27919,-17152,27908,-17171,27896,-17190,27884,-17209,27872,-17228,27861,-17247,27849,-17266,27837,-17285,27825,-17304,27814,-17323,27802,-17342,27790,-17361,27778,-17380,27766,-17398,27754,-17417,27742,-17436,27731,-17455,27719,-17474,27707,-17493,27695,-17512,27683,-17531,27671,-17550,27659,-17568,27647,-17587,27635,-17606,27623,-17625,27611,-17644,27599,-17663,27587,-17681,27575,-17700,27563,-17719,27551,-17738,27538,-17757,27526,-17775,27514,-17794,27502,-17813,27490,-17832,27478,-17850,27466,-17869,27453,-17888,27441,-17907,27429,-17925,27417,-17944,27405,-17963,27392,-17981,27380,-18000,27368,-18019,27355,-18037,27343,-18056,27331,-18075,27319,-18093,27306,-18112,27294,-18131,27281,-18149,27269,-18168,27257,-18186,27244,-18205,27232,-18223,27219,-18242,27207,-18261,27195,-18279,27182,-18298,27170,-18316,27157,-18335,27145,-18353,27132,-18372,27120,-18390,27107,-18409,27094,-18427,27082,-18446,27069,-18464,27057,-18483,27044,-18501,27031,-18519,27019,-18538,27006,-18556,26994,-18575,26981,-18593,26968,-18611,26955,-18630,26943,-18648,26930,-18667,26917,-18685,26905,-18703,26892,-18722,26879,-18740,26866,-18758,26853,-18777,26841,-18795,26828,-18813,26815,-18831,26802,-18850,26789,-18868,26776,-18886,26764,-18905,26751,-18923,26738,-18941,26725,-18959,26712,-18977,26699,-18996,26686,-19014,26673,-19032,26660,-19050,26647,-19068,26634,-19087,26621,-19105,26608,-19123,26595,-19141,26582,-19159,26569,-19177,26556,-19195,26543,-19213,26530,-19232,26516,-19250,26503,-19268,26490,-19286,26477,-19304,26464,-19322,26451,-19340,26437,-19358,26424,-19376,26411,-19394,26398,-19412,26385,-19430,26371,-19448,26358,-19466,26345,-19484,26332,-19502,26318,-19520,26305,-19538,26292,-19556,26278,-19574,26265,-19591,26252,-19609,26238,-19627,26225,-19645,26211,-19663,26198,-19681,26185,-19699,26171,-19717,26158,-19734,26144,-19752,26131,-19770,26117,-19788,26104,-19806,26090,-19823,26077,-19841,26063,-19859,26050,-19877,26036,-19895,26022,-19912,26009,-19930,25995,-19948,25982,-19966,25968,-19983,25954,-20001,25941,-20019,25927,-20036,25913,-20054,25900,-20072,25886,-20089,25872,-20107,25859,-20125,25845,-20142,25831,-20160,25817,-20177,25804,-20195,25790,-20213,25776,-20230,25762,-20248,25749,-20265,25735,-20283,25721,-20300,25707,-20318,25693,-20335,25679,-20353,25665,-20370,25652,-20388,25638,-20405,25624,-20423,25610,-20440,25596,-20458,25582,-20475,25568,-20493,25554,-20510,25540,-20528,25526,-20545,25512,-20562,25498,-20580,25484,-20597,25470,-20614,25456,-20632,25442,-20649,25428,-20667,25414,-20684,25399,-20701,25385,-20719,25371,-20736,25357,-20753,25343,-20770,25329,-20788,25315,-20805,25300,-20822,25286,-20839,25272,-20857,25258,-20874,25243,-20891,25229,-20908,25215,-20926,25201,-20943,25186,-20960,25172,-20977,25158,-20994,25144,-21011,25129,-21028,25115,-21046,25100,-21063,25086,-21080,25072,-21097,25057,-21114,25043,-21131,25029,-21148,25014,-21165,25000,-21182,24985,-21199,24971,-21216,24956,-21233,24942,-21250,24927,-21267,24913,-21284,24898,-21301,24884,-21318,24869,-21335,24855,-21352,24840,-21369,24826,-21386,24811,-21403,24796,-21420,24782,-21437,24767,-21454,24753,-21471,24738,-21487,24723,-21504,24709,-21521,24694,-21538,24679,-21555,24664,-21572,24650,-21588,24635,-21605,24620,-21622,24606,-21639,24591,-21656,24576,-21672,24561,-21689,24546,-21706,24532,-21723,24517,-21739,24502,-21756,24487,-21773,24472,-21789,24457,-21806,24443,-21823,24428,-21839,24413,-21856,24398,-21873,24383,-21889,24368,-21906,24353,-21923,24338,-21939,24323,-21956,24308,-21972,24293,-21989,24278,-22005,24263,-22022,24248,-22039,24233,-22055,24218,-22072,24203,-22088,24188,-22105,24173,-22121,24158,-22138,24143,-22154,24128,-22170,24113,-22187,24097,-22203,24082,-22220,24067,-22236,24052,-22253,24037,-22269,24022,-22285,24006,-22302,23991,-22318,23976,-22334,23961,-22351,23945,-22367,23930,-22383,23915,-22400,23900,-22416,23884,-22432,23869,-22449,23854,-22465,23838,-22481,23823,-22497,23808,-22514,23792,-22530,23777,-22546,23762,-22562,23746,-22578,23731,-22595,23715,-22611,23700,-22627,23685,-22643,23669,-22659,23654,-22675,23638,-22692,23623,-22708,23607,-22724,23592,-22740,23576,-22756,23561,-22772,23545,-22788,23530,-22804,23514,-22820,23499,-22836,23483,-22852,23467,-22868,23452,-22884,23436,-22900,23421,-22916,23405,-22932,23389,-22948,23374,-22964,23358,-22980,23342,-22996,23327,-23012,23311,-23028,23295,-23044,23280,-23059,23264,-23075,23248,-23091,23232,-23107,23217,-23123,23201,-23139,23185,-23154,23169,-23170,23153,-23186,23138,-23202,23122,-23218,23106,-23233,23090,-23249,23074,-23265,23058,-23281,23043,-23296,23027,-23312,23011,-23328,22995,-23343,22979,-23359,22963,-23375,22947,-23390,22931,-23406,22915,-23422,22899,-23437,22883,-23453,22867,-23468,22851,-23484,22835,-23500,22819,-23515,22803,-23531,22787,-23546,22771,-23562,22755,-23577,22739,-23593,22723,-23608,22707,-23624,22691,-23639,22674,-23655,22658,-23670,22642,-23686,22626,-23701,22610,-23716,22594,-23732,22577,-23747,22561,-23763,22545,-23778,22529,-23793,22513,-23809,22496,-23824,22480,-23839,22464,-23855,22448,-23870,22431,-23885,22415,-23901,22399,-23916,22382,-23931,22366,-23946,22350,-23962,22333,-23977,22317,-23992,22301,-24007,22284,-24023,22268,-24038,22252,-24053,22235,-24068,22219,-24083,22202,-24098,22186,-24114,22169,-24129,22153,-24144,22137,-24159,22120,-24174,22104,-24189,22087,-24204,22071,-24219,22054,-24234,22038,-24249,22021,-24264,22004,-24279,21988,-24294,21971,-24309,21955,-24324,21938,-24339,21922,-24354,21905,-24369,21888,-24384,21872,-24399,21855,-24414,21838,-24429,21822,-24444,21805,-24458,21788,-24473,21772,-24488,21755,-24503,21738,-24518,21722,-24533,21705,-24547,21688,-24562,21671,-24577,21655,-24592,21638,-24607,21621,-24621,21604,-24636,21587,-24651,21571,-24665,21554,-24680,21537,-24695,21520,-24710,21503,-24724,21486,-24739,21470,-24754,21453,-24768,21436,-24783,21419,-24797,21402,-24812,21385,-24827,21368,-24841,21351,-24856,21334,-24870,21317,-24885,21300,-24899,21283,-24914,21266,-24928,21249,-24943,21232,-24957,21215,-24972,21198,-24986,21181,-25001,21164,-25015,21147,-25030,21130,-25044,21113,-25058,21096,-25073,21079,-25087,21062,-25101,21045,-25116,21027,-25130,21010,-25145,20993,-25159,20976,-25173,20959,-25187,20942,-25202,20925,-25216,20907,-25230,20890,-25244,20873,-25259,20856,-25273,20838,-25287,20821,-25301,20804,-25316,20787,-25330,20769,-25344,20752,-25358,20735,-25372,20718,-25386,20700,-25400,20683,-25415,20666,-25429,20648,-25443,20631,-25457,20613,-25471,20596,-25485,20579,-25499,20561,-25513,20544,-25527,20527,-25541,20509,-25555,20492,-25569,20474,-25583,20457,-25597,20439,-25611,20422,-25625,20404,-25639,20387,-25653,20369,-25666,20352,-25680,20334,-25694,20317,-25708,20299,-25722,20282,-25736,20264,-25750,20247,-25763,20229,-25777,20212,-25791,20194,-25805,20176,-25818,20159,-25832,20141,-25846,20124,-25860,20106,-25873,20088,-25887,20071,-25901,20053,-25914,20035,-25928,20018,-25942,20000,-25955,19982,-25969,19965,-25983,19947,-25996,19929,-26010,19911,-26023,19894,-26037,19876,-26051,19858,-26064,19840,-26078,19822,-26091,19805,-26105,19787,-26118,19769,-26132,19751,-26145,19733,-26159,19716,-26172,19698,-26186,19680,-26199,19662,-26212,19644,-26226,19626,-26239,19608,-26253,19590,-26266,19573,-26279,19555,-26293,19537,-26306,19519,-26319,19501,-26333,19483,-26346,19465,-26359,19447,-26372,19429,-26386,19411,-26399,19393,-26412,19375,-26425,19357,-26438,19339,-26452,19321,-26465,19303,-26478,19285,-26491,19267,-26504,19249,-26517,19231,-26531,19212,-26544,19194,-26557,19176,-26570,19158,-26583,19140,-26596,19122,-26609,19104,-26622,19086,-26635,19067,-26648,19049,-26661,19031,-26674,19013,-26687,18995,-26700,18976,-26713,18958,-26726,18940,-26739,18922,-26752,18904,-26765,18885,-26777,18867,-26790,18849,-26803,18830,-26816,18812,-26829,18794,-26842,18776,-26854,18757,-26867,18739,-26880,18721,-26893,18702,-26906,18684,-26918,18666,-26931,18647,-26944,18629,-26956,18610,-26969,18592,-26982,18574,-26995,18555,-27007,18537,-27020,18518,-27032,18500,-27045,18482,-27058,18463,-27070,18445,-27083,18426,-27095,18408,-27108,18389,-27121,18371,-27133,18352,-27146,18334,-27158,18315,-27171,18297,-27183,18278,-27196,18260,-27208,18241,-27220,18222,-27233,18204,-27245,18185,-27258,18167,-27270,18148,-27282,18130,-27295,18111,-27307,18092,-27320,18074,-27332,18055,-27344,18036,-27356,18018,-27369,17999,-27381,17980,-27393,17962,-27406,17943,-27418,17924,-27430,17906,-27442,17887,-27454,17868,-27467,17849,-27479,17831,-27491,17812,-27503,17793,-27515,17774,-27527,17756,-27539,17737,-27552,17718,-27564,17699,-27576,17680,-27588,17662,-27600,17643,-27612,17624,-27624,17605,-27636,17586,-27648,17567,-27660,17549,-27672,17530,-27684,17511,-27696,17492,-27708,17473,-27720,17454,-27732,17435,-27743,17416,-27755,17397,-27767,17379,-27779,17360,-27791,17341,-27803,17322,-27815,17303,-27826,17284,-27838,17265,-27850,17246,-27862,17227,-27873,17208,-27885,17189,-27897,17170,-27909,17151,-27920,17132,-27932,17113,-27944,17094,-27955,17074,-27967,17055,-27979,17036,-27990,17017,-28002,16998,-28013,16979,-28025,16960,-28037,16941,-28048,16922,-28060,16903,-28071,16883,-28083,16864,-28094,16845,-28106,16826,-28117,16807,-28129,16788,-28140,16768,-28152,16749,-28163,16730,-28174,16711,-28186,16692,-28197,16672,-28209,16653,-28220,16634,-28231,16615,-28243,16595,-28254,16576,-28265,16557,-28276,16538,-28288,16518,-28299,16499,-28310,16480,-28322,16460,-28333,16441,-28344,16422,-28355,16402,-28366,16383,-28378,16364,-28389,16344,-28400,16325,-28411,16306,-28422,16286,-28433,16267,-28444,16247,-28455,16228,-28466,16209,-28478,16189,-28489,16170,-28500,16150,-28511,16131,-28522,16111,-28533,16092,-28544,16072,-28555,16053,-28566,16034,-28576,16014,-28587,15995,-28598,15975,-28609,15956,-28620,15936,-28631,15917,-28642,15897,-28653,15877,-28663,15858,-28674,15838,-28685,15819,-28696,15799,-28707,15780,-28717,15760,-28728,15740,-28739,15721,-28750,15701,-28760,15682,-28771,15662,-28782,15642,-28792,15623,-28803,15603,-28814,15583,-28824,15564,-28835,15544,-28846,15525,-28856,15505,-28867,15485,-28877,15465,-28888,15446,-28898,15426,-28909,15406,-28919,15387,-28930,15367,-28940,15347,-28951,15327,-28961,15308,-28972,15288,-28982,15268,-28993,15248,-29003,15229,-29013,15209,-29024,15189,-29034,15169,-29045,15149,-29055,15130,-29065,15110,-29075,15090,-29086,15070,-29096,15050,-29106,15030,-29117,15011,-29127,14991,-29137,14971,-29147,14951,-29157,14931,-29168,14911,-29178,14891,-29188,14871,-29198,14852,-29208,14832,-29218,14812,-29228,14792,-29239,14772,-29249,14752,-29259,14732,-29269,14712,-29279,14692,-29289,14672,-29299,14652,-29309,14632,-29319,14612,-29329,14592,-29339,14572,-29349,14552,-29359,14532,-29369,14512,-29378,14492,-29388,14472,-29398,14452,-29408,14432,-29418,14412,-29428,14392,-29438,14372,-29447,14352,-29457,14331,-29467,14311,-29477,14291,-29486,14271,-29496,14251,-29506,14231,-29516,14211,-29525,14191,-29535,14171,-29545,14150,-29554,14130,-29564,14110,-29574,14090,-29583,14070,-29593,14050,-29602,14029,-29612,14009,-29622,13989,-29631,13969,-29641,13949,-29650,13928,-29660,13908,-29669,13888,-29679,13868,-29688,13847,-29697,13827,-29707,13807,-29716,13787,-29726,13766,-29735,13746,-29745,13726,-29754,13706,-29763,13685,-29773,13665,-29782,13645,-29791,13624,-29801,13604,-29810,13584,-29819,13563,-29828,13543,-29838,13523,-29847,13502,-29856,13482,-29865,13462,-29874,13441,-29884,13421,-29893,13400,-29902,13380,-29911,13360,-29920,13339,-29929,13319,-29938,13298,-29947,13278,-29956,13258,-29965,13237,-29974,13217,-29984,13196,-29993,13176,-30002,13155,-30010,13135,-30019,13114,-30028,13094,-30037,13074,-30046,13053,-30055,13033,-30064,13012,-30073,12992,-30082,12971,-30091,12950,-30099,12930,-30108,12909,-30117,12889,-30126,12868,-30135,12848,-30143,12827,-30152,12807,-30161,12786,-30170,12766,-30178,12745,-30187,12724,-30196,12704,-30204,12683,-30213,12663,-30222,12642,-30230,12621,-30239,12601,-30248,12580,-30256,12560,-30265,12539,-30273,12518,-30282,12498,-30290,12477,-30299,12456,-30307,12436,-30316,12415,-30324,12394,-30333,12374,-30341,12353,-30350,12332,-30358,12312,-30366,12291,-30375,12270,-30383,12249,-30392,12229,-30400,12208,-30408,12187,-30417,12166,-30425,12146,-30433,12125,-30441,12104,-30450,12083,-30458,12063,-30466,12042,-30474,12021,-30483,12000,-30491,11980,-30499,11959,-30507,11938,-30515,11917,-30523,11896,-30531,11876,-30540,11855,-30548,11834,-30556,11813,-30564,11792,-30572,11771,-30580,11750,-30588,11730,-30596,11709,-30604,11688,-30612,11667,-30620,11646,-30628,11625,-30636,11604,-30644,11583,-30652,11563,-30659,11542,-30667,11521,-30675,11500,-30683,11479,-30691,11458,-30699,11437,-30706,11416,-30714,11395,-30722,11374,-30730,11353,-30738,11332,-30745,11311,-30753,11290,-30761,11269,-30768,11248,-30776,11227,-30784,11206,-30791,11185,-30799,11164,-30807,11143,-30814,11122,-30822,11101,-30829,11080,-30837,11059,-30845,11038,-30852,11017,-30860,10996,-30867,10975,-30875,10954,-30882,10933,-30890,10912,-30897,10891,-30904,10870,-30912,10849,-30919,10828,-30927,10807,-30934,10786,-30941,10765,-30949,10743,-30956,10722,-30963,10701,-30971,10680,-30978,10659,-30985,10638,-30992,10617,-31000,10596,-31007,10574,-31014,10553,-31021,10532,-31029,10511,-31036,10490,-31043,10469,-31050,10447,-31057,10426,-31064,10405,-31071,10384,-31078,10363,-31086,10342,-31093,10320,-31100,10299,-31107,10278,-31114,10257,-31121,10235,-31128,10214,-31135,10193,-31142,10172,-31149,10151,-31155,10129,-31162,10108,-31169,10087,-31176,10066,-31183,10044,-31190,10023,-31197,10002,-31204,9980,-31210,9959,-31217,9938,-31224,9917,-31231,9895,-31237,9874,-31244,9853,-31251,9831,-31258,9810,-31264,9789,-31271,9767,-31278,9746,-31284,9725,-31291,9703,-31298,9682,-31304,9661,-31311,9639,-31317,9618,-31324,9597,-31331,9575,-31337,9554,-31344,9533,-31350,9511,-31357,9490,-31363,9468,-31370,9447,-31376,9426,-31382,9404,-31389,9383,-31395,9362,-31402,9340,-31408,9319,-31414,9297,-31421,9276,-31427,9254,-31433,9233,-31440,9212,-31446,9190,-31452,9169,-31458,9147,-31465,9126,-31471,9104,-31477,9083,-31483,9061,-31490,9040,-31496,9018,-31502,8997,-31508,8975,-31514,8954,-31520,8932,-31526,8911,-31532,8889,-31538,8868,-31545,8846,-31551,8825,-31557,8803,-31563,8782,-31569,8760,-31575,8739,-31581,8717,-31587,8696,-31592,8674,-31598,8653,-31604,8631,-31610,8610,-31616,8588,-31622,8567,-31628,8545,-31634,8523,-31639,8502,-31645,8480,-31651,8459,-31657,8437,-31663,8415,-31668,8394,-31674,8372,-31680,8351,-31685,8329,-31691,8307,-31697,8286,-31702,8264,-31708,8243,-31714,8221,-31719,8199,-31725,8178,-31730,8156,-31736,8134,-31742,8113,-31747,8091,-31753,8070,-31758,8048,-31764,8026,-31769,8005,-31775,7983,-31780,7961,-31786,7940,-31791,7918,-31796,7896,-31802,7875,-31807,7853,-31812,7831,-31818,7809,-31823,7788,-31828,7766,-31834,7744,-31839,7723,-31844,7701,-31850,7679,-31855,7657,-31860,7636,-31865,7614,-31870,7592,-31876,7571,-31881,7549,-31886,7527,-31891,7505,-31896,7484,-31901,7462,-31906,7440,-31912,7418,-31917,7397,-31922,7375,-31927,7353,-31932,7331,-31937,7310,-31942,7288,-31947,7266,-31952,7244,-31957,7222,-31962,7201,-31966,7179,-31971,7157,-31976,7135,-31981,7113,-31986,7092,-31991,7070,-31996,7048,-32000,7026,-32005,7004,-32010,6982,-32015,6961,-32020,6939,-32024,6917,-32029,6895,-32034,6873,-32038,6851,-32043,6830,-32048,6808,-32052,6786,-32057,6764,-32062,6742,-32066,6720,-32071,6698,-32075,6677,-32080,6655,-32085,6633,-32089,6611,-32094,6589,-32098,6567,-32103,6545,-32107,6523,-32111,6502,-32116,6480,-32120,6458,-32125,6436,-32129,6414,-32134,6392,-32138,6370,-32142,6348,-32147,6326,-32151,6304,-32155,6282,-32159,6261,-32164,6239,-32168,6217,-32172,6195,-32177,6173,-32181,6151,-32185,6129,-32189,6107,-32193,6085,-32197,6063,-32202,6041,-32206,6019,-32210,5997,-32214,5975,-32218,5953,-32222,5931,-32226,5909,-32230,5887,-32234,5865,-32238,5843,-32242,5821,-32246,5799,-32250,5777,-32254,5755,-32258,5733,-32262,5711,-32266,5689,-32270,5667,-32274,5645,-32277,5623,-32281,5601,-32285,5579,-32289,5557,-32293,5535,-32296,5513,-32300,5491,-32304,5469,-32308,5447,-32311,5425,-32315,5403,-32319,5381,-32323,5359,-32326,5337,-32330,5315,-32333,5293,-32337,5271,-32341,5249,-32344,5227,-32348,5205,-32351,5183,-32355,5161,-32358,5139,-32362,5117,-32365,5094,-32369,5072,-32372,5050,-32376,5028,-32379,5006,-32383,4984,-32386,4962,-32390,4940,-32393,4918,-32396,4896,-32400,4874,-32403,4852,-32406,4830,-32410,4807,-32413,4785,-32416,4763,-32419,4741,-32423,4719,-32426,4697,-32429,4675,-32432,4653,-32435,4631,-32439,4608,-32442,4586,-32445,4564,-32448,4542,-32451,4520,-32454,4498,-32457,4476,-32460,4454,-32463,4431,-32466,4409,-32469,4387,-32472,4365,-32475,4343,-32478,4321,-32481,4299,-32484,4276,-32487,4254,-32490,4232,-32493,4210,-32496,4188,-32499,4166,-32502,4144,-32504,4121,-32507,4099,-32510,4077,-32513,4055,-32516,4033,-32518,4011,-32521,3988,-32524,3966,-32527,3944,-32529,3922,-32532,3900,-32535,3877,-32537,3855,-32540,3833,-32542,3811,-32545,3789,-32548,3767,-32550,3744,-32553,3722,-32555,3700,-32558,3678,-32560,3656,-32563,3633,-32565,3611,-32568,3589,-32570,3567,-32573,3545,-32575,3522,-32578,3500,-32580,3478,-32582,3456,-32585,3433,-32587,3411,-32589,3389,-32592,3367,-32594,3345,-32596,3322,-32599,3300,-32601,3278,-32603,3256,-32605,3233,-32608,3211,-32610,3189,-32612,3167,-32614,3145,-32616,3122,-32618,3100,-32620,3078,-32623,3056,-32625,3033,-32627,3011,-32629,2989,-32631,2967,-32633,2944,-32635,2922,-32637,2900,-32639,2878,-32641,2855,-32643,2833,-32645,2811,-32647,2789,-32649,2766,-32650,2744,-32652,2722,-32654,2700,-32656,2677,-32658,2655,-32660,2633,-32662,2610,-32663,2588,-32665,2566,-32667,2544,-32669,2521,-32670,2499,-32672,2477,-32674,2455,-32675,2432,-32677,2410,-32679,2388,-32680,2365,-32682,2343,-32684,2321,-32685,2299,-32687,2276,-32688,2254,-32690,2232,-32691,2209,-32693,2187,-32694,2165,-32696,2143,-32697,2120,-32699,2098,-32700,2076,-32702,2053,-32703,2031,-32704,2009,-32706,1986,-32707,1964,-32709,1942,-32710,1920,-32711,1897,-32712,1875,-32714,1853,-32715,1830,-32716,1808,-32718,1786,-32719,1763,-32720,1741,-32721,1719,-32722,1697,-32724,1674,-32725,1652,-32726,1630,-32727,1607,-32728,1585,-32729,1563,-32730,1540,-32731,1518,-32732,1496,-32733,1473,-32734,1451,-32735,1429,-32736,1406,-32737,1384,-32738,1362,-32739,1339,-32740,1317,-32741,1295,-32742,1273,-32743,1250,-32744,1228,-32744,1206,-32745,1183,-32746,1161,-32747,1139,-32748,1116,-32748,1094,-32749,1072,-32750,1049,-32751,1027,-32751,1005,-32752,982,-32753,960,-32753,938,-32754,915,-32755,893,-32755,871,-32756,848,-32757,826,-32757,804,-32758,781,-32758,759,-32759,737,-32759,714,-32760,692,-32760,670,-32761,647,-32761,625,-32762,603,-32762,580,-32762,558,-32763,536,-32763,513,-32763,491,-32764,469,-32764,446,-32764,424,-32765,402,-32765,379,-32765,357,-32766,335,-32766,312,-32766,290,-32766,268,-32766,245,-32767,223,-32767,201,-32767,178,-32767,156,-32767,134,-32767,111,-32767,89,-32767,67,-32767,44,-32767,22,-32767,0,-32767,-23,-32767,-45,-32767,-68,-32767,-90,-32767,-112,-32767,-135,-32767,-157,-32767,-179,-32767,-202,-32767,-224,-32767,-246,-32767,-269,-32766,-291,-32766,-313,-32766,-336,-32766,-358,-32766,-380,-32765,-403,-32765,-425,-32765,-447,-32764,-470,-32764,-492,-32764,-514,-32763,-537,-32763,-559,-32763,-581,-32762,-604,-32762,-626,-32762,-648,-32761,-671,-32761,-693,-32760,-715,-32760,-738,-32759,-760,-32759,-782,-32758,-805,-32758,-827,-32757,-849,-32757,-872,-32756,-894,-32755,-916,-32755,-939,-32754,-961,-32753,-983,-32753,-1006,-32752,-1028,-32751,-1050,-32751,-1073,-32750,-1095,-32749,-1117,-32748,-1140,-32748,-1162,-32747,-1184,-32746,-1207,-32745,-1229,-32744,-1251,-32744,-1274,-32743,-1296,-32742,-1318,-32741,-1340,-32740,-1363,-32739,-1385,-32738,-1407,-32737,-1430,-32736,-1452,-32735,-1474,-32734,-1497,-32733,-1519,-32732,-1541,-32731,-1564,-32730,-1586,-32729,-1608,-32728,-1631,-32727,-1653,-32726,-1675,-32725,-1698,-32724,-1720,-32722,-1742,-32721,-1764,-32720,-1787,-32719,-1809,-32718,-1831,-32716,-1854,-32715,-1876,-32714,-1898,-32712,-1921,-32711,-1943,-32710,-1965,-32709,-1987,-32707,-2010,-32706,-2032,-32704,-2054,-32703,-2077,-32702,-2099,-32700,-2121,-32699,-2144,-32697,-2166,-32696,-2188,-32694,-2210,-32693,-2233,-32691,-2255,-32690,-2277,-32688,-2300,-32687,-2322,-32685,-2344,-32684,-2366,-32682,-2389,-32680,-2411,-32679,-2433,-32677,-2456,-32675,-2478,-32674,-2500,-32672,-2522,-32670,-2545,-32669,-2567,-32667,-2589,-32665,-2611,-32663,-2634,-32662,-2656,-32660,-2678,-32658,-2701,-32656,-2723,-32654,-2745,-32652,-2767,-32650,-2790,-32649,-2812,-32647,-2834,-32645,-2856,-32643,-2879,-32641,-2901,-32639,-2923,-32637,-2945,-32635,-2968,-32633,-2990,-32631,-3012,-32629,-3034,-32627,-3057,-32625,-3079,-32623,-3101,-32620,-3123,-32618,-3146,-32616,-3168,-32614,-3190,-32612,-3212,-32610,-3234,-32608,-3257,-32605,-3279,-32603,-3301,-32601,-3323,-32599,-3346,-32596,-3368,-32594,-3390,-32592,-3412,-32589,-3434,-32587,-3457,-32585,-3479,-32582,-3501,-32580,-3523,-32578,-3546,-32575,-3568,-32573,-3590,-32570,-3612,-32568,-3634,-32565,-3657,-32563,-3679,-32560,-3701,-32558,-3723,-32555,-3745,-32553,-3768,-32550,-3790,-32548,-3812,-32545,-3834,-32542,-3856,-32540,-3878,-32537,-3901,-32535,-3923,-32532,-3945,-32529,-3967,-32527,-3989,-32524,-4012,-32521,-4034,-32518,-4056,-32516,-4078,-32513,-4100,-32510,-4122,-32507,-4145,-32504,-4167,-32502,-4189,-32499,-4211,-32496,-4233,-32493,-4255,-32490,-4277,-32487,-4300,-32484,-4322,-32481,-4344,-32478,-4366,-32475,-4388,-32472,-4410,-32469,-4432,-32466,-4455,-32463,-4477,-32460,-4499,-32457,-4521,-32454,-4543,-32451,-4565,-32448,-4587,-32445,-4609,-32442,-4632,-32439,-4654,-32435,-4676,-32432,-4698,-32429,-4720,-32426,-4742,-32423,-4764,-32419,-4786,-32416,-4808,-32413,-4831,-32410,-4853,-32406,-4875,-32403,-4897,-32400,-4919,-32396,-4941,-32393,-4963,-32390,-4985,-32386,-5007,-32383,-5029,-32379,-5051,-32376,-5073,-32372,-5095,-32369,-5118,-32365,-5140,-32362,-5162,-32358,-5184,-32355,-5206,-32351,-5228,-32348,-5250,-32344,-5272,-32341,-5294,-32337,-5316,-32333,-5338,-32330,-5360,-32326,-5382,-32323,-5404,-32319,-5426,-32315,-5448,-32311,-5470,-32308,-5492,-32304,-5514,-32300,-5536,-32296,-5558,-32293,-5580,-32289,-5602,-32285,-5624,-32281,-5646,-32277,-5668,-32274,-5690,-32270,-5712,-32266,-5734,-32262,-5756,-32258,-5778,-32254,-5800,-32250,-5822,-32246,-5844,-32242,-5866,-32238,-5888,-32234,-5910,-32230,-5932,-32226,-5954,-32222,-5976,-32218,-5998,-32214,-6020,-32210,-6042,-32206,-6064,-32202,-6086,-32197,-6108,-32193,-6130,-32189,-6152,-32185,-6174,-32181,-6196,-32177,-6218,-32172,-6240,-32168,-6262,-32164,-6283,-32159,-6305,-32155,-6327,-32151,-6349,-32147,-6371,-32142,-6393,-32138,-6415,-32134,-6437,-32129,-6459,-32125,-6481,-32120,-6503,-32116,-6524,-32111,-6546,-32107,-6568,-32103,-6590,-32098,-6612,-32094,-6634,-32089,-6656,-32085,-6678,-32080,-6699,-32075,-6721,-32071,-6743,-32066,-6765,-32062,-6787,-32057,-6809,-32052,-6831,-32048,-6852,-32043,-6874,-32038,-6896,-32034,-6918,-32029,-6940,-32024,-6962,-32020,-6983,-32015,-7005,-32010,-7027,-32005,-7049,-32000,-7071,-31996,-7093,-31991,-7114,-31986,-7136,-31981,-7158,-31976,-7180,-31971,-7202,-31966,-7223,-31962,-7245,-31957,-7267,-31952,-7289,-31947,-7311,-31942,-7332,-31937,-7354,-31932,-7376,-31927,-7398,-31922,-7419,-31917,-7441,-31912,-7463,-31906,-7485,-31901,-7506,-31896,-7528,-31891,-7550,-31886,-7572,-31881,-7593,-31876,-7615,-31870,-7637,-31865,-7658,-31860,-7680,-31855,-7702,-31850,-7724,-31844,-7745,-31839,-7767,-31834,-7789,-31828,-7810,-31823,-7832,-31818,-7854,-31812,-7876,-31807,-7897,-31802,-7919,-31796,-7941,-31791,-7962,-31786,-7984,-31780,-8006,-31775,-8027,-31769,-8049,-31764,-8071,-31758,-8092,-31753,-8114,-31747,-8135,-31742,-8157,-31736,-8179,-31730,-8200,-31725,-8222,-31719,-8244,-31714,-8265,-31708,-8287,-31702,-8308,-31697,-8330,-31691,-8352,-31685,-8373,-31680,-8395,-31674,-8416,-31668,-8438,-31663,-8460,-31657,-8481,-31651,-8503,-31645,-8524,-31639,-8546,-31634,-8568,-31628,-8589,-31622,-8611,-31616,-8632,-31610,-8654,-31604,-8675,-31598,-8697,-31592,-8718,-31587,-8740,-31581,-8761,-31575,-8783,-31569,-8804,-31563,-8826,-31557,-8847,-31551,-8869,-31545,-8890,-31538,-8912,-31532,-8933,-31526,-8955,-31520,-8976,-31514,-8998,-31508,-9019,-31502,-9041,-31496,-9062,-31490,-9084,-31483,-9105,-31477,-9127,-31471,-9148,-31465,-9170,-31458,-9191,-31452,-9213,-31446,-9234,-31440,-9255,-31433,-9277,-31427,-9298,-31421,-9320,-31414,-9341,-31408,-9363,-31402,-9384,-31395,-9405,-31389,-9427,-31382,-9448,-31376,-9469,-31370,-9491,-31363,-9512,-31357,-9534,-31350,-9555,-31344,-9576,-31337,-9598,-31331,-9619,-31324,-9640,-31317,-9662,-31311,-9683,-31304,-9704,-31298,-9726,-31291,-9747,-31284,-9768,-31278,-9790,-31271,-9811,-31264,-9832,-31258,-9854,-31251,-9875,-31244,-9896,-31237,-9918,-31231,-9939,-31224,-9960,-31217,-9981,-31210,-10003,-31204,-10024,-31197,-10045,-31190,-10067,-31183,-10088,-31176,-10109,-31169,-10130,-31162,-10152,-31155,-10173,-31149,-10194,-31142,-10215,-31135,-10236,-31128,-10258,-31121,-10279,-31114,-10300,-31107,-10321,-31100,-10343,-31093,-10364,-31086,-10385,-31078,-10406,-31071,-10427,-31064,-10448,-31057,-10470,-31050,-10491,-31043,-10512,-31036,-10533,-31029,-10554,-31021,-10575,-31014,-10597,-31007,-10618,-31000,-10639,-30992,-10660,-30985,-10681,-30978,-10702,-30971,-10723,-30963,-10744,-30956,-10766,-30949,-10787,-30941,-10808,-30934,-10829,-30927,-10850,-30919,-10871,-30912,-10892,-30904,-10913,-30897,-10934,-30890,-10955,-30882,-10976,-30875,-10997,-30867,-11018,-30860,-11039,-30852,-11060,-30845,-11081,-30837,-11102,-30829,-11123,-30822,-11144,-30814,-11165,-30807,-11186,-30799,-11207,-30791,-11228,-30784,-11249,-30776,-11270,-30768,-11291,-30761,-11312,-30753,-11333,-30745,-11354,-30738,-11375,-30730,-11396,-30722,-11417,-30714,-11438,-30706,-11459,-30699,-11480,-30691,-11501,-30683,-11522,-30675,-11543,-30667,-11564,-30659,-11584,-30652,-11605,-30644,-11626,-30636,-11647,-30628,-11668,-30620,-11689,-30612,-11710,-30604,-11731,-30596,-11751,-30588,-11772,-30580,-11793,-30572,-11814,-30564,-11835,-30556,-11856,-30548,-11877,-30540,-11897,-30531,-11918,-30523,-11939,-30515,-11960,-30507,-11981,-30499,-12001,-30491,-12022,-30483,-12043,-30474,-12064,-30466,-12084,-30458,-12105,-30450,-12126,-30441,-12147,-30433,-12167,-30425,-12188,-30417,-12209,-30408,-12230,-30400,-12250,-30392,-12271,-30383,-12292,-30375,-12313,-30366,-12333,-30358,-12354,-30350,-12375,-30341,-12395,-30333,-12416,-30324,-12437,-30316,-12457,-30307,-12478,-30299,-12499,-30290,-12519,-30282,-12540,-30273,-12561,-30265,-12581,-30256,-12602,-30248,-12622,-30239,-12643,-30230,-12664,-30222,-12684,-30213,-12705,-30204,-12725,-30196,-12746,-30187,-12767,-30178,-12787,-30170,-12808,-30161,-12828,-30152,-12849,-30143,-12869,-30135,-12890,-30126,-12910,-30117,-12931,-30108,-12951,-30099,-12972,-30091,-12993,-30082,-13013,-30073,-13034,-30064,-13054,-30055,-13075,-30046,-13095,-30037,-13115,-30028,-13136,-30019,-13156,-30010,-13177,-30002,-13197,-29993,-13218,-29984,-13238,-29974,-13259,-29965,-13279,-29956,-13299,-29947,-13320,-29938,-13340,-29929,-13361,-29920,-13381,-29911,-13401,-29902,-13422,-29893,-13442,-29884,-13463,-29874,-13483,-29865,-13503,-29856,-13524,-29847,-13544,-29838,-13564,-29828,-13585,-29819,-13605,-29810,-13625,-29801,-13646,-29791,-13666,-29782,-13686,-29773,-13707,-29763,-13727,-29754,-13747,-29745,-13767,-29735,-13788,-29726,-13808,-29716,-13828,-29707,-13848,-29697,-13869,-29688,-13889,-29679,-13909,-29669,-13929,-29660,-13950,-29650,-13970,-29641,-13990,-29631,-14010,-29622,-14030,-29612,-14051,-29602,-14071,-29593,-14091,-29583,-14111,-29574,-14131,-29564,-14151,-29554,-14172,-29545,-14192,-29535,-14212,-29525,-14232,-29516,-14252,-29506,-14272,-29496,-14292,-29486,-14312,-29477,-14332,-29467,-14353,-29457,-14373,-29447,-14393,-29438,-14413,-29428,-14433,-29418,-14453,-29408,-14473,-29398,-14493,-29388,-14513,-29378,-14533,-29369,-14553,-29359,-14573,-29349,-14593,-29339,-14613,-29329,-14633,-29319,-14653,-29309,-14673,-29299,-14693,-29289,-14713,-29279,-14733,-29269,-14753,-29259,-14773,-29249,-14793,-29239,-14813,-29228,-14833,-29218,-14853,-29208,-14872,-29198,-14892,-29188,-14912,-29178,-14932,-29168,-14952,-29157,-14972,-29147,-14992,-29137,-15012,-29127,-15031,-29117,-15051,-29106,-15071,-29096,-15091,-29086,-15111,-29075,-15131,-29065,-15150,-29055,-15170,-29045,-15190,-29034,-15210,-29024,-15230,-29013,-15249,-29003,-15269,-28993,-15289,-28982,-15309,-28972,-15328,-28961,-15348,-28951,-15368,-28940,-15388,-28930,-15407,-28919,-15427,-28909,-15447,-28898,-15466,-28888,-15486,-28877,-15506,-28867,-15526,-28856,-15545,-28846,-15565,-28835,-15584,-28824,-15604,-28814,-15624,-28803,-15643,-28792,-15663,-28782,-15683,-28771,-15702,-28760,-15722,-28750,-15741,-28739,-15761,-28728,-15781,-28717,-15800,-28707,-15820,-28696,-15839,-28685,-15859,-28674,-15878,-28663,-15898,-28653,-15918,-28642,-15937,-28631,-15957,-28620,-15976,-28609,-15996,-28598,-16015,-28587,-16035,-28576,-16054,-28566,-16073,-28555,-16093,-28544,-16112,-28533,-16132,-28522,-16151,-28511,-16171,-28500,-16190,-28489,-16210,-28478,-16229,-28466,-16248,-28455,-16268,-28444,-16287,-28433,-16307,-28422,-16326,-28411,-16345,-28400,-16365,-28389,-16384,-28378,-16403,-28366,-16423,-28355,-16442,-28344,-16461,-28333,-16481,-28322,-16500,-28310,-16519,-28299,-16539,-28288,-16558,-28276,-16577,-28265,-16596,-28254,-16616,-28243,-16635,-28231,-16654,-28220,-16673,-28209,-16693,-28197,-16712,-28186,-16731,-28174,-16750,-28163,-16769,-28152,-16789,-28140,-16808,-28129,-16827,-28117,-16846,-28106,-16865,-28094,-16884,-28083,-16904,-28071,-16923,-28060,-16942,-28048,-16961,-28037,-16980,-28025,-16999,-28013,-17018,-28002,-17037,-27990,-17056,-27979,-17075,-27967,-17095,-27955,-17114,-27944,-17133,-27932,-17152,-27920,-17171,-27909,-17190,-27897,-17209,-27885,-17228,-27873,-17247,-27862,-17266,-27850,-17285,-27838,-17304,-27826,-17323,-27815,-17342,-27803,-17361,-27791,-17380,-27779,-17398,-27767,-17417,-27755,-17436,-27743,-17455,-27732,-17474,-27720,-17493,-27708,-17512,-27696,-17531,-27684,-17550,-27672,-17568,-27660,-17587,-27648,-17606,-27636,-17625,-27624,-17644,-27612,-17663,-27600,-17681,-27588,-17700,-27576,-17719,-27564,-17738,-27552,-17757,-27539,-17775,-27527,-17794,-27515,-17813,-27503,-17832,-27491,-17850,-27479,-17869,-27467,-17888,-27454,-17907,-27442,-17925,-27430,-17944,-27418,-17963,-27406,-17981,-27393,-18000,-27381,-18019,-27369,-18037,-27356,-18056,-27344,-18075,-27332,-18093,-27320,-18112,-27307,-18131,-27295,-18149,-27282,-18168,-27270,-18186,-27258,-18205,-27245,-18223,-27233,-18242,-27220,-18261,-27208,-18279,-27196,-18298,-27183,-18316,-27171,-18335,-27158,-18353,-27146,-18372,-27133,-18390,-27121,-18409,-27108,-18427,-27095,-18446,-27083,-18464,-27070,-18483,-27058,-18501,-27045,-18519,-27032,-18538,-27020,-18556,-27007,-18575,-26995,-18593,-26982,-18611,-26969,-18630,-26956,-18648,-26944,-18667,-26931,-18685,-26918,-18703,-26906,-18722,-26893,-18740,-26880,-18758,-26867,-18777,-26854,-18795,-26842,-18813,-26829,-18831,-26816,-18850,-26803,-18868,-26790,-18886,-26777,-18905,-26765,-18923,-26752,-18941,-26739,-18959,-26726,-18977,-26713,-18996,-26700,-19014,-26687,-19032,-26674,-19050,-26661,-19068,-26648,-19087,-26635,-19105,-26622,-19123,-26609,-19141,-26596,-19159,-26583,-19177,-26570,-19195,-26557,-19213,-26544,-19232,-26531,-19250,-26517,-19268,-26504,-19286,-26491,-19304,-26478,-19322,-26465,-19340,-26452,-19358,-26438,-19376,-26425,-19394,-26412,-19412,-26399,-19430,-26386,-19448,-26372,-19466,-26359,-19484,-26346,-19502,-26333,-19520,-26319,-19538,-26306,-19556,-26293,-19574,-26279,-19591,-26266,-19609,-26253,-19627,-26239,-19645,-26226,-19663,-26212,-19681,-26199,-19699,-26186,-19717,-26172,-19734,-26159,-19752,-26145,-19770,-26132,-19788,-26118,-19806,-26105,-19823,-26091,-19841,-26078,-19859,-26064,-19877,-26051,-19895,-26037,-19912,-26023,-19930,-26010,-19948,-25996,-19966,-25983,-19983,-25969,-20001,-25955,-20019,-25942,-20036,-25928,-20054,-25914,-20072,-25901,-20089,-25887,-20107,-25873,-20125,-25860,-20142,-25846,-20160,-25832,-20177,-25818,-20195,-25805,-20213,-25791,-20230,-25777,-20248,-25763,-20265,-25750,-20283,-25736,-20300,-25722,-20318,-25708,-20335,-25694,-20353,-25680,-20370,-25666,-20388,-25653,-20405,-25639,-20423,-25625,-20440,-25611,-20458,-25597,-20475,-25583,-20493,-25569,-20510,-25555,-20528,-25541,-20545,-25527,-20562,-25513,-20580,-25499,-20597,-25485,-20614,-25471,-20632,-25457,-20649,-25443,-20667,-25429,-20684,-25415,-20701,-25400,-20719,-25386,-20736,-25372,-20753,-25358,-20770,-25344,-20788,-25330,-20805,-25316,-20822,-25301,-20839,-25287,-20857,-25273,-20874,-25259,-20891,-25244,-20908,-25230,-20926,-25216,-20943,-25202,-20960,-25187,-20977,-25173,-20994,-25159,-21011,-25145,-21028,-25130,-21046,-25116,-21063,-25101,-21080,-25087,-21097,-25073,-21114,-25058,-21131,-25044,-21148,-25030,-21165,-25015,-21182,-25001,-21199,-24986,-21216,-24972,-21233,-24957,-21250,-24943,-21267,-24928,-21284,-24914,-21301,-24899,-21318,-24885,-21335,-24870,-21352,-24856,-21369,-24841,-21386,-24827,-21403,-24812,-21420,-24797,-21437,-24783,-21454,-24768,-21471,-24754,-21487,-24739,-21504,-24724,-21521,-24710,-21538,-24695,-21555,-24680,-21572,-24665,-21588,-24651,-21605,-24636,-21622,-24621,-21639,-24607,-21656,-24592,-21672,-24577,-21689,-24562,-21706,-24547,-21723,-24533,-21739,-24518,-21756,-24503,-21773,-24488,-21789,-24473,-21806,-24458,-21823,-24444,-21839,-24429,-21856,-24414,-21873,-24399,-21889,-24384,-21906,-24369,-21923,-24354,-21939,-24339,-21956,-24324,-21972,-24309,-21989,-24294,-22005,-24279,-22022,-24264,-22039,-24249,-22055,-24234,-22072,-24219,-22088,-24204,-22105,-24189,-22121,-24174,-22138,-24159,-22154,-24144,-22170,-24129,-22187,-24114,-22203,-24098,-22220,-24083,-22236,-24068,-22253,-24053,-22269,-24038,-22285,-24023,-22302,-24007,-22318,-23992,-22334,-23977,-22351,-23962,-22367,-23946,-22383,-23931,-22400,-23916,-22416,-23901,-22432,-23885,-22449,-23870,-22465,-23855,-22481,-23839,-22497,-23824,-22514,-23809,-22530,-23793,-22546,-23778,-22562,-23763,-22578,-23747,-22595,-23732,-22611,-23716,-22627,-23701,-22643,-23686,-22659,-23670,-22675,-23655,-22692,-23639,-22708,-23624,-22724,-23608,-22740,-23593,-22756,-23577,-22772,-23562,-22788,-23546,-22804,-23531,-22820,-23515,-22836,-23500,-22852,-23484,-22868,-23468,-22884,-23453,-22900,-23437,-22916,-23422,-22932,-23406,-22948,-23390,-22964,-23375,-22980,-23359,-22996,-23343,-23012,-23328,-23028,-23312,-23044,-23296,-23059,-23281,-23075,-23265,-23091,-23249,-23107,-23233,-23123,-23218,-23139,-23202,-23154,-23186,-23170,-23170,-23186,-23154,-23202,-23139,-23218,-23123,-23233,-23107,-23249,-23091,-23265,-23075,-23281,-23059,-23296,-23044,-23312,-23028,-23328,-23012,-23343,-22996,-23359,-22980,-23375,-22964,-23390,-22948,-23406,-22932,-23422,-22916,-23437,-22900,-23453,-22884,-23468,-22868,-23484,-22852,-23500,-22836,-23515,-22820,-23531,-22804,-23546,-22788,-23562,-22772,-23577,-22756,-23593,-22740,-23608,-22724,-23624,-22708,-23639,-22692,-23655,-22675,-23670,-22659,-23686,-22643,-23701,-22627,-23716,-22611,-23732,-22595,-23747,-22578,-23763,-22562,-23778,-22546,-23793,-22530,-23809,-22514,-23824,-22497,-23839,-22481,-23855,-22465,-23870,-22449,-23885,-22432,-23901,-22416,-23916,-22400,-23931,-22383,-23946,-22367,-23962,-22351,-23977,-22334,-23992,-22318,-24007,-22302,-24023,-22285,-24038,-22269,-24053,-22253,-24068,-22236,-24083,-22220,-24098,-22203,-24114,-22187,-24129,-22170,-24144,-22154,-24159,-22138,-24174,-22121,-24189,-22105,-24204,-22088,-24219,-22072,-24234,-22055,-24249,-22039,-24264,-22022,-24279,-22005,-24294,-21989,-24309,-21972,-24324,-21956,-24339,-21939,-24354,-21923,-24369,-21906,-24384,-21889,-24399,-21873,-24414,-21856,-24429,-21839,-24444,-21823,-24458,-21806,-24473,-21789,-24488,-21773,-24503,-21756,-24518,-21739,-24533,-21723,-24547,-21706,-24562,-21689,-24577,-21672,-24592,-21656,-24607,-21639,-24621,-21622,-24636,-21605,-24651,-21588,-24665,-21572,-24680,-21555,-24695,-21538,-24710,-21521,-24724,-21504,-24739,-21487,-24754,-21471,-24768,-21454,-24783,-21437,-24797,-21420,-24812,-21403,-24827,-21386,-24841,-21369,-24856,-21352,-24870,-21335,-24885,-21318,-24899,-21301,-24914,-21284,-24928,-21267,-24943,-21250,-24957,-21233,-24972,-21216,-24986,-21199,-25001,-21182,-25015,-21165,-25030,-21148,-25044,-21131,-25058,-21114,-25073,-21097,-25087,-21080,-25101,-21063,-25116,-21046,-25130,-21028,-25145,-21011,-25159,-20994,-25173,-20977,-25187,-20960,-25202,-20943,-25216,-20926,-25230,-20908,-25244,-20891,-25259,-20874,-25273,-20857,-25287,-20839,-25301,-20822,-25316,-20805,-25330,-20788,-25344,-20770,-25358,-20753,-25372,-20736,-25386,-20719,-25400,-20701,-25415,-20684,-25429,-20667,-25443,-20649,-25457,-20632,-25471,-20614,-25485,-20597,-25499,-20580,-25513,-20562,-25527,-20545,-25541,-20528,-25555,-20510,-25569,-20493,-25583,-20475,-25597,-20458,-25611,-20440,-25625,-20423,-25639,-20405,-25653,-20388,-25666,-20370,-25680,-20353,-25694,-20335,-25708,-20318,-25722,-20300,-25736,-20283,-25750,-20265,-25763,-20248,-25777,-20230,-25791,-20213,-25805,-20195,-25818,-20177,-25832,-20160,-25846,-20142,-25860,-20125,-25873,-20107,-25887,-20089,-25901,-20072,-25914,-20054,-25928,-20036,-25942,-20019,-25955,-20001,-25969,-19983,-25983,-19966,-25996,-19948,-26010,-19930,-26023,-19912,-26037,-19895,-26051,-19877,-26064,-19859,-26078,-19841,-26091,-19823,-26105,-19806,-26118,-19788,-26132,-19770,-26145,-19752,-26159,-19734,-26172,-19717,-26186,-19699,-26199,-19681,-26212,-19663,-26226,-19645,-26239,-19627,-26253,-19609,-26266,-19591,-26279,-19574,-26293,-19556,-26306,-19538,-26319,-19520,-26333,-19502,-26346,-19484,-26359,-19466,-26372,-19448,-26386,-19430,-26399,-19412,-26412,-19394,-26425,-19376,-26438,-19358,-26452,-19340,-26465,-19322,-26478,-19304,-26491,-19286,-26504,-19268,-26517,-19250,-26531,-19232,-26544,-19213,-26557,-19195,-26570,-19177,-26583,-19159,-26596,-19141,-26609,-19123,-26622,-19105,-26635,-19087,-26648,-19068,-26661,-19050,-26674,-19032,-26687,-19014,-26700,-18996,-26713,-18977,-26726,-18959,-26739,-18941,-26752,-18923,-26765,-18905,-26777,-18886,-26790,-18868,-26803,-18850,-26816,-18831,-26829,-18813,-26842,-18795,-26854,-18777,-26867,-18758,-26880,-18740,-26893,-18722,-26906,-18703,-26918,-18685,-26931,-18667,-26944,-18648,-26956,-18630,-26969,-18611,-26982,-18593,-26995,-18575,-27007,-18556,-27020,-18538,-27032,-18519,-27045,-18501,-27058,-18483,-27070,-18464,-27083,-18446,-27095,-18427,-27108,-18409,-27121,-18390,-27133,-18372,-27146,-18353,-27158,-18335,-27171,-18316,-27183,-18298,-27196,-18279,-27208,-18261,-27220,-18242,-27233,-18223,-27245,-18205,-27258,-18186,-27270,-18168,-27282,-18149,-27295,-18131,-27307,-18112,-27320,-18093,-27332,-18075,-27344,-18056,-27356,-18037,-27369,-18019,-27381,-18000,-27393,-17981,-27406,-17963,-27418,-17944,-27430,-17925,-27442,-17907,-27454,-17888,-27467,-17869,-27479,-17850,-27491,-17832,-27503,-17813,-27515,-17794,-27527,-17775,-27539,-17757,-27552,-17738,-27564,-17719,-27576,-17700,-27588,-17681,-27600,-17663,-27612,-17644,-27624,-17625,-27636,-17606,-27648,-17587,-27660,-17568,-27672,-17550,-27684,-17531,-27696,-17512,-27708,-17493,-27720,-17474,-27732,-17455,-27743,-17436,-27755,-17417,-27767,-17398,-27779,-17380,-27791,-17361,-27803,-17342,-27815,-17323,-27826,-17304,-27838,-17285,-27850,-17266,-27862,-17247,-27873,-17228,-27885,-17209,-27897,-17190,-27909,-17171,-27920,-17152,-27932,-17133,-27944,-17114,-27955,-17095,-27967,-17075,-27979,-17056,-27990,-17037,-28002,-17018,-28013,-16999,-28025,-16980,-28037,-16961,-28048,-16942,-28060,-16923,-28071,-16904,-28083,-16884,-28094,-16865,-28106,-16846,-28117,-16827,-28129,-16808,-28140,-16789,-28152,-16769,-28163,-16750,-28174,-16731,-28186,-16712,-28197,-16693,-28209,-16673,-28220,-16654,-28231,-16635,-28243,-16616,-28254,-16596,-28265,-16577,-28276,-16558,-28288,-16539,-28299,-16519,-28310,-16500,-28322,-16481,-28333,-16461,-28344,-16442,-28355,-16423,-28366,-16403,-28378,-16384,-28389,-16365,-28400,-16345,-28411,-16326,-28422,-16307,-28433,-16287,-28444,-16268,-28455,-16248,-28466,-16229,-28478,-16210,-28489,-16190,-28500,-16171,-28511,-16151,-28522,-16132,-28533,-16112,-28544,-16093,-28555,-16073,-28566,-16054,-28576,-16035,-28587,-16015,-28598,-15996,-28609,-15976,-28620,-15957,-28631,-15937,-28642,-15918,-28653,-15898,-28663,-15878,-28674,-15859,-28685,-15839,-28696,-15820,-28707,-15800,-28717,-15781,-28728,-15761,-28739,-15741,-28750,-15722,-28760,-15702,-28771,-15683,-28782,-15663,-28792,-15643,-28803,-15624,-28814,-15604,-28824,-15584,-28835,-15565,-28846,-15545,-28856,-15526,-28867,-15506,-28877,-15486,-28888,-15466,-28898,-15447,-28909,-15427,-28919,-15407,-28930,-15388,-28940,-15368,-28951,-15348,-28961,-15328,-28972,-15309,-28982,-15289,-28993,-15269,-29003,-15249,-29013,-15230,-29024,-15210,-29034,-15190,-29045,-15170,-29055,-15150,-29065,-15131,-29075,-15111,-29086,-15091,-29096,-15071,-29106,-15051,-29117,-15031,-29127,-15012,-29137,-14992,-29147,-14972,-29157,-14952,-29168,-14932,-29178,-14912,-29188,-14892,-29198,-14872,-29208,-14853,-29218,-14833,-29228,-14813,-29239,-14793,-29249,-14773,-29259,-14753,-29269,-14733,-29279,-14713,-29289,-14693,-29299,-14673,-29309,-14653,-29319,-14633,-29329,-14613,-29339,-14593,-29349,-14573,-29359,-14553,-29369,-14533,-29378,-14513,-29388,-14493,-29398,-14473,-29408,-14453,-29418,-14433,-29428,-14413,-29438,-14393,-29447,-14373,-29457,-14353,-29467,-14332,-29477,-14312,-29486,-14292,-29496,-14272,-29506,-14252,-29516,-14232,-29525,-14212,-29535,-14192,-29545,-14172,-29554,-14151,-29564,-14131,-29574,-14111,-29583,-14091,-29593,-14071,-29602,-14051,-29612,-14030,-29622,-14010,-29631,-13990,-29641,-13970,-29650,-13950,-29660,-13929,-29669,-13909,-29679,-13889,-29688,-13869,-29697,-13848,-29707,-13828,-29716,-13808,-29726,-13788,-29735,-13767,-29745,-13747,-29754,-13727,-29763,-13707,-29773,-13686,-29782,-13666,-29791,-13646,-29801,-13625,-29810,-13605,-29819,-13585,-29828,-13564,-29838,-13544,-29847,-13524,-29856,-13503,-29865,-13483,-29874,-13463,-29884,-13442,-29893,-13422,-29902,-13401,-29911,-13381,-29920,-13361,-29929,-13340,-29938,-13320,-29947,-13299,-29956,-13279,-29965,-13259,-29974,-13238,-29984,-13218,-29993,-13197,-30002,-13177,-30010,-13156,-30019,-13136,-30028,-13115,-30037,-13095,-30046,-13075,-30055,-13054,-30064,-13034,-30073,-13013,-30082,-12993,-30091,-12972,-30099,-12951,-30108,-12931,-30117,-12910,-30126,-12890,-30135,-12869,-30143,-12849,-30152,-12828,-30161,-12808,-30170,-12787,-30178,-12767,-30187,-12746,-30196,-12725,-30204,-12705,-30213,-12684,-30222,-12664,-30230,-12643,-30239,-12622,-30248,-12602,-30256,-12581,-30265,-12561,-30273,-12540,-30282,-12519,-30290,-12499,-30299,-12478,-30307,-12457,-30316,-12437,-30324,-12416,-30333,-12395,-30341,-12375,-30350,-12354,-30358,-12333,-30366,-12313,-30375,-12292,-30383,-12271,-30392,-12250,-30400,-12230,-30408,-12209,-30417,-12188,-30425,-12167,-30433,-12147,-30441,-12126,-30450,-12105,-30458,-12084,-30466,-12064,-30474,-12043,-30483,-12022,-30491,-12001,-30499,-11981,-30507,-11960,-30515,-11939,-30523,-11918,-30531,-11897,-30540,-11877,-30548,-11856,-30556,-11835,-30564,-11814,-30572,-11793,-30580,-11772,-30588,-11751,-30596,-11731,-30604,-11710,-30612,-11689,-30620,-11668,-30628,-11647,-30636,-11626,-30644,-11605,-30652,-11584,-30659,-11564,-30667,-11543,-30675,-11522,-30683,-11501,-30691,-11480,-30699,-11459,-30706,-11438,-30714,-11417,-30722,-11396,-30730,-11375,-30738,-11354,-30745,-11333,-30753,-11312,-30761,-11291,-30768,-11270,-30776,-11249,-30784,-11228,-30791,-11207,-30799,-11186,-30807,-11165,-30814,-11144,-30822,-11123,-30829,-11102,-30837,-11081,-30845,-11060,-30852,-11039,-30860,-11018,-30867,-10997,-30875,-10976,-30882,-10955,-30890,-10934,-30897,-10913,-30904,-10892,-30912,-10871,-30919,-10850,-30927,-10829,-30934,-10808,-30941,-10787,-30949,-10766,-30956,-10744,-30963,-10723,-30971,-10702,-30978,-10681,-30985,-10660,-30992,-10639,-31000,-10618,-31007,-10597,-31014,-10575,-31021,-10554,-31029,-10533,-31036,-10512,-31043,-10491,-31050,-10470,-31057,-10448,-31064,-10427,-31071,-10406,-31078,-10385,-31086,-10364,-31093,-10343,-31100,-10321,-31107,-10300,-31114,-10279,-31121,-10258,-31128,-10236,-31135,-10215,-31142,-10194,-31149,-10173,-31155,-10152,-31162,-10130,-31169,-10109,-31176,-10088,-31183,-10067,-31190,-10045,-31197,-10024,-31204,-10003,-31210,-9981,-31217,-9960,-31224,-9939,-31231,-9918,-31237,-9896,-31244,-9875,-31251,-9854,-31258,-9832,-31264,-9811,-31271,-9790,-31278,-9768,-31284,-9747,-31291,-9726,-31298,-9704,-31304,-9683,-31311,-9662,-31317,-9640,-31324,-9619,-31331,-9598,-31337,-9576,-31344,-9555,-31350,-9534,-31357,-9512,-31363,-9491,-31370,-9469,-31376,-9448,-31382,-9427,-31389,-9405,-31395,-9384,-31402,-9363,-31408,-9341,-31414,-9320,-31421,-9298,-31427,-9277,-31433,-9255,-31440,-9234,-31446,-9213,-31452,-9191,-31458,-9170,-31465,-9148,-31471,-9127,-31477,-9105,-31483,-9084,-31490,-9062,-31496,-9041,-31502,-9019,-31508,-8998,-31514,-8976,-31520,-8955,-31526,-8933,-31532,-8912,-31538,-8890,-31545,-8869,-31551,-8847,-31557,-8826,-31563,-8804,-31569,-8783,-31575,-8761,-31581,-8740,-31587,-8718,-31592,-8697,-31598,-8675,-31604,-8654,-31610,-8632,-31616,-8611,-31622,-8589,-31628,-8568,-31634,-8546,-31639,-8524,-31645,-8503,-31651,-8481,-31657,-8460,-31663,-8438,-31668,-8416,-31674,-8395,-31680,-8373,-31685,-8352,-31691,-8330,-31697,-8308,-31702,-8287,-31708,-8265,-31714,-8244,-31719,-8222,-31725,-8200,-31730,-8179,-31736,-8157,-31742,-8135,-31747,-8114,-31753,-8092,-31758,-8071,-31764,-8049,-31769,-8027,-31775,-8006,-31780,-7984,-31786,-7962,-31791,-7941,-31796,-7919,-31802,-7897,-31807,-7876,-31812,-7854,-31818,-7832,-31823,-7810,-31828,-7789,-31834,-7767,-31839,-7745,-31844,-7724,-31850,-7702,-31855,-7680,-31860,-7658,-31865,-7637,-31870,-7615,-31876,-7593,-31881,-7572,-31886,-7550,-31891,-7528,-31896,-7506,-31901,-7485,-31906,-7463,-31912,-7441,-31917,-7419,-31922,-7398,-31927,-7376,-31932,-7354,-31937,-7332,-31942,-7311,-31947,-7289,-31952,-7267,-31957,-7245,-31962,-7223,-31966,-7202,-31971,-7180,-31976,-7158,-31981,-7136,-31986,-7114,-31991,-7093,-31996,-7071,-32000,-7049,-32005,-7027,-32010,-7005,-32015,-6983,-32020,-6962,-32024,-6940,-32029,-6918,-32034,-6896,-32038,-6874,-32043,-6852,-32048,-6831,-32052,-6809,-32057,-6787,-32062,-6765,-32066,-6743,-32071,-6721,-32075,-6699,-32080,-6678,-32085,-6656,-32089,-6634,-32094,-6612,-32098,-6590,-32103,-6568,-32107,-6546,-32111,-6524,-32116,-6503,-32120,-6481,-32125,-6459,-32129,-6437,-32134,-6415,-32138,-6393,-32142,-6371,-32147,-6349,-32151,-6327,-32155,-6305,-32159,-6283,-32164,-6262,-32168,-6240,-32172,-6218,-32177,-6196,-32181,-6174,-32185,-6152,-32189,-6130,-32193,-6108,-32197,-6086,-32202,-6064,-32206,-6042,-32210,-6020,-32214,-5998,-32218,-5976,-32222,-5954,-32226,-5932,-32230,-5910,-32234,-5888,-32238,-5866,-32242,-5844,-32246,-5822,-32250,-5800,-32254,-5778,-32258,-5756,-32262,-5734,-32266,-5712,-32270,-5690,-32274,-5668,-32277,-5646,-32281,-5624,-32285,-5602,-32289,-5580,-32293,-5558,-32296,-5536,-32300,-5514,-32304,-5492,-32308,-5470,-32311,-5448,-32315,-5426,-32319,-5404,-32323,-5382,-32326,-5360,-32330,-5338,-32333,-5316,-32337,-5294,-32341,-5272,-32344,-5250,-32348,-5228,-32351,-5206,-32355,-5184,-32358,-5162,-32362,-5140,-32365,-5118,-32369,-5095,-32372,-5073,-32376,-5051,-32379,-5029,-32383,-5007,-32386,-4985,-32390,-4963,-32393,-4941,-32396,-4919,-32400,-4897,-32403,-4875,-32406,-4853,-32410,-4831,-32413,-4808,-32416,-4786,-32419,-4764,-32423,-4742,-32426,-4720,-32429,-4698,-32432,-4676,-32435,-4654,-32439,-4632,-32442,-4609,-32445,-4587,-32448,-4565,-32451,-4543,-32454,-4521,-32457,-4499,-32460,-4477,-32463,-4455,-32466,-4432,-32469,-4410,-32472,-4388,-32475,-4366,-32478,-4344,-32481,-4322,-32484,-4300,-32487,-4277,-32490,-4255,-32493,-4233,-32496,-4211,-32499,-4189,-32502,-4167,-32504,-4145,-32507,-4122,-32510,-4100,-32513,-4078,-32516,-4056,-32518,-4034,-32521,-4012,-32524,-3989,-32527,-3967,-32529,-3945,-32532,-3923,-32535,-3901,-32537,-3878,-32540,-3856,-32542,-3834,-32545,-3812,-32548,-3790,-32550,-3768,-32553,-3745,-32555,-3723,-32558,-3701,-32560,-3679,-32563,-3657,-32565,-3634,-32568,-3612,-32570,-3590,-32573,-3568,-32575,-3546,-32578,-3523,-32580,-3501,-32582,-3479,-32585,-3457,-32587,-3434,-32589,-3412,-32592,-3390,-32594,-3368,-32596,-3346,-32599,-3323,-32601,-3301,-32603,-3279,-32605,-3257,-32608,-3234,-32610,-3212,-32612,-3190,-32614,-3168,-32616,-3146,-32618,-3123,-32620,-3101,-32623,-3079,-32625,-3057,-32627,-3034,-32629,-3012,-32631,-2990,-32633,-2968,-32635,-2945,-32637,-2923,-32639,-2901,-32641,-2879,-32643,-2856,-32645,-2834,-32647,-2812,-32649,-2790,-32650,-2767,-32652,-2745,-32654,-2723,-32656,-2701,-32658,-2678,-32660,-2656,-32662,-2634,-32663,-2611,-32665,-2589,-32667,-2567,-32669,-2545,-32670,-2522,-32672,-2500,-32674,-2478,-32675,-2456,-32677,-2433,-32679,-2411,-32680,-2389,-32682,-2366,-32684,-2344,-32685,-2322,-32687,-2300,-32688,-2277,-32690,-2255,-32691,-2233,-32693,-2210,-32694,-2188,-32696,-2166,-32697,-2144,-32699,-2121,-32700,-2099,-32702,-2077,-32703,-2054,-32704,-2032,-32706,-2010,-32707,-1987,-32709,-1965,-32710,-1943,-32711,-1921,-32712,-1898,-32714,-1876,-32715,-1854,-32716,-1831,-32718,-1809,-32719,-1787,-32720,-1764,-32721,-1742,-32722,-1720,-32724,-1698,-32725,-1675,-32726,-1653,-32727,-1631,-32728,-1608,-32729,-1586,-32730,-1564,-32731,-1541,-32732,-1519,-32733,-1497,-32734,-1474,-32735,-1452,-32736,-1430,-32737,-1407,-32738,-1385,-32739,-1363,-32740,-1340,-32741,-1318,-32742,-1296,-32743,-1274,-32744,-1251,-32744,-1229,-32745,-1207,-32746,-1184,-32747,-1162,-32748,-1140,-32748,-1117,-32749,-1095,-32750,-1073,-32751,-1050,-32751,-1028,-32752,-1006,-32753,-983,-32753,-961,-32754,-939,-32755,-916,-32755,-894,-32756,-872,-32757,-849,-32757,-827,-32758,-805,-32758,-782,-32759,-760,-32759,-738,-32760,-715,-32760,-693,-32761,-671,-32761,-648,-32762,-626,-32762,-604,-32762,-581,-32763,-559,-32763,-537,-32763,-514,-32764,-492,-32764,-470,-32764,-447,-32765,-425,-32765,-403,-32765,-380,-32766,-358,-32766,-336,-32766,-313,-32766,-291,-32766,-269,-32767,-246,-32767,-224,-32767,-202,-32767,-179,-32767,-157,-32767,-135,-32767,-112,-32767,-90,-32767,-68,-32767,-45,-32767,-23,-32767,-1,-32767,22,-32767,44,-32767,67,-32767,89,-32767,111,-32767,134,-32767,156,-32767,178,-32767,201,-32767,223,-32767,245,-32766,268,-32766,290,-32766,312,-32766,335,-32766,357,-32765,379,-32765,402,-32765,424,-32764,446,-32764,469,-32764,491,-32763,513,-32763,536,-32763,558,-32762,580,-32762,603,-32762,625,-32761,647,-32761,670,-32760,692,-32760,714,-32759,737,-32759,759,-32758,781,-32758,804,-32757,826,-32757,848,-32756,871,-32755,893,-32755,915,-32754,938,-32753,960,-32753,982,-32752,1005,-32751,1027,-32751,1049,-32750,1072,-32749,1094,-32748,1116,-32748,1139,-32747,1161,-32746,1183,-32745,1206,-32744,1228,-32744,1250,-32743,1273,-32742,1295,-32741,1317,-32740,1339,-32739,1362,-32738,1384,-32737,1406,-32736,1429,-32735,1451,-32734,1473,-32733,1496,-32732,1518,-32731,1540,-32730,1563,-32729,1585,-32728,1607,-32727,1630,-32726,1652,-32725,1674,-32724,1697,-32722,1719,-32721,1741,-32720,1763,-32719,1786,-32718,1808,-32716,1830,-32715,1853,-32714,1875,-32712,1897,-32711,1920,-32710,1942,-32709,1964,-32707,1986,-32706,2009,-32704,2031,-32703,2053,-32702,2076,-32700,2098,-32699,2120,-32697,2143,-32696,2165,-32694,2187,-32693,2209,-32691,2232,-32690,2254,-32688,2276,-32687,2299,-32685,2321,-32684,2343,-32682,2365,-32680,2388,-32679,2410,-32677,2432,-32675,2455,-32674,2477,-32672,2499,-32670,2521,-32669,2544,-32667,2566,-32665,2588,-32663,2610,-32662,2633,-32660,2655,-32658,2677,-32656,2700,-32654,2722,-32652,2744,-32650,2766,-32649,2789,-32647,2811,-32645,2833,-32643,2855,-32641,2878,-32639,2900,-32637,2922,-32635,2944,-32633,2967,-32631,2989,-32629,3011,-32627,3033,-32625,3056,-32623,3078,-32620,3100,-32618,3122,-32616,3145,-32614,3167,-32612,3189,-32610,3211,-32608,3233,-32605,3256,-32603,3278,-32601,3300,-32599,3322,-32596,3345,-32594,3367,-32592,3389,-32589,3411,-32587,3433,-32585,3456,-32582,3478,-32580,3500,-32578,3522,-32575,3545,-32573,3567,-32570,3589,-32568,3611,-32565,3633,-32563,3656,-32560,3678,-32558,3700,-32555,3722,-32553,3744,-32550,3767,-32548,3789,-32545,3811,-32542,3833,-32540,3855,-32537,3877,-32535,3900,-32532,3922,-32529,3944,-32527,3966,-32524,3988,-32521,4011,-32518,4033,-32516,4055,-32513,4077,-32510,4099,-32507,4121,-32504,4144,-32502,4166,-32499,4188,-32496,4210,-32493,4232,-32490,4254,-32487,4276,-32484,4299,-32481,4321,-32478,4343,-32475,4365,-32472,4387,-32469,4409,-32466,4431,-32463,4454,-32460,4476,-32457,4498,-32454,4520,-32451,4542,-32448,4564,-32445,4586,-32442,4608,-32439,4631,-32435,4653,-32432,4675,-32429,4697,-32426,4719,-32423,4741,-32419,4763,-32416,4785,-32413,4807,-32410,4830,-32406,4852,-32403,4874,-32400,4896,-32396,4918,-32393,4940,-32390,4962,-32386,4984,-32383,5006,-32379,5028,-32376,5050,-32372,5072,-32369,5094,-32365,5117,-32362,5139,-32358,5161,-32355,5183,-32351,5205,-32348,5227,-32344,5249,-32341,5271,-32337,5293,-32333,5315,-32330,5337,-32326,5359,-32323,5381,-32319,5403,-32315,5425,-32311,5447,-32308,5469,-32304,5491,-32300,5513,-32296,5535,-32293,5557,-32289,5579,-32285,5601,-32281,5623,-32277,5645,-32274,5667,-32270,5689,-32266,5711,-32262,5733,-32258,5755,-32254,5777,-32250,5799,-32246,5821,-32242,5843,-32238,5865,-32234,5887,-32230,5909,-32226,5931,-32222,5953,-32218,5975,-32214,5997,-32210,6019,-32206,6041,-32202,6063,-32197,6085,-32193,6107,-32189,6129,-32185,6151,-32181,6173,-32177,6195,-32172,6217,-32168,6239,-32164,6261,-32159,6282,-32155,6304,-32151,6326,-32147,6348,-32142,6370,-32138,6392,-32134,6414,-32129,6436,-32125,6458,-32120,6480,-32116,6502,-32111,6523,-32107,6545,-32103,6567,-32098,6589,-32094,6611,-32089,6633,-32085,6655,-32080,6677,-32075,6698,-32071,6720,-32066,6742,-32062,6764,-32057,6786,-32052,6808,-32048,6830,-32043,6851,-32038,6873,-32034,6895,-32029,6917,-32024,6939,-32020,6961,-32015,6982,-32010,7004,-32005,7026,-32000,7048,-31996,7070,-31991,7092,-31986,7113,-31981,7135,-31976,7157,-31971,7179,-31966,7201,-31962,7222,-31957,7244,-31952,7266,-31947,7288,-31942,7310,-31937,7331,-31932,7353,-31927,7375,-31922,7397,-31917,7418,-31912,7440,-31906,7462,-31901,7484,-31896,7505,-31891,7527,-31886,7549,-31881,7571,-31876,7592,-31870,7614,-31865,7636,-31860,7657,-31855,7679,-31850,7701,-31844,7723,-31839,7744,-31834,7766,-31828,7788,-31823,7809,-31818,7831,-31812,7853,-31807,7875,-31802,7896,-31796,7918,-31791,7940,-31786,7961,-31780,7983,-31775,8005,-31769,8026,-31764,8048,-31758,8070,-31753,8091,-31747,8113,-31742,8134,-31736,8156,-31730,8178,-31725,8199,-31719,8221,-31714,8243,-31708,8264,-31702,8286,-31697,8307,-31691,8329,-31685,8351,-31680,8372,-31674,8394,-31668,8415,-31663,8437,-31657,8459,-31651,8480,-31645,8502,-31639,8523,-31634,8545,-31628,8567,-31622,8588,-31616,8610,-31610,8631,-31604,8653,-31598,8674,-31592,8696,-31587,8717,-31581,8739,-31575,8760,-31569,8782,-31563,8803,-31557,8825,-31551,8846,-31545,8868,-31538,8889,-31532,8911,-31526,8932,-31520,8954,-31514,8975,-31508,8997,-31502,9018,-31496,9040,-31490,9061,-31483,9083,-31477,9104,-31471,9126,-31465,9147,-31458,9169,-31452,9190,-31446,9212,-31440,9233,-31433,9254,-31427,9276,-31421,9297,-31414,9319,-31408,9340,-31402,9362,-31395,9383,-31389,9404,-31382,9426,-31376,9447,-31370,9468,-31363,9490,-31357,9511,-31350,9533,-31344,9554,-31337,9575,-31331,9597,-31324,9618,-31317,9639,-31311,9661,-31304,9682,-31298,9703,-31291,9725,-31284,9746,-31278,9767,-31271,9789,-31264,9810,-31258,9831,-31251,9853,-31244,9874,-31237,9895,-31231,9917,-31224,9938,-31217,9959,-31210,9980,-31204,10002,-31197,10023,-31190,10044,-31183,10066,-31176,10087,-31169,10108,-31162,10129,-31155,10151,-31149,10172,-31142,10193,-31135,10214,-31128,10235,-31121,10257,-31114,10278,-31107,10299,-31100,10320,-31093,10342,-31086,10363,-31078,10384,-31071,10405,-31064,10426,-31057,10447,-31050,10469,-31043,10490,-31036,10511,-31029,10532,-31021,10553,-31014,10574,-31007,10596,-31000,10617,-30992,10638,-30985,10659,-30978,10680,-30971,10701,-30963,10722,-30956,10743,-30949,10765,-30941,10786,-30934,10807,-30927,10828,-30919,10849,-30912,10870,-30904,10891,-30897,10912,-30890,10933,-30882,10954,-30875,10975,-30867,10996,-30860,11017,-30852,11038,-30845,11059,-30837,11080,-30829,11101,-30822,11122,-30814,11143,-30807,11164,-30799,11185,-30791,11206,-30784,11227,-30776,11248,-30768,11269,-30761,11290,-30753,11311,-30745,11332,-30738,11353,-30730,11374,-30722,11395,-30714,11416,-30706,11437,-30699,11458,-30691,11479,-30683,11500,-30675,11521,-30667,11542,-30659,11563,-30652,11583,-30644,11604,-30636,11625,-30628,11646,-30620,11667,-30612,11688,-30604,11709,-30596,11730,-30588,11750,-30580,11771,-30572,11792,-30564,11813,-30556,11834,-30548,11855,-30540,11876,-30531,11896,-30523,11917,-30515,11938,-30507,11959,-30499,11980,-30491,12000,-30483,12021,-30474,12042,-30466,12063,-30458,12083,-30450,12104,-30441,12125,-30433,12146,-30425,12166,-30417,12187,-30408,12208,-30400,12229,-30392,12249,-30383,12270,-30375,12291,-30366,12312,-30358,12332,-30350,12353,-30341,12374,-30333,12394,-30324,12415,-30316,12436,-30307,12456,-30299,12477,-30290,12498,-30282,12518,-30273,12539,-30265,12560,-30256,12580,-30248,12601,-30239,12621,-30230,12642,-30222,12663,-30213,12683,-30204,12704,-30196,12724,-30187,12745,-30178,12766,-30170,12786,-30161,12807,-30152,12827,-30143,12848,-30135,12868,-30126,12889,-30117,12909,-30108,12930,-30099,12950,-30091,12971,-30082,12992,-30073,13012,-30064,13033,-30055,13053,-30046,13074,-30037,13094,-30028,13114,-30019,13135,-30010,13155,-30002,13176,-29993,13196,-29984,13217,-29974,13237,-29965,13258,-29956,13278,-29947,13298,-29938,13319,-29929,13339,-29920,13360,-29911,13380,-29902,13400,-29893,13421,-29884,13441,-29874,13462,-29865,13482,-29856,13502,-29847,13523,-29838,13543,-29828,13563,-29819,13584,-29810,13604,-29801,13624,-29791,13645,-29782,13665,-29773,13685,-29763,13706,-29754,13726,-29745,13746,-29735,13766,-29726,13787,-29716,13807,-29707,13827,-29697,13847,-29688,13868,-29679,13888,-29669,13908,-29660,13928,-29650,13949,-29641,13969,-29631,13989,-29622,14009,-29612,14029,-29602,14050,-29593,14070,-29583,14090,-29574,14110,-29564,14130,-29554,14150,-29545,14171,-29535,14191,-29525,14211,-29516,14231,-29506,14251,-29496,14271,-29486,14291,-29477,14311,-29467,14331,-29457,14352,-29447,14372,-29438,14392,-29428,14412,-29418,14432,-29408,14452,-29398,14472,-29388,14492,-29378,14512,-29369,14532,-29359,14552,-29349,14572,-29339,14592,-29329,14612,-29319,14632,-29309,14652,-29299,14672,-29289,14692,-29279,14712,-29269,14732,-29259,14752,-29249,14772,-29239,14792,-29228,14812,-29218,14832,-29208,14852,-29198,14871,-29188,14891,-29178,14911,-29168,14931,-29157,14951,-29147,14971,-29137,14991,-29127,15011,-29117,15030,-29106,15050,-29096,15070,-29086,15090,-29075,15110,-29065,15130,-29055,15149,-29045,15169,-29034,15189,-29024,15209,-29013,15229,-29003,15248,-28993,15268,-28982,15288,-28972,15308,-28961,15327,-28951,15347,-28940,15367,-28930,15387,-28919,15406,-28909,15426,-28898,15446,-28888,15465,-28877,15485,-28867,15505,-28856,15525,-28846,15544,-28835,15564,-28824,15583,-28814,15603,-28803,15623,-28792,15642,-28782,15662,-28771,15682,-28760,15701,-28750,15721,-28739,15740,-28728,15760,-28717,15780,-28707,15799,-28696,15819,-28685,15838,-28674,15858,-28663,15877,-28653,15897,-28642,15917,-28631,15936,-28620,15956,-28609,15975,-28598,15995,-28587,16014,-28576,16034,-28566,16053,-28555,16072,-28544,16092,-28533,16111,-28522,16131,-28511,16150,-28500,16170,-28489,16189,-28478,16209,-28466,16228,-28455,16247,-28444,16267,-28433,16286,-28422,16306,-28411,16325,-28400,16344,-28389,16364,-28378,16383,-28366,16402,-28355,16422,-28344,16441,-28333,16460,-28322,16480,-28310,16499,-28299,16518,-28288,16538,-28276,16557,-28265,16576,-28254,16595,-28243,16615,-28231,16634,-28220,16653,-28209,16672,-28197,16692,-28186,16711,-28174,16730,-28163,16749,-28152,16768,-28140,16788,-28129,16807,-28117,16826,-28106,16845,-28094,16864,-28083,16883,-28071,16903,-28060,16922,-28048,16941,-28037,16960,-28025,16979,-28013,16998,-28002,17017,-27990,17036,-27979,17055,-27967,17074,-27955,17094,-27944,17113,-27932,17132,-27920,17151,-27909,17170,-27897,17189,-27885,17208,-27873,17227,-27862,17246,-27850,17265,-27838,17284,-27826,17303,-27815,17322,-27803,17341,-27791,17360,-27779,17379,-27767,17397,-27755,17416,-27743,17435,-27732,17454,-27720,17473,-27708,17492,-27696,17511,-27684,17530,-27672,17549,-27660,17567,-27648,17586,-27636,17605,-27624,17624,-27612,17643,-27600,17662,-27588,17680,-27576,17699,-27564,17718,-27552,17737,-27539,17756,-27527,17774,-27515,17793,-27503,17812,-27491,17831,-27479,17849,-27467,17868,-27454,17887,-27442,17906,-27430,17924,-27418,17943,-27406,17962,-27393,17980,-27381,17999,-27369,18018,-27356,18036,-27344,18055,-27332,18074,-27320,18092,-27307,18111,-27295,18130,-27282,18148,-27270,18167,-27258,18185,-27245,18204,-27233,18222,-27220,18241,-27208,18260,-27196,18278,-27183,18297,-27171,18315,-27158,18334,-27146,18352,-27133,18371,-27121,18389,-27108,18408,-27095,18426,-27083,18445,-27070,18463,-27058,18482,-27045,18500,-27032,18518,-27020,18537,-27007,18555,-26995,18574,-26982,18592,-26969,18610,-26956,18629,-26944,18647,-26931,18666,-26918,18684,-26906,18702,-26893,18721,-26880,18739,-26867,18757,-26854,18776,-26842,18794,-26829,18812,-26816,18830,-26803,18849,-26790,18867,-26777,18885,-26765,18904,-26752,18922,-26739,18940,-26726,18958,-26713,18976,-26700,18995,-26687,19013,-26674,19031,-26661,19049,-26648,19067,-26635,19086,-26622,19104,-26609,19122,-26596,19140,-26583,19158,-26570,19176,-26557,19194,-26544,19212,-26531,19231,-26517,19249,-26504,19267,-26491,19285,-26478,19303,-26465,19321,-26452,19339,-26438,19357,-26425,19375,-26412,19393,-26399,19411,-26386,19429,-26372,19447,-26359,19465,-26346,19483,-26333,19501,-26319,19519,-26306,19537,-26293,19555,-26279,19573,-26266,19590,-26253,19608,-26239,19626,-26226,19644,-26212,19662,-26199,19680,-26186,19698,-26172,19716,-26159,19733,-26145,19751,-26132,19769,-26118,19787,-26105,19805,-26091,19822,-26078,19840,-26064,19858,-26051,19876,-26037,19894,-26023,19911,-26010,19929,-25996,19947,-25983,19965,-25969,19982,-25955,20000,-25942,20018,-25928,20035,-25914,20053,-25901,20071,-25887,20088,-25873,20106,-25860,20124,-25846,20141,-25832,20159,-25818,20176,-25805,20194,-25791,20212,-25777,20229,-25763,20247,-25750,20264,-25736,20282,-25722,20299,-25708,20317,-25694,20334,-25680,20352,-25666,20369,-25653,20387,-25639,20404,-25625,20422,-25611,20439,-25597,20457,-25583,20474,-25569,20492,-25555,20509,-25541,20527,-25527,20544,-25513,20561,-25499,20579,-25485,20596,-25471,20613,-25457,20631,-25443,20648,-25429,20666,-25415,20683,-25400,20700,-25386,20718,-25372,20735,-25358,20752,-25344,20769,-25330,20787,-25316,20804,-25301,20821,-25287,20838,-25273,20856,-25259,20873,-25244,20890,-25230,20907,-25216,20925,-25202,20942,-25187,20959,-25173,20976,-25159,20993,-25145,21010,-25130,21027,-25116,21045,-25101,21062,-25087,21079,-25073,21096,-25058,21113,-25044,21130,-25030,21147,-25015,21164,-25001,21181,-24986,21198,-24972,21215,-24957,21232,-24943,21249,-24928,21266,-24914,21283,-24899,21300,-24885,21317,-24870,21334,-24856,21351,-24841,21368,-24827,21385,-24812,21402,-24797,21419,-24783,21436,-24768,21453,-24754,21470,-24739,21486,-24724,21503,-24710,21520,-24695,21537,-24680,21554,-24665,21571,-24651,21587,-24636,21604,-24621,21621,-24607,21638,-24592,21655,-24577,21671,-24562,21688,-24547,21705,-24533,21722,-24518,21738,-24503,21755,-24488,21772,-24473,21788,-24458,21805,-24444,21822,-24429,21838,-24414,21855,-24399,21872,-24384,21888,-24369,21905,-24354,21922,-24339,21938,-24324,21955,-24309,21971,-24294,21988,-24279,22004,-24264,22021,-24249,22038,-24234,22054,-24219,22071,-24204,22087,-24189,22104,-24174,22120,-24159,22137,-24144,22153,-24129,22169,-24114,22186,-24098,22202,-24083,22219,-24068,22235,-24053,22252,-24038,22268,-24023,22284,-24007,22301,-23992,22317,-23977,22333,-23962,22350,-23946,22366,-23931,22382,-23916,22399,-23901,22415,-23885,22431,-23870,22448,-23855,22464,-23839,22480,-23824,22496,-23809,22513,-23793,22529,-23778,22545,-23763,22561,-23747,22577,-23732,22594,-23716,22610,-23701,22626,-23686,22642,-23670,22658,-23655,22674,-23639,22691,-23624,22707,-23608,22723,-23593,22739,-23577,22755,-23562,22771,-23546,22787,-23531,22803,-23515,22819,-23500,22835,-23484,22851,-23468,22867,-23453,22883,-23437,22899,-23422,22915,-23406,22931,-23390,22947,-23375,22963,-23359,22979,-23343,22995,-23328,23011,-23312,23027,-23296,23043,-23281,23058,-23265,23074,-23249,23090,-23233,23106,-23218,23122,-23202,23138,-23186,23153,-23170,23169,-23154,23185,-23139,23201,-23123,23217,-23107,23232,-23091,23248,-23075,23264,-23059,23280,-23044,23295,-23028,23311,-23012,23327,-22996,23342,-22980,23358,-22964,23374,-22948,23389,-22932,23405,-22916,23421,-22900,23436,-22884,23452,-22868,23467,-22852,23483,-22836,23499,-22820,23514,-22804,23530,-22788,23545,-22772,23561,-22756,23576,-22740,23592,-22724,23607,-22708,23623,-22692,23638,-22675,23654,-22659,23669,-22643,23685,-22627,23700,-22611,23715,-22595,23731,-22578,23746,-22562,23762,-22546,23777,-22530,23792,-22514,23808,-22497,23823,-22481,23838,-22465,23854,-22449,23869,-22432,23884,-22416,23900,-22400,23915,-22383,23930,-22367,23945,-22351,23961,-22334,23976,-22318,23991,-22302,24006,-22285,24022,-22269,24037,-22253,24052,-22236,24067,-22220,24082,-22203,24097,-22187,24113,-22170,24128,-22154,24143,-22138,24158,-22121,24173,-22105,24188,-22088,24203,-22072,24218,-22055,24233,-22039,24248,-22022,24263,-22005,24278,-21989,24293,-21972,24308,-21956,24323,-21939,24338,-21923,24353,-21906,24368,-21889,24383,-21873,24398,-21856,24413,-21839,24428,-21823,24443,-21806,24457,-21789,24472,-21773,24487,-21756,24502,-21739,24517,-21723,24532,-21706,24546,-21689,24561,-21672,24576,-21656,24591,-21639,24606,-21622,24620,-21605,24635,-21588,24650,-21572,24664,-21555,24679,-21538,24694,-21521,24709,-21504,24723,-21487,24738,-21471,24753,-21454,24767,-21437,24782,-21420,24796,-21403,24811,-21386,24826,-21369,24840,-21352,24855,-21335,24869,-21318,24884,-21301,24898,-21284,24913,-21267,24927,-21250,24942,-21233,24956,-21216,24971,-21199,24985,-21182,25000,-21165,25014,-21148,25029,-21131,25043,-21114,25057,-21097,25072,-21080,25086,-21063,25100,-21046,25115,-21028,25129,-21011,25144,-20994,25158,-20977,25172,-20960,25186,-20943,25201,-20926,25215,-20908,25229,-20891,25243,-20874,25258,-20857,25272,-20839,25286,-20822,25300,-20805,25315,-20788,25329,-20770,25343,-20753,25357,-20736,25371,-20719,25385,-20701,25399,-20684,25414,-20667,25428,-20649,25442,-20632,25456,-20614,25470,-20597,25484,-20580,25498,-20562,25512,-20545,25526,-20528,25540,-20510,25554,-20493,25568,-20475,25582,-20458,25596,-20440,25610,-20423,25624,-20405,25638,-20388,25652,-20370,25665,-20353,25679,-20335,25693,-20318,25707,-20300,25721,-20283,25735,-20265,25749,-20248,25762,-20230,25776,-20213,25790,-20195,25804,-20177,25817,-20160,25831,-20142,25845,-20125,25859,-20107,25872,-20089,25886,-20072,25900,-20054,25913,-20036,25927,-20019,25941,-20001,25954,-19983,25968,-19966,25982,-19948,25995,-19930,26009,-19912,26022,-19895,26036,-19877,26050,-19859,26063,-19841,26077,-19823,26090,-19806,26104,-19788,26117,-19770,26131,-19752,26144,-19734,26158,-19717,26171,-19699,26185,-19681,26198,-19663,26211,-19645,26225,-19627,26238,-19609,26252,-19591,26265,-19574,26278,-19556,26292,-19538,26305,-19520,26318,-19502,26332,-19484,26345,-19466,26358,-19448,26371,-19430,26385,-19412,26398,-19394,26411,-19376,26424,-19358,26437,-19340,26451,-19322,26464,-19304,26477,-19286,26490,-19268,26503,-19250,26516,-19232,26530,-19213,26543,-19195,26556,-19177,26569,-19159,26582,-19141,26595,-19123,26608,-19105,26621,-19087,26634,-19068,26647,-19050,26660,-19032,26673,-19014,26686,-18996,26699,-18977,26712,-18959,26725,-18941,26738,-18923,26751,-18905,26764,-18886,26776,-18868,26789,-18850,26802,-18831,26815,-18813,26828,-18795,26841,-18777,26853,-18758,26866,-18740,26879,-18722,26892,-18703,26905,-18685,26917,-18667,26930,-18648,26943,-18630,26955,-18611,26968,-18593,26981,-18575,26994,-18556,27006,-18538,27019,-18519,27031,-18501,27044,-18483,27057,-18464,27069,-18446,27082,-18427,27094,-18409,27107,-18390,27120,-18372,27132,-18353,27145,-18335,27157,-18316,27170,-18298,27182,-18279,27195,-18261,27207,-18242,27219,-18223,27232,-18205,27244,-18186,27257,-18168,27269,-18149,27281,-18131,27294,-18112,27306,-18093,27319,-18075,27331,-18056,27343,-18037,27355,-18019,27368,-18000,27380,-17981,27392,-17963,27405,-17944,27417,-17925,27429,-17907,27441,-17888,27453,-17869,27466,-17850,27478,-17832,27490,-17813,27502,-17794,27514,-17775,27526,-17757,27538,-17738,27551,-17719,27563,-17700,27575,-17681,27587,-17663,27599,-17644,27611,-17625,27623,-17606,27635,-17587,27647,-17568,27659,-17550,27671,-17531,27683,-17512,27695,-17493,27707,-17474,27719,-17455,27731,-17436,27742,-17417,27754,-17398,27766,-17380,27778,-17361,27790,-17342,27802,-17323,27814,-17304,27825,-17285,27837,-17266,27849,-17247,27861,-17228,27872,-17209,27884,-17190,27896,-17171,27908,-17152,27919,-17133,27931,-17114,27943,-17095,27954,-17075,27966,-17056,27978,-17037,27989,-17018,28001,-16999,28012,-16980,28024,-16961,28036,-16942,28047,-16923,28059,-16904,28070,-16884,28082,-16865,28093,-16846,28105,-16827,28116,-16808,28128,-16789,28139,-16769,28151,-16750,28162,-16731,28173,-16712,28185,-16693,28196,-16673,28208,-16654,28219,-16635,28230,-16616,28242,-16596,28253,-16577,28264,-16558,28275,-16539,28287,-16519,28298,-16500,28309,-16481,28321,-16461,28332,-16442,28343,-16423,28354,-16403,28365}; diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h deleted file mode 100644 index 34fc59d7796a54a9aafb230ddcfa7c02dd0057c9..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:8191)/24576)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:16382)/24576)); -twa2 = zeros(1,16384); -twb2 = zeros(1,16384); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); - - -*/ - -int16_t twa24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; - -int16_t twb24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386,-16384,-28378,-16399,-28369,-16413,-28361,-16428,-28352,-16442,-28344,-16456,-28336,-16471,-28327,-16485,-28319,-16500,-28310,-16514,-28302,-16529,-28293,-16543,-28285,-16558,-28276,-16572,-28268,-16587,-28260,-16601,-28251,-16616,-28243,-16630,-28234,-16644,-28226,-16659,-28217,-16673,-28209,-16688,-28200,-16702,-28191,-16717,-28183,-16731,-28174,-16745,-28166,-16760,-28157,-16774,-28149,-16789,-28140,-16803,-28132,-16817,-28123,-16832,-28114,-16846,-28106,-16860,-28097,-16875,-28088,-16889,-28080,-16904,-28071,-16918,-28063,-16932,-28054,-16947,-28045,-16961,-28037,-16975,-28028,-16990,-28019,-17004,-28010,-17018,-28002,-17033,-27993,-17047,-27984,-17061,-27976,-17075,-27967,-17090,-27958,-17104,-27949,-17118,-27941,-17133,-27932,-17147,-27923,-17161,-27914,-17175,-27906,-17190,-27897,-17204,-27888,-17218,-27879,-17233,-27870,-17247,-27862,-17261,-27853,-17275,-27844,-17289,-27835,-17304,-27826,-17318,-27817,-17332,-27809,-17346,-27800,-17361,-27791,-17375,-27782,-17389,-27773,-17403,-27764,-17417,-27755,-17432,-27746,-17446,-27737,-17460,-27729,-17474,-27720,-17488,-27711,-17502,-27702,-17517,-27693,-17531,-27684,-17545,-27675,-17559,-27666,-17573,-27657,-17587,-27648,-17601,-27639,-17616,-27630,-17630,-27621,-17644,-27612,-17658,-27603,-17672,-27594,-17686,-27585,-17700,-27576,-17714,-27567,-17728,-27558,-17743,-27549,-17757,-27539,-17771,-27530,-17785,-27521,-17799,-27512,-17813,-27503,-17827,-27494,-17841,-27485,-17855,-27476,-17869,-27467,-17883,-27457,-17897,-27448,-17911,-27439,-17925,-27430,-17939,-27421,-17953,-27412,-17967,-27402,-17981,-27393,-17995,-27384,-18009,-27375,-18023,-27366,-18037,-27356,-18051,-27347,-18065,-27338,-18079,-27329,-18093,-27320,-18107,-27310,-18121,-27301,-18135,-27292,-18149,-27282,-18163,-27273,-18177,-27264,-18191,-27255,-18205,-27245,-18219,-27236,-18233,-27227,-18247,-27217,-18261,-27208,-18274,-27199,-18288,-27189,-18302,-27180,-18316,-27171,-18330,-27161,-18344,-27152,-18358,-27142,-18372,-27133,-18386,-27124,-18399,-27114,-18413,-27105,-18427,-27095,-18441,-27086,-18455,-27077,-18469,-27067,-18483,-27058,-18496,-27048,-18510,-27039,-18524,-27029,-18538,-27020,-18552,-27010,-18565,-27001,-18579,-26991,-18593,-26982,-18607,-26972,-18621,-26963,-18634,-26953,-18648,-26944,-18662,-26934,-18676,-26925,-18690,-26915,-18703,-26906,-18717,-26896,-18731,-26886,-18745,-26877,-18758,-26867,-18772,-26858,-18786,-26848,-18799,-26838,-18813,-26829,-18827,-26819,-18841,-26810,-18854,-26800,-18868,-26790,-18882,-26781,-18895,-26771,-18909,-26761,-18923,-26752,-18936,-26742,-18950,-26732,-18964,-26723,-18977,-26713,-18991,-26703,-19005,-26693,-19018,-26684,-19032,-26674,-19046,-26664,-19059,-26655,-19073,-26645,-19087,-26635,-19100,-26625,-19114,-26616,-19127,-26606,-19141,-26596,-19155,-26586,-19168,-26576,-19182,-26567,-19195,-26557,-19209,-26547,-19222,-26537,-19236,-26527,-19250,-26517,-19263,-26508,-19277,-26498,-19290,-26488,-19304,-26478,-19317,-26468,-19331,-26458,-19344,-26448,-19358,-26438,-19371,-26429,-19385,-26419,-19398,-26409,-19412,-26399,-19425,-26389,-19439,-26379,-19452,-26369,-19466,-26359,-19479,-26349,-19493,-26339,-19506,-26329,-19520,-26319,-19533,-26309,-19547,-26299,-19560,-26289,-19574,-26279,-19587,-26269,-19600,-26259,-19614,-26249,-19627,-26239,-19641,-26229,-19654,-26219,-19668,-26209,-19681,-26199,-19694,-26189,-19708,-26179,-19721,-26169,-19734,-26159,-19748,-26149,-19761,-26138,-19775,-26128,-19788,-26118,-19801,-26108,-19815,-26098,-19828,-26088,-19841,-26078,-19855,-26068,-19868,-26057,-19881,-26047,-19895,-26037,-19908,-26027,-19921,-26017,-19934,-26007,-19948,-25996,-19961,-25986,-19974,-25976,-19988,-25966,-20001,-25955,-20014,-25945,-20027,-25935,-20041,-25925,-20054,-25914,-20067,-25904,-20080,-25894,-20094,-25884,-20107,-25873,-20120,-25863,-20133,-25853,-20147,-25843,-20160,-25832,-20173,-25822,-20186,-25812,-20199,-25801,-20213,-25791,-20226,-25781,-20239,-25770,-20252,-25760,-20265,-25750,-20278,-25739,-20292,-25729,-20305,-25718,-20318,-25708,-20331,-25698,-20344,-25687,-20357,-25677,-20370,-25666,-20384,-25656,-20397,-25646,-20410,-25635,-20423,-25625,-20436,-25614,-20449,-25604,-20462,-25593,-20475,-25583,-20488,-25572,-20501,-25562,-20514,-25551,-20528,-25541,-20541,-25530,-20554,-25520,-20567,-25509,-20580,-25499,-20593,-25488,-20606,-25478,-20619,-25467,-20632,-25457,-20645,-25446,-20658,-25436,-20671,-25425,-20684,-25415,-20697,-25404,-20710,-25393,-20723,-25383,-20736,-25372,-20749,-25362,-20762,-25351,-20775,-25340,-20788,-25330,-20801,-25319,-20814,-25308,-20826,-25298,-20839,-25287,-20852,-25277,-20865,-25266,-20878,-25255,-20891,-25244,-20904,-25234,-20917,-25223,-20930,-25212,-20943,-25202,-20956,-25191,-20968,-25180,-20981,-25170,-20994,-25159,-21007,-25148,-21020,-25137,-21033,-25127,-21046,-25116,-21058,-25105,-21071,-25094,-21084,-25084,-21097,-25073,-21110,-25062,-21123,-25051,-21135,-25040,-21148,-25030,-21161,-25019,-21174,-25008,-21187,-24997,-21199,-24986,-21212,-24975,-21225,-24965,-21238,-24954,-21250,-24943,-21263,-24932,-21276,-24921,-21289,-24910,-21301,-24899,-21314,-24888,-21327,-24878,-21340,-24867,-21352,-24856,-21365,-24845,-21378,-24834,-21390,-24823,-21403,-24812,-21416,-24801,-21428,-24790,-21441,-24779,-21454,-24768,-21466,-24757,-21479,-24746,-21492,-24735,-21504,-24724,-21517,-24713,-21530,-24702,-21542,-24691,-21555,-24680,-21567,-24669,-21580,-24658,-21593,-24647,-21605,-24636,-21618,-24625,-21630,-24614,-21643,-24603,-21656,-24592,-21668,-24581,-21681,-24570,-21693,-24559,-21706,-24547,-21718,-24536,-21731,-24525,-21744,-24514,-21756,-24503,-21769,-24492,-21781,-24481,-21794,-24470,-21806,-24458,-21819,-24447,-21831,-24436,-21844,-24425,-21856,-24414,-21869,-24403,-21881,-24391,-21894,-24380,-21906,-24369,-21918,-24358,-21931,-24347,-21943,-24335,-21956,-24324,-21968,-24313,-21981,-24302,-21993,-24290,-22005,-24279,-22018,-24268,-22030,-24257,-22043,-24245,-22055,-24234,-22067,-24223,-22080,-24212,-22092,-24200,-22105,-24189,-22117,-24178,-22129,-24166,-22142,-24155,-22154,-24144,-22166,-24132,-22179,-24121,-22191,-24110,-22203,-24098,-22216,-24087,-22228,-24076,-22240,-24064,-22253,-24053,-22265,-24042,-22277,-24030,-22289,-24019,-22302,-24007,-22314,-23996,-22326,-23985,-22339,-23973,-22351,-23962,-22363,-23950,-22375,-23939,-22388,-23927,-22400,-23916,-22412,-23904,-22424,-23893,-22436,-23882,-22449,-23870,-22461,-23859,-22473,-23847,-22485,-23836,-22497,-23824,-22510,-23813,-22522,-23801,-22534,-23790,-22546,-23778,-22558,-23767,-22570,-23755,-22583,-23743,-22595,-23732,-22607,-23720,-22619,-23709,-22631,-23697,-22643,-23686,-22655,-23674,-22667,-23662,-22679,-23651,-22692,-23639,-22704,-23628,-22716,-23616,-22728,-23604,-22740,-23593,-22752,-23581,-22764,-23570,-22776,-23558,-22788,-23546,-22800,-23535,-22812,-23523,-22824,-23511,-22836,-23500,-22848,-23488,-22860,-23476,-22872,-23465,-22884,-23453,-22896,-23441,-22908,-23429,-22920,-23418,-22932,-23406,-22944,-23394,-22956,-23383,-22968,-23371,-22980,-23359,-22992,-23347,-23004,-23336,-23016,-23324,-23028,-23312,-23040,-23300,-23051,-23288,-23063,-23277,-23075,-23265,-23087,-23253,-23099,-23241,-23111,-23229,-23123,-23218,-23135,-23206,-23147,-23194,-23158,-23182,-23170,-23170,-23182,-23158,-23194,-23147,-23206,-23135,-23218,-23123,-23229,-23111,-23241,-23099,-23253,-23087,-23265,-23075,-23277,-23063,-23288,-23051,-23300,-23040,-23312,-23028,-23324,-23016,-23336,-23004,-23347,-22992,-23359,-22980,-23371,-22968,-23383,-22956,-23394,-22944,-23406,-22932,-23418,-22920,-23429,-22908,-23441,-22896,-23453,-22884,-23465,-22872,-23476,-22860,-23488,-22848,-23500,-22836,-23511,-22824,-23523,-22812,-23535,-22800,-23546,-22788,-23558,-22776,-23570,-22764,-23581,-22752,-23593,-22740,-23604,-22728,-23616,-22716,-23628,-22704,-23639,-22692,-23651,-22679,-23662,-22667,-23674,-22655,-23686,-22643,-23697,-22631,-23709,-22619,-23720,-22607,-23732,-22595,-23743,-22583,-23755,-22570,-23767,-22558,-23778,-22546,-23790,-22534,-23801,-22522,-23813,-22510,-23824,-22497,-23836,-22485,-23847,-22473,-23859,-22461,-23870,-22449,-23882,-22436,-23893,-22424,-23904,-22412,-23916,-22400,-23927,-22388,-23939,-22375,-23950,-22363,-23962,-22351,-23973,-22339,-23985,-22326,-23996,-22314,-24007,-22302,-24019,-22289,-24030,-22277,-24042,-22265,-24053,-22253,-24064,-22240,-24076,-22228,-24087,-22216,-24098,-22203,-24110,-22191,-24121,-22179,-24132,-22166,-24144,-22154,-24155,-22142,-24166,-22129,-24178,-22117,-24189,-22105,-24200,-22092,-24212,-22080,-24223,-22067,-24234,-22055,-24245,-22043,-24257,-22030,-24268,-22018,-24279,-22005,-24290,-21993,-24302,-21981,-24313,-21968,-24324,-21956,-24335,-21943,-24347,-21931,-24358,-21918,-24369,-21906,-24380,-21894,-24391,-21881,-24403,-21869,-24414,-21856,-24425,-21844,-24436,-21831,-24447,-21819,-24458,-21806,-24470,-21794,-24481,-21781,-24492,-21769,-24503,-21756,-24514,-21744,-24525,-21731,-24536,-21718,-24547,-21706,-24559,-21693,-24570,-21681,-24581,-21668,-24592,-21656,-24603,-21643,-24614,-21630,-24625,-21618,-24636,-21605,-24647,-21593,-24658,-21580,-24669,-21567,-24680,-21555,-24691,-21542,-24702,-21530,-24713,-21517,-24724,-21504,-24735,-21492,-24746,-21479,-24757,-21466,-24768,-21454,-24779,-21441,-24790,-21428,-24801,-21416,-24812,-21403,-24823,-21390,-24834,-21378,-24845,-21365,-24856,-21352,-24867,-21340,-24878,-21327,-24888,-21314,-24899,-21301,-24910,-21289,-24921,-21276,-24932,-21263,-24943,-21250,-24954,-21238,-24965,-21225,-24975,-21212,-24986,-21199,-24997,-21187,-25008,-21174,-25019,-21161,-25030,-21148,-25040,-21135,-25051,-21123,-25062,-21110,-25073,-21097,-25084,-21084,-25094,-21071,-25105,-21058,-25116,-21046,-25127,-21033,-25137,-21020,-25148,-21007,-25159,-20994,-25170,-20981,-25180,-20968,-25191,-20956,-25202,-20943,-25212,-20930,-25223,-20917,-25234,-20904,-25244,-20891,-25255,-20878,-25266,-20865,-25277,-20852,-25287,-20839,-25298,-20826,-25308,-20814,-25319,-20801,-25330,-20788,-25340,-20775,-25351,-20762,-25362,-20749,-25372,-20736,-25383,-20723,-25393,-20710,-25404,-20697,-25415,-20684,-25425,-20671,-25436,-20658,-25446,-20645,-25457,-20632,-25467,-20619,-25478,-20606,-25488,-20593,-25499,-20580,-25509,-20567,-25520,-20554,-25530,-20541,-25541,-20528,-25551,-20514,-25562,-20501,-25572,-20488,-25583,-20475,-25593,-20462,-25604,-20449,-25614,-20436,-25625,-20423,-25635,-20410,-25646,-20397,-25656,-20384,-25666,-20370,-25677,-20357,-25687,-20344,-25698,-20331,-25708,-20318,-25718,-20305,-25729,-20292,-25739,-20278,-25750,-20265,-25760,-20252,-25770,-20239,-25781,-20226,-25791,-20213,-25801,-20199,-25812,-20186,-25822,-20173,-25832,-20160,-25843,-20147,-25853,-20133,-25863,-20120,-25873,-20107,-25884,-20094,-25894,-20080,-25904,-20067,-25914,-20054,-25925,-20041,-25935,-20027,-25945,-20014,-25955,-20001,-25966,-19988,-25976,-19974,-25986,-19961,-25996,-19948,-26007,-19934,-26017,-19921,-26027,-19908,-26037,-19895,-26047,-19881,-26057,-19868,-26068,-19855,-26078,-19841,-26088,-19828,-26098,-19815,-26108,-19801,-26118,-19788,-26128,-19775,-26138,-19761,-26149,-19748,-26159,-19734,-26169,-19721,-26179,-19708,-26189,-19694,-26199,-19681,-26209,-19668,-26219,-19654,-26229,-19641,-26239,-19627,-26249,-19614,-26259,-19600,-26269,-19587,-26279,-19574,-26289,-19560,-26299,-19547,-26309,-19533,-26319,-19520,-26329,-19506,-26339,-19493,-26349,-19479,-26359,-19466,-26369,-19452,-26379,-19439,-26389,-19425,-26399,-19412,-26409,-19398,-26419,-19385,-26429,-19371,-26438,-19358,-26448,-19344,-26458,-19331,-26468,-19317,-26478,-19304,-26488,-19290,-26498,-19277,-26508,-19263,-26517,-19250,-26527,-19236,-26537,-19222,-26547,-19209,-26557,-19195,-26567,-19182,-26576,-19168,-26586,-19155,-26596,-19141,-26606,-19127,-26616,-19114,-26625,-19100,-26635,-19087,-26645,-19073,-26655,-19059,-26664,-19046,-26674,-19032,-26684,-19018,-26693,-19005,-26703,-18991,-26713,-18977,-26723,-18964,-26732,-18950,-26742,-18936,-26752,-18923,-26761,-18909,-26771,-18895,-26781,-18882,-26790,-18868,-26800,-18854,-26810,-18841,-26819,-18827,-26829,-18813,-26838,-18799,-26848,-18786,-26858,-18772,-26867,-18758,-26877,-18745,-26886,-18731,-26896,-18717,-26906,-18703,-26915,-18690,-26925,-18676,-26934,-18662,-26944,-18648,-26953,-18634,-26963,-18621,-26972,-18607,-26982,-18593,-26991,-18579,-27001,-18565,-27010,-18552,-27020,-18538,-27029,-18524,-27039,-18510,-27048,-18496,-27058,-18483,-27067,-18469,-27077,-18455,-27086,-18441,-27095,-18427,-27105,-18413,-27114,-18399,-27124,-18386,-27133,-18372,-27142,-18358,-27152,-18344,-27161,-18330,-27171,-18316,-27180,-18302,-27189,-18288,-27199,-18274,-27208,-18261,-27217,-18247,-27227,-18233,-27236,-18219,-27245,-18205,-27255,-18191,-27264,-18177,-27273,-18163,-27282,-18149,-27292,-18135,-27301,-18121,-27310,-18107,-27320,-18093,-27329,-18079,-27338,-18065,-27347,-18051,-27356,-18037,-27366,-18023,-27375,-18009,-27384,-17995,-27393,-17981,-27402,-17967,-27412,-17953,-27421,-17939,-27430,-17925,-27439,-17911,-27448,-17897,-27457,-17883,-27467,-17869,-27476,-17855,-27485,-17841,-27494,-17827,-27503,-17813,-27512,-17799,-27521,-17785,-27530,-17771,-27539,-17757,-27549,-17743,-27558,-17728,-27567,-17714,-27576,-17700,-27585,-17686,-27594,-17672,-27603,-17658,-27612,-17644,-27621,-17630,-27630,-17616,-27639,-17601,-27648,-17587,-27657,-17573,-27666,-17559,-27675,-17545,-27684,-17531,-27693,-17517,-27702,-17502,-27711,-17488,-27720,-17474,-27729,-17460,-27737,-17446,-27746,-17432,-27755,-17417,-27764,-17403,-27773,-17389,-27782,-17375,-27791,-17361,-27800,-17346,-27809,-17332,-27817,-17318,-27826,-17304,-27835,-17289,-27844,-17275,-27853,-17261,-27862,-17247,-27870,-17233,-27879,-17218,-27888,-17204,-27897,-17190,-27906,-17175,-27914,-17161,-27923,-17147,-27932,-17133,-27941,-17118,-27949,-17104,-27958,-17090,-27967,-17075,-27976,-17061,-27984,-17047,-27993,-17033,-28002,-17018,-28010,-17004,-28019,-16990,-28028,-16975,-28037,-16961,-28045,-16947,-28054,-16932,-28063,-16918,-28071,-16904,-28080,-16889,-28088,-16875,-28097,-16860,-28106,-16846,-28114,-16832,-28123,-16817,-28132,-16803,-28140,-16789,-28149,-16774,-28157,-16760,-28166,-16745,-28174,-16731,-28183,-16717,-28191,-16702,-28200,-16688,-28209,-16673,-28217,-16659,-28226,-16644,-28234,-16630,-28243,-16616,-28251,-16601,-28260,-16587,-28268,-16572,-28276,-16558,-28285,-16543,-28293,-16529,-28302,-16514,-28310,-16500,-28319,-16485,-28327,-16471,-28336,-16456,-28344,-16442,-28352,-16428,-28361,-16413,-28369,-16399,-28378,-16384,-28386,-16369,-28394,-16355,-28403,-16340,-28411,-16326,-28419,-16311,-28428,-16297,-28436,-16282,-28444,-16268,-28453,-16253,-28461,-16239,-28469,-16224,-28478,-16210,-28486,-16195,-28494,-16180,-28502,-16166,-28511,-16151,-28519,-16137,-28527,-16122,-28535,-16108,-28544,-16093,-28552,-16078,-28560,-16064,-28568,-16049,-28576,-16035,-28585,-16020,-28593,-16005,-28601,-15991,-28609,-15976,-28617,-15961,-28626,-15947,-28634,-15932,-28642,-15918,-28650,-15903,-28658,-15888,-28666,-15874,-28674,-15859,-28682,-15844,-28691,-15830,-28699,-15815,-28707,-15800,-28715,-15786,-28723,-15771,-28731,-15756,-28739,-15741,-28747,-15727,-28755,-15712,-28763,-15697,-28771,-15683,-28779,-15668,-28787,-15653,-28795,-15639,-28803,-15624,-28811,-15609,-28819,-15594,-28827,-15580,-28835,-15565,-28843,-15550,-28851,-15535,-28859,-15521,-28867,-15506,-28875,-15491,-28883,-15476,-28891,-15462,-28898,-15447,-28906,-15432,-28914,-15417,-28922,-15402,-28930,-15388,-28938,-15373,-28946,-15358,-28954,-15343,-28961,-15328,-28969,-15314,-28977,-15299,-28985,-15284,-28993,-15269,-29000,-15254,-29008,-15239,-29016,-15225,-29024,-15210,-29032,-15195,-29039,-15180,-29047,-15165,-29055,-15150,-29063,-15136,-29070,-15121,-29078,-15106,-29086,-15091,-29093,-15076,-29101,-15061,-29109,-15046,-29117,-15031,-29124,-15017,-29132,-15002,-29140,-14987,-29147,-14972,-29155,-14957,-29163,-14942,-29170,-14927,-29178,-14912,-29185,-14897,-29193,-14882,-29201,-14867,-29208,-14853,-29216,-14838,-29223,-14823,-29231,-14808,-29239,-14793,-29246,-14778,-29254,-14763,-29261,-14748,-29269,-14733,-29276,-14718,-29284,-14703,-29291,-14688,-29299,-14673,-29306,-14658,-29314,-14643,-29321,-14628,-29329,-14613,-29336,-14598,-29344,-14583,-29351,-14568,-29359,-14553,-29366,-14538,-29373,-14523,-29381,-14508,-29388,-14493,-29396,-14478,-29403,-14463,-29411,-14448,-29418,-14433,-29425,-14418,-29433,-14403,-29440,-14388,-29447,-14373,-29455,-14358,-29462,-14343,-29469,-14327,-29477,-14312,-29484,-14297,-29491,-14282,-29499,-14267,-29506,-14252,-29513,-14237,-29520,-14222,-29528,-14207,-29535,-14192,-29542,-14177,-29549,-14161,-29557,-14146,-29564,-14131,-29571,-14116,-29578,-14101,-29586,-14086,-29593,-14071,-29600,-14056,-29607,-14040,-29614,-14025,-29622,-14010,-29629,-13995,-29636,-13980,-29643,-13965,-29650,-13950,-29657,-13934,-29664,-13919,-29671,-13904,-29679,-13889,-29686,-13874,-29693,-13859,-29700,-13843,-29707,-13828,-29714,-13813,-29721,-13798,-29728,-13783,-29735,-13767,-29742,-13752,-29749,-13737,-29756,-13722,-29763,-13707,-29770,-13691,-29777,-13676,-29784,-13661,-29791,-13646,-29798,-13630,-29805,-13615,-29812,-13600,-29819,-13585,-29826,-13569,-29833,-13554,-29840,-13539,-29847,-13524,-29854,-13508,-29861,-13493,-29867,-13478,-29874,-13463,-29881,-13447,-29888,-13432,-29895,-13417,-29902,-13401,-29909,-13386,-29916,-13371,-29922,-13356,-29929,-13340,-29936,-13325,-29943,-13310,-29950,-13294,-29956,-13279,-29963,-13264,-29970,-13248,-29977,-13233,-29984,-13218,-29990,-13202,-29997,-13187,-30004,-13172,-30010,-13156,-30017,-13141,-30024,-13126,-30031,-13110,-30037,-13095,-30044,-13080,-30051,-13064,-30057,-13049,-30064,-13034,-30071,-13018,-30077,-13003,-30084,-12987,-30091,-12972,-30097,-12957,-30104,-12941,-30110,-12926,-30117,-12910,-30124,-12895,-30130,-12880,-30137,-12864,-30143,-12849,-30150,-12833,-30157,-12818,-30163,-12803,-30170,-12787,-30176,-12772,-30183,-12756,-30189,-12741,-30196,-12725,-30202,-12710,-30209,-12695,-30215,-12679,-30222,-12664,-30228,-12648,-30235,-12633,-30241,-12617,-30248,-12602,-30254,-12586,-30260,-12571,-30267,-12555,-30273,-12540,-30280,-12524,-30286,-12509,-30292,-12493,-30299,-12478,-30305,-12462,-30312,-12447,-30318,-12431,-30324,-12416,-30331,-12400,-30337,-12385,-30343,-12369,-30350,-12354,-30356,-12338,-30362,-12323,-30369,-12307,-30375,-12292,-30381,-12276,-30387,-12261,-30394,-12245,-30400,-12230,-30406,-12214,-30412,-12199,-30419,-12183,-30425,-12167,-30431,-12152,-30437,-12136,-30443,-12121,-30450,-12105,-30456,-12090,-30462,-12074,-30468,-12058,-30474,-12043,-30481,-12027,-30487,-12012,-30493,-11996,-30499,-11981,-30505,-11965,-30511,-11949,-30517,-11934,-30523,-11918,-30529,-11903,-30536,-11887,-30542,-11871,-30548,-11856,-30554,-11840,-30560,-11824,-30566,-11809,-30572,-11793,-30578,-11778,-30584,-11762,-30590,-11746,-30596,-11731,-30602,-11715,-30608,-11699,-30614,-11684,-30620,-11668,-30626,-11652,-30632,-11637,-30638,-11621,-30644,-11605,-30650,-11590,-30656,-11574,-30661,-11558,-30667,-11543,-30673,-11527,-30679,-11511,-30685,-11496,-30691,-11480,-30697,-11464,-30703,-11449,-30708,-11433,-30714,-11417,-30720,-11401,-30726,-11386,-30732,-11370,-30738,-11354,-30743,-11339,-30749,-11323,-30755,-11307,-30761,-11291,-30767,-11276,-30772,-11260,-30778,-11244,-30784,-11228,-30789,-11213,-30795,-11197,-30801,-11181,-30807,-11165,-30812,-11150,-30818,-11134,-30824,-11118,-30829,-11102,-30835,-11087,-30841,-11071,-30846,-11055,-30852,-11039,-30858,-11024,-30863,-11008,-30869,-10992,-30875,-10976,-30880,-10960,-30886,-10945,-30891,-10929,-30897,-10913,-30903,-10897,-30908,-10881,-30914,-10866,-30919,-10850,-30925,-10834,-30930,-10818,-30936,-10802,-30941,-10787,-30947,-10771,-30952,-10755,-30958,-10739,-30963,-10723,-30969,-10707,-30974,-10692,-30980,-10676,-30985,-10660,-30991,-10644,-30996,-10628,-31002,-10612,-31007,-10597,-31012,-10581,-31018,-10565,-31023,-10549,-31029,-10533,-31034,-10517,-31039,-10501,-31045,-10485,-31050,-10470,-31055,-10454,-31061,-10438,-31066,-10422,-31071,-10406,-31077,-10390,-31082,-10374,-31087,-10358,-31093,-10343,-31098,-10327,-31103,-10311,-31108,-10295,-31114,-10279,-31119,-10263,-31124,-10247,-31129,-10231,-31135,-10215,-31140,-10199,-31145,-10183,-31150,-10167,-31155,-10152,-31161,-10136,-31166,-10120,-31171,-10104,-31176,-10088,-31181,-10072,-31186,-10056,-31192,-10040,-31197,-10024,-31202,-10008,-31207,-9992,-31212,-9976,-31217,-9960,-31222,-9944,-31227,-9928,-31232,-9912,-31237,-9896,-31243,-9880,-31248,-9864,-31253,-9848,-31258,-9832,-31263,-9816,-31268,-9800,-31273,-9784,-31278,-9768,-31283,-9752,-31288,-9736,-31293,-9720,-31298,-9704,-31303,-9688,-31308,-9672,-31312,-9656,-31317,-9640,-31322,-9624,-31327,-9608,-31332,-9592,-31337,-9576,-31342,-9560,-31347,-9544,-31352,-9528,-31357,-9512,-31361,-9496,-31366,-9480,-31371,-9464,-31376,-9448,-31381,-9432,-31386,-9416,-31390,-9400,-31395,-9384,-31400,-9368,-31405,-9352,-31410,-9336,-31414,-9320,-31419,-9304,-31424,-9288,-31429,-9271,-31433,-9255,-31438,-9239,-31443,-9223,-31447,-9207,-31452,-9191,-31457,-9175,-31462,-9159,-31466,-9143,-31471,-9127,-31476,-9111,-31480,-9095,-31485,-9078,-31490,-9062,-31494,-9046,-31499,-9030,-31503,-9014,-31508,-8998,-31513,-8982,-31517,-8966,-31522,-8950,-31526,-8933,-31531,-8917,-31535,-8901,-31540,-8885,-31545,-8869,-31549,-8853,-31554,-8837,-31558,-8821,-31563,-8804,-31567,-8788,-31572,-8772,-31576,-8756,-31581,-8740,-31585,-8724,-31589,-8708,-31594,-8691,-31598,-8675,-31603,-8659,-31607,-8643,-31612,-8627,-31616,-8611,-31620,-8594,-31625,-8578,-31629,-8562,-31634,-8546,-31638,-8530,-31642,-8514,-31647,-8497,-31651,-8481,-31655,-8465,-31660,-8449,-31664,-8433,-31668,-8416,-31673,-8400,-31677,-8384,-31681,-8368,-31685,-8352,-31690,-8335,-31694,-8319,-31698,-8303,-31702,-8287,-31707,-8271,-31711,-8254,-31715,-8238,-31719,-8222,-31724,-8206,-31728,-8190,-31732,-8173,-31736,-8157,-31740,-8141,-31744,-8125,-31749,-8108,-31753,-8092,-31757,-8076,-31761,-8060,-31765,-8043,-31769,-8027,-31773,-8011,-31777,-7995,-31781,-7978,-31786,-7962,-31790,-7946,-31794,-7930,-31798,-7913,-31802,-7897,-31806,-7881,-31810,-7865,-31814,-7848,-31818,-7832,-31822,-7816,-31826,-7800,-31830,-7783,-31834,-7767,-31838,-7751,-31842,-7734,-31846,-7718,-31850,-7702,-31854,-7686,-31857,-7669,-31861,-7653,-31865,-7637,-31869,-7620,-31873,-7604,-31877,-7588,-31881,-7572,-31885,-7555,-31889,-7539,-31892,-7523,-31896,-7506,-31900,-7490,-31904,-7474,-31908,-7457,-31912,-7441,-31915,-7425,-31919,-7408,-31923,-7392,-31927,-7376,-31930,-7359,-31934,-7343,-31938,-7327,-31942,-7311,-31945,-7294,-31949,-7278,-31953,-7262,-31957,-7245,-31960,-7229,-31964,-7212,-31968,-7196,-31971,-7180,-31975,-7163,-31979,-7147,-31982,-7131,-31986,-7114,-31990,-7098,-31993,-7082,-31997,-7065,-32000,-7049,-32004,-7033,-32008,-7016,-32011,-7000,-32015,-6983,-32018,-6967,-32022,-6951,-32025,-6934,-32029,-6918,-32033,-6902,-32036,-6885,-32040,-6869,-32043,-6852,-32047,-6836,-32050,-6820,-32054,-6803,-32057,-6787,-32060,-6771,-32064,-6754,-32067,-6738,-32071,-6721,-32074,-6705,-32078,-6689,-32081,-6672,-32085,-6656,-32088,-6639,-32091,-6623,-32095,-6607,-32098,-6590,-32101,-6574,-32105,-6557,-32108,-6541,-32111,-6524,-32115,-6508,-32118,-6492,-32121,-6475,-32125,-6459,-32128,-6442,-32131,-6426,-32135,-6409,-32138,-6393,-32141,-6377,-32144,-6360,-32148,-6344,-32151,-6327,-32154,-6311,-32157,-6294,-32161,-6278,-32164,-6262,-32167,-6245,-32170,-6229,-32173,-6212,-32177,-6196,-32180,-6179,-32183,-6163,-32186,-6146,-32189,-6130,-32192,-6113,-32195,-6097,-32198,-6081,-32202,-6064,-32205,-6048,-32208,-6031,-32211,-6015,-32214,-5998,-32217,-5982,-32220,-5965,-32223,-5949,-32226,-5932,-32229,-5916,-32232,-5899,-32235,-5883,-32238,-5866,-32241,-5850,-32244,-5833,-32247,-5817,-32250,-5800,-32253,-5784,-32256,-5767,-32259,-5751,-32262,-5734,-32265,-5718,-32268,-5701,-32271,-5685,-32274,-5668,-32276,-5652,-32279,-5635,-32282,-5619,-32285,-5602,-32288,-5586,-32291,-5569,-32294,-5553,-32296,-5536,-32299,-5520,-32302,-5503,-32305,-5487,-32308,-5470,-32311,-5454,-32313,-5437,-32316,-5421,-32319,-5404,-32322,-5388,-32324,-5371,-32327,-5355,-32330,-5338,-32333,-5322,-32335,-5305,-32338,-5288,-32341,-5272,-32343,-5255,-32346,-5239,-32349,-5222,-32351,-5206,-32354,-5189,-32357,-5173,-32359,-5156,-32362,-5140,-32365,-5123,-32367,-5107,-32370,-5090,-32372,-5073,-32375,-5057,-32378,-5040,-32380,-5024,-32383,-5007,-32385,-4991,-32388,-4974,-32390,-4958,-32393,-4941,-32395,-4924,-32398,-4908,-32400,-4891,-32403,-4875,-32405,-4858,-32408,-4842,-32410,-4825,-32413,-4808,-32415,-4792,-32418,-4775,-32420,-4759,-32423,-4742,-32425,-4726,-32427,-4709,-32430,-4692,-32432,-4676,-32435,-4659,-32437,-4643,-32439,-4626,-32442,-4609,-32444,-4593,-32446,-4576,-32449,-4560,-32451,-4543,-32453,-4526,-32456,-4510,-32458,-4493,-32460,-4477,-32463,-4460,-32465,-4444,-32467,-4427,-32469,-4410,-32472,-4394,-32474,-4377,-32476,-4360,-32478,-4344,-32481,-4327,-32483,-4311,-32485,-4294,-32487,-4277,-32489,-4261,-32492,-4244,-32494,-4228,-32496,-4211,-32498,-4194,-32500,-4178,-32502,-4161,-32504,-4145,-32507,-4128,-32509,-4111,-32511,-4095,-32513,-4078,-32515,-4061,-32517,-4045,-32519,-4028,-32521,-4012,-32523,-3995,-32525,-3978,-32527,-3962,-32529,-3945,-32531,-3928,-32533,-3912,-32535,-3895,-32537,-3878,-32539,-3862,-32541,-3845,-32543,-3829,-32545,-3812,-32547,-3795,-32549,-3779,-32551,-3762,-32553,-3745,-32555,-3729,-32557,-3712,-32559,-3695,-32560,-3679,-32562,-3662,-32564,-3645,-32566,-3629,-32568,-3612,-32570,-3595,-32572,-3579,-32573,-3562,-32575,-3546,-32577,-3529,-32579,-3512,-32581,-3496,-32582,-3479,-32584,-3462,-32586,-3446,-32588,-3429,-32589,-3412,-32591,-3396,-32593,-3379,-32595,-3362,-32596,-3346,-32598,-3329,-32600,-3312,-32601,-3296,-32603,-3279,-32605,-3262,-32606,-3246,-32608,-3229,-32610,-3212,-32611,-3196,-32613,-3179,-32615,-3162,-32616,-3146,-32618,-3129,-32619,-3112,-32621,-3095,-32623,-3079,-32624,-3062,-32626,-3045,-32627,-3029,-32629,-3012,-32630,-2995,-32632,-2979,-32633,-2962,-32635,-2945,-32636,-2929,-32638,-2912,-32639,-2895,-32641,-2879,-32642,-2862,-32644,-2845,-32645,-2829,-32647,-2812,-32648,-2795,-32650,-2778,-32651,-2762,-32652,-2745,-32654,-2728,-32655,-2712,-32657,-2695,-32658,-2678,-32659,-2662,-32661,-2645,-32662,-2628,-32663,-2611,-32665,-2595,-32666,-2578,-32667,-2561,-32669,-2545,-32670,-2528,-32671,-2511,-32672,-2495,-32674,-2478,-32675,-2461,-32676,-2444,-32677,-2428,-32679,-2411,-32680,-2394,-32681,-2378,-32682,-2361,-32684,-2344,-32685,-2327,-32686,-2311,-32687,-2294,-32688,-2277,-32689,-2261,-32691,-2244,-32692,-2227,-32693,-2210,-32694,-2194,-32695,-2177,-32696,-2160,-32697,-2144,-32698,-2127,-32700,-2110,-32701,-2093,-32702,-2077,-32703,-2060,-32704,-2043,-32705,-2027,-32706,-2010,-32707,-1993,-32708,-1976,-32709,-1960,-32710,-1943,-32711,-1926,-32712,-1909,-32713,-1893,-32714,-1876,-32715,-1859,-32716,-1843,-32717,-1826,-32718,-1809,-32718,-1792,-32719,-1776,-32720,-1759,-32721,-1742,-32722,-1725,-32723,-1709,-32724,-1692,-32725,-1675,-32726,-1659,-32726,-1642,-32727,-1625,-32728,-1608,-32729,-1592,-32730,-1575,-32730,-1558,-32731,-1541,-32732,-1525,-32733,-1508,-32734,-1491,-32734,-1474,-32735,-1458,-32736,-1441,-32737,-1424,-32737,-1407,-32738,-1391,-32739,-1374,-32739,-1357,-32740,-1340,-32741,-1324,-32741,-1307,-32742,-1290,-32743,-1274,-32743,-1257,-32744,-1240,-32745,-1223,-32745,-1207,-32746,-1190,-32747,-1173,-32747,-1156,-32748,-1140,-32748,-1123,-32749,-1106,-32749,-1089,-32750,-1073,-32751,-1056,-32751,-1039,-32752,-1022,-32752,-1006,-32753,-989,-32753,-972,-32754,-955,-32754,-939,-32755,-922,-32755,-905,-32755,-888,-32756,-872,-32756,-855,-32757,-838,-32757,-821,-32758,-805,-32758,-788,-32758,-771,-32759,-754,-32759,-738,-32760,-721,-32760,-704,-32760,-687,-32761,-671,-32761,-654,-32761,-637,-32762,-620,-32762,-604,-32762,-587,-32763,-570,-32763,-553,-32763,-537,-32763,-520,-32764,-503,-32764,-486,-32764,-470,-32764,-453,-32765,-436,-32765,-419,-32765,-403,-32765,-386,-32765,-369,-32766,-352,-32766,-336,-32766,-319,-32766,-302,-32766,-285,-32766,-269,-32767,-252,-32767,-235,-32767,-218,-32767,-202,-32767,-185,-32767,-168,-32767,-151,-32767,-135,-32767,-118,-32767,-101,-32767,-84,-32767,-68,-32767,-51,-32767,-34,-32767,-17,-32767,-1,-32767,16,-32767,33,-32767,50,-32767,67,-32767,83,-32767,100,-32767,117,-32767,134,-32767,150,-32767,167,-32767,184,-32767,201,-32767,217,-32767,234,-32767,251,-32766,268,-32766,284,-32766,301,-32766,318,-32766,335,-32766,351,-32765,368,-32765,385,-32765,402,-32765,418,-32765,435,-32764,452,-32764,469,-32764,485,-32764,502,-32763,519,-32763,536,-32763,552,-32763,569,-32762,586,-32762,603,-32762,619,-32761,636,-32761,653,-32761,670,-32760,686,-32760,703,-32760,720,-32759,737,-32759,753,-32758,770,-32758,787,-32758,804,-32757,820,-32757,837,-32756,854,-32756,871,-32755,887,-32755,904,-32755,921,-32754,938,-32754,954,-32753,971,-32753,988,-32752,1005,-32752,1021,-32751,1038,-32751,1055,-32750,1072,-32749,1088,-32749,1105,-32748,1122,-32748,1139,-32747,1155,-32747,1172,-32746,1189,-32745,1206,-32745,1222,-32744,1239,-32743,1256,-32743,1273,-32742,1289,-32741,1306,-32741,1323,-32740,1339,-32739,1356,-32739,1373,-32738,1390,-32737,1406,-32737,1423,-32736,1440,-32735,1457,-32734,1473,-32734,1490,-32733,1507,-32732,1524,-32731,1540,-32730,1557,-32730,1574,-32729,1591,-32728,1607,-32727,1624,-32726,1641,-32726,1658,-32725,1674,-32724,1691,-32723,1708,-32722,1724,-32721,1741,-32720,1758,-32719,1775,-32718,1791,-32718,1808,-32717,1825,-32716,1842,-32715,1858,-32714,1875,-32713,1892,-32712,1908,-32711,1925,-32710,1942,-32709,1959,-32708,1975,-32707,1992,-32706,2009,-32705,2026,-32704,2042,-32703,2059,-32702,2076,-32701,2092,-32700,2109,-32698,2126,-32697,2143,-32696,2159,-32695,2176,-32694,2193,-32693,2209,-32692,2226,-32691,2243,-32689,2260,-32688,2276,-32687,2293,-32686,2310,-32685,2326,-32684,2343,-32682,2360,-32681,2377,-32680,2393,-32679,2410,-32677,2427,-32676,2443,-32675,2460,-32674,2477,-32672,2494,-32671,2510,-32670,2527,-32669,2544,-32667,2560,-32666,2577,-32665,2594,-32663,2610,-32662,2627,-32661,2644,-32659,2661,-32658,2677,-32657,2694,-32655,2711,-32654,2727,-32652,2744,-32651,2761,-32650,2777,-32648,2794,-32647,2811,-32645,2828,-32644,2844,-32642,2861,-32641,2878,-32639,2894,-32638,2911,-32636,2928,-32635,2944,-32633,2961,-32632,2978,-32630,2994,-32629,3011,-32627,3028,-32626,3044,-32624,3061,-32623,3078,-32621,3094,-32619,3111,-32618,3128,-32616,3145,-32615,3161,-32613,3178,-32611,3195,-32610,3211,-32608,3228,-32606,3245,-32605,3261,-32603,3278,-32601,3295,-32600,3311,-32598,3328,-32596,3345,-32595,3361,-32593,3378,-32591,3395,-32589,3411,-32588,3428,-32586,3445,-32584,3461,-32582,3478,-32581,3495,-32579,3511,-32577,3528,-32575,3545,-32573,3561,-32572,3578,-32570,3594,-32568,3611,-32566,3628,-32564,3644,-32562,3661,-32560,3678,-32559,3694,-32557,3711,-32555,3728,-32553,3744,-32551,3761,-32549,3778,-32547,3794,-32545,3811,-32543,3828,-32541,3844,-32539,3861,-32537,3877,-32535,3894,-32533,3911,-32531,3927,-32529,3944,-32527,3961,-32525,3977,-32523,3994,-32521,4011,-32519,4027,-32517,4044,-32515,4060,-32513,4077,-32511,4094,-32509,4110,-32507,4127,-32504,4144,-32502,4160,-32500,4177,-32498,4193,-32496,4210,-32494,4227,-32492,4243,-32489,4260,-32487,4276,-32485,4293,-32483,4310,-32481,4326,-32478,4343,-32476,4359,-32474,4376,-32472,4393,-32469,4409,-32467,4426,-32465,4443,-32463,4459,-32460,4476,-32458,4492,-32456,4509,-32453,4525,-32451,4542,-32449,4559,-32446,4575,-32444,4592,-32442,4608,-32439,4625,-32437,4642,-32435,4658,-32432,4675,-32430,4691,-32427,4708,-32425,4725,-32423,4741,-32420,4758,-32418,4774,-32415,4791,-32413,4807,-32410,4824,-32408,4841,-32405,4857,-32403,4874,-32400,4890,-32398,4907,-32395,4923,-32393,4940,-32390,4957,-32388,4973,-32385,4990,-32383,5006,-32380,5023,-32378,5039,-32375,5056,-32372,5072,-32370,5089,-32367,5106,-32365,5122,-32362,5139,-32359,5155,-32357,5172,-32354,5188,-32351,5205,-32349,5221,-32346,5238,-32343,5254,-32341,5271,-32338,5287,-32335,5304,-32333,5321,-32330,5337,-32327,5354,-32324,5370,-32322,5387,-32319,5403,-32316,5420,-32313,5436,-32311,5453,-32308,5469,-32305,5486,-32302,5502,-32299,5519,-32296,5535,-32294,5552,-32291,5568,-32288,5585,-32285,5601,-32282,5618,-32279,5634,-32276,5651,-32274,5667,-32271,5684,-32268,5700,-32265,5717,-32262,5733,-32259,5750,-32256,5766,-32253,5783,-32250,5799,-32247,5816,-32244,5832,-32241,5849,-32238,5865,-32235,5882,-32232,5898,-32229,5915,-32226,5931,-32223,5948,-32220,5964,-32217,5981,-32214,5997,-32211,6014,-32208,6030,-32205,6047,-32202,6063,-32198,6080,-32195,6096,-32192,6112,-32189,6129,-32186,6145,-32183,6162,-32180,6178,-32177,6195,-32173,6211,-32170,6228,-32167,6244,-32164,6261,-32161,6277,-32157,6293,-32154,6310,-32151,6326,-32148,6343,-32144,6359,-32141,6376,-32138,6392,-32135,6408,-32131,6425,-32128,6441,-32125,6458,-32121,6474,-32118,6491,-32115,6507,-32111,6523,-32108,6540,-32105,6556,-32101,6573,-32098,6589,-32095,6606,-32091,6622,-32088,6638,-32085,6655,-32081,6671,-32078,6688,-32074,6704,-32071,6720,-32067,6737,-32064,6753,-32060,6770,-32057,6786,-32054,6802,-32050,6819,-32047,6835,-32043,6851,-32040,6868,-32036,6884,-32033,6901,-32029,6917,-32025,6933,-32022,6950,-32018,6966,-32015,6982,-32011,6999,-32008,7015,-32004,7032,-32000,7048,-31997,7064,-31993,7081,-31990,7097,-31986,7113,-31982,7130,-31979,7146,-31975,7162,-31971,7179,-31968,7195,-31964,7211,-31960,7228,-31957,7244,-31953,7261,-31949,7277,-31945,7293,-31942,7310,-31938,7326,-31934,7342,-31930,7358,-31927,7375,-31923,7391,-31919,7407,-31915,7424,-31912,7440,-31908,7456,-31904,7473,-31900,7489,-31896,7505,-31892,7522,-31889,7538,-31885,7554,-31881,7571,-31877,7587,-31873,7603,-31869,7619,-31865,7636,-31861,7652,-31857,7668,-31854,7685,-31850,7701,-31846,7717,-31842,7733,-31838,7750,-31834,7766,-31830,7782,-31826,7799,-31822,7815,-31818,7831,-31814,7847,-31810,7864,-31806,7880,-31802,7896,-31798,7912,-31794,7929,-31790,7945,-31786,7961,-31781,7977,-31777,7994,-31773,8010,-31769,8026,-31765,8042,-31761,8059,-31757,8075,-31753,8091,-31749,8107,-31744,8124,-31740,8140,-31736,8156,-31732,8172,-31728,8189,-31724,8205,-31719,8221,-31715,8237,-31711,8253,-31707,8270,-31702,8286,-31698,8302,-31694,8318,-31690,8334,-31685,8351,-31681,8367,-31677,8383,-31673,8399,-31668,8415,-31664,8432,-31660,8448,-31655,8464,-31651,8480,-31647,8496,-31642,8513,-31638,8529,-31634,8545,-31629,8561,-31625,8577,-31620,8593,-31616,8610,-31612,8626,-31607,8642,-31603,8658,-31598,8674,-31594,8690,-31589,8707,-31585,8723,-31581,8739,-31576,8755,-31572,8771,-31567,8787,-31563,8803,-31558,8820,-31554,8836,-31549,8852,-31545,8868,-31540,8884,-31535,8900,-31531,8916,-31526,8932,-31522,8949,-31517,8965,-31513,8981,-31508,8997,-31503,9013,-31499,9029,-31494,9045,-31490,9061,-31485,9077,-31480,9094,-31476,9110,-31471,9126,-31466,9142,-31462,9158,-31457,9174,-31452,9190,-31447,9206,-31443,9222,-31438,9238,-31433,9254,-31429,9270,-31424,9287,-31419,9303,-31414,9319,-31410,9335,-31405,9351,-31400,9367,-31395,9383,-31390,9399,-31386,9415,-31381,9431,-31376,9447,-31371,9463,-31366,9479,-31361,9495,-31357,9511,-31352,9527,-31347,9543,-31342,9559,-31337,9575,-31332,9591,-31327,9607,-31322,9623,-31317,9639,-31312,9655,-31308,9671,-31303,9687,-31298,9703,-31293,9719,-31288,9735,-31283,9751,-31278,9767,-31273,9783,-31268,9799,-31263,9815,-31258,9831,-31253,9847,-31248,9863,-31243,9879,-31237,9895,-31232,9911,-31227,9927,-31222,9943,-31217,9959,-31212,9975,-31207,9991,-31202,10007,-31197,10023,-31192,10039,-31186,10055,-31181,10071,-31176,10087,-31171,10103,-31166,10119,-31161,10135,-31155,10151,-31150,10166,-31145,10182,-31140,10198,-31135,10214,-31129,10230,-31124,10246,-31119,10262,-31114,10278,-31108,10294,-31103,10310,-31098,10326,-31093,10342,-31087,10357,-31082,10373,-31077,10389,-31071,10405,-31066,10421,-31061,10437,-31055,10453,-31050,10469,-31045,10484,-31039,10500,-31034,10516,-31029,10532,-31023,10548,-31018,10564,-31012,10580,-31007,10596,-31002,10611,-30996,10627,-30991,10643,-30985,10659,-30980,10675,-30974,10691,-30969,10706,-30963,10722,-30958,10738,-30952,10754,-30947,10770,-30941,10786,-30936,10801,-30930,10817,-30925,10833,-30919,10849,-30914,10865,-30908,10880,-30903,10896,-30897,10912,-30891,10928,-30886,10944,-30880,10959,-30875,10975,-30869,10991,-30863,11007,-30858,11023,-30852,11038,-30846,11054,-30841,11070,-30835,11086,-30829,11101,-30824,11117,-30818,11133,-30812,11149,-30807,11164,-30801,11180,-30795,11196,-30789,11212,-30784,11227,-30778,11243,-30772,11259,-30767,11275,-30761,11290,-30755,11306,-30749,11322,-30743,11338,-30738,11353,-30732,11369,-30726,11385,-30720,11400,-30714,11416,-30708,11432,-30703,11448,-30697,11463,-30691,11479,-30685,11495,-30679,11510,-30673,11526,-30667,11542,-30661,11557,-30656,11573,-30650,11589,-30644,11604,-30638,11620,-30632,11636,-30626,11651,-30620,11667,-30614,11683,-30608,11698,-30602,11714,-30596,11730,-30590,11745,-30584,11761,-30578,11777,-30572,11792,-30566,11808,-30560,11823,-30554,11839,-30548,11855,-30542,11870,-30536,11886,-30529,11902,-30523,11917,-30517,11933,-30511,11948,-30505,11964,-30499,11980,-30493,11995,-30487,12011,-30481,12026,-30474,12042,-30468,12057,-30462,12073,-30456,12089,-30450,12104,-30443,12120,-30437,12135,-30431,12151,-30425,12166,-30419,12182,-30412,12198,-30406,12213,-30400,12229,-30394,12244,-30387,12260,-30381,12275,-30375,12291,-30369,12306,-30362,12322,-30356,12337,-30350,12353,-30343,12368,-30337,12384,-30331,12399,-30324,12415,-30318,12430,-30312,12446,-30305,12461,-30299,12477,-30292,12492,-30286,12508,-30280,12523,-30273,12539,-30267,12554,-30260,12570,-30254,12585,-30248,12601,-30241,12616,-30235,12632,-30228,12647,-30222,12663,-30215,12678,-30209,12694,-30202,12709,-30196,12724,-30189,12740,-30183,12755,-30176,12771,-30170,12786,-30163,12802,-30157,12817,-30150,12832,-30143,12848,-30137,12863,-30130,12879,-30124,12894,-30117,12909,-30110,12925,-30104,12940,-30097,12956,-30091,12971,-30084,12986,-30077,13002,-30071,13017,-30064,13033,-30057,13048,-30051,13063,-30044,13079,-30037,13094,-30031,13109,-30024,13125,-30017,13140,-30010,13155,-30004,13171,-29997,13186,-29990,13201,-29984,13217,-29977,13232,-29970,13247,-29963,13263,-29956,13278,-29950,13293,-29943,13309,-29936,13324,-29929,13339,-29922,13355,-29916,13370,-29909,13385,-29902,13400,-29895,13416,-29888,13431,-29881,13446,-29874,13462,-29867,13477,-29861,13492,-29854,13507,-29847,13523,-29840,13538,-29833,13553,-29826,13568,-29819,13584,-29812,13599,-29805,13614,-29798,13629,-29791,13645,-29784,13660,-29777,13675,-29770,13690,-29763,13706,-29756,13721,-29749,13736,-29742,13751,-29735,13766,-29728,13782,-29721,13797,-29714,13812,-29707,13827,-29700,13842,-29693,13858,-29686,13873,-29679,13888,-29671,13903,-29664,13918,-29657,13933,-29650,13949,-29643,13964,-29636,13979,-29629,13994,-29622,14009,-29614,14024,-29607,14039,-29600,14055,-29593,14070,-29586,14085,-29578,14100,-29571,14115,-29564,14130,-29557,14145,-29549,14160,-29542,14176,-29535,14191,-29528,14206,-29520,14221,-29513,14236,-29506,14251,-29499,14266,-29491,14281,-29484,14296,-29477,14311,-29469,14326,-29462,14342,-29455,14357,-29447,14372,-29440,14387,-29433,14402,-29425,14417,-29418,14432,-29411,14447,-29403,14462,-29396,14477,-29388,14492,-29381,14507,-29373,14522,-29366,14537,-29359,14552,-29351,14567,-29344,14582,-29336,14597,-29329,14612,-29321,14627,-29314,14642,-29306,14657,-29299,14672,-29291,14687,-29284,14702,-29276,14717,-29269,14732,-29261,14747,-29254,14762,-29246,14777,-29239,14792,-29231,14807,-29223,14822,-29216,14837,-29208,14852,-29201,14866,-29193,14881,-29185,14896,-29178,14911,-29170,14926,-29163,14941,-29155,14956,-29147,14971,-29140,14986,-29132,15001,-29124,15016,-29117,15030,-29109,15045,-29101,15060,-29093,15075,-29086,15090,-29078,15105,-29070,15120,-29063,15135,-29055,15149,-29047,15164,-29039,15179,-29032,15194,-29024,15209,-29016,15224,-29008,15238,-29000,15253,-28993,15268,-28985,15283,-28977,15298,-28969,15313,-28961,15327,-28954,15342,-28946,15357,-28938,15372,-28930,15387,-28922,15401,-28914,15416,-28906,15431,-28898,15446,-28891,15461,-28883,15475,-28875,15490,-28867,15505,-28859,15520,-28851,15534,-28843,15549,-28835,15564,-28827,15579,-28819,15593,-28811,15608,-28803,15623,-28795,15638,-28787,15652,-28779,15667,-28771,15682,-28763,15696,-28755,15711,-28747,15726,-28739,15740,-28731,15755,-28723,15770,-28715,15785,-28707,15799,-28699,15814,-28691,15829,-28682,15843,-28674,15858,-28666,15873,-28658,15887,-28650,15902,-28642,15917,-28634,15931,-28626,15946,-28617,15960,-28609,15975,-28601,15990,-28593,16004,-28585,16019,-28576,16034,-28568,16048,-28560,16063,-28552,16077,-28544,16092,-28535,16107,-28527,16121,-28519,16136,-28511,16150,-28502,16165,-28494,16179,-28486,16194,-28478,16209,-28469,16223,-28461,16238,-28453,16252,-28444,16267,-28436,16281,-28428,16296,-28419,16310,-28411,16325,-28403,16339,-28394,16354,-28386,16368,-28378,16383,-28369,16398,-28361,16412,-28352,16427,-28344,16441,-28336,16455,-28327,16470,-28319,16484,-28310,16499,-28302,16513,-28293,16528,-28285,16542,-28276,16557,-28268,16571,-28260,16586,-28251,16600,-28243,16615,-28234,16629,-28226,16643,-28217,16658,-28209,16672,-28200,16687,-28191,16701,-28183,16716,-28174,16730,-28166,16744,-28157,16759,-28149,16773,-28140,16788,-28132,16802,-28123,16816,-28114,16831,-28106,16845,-28097,16859,-28088,16874,-28080,16888,-28071,16903,-28063,16917,-28054,16931,-28045,16946,-28037,16960,-28028,16974,-28019,16989,-28010,17003,-28002,17017,-27993,17032,-27984,17046,-27976,17060,-27967,17074,-27958,17089,-27949,17103,-27941,17117,-27932,17132,-27923,17146,-27914,17160,-27906,17174,-27897,17189,-27888,17203,-27879,17217,-27870,17232,-27862,17246,-27853,17260,-27844,17274,-27835,17288,-27826,17303,-27817,17317,-27809,17331,-27800,17345,-27791,17360,-27782,17374,-27773,17388,-27764,17402,-27755,17416,-27746,17431,-27737,17445,-27729,17459,-27720,17473,-27711,17487,-27702,17501,-27693,17516,-27684,17530,-27675,17544,-27666,17558,-27657,17572,-27648,17586,-27639,17600,-27630,17615,-27621,17629,-27612,17643,-27603,17657,-27594,17671,-27585,17685,-27576,17699,-27567,17713,-27558,17727,-27549,17742,-27539,17756,-27530,17770,-27521,17784,-27512,17798,-27503,17812,-27494,17826,-27485,17840,-27476,17854,-27467,17868,-27457,17882,-27448,17896,-27439,17910,-27430,17924,-27421,17938,-27412,17952,-27402,17966,-27393,17980,-27384,17994,-27375,18008,-27366,18022,-27356,18036,-27347,18050,-27338,18064,-27329,18078,-27320,18092,-27310,18106,-27301,18120,-27292,18134,-27282,18148,-27273,18162,-27264,18176,-27255,18190,-27245,18204,-27236,18218,-27227,18232,-27217,18246,-27208,18260,-27199,18273,-27189,18287,-27180,18301,-27171,18315,-27161,18329,-27152,18343,-27142,18357,-27133,18371,-27124,18385,-27114,18398,-27105,18412,-27095,18426,-27086,18440,-27077,18454,-27067,18468,-27058,18482,-27048,18495,-27039,18509,-27029,18523,-27020,18537,-27010,18551,-27001,18564,-26991,18578,-26982,18592,-26972,18606,-26963,18620,-26953,18633,-26944,18647,-26934,18661,-26925,18675,-26915,18689,-26906,18702,-26896,18716,-26886,18730,-26877,18744,-26867,18757,-26858,18771,-26848,18785,-26838,18798,-26829,18812,-26819,18826,-26810,18840,-26800,18853,-26790,18867,-26781,18881,-26771,18894,-26761,18908,-26752,18922,-26742,18935,-26732,18949,-26723,18963,-26713,18976,-26703,18990,-26693,19004,-26684,19017,-26674,19031,-26664,19045,-26655,19058,-26645,19072,-26635,19086,-26625,19099,-26616,19113,-26606,19126,-26596,19140,-26586,19154,-26576,19167,-26567,19181,-26557,19194,-26547,19208,-26537,19221,-26527,19235,-26517,19249,-26508,19262,-26498,19276,-26488,19289,-26478,19303,-26468,19316,-26458,19330,-26448,19343,-26438,19357,-26429,19370,-26419,19384,-26409,19397,-26399,19411,-26389,19424,-26379,19438,-26369,19451,-26359,19465,-26349,19478,-26339,19492,-26329,19505,-26319,19519,-26309,19532,-26299,19546,-26289,19559,-26279,19573,-26269,19586,-26259,19599,-26249,19613,-26239,19626,-26229,19640,-26219,19653,-26209,19667,-26199,19680,-26189,19693,-26179,19707,-26169,19720,-26159,19733,-26149,19747,-26138,19760,-26128,19774,-26118,19787,-26108,19800,-26098,19814,-26088,19827,-26078,19840,-26068,19854,-26057,19867,-26047,19880,-26037,19894,-26027,19907,-26017,19920,-26007,19933,-25996,19947,-25986,19960,-25976,19973,-25966,19987,-25955,20000,-25945,20013,-25935,20026,-25925,20040,-25914,20053,-25904,20066,-25894,20079,-25884,20093,-25873,20106,-25863,20119,-25853,20132,-25843,20146,-25832,20159,-25822,20172,-25812,20185,-25801,20198,-25791,20212,-25781,20225,-25770,20238,-25760,20251,-25750,20264,-25739,20277,-25729,20291,-25718,20304,-25708,20317,-25698,20330,-25687,20343,-25677,20356,-25666,20369,-25656,20383,-25646,20396,-25635,20409,-25625,20422,-25614,20435,-25604,20448,-25593,20461,-25583,20474,-25572,20487,-25562,20500,-25551,20513,-25541,20527,-25530,20540,-25520,20553,-25509,20566,-25499,20579,-25488,20592,-25478,20605,-25467,20618,-25457,20631,-25446,20644,-25436,20657,-25425,20670,-25415,20683,-25404,20696,-25393,20709,-25383,20722,-25372,20735,-25362,20748,-25351,20761,-25340,20774,-25330,20787,-25319,20800,-25308,20813,-25298,20825,-25287,20838,-25277,20851,-25266,20864,-25255,20877,-25244,20890,-25234,20903,-25223,20916,-25212,20929,-25202,20942,-25191,20955,-25180,20967,-25170,20980,-25159,20993,-25148,21006,-25137,21019,-25127,21032,-25116,21045,-25105,21057,-25094,21070,-25084,21083,-25073,21096,-25062,21109,-25051,21122,-25040,21134,-25030,21147,-25019,21160,-25008,21173,-24997,21186,-24986,21198,-24975,21211,-24965,21224,-24954,21237,-24943,21249,-24932,21262,-24921,21275,-24910,21288,-24899,21300,-24888,21313,-24878,21326,-24867,21339,-24856,21351,-24845,21364,-24834,21377,-24823,21389,-24812,21402,-24801,21415,-24790,21427,-24779,21440,-24768,21453,-24757,21465,-24746,21478,-24735,21491,-24724,21503,-24713,21516,-24702,21529,-24691,21541,-24680,21554,-24669,21566,-24658,21579,-24647,21592,-24636,21604,-24625,21617,-24614,21629,-24603,21642,-24592,21655,-24581,21667,-24570,21680,-24559,21692,-24547,21705,-24536,21717,-24525,21730,-24514,21743,-24503,21755,-24492,21768,-24481,21780,-24470,21793,-24458,21805,-24447,21818,-24436,21830,-24425,21843,-24414,21855,-24403,21868,-24391,21880,-24380,21893,-24369,21905,-24358,21917,-24347,21930,-24335,21942,-24324,21955,-24313,21967,-24302,21980,-24290,21992,-24279,22004,-24268,22017,-24257,22029,-24245,22042,-24234,22054,-24223,22066,-24212,22079,-24200,22091,-24189,22104,-24178,22116,-24166,22128,-24155,22141,-24144,22153,-24132,22165,-24121,22178,-24110,22190,-24098,22202,-24087,22215,-24076,22227,-24064,22239,-24053,22252,-24042,22264,-24030,22276,-24019,22288,-24007,22301,-23996,22313,-23985,22325,-23973,22338,-23962,22350,-23950,22362,-23939,22374,-23927,22387,-23916,22399,-23904,22411,-23893,22423,-23882,22435,-23870,22448,-23859,22460,-23847,22472,-23836,22484,-23824,22496,-23813,22509,-23801,22521,-23790,22533,-23778,22545,-23767,22557,-23755,22569,-23743,22582,-23732,22594,-23720,22606,-23709,22618,-23697,22630,-23686,22642,-23674,22654,-23662,22666,-23651,22678,-23639,22691,-23628,22703,-23616,22715,-23604,22727,-23593,22739,-23581,22751,-23570,22763,-23558,22775,-23546,22787,-23535,22799,-23523,22811,-23511,22823,-23500,22835,-23488,22847,-23476,22859,-23465,22871,-23453,22883,-23441,22895,-23429,22907,-23418,22919,-23406,22931,-23394,22943,-23383,22955,-23371,22967,-23359,22979,-23347,22991,-23336,23003,-23324,23015,-23312,23027,-23300,23039,-23288,23050,-23277,23062,-23265,23074,-23253,23086,-23241,23098,-23229,23110,-23218,23122,-23206,23134,-23194,23146,-23182,23157,-23170,23169,-23158,23181,-23147,23193,-23135,23205,-23123,23217,-23111,23228,-23099,23240,-23087,23252,-23075,23264,-23063,23276,-23051,23287,-23040,23299,-23028,23311,-23016,23323,-23004,23335,-22992,23346,-22980,23358,-22968,23370,-22956,23382,-22944,23393,-22932,23405,-22920,23417,-22908,23428,-22896,23440,-22884,23452,-22872,23464,-22860,23475,-22848,23487,-22836,23499,-22824,23510,-22812,23522,-22800,23534,-22788,23545,-22776,23557,-22764,23569,-22752,23580,-22740,23592,-22728,23603,-22716,23615,-22704,23627,-22692,23638,-22679,23650,-22667,23661,-22655,23673,-22643,23685,-22631,23696,-22619,23708,-22607,23719,-22595,23731,-22583,23742,-22570,23754,-22558,23766,-22546,23777,-22534,23789,-22522,23800,-22510,23812,-22497,23823,-22485,23835,-22473,23846,-22461,23858,-22449,23869,-22436,23881,-22424,23892,-22412,23903,-22400,23915,-22388,23926,-22375,23938,-22363,23949,-22351,23961,-22339,23972,-22326,23984,-22314,23995,-22302,24006,-22289,24018,-22277,24029,-22265,24041,-22253,24052,-22240,24063,-22228,24075,-22216,24086,-22203,24097,-22191,24109,-22179,24120,-22166,24131,-22154,24143,-22142,24154,-22129,24165,-22117,24177,-22105,24188,-22092,24199,-22080,24211,-22067,24222,-22055,24233,-22043,24244,-22030,24256,-22018,24267,-22005,24278,-21993,24289,-21981,24301,-21968,24312,-21956,24323,-21943,24334,-21931,24346,-21918,24357,-21906,24368,-21894,24379,-21881,24390,-21869,24402,-21856,24413,-21844,24424,-21831,24435,-21819,24446,-21806,24457,-21794,24469,-21781,24480,-21769,24491,-21756,24502,-21744,24513,-21731,24524,-21718,24535,-21706,24546,-21693,24558,-21681,24569,-21668,24580,-21656,24591,-21643,24602,-21630,24613,-21618,24624,-21605,24635,-21593,24646,-21580,24657,-21567,24668,-21555,24679,-21542,24690,-21530,24701,-21517,24712,-21504,24723,-21492,24734,-21479,24745,-21466,24756,-21454,24767,-21441,24778,-21428,24789,-21416,24800,-21403,24811,-21390,24822,-21378,24833,-21365,24844,-21352,24855,-21340,24866,-21327,24877,-21314,24887,-21301,24898,-21289,24909,-21276,24920,-21263,24931,-21250,24942,-21238,24953,-21225,24964,-21212,24974,-21199,24985,-21187,24996,-21174,25007,-21161,25018,-21148,25029,-21135,25039,-21123,25050,-21110,25061,-21097,25072,-21084,25083,-21071,25093,-21058,25104,-21046,25115,-21033,25126,-21020,25136,-21007,25147,-20994,25158,-20981,25169,-20968,25179,-20956,25190,-20943,25201,-20930,25211,-20917,25222,-20904,25233,-20891,25243,-20878,25254,-20865,25265,-20852,25276,-20839,25286,-20826,25297,-20814,25307,-20801,25318,-20788,25329,-20775,25339,-20762,25350,-20749,25361,-20736,25371,-20723,25382,-20710,25392,-20697,25403,-20684,25414,-20671,25424,-20658,25435,-20645,25445,-20632,25456,-20619,25466,-20606,25477,-20593,25487,-20580,25498,-20567,25508,-20554,25519,-20541,25529,-20528,25540,-20514,25550,-20501,25561,-20488,25571,-20475,25582,-20462,25592,-20449,25603,-20436,25613,-20423,25624,-20410,25634,-20397,25645,-20384,25655,-20370,25665,-20357,25676,-20344,25686,-20331,25697,-20318,25707,-20305,25717,-20292,25728,-20278,25738,-20265,25749,-20252,25759,-20239,25769,-20226,25780,-20213,25790,-20199,25800,-20186,25811,-20173,25821,-20160,25831,-20147,25842,-20133,25852,-20120,25862,-20107,25872,-20094,25883,-20080,25893,-20067,25903,-20054,25913,-20041,25924,-20027,25934,-20014,25944,-20001,25954,-19988,25965,-19974,25975,-19961,25985,-19948,25995,-19934,26006,-19921,26016,-19908,26026,-19895,26036,-19881,26046,-19868,26056,-19855,26067,-19841,26077,-19828,26087,-19815,26097,-19801,26107,-19788,26117,-19775,26127,-19761,26137,-19748,26148,-19734,26158,-19721,26168,-19708,26178,-19694,26188,-19681,26198,-19668,26208,-19654,26218,-19641,26228,-19627,26238,-19614,26248,-19600,26258,-19587,26268,-19574,26278,-19560,26288,-19547,26298,-19533,26308,-19520,26318,-19506,26328,-19493,26338,-19479,26348,-19466,26358,-19452,26368,-19439,26378,-19425,26388,-19412,26398,-19398,26408,-19385,26418,-19371,26428,-19358,26437,-19344,26447,-19331,26457,-19317,26467,-19304,26477,-19290,26487,-19277,26497,-19263,26507,-19250,26516,-19236,26526,-19222,26536,-19209,26546,-19195,26556,-19182,26566,-19168,26575,-19155,26585,-19141,26595,-19127,26605,-19114,26615,-19100,26624,-19087,26634,-19073,26644,-19059,26654,-19046,26663,-19032,26673,-19018,26683,-19005,26692,-18991,26702,-18977,26712,-18964,26722,-18950,26731,-18936,26741,-18923,26751,-18909,26760,-18895,26770,-18882,26780,-18868,26789,-18854,26799,-18841,26809,-18827,26818,-18813,26828,-18799,26837,-18786,26847,-18772,26857,-18758,26866,-18745,26876,-18731,26885,-18717,26895,-18703,26905,-18690,26914,-18676,26924,-18662,26933,-18648,26943,-18634,26952,-18621,26962,-18607,26971,-18593,26981,-18579,26990,-18565,27000,-18552,27009,-18538,27019,-18524,27028,-18510,27038,-18496,27047,-18483,27057,-18469,27066,-18455,27076,-18441,27085,-18427,27094,-18413,27104,-18399,27113,-18386,27123,-18372,27132,-18358,27141,-18344,27151,-18330,27160,-18316,27170,-18302,27179,-18288,27188,-18274,27198,-18261,27207,-18247,27216,-18233,27226,-18219,27235,-18205,27244,-18191,27254,-18177,27263,-18163,27272,-18149,27281,-18135,27291,-18121,27300,-18107,27309,-18093,27319,-18079,27328,-18065,27337,-18051,27346,-18037,27355,-18023,27365,-18009,27374,-17995,27383,-17981,27392,-17967,27401,-17953,27411,-17939,27420,-17925,27429,-17911,27438,-17897,27447,-17883,27456,-17869,27466,-17855,27475,-17841,27484,-17827,27493,-17813,27502,-17799,27511,-17785,27520,-17771,27529,-17757,27538,-17743,27548,-17728,27557,-17714,27566,-17700,27575,-17686,27584,-17672,27593,-17658,27602,-17644,27611,-17630,27620,-17616,27629,-17601,27638,-17587,27647,-17573,27656,-17559,27665,-17545,27674,-17531,27683,-17517,27692,-17502,27701,-17488,27710,-17474,27719,-17460,27728,-17446,27736,-17432,27745,-17417,27754,-17403,27763,-17389,27772,-17375,27781,-17361,27790,-17346,27799,-17332,27808,-17318,27816,-17304,27825,-17289,27834,-17275,27843,-17261,27852,-17247,27861,-17233,27869,-17218,27878,-17204,27887,-17190,27896,-17175,27905,-17161,27913,-17147,27922,-17133,27931,-17118,27940,-17104,27948,-17090,27957,-17075,27966,-17061,27975,-17047,27983,-17033,27992,-17018,28001,-17004,28009,-16990,28018,-16975,28027,-16961,28036,-16947,28044,-16932,28053,-16918,28062,-16904,28070,-16889,28079,-16875,28087,-16860,28096,-16846,28105,-16832,28113,-16817,28122,-16803,28131,-16789,28139,-16774,28148,-16760,28156,-16745,28165,-16731,28173,-16717,28182,-16702,28190,-16688,28199,-16673,28208,-16659,28216,-16644,28225,-16630,28233,-16616,28242,-16601,28250,-16587,28259,-16572,28267,-16558,28275,-16543,28284,-16529,28292,-16514,28301,-16500,28309,-16485,28318,-16471,28326,-16456,28335,-16442,28343,-16428,28351,-16413,28360,-16399,28368}; diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h deleted file mode 100644 index 6fc18ebfbe0cbe52c5da48026e59f209e696e87d..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:2047)/6144)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:4094)/6144)); -twa2 = zeros(1,4096); -twb2 = zeros(1,4096); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); - - - */ -int16_t twa6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394}; - - - -int16_t twb6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-68,32766,-135,32766,-202,32765,-269,32765,-336,32764,-403,32763,-470,32762,-537,32761,-604,32760,-671,32758,-738,32757,-805,32755,-872,32753,-939,32751,-1006,32749,-1073,32747,-1140,32744,-1207,32742,-1274,32739,-1340,32736,-1407,32733,-1474,32730,-1541,32727,-1608,32724,-1675,32720,-1742,32717,-1809,32713,-1876,32709,-1943,32705,-2010,32701,-2077,32696,-2144,32692,-2210,32687,-2277,32683,-2344,32678,-2411,32673,-2478,32668,-2545,32662,-2611,32657,-2678,32651,-2745,32646,-2812,32640,-2879,32634,-2945,32628,-3012,32622,-3079,32615,-3146,32609,-3212,32602,-3279,32595,-3346,32588,-3412,32581,-3479,32574,-3546,32567,-3612,32559,-3679,32552,-3745,32544,-3812,32536,-3878,32528,-3945,32520,-4012,32512,-4078,32503,-4145,32495,-4211,32486,-4277,32477,-4344,32468,-4410,32459,-4477,32450,-4543,32441,-4609,32431,-4676,32422,-4742,32412,-4808,32402,-4875,32392,-4941,32382,-5007,32371,-5073,32361,-5140,32350,-5206,32340,-5272,32329,-5338,32318,-5404,32307,-5470,32295,-5536,32284,-5602,32273,-5668,32261,-5734,32249,-5800,32237,-5866,32225,-5932,32213,-5998,32201,-6064,32188,-6130,32176,-6196,32163,-6262,32150,-6327,32137,-6393,32124,-6459,32110,-6524,32097,-6590,32084,-6656,32070,-6721,32056,-6787,32042,-6852,32028,-6918,32014,-6983,31999,-7049,31985,-7114,31970,-7180,31956,-7245,31941,-7311,31926,-7376,31911,-7441,31895,-7506,31880,-7572,31864,-7637,31849,-7702,31833,-7767,31817,-7832,31801,-7897,31785,-7962,31768,-8027,31752,-8092,31735,-8157,31718,-8222,31701,-8287,31684,-8352,31667,-8416,31650,-8481,31633,-8546,31615,-8611,31597,-8675,31580,-8740,31562,-8804,31544,-8869,31525,-8933,31507,-8998,31489,-9062,31470,-9127,31451,-9191,31432,-9255,31413,-9320,31394,-9384,31375,-9448,31356,-9512,31336,-9576,31316,-9640,31297,-9704,31277,-9768,31257,-9832,31236,-9896,31216,-9960,31196,-10024,31175,-10088,31154,-10152,31134,-10215,31113,-10279,31092,-10343,31070,-10406,31049,-10470,31028,-10533,31006,-10597,30984,-10660,30962,-10723,30940,-10787,30918,-10850,30896,-10913,30874,-10976,30851,-11039,30828,-11102,30806,-11165,30783,-11228,30760,-11291,30737,-11354,30713,-11417,30690,-11480,30666,-11543,30643,-11605,30619,-11668,30595,-11731,30571,-11793,30547,-11856,30522,-11918,30498,-11981,30473,-12043,30449,-12105,30424,-12167,30399,-12230,30374,-12292,30349,-12354,30323,-12416,30298,-12478,30272,-12540,30247,-12602,30221,-12664,30195,-12725,30169,-12787,30142,-12849,30116,-12910,30090,-12972,30063,-13034,30036,-13095,30009,-13156,29983,-13218,29955,-13279,29928,-13340,29901,-13401,29873,-13463,29846,-13524,29818,-13585,29790,-13646,29762,-13707,29734,-13767,29706,-13828,29678,-13889,29649,-13950,29621,-14010,29592,-14071,29563,-14131,29534,-14192,29505,-14252,29476,-14312,29446,-14373,29417,-14433,29387,-14493,29358,-14553,29328,-14613,29298,-14673,29268,-14733,29238,-14793,29207,-14853,29177,-14912,29146,-14972,29116,-15031,29085,-15091,29054,-15150,29023,-15210,28992,-15269,28960,-15328,28929,-15388,28897,-15447,28866,-15506,28834,-15565,28802,-15624,28770,-15683,28738,-15741,28706,-15800,28673,-15859,28641,-15918,28608,-15976,28575,-16035,28543,-16093,28510,-16151,28477,-16210,28443,-16268,28410,-16326,28377,-16384,28343,-16442,28309,-16500,28275,-16558,28242,-16616,28208,-16673,28173,-16731,28139,-16789,28105,-16846,28070,-16904,28036,-16961,28001,-17018,27966,-17075,27931,-17133,27896,-17190,27861,-17247,27825,-17304,27790,-17361,27754,-17417,27719,-17474,27683,-17531,27647,-17587,27611,-17644,27575,-17700,27538,-17757,27502,-17813,27466,-17869,27429,-17925,27392,-17981,27355,-18037,27319,-18093,27281,-18149,27244,-18205,27207,-18261,27170,-18316,27132,-18372,27094,-18427,27057,-18483,27019,-18538,26981,-18593,26943,-18648,26905,-18703,26866,-18758,26828,-18813,26789,-18868,26751,-18923,26712,-18977,26673,-19032,26634,-19087,26595,-19141,26556,-19195,26516,-19250,26477,-19304,26437,-19358,26398,-19412,26358,-19466,26318,-19520,26278,-19574,26238,-19627,26198,-19681,26158,-19734,26117,-19788,26077,-19841,26036,-19895,25995,-19948,25954,-20001,25913,-20054,25872,-20107,25831,-20160,25790,-20213,25749,-20265,25707,-20318,25665,-20370,25624,-20423,25582,-20475,25540,-20528,25498,-20580,25456,-20632,25414,-20684,25371,-20736,25329,-20788,25286,-20839,25243,-20891,25201,-20943,25158,-20994,25115,-21046,25072,-21097,25029,-21148,24985,-21199,24942,-21250,24898,-21301,24855,-21352,24811,-21403,24767,-21454,24723,-21504,24679,-21555,24635,-21605,24591,-21656,24546,-21706,24502,-21756,24457,-21806,24413,-21856,24368,-21906,24323,-21956,24278,-22005,24233,-22055,24188,-22105,24143,-22154,24097,-22203,24052,-22253,24006,-22302,23961,-22351,23915,-22400,23869,-22449,23823,-22497,23777,-22546,23731,-22595,23685,-22643,23638,-22692,23592,-22740,23545,-22788,23499,-22836,23452,-22884,23405,-22932,23358,-22980,23311,-23028,23264,-23075,23217,-23123,23169,-23170,23122,-23218,23074,-23265,23027,-23312,22979,-23359,22931,-23406,22883,-23453,22835,-23500,22787,-23546,22739,-23593,22691,-23639,22642,-23686,22594,-23732,22545,-23778,22496,-23824,22448,-23870,22399,-23916,22350,-23962,22301,-24007,22252,-24053,22202,-24098,22153,-24144,22104,-24189,22054,-24234,22004,-24279,21955,-24324,21905,-24369,21855,-24414,21805,-24458,21755,-24503,21705,-24547,21655,-24592,21604,-24636,21554,-24680,21503,-24724,21453,-24768,21402,-24812,21351,-24856,21300,-24899,21249,-24943,21198,-24986,21147,-25030,21096,-25073,21045,-25116,20993,-25159,20942,-25202,20890,-25244,20838,-25287,20787,-25330,20735,-25372,20683,-25415,20631,-25457,20579,-25499,20527,-25541,20474,-25583,20422,-25625,20369,-25666,20317,-25708,20264,-25750,20212,-25791,20159,-25832,20106,-25873,20053,-25914,20000,-25955,19947,-25996,19894,-26037,19840,-26078,19787,-26118,19733,-26159,19680,-26199,19626,-26239,19573,-26279,19519,-26319,19465,-26359,19411,-26399,19357,-26438,19303,-26478,19249,-26517,19194,-26557,19140,-26596,19086,-26635,19031,-26674,18976,-26713,18922,-26752,18867,-26790,18812,-26829,18757,-26867,18702,-26906,18647,-26944,18592,-26982,18537,-27020,18482,-27058,18426,-27095,18371,-27133,18315,-27171,18260,-27208,18204,-27245,18148,-27282,18092,-27320,18036,-27356,17980,-27393,17924,-27430,17868,-27467,17812,-27503,17756,-27539,17699,-27576,17643,-27612,17586,-27648,17530,-27684,17473,-27720,17416,-27755,17360,-27791,17303,-27826,17246,-27862,17189,-27897,17132,-27932,17074,-27967,17017,-28002,16960,-28037,16903,-28071,16845,-28106,16788,-28140,16730,-28174,16672,-28209,16615,-28243,16557,-28276,16499,-28310,16441,-28344,16383,-28378,16325,-28411,16267,-28444,16209,-28478,16150,-28511,16092,-28544,16034,-28576,15975,-28609,15917,-28642,15858,-28674,15799,-28707,15740,-28739,15682,-28771,15623,-28803,15564,-28835,15505,-28867,15446,-28898,15387,-28930,15327,-28961,15268,-28993,15209,-29024,15149,-29055,15090,-29086,15030,-29117,14971,-29147,14911,-29178,14852,-29208,14792,-29239,14732,-29269,14672,-29299,14612,-29329,14552,-29359,14492,-29388,14432,-29418,14372,-29447,14311,-29477,14251,-29506,14191,-29535,14130,-29564,14070,-29593,14009,-29622,13949,-29650,13888,-29679,13827,-29707,13766,-29735,13706,-29763,13645,-29791,13584,-29819,13523,-29847,13462,-29874,13400,-29902,13339,-29929,13278,-29956,13217,-29984,13155,-30010,13094,-30037,13033,-30064,12971,-30091,12909,-30117,12848,-30143,12786,-30170,12724,-30196,12663,-30222,12601,-30248,12539,-30273,12477,-30299,12415,-30324,12353,-30350,12291,-30375,12229,-30400,12166,-30425,12104,-30450,12042,-30474,11980,-30499,11917,-30523,11855,-30548,11792,-30572,11730,-30596,11667,-30620,11604,-30644,11542,-30667,11479,-30691,11416,-30714,11353,-30738,11290,-30761,11227,-30784,11164,-30807,11101,-30829,11038,-30852,10975,-30875,10912,-30897,10849,-30919,10786,-30941,10722,-30963,10659,-30985,10596,-31007,10532,-31029,10469,-31050,10405,-31071,10342,-31093,10278,-31114,10214,-31135,10151,-31155,10087,-31176,10023,-31197,9959,-31217,9895,-31237,9831,-31258,9767,-31278,9703,-31298,9639,-31317,9575,-31337,9511,-31357,9447,-31376,9383,-31395,9319,-31414,9254,-31433,9190,-31452,9126,-31471,9061,-31490,8997,-31508,8932,-31526,8868,-31545,8803,-31563,8739,-31581,8674,-31598,8610,-31616,8545,-31634,8480,-31651,8415,-31668,8351,-31685,8286,-31702,8221,-31719,8156,-31736,8091,-31753,8026,-31769,7961,-31786,7896,-31802,7831,-31818,7766,-31834,7701,-31850,7636,-31865,7571,-31881,7505,-31896,7440,-31912,7375,-31927,7310,-31942,7244,-31957,7179,-31971,7113,-31986,7048,-32000,6982,-32015,6917,-32029,6851,-32043,6786,-32057,6720,-32071,6655,-32085,6589,-32098,6523,-32111,6458,-32125,6392,-32138,6326,-32151,6261,-32164,6195,-32177,6129,-32189,6063,-32202,5997,-32214,5931,-32226,5865,-32238,5799,-32250,5733,-32262,5667,-32274,5601,-32285,5535,-32296,5469,-32308,5403,-32319,5337,-32330,5271,-32341,5205,-32351,5139,-32362,5072,-32372,5006,-32383,4940,-32393,4874,-32403,4807,-32413,4741,-32423,4675,-32432,4608,-32442,4542,-32451,4476,-32460,4409,-32469,4343,-32478,4276,-32487,4210,-32496,4144,-32504,4077,-32513,4011,-32521,3944,-32529,3877,-32537,3811,-32545,3744,-32553,3678,-32560,3611,-32568,3545,-32575,3478,-32582,3411,-32589,3345,-32596,3278,-32603,3211,-32610,3145,-32616,3078,-32623,3011,-32629,2944,-32635,2878,-32641,2811,-32647,2744,-32652,2677,-32658,2610,-32663,2544,-32669,2477,-32674,2410,-32679,2343,-32684,2276,-32688,2209,-32693,2143,-32697,2076,-32702,2009,-32706,1942,-32710,1875,-32714,1808,-32718,1741,-32721,1674,-32725,1607,-32728,1540,-32731,1473,-32734,1406,-32737,1339,-32740,1273,-32743,1206,-32745,1139,-32748,1072,-32750,1005,-32752,938,-32754,871,-32756,804,-32758,737,-32759,670,-32761,603,-32762,536,-32763,469,-32764,402,-32765,335,-32766,268,-32766,201,-32767,134,-32767,67,-32767,0,-32767,-68,-32767,-135,-32767,-202,-32767,-269,-32766,-336,-32766,-403,-32765,-470,-32764,-537,-32763,-604,-32762,-671,-32761,-738,-32759,-805,-32758,-872,-32756,-939,-32754,-1006,-32752,-1073,-32750,-1140,-32748,-1207,-32745,-1274,-32743,-1340,-32740,-1407,-32737,-1474,-32734,-1541,-32731,-1608,-32728,-1675,-32725,-1742,-32721,-1809,-32718,-1876,-32714,-1943,-32710,-2010,-32706,-2077,-32702,-2144,-32697,-2210,-32693,-2277,-32688,-2344,-32684,-2411,-32679,-2478,-32674,-2545,-32669,-2611,-32663,-2678,-32658,-2745,-32652,-2812,-32647,-2879,-32641,-2945,-32635,-3012,-32629,-3079,-32623,-3146,-32616,-3212,-32610,-3279,-32603,-3346,-32596,-3412,-32589,-3479,-32582,-3546,-32575,-3612,-32568,-3679,-32560,-3745,-32553,-3812,-32545,-3878,-32537,-3945,-32529,-4012,-32521,-4078,-32513,-4145,-32504,-4211,-32496,-4277,-32487,-4344,-32478,-4410,-32469,-4477,-32460,-4543,-32451,-4609,-32442,-4676,-32432,-4742,-32423,-4808,-32413,-4875,-32403,-4941,-32393,-5007,-32383,-5073,-32372,-5140,-32362,-5206,-32351,-5272,-32341,-5338,-32330,-5404,-32319,-5470,-32308,-5536,-32296,-5602,-32285,-5668,-32274,-5734,-32262,-5800,-32250,-5866,-32238,-5932,-32226,-5998,-32214,-6064,-32202,-6130,-32189,-6196,-32177,-6262,-32164,-6327,-32151,-6393,-32138,-6459,-32125,-6524,-32111,-6590,-32098,-6656,-32085,-6721,-32071,-6787,-32057,-6852,-32043,-6918,-32029,-6983,-32015,-7049,-32000,-7114,-31986,-7180,-31971,-7245,-31957,-7311,-31942,-7376,-31927,-7441,-31912,-7506,-31896,-7572,-31881,-7637,-31865,-7702,-31850,-7767,-31834,-7832,-31818,-7897,-31802,-7962,-31786,-8027,-31769,-8092,-31753,-8157,-31736,-8222,-31719,-8287,-31702,-8352,-31685,-8416,-31668,-8481,-31651,-8546,-31634,-8611,-31616,-8675,-31598,-8740,-31581,-8804,-31563,-8869,-31545,-8933,-31526,-8998,-31508,-9062,-31490,-9127,-31471,-9191,-31452,-9255,-31433,-9320,-31414,-9384,-31395,-9448,-31376,-9512,-31357,-9576,-31337,-9640,-31317,-9704,-31298,-9768,-31278,-9832,-31258,-9896,-31237,-9960,-31217,-10024,-31197,-10088,-31176,-10152,-31155,-10215,-31135,-10279,-31114,-10343,-31093,-10406,-31071,-10470,-31050,-10533,-31029,-10597,-31007,-10660,-30985,-10723,-30963,-10787,-30941,-10850,-30919,-10913,-30897,-10976,-30875,-11039,-30852,-11102,-30829,-11165,-30807,-11228,-30784,-11291,-30761,-11354,-30738,-11417,-30714,-11480,-30691,-11543,-30667,-11605,-30644,-11668,-30620,-11731,-30596,-11793,-30572,-11856,-30548,-11918,-30523,-11981,-30499,-12043,-30474,-12105,-30450,-12167,-30425,-12230,-30400,-12292,-30375,-12354,-30350,-12416,-30324,-12478,-30299,-12540,-30273,-12602,-30248,-12664,-30222,-12725,-30196,-12787,-30170,-12849,-30143,-12910,-30117,-12972,-30091,-13034,-30064,-13095,-30037,-13156,-30010,-13218,-29984,-13279,-29956,-13340,-29929,-13401,-29902,-13463,-29874,-13524,-29847,-13585,-29819,-13646,-29791,-13707,-29763,-13767,-29735,-13828,-29707,-13889,-29679,-13950,-29650,-14010,-29622,-14071,-29593,-14131,-29564,-14192,-29535,-14252,-29506,-14312,-29477,-14373,-29447,-14433,-29418,-14493,-29388,-14553,-29359,-14613,-29329,-14673,-29299,-14733,-29269,-14793,-29239,-14853,-29208,-14912,-29178,-14972,-29147,-15031,-29117,-15091,-29086,-15150,-29055,-15210,-29024,-15269,-28993,-15328,-28961,-15388,-28930,-15447,-28898,-15506,-28867,-15565,-28835,-15624,-28803,-15683,-28771,-15741,-28739,-15800,-28707,-15859,-28674,-15918,-28642,-15976,-28609,-16035,-28576,-16093,-28544,-16151,-28511,-16210,-28478,-16268,-28444,-16326,-28411,-16384,-28378,-16442,-28344,-16500,-28310,-16558,-28276,-16616,-28243,-16673,-28209,-16731,-28174,-16789,-28140,-16846,-28106,-16904,-28071,-16961,-28037,-17018,-28002,-17075,-27967,-17133,-27932,-17190,-27897,-17247,-27862,-17304,-27826,-17361,-27791,-17417,-27755,-17474,-27720,-17531,-27684,-17587,-27648,-17644,-27612,-17700,-27576,-17757,-27539,-17813,-27503,-17869,-27467,-17925,-27430,-17981,-27393,-18037,-27356,-18093,-27320,-18149,-27282,-18205,-27245,-18261,-27208,-18316,-27171,-18372,-27133,-18427,-27095,-18483,-27058,-18538,-27020,-18593,-26982,-18648,-26944,-18703,-26906,-18758,-26867,-18813,-26829,-18868,-26790,-18923,-26752,-18977,-26713,-19032,-26674,-19087,-26635,-19141,-26596,-19195,-26557,-19250,-26517,-19304,-26478,-19358,-26438,-19412,-26399,-19466,-26359,-19520,-26319,-19574,-26279,-19627,-26239,-19681,-26199,-19734,-26159,-19788,-26118,-19841,-26078,-19895,-26037,-19948,-25996,-20001,-25955,-20054,-25914,-20107,-25873,-20160,-25832,-20213,-25791,-20265,-25750,-20318,-25708,-20370,-25666,-20423,-25625,-20475,-25583,-20528,-25541,-20580,-25499,-20632,-25457,-20684,-25415,-20736,-25372,-20788,-25330,-20839,-25287,-20891,-25244,-20943,-25202,-20994,-25159,-21046,-25116,-21097,-25073,-21148,-25030,-21199,-24986,-21250,-24943,-21301,-24899,-21352,-24856,-21403,-24812,-21454,-24768,-21504,-24724,-21555,-24680,-21605,-24636,-21656,-24592,-21706,-24547,-21756,-24503,-21806,-24458,-21856,-24414,-21906,-24369,-21956,-24324,-22005,-24279,-22055,-24234,-22105,-24189,-22154,-24144,-22203,-24098,-22253,-24053,-22302,-24007,-22351,-23962,-22400,-23916,-22449,-23870,-22497,-23824,-22546,-23778,-22595,-23732,-22643,-23686,-22692,-23639,-22740,-23593,-22788,-23546,-22836,-23500,-22884,-23453,-22932,-23406,-22980,-23359,-23028,-23312,-23075,-23265,-23123,-23218,-23170,-23170,-23218,-23123,-23265,-23075,-23312,-23028,-23359,-22980,-23406,-22932,-23453,-22884,-23500,-22836,-23546,-22788,-23593,-22740,-23639,-22692,-23686,-22643,-23732,-22595,-23778,-22546,-23824,-22497,-23870,-22449,-23916,-22400,-23962,-22351,-24007,-22302,-24053,-22253,-24098,-22203,-24144,-22154,-24189,-22105,-24234,-22055,-24279,-22005,-24324,-21956,-24369,-21906,-24414,-21856,-24458,-21806,-24503,-21756,-24547,-21706,-24592,-21656,-24636,-21605,-24680,-21555,-24724,-21504,-24768,-21454,-24812,-21403,-24856,-21352,-24899,-21301,-24943,-21250,-24986,-21199,-25030,-21148,-25073,-21097,-25116,-21046,-25159,-20994,-25202,-20943,-25244,-20891,-25287,-20839,-25330,-20788,-25372,-20736,-25415,-20684,-25457,-20632,-25499,-20580,-25541,-20528,-25583,-20475,-25625,-20423,-25666,-20370,-25708,-20318,-25750,-20265,-25791,-20213,-25832,-20160,-25873,-20107,-25914,-20054,-25955,-20001,-25996,-19948,-26037,-19895,-26078,-19841,-26118,-19788,-26159,-19734,-26199,-19681,-26239,-19627,-26279,-19574,-26319,-19520,-26359,-19466,-26399,-19412,-26438,-19358,-26478,-19304,-26517,-19250,-26557,-19195,-26596,-19141,-26635,-19087,-26674,-19032,-26713,-18977,-26752,-18923,-26790,-18868,-26829,-18813,-26867,-18758,-26906,-18703,-26944,-18648,-26982,-18593,-27020,-18538,-27058,-18483,-27095,-18427,-27133,-18372,-27171,-18316,-27208,-18261,-27245,-18205,-27282,-18149,-27320,-18093,-27356,-18037,-27393,-17981,-27430,-17925,-27467,-17869,-27503,-17813,-27539,-17757,-27576,-17700,-27612,-17644,-27648,-17587,-27684,-17531,-27720,-17474,-27755,-17417,-27791,-17361,-27826,-17304,-27862,-17247,-27897,-17190,-27932,-17133,-27967,-17075,-28002,-17018,-28037,-16961,-28071,-16904,-28106,-16846,-28140,-16789,-28174,-16731,-28209,-16673,-28243,-16616,-28276,-16558,-28310,-16500,-28344,-16442,-28378,-16384,-28411,-16326,-28444,-16268,-28478,-16210,-28511,-16151,-28544,-16093,-28576,-16035,-28609,-15976,-28642,-15918,-28674,-15859,-28707,-15800,-28739,-15741,-28771,-15683,-28803,-15624,-28835,-15565,-28867,-15506,-28898,-15447,-28930,-15388,-28961,-15328,-28993,-15269,-29024,-15210,-29055,-15150,-29086,-15091,-29117,-15031,-29147,-14972,-29178,-14912,-29208,-14853,-29239,-14793,-29269,-14733,-29299,-14673,-29329,-14613,-29359,-14553,-29388,-14493,-29418,-14433,-29447,-14373,-29477,-14312,-29506,-14252,-29535,-14192,-29564,-14131,-29593,-14071,-29622,-14010,-29650,-13950,-29679,-13889,-29707,-13828,-29735,-13767,-29763,-13707,-29791,-13646,-29819,-13585,-29847,-13524,-29874,-13463,-29902,-13401,-29929,-13340,-29956,-13279,-29984,-13218,-30010,-13156,-30037,-13095,-30064,-13034,-30091,-12972,-30117,-12910,-30143,-12849,-30170,-12787,-30196,-12725,-30222,-12664,-30248,-12602,-30273,-12540,-30299,-12478,-30324,-12416,-30350,-12354,-30375,-12292,-30400,-12230,-30425,-12167,-30450,-12105,-30474,-12043,-30499,-11981,-30523,-11918,-30548,-11856,-30572,-11793,-30596,-11731,-30620,-11668,-30644,-11605,-30667,-11543,-30691,-11480,-30714,-11417,-30738,-11354,-30761,-11291,-30784,-11228,-30807,-11165,-30829,-11102,-30852,-11039,-30875,-10976,-30897,-10913,-30919,-10850,-30941,-10787,-30963,-10723,-30985,-10660,-31007,-10597,-31029,-10533,-31050,-10470,-31071,-10406,-31093,-10343,-31114,-10279,-31135,-10215,-31155,-10152,-31176,-10088,-31197,-10024,-31217,-9960,-31237,-9896,-31258,-9832,-31278,-9768,-31298,-9704,-31317,-9640,-31337,-9576,-31357,-9512,-31376,-9448,-31395,-9384,-31414,-9320,-31433,-9255,-31452,-9191,-31471,-9127,-31490,-9062,-31508,-8998,-31526,-8933,-31545,-8869,-31563,-8804,-31581,-8740,-31598,-8675,-31616,-8611,-31634,-8546,-31651,-8481,-31668,-8416,-31685,-8352,-31702,-8287,-31719,-8222,-31736,-8157,-31753,-8092,-31769,-8027,-31786,-7962,-31802,-7897,-31818,-7832,-31834,-7767,-31850,-7702,-31865,-7637,-31881,-7572,-31896,-7506,-31912,-7441,-31927,-7376,-31942,-7311,-31957,-7245,-31971,-7180,-31986,-7114,-32000,-7049,-32015,-6983,-32029,-6918,-32043,-6852,-32057,-6787,-32071,-6721,-32085,-6656,-32098,-6590,-32111,-6524,-32125,-6459,-32138,-6393,-32151,-6327,-32164,-6262,-32177,-6196,-32189,-6130,-32202,-6064,-32214,-5998,-32226,-5932,-32238,-5866,-32250,-5800,-32262,-5734,-32274,-5668,-32285,-5602,-32296,-5536,-32308,-5470,-32319,-5404,-32330,-5338,-32341,-5272,-32351,-5206,-32362,-5140,-32372,-5073,-32383,-5007,-32393,-4941,-32403,-4875,-32413,-4808,-32423,-4742,-32432,-4676,-32442,-4609,-32451,-4543,-32460,-4477,-32469,-4410,-32478,-4344,-32487,-4277,-32496,-4211,-32504,-4145,-32513,-4078,-32521,-4012,-32529,-3945,-32537,-3878,-32545,-3812,-32553,-3745,-32560,-3679,-32568,-3612,-32575,-3546,-32582,-3479,-32589,-3412,-32596,-3346,-32603,-3279,-32610,-3212,-32616,-3146,-32623,-3079,-32629,-3012,-32635,-2945,-32641,-2879,-32647,-2812,-32652,-2745,-32658,-2678,-32663,-2611,-32669,-2545,-32674,-2478,-32679,-2411,-32684,-2344,-32688,-2277,-32693,-2210,-32697,-2144,-32702,-2077,-32706,-2010,-32710,-1943,-32714,-1876,-32718,-1809,-32721,-1742,-32725,-1675,-32728,-1608,-32731,-1541,-32734,-1474,-32737,-1407,-32740,-1340,-32743,-1274,-32745,-1207,-32748,-1140,-32750,-1073,-32752,-1006,-32754,-939,-32756,-872,-32758,-805,-32759,-738,-32761,-671,-32762,-604,-32763,-537,-32764,-470,-32765,-403,-32766,-336,-32766,-269,-32767,-202,-32767,-135,-32767,-68,-32767,-1,-32767,67,-32767,134,-32767,201,-32766,268,-32766,335,-32765,402,-32764,469,-32763,536,-32762,603,-32761,670,-32759,737,-32758,804,-32756,871,-32754,938,-32752,1005,-32750,1072,-32748,1139,-32745,1206,-32743,1273,-32740,1339,-32737,1406,-32734,1473,-32731,1540,-32728,1607,-32725,1674,-32721,1741,-32718,1808,-32714,1875,-32710,1942,-32706,2009,-32702,2076,-32697,2143,-32693,2209,-32688,2276,-32684,2343,-32679,2410,-32674,2477,-32669,2544,-32663,2610,-32658,2677,-32652,2744,-32647,2811,-32641,2878,-32635,2944,-32629,3011,-32623,3078,-32616,3145,-32610,3211,-32603,3278,-32596,3345,-32589,3411,-32582,3478,-32575,3545,-32568,3611,-32560,3678,-32553,3744,-32545,3811,-32537,3877,-32529,3944,-32521,4011,-32513,4077,-32504,4144,-32496,4210,-32487,4276,-32478,4343,-32469,4409,-32460,4476,-32451,4542,-32442,4608,-32432,4675,-32423,4741,-32413,4807,-32403,4874,-32393,4940,-32383,5006,-32372,5072,-32362,5139,-32351,5205,-32341,5271,-32330,5337,-32319,5403,-32308,5469,-32296,5535,-32285,5601,-32274,5667,-32262,5733,-32250,5799,-32238,5865,-32226,5931,-32214,5997,-32202,6063,-32189,6129,-32177,6195,-32164,6261,-32151,6326,-32138,6392,-32125,6458,-32111,6523,-32098,6589,-32085,6655,-32071,6720,-32057,6786,-32043,6851,-32029,6917,-32015,6982,-32000,7048,-31986,7113,-31971,7179,-31957,7244,-31942,7310,-31927,7375,-31912,7440,-31896,7505,-31881,7571,-31865,7636,-31850,7701,-31834,7766,-31818,7831,-31802,7896,-31786,7961,-31769,8026,-31753,8091,-31736,8156,-31719,8221,-31702,8286,-31685,8351,-31668,8415,-31651,8480,-31634,8545,-31616,8610,-31598,8674,-31581,8739,-31563,8803,-31545,8868,-31526,8932,-31508,8997,-31490,9061,-31471,9126,-31452,9190,-31433,9254,-31414,9319,-31395,9383,-31376,9447,-31357,9511,-31337,9575,-31317,9639,-31298,9703,-31278,9767,-31258,9831,-31237,9895,-31217,9959,-31197,10023,-31176,10087,-31155,10151,-31135,10214,-31114,10278,-31093,10342,-31071,10405,-31050,10469,-31029,10532,-31007,10596,-30985,10659,-30963,10722,-30941,10786,-30919,10849,-30897,10912,-30875,10975,-30852,11038,-30829,11101,-30807,11164,-30784,11227,-30761,11290,-30738,11353,-30714,11416,-30691,11479,-30667,11542,-30644,11604,-30620,11667,-30596,11730,-30572,11792,-30548,11855,-30523,11917,-30499,11980,-30474,12042,-30450,12104,-30425,12166,-30400,12229,-30375,12291,-30350,12353,-30324,12415,-30299,12477,-30273,12539,-30248,12601,-30222,12663,-30196,12724,-30170,12786,-30143,12848,-30117,12909,-30091,12971,-30064,13033,-30037,13094,-30010,13155,-29984,13217,-29956,13278,-29929,13339,-29902,13400,-29874,13462,-29847,13523,-29819,13584,-29791,13645,-29763,13706,-29735,13766,-29707,13827,-29679,13888,-29650,13949,-29622,14009,-29593,14070,-29564,14130,-29535,14191,-29506,14251,-29477,14311,-29447,14372,-29418,14432,-29388,14492,-29359,14552,-29329,14612,-29299,14672,-29269,14732,-29239,14792,-29208,14852,-29178,14911,-29147,14971,-29117,15030,-29086,15090,-29055,15149,-29024,15209,-28993,15268,-28961,15327,-28930,15387,-28898,15446,-28867,15505,-28835,15564,-28803,15623,-28771,15682,-28739,15740,-28707,15799,-28674,15858,-28642,15917,-28609,15975,-28576,16034,-28544,16092,-28511,16150,-28478,16209,-28444,16267,-28411,16325,-28378,16383,-28344,16441,-28310,16499,-28276,16557,-28243,16615,-28209,16672,-28174,16730,-28140,16788,-28106,16845,-28071,16903,-28037,16960,-28002,17017,-27967,17074,-27932,17132,-27897,17189,-27862,17246,-27826,17303,-27791,17360,-27755,17416,-27720,17473,-27684,17530,-27648,17586,-27612,17643,-27576,17699,-27539,17756,-27503,17812,-27467,17868,-27430,17924,-27393,17980,-27356,18036,-27320,18092,-27282,18148,-27245,18204,-27208,18260,-27171,18315,-27133,18371,-27095,18426,-27058,18482,-27020,18537,-26982,18592,-26944,18647,-26906,18702,-26867,18757,-26829,18812,-26790,18867,-26752,18922,-26713,18976,-26674,19031,-26635,19086,-26596,19140,-26557,19194,-26517,19249,-26478,19303,-26438,19357,-26399,19411,-26359,19465,-26319,19519,-26279,19573,-26239,19626,-26199,19680,-26159,19733,-26118,19787,-26078,19840,-26037,19894,-25996,19947,-25955,20000,-25914,20053,-25873,20106,-25832,20159,-25791,20212,-25750,20264,-25708,20317,-25666,20369,-25625,20422,-25583,20474,-25541,20527,-25499,20579,-25457,20631,-25415,20683,-25372,20735,-25330,20787,-25287,20838,-25244,20890,-25202,20942,-25159,20993,-25116,21045,-25073,21096,-25030,21147,-24986,21198,-24943,21249,-24899,21300,-24856,21351,-24812,21402,-24768,21453,-24724,21503,-24680,21554,-24636,21604,-24592,21655,-24547,21705,-24503,21755,-24458,21805,-24414,21855,-24369,21905,-24324,21955,-24279,22004,-24234,22054,-24189,22104,-24144,22153,-24098,22202,-24053,22252,-24007,22301,-23962,22350,-23916,22399,-23870,22448,-23824,22496,-23778,22545,-23732,22594,-23686,22642,-23639,22691,-23593,22739,-23546,22787,-23500,22835,-23453,22883,-23406,22931,-23359,22979,-23312,23027,-23265,23074,-23218,23122,-23170,23169,-23123,23217,-23075,23264,-23028,23311,-22980,23358,-22932,23405,-22884,23452,-22836,23499,-22788,23545,-22740,23592,-22692,23638,-22643,23685,-22595,23731,-22546,23777,-22497,23823,-22449,23869,-22400,23915,-22351,23961,-22302,24006,-22253,24052,-22203,24097,-22154,24143,-22105,24188,-22055,24233,-22005,24278,-21956,24323,-21906,24368,-21856,24413,-21806,24457,-21756,24502,-21706,24546,-21656,24591,-21605,24635,-21555,24679,-21504,24723,-21454,24767,-21403,24811,-21352,24855,-21301,24898,-21250,24942,-21199,24985,-21148,25029,-21097,25072,-21046,25115,-20994,25158,-20943,25201,-20891,25243,-20839,25286,-20788,25329,-20736,25371,-20684,25414,-20632,25456,-20580,25498,-20528,25540,-20475,25582,-20423,25624,-20370,25665,-20318,25707,-20265,25749,-20213,25790,-20160,25831,-20107,25872,-20054,25913,-20001,25954,-19948,25995,-19895,26036,-19841,26077,-19788,26117,-19734,26158,-19681,26198,-19627,26238,-19574,26278,-19520,26318,-19466,26358,-19412,26398,-19358,26437,-19304,26477,-19250,26516,-19195,26556,-19141,26595,-19087,26634,-19032,26673,-18977,26712,-18923,26751,-18868,26789,-18813,26828,-18758,26866,-18703,26905,-18648,26943,-18593,26981,-18538,27019,-18483,27057,-18427,27094,-18372,27132,-18316,27170,-18261,27207,-18205,27244,-18149,27281,-18093,27319,-18037,27355,-17981,27392,-17925,27429,-17869,27466,-17813,27502,-17757,27538,-17700,27575,-17644,27611,-17587,27647,-17531,27683,-17474,27719,-17417,27754,-17361,27790,-17304,27825,-17247,27861,-17190,27896,-17133,27931,-17075,27966,-17018,28001,-16961,28036,-16904,28070,-16846,28105,-16789,28139,-16731,28173,-16673,28208,-16616,28242,-16558,28275,-16500,28309,-16442,28343}; diff --git a/openair1/PHY/TOOLS/twiddles4096.h b/openair1/PHY/TOOLS/twiddles4096.h deleted file mode 100644 index af2b6a8887619bd82949cfa72ac54f814d5b83a6..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddles4096.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:1023)/4096)); -twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(0:1023)/4096)); -twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(0:1023)/4096)); -twa2 = zeros(1,2*1024); -twb2 = zeros(1,2*1024); -twc2 = zeros(1,2*1024); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -twb2(1:2:end) = real(twb); -twb2(2:2:end) = imag(twb); -twc2(1:2:end) = real(twc); -twc2(2:2:end) = imag(twc); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t tw4096[3*1024*2] = {"); -fprintf(fd,"%d,",twa2); -fprintf(fd,"%d,",twb2); -fprintf(fd,"%d,",twc2(1:(1024*2)-1)); -fprintf(fd,"%d};\n",twc2(end)); -fclose(fd); -*/ -static int16_t tw4096[3*1024*2] = {32767,0,32766,-51,32766,-101,32766,-151,32766,-202,32766,-252,32765,-302,32765,-352,32764,-403,32763,-453,32763,-503,32762,-553,32761,-604,32760,-654,32759,-704,32758,-754,32757,-805,32755,-855,32754,-905,32753,-955,32751,-1006,32750,-1056,32748,-1106,32746,-1156,32744,-1207,32742,-1257,32740,-1307,32738,-1357,32736,-1407,32734,-1458,32732,-1508,32729,-1558,32727,-1608,32725,-1659,32722,-1709,32719,-1759,32717,-1809,32714,-1859,32711,-1909,32708,-1960,32705,-2010,32702,-2060,32699,-2110,32695,-2160,32692,-2210,32688,-2261,32685,-2311,32681,-2361,32678,-2411,32674,-2461,32670,-2511,32666,-2561,32662,-2611,32658,-2662,32654,-2712,32650,-2762,32646,-2812,32641,-2862,32637,-2912,32632,-2962,32628,-3012,32623,-3062,32618,-3112,32614,-3162,32609,-3212,32604,-3262,32599,-3312,32594,-3362,32588,-3412,32583,-3462,32578,-3512,32572,-3562,32567,-3612,32561,-3662,32556,-3712,32550,-3762,32544,-3812,32538,-3862,32532,-3912,32526,-3962,32520,-4012,32514,-4061,32508,-4111,32501,-4161,32495,-4211,32488,-4261,32482,-4311,32475,-4360,32468,-4410,32462,-4460,32455,-4510,32448,-4560,32441,-4609,32434,-4659,32426,-4709,32419,-4759,32412,-4808,32404,-4858,32397,-4908,32389,-4958,32382,-5007,32374,-5057,32366,-5107,32358,-5156,32350,-5206,32342,-5255,32334,-5305,32326,-5355,32318,-5404,32310,-5454,32301,-5503,32293,-5553,32284,-5602,32275,-5652,32267,-5701,32258,-5751,32249,-5800,32240,-5850,32231,-5899,32222,-5949,32213,-5998,32204,-6048,32194,-6097,32185,-6146,32176,-6196,32166,-6245,32156,-6294,32147,-6344,32137,-6393,32127,-6442,32117,-6492,32107,-6541,32097,-6590,32087,-6639,32077,-6689,32066,-6738,32056,-6787,32046,-6836,32035,-6885,32024,-6934,32014,-6983,32003,-7033,31992,-7082,31981,-7131,31970,-7180,31959,-7229,31948,-7278,31937,-7327,31926,-7376,31914,-7425,31903,-7474,31891,-7523,31880,-7572,31868,-7620,31856,-7669,31845,-7718,31833,-7767,31821,-7816,31809,-7865,31797,-7913,31785,-7962,31772,-8011,31760,-8060,31748,-8108,31735,-8157,31723,-8206,31710,-8254,31697,-8303,31684,-8352,31672,-8400,31659,-8449,31646,-8497,31633,-8546,31619,-8594,31606,-8643,31593,-8691,31580,-8740,31566,-8788,31553,-8837,31539,-8885,31525,-8933,31512,-8982,31498,-9030,31484,-9078,31470,-9127,31456,-9175,31442,-9223,31428,-9271,31413,-9320,31399,-9368,31385,-9416,31370,-9464,31356,-9512,31341,-9560,31326,-9608,31311,-9656,31297,-9704,31282,-9752,31267,-9800,31252,-9848,31236,-9896,31221,-9944,31206,-9992,31191,-10040,31175,-10088,31160,-10136,31144,-10183,31128,-10231,31113,-10279,31097,-10327,31081,-10374,31065,-10422,31049,-10470,31033,-10517,31017,-10565,31001,-10612,30984,-10660,30968,-10707,30951,-10755,30935,-10802,30918,-10850,30902,-10897,30885,-10945,30868,-10992,30851,-11039,30834,-11087,30817,-11134,30800,-11181,30783,-11228,30766,-11276,30748,-11323,30731,-11370,30713,-11417,30696,-11464,30678,-11511,30660,-11558,30643,-11605,30625,-11652,30607,-11699,30589,-11746,30571,-11793,30553,-11840,30535,-11887,30516,-11934,30498,-11981,30480,-12027,30461,-12074,30442,-12121,30424,-12167,30405,-12214,30386,-12261,30368,-12307,30349,-12354,30330,-12400,30311,-12447,30291,-12493,30272,-12540,30253,-12586,30234,-12633,30214,-12679,30195,-12725,30175,-12772,30156,-12818,30136,-12864,30116,-12910,30096,-12957,30076,-13003,30056,-13049,30036,-13095,30016,-13141,29996,-13187,29976,-13233,29955,-13279,29935,-13325,29915,-13371,29894,-13417,29873,-13463,29853,-13508,29832,-13554,29811,-13600,29790,-13646,29769,-13691,29748,-13737,29727,-13783,29706,-13828,29685,-13874,29663,-13919,29642,-13965,29621,-14010,29599,-14056,29577,-14101,29556,-14146,29534,-14192,29512,-14237,29490,-14282,29468,-14327,29446,-14373,29424,-14418,29402,-14463,29380,-14508,29358,-14553,29335,-14598,29313,-14643,29290,-14688,29268,-14733,29245,-14778,29222,-14823,29200,-14867,29177,-14912,29154,-14957,29131,-15002,29108,-15046,29085,-15091,29062,-15136,29038,-15180,29015,-15225,28992,-15269,28968,-15314,28945,-15358,28921,-15402,28897,-15447,28874,-15491,28850,-15535,28826,-15580,28802,-15624,28778,-15668,28754,-15712,28730,-15756,28706,-15800,28681,-15844,28657,-15888,28633,-15932,28608,-15976,28584,-16020,28559,-16064,28534,-16108,28510,-16151,28485,-16195,28460,-16239,28435,-16282,28410,-16326,28385,-16369,28360,-16413,28335,-16456,28309,-16500,28284,-16543,28259,-16587,28233,-16630,28208,-16673,28182,-16717,28156,-16760,28131,-16803,28105,-16846,28079,-16889,28053,-16932,28027,-16975,28001,-17018,27975,-17061,27948,-17104,27922,-17147,27896,-17190,27869,-17233,27843,-17275,27816,-17318,27790,-17361,27763,-17403,27736,-17446,27710,-17488,27683,-17531,27656,-17573,27629,-17616,27602,-17658,27575,-17700,27548,-17743,27520,-17785,27493,-17827,27466,-17869,27438,-17911,27411,-17953,27383,-17995,27355,-18037,27328,-18079,27300,-18121,27272,-18163,27244,-18205,27216,-18247,27188,-18288,27160,-18330,27132,-18372,27104,-18413,27076,-18455,27047,-18496,27019,-18538,26990,-18579,26962,-18621,26933,-18662,26905,-18703,26876,-18745,26847,-18786,26818,-18827,26789,-18868,26760,-18909,26731,-18950,26702,-18991,26673,-19032,26644,-19073,26615,-19114,26585,-19155,26556,-19195,26526,-19236,26497,-19277,26467,-19317,26437,-19358,26408,-19398,26378,-19439,26348,-19479,26318,-19520,26288,-19560,26258,-19600,26228,-19641,26198,-19681,26168,-19721,26137,-19761,26107,-19801,26077,-19841,26046,-19881,26016,-19921,25985,-19961,25954,-20001,25924,-20041,25893,-20080,25862,-20120,25831,-20160,25800,-20199,25769,-20239,25738,-20278,25707,-20318,25676,-20357,25645,-20397,25613,-20436,25582,-20475,25550,-20514,25519,-20554,25487,-20593,25456,-20632,25424,-20671,25392,-20710,25361,-20749,25329,-20788,25297,-20826,25265,-20865,25233,-20904,25201,-20943,25169,-20981,25136,-21020,25104,-21058,25072,-21097,25039,-21135,25007,-21174,24974,-21212,24942,-21250,24909,-21289,24877,-21327,24844,-21365,24811,-21403,24778,-21441,24745,-21479,24712,-21517,24679,-21555,24646,-21593,24613,-21630,24580,-21668,24546,-21706,24513,-21744,24480,-21781,24446,-21819,24413,-21856,24379,-21894,24346,-21931,24312,-21968,24278,-22005,24244,-22043,24211,-22080,24177,-22117,24143,-22154,24109,-22191,24075,-22228,24041,-22265,24006,-22302,23972,-22339,23938,-22375,23903,-22412,23869,-22449,23835,-22485,23800,-22522,23766,-22558,23731,-22595,23696,-22631,23661,-22667,23627,-22704,23592,-22740,23557,-22776,23522,-22812,23487,-22848,23452,-22884,23417,-22920,23382,-22956,23346,-22992,23311,-23028,23276,-23063,23240,-23099,23205,-23135,23169,-23170,23134,-23206,23098,-23241,23062,-23277,23027,-23312,22991,-23347,22955,-23383,22919,-23418,22883,-23453,22847,-23488,22811,-23523,22775,-23558,22739,-23593,22703,-23628,22666,-23662,22630,-23697,22594,-23732,22557,-23767,22521,-23801,22484,-23836,22448,-23870,22411,-23904,22374,-23939,22338,-23973,22301,-24007,22264,-24042,22227,-24076,22190,-24110,22153,-24144,22116,-24178,22079,-24212,22042,-24245,22004,-24279,21967,-24313,21930,-24347,21893,-24380,21855,-24414,21818,-24447,21780,-24481,21743,-24514,21705,-24547,21667,-24581,21629,-24614,21592,-24647,21554,-24680,21516,-24713,21478,-24746,21440,-24779,21402,-24812,21364,-24845,21326,-24878,21288,-24910,21249,-24943,21211,-24975,21173,-25008,21134,-25040,21096,-25073,21057,-25105,21019,-25137,20980,-25170,20942,-25202,20903,-25234,20864,-25266,20825,-25298,20787,-25330,20748,-25362,20709,-25393,20670,-25425,20631,-25457,20592,-25488,20553,-25520,20513,-25551,20474,-25583,20435,-25614,20396,-25646,20356,-25677,20317,-25708,20277,-25739,20238,-25770,20198,-25801,20159,-25832,20119,-25863,20079,-25894,20040,-25925,20000,-25955,19960,-25986,19920,-26017,19880,-26047,19840,-26078,19800,-26108,19760,-26138,19720,-26169,19680,-26199,19640,-26229,19599,-26259,19559,-26289,19519,-26319,19478,-26349,19438,-26379,19397,-26409,19357,-26438,19316,-26468,19276,-26498,19235,-26527,19194,-26557,19154,-26586,19113,-26616,19072,-26645,19031,-26674,18990,-26703,18949,-26732,18908,-26761,18867,-26790,18826,-26819,18785,-26848,18744,-26877,18702,-26906,18661,-26934,18620,-26963,18578,-26991,18537,-27020,18495,-27048,18454,-27077,18412,-27105,18371,-27133,18329,-27161,18287,-27189,18246,-27217,18204,-27245,18162,-27273,18120,-27301,18078,-27329,18036,-27356,17994,-27384,17952,-27412,17910,-27439,17868,-27467,17826,-27494,17784,-27521,17742,-27549,17699,-27576,17657,-27603,17615,-27630,17572,-27657,17530,-27684,17487,-27711,17445,-27737,17402,-27764,17360,-27791,17317,-27817,17274,-27844,17232,-27870,17189,-27897,17146,-27923,17103,-27949,17060,-27976,17017,-28002,16974,-28028,16931,-28054,16888,-28080,16845,-28106,16802,-28132,16759,-28157,16716,-28183,16672,-28209,16629,-28234,16586,-28260,16542,-28285,16499,-28310,16455,-28336,16412,-28361,16368,-28386,16325,-28411,16281,-28436,16238,-28461,16194,-28486,16150,-28511,16107,-28535,16063,-28560,16019,-28585,15975,-28609,15931,-28634,15887,-28658,15843,-28682,15799,-28707,15755,-28731,15711,-28755,15667,-28779,15623,-28803,15579,-28827,15534,-28851,15490,-28875,15446,-28898,15401,-28922,15357,-28946,15313,-28969,15268,-28993,15224,-29016,15179,-29039,15135,-29063,15090,-29086,15045,-29109,15001,-29132,14956,-29155,14911,-29178,14866,-29201,14822,-29223,14777,-29246,14732,-29269,14687,-29291,14642,-29314,14597,-29336,14552,-29359,14507,-29381,14462,-29403,14417,-29425,14372,-29447,14326,-29469,14281,-29491,14236,-29513,14191,-29535,14145,-29557,14100,-29578,14055,-29600,14009,-29622,13964,-29643,13918,-29664,13873,-29686,13827,-29707,13782,-29728,13736,-29749,13690,-29770,13645,-29791,13599,-29812,13553,-29833,13507,-29854,13462,-29874,13416,-29895,13370,-29916,13324,-29936,13278,-29956,13232,-29977,13186,-29997,13140,-30017,13094,-30037,13048,-30057,13002,-30077,12956,-30097,12909,-30117,12863,-30137,12817,-30157,12771,-30176,12724,-30196,12678,-30215,12632,-30235,12585,-30254,12539,-30273,12492,-30292,12446,-30312,12399,-30331,12353,-30350,12306,-30369,12260,-30387,12213,-30406,12166,-30425,12120,-30443,12073,-30462,12026,-30481,11980,-30499,11933,-30517,11886,-30536,11839,-30554,11792,-30572,11745,-30590,11698,-30608,11651,-30626,11604,-30644,11557,-30661,11510,-30679,11463,-30697,11416,-30714,11369,-30732,11322,-30749,11275,-30767,11227,-30784,11180,-30801,11133,-30818,11086,-30835,11038,-30852,10991,-30869,10944,-30886,10896,-30903,10849,-30919,10801,-30936,10754,-30952,10706,-30969,10659,-30985,10611,-31002,10564,-31018,10516,-31034,10469,-31050,10421,-31066,10373,-31082,10326,-31098,10278,-31114,10230,-31129,10182,-31145,10135,-31161,10087,-31176,10039,-31192,9991,-31207,9943,-31222,9895,-31237,9847,-31253,9799,-31268,9751,-31283,9703,-31298,9655,-31312,9607,-31327,9559,-31342,9511,-31357,9463,-31371,9415,-31386,9367,-31400,9319,-31414,9270,-31429,9222,-31443,9174,-31457,9126,-31471,9077,-31485,9029,-31499,8981,-31513,8932,-31526,8884,-31540,8836,-31554,8787,-31567,8739,-31581,8690,-31594,8642,-31607,8593,-31620,8545,-31634,8496,-31647,8448,-31660,8399,-31673,8351,-31685,8302,-31698,8253,-31711,8205,-31724,8156,-31736,8107,-31749,8059,-31761,8010,-31773,7961,-31786,7912,-31798,7864,-31810,7815,-31822,7766,-31834,7717,-31846,7668,-31857,7619,-31869,7571,-31881,7522,-31892,7473,-31904,7424,-31915,7375,-31927,7326,-31938,7277,-31949,7228,-31960,7179,-31971,7130,-31982,7081,-31993,7032,-32004,6982,-32015,6933,-32025,6884,-32036,6835,-32047,6786,-32057,6737,-32067,6688,-32078,6638,-32088,6589,-32098,6540,-32108,6491,-32118,6441,-32128,6392,-32138,6343,-32148,6293,-32157,6244,-32167,6195,-32177,6145,-32186,6096,-32195,6047,-32205,5997,-32214,5948,-32223,5898,-32232,5849,-32241,5799,-32250,5750,-32259,5700,-32268,5651,-32276,5601,-32285,5552,-32294,5502,-32302,5453,-32311,5403,-32319,5354,-32327,5304,-32335,5254,-32343,5205,-32351,5155,-32359,5106,-32367,5056,-32375,5006,-32383,4957,-32390,4907,-32398,4857,-32405,4807,-32413,4758,-32420,4708,-32427,4658,-32435,4608,-32442,4559,-32449,4509,-32456,4459,-32463,4409,-32469,4359,-32476,4310,-32483,4260,-32489,4210,-32496,4160,-32502,4110,-32509,4060,-32515,4011,-32521,3961,-32527,3911,-32533,3861,-32539,3811,-32545,3761,-32551,3711,-32557,3661,-32562,3611,-32568,3561,-32573,3511,-32579,3461,-32584,3411,-32589,3361,-32595,3311,-32600,3261,-32605,3211,-32610,3161,-32615,3111,-32619,3061,-32624,3011,-32629,2961,-32633,2911,-32638,2861,-32642,2811,-32647,2761,-32651,2711,-32655,2661,-32659,2610,-32663,2560,-32667,2510,-32671,2460,-32675,2410,-32679,2360,-32682,2310,-32686,2260,-32689,2209,-32693,2159,-32696,2109,-32700,2059,-32703,2009,-32706,1959,-32709,1908,-32712,1858,-32715,1808,-32718,1758,-32720,1708,-32723,1658,-32726,1607,-32728,1557,-32730,1507,-32733,1457,-32735,1406,-32737,1356,-32739,1306,-32741,1256,-32743,1206,-32745,1155,-32747,1105,-32749,1055,-32751,1005,-32752,954,-32754,904,-32755,854,-32756,804,-32758,753,-32759,703,-32760,653,-32761,603,-32762,552,-32763,502,-32764,452,-32764,402,-32765,351,-32766,301,-32766,251,-32767,201,-32767,150,-32767,100,-32767,50,-32767,32767,0,32766,-101,32766,-202,32765,-302,32764,-403,32763,-503,32761,-604,32759,-704,32757,-805,32754,-905,32751,-1006,32748,-1106,32744,-1207,32740,-1307,32736,-1407,32732,-1508,32727,-1608,32722,-1709,32717,-1809,32711,-1909,32705,-2010,32699,-2110,32692,-2210,32685,-2311,32678,-2411,32670,-2511,32662,-2611,32654,-2712,32646,-2812,32637,-2912,32628,-3012,32618,-3112,32609,-3212,32599,-3312,32588,-3412,32578,-3512,32567,-3612,32556,-3712,32544,-3812,32532,-3912,32520,-4012,32508,-4111,32495,-4211,32482,-4311,32468,-4410,32455,-4510,32441,-4609,32426,-4709,32412,-4808,32397,-4908,32382,-5007,32366,-5107,32350,-5206,32334,-5305,32318,-5404,32301,-5503,32284,-5602,32267,-5701,32249,-5800,32231,-5899,32213,-5998,32194,-6097,32176,-6196,32156,-6294,32137,-6393,32117,-6492,32097,-6590,32077,-6689,32056,-6787,32035,-6885,32014,-6983,31992,-7082,31970,-7180,31948,-7278,31926,-7376,31903,-7474,31880,-7572,31856,-7669,31833,-7767,31809,-7865,31785,-7962,31760,-8060,31735,-8157,31710,-8254,31684,-8352,31659,-8449,31633,-8546,31606,-8643,31580,-8740,31553,-8837,31525,-8933,31498,-9030,31470,-9127,31442,-9223,31413,-9320,31385,-9416,31356,-9512,31326,-9608,31297,-9704,31267,-9800,31236,-9896,31206,-9992,31175,-10088,31144,-10183,31113,-10279,31081,-10374,31049,-10470,31017,-10565,30984,-10660,30951,-10755,30918,-10850,30885,-10945,30851,-11039,30817,-11134,30783,-11228,30748,-11323,30713,-11417,30678,-11511,30643,-11605,30607,-11699,30571,-11793,30535,-11887,30498,-11981,30461,-12074,30424,-12167,30386,-12261,30349,-12354,30311,-12447,30272,-12540,30234,-12633,30195,-12725,30156,-12818,30116,-12910,30076,-13003,30036,-13095,29996,-13187,29955,-13279,29915,-13371,29873,-13463,29832,-13554,29790,-13646,29748,-13737,29706,-13828,29663,-13919,29621,-14010,29577,-14101,29534,-14192,29490,-14282,29446,-14373,29402,-14463,29358,-14553,29313,-14643,29268,-14733,29222,-14823,29177,-14912,29131,-15002,29085,-15091,29038,-15180,28992,-15269,28945,-15358,28897,-15447,28850,-15535,28802,-15624,28754,-15712,28706,-15800,28657,-15888,28608,-15976,28559,-16064,28510,-16151,28460,-16239,28410,-16326,28360,-16413,28309,-16500,28259,-16587,28208,-16673,28156,-16760,28105,-16846,28053,-16932,28001,-17018,27948,-17104,27896,-17190,27843,-17275,27790,-17361,27736,-17446,27683,-17531,27629,-17616,27575,-17700,27520,-17785,27466,-17869,27411,-17953,27355,-18037,27300,-18121,27244,-18205,27188,-18288,27132,-18372,27076,-18455,27019,-18538,26962,-18621,26905,-18703,26847,-18786,26789,-18868,26731,-18950,26673,-19032,26615,-19114,26556,-19195,26497,-19277,26437,-19358,26378,-19439,26318,-19520,26258,-19600,26198,-19681,26137,-19761,26077,-19841,26016,-19921,25954,-20001,25893,-20080,25831,-20160,25769,-20239,25707,-20318,25645,-20397,25582,-20475,25519,-20554,25456,-20632,25392,-20710,25329,-20788,25265,-20865,25201,-20943,25136,-21020,25072,-21097,25007,-21174,24942,-21250,24877,-21327,24811,-21403,24745,-21479,24679,-21555,24613,-21630,24546,-21706,24480,-21781,24413,-21856,24346,-21931,24278,-22005,24211,-22080,24143,-22154,24075,-22228,24006,-22302,23938,-22375,23869,-22449,23800,-22522,23731,-22595,23661,-22667,23592,-22740,23522,-22812,23452,-22884,23382,-22956,23311,-23028,23240,-23099,23169,-23170,23098,-23241,23027,-23312,22955,-23383,22883,-23453,22811,-23523,22739,-23593,22666,-23662,22594,-23732,22521,-23801,22448,-23870,22374,-23939,22301,-24007,22227,-24076,22153,-24144,22079,-24212,22004,-24279,21930,-24347,21855,-24414,21780,-24481,21705,-24547,21629,-24614,21554,-24680,21478,-24746,21402,-24812,21326,-24878,21249,-24943,21173,-25008,21096,-25073,21019,-25137,20942,-25202,20864,-25266,20787,-25330,20709,-25393,20631,-25457,20553,-25520,20474,-25583,20396,-25646,20317,-25708,20238,-25770,20159,-25832,20079,-25894,20000,-25955,19920,-26017,19840,-26078,19760,-26138,19680,-26199,19599,-26259,19519,-26319,19438,-26379,19357,-26438,19276,-26498,19194,-26557,19113,-26616,19031,-26674,18949,-26732,18867,-26790,18785,-26848,18702,-26906,18620,-26963,18537,-27020,18454,-27077,18371,-27133,18287,-27189,18204,-27245,18120,-27301,18036,-27356,17952,-27412,17868,-27467,17784,-27521,17699,-27576,17615,-27630,17530,-27684,17445,-27737,17360,-27791,17274,-27844,17189,-27897,17103,-27949,17017,-28002,16931,-28054,16845,-28106,16759,-28157,16672,-28209,16586,-28260,16499,-28310,16412,-28361,16325,-28411,16238,-28461,16150,-28511,16063,-28560,15975,-28609,15887,-28658,15799,-28707,15711,-28755,15623,-28803,15534,-28851,15446,-28898,15357,-28946,15268,-28993,15179,-29039,15090,-29086,15001,-29132,14911,-29178,14822,-29223,14732,-29269,14642,-29314,14552,-29359,14462,-29403,14372,-29447,14281,-29491,14191,-29535,14100,-29578,14009,-29622,13918,-29664,13827,-29707,13736,-29749,13645,-29791,13553,-29833,13462,-29874,13370,-29916,13278,-29956,13186,-29997,13094,-30037,13002,-30077,12909,-30117,12817,-30157,12724,-30196,12632,-30235,12539,-30273,12446,-30312,12353,-30350,12260,-30387,12166,-30425,12073,-30462,11980,-30499,11886,-30536,11792,-30572,11698,-30608,11604,-30644,11510,-30679,11416,-30714,11322,-30749,11227,-30784,11133,-30818,11038,-30852,10944,-30886,10849,-30919,10754,-30952,10659,-30985,10564,-31018,10469,-31050,10373,-31082,10278,-31114,10182,-31145,10087,-31176,9991,-31207,9895,-31237,9799,-31268,9703,-31298,9607,-31327,9511,-31357,9415,-31386,9319,-31414,9222,-31443,9126,-31471,9029,-31499,8932,-31526,8836,-31554,8739,-31581,8642,-31607,8545,-31634,8448,-31660,8351,-31685,8253,-31711,8156,-31736,8059,-31761,7961,-31786,7864,-31810,7766,-31834,7668,-31857,7571,-31881,7473,-31904,7375,-31927,7277,-31949,7179,-31971,7081,-31993,6982,-32015,6884,-32036,6786,-32057,6688,-32078,6589,-32098,6491,-32118,6392,-32138,6293,-32157,6195,-32177,6096,-32195,5997,-32214,5898,-32232,5799,-32250,5700,-32268,5601,-32285,5502,-32302,5403,-32319,5304,-32335,5205,-32351,5106,-32367,5006,-32383,4907,-32398,4807,-32413,4708,-32427,4608,-32442,4509,-32456,4409,-32469,4310,-32483,4210,-32496,4110,-32509,4011,-32521,3911,-32533,3811,-32545,3711,-32557,3611,-32568,3511,-32579,3411,-32589,3311,-32600,3211,-32610,3111,-32619,3011,-32629,2911,-32638,2811,-32647,2711,-32655,2610,-32663,2510,-32671,2410,-32679,2310,-32686,2209,-32693,2109,-32700,2009,-32706,1908,-32712,1808,-32718,1708,-32723,1607,-32728,1507,-32733,1406,-32737,1306,-32741,1206,-32745,1105,-32749,1005,-32752,904,-32755,804,-32758,703,-32760,603,-32762,502,-32764,402,-32765,301,-32766,201,-32767,100,-32767,0,-32767,-101,-32767,-202,-32767,-302,-32766,-403,-32765,-503,-32764,-604,-32762,-704,-32760,-805,-32758,-905,-32755,-1006,-32752,-1106,-32749,-1207,-32745,-1307,-32741,-1407,-32737,-1508,-32733,-1608,-32728,-1709,-32723,-1809,-32718,-1909,-32712,-2010,-32706,-2110,-32700,-2210,-32693,-2311,-32686,-2411,-32679,-2511,-32671,-2611,-32663,-2712,-32655,-2812,-32647,-2912,-32638,-3012,-32629,-3112,-32619,-3212,-32610,-3312,-32600,-3412,-32589,-3512,-32579,-3612,-32568,-3712,-32557,-3812,-32545,-3912,-32533,-4012,-32521,-4111,-32509,-4211,-32496,-4311,-32483,-4410,-32469,-4510,-32456,-4609,-32442,-4709,-32427,-4808,-32413,-4908,-32398,-5007,-32383,-5107,-32367,-5206,-32351,-5305,-32335,-5404,-32319,-5503,-32302,-5602,-32285,-5701,-32268,-5800,-32250,-5899,-32232,-5998,-32214,-6097,-32195,-6196,-32177,-6294,-32157,-6393,-32138,-6492,-32118,-6590,-32098,-6689,-32078,-6787,-32057,-6885,-32036,-6983,-32015,-7082,-31993,-7180,-31971,-7278,-31949,-7376,-31927,-7474,-31904,-7572,-31881,-7669,-31857,-7767,-31834,-7865,-31810,-7962,-31786,-8060,-31761,-8157,-31736,-8254,-31711,-8352,-31685,-8449,-31660,-8546,-31634,-8643,-31607,-8740,-31581,-8837,-31554,-8933,-31526,-9030,-31499,-9127,-31471,-9223,-31443,-9320,-31414,-9416,-31386,-9512,-31357,-9608,-31327,-9704,-31298,-9800,-31268,-9896,-31237,-9992,-31207,-10088,-31176,-10183,-31145,-10279,-31114,-10374,-31082,-10470,-31050,-10565,-31018,-10660,-30985,-10755,-30952,-10850,-30919,-10945,-30886,-11039,-30852,-11134,-30818,-11228,-30784,-11323,-30749,-11417,-30714,-11511,-30679,-11605,-30644,-11699,-30608,-11793,-30572,-11887,-30536,-11981,-30499,-12074,-30462,-12167,-30425,-12261,-30387,-12354,-30350,-12447,-30312,-12540,-30273,-12633,-30235,-12725,-30196,-12818,-30157,-12910,-30117,-13003,-30077,-13095,-30037,-13187,-29997,-13279,-29956,-13371,-29916,-13463,-29874,-13554,-29833,-13646,-29791,-13737,-29749,-13828,-29707,-13919,-29664,-14010,-29622,-14101,-29578,-14192,-29535,-14282,-29491,-14373,-29447,-14463,-29403,-14553,-29359,-14643,-29314,-14733,-29269,-14823,-29223,-14912,-29178,-15002,-29132,-15091,-29086,-15180,-29039,-15269,-28993,-15358,-28946,-15447,-28898,-15535,-28851,-15624,-28803,-15712,-28755,-15800,-28707,-15888,-28658,-15976,-28609,-16064,-28560,-16151,-28511,-16239,-28461,-16326,-28411,-16413,-28361,-16500,-28310,-16587,-28260,-16673,-28209,-16760,-28157,-16846,-28106,-16932,-28054,-17018,-28002,-17104,-27949,-17190,-27897,-17275,-27844,-17361,-27791,-17446,-27737,-17531,-27684,-17616,-27630,-17700,-27576,-17785,-27521,-17869,-27467,-17953,-27412,-18037,-27356,-18121,-27301,-18205,-27245,-18288,-27189,-18372,-27133,-18455,-27077,-18538,-27020,-18621,-26963,-18703,-26906,-18786,-26848,-18868,-26790,-18950,-26732,-19032,-26674,-19114,-26616,-19195,-26557,-19277,-26498,-19358,-26438,-19439,-26379,-19520,-26319,-19600,-26259,-19681,-26199,-19761,-26138,-19841,-26078,-19921,-26017,-20001,-25955,-20080,-25894,-20160,-25832,-20239,-25770,-20318,-25708,-20397,-25646,-20475,-25583,-20554,-25520,-20632,-25457,-20710,-25393,-20788,-25330,-20865,-25266,-20943,-25202,-21020,-25137,-21097,-25073,-21174,-25008,-21250,-24943,-21327,-24878,-21403,-24812,-21479,-24746,-21555,-24680,-21630,-24614,-21706,-24547,-21781,-24481,-21856,-24414,-21931,-24347,-22005,-24279,-22080,-24212,-22154,-24144,-22228,-24076,-22302,-24007,-22375,-23939,-22449,-23870,-22522,-23801,-22595,-23732,-22667,-23662,-22740,-23593,-22812,-23523,-22884,-23453,-22956,-23383,-23028,-23312,-23099,-23241,-23170,-23170,-23241,-23099,-23312,-23028,-23383,-22956,-23453,-22884,-23523,-22812,-23593,-22740,-23662,-22667,-23732,-22595,-23801,-22522,-23870,-22449,-23939,-22375,-24007,-22302,-24076,-22228,-24144,-22154,-24212,-22080,-24279,-22005,-24347,-21931,-24414,-21856,-24481,-21781,-24547,-21706,-24614,-21630,-24680,-21555,-24746,-21479,-24812,-21403,-24878,-21327,-24943,-21250,-25008,-21174,-25073,-21097,-25137,-21020,-25202,-20943,-25266,-20865,-25330,-20788,-25393,-20710,-25457,-20632,-25520,-20554,-25583,-20475,-25646,-20397,-25708,-20318,-25770,-20239,-25832,-20160,-25894,-20080,-25955,-20001,-26017,-19921,-26078,-19841,-26138,-19761,-26199,-19681,-26259,-19600,-26319,-19520,-26379,-19439,-26438,-19358,-26498,-19277,-26557,-19195,-26616,-19114,-26674,-19032,-26732,-18950,-26790,-18868,-26848,-18786,-26906,-18703,-26963,-18621,-27020,-18538,-27077,-18455,-27133,-18372,-27189,-18288,-27245,-18205,-27301,-18121,-27356,-18037,-27412,-17953,-27467,-17869,-27521,-17785,-27576,-17700,-27630,-17616,-27684,-17531,-27737,-17446,-27791,-17361,-27844,-17275,-27897,-17190,-27949,-17104,-28002,-17018,-28054,-16932,-28106,-16846,-28157,-16760,-28209,-16673,-28260,-16587,-28310,-16500,-28361,-16413,-28411,-16326,-28461,-16239,-28511,-16151,-28560,-16064,-28609,-15976,-28658,-15888,-28707,-15800,-28755,-15712,-28803,-15624,-28851,-15535,-28898,-15447,-28946,-15358,-28993,-15269,-29039,-15180,-29086,-15091,-29132,-15002,-29178,-14912,-29223,-14823,-29269,-14733,-29314,-14643,-29359,-14553,-29403,-14463,-29447,-14373,-29491,-14282,-29535,-14192,-29578,-14101,-29622,-14010,-29664,-13919,-29707,-13828,-29749,-13737,-29791,-13646,-29833,-13554,-29874,-13463,-29916,-13371,-29956,-13279,-29997,-13187,-30037,-13095,-30077,-13003,-30117,-12910,-30157,-12818,-30196,-12725,-30235,-12633,-30273,-12540,-30312,-12447,-30350,-12354,-30387,-12261,-30425,-12167,-30462,-12074,-30499,-11981,-30536,-11887,-30572,-11793,-30608,-11699,-30644,-11605,-30679,-11511,-30714,-11417,-30749,-11323,-30784,-11228,-30818,-11134,-30852,-11039,-30886,-10945,-30919,-10850,-30952,-10755,-30985,-10660,-31018,-10565,-31050,-10470,-31082,-10374,-31114,-10279,-31145,-10183,-31176,-10088,-31207,-9992,-31237,-9896,-31268,-9800,-31298,-9704,-31327,-9608,-31357,-9512,-31386,-9416,-31414,-9320,-31443,-9223,-31471,-9127,-31499,-9030,-31526,-8933,-31554,-8837,-31581,-8740,-31607,-8643,-31634,-8546,-31660,-8449,-31685,-8352,-31711,-8254,-31736,-8157,-31761,-8060,-31786,-7962,-31810,-7865,-31834,-7767,-31857,-7669,-31881,-7572,-31904,-7474,-31927,-7376,-31949,-7278,-31971,-7180,-31993,-7082,-32015,-6983,-32036,-6885,-32057,-6787,-32078,-6689,-32098,-6590,-32118,-6492,-32138,-6393,-32157,-6294,-32177,-6196,-32195,-6097,-32214,-5998,-32232,-5899,-32250,-5800,-32268,-5701,-32285,-5602,-32302,-5503,-32319,-5404,-32335,-5305,-32351,-5206,-32367,-5107,-32383,-5007,-32398,-4908,-32413,-4808,-32427,-4709,-32442,-4609,-32456,-4510,-32469,-4410,-32483,-4311,-32496,-4211,-32509,-4111,-32521,-4012,-32533,-3912,-32545,-3812,-32557,-3712,-32568,-3612,-32579,-3512,-32589,-3412,-32600,-3312,-32610,-3212,-32619,-3112,-32629,-3012,-32638,-2912,-32647,-2812,-32655,-2712,-32663,-2611,-32671,-2511,-32679,-2411,-32686,-2311,-32693,-2210,-32700,-2110,-32706,-2010,-32712,-1909,-32718,-1809,-32723,-1709,-32728,-1608,-32733,-1508,-32737,-1407,-32741,-1307,-32745,-1207,-32749,-1106,-32752,-1006,-32755,-905,-32758,-805,-32760,-704,-32762,-604,-32764,-503,-32765,-403,-32766,-302,-32767,-202,-32767,-101,32767,0,32766,-151,32765,-302,32763,-453,32761,-604,32758,-754,32754,-905,32750,-1056,32744,-1207,32738,-1357,32732,-1508,32725,-1659,32717,-1809,32708,-1960,32699,-2110,32688,-2261,32678,-2411,32666,-2561,32654,-2712,32641,-2862,32628,-3012,32614,-3162,32599,-3312,32583,-3462,32567,-3612,32550,-3762,32532,-3912,32514,-4061,32495,-4211,32475,-4360,32455,-4510,32434,-4659,32412,-4808,32389,-4958,32366,-5107,32342,-5255,32318,-5404,32293,-5553,32267,-5701,32240,-5850,32213,-5998,32185,-6146,32156,-6294,32127,-6442,32097,-6590,32066,-6738,32035,-6885,32003,-7033,31970,-7180,31937,-7327,31903,-7474,31868,-7620,31833,-7767,31797,-7913,31760,-8060,31723,-8206,31684,-8352,31646,-8497,31606,-8643,31566,-8788,31525,-8933,31484,-9078,31442,-9223,31399,-9368,31356,-9512,31311,-9656,31267,-9800,31221,-9944,31175,-10088,31128,-10231,31081,-10374,31033,-10517,30984,-10660,30935,-10802,30885,-10945,30834,-11087,30783,-11228,30731,-11370,30678,-11511,30625,-11652,30571,-11793,30516,-11934,30461,-12074,30405,-12214,30349,-12354,30291,-12493,30234,-12633,30175,-12772,30116,-12910,30056,-13049,29996,-13187,29935,-13325,29873,-13463,29811,-13600,29748,-13737,29685,-13874,29621,-14010,29556,-14146,29490,-14282,29424,-14418,29358,-14553,29290,-14688,29222,-14823,29154,-14957,29085,-15091,29015,-15225,28945,-15358,28874,-15491,28802,-15624,28730,-15756,28657,-15888,28584,-16020,28510,-16151,28435,-16282,28360,-16413,28284,-16543,28208,-16673,28131,-16803,28053,-16932,27975,-17061,27896,-17190,27816,-17318,27736,-17446,27656,-17573,27575,-17700,27493,-17827,27411,-17953,27328,-18079,27244,-18205,27160,-18330,27076,-18455,26990,-18579,26905,-18703,26818,-18827,26731,-18950,26644,-19073,26556,-19195,26467,-19317,26378,-19439,26288,-19560,26198,-19681,26107,-19801,26016,-19921,25924,-20041,25831,-20160,25738,-20278,25645,-20397,25550,-20514,25456,-20632,25361,-20749,25265,-20865,25169,-20981,25072,-21097,24974,-21212,24877,-21327,24778,-21441,24679,-21555,24580,-21668,24480,-21781,24379,-21894,24278,-22005,24177,-22117,24075,-22228,23972,-22339,23869,-22449,23766,-22558,23661,-22667,23557,-22776,23452,-22884,23346,-22992,23240,-23099,23134,-23206,23027,-23312,22919,-23418,22811,-23523,22703,-23628,22594,-23732,22484,-23836,22374,-23939,22264,-24042,22153,-24144,22042,-24245,21930,-24347,21818,-24447,21705,-24547,21592,-24647,21478,-24746,21364,-24845,21249,-24943,21134,-25040,21019,-25137,20903,-25234,20787,-25330,20670,-25425,20553,-25520,20435,-25614,20317,-25708,20198,-25801,20079,-25894,19960,-25986,19840,-26078,19720,-26169,19599,-26259,19478,-26349,19357,-26438,19235,-26527,19113,-26616,18990,-26703,18867,-26790,18744,-26877,18620,-26963,18495,-27048,18371,-27133,18246,-27217,18120,-27301,17994,-27384,17868,-27467,17742,-27549,17615,-27630,17487,-27711,17360,-27791,17232,-27870,17103,-27949,16974,-28028,16845,-28106,16716,-28183,16586,-28260,16455,-28336,16325,-28411,16194,-28486,16063,-28560,15931,-28634,15799,-28707,15667,-28779,15534,-28851,15401,-28922,15268,-28993,15135,-29063,15001,-29132,14866,-29201,14732,-29269,14597,-29336,14462,-29403,14326,-29469,14191,-29535,14055,-29600,13918,-29664,13782,-29728,13645,-29791,13507,-29854,13370,-29916,13232,-29977,13094,-30037,12956,-30097,12817,-30157,12678,-30215,12539,-30273,12399,-30331,12260,-30387,12120,-30443,11980,-30499,11839,-30554,11698,-30608,11557,-30661,11416,-30714,11275,-30767,11133,-30818,10991,-30869,10849,-30919,10706,-30969,10564,-31018,10421,-31066,10278,-31114,10135,-31161,9991,-31207,9847,-31253,9703,-31298,9559,-31342,9415,-31386,9270,-31429,9126,-31471,8981,-31513,8836,-31554,8690,-31594,8545,-31634,8399,-31673,8253,-31711,8107,-31749,7961,-31786,7815,-31822,7668,-31857,7522,-31892,7375,-31927,7228,-31960,7081,-31993,6933,-32025,6786,-32057,6638,-32088,6491,-32118,6343,-32148,6195,-32177,6047,-32205,5898,-32232,5750,-32259,5601,-32285,5453,-32311,5304,-32335,5155,-32359,5006,-32383,4857,-32405,4708,-32427,4559,-32449,4409,-32469,4260,-32489,4110,-32509,3961,-32527,3811,-32545,3661,-32562,3511,-32579,3361,-32595,3211,-32610,3061,-32624,2911,-32638,2761,-32651,2610,-32663,2460,-32675,2310,-32686,2159,-32696,2009,-32706,1858,-32715,1708,-32723,1557,-32730,1406,-32737,1256,-32743,1105,-32749,954,-32754,804,-32758,653,-32761,502,-32764,351,-32766,201,-32767,50,-32767,-101,-32767,-252,-32767,-403,-32765,-553,-32763,-704,-32760,-855,-32756,-1006,-32752,-1156,-32747,-1307,-32741,-1458,-32735,-1608,-32728,-1759,-32720,-1909,-32712,-2060,-32703,-2210,-32693,-2361,-32682,-2511,-32671,-2662,-32659,-2812,-32647,-2962,-32633,-3112,-32619,-3262,-32605,-3412,-32589,-3562,-32573,-3712,-32557,-3862,-32539,-4012,-32521,-4161,-32502,-4311,-32483,-4460,-32463,-4609,-32442,-4759,-32420,-4908,-32398,-5057,-32375,-5206,-32351,-5355,-32327,-5503,-32302,-5652,-32276,-5800,-32250,-5949,-32223,-6097,-32195,-6245,-32167,-6393,-32138,-6541,-32108,-6689,-32078,-6836,-32047,-6983,-32015,-7131,-31982,-7278,-31949,-7425,-31915,-7572,-31881,-7718,-31846,-7865,-31810,-8011,-31773,-8157,-31736,-8303,-31698,-8449,-31660,-8594,-31620,-8740,-31581,-8885,-31540,-9030,-31499,-9175,-31457,-9320,-31414,-9464,-31371,-9608,-31327,-9752,-31283,-9896,-31237,-10040,-31192,-10183,-31145,-10327,-31098,-10470,-31050,-10612,-31002,-10755,-30952,-10897,-30903,-11039,-30852,-11181,-30801,-11323,-30749,-11464,-30697,-11605,-30644,-11746,-30590,-11887,-30536,-12027,-30481,-12167,-30425,-12307,-30369,-12447,-30312,-12586,-30254,-12725,-30196,-12864,-30137,-13003,-30077,-13141,-30017,-13279,-29956,-13417,-29895,-13554,-29833,-13691,-29770,-13828,-29707,-13965,-29643,-14101,-29578,-14237,-29513,-14373,-29447,-14508,-29381,-14643,-29314,-14778,-29246,-14912,-29178,-15046,-29109,-15180,-29039,-15314,-28969,-15447,-28898,-15580,-28827,-15712,-28755,-15844,-28682,-15976,-28609,-16108,-28535,-16239,-28461,-16369,-28386,-16500,-28310,-16630,-28234,-16760,-28157,-16889,-28080,-17018,-28002,-17147,-27923,-17275,-27844,-17403,-27764,-17531,-27684,-17658,-27603,-17785,-27521,-17911,-27439,-18037,-27356,-18163,-27273,-18288,-27189,-18413,-27105,-18538,-27020,-18662,-26934,-18786,-26848,-18909,-26761,-19032,-26674,-19155,-26586,-19277,-26498,-19398,-26409,-19520,-26319,-19641,-26229,-19761,-26138,-19881,-26047,-20001,-25955,-20120,-25863,-20239,-25770,-20357,-25677,-20475,-25583,-20593,-25488,-20710,-25393,-20826,-25298,-20943,-25202,-21058,-25105,-21174,-25008,-21289,-24910,-21403,-24812,-21517,-24713,-21630,-24614,-21744,-24514,-21856,-24414,-21968,-24313,-22080,-24212,-22191,-24110,-22302,-24007,-22412,-23904,-22522,-23801,-22631,-23697,-22740,-23593,-22848,-23488,-22956,-23383,-23063,-23277,-23170,-23170,-23277,-23063,-23383,-22956,-23488,-22848,-23593,-22740,-23697,-22631,-23801,-22522,-23904,-22412,-24007,-22302,-24110,-22191,-24212,-22080,-24313,-21968,-24414,-21856,-24514,-21744,-24614,-21630,-24713,-21517,-24812,-21403,-24910,-21289,-25008,-21174,-25105,-21058,-25202,-20943,-25298,-20826,-25393,-20710,-25488,-20593,-25583,-20475,-25677,-20357,-25770,-20239,-25863,-20120,-25955,-20001,-26047,-19881,-26138,-19761,-26229,-19641,-26319,-19520,-26409,-19398,-26498,-19277,-26586,-19155,-26674,-19032,-26761,-18909,-26848,-18786,-26934,-18662,-27020,-18538,-27105,-18413,-27189,-18288,-27273,-18163,-27356,-18037,-27439,-17911,-27521,-17785,-27603,-17658,-27684,-17531,-27764,-17403,-27844,-17275,-27923,-17147,-28002,-17018,-28080,-16889,-28157,-16760,-28234,-16630,-28310,-16500,-28386,-16369,-28461,-16239,-28535,-16108,-28609,-15976,-28682,-15844,-28755,-15712,-28827,-15580,-28898,-15447,-28969,-15314,-29039,-15180,-29109,-15046,-29178,-14912,-29246,-14778,-29314,-14643,-29381,-14508,-29447,-14373,-29513,-14237,-29578,-14101,-29643,-13965,-29707,-13828,-29770,-13691,-29833,-13554,-29895,-13417,-29956,-13279,-30017,-13141,-30077,-13003,-30137,-12864,-30196,-12725,-30254,-12586,-30312,-12447,-30369,-12307,-30425,-12167,-30481,-12027,-30536,-11887,-30590,-11746,-30644,-11605,-30697,-11464,-30749,-11323,-30801,-11181,-30852,-11039,-30903,-10897,-30952,-10755,-31002,-10612,-31050,-10470,-31098,-10327,-31145,-10183,-31192,-10040,-31237,-9896,-31283,-9752,-31327,-9608,-31371,-9464,-31414,-9320,-31457,-9175,-31499,-9030,-31540,-8885,-31581,-8740,-31620,-8594,-31660,-8449,-31698,-8303,-31736,-8157,-31773,-8011,-31810,-7865,-31846,-7718,-31881,-7572,-31915,-7425,-31949,-7278,-31982,-7131,-32015,-6983,-32047,-6836,-32078,-6689,-32108,-6541,-32138,-6393,-32167,-6245,-32195,-6097,-32223,-5949,-32250,-5800,-32276,-5652,-32302,-5503,-32327,-5355,-32351,-5206,-32375,-5057,-32398,-4908,-32420,-4759,-32442,-4609,-32463,-4460,-32483,-4311,-32502,-4161,-32521,-4012,-32539,-3862,-32557,-3712,-32573,-3562,-32589,-3412,-32605,-3262,-32619,-3112,-32633,-2962,-32647,-2812,-32659,-2662,-32671,-2511,-32682,-2361,-32693,-2210,-32703,-2060,-32712,-1909,-32720,-1759,-32728,-1608,-32735,-1458,-32741,-1307,-32747,-1156,-32752,-1006,-32756,-855,-32760,-704,-32763,-553,-32765,-403,-32767,-252,-32767,-101,-32767,50,-32767,201,-32766,351,-32764,502,-32761,653,-32758,804,-32754,954,-32749,1105,-32743,1256,-32737,1406,-32730,1557,-32723,1708,-32715,1858,-32706,2009,-32696,2159,-32686,2310,-32675,2460,-32663,2610,-32651,2761,-32638,2911,-32624,3061,-32610,3211,-32595,3361,-32579,3511,-32562,3661,-32545,3811,-32527,3961,-32509,4110,-32489,4260,-32469,4409,-32449,4559,-32427,4708,-32405,4857,-32383,5006,-32359,5155,-32335,5304,-32311,5453,-32285,5601,-32259,5750,-32232,5898,-32205,6047,-32177,6195,-32148,6343,-32118,6491,-32088,6638,-32057,6786,-32025,6933,-31993,7081,-31960,7228,-31927,7375,-31892,7522,-31857,7668,-31822,7815,-31786,7961,-31749,8107,-31711,8253,-31673,8399,-31634,8545,-31594,8690,-31554,8836,-31513,8981,-31471,9126,-31429,9270,-31386,9415,-31342,9559,-31298,9703,-31253,9847,-31207,9991,-31161,10135,-31114,10278,-31066,10421,-31018,10564,-30969,10706,-30919,10849,-30869,10991,-30818,11133,-30767,11275,-30714,11416,-30661,11557,-30608,11698,-30554,11839,-30499,11980,-30443,12120,-30387,12260,-30331,12399,-30273,12539,-30215,12678,-30157,12817,-30097,12956,-30037,13094,-29977,13232,-29916,13370,-29854,13507,-29791,13645,-29728,13782,-29664,13918,-29600,14055,-29535,14191,-29469,14326,-29403,14462,-29336,14597,-29269,14732,-29201,14866,-29132,15001,-29063,15135,-28993,15268,-28922,15401,-28851,15534,-28779,15667,-28707,15799,-28634,15931,-28560,16063,-28486,16194,-28411,16325,-28336,16455,-28260,16586,-28183,16716,-28106,16845,-28028,16974,-27949,17103,-27870,17232,-27791,17360,-27711,17487,-27630,17615,-27549,17742,-27467,17868,-27384,17994,-27301,18120,-27217,18246,-27133,18371,-27048,18495,-26963,18620,-26877,18744,-26790,18867,-26703,18990,-26616,19113,-26527,19235,-26438,19357,-26349,19478,-26259,19599,-26169,19720,-26078,19840,-25986,19960,-25894,20079,-25801,20198,-25708,20317,-25614,20435,-25520,20553,-25425,20670,-25330,20787,-25234,20903,-25137,21019,-25040,21134,-24943,21249,-24845,21364,-24746,21478,-24647,21592,-24547,21705,-24447,21818,-24347,21930,-24245,22042,-24144,22153,-24042,22264,-23939,22374,-23836,22484,-23732,22594,-23628,22703,-23523,22811,-23418,22919,-23312,23027,-23206,23134,-23099,23240,-22992,23346,-22884,23452,-22776,23557,-22667,23661,-22558,23766,-22449,23869,-22339,23972,-22228,24075,-22117,24177,-22005,24278,-21894,24379,-21781,24480,-21668,24580,-21555,24679,-21441,24778,-21327,24877,-21212,24974,-21097,25072,-20981,25169,-20865,25265,-20749,25361,-20632,25456,-20514,25550,-20397,25645,-20278,25738,-20160,25831,-20041,25924,-19921,26016,-19801,26107,-19681,26198,-19560,26288,-19439,26378,-19317,26467,-19195,26556,-19073,26644,-18950,26731,-18827,26818,-18703,26905,-18579,26990,-18455,27076,-18330,27160,-18205,27244,-18079,27328,-17953,27411,-17827,27493,-17700,27575,-17573,27656,-17446,27736,-17318,27816,-17190,27896,-17061,27975,-16932,28053,-16803,28131,-16673,28208,-16543,28284,-16413,28360,-16282,28435,-16151,28510,-16020,28584,-15888,28657,-15756,28730,-15624,28802,-15491,28874,-15358,28945,-15225,29015,-15091,29085,-14957,29154,-14823,29222,-14688,29290,-14553,29358,-14418,29424,-14282,29490,-14146,29556,-14010,29621,-13874,29685,-13737,29748,-13600,29811,-13463,29873,-13325,29935,-13187,29996,-13049,30056,-12910,30116,-12772,30175,-12633,30234,-12493,30291,-12354,30349,-12214,30405,-12074,30461,-11934,30516,-11793,30571,-11652,30625,-11511,30678,-11370,30731,-11228,30783,-11087,30834,-10945,30885,-10802,30935,-10660,30984,-10517,31033,-10374,31081,-10231,31128,-10088,31175,-9944,31221,-9800,31267,-9656,31311,-9512,31356,-9368,31399,-9223,31442,-9078,31484,-8933,31525,-8788,31566,-8643,31606,-8497,31646,-8352,31684,-8206,31723,-8060,31760,-7913,31797,-7767,31833,-7620,31868,-7474,31903,-7327,31937,-7180,31970,-7033,32003,-6885,32035,-6738,32066,-6590,32097,-6442,32127,-6294,32156,-6146,32185,-5998,32213,-5850,32240,-5701,32267,-5553,32293,-5404,32318,-5255,32342,-5107,32366,-4958,32389,-4808,32412,-4659,32434,-4510,32455,-4360,32475,-4211,32495,-4061,32514,-3912,32532,-3762,32550,-3612,32567,-3462,32583,-3312,32599,-3162,32614,-3012,32628,-2862,32641,-2712,32654,-2561,32666,-2411,32678,-2261,32688,-2110,32699,-1960,32708,-1809,32717,-1659,32725,-1508,32732,-1357,32738,-1207,32744,-1056,32750,-905,32754,-754,32758,-604,32761,-453,32763,-302,32765,-151,32766}; diff --git a/openair1/PHY/TOOLS/twiddles8192.h b/openair1/PHY/TOOLS/twiddles8192.h deleted file mode 100644 index 6b76619013387f85ddac1292a29fa5b39fff4ecd..0000000000000000000000000000000000000000 --- a/openair1/PHY/TOOLS/twiddles8192.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* Twiddles generated with -twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/8192)); -twa2 = zeros(1,2*4096); -twa2(1:2:end) = real(twa); -twa2(2:2:end) = imag(twa); -fd=fopen("twiddle_tmp.txt","w"); -fprintf(fd,"static int16_t tw8192[4096*2] = {"); -fprintf(fd,"%d,",twa2(1:(4096*2)-1)); -fprintf(fd,"%d};\n",twa2(end)); -fclose(fd); -*/ -static int16_t tw8192[4096*2] = {32767,0,32766,-26,32766,-51,32766,-76,32766,-101,32766,-126,32766,-151,32766,-176,32766,-202,32766,-227,32766,-252,32765,-277,32765,-302,32765,-327,32765,-352,32764,-377,32764,-403,32764,-428,32763,-453,32763,-478,32763,-503,32762,-528,32762,-553,32761,-579,32761,-604,32760,-629,32760,-654,32759,-679,32759,-704,32758,-729,32758,-754,32757,-780,32757,-805,32756,-830,32755,-855,32755,-880,32754,-905,32753,-930,32753,-955,32752,-981,32751,-1006,32750,-1031,32750,-1056,32749,-1081,32748,-1106,32747,-1131,32746,-1156,32745,-1181,32744,-1207,32743,-1232,32742,-1257,32741,-1282,32740,-1307,32739,-1332,32738,-1357,32737,-1382,32736,-1407,32735,-1433,32734,-1458,32733,-1483,32732,-1508,32731,-1533,32729,-1558,32728,-1583,32727,-1608,32726,-1633,32725,-1659,32723,-1684,32722,-1709,32721,-1734,32719,-1759,32718,-1784,32717,-1809,32715,-1834,32714,-1859,32712,-1884,32711,-1909,32709,-1935,32708,-1960,32706,-1985,32705,-2010,32703,-2035,32702,-2060,32700,-2085,32699,-2110,32697,-2135,32695,-2160,32694,-2185,32692,-2210,32690,-2236,32688,-2261,32687,-2286,32685,-2311,32683,-2336,32681,-2361,32680,-2386,32678,-2411,32676,-2436,32674,-2461,32672,-2486,32670,-2511,32668,-2536,32666,-2561,32664,-2586,32662,-2611,32660,-2637,32658,-2662,32656,-2687,32654,-2712,32652,-2737,32650,-2762,32648,-2787,32646,-2812,32644,-2837,32641,-2862,32639,-2887,32637,-2912,32635,-2937,32632,-2962,32630,-2987,32628,-3012,32625,-3037,32623,-3062,32621,-3087,32618,-3112,32616,-3137,32614,-3162,32611,-3187,32609,-3212,32606,-3237,32604,-3262,32601,-3287,32599,-3312,32596,-3337,32594,-3362,32591,-3387,32588,-3412,32586,-3437,32583,-3462,32580,-3487,32578,-3512,32575,-3537,32572,-3562,32570,-3587,32567,-3612,32564,-3637,32561,-3662,32558,-3687,32556,-3712,32553,-3737,32550,-3762,32547,-3787,32544,-3812,32541,-3837,32538,-3862,32535,-3887,32532,-3912,32529,-3937,32526,-3962,32523,-3987,32520,-4012,32517,-4036,32514,-4061,32511,-4086,32508,-4111,32504,-4136,32501,-4161,32498,-4186,32495,-4211,32492,-4236,32488,-4261,32485,-4286,32482,-4311,32478,-4336,32475,-4360,32472,-4385,32468,-4410,32465,-4435,32462,-4460,32458,-4485,32455,-4510,32451,-4535,32448,-4560,32444,-4585,32441,-4609,32437,-4634,32434,-4659,32430,-4684,32426,-4709,32423,-4734,32419,-4759,32416,-4784,32412,-4808,32408,-4833,32404,-4858,32401,-4883,32397,-4908,32393,-4933,32389,-4958,32386,-4982,32382,-5007,32378,-5032,32374,-5057,32370,-5082,32366,-5107,32362,-5131,32358,-5156,32354,-5181,32350,-5206,32346,-5231,32342,-5255,32338,-5280,32334,-5305,32330,-5330,32326,-5355,32322,-5379,32318,-5404,32314,-5429,32310,-5454,32305,-5479,32301,-5503,32297,-5528,32293,-5553,32288,-5578,32284,-5602,32280,-5627,32275,-5652,32271,-5677,32267,-5701,32262,-5726,32258,-5751,32254,-5776,32249,-5800,32245,-5825,32240,-5850,32236,-5875,32231,-5899,32227,-5924,32222,-5949,32218,-5973,32213,-5998,32208,-6023,32204,-6048,32199,-6072,32194,-6097,32190,-6122,32185,-6146,32180,-6171,32176,-6196,32171,-6220,32166,-6245,32161,-6270,32156,-6294,32152,-6319,32147,-6344,32142,-6368,32137,-6393,32132,-6418,32127,-6442,32122,-6467,32117,-6492,32112,-6516,32107,-6541,32102,-6565,32097,-6590,32092,-6615,32087,-6639,32082,-6664,32077,-6689,32072,-6713,32066,-6738,32061,-6762,32056,-6787,32051,-6812,32046,-6836,32040,-6861,32035,-6885,32030,-6910,32024,-6934,32019,-6959,32014,-6983,32008,-7008,32003,-7033,31998,-7057,31992,-7082,31987,-7106,31981,-7131,31976,-7155,31970,-7180,31965,-7204,31959,-7229,31954,-7253,31948,-7278,31943,-7302,31937,-7327,31931,-7351,31926,-7376,31920,-7400,31914,-7425,31909,-7449,31903,-7474,31897,-7498,31891,-7523,31886,-7547,31880,-7572,31874,-7596,31868,-7620,31862,-7645,31856,-7669,31851,-7694,31845,-7718,31839,-7743,31833,-7767,31827,-7791,31821,-7816,31815,-7840,31809,-7865,31803,-7889,31797,-7913,31791,-7938,31785,-7962,31778,-7987,31772,-8011,31766,-8035,31760,-8060,31754,-8084,31748,-8108,31741,-8133,31735,-8157,31729,-8181,31723,-8206,31716,-8230,31710,-8254,31704,-8279,31697,-8303,31691,-8327,31684,-8352,31678,-8376,31672,-8400,31665,-8425,31659,-8449,31652,-8473,31646,-8497,31639,-8522,31633,-8546,31626,-8570,31619,-8594,31613,-8619,31606,-8643,31600,-8667,31593,-8691,31586,-8716,31580,-8740,31573,-8764,31566,-8788,31559,-8813,31553,-8837,31546,-8861,31539,-8885,31532,-8909,31525,-8933,31518,-8958,31512,-8982,31505,-9006,31498,-9030,31491,-9054,31484,-9078,31477,-9103,31470,-9127,31463,-9151,31456,-9175,31449,-9199,31442,-9223,31435,-9247,31428,-9271,31420,-9296,31413,-9320,31406,-9344,31399,-9368,31392,-9392,31385,-9416,31377,-9440,31370,-9464,31363,-9488,31356,-9512,31348,-9536,31341,-9560,31334,-9584,31326,-9608,31319,-9632,31311,-9656,31304,-9680,31297,-9704,31289,-9728,31282,-9752,31274,-9776,31267,-9800,31259,-9824,31252,-9848,31244,-9872,31236,-9896,31229,-9920,31221,-9944,31214,-9968,31206,-9992,31198,-10016,31191,-10040,31183,-10064,31175,-10088,31167,-10112,31160,-10136,31152,-10160,31144,-10183,31136,-10207,31128,-10231,31121,-10255,31113,-10279,31105,-10303,31097,-10327,31089,-10350,31081,-10374,31073,-10398,31065,-10422,31057,-10446,31049,-10470,31041,-10493,31033,-10517,31025,-10541,31017,-10565,31009,-10589,31001,-10612,30992,-10636,30984,-10660,30976,-10684,30968,-10707,30960,-10731,30951,-10755,30943,-10779,30935,-10802,30927,-10826,30918,-10850,30910,-10874,30902,-10897,30893,-10921,30885,-10945,30876,-10968,30868,-10992,30860,-11016,30851,-11039,30843,-11063,30834,-11087,30826,-11110,30817,-11134,30809,-11158,30800,-11181,30791,-11205,30783,-11228,30774,-11252,30766,-11276,30757,-11299,30748,-11323,30739,-11346,30731,-11370,30722,-11394,30713,-11417,30705,-11441,30696,-11464,30687,-11488,30678,-11511,30669,-11535,30660,-11558,30652,-11582,30643,-11605,30634,-11629,30625,-11652,30616,-11676,30607,-11699,30598,-11723,30589,-11746,30580,-11770,30571,-11793,30562,-11817,30553,-11840,30544,-11863,30535,-11887,30525,-11910,30516,-11934,30507,-11957,30498,-11981,30489,-12004,30480,-12027,30470,-12051,30461,-12074,30452,-12097,30442,-12121,30433,-12144,30424,-12167,30415,-12191,30405,-12214,30396,-12237,30386,-12261,30377,-12284,30368,-12307,30358,-12331,30349,-12354,30339,-12377,30330,-12400,30320,-12424,30311,-12447,30301,-12470,30291,-12493,30282,-12517,30272,-12540,30263,-12563,30253,-12586,30243,-12610,30234,-12633,30224,-12656,30214,-12679,30205,-12702,30195,-12725,30185,-12749,30175,-12772,30165,-12795,30156,-12818,30146,-12841,30136,-12864,30126,-12887,30116,-12910,30106,-12934,30096,-12957,30086,-12980,30076,-13003,30066,-13026,30056,-13049,30046,-13072,30036,-13095,30026,-13118,30016,-13141,30006,-13164,29996,-13187,29986,-13210,29976,-13233,29966,-13256,29955,-13279,29945,-13302,29935,-13325,29925,-13348,29915,-13371,29904,-13394,29894,-13417,29884,-13440,29873,-13463,29863,-13486,29853,-13508,29842,-13531,29832,-13554,29822,-13577,29811,-13600,29801,-13623,29790,-13646,29780,-13668,29769,-13691,29759,-13714,29748,-13737,29738,-13760,29727,-13783,29717,-13805,29706,-13828,29695,-13851,29685,-13874,29674,-13896,29663,-13919,29653,-13942,29642,-13965,29631,-13987,29621,-14010,29610,-14033,29599,-14056,29588,-14078,29577,-14101,29567,-14124,29556,-14146,29545,-14169,29534,-14192,29523,-14214,29512,-14237,29501,-14260,29490,-14282,29479,-14305,29468,-14327,29457,-14350,29446,-14373,29435,-14395,29424,-14418,29413,-14440,29402,-14463,29391,-14485,29380,-14508,29369,-14531,29358,-14553,29346,-14576,29335,-14598,29324,-14621,29313,-14643,29302,-14666,29290,-14688,29279,-14710,29268,-14733,29256,-14755,29245,-14778,29234,-14800,29222,-14823,29211,-14845,29200,-14867,29188,-14890,29177,-14912,29165,-14935,29154,-14957,29142,-14979,29131,-15002,29119,-15024,29108,-15046,29096,-15069,29085,-15091,29073,-15113,29062,-15136,29050,-15158,29038,-15180,29027,-15202,29015,-15225,29003,-15247,28992,-15269,28980,-15291,28968,-15314,28956,-15336,28945,-15358,28933,-15380,28921,-15402,28909,-15425,28897,-15447,28886,-15469,28874,-15491,28862,-15513,28850,-15535,28838,-15557,28826,-15580,28814,-15602,28802,-15624,28790,-15646,28778,-15668,28766,-15690,28754,-15712,28742,-15734,28730,-15756,28718,-15778,28706,-15800,28694,-15822,28681,-15844,28669,-15866,28657,-15888,28645,-15910,28633,-15932,28620,-15954,28608,-15976,28596,-15998,28584,-16020,28571,-16042,28559,-16064,28547,-16086,28534,-16108,28522,-16129,28510,-16151,28497,-16173,28485,-16195,28472,-16217,28460,-16239,28447,-16261,28435,-16282,28423,-16304,28410,-16326,28397,-16348,28385,-16369,28372,-16391,28360,-16413,28347,-16435,28335,-16456,28322,-16478,28309,-16500,28297,-16522,28284,-16543,28271,-16565,28259,-16587,28246,-16608,28233,-16630,28220,-16652,28208,-16673,28195,-16695,28182,-16717,28169,-16738,28156,-16760,28143,-16781,28131,-16803,28118,-16825,28105,-16846,28092,-16868,28079,-16889,28066,-16911,28053,-16932,28040,-16954,28027,-16975,28014,-16997,28001,-17018,27988,-17040,27975,-17061,27962,-17083,27948,-17104,27935,-17125,27922,-17147,27909,-17168,27896,-17190,27883,-17211,27869,-17233,27856,-17254,27843,-17275,27830,-17297,27816,-17318,27803,-17339,27790,-17361,27777,-17382,27763,-17403,27750,-17424,27736,-17446,27723,-17467,27710,-17488,27696,-17510,27683,-17531,27669,-17552,27656,-17573,27642,-17594,27629,-17616,27615,-17637,27602,-17658,27588,-17679,27575,-17700,27561,-17721,27548,-17743,27534,-17764,27520,-17785,27507,-17806,27493,-17827,27479,-17848,27466,-17869,27452,-17890,27438,-17911,27424,-17932,27411,-17953,27397,-17974,27383,-17995,27369,-18016,27355,-18037,27342,-18058,27328,-18079,27314,-18100,27300,-18121,27286,-18142,27272,-18163,27258,-18184,27244,-18205,27230,-18226,27216,-18247,27202,-18268,27188,-18288,27174,-18309,27160,-18330,27146,-18351,27132,-18372,27118,-18393,27104,-18413,27090,-18434,27076,-18455,27061,-18476,27047,-18496,27033,-18517,27019,-18538,27005,-18559,26990,-18579,26976,-18600,26962,-18621,26948,-18641,26933,-18662,26919,-18683,26905,-18703,26890,-18724,26876,-18745,26861,-18765,26847,-18786,26833,-18806,26818,-18827,26804,-18847,26789,-18868,26775,-18889,26760,-18909,26746,-18930,26731,-18950,26717,-18971,26702,-18991,26688,-19012,26673,-19032,26658,-19052,26644,-19073,26629,-19093,26615,-19114,26600,-19134,26585,-19155,26570,-19175,26556,-19195,26541,-19216,26526,-19236,26512,-19256,26497,-19277,26482,-19297,26467,-19317,26452,-19338,26437,-19358,26423,-19378,26408,-19398,26393,-19419,26378,-19439,26363,-19459,26348,-19479,26333,-19500,26318,-19520,26303,-19540,26288,-19560,26273,-19580,26258,-19600,26243,-19621,26228,-19641,26213,-19661,26198,-19681,26183,-19701,26168,-19721,26153,-19741,26137,-19761,26122,-19781,26107,-19801,26092,-19821,26077,-19841,26061,-19861,26046,-19881,26031,-19901,26016,-19921,26000,-19941,25985,-19961,25970,-19981,25954,-20001,25939,-20021,25924,-20041,25908,-20061,25893,-20080,25878,-20100,25862,-20120,25847,-20140,25831,-20160,25816,-20180,25800,-20199,25785,-20219,25769,-20239,25754,-20259,25738,-20278,25723,-20298,25707,-20318,25691,-20338,25676,-20357,25660,-20377,25645,-20397,25629,-20416,25613,-20436,25598,-20456,25582,-20475,25566,-20495,25550,-20514,25535,-20534,25519,-20554,25503,-20573,25487,-20593,25472,-20612,25456,-20632,25440,-20651,25424,-20671,25408,-20690,25392,-20710,25376,-20729,25361,-20749,25345,-20768,25329,-20788,25313,-20807,25297,-20826,25281,-20846,25265,-20865,25249,-20885,25233,-20904,25217,-20923,25201,-20943,25185,-20962,25169,-20981,25152,-21001,25136,-21020,25120,-21039,25104,-21058,25088,-21078,25072,-21097,25056,-21116,25039,-21135,25023,-21155,25007,-21174,24991,-21193,24974,-21212,24958,-21231,24942,-21250,24926,-21269,24909,-21289,24893,-21308,24877,-21327,24860,-21346,24844,-21365,24827,-21384,24811,-21403,24795,-21422,24778,-21441,24762,-21460,24745,-21479,24729,-21498,24712,-21517,24696,-21536,24679,-21555,24663,-21574,24646,-21593,24630,-21612,24613,-21630,24596,-21649,24580,-21668,24563,-21687,24546,-21706,24530,-21725,24513,-21744,24496,-21762,24480,-21781,24463,-21800,24446,-21819,24430,-21837,24413,-21856,24396,-21875,24379,-21894,24362,-21912,24346,-21931,24329,-21950,24312,-21968,24295,-21987,24278,-22005,24261,-22024,24244,-22043,24228,-22061,24211,-22080,24194,-22098,24177,-22117,24160,-22136,24143,-22154,24126,-22173,24109,-22191,24092,-22210,24075,-22228,24058,-22246,24041,-22265,24023,-22283,24006,-22302,23989,-22320,23972,-22339,23955,-22357,23938,-22375,23921,-22394,23903,-22412,23886,-22430,23869,-22449,23852,-22467,23835,-22485,23817,-22504,23800,-22522,23783,-22540,23766,-22558,23748,-22576,23731,-22595,23714,-22613,23696,-22631,23679,-22649,23661,-22667,23644,-22686,23627,-22704,23609,-22722,23592,-22740,23574,-22758,23557,-22776,23539,-22794,23522,-22812,23504,-22830,23487,-22848,23469,-22866,23452,-22884,23434,-22902,23417,-22920,23399,-22938,23382,-22956,23364,-22974,23346,-22992,23329,-23010,23311,-23028,23293,-23046,23276,-23063,23258,-23081,23240,-23099,23223,-23117,23205,-23135,23187,-23152,23169,-23170,23151,-23188,23134,-23206,23116,-23224,23098,-23241,23080,-23259,23062,-23277,23045,-23294,23027,-23312,23009,-23330,22991,-23347,22973,-23365,22955,-23383,22937,-23400,22919,-23418,22901,-23435,22883,-23453,22865,-23470,22847,-23488,22829,-23505,22811,-23523,22793,-23540,22775,-23558,22757,-23575,22739,-23593,22721,-23610,22703,-23628,22685,-23645,22666,-23662,22648,-23680,22630,-23697,22612,-23715,22594,-23732,22575,-23749,22557,-23767,22539,-23784,22521,-23801,22503,-23818,22484,-23836,22466,-23853,22448,-23870,22429,-23887,22411,-23904,22393,-23922,22374,-23939,22356,-23956,22338,-23973,22319,-23990,22301,-24007,22282,-24024,22264,-24042,22245,-24059,22227,-24076,22209,-24093,22190,-24110,22172,-24127,22153,-24144,22135,-24161,22116,-24178,22097,-24195,22079,-24212,22060,-24229,22042,-24245,22023,-24262,22004,-24279,21986,-24296,21967,-24313,21949,-24330,21930,-24347,21911,-24363,21893,-24380,21874,-24397,21855,-24414,21836,-24431,21818,-24447,21799,-24464,21780,-24481,21761,-24497,21743,-24514,21724,-24531,21705,-24547,21686,-24564,21667,-24581,21648,-24597,21629,-24614,21611,-24631,21592,-24647,21573,-24664,21554,-24680,21535,-24697,21516,-24713,21497,-24730,21478,-24746,21459,-24763,21440,-24779,21421,-24796,21402,-24812,21383,-24828,21364,-24845,21345,-24861,21326,-24878,21307,-24894,21288,-24910,21268,-24927,21249,-24943,21230,-24959,21211,-24975,21192,-24992,21173,-25008,21154,-25024,21134,-25040,21115,-25057,21096,-25073,21077,-25089,21057,-25105,21038,-25121,21019,-25137,21000,-25153,20980,-25170,20961,-25186,20942,-25202,20922,-25218,20903,-25234,20884,-25250,20864,-25266,20845,-25282,20825,-25298,20806,-25314,20787,-25330,20767,-25346,20748,-25362,20728,-25377,20709,-25393,20689,-25409,20670,-25425,20650,-25441,20631,-25457,20611,-25473,20592,-25488,20572,-25504,20553,-25520,20533,-25536,20513,-25551,20494,-25567,20474,-25583,20455,-25599,20435,-25614,20415,-25630,20396,-25646,20376,-25661,20356,-25677,20337,-25692,20317,-25708,20297,-25724,20277,-25739,20258,-25755,20238,-25770,20218,-25786,20198,-25801,20179,-25817,20159,-25832,20139,-25848,20119,-25863,20099,-25879,20079,-25894,20060,-25909,20040,-25925,20020,-25940,20000,-25955,19980,-25971,19960,-25986,19940,-26001,19920,-26017,19900,-26032,19880,-26047,19860,-26062,19840,-26078,19820,-26093,19800,-26108,19780,-26123,19760,-26138,19740,-26154,19720,-26169,19700,-26184,19680,-26199,19660,-26214,19640,-26229,19620,-26244,19599,-26259,19579,-26274,19559,-26289,19539,-26304,19519,-26319,19499,-26334,19478,-26349,19458,-26364,19438,-26379,19418,-26394,19397,-26409,19377,-26424,19357,-26438,19337,-26453,19316,-26468,19296,-26483,19276,-26498,19255,-26513,19235,-26527,19215,-26542,19194,-26557,19174,-26571,19154,-26586,19133,-26601,19113,-26616,19092,-26630,19072,-26645,19051,-26659,19031,-26674,19011,-26689,18990,-26703,18970,-26718,18949,-26732,18929,-26747,18908,-26761,18888,-26776,18867,-26790,18846,-26805,18826,-26819,18805,-26834,18785,-26848,18764,-26862,18744,-26877,18723,-26891,18702,-26906,18682,-26920,18661,-26934,18640,-26949,18620,-26963,18599,-26977,18578,-26991,18558,-27006,18537,-27020,18516,-27034,18495,-27048,18475,-27062,18454,-27077,18433,-27091,18412,-27105,18392,-27119,18371,-27133,18350,-27147,18329,-27161,18308,-27175,18287,-27189,18267,-27203,18246,-27217,18225,-27231,18204,-27245,18183,-27259,18162,-27273,18141,-27287,18120,-27301,18099,-27315,18078,-27329,18057,-27343,18036,-27356,18015,-27370,17994,-27384,17973,-27398,17952,-27412,17931,-27425,17910,-27439,17889,-27453,17868,-27467,17847,-27480,17826,-27494,17805,-27508,17784,-27521,17763,-27535,17742,-27549,17720,-27562,17699,-27576,17678,-27589,17657,-27603,17636,-27616,17615,-27630,17593,-27643,17572,-27657,17551,-27670,17530,-27684,17509,-27697,17487,-27711,17466,-27724,17445,-27737,17423,-27751,17402,-27764,17381,-27778,17360,-27791,17338,-27804,17317,-27817,17296,-27831,17274,-27844,17253,-27857,17232,-27870,17210,-27884,17189,-27897,17167,-27910,17146,-27923,17124,-27936,17103,-27949,17082,-27963,17060,-27976,17039,-27989,17017,-28002,16996,-28015,16974,-28028,16953,-28041,16931,-28054,16910,-28067,16888,-28080,16867,-28093,16845,-28106,16824,-28119,16802,-28132,16780,-28144,16759,-28157,16737,-28170,16716,-28183,16694,-28196,16672,-28209,16651,-28221,16629,-28234,16607,-28247,16586,-28260,16564,-28272,16542,-28285,16521,-28298,16499,-28310,16477,-28323,16455,-28336,16434,-28348,16412,-28361,16390,-28373,16368,-28386,16347,-28398,16325,-28411,16303,-28424,16281,-28436,16260,-28448,16238,-28461,16216,-28473,16194,-28486,16172,-28498,16150,-28511,16128,-28523,16107,-28535,16085,-28548,16063,-28560,16041,-28572,16019,-28585,15997,-28597,15975,-28609,15953,-28621,15931,-28634,15909,-28646,15887,-28658,15865,-28670,15843,-28682,15821,-28695,15799,-28707,15777,-28719,15755,-28731,15733,-28743,15711,-28755,15689,-28767,15667,-28779,15645,-28791,15623,-28803,15601,-28815,15579,-28827,15556,-28839,15534,-28851,15512,-28863,15490,-28875,15468,-28887,15446,-28898,15424,-28910,15401,-28922,15379,-28934,15357,-28946,15335,-28957,15313,-28969,15290,-28981,15268,-28993,15246,-29004,15224,-29016,15201,-29028,15179,-29039,15157,-29051,15135,-29063,15112,-29074,15090,-29086,15068,-29097,15045,-29109,15023,-29120,15001,-29132,14978,-29143,14956,-29155,14934,-29166,14911,-29178,14889,-29189,14866,-29201,14844,-29212,14822,-29223,14799,-29235,14777,-29246,14754,-29257,14732,-29269,14709,-29280,14687,-29291,14665,-29303,14642,-29314,14620,-29325,14597,-29336,14575,-29347,14552,-29359,14530,-29370,14507,-29381,14484,-29392,14462,-29403,14439,-29414,14417,-29425,14394,-29436,14372,-29447,14349,-29458,14326,-29469,14304,-29480,14281,-29491,14259,-29502,14236,-29513,14213,-29524,14191,-29535,14168,-29546,14145,-29557,14123,-29568,14100,-29578,14077,-29589,14055,-29600,14032,-29611,14009,-29622,13986,-29632,13964,-29643,13941,-29654,13918,-29664,13895,-29675,13873,-29686,13850,-29696,13827,-29707,13804,-29718,13782,-29728,13759,-29739,13736,-29749,13713,-29760,13690,-29770,13667,-29781,13645,-29791,13622,-29802,13599,-29812,13576,-29823,13553,-29833,13530,-29843,13507,-29854,13485,-29864,13462,-29874,13439,-29885,13416,-29895,13393,-29905,13370,-29916,13347,-29926,13324,-29936,13301,-29946,13278,-29956,13255,-29967,13232,-29977,13209,-29987,13186,-29997,13163,-30007,13140,-30017,13117,-30027,13094,-30037,13071,-30047,13048,-30057,13025,-30067,13002,-30077,12979,-30087,12956,-30097,12933,-30107,12909,-30117,12886,-30127,12863,-30137,12840,-30147,12817,-30157,12794,-30166,12771,-30176,12748,-30186,12724,-30196,12701,-30206,12678,-30215,12655,-30225,12632,-30235,12609,-30244,12585,-30254,12562,-30264,12539,-30273,12516,-30283,12492,-30292,12469,-30302,12446,-30312,12423,-30321,12399,-30331,12376,-30340,12353,-30350,12330,-30359,12306,-30369,12283,-30378,12260,-30387,12236,-30397,12213,-30406,12190,-30416,12166,-30425,12143,-30434,12120,-30443,12096,-30453,12073,-30462,12050,-30471,12026,-30481,12003,-30490,11980,-30499,11956,-30508,11933,-30517,11909,-30526,11886,-30536,11862,-30545,11839,-30554,11816,-30563,11792,-30572,11769,-30581,11745,-30590,11722,-30599,11698,-30608,11675,-30617,11651,-30626,11628,-30635,11604,-30644,11581,-30653,11557,-30661,11534,-30670,11510,-30679,11487,-30688,11463,-30697,11440,-30706,11416,-30714,11393,-30723,11369,-30732,11345,-30740,11322,-30749,11298,-30758,11275,-30767,11251,-30775,11227,-30784,11204,-30792,11180,-30801,11157,-30810,11133,-30818,11109,-30827,11086,-30835,11062,-30844,11038,-30852,11015,-30861,10991,-30869,10967,-30877,10944,-30886,10920,-30894,10896,-30903,10873,-30911,10849,-30919,10825,-30928,10801,-30936,10778,-30944,10754,-30952,10730,-30961,10706,-30969,10683,-30977,10659,-30985,10635,-30993,10611,-31002,10588,-31010,10564,-31018,10540,-31026,10516,-31034,10492,-31042,10469,-31050,10445,-31058,10421,-31066,10397,-31074,10373,-31082,10349,-31090,10326,-31098,10302,-31106,10278,-31114,10254,-31122,10230,-31129,10206,-31137,10182,-31145,10159,-31153,10135,-31161,10111,-31168,10087,-31176,10063,-31184,10039,-31192,10015,-31199,9991,-31207,9967,-31215,9943,-31222,9919,-31230,9895,-31237,9871,-31245,9847,-31253,9823,-31260,9799,-31268,9775,-31275,9751,-31283,9727,-31290,9703,-31298,9679,-31305,9655,-31312,9631,-31320,9607,-31327,9583,-31335,9559,-31342,9535,-31349,9511,-31357,9487,-31364,9463,-31371,9439,-31378,9415,-31386,9391,-31393,9367,-31400,9343,-31407,9319,-31414,9295,-31421,9270,-31429,9246,-31436,9222,-31443,9198,-31450,9174,-31457,9150,-31464,9126,-31471,9102,-31478,9077,-31485,9053,-31492,9029,-31499,9005,-31506,8981,-31513,8957,-31519,8932,-31526,8908,-31533,8884,-31540,8860,-31547,8836,-31554,8812,-31560,8787,-31567,8763,-31574,8739,-31581,8715,-31587,8690,-31594,8666,-31601,8642,-31607,8618,-31614,8593,-31620,8569,-31627,8545,-31634,8521,-31640,8496,-31647,8472,-31653,8448,-31660,8424,-31666,8399,-31673,8375,-31679,8351,-31685,8326,-31692,8302,-31698,8278,-31705,8253,-31711,8229,-31717,8205,-31724,8180,-31730,8156,-31736,8132,-31742,8107,-31749,8083,-31755,8059,-31761,8034,-31767,8010,-31773,7986,-31779,7961,-31786,7937,-31792,7912,-31798,7888,-31804,7864,-31810,7839,-31816,7815,-31822,7790,-31828,7766,-31834,7742,-31840,7717,-31846,7693,-31852,7668,-31857,7644,-31863,7619,-31869,7595,-31875,7571,-31881,7546,-31887,7522,-31892,7497,-31898,7473,-31904,7448,-31910,7424,-31915,7399,-31921,7375,-31927,7350,-31932,7326,-31938,7301,-31944,7277,-31949,7252,-31955,7228,-31960,7203,-31966,7179,-31971,7154,-31977,7130,-31982,7105,-31988,7081,-31993,7056,-31999,7032,-32004,7007,-32009,6982,-32015,6958,-32020,6933,-32025,6909,-32031,6884,-32036,6860,-32041,6835,-32047,6811,-32052,6786,-32057,6761,-32062,6737,-32067,6712,-32073,6688,-32078,6663,-32083,6638,-32088,6614,-32093,6589,-32098,6564,-32103,6540,-32108,6515,-32113,6491,-32118,6466,-32123,6441,-32128,6417,-32133,6392,-32138,6367,-32143,6343,-32148,6318,-32153,6293,-32157,6269,-32162,6244,-32167,6219,-32172,6195,-32177,6170,-32181,6145,-32186,6121,-32191,6096,-32195,6071,-32200,6047,-32205,6022,-32209,5997,-32214,5972,-32219,5948,-32223,5923,-32228,5898,-32232,5874,-32237,5849,-32241,5824,-32246,5799,-32250,5775,-32255,5750,-32259,5725,-32263,5700,-32268,5676,-32272,5651,-32276,5626,-32281,5601,-32285,5577,-32289,5552,-32294,5527,-32298,5502,-32302,5478,-32306,5453,-32311,5428,-32315,5403,-32319,5378,-32323,5354,-32327,5329,-32331,5304,-32335,5279,-32339,5254,-32343,5230,-32347,5205,-32351,5180,-32355,5155,-32359,5130,-32363,5106,-32367,5081,-32371,5056,-32375,5031,-32379,5006,-32383,4981,-32387,4957,-32390,4932,-32394,4907,-32398,4882,-32402,4857,-32405,4832,-32409,4807,-32413,4783,-32417,4758,-32420,4733,-32424,4708,-32427,4683,-32431,4658,-32435,4633,-32438,4608,-32442,4584,-32445,4559,-32449,4534,-32452,4509,-32456,4484,-32459,4459,-32463,4434,-32466,4409,-32469,4384,-32473,4359,-32476,4335,-32479,4310,-32483,4285,-32486,4260,-32489,4235,-32493,4210,-32496,4185,-32499,4160,-32502,4135,-32505,4110,-32509,4085,-32512,4060,-32515,4035,-32518,4011,-32521,3986,-32524,3961,-32527,3936,-32530,3911,-32533,3886,-32536,3861,-32539,3836,-32542,3811,-32545,3786,-32548,3761,-32551,3736,-32554,3711,-32557,3686,-32559,3661,-32562,3636,-32565,3611,-32568,3586,-32571,3561,-32573,3536,-32576,3511,-32579,3486,-32581,3461,-32584,3436,-32587,3411,-32589,3386,-32592,3361,-32595,3336,-32597,3311,-32600,3286,-32602,3261,-32605,3236,-32607,3211,-32610,3186,-32612,3161,-32615,3136,-32617,3111,-32619,3086,-32622,3061,-32624,3036,-32626,3011,-32629,2986,-32631,2961,-32633,2936,-32636,2911,-32638,2886,-32640,2861,-32642,2836,-32645,2811,-32647,2786,-32649,2761,-32651,2736,-32653,2711,-32655,2686,-32657,2661,-32659,2636,-32661,2610,-32663,2585,-32665,2560,-32667,2535,-32669,2510,-32671,2485,-32673,2460,-32675,2435,-32677,2410,-32679,2385,-32681,2360,-32682,2335,-32684,2310,-32686,2285,-32688,2260,-32689,2235,-32691,2209,-32693,2184,-32695,2159,-32696,2134,-32698,2109,-32700,2084,-32701,2059,-32703,2034,-32704,2009,-32706,1984,-32707,1959,-32709,1934,-32710,1908,-32712,1883,-32713,1858,-32715,1833,-32716,1808,-32718,1783,-32719,1758,-32720,1733,-32722,1708,-32723,1683,-32724,1658,-32726,1632,-32727,1607,-32728,1582,-32729,1557,-32730,1532,-32732,1507,-32733,1482,-32734,1457,-32735,1432,-32736,1406,-32737,1381,-32738,1356,-32739,1331,-32740,1306,-32741,1281,-32742,1256,-32743,1231,-32744,1206,-32745,1180,-32746,1155,-32747,1130,-32748,1105,-32749,1080,-32750,1055,-32751,1030,-32751,1005,-32752,980,-32753,954,-32754,929,-32754,904,-32755,879,-32756,854,-32756,829,-32757,804,-32758,779,-32758,753,-32759,728,-32759,703,-32760,678,-32760,653,-32761,628,-32761,603,-32762,578,-32762,552,-32763,527,-32763,502,-32764,477,-32764,452,-32764,427,-32765,402,-32765,376,-32765,351,-32766,326,-32766,301,-32766,276,-32766,251,-32767,226,-32767,201,-32767,175,-32767,150,-32767,125,-32767,100,-32767,75,-32767,50,-32767,25,-32767,0,-32767,-26,-32767,-51,-32767,-76,-32767,-101,-32767,-126,-32767,-151,-32767,-176,-32767,-202,-32767,-227,-32767,-252,-32767,-277,-32766,-302,-32766,-327,-32766,-352,-32766,-377,-32765,-403,-32765,-428,-32765,-453,-32764,-478,-32764,-503,-32764,-528,-32763,-553,-32763,-579,-32762,-604,-32762,-629,-32761,-654,-32761,-679,-32760,-704,-32760,-729,-32759,-754,-32759,-780,-32758,-805,-32758,-830,-32757,-855,-32756,-880,-32756,-905,-32755,-930,-32754,-955,-32754,-981,-32753,-1006,-32752,-1031,-32751,-1056,-32751,-1081,-32750,-1106,-32749,-1131,-32748,-1156,-32747,-1181,-32746,-1207,-32745,-1232,-32744,-1257,-32743,-1282,-32742,-1307,-32741,-1332,-32740,-1357,-32739,-1382,-32738,-1407,-32737,-1433,-32736,-1458,-32735,-1483,-32734,-1508,-32733,-1533,-32732,-1558,-32730,-1583,-32729,-1608,-32728,-1633,-32727,-1659,-32726,-1684,-32724,-1709,-32723,-1734,-32722,-1759,-32720,-1784,-32719,-1809,-32718,-1834,-32716,-1859,-32715,-1884,-32713,-1909,-32712,-1935,-32710,-1960,-32709,-1985,-32707,-2010,-32706,-2035,-32704,-2060,-32703,-2085,-32701,-2110,-32700,-2135,-32698,-2160,-32696,-2185,-32695,-2210,-32693,-2236,-32691,-2261,-32689,-2286,-32688,-2311,-32686,-2336,-32684,-2361,-32682,-2386,-32681,-2411,-32679,-2436,-32677,-2461,-32675,-2486,-32673,-2511,-32671,-2536,-32669,-2561,-32667,-2586,-32665,-2611,-32663,-2637,-32661,-2662,-32659,-2687,-32657,-2712,-32655,-2737,-32653,-2762,-32651,-2787,-32649,-2812,-32647,-2837,-32645,-2862,-32642,-2887,-32640,-2912,-32638,-2937,-32636,-2962,-32633,-2987,-32631,-3012,-32629,-3037,-32626,-3062,-32624,-3087,-32622,-3112,-32619,-3137,-32617,-3162,-32615,-3187,-32612,-3212,-32610,-3237,-32607,-3262,-32605,-3287,-32602,-3312,-32600,-3337,-32597,-3362,-32595,-3387,-32592,-3412,-32589,-3437,-32587,-3462,-32584,-3487,-32581,-3512,-32579,-3537,-32576,-3562,-32573,-3587,-32571,-3612,-32568,-3637,-32565,-3662,-32562,-3687,-32559,-3712,-32557,-3737,-32554,-3762,-32551,-3787,-32548,-3812,-32545,-3837,-32542,-3862,-32539,-3887,-32536,-3912,-32533,-3937,-32530,-3962,-32527,-3987,-32524,-4012,-32521,-4036,-32518,-4061,-32515,-4086,-32512,-4111,-32509,-4136,-32505,-4161,-32502,-4186,-32499,-4211,-32496,-4236,-32493,-4261,-32489,-4286,-32486,-4311,-32483,-4336,-32479,-4360,-32476,-4385,-32473,-4410,-32469,-4435,-32466,-4460,-32463,-4485,-32459,-4510,-32456,-4535,-32452,-4560,-32449,-4585,-32445,-4609,-32442,-4634,-32438,-4659,-32435,-4684,-32431,-4709,-32427,-4734,-32424,-4759,-32420,-4784,-32417,-4808,-32413,-4833,-32409,-4858,-32405,-4883,-32402,-4908,-32398,-4933,-32394,-4958,-32390,-4982,-32387,-5007,-32383,-5032,-32379,-5057,-32375,-5082,-32371,-5107,-32367,-5131,-32363,-5156,-32359,-5181,-32355,-5206,-32351,-5231,-32347,-5255,-32343,-5280,-32339,-5305,-32335,-5330,-32331,-5355,-32327,-5379,-32323,-5404,-32319,-5429,-32315,-5454,-32311,-5479,-32306,-5503,-32302,-5528,-32298,-5553,-32294,-5578,-32289,-5602,-32285,-5627,-32281,-5652,-32276,-5677,-32272,-5701,-32268,-5726,-32263,-5751,-32259,-5776,-32255,-5800,-32250,-5825,-32246,-5850,-32241,-5875,-32237,-5899,-32232,-5924,-32228,-5949,-32223,-5973,-32219,-5998,-32214,-6023,-32209,-6048,-32205,-6072,-32200,-6097,-32195,-6122,-32191,-6146,-32186,-6171,-32181,-6196,-32177,-6220,-32172,-6245,-32167,-6270,-32162,-6294,-32157,-6319,-32153,-6344,-32148,-6368,-32143,-6393,-32138,-6418,-32133,-6442,-32128,-6467,-32123,-6492,-32118,-6516,-32113,-6541,-32108,-6565,-32103,-6590,-32098,-6615,-32093,-6639,-32088,-6664,-32083,-6689,-32078,-6713,-32073,-6738,-32067,-6762,-32062,-6787,-32057,-6812,-32052,-6836,-32047,-6861,-32041,-6885,-32036,-6910,-32031,-6934,-32025,-6959,-32020,-6983,-32015,-7008,-32009,-7033,-32004,-7057,-31999,-7082,-31993,-7106,-31988,-7131,-31982,-7155,-31977,-7180,-31971,-7204,-31966,-7229,-31960,-7253,-31955,-7278,-31949,-7302,-31944,-7327,-31938,-7351,-31932,-7376,-31927,-7400,-31921,-7425,-31915,-7449,-31910,-7474,-31904,-7498,-31898,-7523,-31892,-7547,-31887,-7572,-31881,-7596,-31875,-7620,-31869,-7645,-31863,-7669,-31857,-7694,-31852,-7718,-31846,-7743,-31840,-7767,-31834,-7791,-31828,-7816,-31822,-7840,-31816,-7865,-31810,-7889,-31804,-7913,-31798,-7938,-31792,-7962,-31786,-7987,-31779,-8011,-31773,-8035,-31767,-8060,-31761,-8084,-31755,-8108,-31749,-8133,-31742,-8157,-31736,-8181,-31730,-8206,-31724,-8230,-31717,-8254,-31711,-8279,-31705,-8303,-31698,-8327,-31692,-8352,-31685,-8376,-31679,-8400,-31673,-8425,-31666,-8449,-31660,-8473,-31653,-8497,-31647,-8522,-31640,-8546,-31634,-8570,-31627,-8594,-31620,-8619,-31614,-8643,-31607,-8667,-31601,-8691,-31594,-8716,-31587,-8740,-31581,-8764,-31574,-8788,-31567,-8813,-31560,-8837,-31554,-8861,-31547,-8885,-31540,-8909,-31533,-8933,-31526,-8958,-31519,-8982,-31513,-9006,-31506,-9030,-31499,-9054,-31492,-9078,-31485,-9103,-31478,-9127,-31471,-9151,-31464,-9175,-31457,-9199,-31450,-9223,-31443,-9247,-31436,-9271,-31429,-9296,-31421,-9320,-31414,-9344,-31407,-9368,-31400,-9392,-31393,-9416,-31386,-9440,-31378,-9464,-31371,-9488,-31364,-9512,-31357,-9536,-31349,-9560,-31342,-9584,-31335,-9608,-31327,-9632,-31320,-9656,-31312,-9680,-31305,-9704,-31298,-9728,-31290,-9752,-31283,-9776,-31275,-9800,-31268,-9824,-31260,-9848,-31253,-9872,-31245,-9896,-31237,-9920,-31230,-9944,-31222,-9968,-31215,-9992,-31207,-10016,-31199,-10040,-31192,-10064,-31184,-10088,-31176,-10112,-31168,-10136,-31161,-10160,-31153,-10183,-31145,-10207,-31137,-10231,-31129,-10255,-31122,-10279,-31114,-10303,-31106,-10327,-31098,-10350,-31090,-10374,-31082,-10398,-31074,-10422,-31066,-10446,-31058,-10470,-31050,-10493,-31042,-10517,-31034,-10541,-31026,-10565,-31018,-10589,-31010,-10612,-31002,-10636,-30993,-10660,-30985,-10684,-30977,-10707,-30969,-10731,-30961,-10755,-30952,-10779,-30944,-10802,-30936,-10826,-30928,-10850,-30919,-10874,-30911,-10897,-30903,-10921,-30894,-10945,-30886,-10968,-30877,-10992,-30869,-11016,-30861,-11039,-30852,-11063,-30844,-11087,-30835,-11110,-30827,-11134,-30818,-11158,-30810,-11181,-30801,-11205,-30792,-11228,-30784,-11252,-30775,-11276,-30767,-11299,-30758,-11323,-30749,-11346,-30740,-11370,-30732,-11394,-30723,-11417,-30714,-11441,-30706,-11464,-30697,-11488,-30688,-11511,-30679,-11535,-30670,-11558,-30661,-11582,-30653,-11605,-30644,-11629,-30635,-11652,-30626,-11676,-30617,-11699,-30608,-11723,-30599,-11746,-30590,-11770,-30581,-11793,-30572,-11817,-30563,-11840,-30554,-11863,-30545,-11887,-30536,-11910,-30526,-11934,-30517,-11957,-30508,-11981,-30499,-12004,-30490,-12027,-30481,-12051,-30471,-12074,-30462,-12097,-30453,-12121,-30443,-12144,-30434,-12167,-30425,-12191,-30416,-12214,-30406,-12237,-30397,-12261,-30387,-12284,-30378,-12307,-30369,-12331,-30359,-12354,-30350,-12377,-30340,-12400,-30331,-12424,-30321,-12447,-30312,-12470,-30302,-12493,-30292,-12517,-30283,-12540,-30273,-12563,-30264,-12586,-30254,-12610,-30244,-12633,-30235,-12656,-30225,-12679,-30215,-12702,-30206,-12725,-30196,-12749,-30186,-12772,-30176,-12795,-30166,-12818,-30157,-12841,-30147,-12864,-30137,-12887,-30127,-12910,-30117,-12934,-30107,-12957,-30097,-12980,-30087,-13003,-30077,-13026,-30067,-13049,-30057,-13072,-30047,-13095,-30037,-13118,-30027,-13141,-30017,-13164,-30007,-13187,-29997,-13210,-29987,-13233,-29977,-13256,-29967,-13279,-29956,-13302,-29946,-13325,-29936,-13348,-29926,-13371,-29916,-13394,-29905,-13417,-29895,-13440,-29885,-13463,-29874,-13486,-29864,-13508,-29854,-13531,-29843,-13554,-29833,-13577,-29823,-13600,-29812,-13623,-29802,-13646,-29791,-13668,-29781,-13691,-29770,-13714,-29760,-13737,-29749,-13760,-29739,-13783,-29728,-13805,-29718,-13828,-29707,-13851,-29696,-13874,-29686,-13896,-29675,-13919,-29664,-13942,-29654,-13965,-29643,-13987,-29632,-14010,-29622,-14033,-29611,-14056,-29600,-14078,-29589,-14101,-29578,-14124,-29568,-14146,-29557,-14169,-29546,-14192,-29535,-14214,-29524,-14237,-29513,-14260,-29502,-14282,-29491,-14305,-29480,-14327,-29469,-14350,-29458,-14373,-29447,-14395,-29436,-14418,-29425,-14440,-29414,-14463,-29403,-14485,-29392,-14508,-29381,-14531,-29370,-14553,-29359,-14576,-29347,-14598,-29336,-14621,-29325,-14643,-29314,-14666,-29303,-14688,-29291,-14710,-29280,-14733,-29269,-14755,-29257,-14778,-29246,-14800,-29235,-14823,-29223,-14845,-29212,-14867,-29201,-14890,-29189,-14912,-29178,-14935,-29166,-14957,-29155,-14979,-29143,-15002,-29132,-15024,-29120,-15046,-29109,-15069,-29097,-15091,-29086,-15113,-29074,-15136,-29063,-15158,-29051,-15180,-29039,-15202,-29028,-15225,-29016,-15247,-29004,-15269,-28993,-15291,-28981,-15314,-28969,-15336,-28957,-15358,-28946,-15380,-28934,-15402,-28922,-15425,-28910,-15447,-28898,-15469,-28887,-15491,-28875,-15513,-28863,-15535,-28851,-15557,-28839,-15580,-28827,-15602,-28815,-15624,-28803,-15646,-28791,-15668,-28779,-15690,-28767,-15712,-28755,-15734,-28743,-15756,-28731,-15778,-28719,-15800,-28707,-15822,-28695,-15844,-28682,-15866,-28670,-15888,-28658,-15910,-28646,-15932,-28634,-15954,-28621,-15976,-28609,-15998,-28597,-16020,-28585,-16042,-28572,-16064,-28560,-16086,-28548,-16108,-28535,-16129,-28523,-16151,-28511,-16173,-28498,-16195,-28486,-16217,-28473,-16239,-28461,-16261,-28448,-16282,-28436,-16304,-28424,-16326,-28411,-16348,-28398,-16369,-28386,-16391,-28373,-16413,-28361,-16435,-28348,-16456,-28336,-16478,-28323,-16500,-28310,-16522,-28298,-16543,-28285,-16565,-28272,-16587,-28260,-16608,-28247,-16630,-28234,-16652,-28221,-16673,-28209,-16695,-28196,-16717,-28183,-16738,-28170,-16760,-28157,-16781,-28144,-16803,-28132,-16825,-28119,-16846,-28106,-16868,-28093,-16889,-28080,-16911,-28067,-16932,-28054,-16954,-28041,-16975,-28028,-16997,-28015,-17018,-28002,-17040,-27989,-17061,-27976,-17083,-27963,-17104,-27949,-17125,-27936,-17147,-27923,-17168,-27910,-17190,-27897,-17211,-27884,-17233,-27870,-17254,-27857,-17275,-27844,-17297,-27831,-17318,-27817,-17339,-27804,-17361,-27791,-17382,-27778,-17403,-27764,-17424,-27751,-17446,-27737,-17467,-27724,-17488,-27711,-17510,-27697,-17531,-27684,-17552,-27670,-17573,-27657,-17594,-27643,-17616,-27630,-17637,-27616,-17658,-27603,-17679,-27589,-17700,-27576,-17721,-27562,-17743,-27549,-17764,-27535,-17785,-27521,-17806,-27508,-17827,-27494,-17848,-27480,-17869,-27467,-17890,-27453,-17911,-27439,-17932,-27425,-17953,-27412,-17974,-27398,-17995,-27384,-18016,-27370,-18037,-27356,-18058,-27343,-18079,-27329,-18100,-27315,-18121,-27301,-18142,-27287,-18163,-27273,-18184,-27259,-18205,-27245,-18226,-27231,-18247,-27217,-18268,-27203,-18288,-27189,-18309,-27175,-18330,-27161,-18351,-27147,-18372,-27133,-18393,-27119,-18413,-27105,-18434,-27091,-18455,-27077,-18476,-27062,-18496,-27048,-18517,-27034,-18538,-27020,-18559,-27006,-18579,-26991,-18600,-26977,-18621,-26963,-18641,-26949,-18662,-26934,-18683,-26920,-18703,-26906,-18724,-26891,-18745,-26877,-18765,-26862,-18786,-26848,-18806,-26834,-18827,-26819,-18847,-26805,-18868,-26790,-18889,-26776,-18909,-26761,-18930,-26747,-18950,-26732,-18971,-26718,-18991,-26703,-19012,-26689,-19032,-26674,-19052,-26659,-19073,-26645,-19093,-26630,-19114,-26616,-19134,-26601,-19155,-26586,-19175,-26571,-19195,-26557,-19216,-26542,-19236,-26527,-19256,-26513,-19277,-26498,-19297,-26483,-19317,-26468,-19338,-26453,-19358,-26438,-19378,-26424,-19398,-26409,-19419,-26394,-19439,-26379,-19459,-26364,-19479,-26349,-19500,-26334,-19520,-26319,-19540,-26304,-19560,-26289,-19580,-26274,-19600,-26259,-19621,-26244,-19641,-26229,-19661,-26214,-19681,-26199,-19701,-26184,-19721,-26169,-19741,-26154,-19761,-26138,-19781,-26123,-19801,-26108,-19821,-26093,-19841,-26078,-19861,-26062,-19881,-26047,-19901,-26032,-19921,-26017,-19941,-26001,-19961,-25986,-19981,-25971,-20001,-25955,-20021,-25940,-20041,-25925,-20061,-25909,-20080,-25894,-20100,-25879,-20120,-25863,-20140,-25848,-20160,-25832,-20180,-25817,-20199,-25801,-20219,-25786,-20239,-25770,-20259,-25755,-20278,-25739,-20298,-25724,-20318,-25708,-20338,-25692,-20357,-25677,-20377,-25661,-20397,-25646,-20416,-25630,-20436,-25614,-20456,-25599,-20475,-25583,-20495,-25567,-20514,-25551,-20534,-25536,-20554,-25520,-20573,-25504,-20593,-25488,-20612,-25473,-20632,-25457,-20651,-25441,-20671,-25425,-20690,-25409,-20710,-25393,-20729,-25377,-20749,-25362,-20768,-25346,-20788,-25330,-20807,-25314,-20826,-25298,-20846,-25282,-20865,-25266,-20885,-25250,-20904,-25234,-20923,-25218,-20943,-25202,-20962,-25186,-20981,-25170,-21001,-25153,-21020,-25137,-21039,-25121,-21058,-25105,-21078,-25089,-21097,-25073,-21116,-25057,-21135,-25040,-21155,-25024,-21174,-25008,-21193,-24992,-21212,-24975,-21231,-24959,-21250,-24943,-21269,-24927,-21289,-24910,-21308,-24894,-21327,-24878,-21346,-24861,-21365,-24845,-21384,-24828,-21403,-24812,-21422,-24796,-21441,-24779,-21460,-24763,-21479,-24746,-21498,-24730,-21517,-24713,-21536,-24697,-21555,-24680,-21574,-24664,-21593,-24647,-21612,-24631,-21630,-24614,-21649,-24597,-21668,-24581,-21687,-24564,-21706,-24547,-21725,-24531,-21744,-24514,-21762,-24497,-21781,-24481,-21800,-24464,-21819,-24447,-21837,-24431,-21856,-24414,-21875,-24397,-21894,-24380,-21912,-24363,-21931,-24347,-21950,-24330,-21968,-24313,-21987,-24296,-22005,-24279,-22024,-24262,-22043,-24245,-22061,-24229,-22080,-24212,-22098,-24195,-22117,-24178,-22136,-24161,-22154,-24144,-22173,-24127,-22191,-24110,-22210,-24093,-22228,-24076,-22246,-24059,-22265,-24042,-22283,-24024,-22302,-24007,-22320,-23990,-22339,-23973,-22357,-23956,-22375,-23939,-22394,-23922,-22412,-23904,-22430,-23887,-22449,-23870,-22467,-23853,-22485,-23836,-22504,-23818,-22522,-23801,-22540,-23784,-22558,-23767,-22576,-23749,-22595,-23732,-22613,-23715,-22631,-23697,-22649,-23680,-22667,-23662,-22686,-23645,-22704,-23628,-22722,-23610,-22740,-23593,-22758,-23575,-22776,-23558,-22794,-23540,-22812,-23523,-22830,-23505,-22848,-23488,-22866,-23470,-22884,-23453,-22902,-23435,-22920,-23418,-22938,-23400,-22956,-23383,-22974,-23365,-22992,-23347,-23010,-23330,-23028,-23312,-23046,-23294,-23063,-23277,-23081,-23259,-23099,-23241,-23117,-23224,-23135,-23206,-23152,-23188,-23170,-23170,-23188,-23152,-23206,-23135,-23224,-23117,-23241,-23099,-23259,-23081,-23277,-23063,-23294,-23046,-23312,-23028,-23330,-23010,-23347,-22992,-23365,-22974,-23383,-22956,-23400,-22938,-23418,-22920,-23435,-22902,-23453,-22884,-23470,-22866,-23488,-22848,-23505,-22830,-23523,-22812,-23540,-22794,-23558,-22776,-23575,-22758,-23593,-22740,-23610,-22722,-23628,-22704,-23645,-22686,-23662,-22667,-23680,-22649,-23697,-22631,-23715,-22613,-23732,-22595,-23749,-22576,-23767,-22558,-23784,-22540,-23801,-22522,-23818,-22504,-23836,-22485,-23853,-22467,-23870,-22449,-23887,-22430,-23904,-22412,-23922,-22394,-23939,-22375,-23956,-22357,-23973,-22339,-23990,-22320,-24007,-22302,-24024,-22283,-24042,-22265,-24059,-22246,-24076,-22228,-24093,-22210,-24110,-22191,-24127,-22173,-24144,-22154,-24161,-22136,-24178,-22117,-24195,-22098,-24212,-22080,-24229,-22061,-24245,-22043,-24262,-22024,-24279,-22005,-24296,-21987,-24313,-21968,-24330,-21950,-24347,-21931,-24363,-21912,-24380,-21894,-24397,-21875,-24414,-21856,-24431,-21837,-24447,-21819,-24464,-21800,-24481,-21781,-24497,-21762,-24514,-21744,-24531,-21725,-24547,-21706,-24564,-21687,-24581,-21668,-24597,-21649,-24614,-21630,-24631,-21612,-24647,-21593,-24664,-21574,-24680,-21555,-24697,-21536,-24713,-21517,-24730,-21498,-24746,-21479,-24763,-21460,-24779,-21441,-24796,-21422,-24812,-21403,-24828,-21384,-24845,-21365,-24861,-21346,-24878,-21327,-24894,-21308,-24910,-21289,-24927,-21269,-24943,-21250,-24959,-21231,-24975,-21212,-24992,-21193,-25008,-21174,-25024,-21155,-25040,-21135,-25057,-21116,-25073,-21097,-25089,-21078,-25105,-21058,-25121,-21039,-25137,-21020,-25153,-21001,-25170,-20981,-25186,-20962,-25202,-20943,-25218,-20923,-25234,-20904,-25250,-20885,-25266,-20865,-25282,-20846,-25298,-20826,-25314,-20807,-25330,-20788,-25346,-20768,-25362,-20749,-25377,-20729,-25393,-20710,-25409,-20690,-25425,-20671,-25441,-20651,-25457,-20632,-25473,-20612,-25488,-20593,-25504,-20573,-25520,-20554,-25536,-20534,-25551,-20514,-25567,-20495,-25583,-20475,-25599,-20456,-25614,-20436,-25630,-20416,-25646,-20397,-25661,-20377,-25677,-20357,-25692,-20338,-25708,-20318,-25724,-20298,-25739,-20278,-25755,-20259,-25770,-20239,-25786,-20219,-25801,-20199,-25817,-20180,-25832,-20160,-25848,-20140,-25863,-20120,-25879,-20100,-25894,-20080,-25909,-20061,-25925,-20041,-25940,-20021,-25955,-20001,-25971,-19981,-25986,-19961,-26001,-19941,-26017,-19921,-26032,-19901,-26047,-19881,-26062,-19861,-26078,-19841,-26093,-19821,-26108,-19801,-26123,-19781,-26138,-19761,-26154,-19741,-26169,-19721,-26184,-19701,-26199,-19681,-26214,-19661,-26229,-19641,-26244,-19621,-26259,-19600,-26274,-19580,-26289,-19560,-26304,-19540,-26319,-19520,-26334,-19500,-26349,-19479,-26364,-19459,-26379,-19439,-26394,-19419,-26409,-19398,-26424,-19378,-26438,-19358,-26453,-19338,-26468,-19317,-26483,-19297,-26498,-19277,-26513,-19256,-26527,-19236,-26542,-19216,-26557,-19195,-26571,-19175,-26586,-19155,-26601,-19134,-26616,-19114,-26630,-19093,-26645,-19073,-26659,-19052,-26674,-19032,-26689,-19012,-26703,-18991,-26718,-18971,-26732,-18950,-26747,-18930,-26761,-18909,-26776,-18889,-26790,-18868,-26805,-18847,-26819,-18827,-26834,-18806,-26848,-18786,-26862,-18765,-26877,-18745,-26891,-18724,-26906,-18703,-26920,-18683,-26934,-18662,-26949,-18641,-26963,-18621,-26977,-18600,-26991,-18579,-27006,-18559,-27020,-18538,-27034,-18517,-27048,-18496,-27062,-18476,-27077,-18455,-27091,-18434,-27105,-18413,-27119,-18393,-27133,-18372,-27147,-18351,-27161,-18330,-27175,-18309,-27189,-18288,-27203,-18268,-27217,-18247,-27231,-18226,-27245,-18205,-27259,-18184,-27273,-18163,-27287,-18142,-27301,-18121,-27315,-18100,-27329,-18079,-27343,-18058,-27356,-18037,-27370,-18016,-27384,-17995,-27398,-17974,-27412,-17953,-27425,-17932,-27439,-17911,-27453,-17890,-27467,-17869,-27480,-17848,-27494,-17827,-27508,-17806,-27521,-17785,-27535,-17764,-27549,-17743,-27562,-17721,-27576,-17700,-27589,-17679,-27603,-17658,-27616,-17637,-27630,-17616,-27643,-17594,-27657,-17573,-27670,-17552,-27684,-17531,-27697,-17510,-27711,-17488,-27724,-17467,-27737,-17446,-27751,-17424,-27764,-17403,-27778,-17382,-27791,-17361,-27804,-17339,-27817,-17318,-27831,-17297,-27844,-17275,-27857,-17254,-27870,-17233,-27884,-17211,-27897,-17190,-27910,-17168,-27923,-17147,-27936,-17125,-27949,-17104,-27963,-17083,-27976,-17061,-27989,-17040,-28002,-17018,-28015,-16997,-28028,-16975,-28041,-16954,-28054,-16932,-28067,-16911,-28080,-16889,-28093,-16868,-28106,-16846,-28119,-16825,-28132,-16803,-28144,-16781,-28157,-16760,-28170,-16738,-28183,-16717,-28196,-16695,-28209,-16673,-28221,-16652,-28234,-16630,-28247,-16608,-28260,-16587,-28272,-16565,-28285,-16543,-28298,-16522,-28310,-16500,-28323,-16478,-28336,-16456,-28348,-16435,-28361,-16413,-28373,-16391,-28386,-16369,-28398,-16348,-28411,-16326,-28424,-16304,-28436,-16282,-28448,-16261,-28461,-16239,-28473,-16217,-28486,-16195,-28498,-16173,-28511,-16151,-28523,-16129,-28535,-16108,-28548,-16086,-28560,-16064,-28572,-16042,-28585,-16020,-28597,-15998,-28609,-15976,-28621,-15954,-28634,-15932,-28646,-15910,-28658,-15888,-28670,-15866,-28682,-15844,-28695,-15822,-28707,-15800,-28719,-15778,-28731,-15756,-28743,-15734,-28755,-15712,-28767,-15690,-28779,-15668,-28791,-15646,-28803,-15624,-28815,-15602,-28827,-15580,-28839,-15557,-28851,-15535,-28863,-15513,-28875,-15491,-28887,-15469,-28898,-15447,-28910,-15425,-28922,-15402,-28934,-15380,-28946,-15358,-28957,-15336,-28969,-15314,-28981,-15291,-28993,-15269,-29004,-15247,-29016,-15225,-29028,-15202,-29039,-15180,-29051,-15158,-29063,-15136,-29074,-15113,-29086,-15091,-29097,-15069,-29109,-15046,-29120,-15024,-29132,-15002,-29143,-14979,-29155,-14957,-29166,-14935,-29178,-14912,-29189,-14890,-29201,-14867,-29212,-14845,-29223,-14823,-29235,-14800,-29246,-14778,-29257,-14755,-29269,-14733,-29280,-14710,-29291,-14688,-29303,-14666,-29314,-14643,-29325,-14621,-29336,-14598,-29347,-14576,-29359,-14553,-29370,-14531,-29381,-14508,-29392,-14485,-29403,-14463,-29414,-14440,-29425,-14418,-29436,-14395,-29447,-14373,-29458,-14350,-29469,-14327,-29480,-14305,-29491,-14282,-29502,-14260,-29513,-14237,-29524,-14214,-29535,-14192,-29546,-14169,-29557,-14146,-29568,-14124,-29578,-14101,-29589,-14078,-29600,-14056,-29611,-14033,-29622,-14010,-29632,-13987,-29643,-13965,-29654,-13942,-29664,-13919,-29675,-13896,-29686,-13874,-29696,-13851,-29707,-13828,-29718,-13805,-29728,-13783,-29739,-13760,-29749,-13737,-29760,-13714,-29770,-13691,-29781,-13668,-29791,-13646,-29802,-13623,-29812,-13600,-29823,-13577,-29833,-13554,-29843,-13531,-29854,-13508,-29864,-13486,-29874,-13463,-29885,-13440,-29895,-13417,-29905,-13394,-29916,-13371,-29926,-13348,-29936,-13325,-29946,-13302,-29956,-13279,-29967,-13256,-29977,-13233,-29987,-13210,-29997,-13187,-30007,-13164,-30017,-13141,-30027,-13118,-30037,-13095,-30047,-13072,-30057,-13049,-30067,-13026,-30077,-13003,-30087,-12980,-30097,-12957,-30107,-12934,-30117,-12910,-30127,-12887,-30137,-12864,-30147,-12841,-30157,-12818,-30166,-12795,-30176,-12772,-30186,-12749,-30196,-12725,-30206,-12702,-30215,-12679,-30225,-12656,-30235,-12633,-30244,-12610,-30254,-12586,-30264,-12563,-30273,-12540,-30283,-12517,-30292,-12493,-30302,-12470,-30312,-12447,-30321,-12424,-30331,-12400,-30340,-12377,-30350,-12354,-30359,-12331,-30369,-12307,-30378,-12284,-30387,-12261,-30397,-12237,-30406,-12214,-30416,-12191,-30425,-12167,-30434,-12144,-30443,-12121,-30453,-12097,-30462,-12074,-30471,-12051,-30481,-12027,-30490,-12004,-30499,-11981,-30508,-11957,-30517,-11934,-30526,-11910,-30536,-11887,-30545,-11863,-30554,-11840,-30563,-11817,-30572,-11793,-30581,-11770,-30590,-11746,-30599,-11723,-30608,-11699,-30617,-11676,-30626,-11652,-30635,-11629,-30644,-11605,-30653,-11582,-30661,-11558,-30670,-11535,-30679,-11511,-30688,-11488,-30697,-11464,-30706,-11441,-30714,-11417,-30723,-11394,-30732,-11370,-30740,-11346,-30749,-11323,-30758,-11299,-30767,-11276,-30775,-11252,-30784,-11228,-30792,-11205,-30801,-11181,-30810,-11158,-30818,-11134,-30827,-11110,-30835,-11087,-30844,-11063,-30852,-11039,-30861,-11016,-30869,-10992,-30877,-10968,-30886,-10945,-30894,-10921,-30903,-10897,-30911,-10874,-30919,-10850,-30928,-10826,-30936,-10802,-30944,-10779,-30952,-10755,-30961,-10731,-30969,-10707,-30977,-10684,-30985,-10660,-30993,-10636,-31002,-10612,-31010,-10589,-31018,-10565,-31026,-10541,-31034,-10517,-31042,-10493,-31050,-10470,-31058,-10446,-31066,-10422,-31074,-10398,-31082,-10374,-31090,-10350,-31098,-10327,-31106,-10303,-31114,-10279,-31122,-10255,-31129,-10231,-31137,-10207,-31145,-10183,-31153,-10160,-31161,-10136,-31168,-10112,-31176,-10088,-31184,-10064,-31192,-10040,-31199,-10016,-31207,-9992,-31215,-9968,-31222,-9944,-31230,-9920,-31237,-9896,-31245,-9872,-31253,-9848,-31260,-9824,-31268,-9800,-31275,-9776,-31283,-9752,-31290,-9728,-31298,-9704,-31305,-9680,-31312,-9656,-31320,-9632,-31327,-9608,-31335,-9584,-31342,-9560,-31349,-9536,-31357,-9512,-31364,-9488,-31371,-9464,-31378,-9440,-31386,-9416,-31393,-9392,-31400,-9368,-31407,-9344,-31414,-9320,-31421,-9296,-31429,-9271,-31436,-9247,-31443,-9223,-31450,-9199,-31457,-9175,-31464,-9151,-31471,-9127,-31478,-9103,-31485,-9078,-31492,-9054,-31499,-9030,-31506,-9006,-31513,-8982,-31519,-8958,-31526,-8933,-31533,-8909,-31540,-8885,-31547,-8861,-31554,-8837,-31560,-8813,-31567,-8788,-31574,-8764,-31581,-8740,-31587,-8716,-31594,-8691,-31601,-8667,-31607,-8643,-31614,-8619,-31620,-8594,-31627,-8570,-31634,-8546,-31640,-8522,-31647,-8497,-31653,-8473,-31660,-8449,-31666,-8425,-31673,-8400,-31679,-8376,-31685,-8352,-31692,-8327,-31698,-8303,-31705,-8279,-31711,-8254,-31717,-8230,-31724,-8206,-31730,-8181,-31736,-8157,-31742,-8133,-31749,-8108,-31755,-8084,-31761,-8060,-31767,-8035,-31773,-8011,-31779,-7987,-31786,-7962,-31792,-7938,-31798,-7913,-31804,-7889,-31810,-7865,-31816,-7840,-31822,-7816,-31828,-7791,-31834,-7767,-31840,-7743,-31846,-7718,-31852,-7694,-31857,-7669,-31863,-7645,-31869,-7620,-31875,-7596,-31881,-7572,-31887,-7547,-31892,-7523,-31898,-7498,-31904,-7474,-31910,-7449,-31915,-7425,-31921,-7400,-31927,-7376,-31932,-7351,-31938,-7327,-31944,-7302,-31949,-7278,-31955,-7253,-31960,-7229,-31966,-7204,-31971,-7180,-31977,-7155,-31982,-7131,-31988,-7106,-31993,-7082,-31999,-7057,-32004,-7033,-32009,-7008,-32015,-6983,-32020,-6959,-32025,-6934,-32031,-6910,-32036,-6885,-32041,-6861,-32047,-6836,-32052,-6812,-32057,-6787,-32062,-6762,-32067,-6738,-32073,-6713,-32078,-6689,-32083,-6664,-32088,-6639,-32093,-6615,-32098,-6590,-32103,-6565,-32108,-6541,-32113,-6516,-32118,-6492,-32123,-6467,-32128,-6442,-32133,-6418,-32138,-6393,-32143,-6368,-32148,-6344,-32153,-6319,-32157,-6294,-32162,-6270,-32167,-6245,-32172,-6220,-32177,-6196,-32181,-6171,-32186,-6146,-32191,-6122,-32195,-6097,-32200,-6072,-32205,-6048,-32209,-6023,-32214,-5998,-32219,-5973,-32223,-5949,-32228,-5924,-32232,-5899,-32237,-5875,-32241,-5850,-32246,-5825,-32250,-5800,-32255,-5776,-32259,-5751,-32263,-5726,-32268,-5701,-32272,-5677,-32276,-5652,-32281,-5627,-32285,-5602,-32289,-5578,-32294,-5553,-32298,-5528,-32302,-5503,-32306,-5479,-32311,-5454,-32315,-5429,-32319,-5404,-32323,-5379,-32327,-5355,-32331,-5330,-32335,-5305,-32339,-5280,-32343,-5255,-32347,-5231,-32351,-5206,-32355,-5181,-32359,-5156,-32363,-5131,-32367,-5107,-32371,-5082,-32375,-5057,-32379,-5032,-32383,-5007,-32387,-4982,-32390,-4958,-32394,-4933,-32398,-4908,-32402,-4883,-32405,-4858,-32409,-4833,-32413,-4808,-32417,-4784,-32420,-4759,-32424,-4734,-32427,-4709,-32431,-4684,-32435,-4659,-32438,-4634,-32442,-4609,-32445,-4585,-32449,-4560,-32452,-4535,-32456,-4510,-32459,-4485,-32463,-4460,-32466,-4435,-32469,-4410,-32473,-4385,-32476,-4360,-32479,-4336,-32483,-4311,-32486,-4286,-32489,-4261,-32493,-4236,-32496,-4211,-32499,-4186,-32502,-4161,-32505,-4136,-32509,-4111,-32512,-4086,-32515,-4061,-32518,-4036,-32521,-4012,-32524,-3987,-32527,-3962,-32530,-3937,-32533,-3912,-32536,-3887,-32539,-3862,-32542,-3837,-32545,-3812,-32548,-3787,-32551,-3762,-32554,-3737,-32557,-3712,-32559,-3687,-32562,-3662,-32565,-3637,-32568,-3612,-32571,-3587,-32573,-3562,-32576,-3537,-32579,-3512,-32581,-3487,-32584,-3462,-32587,-3437,-32589,-3412,-32592,-3387,-32595,-3362,-32597,-3337,-32600,-3312,-32602,-3287,-32605,-3262,-32607,-3237,-32610,-3212,-32612,-3187,-32615,-3162,-32617,-3137,-32619,-3112,-32622,-3087,-32624,-3062,-32626,-3037,-32629,-3012,-32631,-2987,-32633,-2962,-32636,-2937,-32638,-2912,-32640,-2887,-32642,-2862,-32645,-2837,-32647,-2812,-32649,-2787,-32651,-2762,-32653,-2737,-32655,-2712,-32657,-2687,-32659,-2662,-32661,-2637,-32663,-2611,-32665,-2586,-32667,-2561,-32669,-2536,-32671,-2511,-32673,-2486,-32675,-2461,-32677,-2436,-32679,-2411,-32681,-2386,-32682,-2361,-32684,-2336,-32686,-2311,-32688,-2286,-32689,-2261,-32691,-2236,-32693,-2210,-32695,-2185,-32696,-2160,-32698,-2135,-32700,-2110,-32701,-2085,-32703,-2060,-32704,-2035,-32706,-2010,-32707,-1985,-32709,-1960,-32710,-1935,-32712,-1909,-32713,-1884,-32715,-1859,-32716,-1834,-32718,-1809,-32719,-1784,-32720,-1759,-32722,-1734,-32723,-1709,-32724,-1684,-32726,-1659,-32727,-1633,-32728,-1608,-32729,-1583,-32730,-1558,-32732,-1533,-32733,-1508,-32734,-1483,-32735,-1458,-32736,-1433,-32737,-1407,-32738,-1382,-32739,-1357,-32740,-1332,-32741,-1307,-32742,-1282,-32743,-1257,-32744,-1232,-32745,-1207,-32746,-1181,-32747,-1156,-32748,-1131,-32749,-1106,-32750,-1081,-32751,-1056,-32751,-1031,-32752,-1006,-32753,-981,-32754,-955,-32754,-930,-32755,-905,-32756,-880,-32756,-855,-32757,-830,-32758,-805,-32758,-780,-32759,-754,-32759,-729,-32760,-704,-32760,-679,-32761,-654,-32761,-629,-32762,-604,-32762,-579,-32763,-553,-32763,-528,-32764,-503,-32764,-478,-32764,-453,-32765,-428,-32765,-403,-32765,-377,-32766,-352,-32766,-327,-32766,-302,-32766,-277,-32767,-252,-32767,-227,-32767,-202,-32767,-176,-32767,-151,-32767,-126,-32767,-101,-32767,-76,-32767,-51,-32767,-26}; diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h index bb08d5122dd68033f1c7871a37faabd4a1355a68..8a7c853df55d10fbd148d94077683eabfd873a39 100644 --- a/openair1/PHY/defs_L1_NB_IoT.h +++ b/openair1/PHY/defs_L1_NB_IoT.h @@ -52,7 +52,7 @@ # include "COMMON/ral_messages_types.h" # include "UTIL/queue.h" # endif -# include "log.h" +# include "common/utils/LOG/log.h" # define msg(aRGS...) LOG_D(PHY, ##aRGS) # else # define msg printf diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h index f079794a34afa069d83032b6f0e20a00353d50e4..55f8c9639ab281316a25784b62f45811c69d9203 100644 --- a/openair1/PHY/defs_UE.h +++ b/openair1/PHY/defs_UE.h @@ -93,7 +93,7 @@ # include "COMMON/ral_messages_types.h" # include "UTIL/queue.h" # endif -# include "log.h" +# include "common/utils/LOG/log.h" # define msg(aRGS...) LOG_D(PHY, ##aRGS) # else # define msg printf diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index df3c1e449770221d919851dcd63080b8fbcdf43b..c58fffe0ef2ebe8fa890dbac762dcd4e9bb2a56f 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -194,11 +194,11 @@ typedef struct RU_proc_t_s { pthread_cond_t cond_synch; /// condition variable for asynch RX/TX thread pthread_cond_t cond_asynch_rxtx; - /// condition varible for RU RX FEP thread + /// condition variable for RU RX FEP thread pthread_cond_t cond_fep; - /// condition varible for RU TX FEP thread + /// condition variable for RU TX FEP thread pthread_cond_t cond_feptx; - /// condition varible for emulated RF + /// condition variable for emulated RF pthread_cond_t cond_emulateRF; /// condition variable for eNB signal pthread_cond_t cond_eNBs; @@ -260,6 +260,7 @@ typedef struct RU_proc_t_s { /// pipeline ready state int ru_rx_ready; int ru_tx_ready; + int emulate_rf_busy; } RU_proc_t; typedef enum { diff --git a/openair1/SCHED/fapi_l1.c b/openair1/SCHED/fapi_l1.c index 8840d065ecef45ec85e575d2dd5cd1b20c564b50..ad72c3d9f5f6a2cf8a17933135b63a0399b62985 100644 --- a/openair1/SCHED/fapi_l1.c +++ b/openair1/SCHED/fapi_l1.c @@ -668,7 +668,6 @@ void schedule_response(Sched_Rsp_t *Sched_INFO) AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id); - eNB = RC.eNB[Mod_id][CC_id]; fp = &eNB->frame_parms; proc = &eNB->proc.proc_rxtx[0]; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c43b3775db4980a9544f3b0493c08e5d253ce01e..e2a28118ffc39de7aa088346aef01f37585d18b1 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -347,7 +347,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB, dlsch_harq->rvidx, dlsch_harq->round); } -#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_TX_MESSAGE( MSC_PHY_ENB,MSC_PHY_UE, NULL,0, @@ -368,7 +368,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB, pmi2hex_2Ar1(dlsch_harq->pmi_alloc), dlsch_harq->rvidx, dlsch_harq->round); -#endif + if (ue_stats) ue_stats->dlsch_sliding_cnt++; @@ -412,7 +412,6 @@ void pdsch_procedures(PHY_VARS_eNB *eNB, &eNB->dlsch_turbo_encoding_wakeup_stats1, &eNB->dlsch_interleaving_stats); stop_meas(&eNB->dlsch_encoding_stats); - //////////////////////////////////////////////////******************************************* if(eNB->dlsch_encoding_stats.diff_now>500*3000 && opp_enabled == 1) { print_meas_now(&eNB->dlsch_encoding_stats,"total coding",stderr); @@ -1376,7 +1375,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) ulsch->harq_mask &= ~(1 << harq_pid); ulsch_harq->round = 0; } -#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_RX_DISCARDED_MESSAGE( MSC_PHY_ENB,MSC_PHY_UE, NULL,0, @@ -1385,7 +1384,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) ulsch->rnti,harq_pid, ulsch_harq->round-1 ); -#endif + /* Mark the HARQ process to release it later if max transmission reached * (see below). @@ -1404,7 +1403,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) T(T_ENB_PHY_ULSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(ulsch->rnti), T_INT(harq_pid)); -#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_RX_MESSAGE( MSC_PHY_ENB,MSC_PHY_UE, NULL,0, @@ -1412,7 +1411,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) frame,subframe, ulsch->rnti,harq_pid ); -#endif + #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH @@ -1501,7 +1500,7 @@ void init_te_thread(PHY_VARS_eNB *eNB) { pthread_cond_init( &proc->tep[i].cond_te, NULL); pthread_attr_init( &proc->tep[i].attr_te); - printf("Creating te_thread 0\n"); + LOG_I(PHY,"Creating te_thread %d\n",i); pthread_create(&proc->tep[i].pthread_te, &proc->tep[i].attr_te, te_thread, (void*)&proc->tep[i]); } } @@ -1605,6 +1604,16 @@ static void do_release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,ui dlsch1_harq = dlsch1->harq_processes[harq_pid]; AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); +#if T_TRACER + if (after_rounds != -1) { + T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(dlsch0->rnti), T_INT(harq_pid)); + } else { + T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(dlsch0->rnti), T_INT(harq_pid)); + } +#endif + if (dlsch0_harq->round >= after_rounds) { dlsch0_harq->status = SCH_IDLE; /*if ((dlsch1_harq == NULL)|| @@ -1632,6 +1641,15 @@ static void do_release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,ui dlsch1_harq = dlsch1->harq_processes[harq_pid]; AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); +#if T_TRACER + if (after_rounds != -1) { + T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(dlsch0->rnti), T_INT(harq_pid)); + } else { + T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(dlsch0->rnti), T_INT(harq_pid)); + } +#endif if (dlsch0_harq->round >= after_rounds) { dlsch0_harq->status = SCH_IDLE; if ((dlsch1_harq == NULL)|| @@ -1754,22 +1772,6 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq, pdu->harq_indication_fdd_rel13.harq_tb_n[i] = 2-ulsch_harq->o_ACK[i]; // release DLSCH if needed release_harq(eNB,UE_id,i,frame,subframe,0xffff, ulsch_harq->o_ACK[i] == 1); - - -#if T_TRACER - /* TODO: get correct harq pid */ - { - int subframe_tx = (subframe+6)%10; - int frame_tx = subframe_tx >= 6 ? (frame+1023)%1024 : frame; - if (ulsch_harq->o_ACK[i] != 1) { - T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[frame_tx%2][subframe_tx])); - } else { - T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[frame_tx%2][subframe_tx])); - } - } -#endif } } else { // TDD @@ -1858,21 +1860,6 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB, pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; // release DLSCH if needed release_harq(eNB,UE_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - - -#if T_TRACER - { - int subframe_tx = (subframe+6)%10; - int frame_tx = subframe_tx >= 6 ? (frame+1023)%1024 : frame; - if (harq_ack[0] != 1) { - T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(uci->rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[frame_tx%2][subframe_tx])); - } else { - T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), - T_INT(uci->rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[frame_tx%2][subframe_tx])); - } - } -#endif } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; @@ -2042,16 +2029,15 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; - - if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; - - T(T_ENB_PHY_UL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe)); - /* TODO: use correct rxdata */ T(T_ENB_PHY_INPUT_SIGNAL, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(0), T_BUFFER(&eNB->RU_list[0]->common.rxdata[0][subframe*eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti * 4)); + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; + + T(T_ENB_PHY_UL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index a35922cfed31c6c74510ba7aebaecf4be96a86f4..6272650f72b56b8af9b6cdf78af68603e85e9351 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -150,6 +150,7 @@ static void *feptx_thread(void *param) { while (!oai_exit) { if (wait_on_condition(&proc->mutex_feptx,&proc->cond_feptx,&proc->instance_cnt_feptx,"feptx thread")<0) break; + if (oai_exit) break; //stop_meas(&ru->ofdm_mod_wakeup_stats); feptx0(ru,1); if (release_thread(&proc->mutex_feptx,&proc->instance_cnt_feptx,"feptx thread")<0) break; @@ -247,7 +248,6 @@ void feptx_ofdm(RU_t *ru) { // int CC_id = ru->proc.CC_id; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); - slot_offset_F = 0; slot_offset = subframe*fp->samples_per_tti; @@ -455,6 +455,7 @@ static void *fep_thread(void *param) { while (!oai_exit) { if (wait_on_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + if (oai_exit) break; //stop_meas(&ru->ofdm_demod_wakeup_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX1, 1 ); fep0(ru,0); @@ -504,6 +505,33 @@ void init_fep_thread(RU_t *ru,pthread_attr_t *attr_fep) { } + +extern void kill_fep_thread(RU_t *ru) +{ + RU_proc_t *proc = &ru->proc; + pthread_mutex_lock( &proc->mutex_fep ); + proc->instance_cnt_fep = 0; + pthread_cond_signal(&proc->cond_fep); + pthread_mutex_unlock( &proc->mutex_fep ); + LOG_D(PHY, "Joining pthread_fep\n"); + pthread_join(proc->pthread_fep, NULL); + pthread_mutex_destroy( &proc->mutex_fep ); + pthread_cond_destroy( &proc->cond_fep ); +} + +extern void kill_feptx_thread(RU_t *ru) +{ + RU_proc_t *proc = &ru->proc; + pthread_mutex_lock( &proc->mutex_feptx ); + proc->instance_cnt_feptx = 0; + pthread_cond_signal(&proc->cond_feptx); + pthread_mutex_unlock( &proc->mutex_feptx ); + LOG_D(PHY, "Joining pthread_feptx\n"); + pthread_join(proc->pthread_feptx, NULL); + pthread_mutex_destroy( &proc->mutex_feptx ); + pthread_cond_destroy( &proc->cond_feptx ); +} + void ru_fep_full_2thread(RU_t *ru) { RU_proc_t *proc = &ru->proc; diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c index ed258ed47c6f0ab6875d15582d5b8879c4b29395..b7d05ba006204fd9cde6456d3e5085353dee8a9a 100644 --- a/openair1/SCHED_UE/phy_procedures_lte_ue.c +++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c @@ -99,77 +99,77 @@ void get_dumpparam(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id, uint8_t void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { -LOG_M_BEGIN(DEBUG_UE_PHYPROC) - unsigned int coded_bits_per_codeword; - uint8_t nsymb ; - - get_dumpparam(ue, proc, eNB_id, - ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb , - ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - subframe, - ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Qm, - ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, - ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], - &nsymb, &coded_bits_per_codeword); - - LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); - LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates_ext[0],300*nsymb,1,1); - /* - LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); - */ - LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_comp0[0],300*12,1,1); - LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->llr[0],coded_bits_per_codeword,1,0); + if (LOG_DUMPFLAG(DEBUG_UE_PHYPROC)) { + unsigned int coded_bits_per_codeword; + uint8_t nsymb ; + + get_dumpparam(ue, proc, eNB_id, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb , + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + subframe, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Qm, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], + &nsymb, &coded_bits_per_codeword); + + LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); + LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + /* + LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); + */ + LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_comp0[0],300*12,1,1); + LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->llr[0],coded_bits_per_codeword,1,0); - LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_mag0,300*12,1,1); - LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_magb0,300*12,1,1); -LOG_M_END + LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_mag0,300*12,1,1); + LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_magb0,300*12,1,1); + } } void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { -LOG_M_BEGIN(DEBUG_UE_PHYPROC) - unsigned int coded_bits_per_codeword; - uint8_t nsymb; - - get_dumpparam(ue, proc, eNB_id, - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, - subframe,2,1,0, - &nsymb, &coded_bits_per_codeword); - - LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - ue->Mod_id, - ue->frame_parms.ofdm_symbol_size, - nsymb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, - coded_bits_per_codeword); - - LOG_M("rxsig0.m","rxs0", &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); - - LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_SI[0]->dl_ch_estimates_ext[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); - /* - LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); - */ - LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_SI[0]->rxdataF_comp0[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); - LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); - - LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); - LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); - sleep(1); - exit(-1); -LOG_M_END + if (LOG_DUMPFLAG(DEBUG_UE_PHYPROC)){ + unsigned int coded_bits_per_codeword; + uint8_t nsymb; + + get_dumpparam(ue, proc, eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + subframe,2,1,0, + &nsymb, &coded_bits_per_codeword); + + LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", + ue->Mod_id, + ue->frame_parms.ofdm_symbol_size, + nsymb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, + coded_bits_per_codeword); + + LOG_M("rxsig0.m","rxs0", &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); + + LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_SI[0]->dl_ch_estimates_ext[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); + /* + LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); + */ + LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_SI[0]->rxdataF_comp0[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); + LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); + + LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); + LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); + sleep(1); + exit(-1); + } } #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) @@ -234,40 +234,40 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb void dump_dlsch_ra(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { -LOG_M_BEGIN(DEBUG_UE_PHYPROC) - unsigned int coded_bits_per_codeword; - uint8_t nsymb ; - - - get_dumpparam(ue, proc, eNB_id, - ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, - subframe,2,1,0, - &nsymb, &coded_bits_per_codeword); - - LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - ue->Mod_id, - ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, - ue->dlsch_ra[eNB_id]->harq_processes[0]->mcs, - ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, - ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, - coded_bits_per_codeword); - - LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); - LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_ra[0]->rxdataF_ext[0],2*12*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); - /* - LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); - */ - LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); - LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); + if (LOG_DUMPFLAG(DEBUG_UE_PHYPROC)){ + unsigned int coded_bits_per_codeword; + uint8_t nsymb ; + + + get_dumpparam(ue, proc, eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + subframe,2,1,0, + &nsymb, &coded_bits_per_codeword); + + LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", + ue->Mod_id, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, + coded_bits_per_codeword); + + LOG_M("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); + LOG_M("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_ra[0]->rxdataF_ext[0],2*12*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + /* + LOG_M("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + LOG_M("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + LOG_M("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + LOG_M("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); + */ + LOG_M("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); + LOG_M("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); - LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); - LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); -LOG_M_END + LOG_M("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); + LOG_M("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); + } } void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index) @@ -362,11 +362,11 @@ void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t ti ue->timing_advance = timing_advance*4; -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { /* TODO: fix this log, what is 'HW timing advance'? */ /*LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance);*/ - LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); -LOG_DEBUG_END + LOG_UI(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); + } } @@ -740,17 +740,17 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue, } else { bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { - if (bundling_flag==bundling) { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); - } else { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, - ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + if (bundling_flag==bundling) { + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + } else { + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + } } -LOG_DEBUG_END switch (frame_parms->tdd_config) { case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL @@ -1226,9 +1226,9 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_IN); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ofdm_mod_stats); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ofdm_mod_stats); + } nsymb = (frame_parms->Ncp == 0) ? 14 : 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case @@ -1345,9 +1345,9 @@ LOG_DEBUG_END } //nb_antennas_tx -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ofdm_mod_stats); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ofdm_mod_stats); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_OUT); @@ -1634,30 +1634,30 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - if(ue->ulsch[eNB_id]->o_ACK[0]) - { - LOG_I(PHY,"PUSCH ACK\n"); - T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), - T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); - } - else - { - LOG_I(PHY,"PUSCH NACK\n"); - T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), - T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); - } - LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH\n", - Mod_id, - ue->ulsch[eNB_id]->rnti, - frame_tx%1024,subframe_tx, - ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], - ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + if(ue->ulsch[eNB_id]->o_ACK[0]) + { + LOG_I(PHY,"PUSCH ACK\n"); + T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } + else + { + LOG_I(PHY,"PUSCH NACK\n"); + T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } + LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH\n", + Mod_id, + ue->ulsch[eNB_id]->rnti, + frame_tx%1024,subframe_tx, + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); } + } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)){ LOG_D(PHY, "[UE %d][PUSCH %d] AbsSubframe %d.%d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, " "cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d, ack_status_cw0 %d ack_status_cw1 %d bundling %d, Nbundled %d, CQI %d, RI %d\n", @@ -1679,7 +1679,7 @@ LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) ue->ulsch[eNB_id]->bundling, Nbundled, cqi_status, ri_status); -LOG_DEBUG_END + } @@ -1701,9 +1701,9 @@ LOG_DEBUG_END ue->prach_resources[eNB_id]->Msg3[6], ue->prach_resources[eNB_id]->Msg3[7], ue->prach_resources[eNB_id]->Msg3[8]); -LOG_DEBUG_BEGIN(UE_TIMING) + if ( LOG_DEBUGFLAG(UE_TIMING)) { start_meas(&ue->ulsch_encoding_stats); -LOG_DEBUG_END + } AssertFatal(ulsch_encoding(ue->prach_resources[eNB_id]->Msg3, ue, @@ -1713,11 +1713,11 @@ LOG_DEBUG_END ue->transmission_mode[eNB_id],0,0)==0, "ulsch_coding.c: FATAL ERROR: returning\n"); -LOG_DEBUG_BEGIN(UE_TIMING) + if ( LOG_DEBUGFLAG(UE_TIMING)) { stop_meas(&ue->phy_proc_tx); LOG_UI(PHY,"------FULL TX PROC : %5.2f ------\n",ue->phy_proc_tx.p_time/(cpuf*1000.0)); stop_meas(&ue->ulsch_encoding_stats); -LOG_DEBUG_END + } if (ue->mac_enabled == 1) { @@ -1752,26 +1752,25 @@ LOG_DEBUG_END -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d) (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); for (i=0; i<ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) LOG_T(PHY,"%x.",ulsch_input_buffer[i]); LOG_T(PHY,"\n"); -LOG_DEBUG_END } - else { + } else { unsigned int taus(void); for (i=0; i<input_buffer_length; i++) ulsch_input_buffer[i]= (uint8_t)(taus()&0xff); - } + } -LOG_DEBUG_BEGIN(UE_TIMING) + if ( LOG_DEBUGFLAG(UE_TIMING)) { start_meas(&ue->ulsch_encoding_stats); -LOG_DEBUG_END + } if (abstraction_flag==0) { if (ulsch_encoding(ulsch_input_buffer, @@ -1783,16 +1782,16 @@ LOG_DEBUG_END Nbundled)!=0) { LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->phy_proc_tx); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->phy_proc_tx); + } return; } } -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ulsch_encoding_stats); -LOG_DEBUG_END + if(LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ulsch_encoding_stats); + } } if (abstraction_flag == 0) { @@ -1817,13 +1816,13 @@ LOG_DEBUG_END T(T_UE_PHY_PUSCH_TX_POWER, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), T_INT(tx_amp),T_INT(ue->ulsch[eNB_id]->f_pusch),T_INT(get_PL(Mod_id,0,eNB_id)),T_INT(nb_rb)); -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][PUSCH %d] AbsSubFrame %d.%d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", - Mod_id,harq_pid,frame_tx%1024,subframe_tx,ue->tx_power_dBm[subframe_tx],ue->tx_power_max_dBm, tx_amp); -LOG_DEBUG_END -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ulsch_modulation_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][PUSCH %d] AbsSubFrame %d.%d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", + Mod_id,harq_pid,frame_tx%1024,subframe_tx,ue->tx_power_dBm[subframe_tx],ue->tx_power_max_dBm, tx_amp); + } + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ulsch_modulation_stats); + } ulsch_modulation(ue->common_vars.txdataF, tx_amp, frame_tx, @@ -1840,9 +1839,9 @@ LOG_DEBUG_END nb_rb, aa); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ulsch_modulation_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ulsch_modulation_stats); + } } @@ -2219,18 +2218,18 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - if(pucch_payload[0]) - { - T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), - T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + if(pucch_payload[0]) + { + T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } + else + { + T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } } - else - { - T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), - T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); - } -LOG_DEBUG_END generate_pucch1x(ue->common_vars.txdataF, &ue->frame_parms, @@ -2268,15 +2267,15 @@ LOG_DEBUG_END #endif T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), T_INT(tx_amp),T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), Po_PUCCH %d, isShortenPucch %d, amp %d\n", - Mod_id, - ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, - frame_tx%1024, subframe_tx, - Po_PUCCH, - isShortenPucch, - tx_amp); -LOG_DEBUG_END + if( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), Po_PUCCH %d, isShortenPucch %d, amp %d\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx, + Po_PUCCH, + isShortenPucch, + tx_amp); + } generate_pucch2x(ue->common_vars.txdataF, &ue->frame_parms, ue->ncs_cell, @@ -2354,9 +2353,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui ue->generate_ul_signal[eNB_id] = 0; -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->phy_proc_tx); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->phy_proc_tx); + } ue->tx_power_dBm[subframe_tx]=-127; @@ -2449,9 +2448,9 @@ LOG_DEBUG_END LOG_D(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->phy_proc_tx); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->phy_proc_tx); + } } void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag) @@ -2516,7 +2515,7 @@ void ue_measurement_procedures( T_INT((int)ue->common_vars.freq_offset)); } - if (l==(6-ue->frame_parms.Ncp)) { + if (( (slot%2) == 0) && (l==(6-ue->frame_parms.Ncp))) { // make sure we have signal from PSS/SSS for N0 measurement // LOG_I(PHY," l==(6-ue->frame_parms.Ncp) ue_rrc_measurements\n"); @@ -2617,7 +2616,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin dummy[0] = ue->pbch_vars[eNB_id]->decoded_output[2]; dummy[1] = ue->pbch_vars[eNB_id]->decoded_output[1]; dummy[2] = ue->pbch_vars[eNB_id]->decoded_output[0]; - trace_pdu(1, dummy, 3, ue->Mod_id, 0, 0, + trace_pdu( DIRECTION_DOWNLINK, dummy, WS_C_RNTI, ue->Mod_id, 0, 0, frame_rx, subframe_rx, 0, 0); LOG_D(OPT,"[UE %d][PBCH] Frame %d trace pdu for PBCH\n", ue->Mod_id, subframe_rx); @@ -2693,40 +2692,36 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { - LOG_UI(PHY,"[UE %d] frame %d, subframe %d, Received PBCH (MIB): nb_antenna_ports_eNB %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", - ue->Mod_id, - frame_rx, - subframe_rx, - ue->frame_parms.nb_antenna_ports_eNB, - pbch_tx_ant, - frame_tx, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - ue->frame_parms.phich_config_common.phich_resource); -LOG_DEBUG_END + LOG_UI(PHY,"[UE %d] frame %d, subframe %d, Received PBCH (MIB): nb_antenna_ports_eNB %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", + ue->Mod_id, + frame_rx, + subframe_rx, + ue->frame_parms.nb_antenna_ports_eNB, + pbch_tx_ant, + frame_tx, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + ue->frame_parms.phich_config_common.phich_resource); + } } else { - /* - LOG_E(PHY,"[UE %d] frame %d, subframe %d, Error decoding PBCH!\n", - ue->Mod_id,frame_rx, subframe_rx); - - LOG_I(PHY,"[UE %d] rx_offset %d\n",ue->Mod_id,ue->rx_offset); + if (LOG_DUMPFLAG(DEBUG_UE_PHYPROC)) { + LOG_E(PHY,"[UE %d] frame %d, subframe %d, Error decoding PBCH!\n", + ue->Mod_id,frame_rx, subframe_rx); + LOG_I(PHY,"[UE %d] rx_offset %d\n",ue->Mod_id,ue->rx_offset); - LOG_M("rxsig0.m","rxs0", ue->common_vars.rxdata[0],ue->frame_parms.samples_per_tti,1,1); - LOG_M("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); - LOG_M("H10.m","h10",&(ue->common_vars.dl_ch_estimates[0][2][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); + LOG_M("rxsig0.m","rxs0", ue->common_vars.rxdata[0],ue->frame_parms.samples_per_tti,1,1); - LOG_M("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],8*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("PBCH_rxF0_ext.m","pbch0_ext",ue->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); - LOG_M("PBCH_rxF0_comp.m","pbch0_comp",ue->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); - LOG_M("PBCH_rxF_llr.m","pbch_llr",ue->pbch_vars[0]->llr,(ue->frame_parms.Ncp==0) ? 1920 : 1728,1,4); - exit(-1); - */ + LOG_M("PBCH_rxF0_ext.m","pbch0_ext",ue->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); + LOG_M("PBCH_rxF0_comp.m","pbch0_comp",ue->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); + LOG_M("PBCH_rxF_llr.m","pbch_llr",ue->pbch_vars[0]->llr,(ue->frame_parms.Ncp==0) ? 1920 : 1728,1,4); + exit(-1); + } ue->pbch_vars[eNB_id]->pdu_errors_conseq++; ue->pbch_vars[eNB_id]->pdu_errors++; @@ -2742,12 +2737,12 @@ LOG_DEBUG_END ue->pbch_vars[eNB_id]->pdu_errors_last = ue->pbch_vars[eNB_id]->pdu_errors; } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_UI(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n", - ue->Mod_id,frame_rx, subframe_rx, - ue->pbch_vars[eNB_id]->pdu_errors, - ue->pbch_vars[eNB_id]->pdu_errors_conseq); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_UI(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n", + ue->Mod_id,frame_rx, subframe_rx, + ue->pbch_vars[eNB_id]->pdu_errors, + ue->pbch_vars[eNB_id]->pdu_errors_conseq); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); } @@ -2767,9 +2762,9 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint LOG_D(PHY,"DCI Decoding procedure in %d.%d\n",frame_rx,subframe_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_IN); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_rx_pdcch_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->dlsch_rx_pdcch_stats); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); rx_pdcch(ue, @@ -2896,17 +2891,17 @@ LOG_DEBUG_END ue->dlsch_received[eNB_id]++; -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); - dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); - LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active); + } // we received a CRNTI, so we're in PUSCH if (ue->UE_mode[eNB_id] != PUSCH) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[subframe_rx&1][eNB_id]->crnti); -LOG_DEBUG_END + } //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); ue->UE_mode[eNB_id] = PUSCH; @@ -2921,9 +2916,9 @@ LOG_DEBUG_END ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); + } if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, @@ -2952,9 +2947,9 @@ LOG_DEBUG_END else if ((dci_alloc_rx[i].rnti == P_RNTI) && ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); + } if (generate_ue_dlsch_params_from_dci(frame_rx, @@ -2982,18 +2977,18 @@ LOG_DEBUG_END else if ((ue->prach_resources[eNB_id]) && (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && - (dci_alloc_rx[i].format == format1A)) { + ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); + } if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, - (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, + (void *)&dci_alloc_rx[i].dci_pdu, ue->prach_resources[eNB_id]->ra_RNTI, - format1A, + dci_alloc_rx[i].format, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id], ue->pdsch_vars_ra[eNB_id], &ue->dlsch_ra[eNB_id], @@ -3005,20 +3000,20 @@ LOG_DEBUG_END ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], 0)==0) { - ue->dlsch_ra_received[eNB_id]++; + ue->dlsch_ra_received[eNB_id]++; -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", - ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", + ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); + } } } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti) && (dci_alloc_rx[i].format == format0)) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n", + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + } ue->ulsch_no_allocation_counter[eNB_id] = 0; //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); @@ -3036,42 +3031,41 @@ LOG_DEBUG_END CBA_RNTI, eNB_id, 0)==0)) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { - LOG_USEDINLOG_VAR(int8_t,harq_pid) = subframe2harq_pid(&ue->frame_parms, - pdcch_alloc2ul_frame(&ue->frame_parms,proc->frame_rx,proc->subframe_rx), - pdcch_alloc2ul_subframe(&ue->frame_parms,proc->subframe_rx)); - T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx), - T_INT(dci_alloc_rx[i].rnti), - T_INT(harq_pid), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb), - T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS)); - - LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); -LOG_DEBUG_END - + LOG_USEDINLOG_VAR(int8_t,harq_pid) = subframe2harq_pid(&ue->frame_parms, + pdcch_alloc2ul_frame(&ue->frame_parms,proc->frame_rx,proc->subframe_rx), + pdcch_alloc2ul_subframe(&ue->frame_parms,proc->subframe_rx)); + T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx), + T_INT(dci_alloc_rx[i].rnti), + T_INT(harq_pid), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS)); + + LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); + } } } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) && (dci_alloc_rx[i].format == format0)) { // UE could belong to more than one CBA group // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups] -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n", - ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n", + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); /* if (((frame_rx%100) == 0) || (frame_rx < 20)) dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ -LOG_DEBUG_END + } ue->ulsch_no_allocation_counter[eNB_id] = 0; //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); if ((ue->UE_mode[eNB_id] > PRACH) && - (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, + (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, ue->ulsch[eNB_id]->cba_rnti[0], subframe_rx, format0, @@ -3084,28 +3078,28 @@ LOG_DEBUG_END eNB_id, 0)==0)) { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); -LOG_DEBUG_END - ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); + } + ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; } } else { -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, - ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, - ue->ulsch[eNB_id]->cba_rnti[0], + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, + ue->ulsch[eNB_id]->cba_rnti[0], dci_alloc_rx[i].format); // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); -LOG_DEBUG_END + } } } -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_rx_pdcch_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_rx_pdcch_stats); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(0); } @@ -3128,7 +3122,7 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs // LOG_D(PHY,"ue calling pmch subframe ..\n "); LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation\n", - ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx); + ue->Mod_id,frame_rx,subframe_rx); #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0)) pmch_mcs = ue_query_mch(ue->Mod_id, @@ -3147,9 +3141,7 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,frame_rx,subframe_rx,pmch_mcs); fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0); - for (l=2; l<12; l++) { - slot_fep_mbsfn(ue, l, subframe_rx, @@ -3164,6 +3156,8 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs } + ue->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(pmch_mcs); + ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms, ue->dlsch_MCH[0]->harq_processes[0]->nb_rb, ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, @@ -3177,7 +3171,14 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0], ue->dlsch_MCH[0]->harq_processes[0]->G, ue->pdsch_vars_MCH[0]->llr[0],0,subframe_rx<<1); - + + LOG_D(PHY,"start turbo decode for MCH %d.%d --> nb_rb %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->nb_rb); + LOG_D(PHY,"start turbo decode for MCH %d.%d --> rb_alloc_even %x \n", frame_rx, subframe_rx, (unsigned int)((intptr_t)ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even)); + LOG_D(PHY,"start turbo decode for MCH %d.%d --> Qm %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->Qm); + LOG_D(PHY,"start turbo decode for MCH %d.%d --> Nl %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->Nl); + LOG_D(PHY,"start turbo decode for MCH %d.%d --> G %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->harq_processes[0]->G); + LOG_D(PHY,"start turbo decode for MCH %d.%d --> Kmimo %d \n", frame_rx, subframe_rx, ue->dlsch_MCH[0]->Kmimo); + ret = dlsch_decoding(ue, ue->pdsch_vars_MCH[0]->llr[0], &ue->frame_parms, @@ -3206,15 +3207,16 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, ue->dlsch_MCH[0]->max_turbo_iterations, ue->dlsch_MCH[0]->harq_processes[0]->G); - dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) + // dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); + + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { - for (int i=0; i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { - LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); - } + for (int i=0; i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { + LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); + } - LOG_T(PHY,"\n"); -LOG_DEBUG_END + LOG_T(PHY,"\n"); + } // if (subframe_rx==9) @@ -3222,25 +3224,24 @@ LOG_DEBUG_END } else { // decoding successful #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0)) - if (mcch_active == 1) { - ue_send_mch_sdu(ue->Mod_id, - CC_id, - frame_rx, - ue->dlsch_MCH[0]->harq_processes[0]->b, - ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, - eNB_id,// not relevant in eMBMS context - sync_area); + ue_send_mch_sdu(ue->Mod_id, + CC_id, + frame_rx, + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + eNB_id,// not relevant in eMBMS context + sync_area); + + if (mcch_active == 1) ue->dlsch_mcch_received[sync_area][0]++; - - - if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { - ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; - } else { - ue->dlsch_mch_received[0]+=1; - ue->dlsch_mch_received_sf[subframe_rx][0]=1; - } - - + else + ue->dlsch_mtch_received[sync_area][0]++; + + if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { + ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; + } else { + ue->dlsch_mch_received[0]+=1; + ue->dlsch_mch_received_sf[subframe_rx][0]=1; } #endif // #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0)) @@ -3345,12 +3346,12 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC else first_symbol_flag = 0; -LOG_DEBUG_BEGIN(UE_TIMING) - uint8_t slot = 0; - if(m >= ue->frame_parms.symbols_per_tti>>1) + if (LOG_DEBUGFLAG(UE_TIMING)) { + uint8_t slot = 0; + if(m >= ue->frame_parms.symbols_per_tti>>1) slot = 1; - start_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); -LOG_DEBUG_END + start_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); + } // process DLSCH received in first slot rx_pdsch(ue, pdsch, @@ -3363,13 +3364,13 @@ LOG_DEBUG_END dual_stream_UE, i_mod, dlsch0->current_harq_pid); -LOG_DEBUG_BEGIN(UE_TIMING) - uint8_t slot = 0; - if(m >= ue->frame_parms.symbols_per_tti>>1) - slot = 1; - stop_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); - LOG_UI(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + uint8_t slot = 0; + if(m >= ue->frame_parms.symbols_per_tti>>1) + slot = 1; + stop_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); + LOG_UI(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot].p_time/(cpuf*1000.0)); + } @@ -3564,9 +3565,9 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, frame_rx, subframe_rx, ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_unscrambling_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->dlsch_unscrambling_stats); + } dlsch_unscrambling(&ue->frame_parms, 0, dlsch0, @@ -3574,9 +3575,9 @@ LOG_DEBUG_END pdsch_vars->llr[0], 0, subframe_rx<<1); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_unscrambling_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_unscrambling_stats); + } LOG_D(PHY," ------ start turbo decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, subframe_rx, harq_pid); LOG_D(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb); @@ -3587,9 +3588,9 @@ LOG_DEBUG_END LOG_D(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->Kmimo); LOG_D(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, subframe_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); + } ret = dlsch_decoding(ue, pdsch_vars->llr[0], &ue->frame_parms, @@ -3601,14 +3602,14 @@ LOG_DEBUG_END pdsch==PDSCH?1:0, dlsch0->harq_processes[harq_pid]->TBS>256?1:0); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, " --> Unscrambling for CW0 %5.3f\n", - (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - LOG_UI(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", - frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, " --> Unscrambling for CW0 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + LOG_UI(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); -LOG_DEBUG_END + } if(is_cw1_active) { // start turbo decode for CW 1 @@ -3621,9 +3622,9 @@ LOG_DEBUG_END frame_rx, subframe_rx, ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_unscrambling_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->dlsch_unscrambling_stats); + } dlsch_unscrambling(&ue->frame_parms, 0, dlsch1, @@ -3631,9 +3632,9 @@ LOG_DEBUG_END pdsch_vars->llr[1], 1, subframe_rx<<1); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_unscrambling_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_unscrambling_stats); + } LOG_D(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb); LOG_D(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, subframe_rx, harq_pid, (uint16_t)((intptr_t)dlsch1->harq_processes[harq_pid]->rb_alloc_even)); @@ -3643,9 +3644,9 @@ LOG_DEBUG_END LOG_D(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->Kmimo); LOG_D(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, subframe_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); + } ret1 = dlsch_decoding(ue, pdsch_vars->llr[1], @@ -3658,13 +3659,13 @@ LOG_DEBUG_END pdsch==PDSCH?1:0, dlsch1->harq_processes[harq_pid]->TBS>256?1:0); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, " --> Unscrambling for CW1 %5.3f\n", - (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); - LOG_UI(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", - frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, " --> Unscrambling for CW1 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + LOG_UI(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); + } LOG_D(PHY,"AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); @@ -3703,15 +3704,15 @@ LOG_DEBUG_END dlsch0->harq_processes[harq_pid]->TBS); } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - int j; - LOG_D(PHY,"dlsch harq_pid %d (rx): \n",dlsch0->current_harq_pid); + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)){ + int j; + LOG_D(PHY,"dlsch harq_pid %d (rx): \n",dlsch0->current_harq_pid); - for (j=0; j<dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",dlsch0->harq_processes[dlsch0->current_harq_pid]->b[j]); + for (j=0; j<dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",dlsch0->harq_processes[dlsch0->current_harq_pid]->b[j]); - LOG_T(PHY,"\n"); -LOG_DEBUG_END + LOG_T(PHY,"\n"); + } if (ue->mac_enabled == 1) { @@ -3804,26 +3805,26 @@ LOG_DEBUG_END } } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - ue->Mod_id, - dlsch0->rnti,harq_pid, - frame_rx,subframe_rx,ret, - dlsch0->harq_processes[harq_pid]->mcs, - dlsch0->harq_processes[harq_pid]->rvidx, - dlsch0->harq_processes[harq_pid]->TBS); - - if (frame_rx%100==0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - ue->Mod_id,dlsch0->rnti, - frame_rx,subframe_rx, - ue->dlsch_errors[eNB_id], - ue->dlsch_received[eNB_id], - ue->dlsch_fer[eNB_id], - ue->measurements.wideband_cqi_tot[eNB_id]); - } + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", + ue->Mod_id, + dlsch0->rnti,harq_pid, + frame_rx,subframe_rx,ret, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->TBS); + + if (frame_rx%100==0) { + LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", + ue->Mod_id,dlsch0->rnti, + frame_rx,subframe_rx, + ue->dlsch_errors[eNB_id], + ue->dlsch_received[eNB_id], + ue->dlsch_fer[eNB_id], + ue->measurements.wideband_cqi_tot[eNB_id]); + } -LOG_DEBUG_END + } /*LOG_DEBUGFLAG(DEBUG_UE_PHYPROC) */ } @@ -3909,9 +3910,9 @@ void *UE_thread_slot1_dl_processing(void *arg) { } /**** Slot1 FE Processing ****/ -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); + } // I- start dl slot1 processing // do first symbol of next downlink subframe for channel estimation /* @@ -3936,9 +3937,9 @@ LOG_DEBUG_END { //if( (l != pilot0) && (l != pilot1)) { -LOG_DEBUG_BEGIN(UE_TIMING) + if (LOG_DEBUGFLAG(UE_TIMING)) { start_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,l); front_end_fft(ue, @@ -3947,9 +3948,9 @@ LOG_DEBUG_END 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ofdm_demod_stats); + } } } // for l=1..l2 @@ -4002,11 +4003,10 @@ LOG_DEBUG_END //printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); - LOG_UI(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); - -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); + LOG_UI(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); + } //wait until pdcch is decoded @@ -4025,9 +4025,9 @@ LOG_DEBUG_END //printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); + } // start slave thread for Pdsch Procedure (slot1) // do procedures for C-RNTI uint8_t eNB_id = 0; @@ -4097,10 +4097,10 @@ LOG_DEBUG_END proc->llr_slot1_available=1; //printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); - LOG_UI(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); + LOG_UI(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); + } if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) { @@ -4144,14 +4144,14 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr // start timers -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); + } -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); - start_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); + } pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0; @@ -4170,16 +4170,16 @@ LOG_DEBUG_END ue->dlsch_ra[eNB_id]->active = 0; } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", - ue->Mod_id,frame_rx, subframe_rx); -LOG_DEBUG_END + if ( LOG_DEBUG_FLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", + ue->Mod_id,frame_rx, subframe_rx); + } if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only - l2 = 5; + l2 = 4; } else if (pmch_flag == 1) { // do first 2 symbols only l2 = 1; } else { // normal subframe, last symbol to be processed is the first of the second slot @@ -4247,9 +4247,9 @@ LOG_DEBUG_END /**** Slot0 FE Processing ****/ // I- start main thread for FFT/ChanEst symbol: 0/1 --> 7 -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); + } // 1- perform FFT for pilot ofdm symbols first (ofdmSym7 ofdmSym4 or (ofdmSym6 ofdmSym3)) //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,pilot0); front_end_fft(ue, @@ -4282,9 +4282,9 @@ LOG_DEBUG_END if( (l != pilot0) && (l != pilot1)) { //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,l); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ofdm_demod_stats); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); front_end_fft(ue, l, @@ -4292,9 +4292,9 @@ LOG_DEBUG_END 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ofdm_demod_stats); + } } } // for l=1..l2 @@ -4313,32 +4313,32 @@ LOG_DEBUG_END } if (do_pdcch_flag) { -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); + } if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) + if (LOG_DEBUGFLAG(UE_TIMING)) { LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + } //proc->dci_slot0_available = 1; return(-1); } //proc->dci_slot0_available=1; -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + } } //printf("num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); - LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); + LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); + } //wait until slot1 FE is done uint32_t wait = 0; @@ -4348,10 +4348,10 @@ LOG_DEBUG_END wait++; } -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "[AbsSFN %d.%d] FULL FE Processing %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "[AbsSFN %d.%d] FULL FE Processing %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); + } /**** End Subframe FE Processing ****/ @@ -4365,13 +4365,13 @@ LOG_DEBUG_END //printf("AbsSubframe %d.%d Pdsch Procedure (slot0)\n",frame_rx%1024,subframe_rx); //printf("AbsSubframe %d.%d Pdsch Procedure PDSCH Active %d \n",frame_rx%1024,subframe_rx, ue->dlsch[ue->current_thread_id[subframe_rx]][0][0]->active); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + } -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); + } if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); ue_pdsch_procedures(ue, @@ -4437,10 +4437,10 @@ LOG_DEBUG_END //printf("Set available dci slot0 to 1 AbsSubframe %d.%d \n",frame_rx%1024,subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); - LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)){ + stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); + LOG_UI(PHY, "[AbsSFN %d.%d] Slot0: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); + } //wait until LLR Slot1 is done @@ -4453,16 +4453,16 @@ LOG_DEBUG_END -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "[AbsSFN %d.%d] Full LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)){ + stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "[AbsSFN %d.%d] Full LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + } //=====================================================================// -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)){ + start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + } LOG_D(PHY,"==> Start Turbo Decoder active dlsch %d SI %d RA %d \n",ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active, ue->dlsch_SI[eNB_id]->active, @@ -4524,10 +4524,10 @@ LOG_DEBUG_END ue->dlsch_ra[eNB_id]->active = 0; } -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING) + stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + } // duplicate harq structure uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid; @@ -4587,10 +4587,10 @@ LOG_DEBUG_END VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) + if (LOG_DEBUGFLAG(UE_TIMING)){ stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); LOG_UI(PHY, "------FULL RX PROC [AbsSFN %d.%d]: %5.2f ------\n",frame_rx,subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + } LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); return (0); @@ -4626,14 +4626,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id, // start timers -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); + } -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); - start_meas(&ue->generic_stat); -LOG_DEBUG_END + if(LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->generic_stat); + } pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0; @@ -4652,10 +4652,10 @@ LOG_DEBUG_END ue->dlsch_ra[eNB_id]->active = 0; } -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", - ue->Mod_id,frame_rx, subframe_rx); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", + ue->Mod_id,frame_rx, subframe_rx); + } if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; @@ -4665,7 +4665,7 @@ LOG_DEBUG_END if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only - l2 = 5; + l2 = 4; } else if (pmch_flag == 1) { // do first 2 symbols only l2 = 1; } else { // normal subframe, last symbol to be processed is the first of the second slot @@ -4689,9 +4689,9 @@ LOG_DEBUG_END LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); for (; l<=l2; l++) { if (abstraction_flag == 0) { -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->ofdm_demod_stats); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); slot_fep(ue, l, @@ -4700,16 +4700,16 @@ LOG_DEBUG_END 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ofdm_demod_stats); + } } ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode); if (do_pdcch_flag) { if ((l==pilot1) || - ((pmch_flag==1)&(l==l2))) { + ((pmch_flag==1)&&(l==l2))) { LOG_D(PHY,"[UE %d] Frame %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,eNB_id); //start_meas(&ue->rx_pdcch_stats[ue->current_thread_id[subframe_rx]]); @@ -4729,9 +4729,22 @@ LOG_DEBUG_END ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode); LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); - // If this is PMCH, call procedures and return + + // If this is PMCH, call procedures, do channel estimation for first symbol of next DL subframe and return if (pmch_flag == 1) { ue_pmch_procedures(ue,proc,eNB_id,abstraction_flag); + + int next_subframe_rx = (1+subframe_rx)%10; + if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL) + { + slot_fep(ue, + 0, + (next_subframe_rx<<1), + 0, + 0, + 0); + } + return 0; } @@ -4743,16 +4756,16 @@ LOG_DEBUG_END 0); // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->generic_stat); - LOG_UI(PHY, "[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->generic_stat); + LOG_UI(PHY, "[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); + } LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->generic_stat); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->generic_stat); + } // do procedures for C-RNTI if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); @@ -4822,9 +4835,9 @@ LOG_DEBUG_END if (subframe_select(&ue->frame_parms,subframe_rx) != SF_S) { // do front-end processing for second slot, and first symbol of next subframe for (l=1; l<ue->frame_parms.symbols_per_tti>>1; l++) { if (abstraction_flag == 0) { -LOG_DEBUG_BEGIN(UE_TIMING) + if (LOG_DEBUGFLAG(UE_TIMING)) { start_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); slot_fep(ue, l, @@ -4833,14 +4846,15 @@ LOG_DEBUG_END 0, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->ofdm_demod_stats); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->ofdm_demod_stats); + } } ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(subframe_rx<<1),abstraction_flag,mode); } // for l=1..l2 + ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(subframe_rx<<1),abstraction_flag,mode); // do first symbol of next downlink subframe for channel estimation int next_subframe_rx = (1+subframe_rx)%10; @@ -4854,10 +4868,10 @@ LOG_DEBUG_END 0); } } // not an S-subframe -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->generic_stat); - LOG_UI(PHY, "[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if(LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->generic_stat); + LOG_UI(PHY, "[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); + } LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); @@ -4872,9 +4886,9 @@ LOG_DEBUG_END LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + } ue_pdsch_procedures(ue, proc, eNB_id, @@ -4886,10 +4900,10 @@ LOG_DEBUG_END abstraction_flag); LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); - start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + } ue_dlsch_procedures(ue, proc, eNB_id, @@ -4899,38 +4913,38 @@ LOG_DEBUG_END &ue->dlsch_errors[eNB_id], mode, abstraction_flag); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); - LOG_UI(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + LOG_UI(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); } -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->generic_stat); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->generic_stat); + } -LOG_M_BEGIN(DEBUG_UE_PHYPROC) - if(subframe_rx==5 && ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid]->nb_rb > 20){ - //LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0); - //LOG_M("llr.m","llr", &ue->pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); + if (LOG_DUMPFLAG(DEBUG_UE_PHYPROC)) { + if(subframe_rx==5 && ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid]->nb_rb > 20){ + //LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0); + //LOG_M("llr.m","llr", &ue->pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); - LOG_M("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); - //LOG_M("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + //LOG_M("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); - //LOG_M("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + //LOG_M("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[0][0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); - LOG_M("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_estimates_ext[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); - LOG_M("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->rxdataF_comp0[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); - //LOG_M("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_mag0[0][0],14*frame_parms->N_RB_DL*12,1,1); - //LOG_M("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_magb0[0][0],14*frame_parms->N_RB_DL*12,1,1); + LOG_M("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[0][0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + LOG_M("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_estimates_ext[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); + LOG_M("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->rxdataF_comp0[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); + //LOG_M("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_mag0[0][0],14*frame_parms->N_RB_DL*12,1,1); + //LOG_M("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_magb0[0][0],14*frame_parms->N_RB_DL*12,1,1); - AssertFatal (0,""); + AssertFatal (0,""); + } } -LOG_M_END // do procedures for SI-RNTI if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { @@ -5035,25 +5049,25 @@ LOG_M_END ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); -LOG_DEBUG_BEGIN(DEBUG_UE_PHYPROC) - if ((frame_rx % 100 == 0)) { - LOG_I(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[eNB_id]/1000.0, frame_rx); + if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)) { + if ((frame_rx % 100 == 0)) { + LOG_UI(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[eNB_id]/1000.0, frame_rx); + } } -LOG_DEBUG_END } -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->generic_stat); - printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->generic_stat); + LOG_UI(PHY,"after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0)); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); - LOG_UI(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING) ) { + stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); + LOG_UI(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + } LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); return (0); @@ -5083,9 +5097,9 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,u VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1); -LOG_DEBUG_BEGIN(UE_TIMING) - start_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if ( LOG_DEBUGFLAG(UE_TIMING)) { + start_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); + } #if defined(ENABLE_ITTI) @@ -5168,9 +5182,9 @@ LOG_DEBUG_END } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); -LOG_DEBUG_BEGIN(UE_TIMING) - stop_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(UE_TIMING)) { + stop_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); + } } // slot } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index e0ad8b41f3c83689edeca7d010789b7aa1b897e6..a03ce34bcae135d452b54c53a7e5dbb79bf39049 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -67,6 +67,7 @@ #include "common/config/config_load_configmodule.h" #include "PHY/INIT/phy_init.h" + void feptx_ofdm(RU_t *ru); void feptx_prec(RU_t *ru); @@ -83,6 +84,8 @@ int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ int codingw = 0; +int emulate_rf = 0; + void handler(int sig) { void *array[10]; @@ -520,7 +523,7 @@ int main(int argc, char **argv) int c; int k,i,j,aa; int re; - + int loglvl=OAILOG_DEBUG; int s,Kr,Kr_bytes; @@ -998,7 +1001,7 @@ int main(int argc, char **argv) break; case 'L': - set_glog(atoi(optarg)); + loglvl = atoi(optarg); break; case 'h': @@ -1046,7 +1049,7 @@ int main(int argc, char **argv) "cannot load configuration module, exiting\n"); logInit(); // enable these lines if you need debug info - set_glog(LOG_DEBUG); + set_glog(loglvl); // moreover you need to init itti with the following line // however itti will catch all signals, so ctrl-c won't work anymore // alternatively you can disable ITTI completely in CMakeLists.txt @@ -2043,24 +2046,9 @@ int main(int argc, char **argv) qsort (table_rx, time_vector_rx.size, sizeof(double), &compare); if (dump_table == 1 ) { - set_component_filelog(USIM); // file located in /tmp/usim.txt - int n; - LOG_F(USIM,"The transmitter raw data: \n"); - - for (n=0; n< time_vector_tx.size; n++) { - printf("%f ", table_tx[n]); - LOG_F(USIM,"%f ", table_tx[n]); - } - - LOG_F(USIM,"\n"); - LOG_F(USIM,"The receiver raw data: \n"); - - for (n=0; n< time_vector_rx.size; n++) { - // printf("%f ", table_rx[n]); - LOG_F(USIM,"%f ", table_rx[n]); - } - - LOG_F(USIM,"\n"); + set_component_filelog(SIM); // file located in /tmp/usim.txt + LOG_UDUMPMSG(SIM,table_tx,time_vector_tx.size,LOG_DUMP_DOUBLE,"The transmitter raw data: \n"); + LOG_UDUMPMSG(SIM,table_rx,time_vector_rx.size,LOG_DUMP_DOUBLE,"Thereceiver raw data: \n"); } double tx_median = table_tx[time_vector_tx.size/2]; diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c index 0c942df275f7ce5b8dab0d1b1f2cba0c42066a33..2176e272c8a5483c3e4ed8b2b046ba8e21ee375d 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c @@ -5016,24 +5016,11 @@ int main(int argc, char **argv) if (dump_table == 1 ) { set_component_filelog(USIM); // file located in /tmp/usim.txt - int n; - LOG_F(USIM,"The transmitter raw data: \n"); + LOG_UDUMPMSG(RRC,(char *)table_tx,time_vector_tx.size,LOG_DUMP_DOUBLE, + "The transmitter raw data: \n"); + LOG_UDUMPMSG(RRC,(char *)table_rx,time_vector_rx.size,LOG_DUMP_DOUBLE, + "The receiver raw data: \n"); - for (n=0; n< time_vector_tx.size; n++) { - printf("%f ", table_tx[n]); - LOG_F(USIM,"%f ", table_tx[n]); - } - - LOG_F(USIM,"\n"); - LOG_F(USIM,"The receiver raw data: \n"); - - for (n=0; n< time_vector_rx.size; n++) { - // printf("%f ", table_rx[n]); - LOG_F(USIM,"%f ", table_rx[n]); - } - - LOG_F(USIM,"\n"); - } double tx_median = table_tx[time_vector_tx.size/2]; double tx_q1 = table_tx[time_vector_tx.size/4]; diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c index b41dd5536c360c073c7ec8c0cc576333b8adbeb7..570c13c0b64f0abec0a817b1cfc1223583fffb61 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c @@ -3851,24 +3851,9 @@ PMI_FEEDBACK: qsort (table_rx, time_vector_rx.size, sizeof(double), &compare); if (dump_table == 1 ) { - set_component_filelog(USIM); // file located in /tmp/usim.txt - int n; - LOG_F(USIM,"The transmitter raw data: \n"); - - for (n=0; n< time_vector_tx.size; n++) { - printf("%f ", table_tx[n]); - LOG_F(USIM,"%f ", table_tx[n]); - } - - LOG_F(USIM,"\n"); - LOG_F(USIM,"The receiver raw data: \n"); - - for (n=0; n< time_vector_rx.size; n++) { - // printf("%f ", table_rx[n]); - LOG_F(USIM,"%f ", table_rx[n]); - } - - LOG_F(USIM,"\n"); + set_component_filelog(SIM); // file located in /tmp/usim.txt + LOG_UDUMPMSG(SIM,table_tx,time_vector_tx.size,LOG_DUMP_DOUBLE,"The transmitter raw data: \n"); + LOG_UDUMPMSG(SIM,table_rx,time_vector_rx.size,LOG_DUMP_DOUBLE,"The receiver raw data: \n"); } double tx_median = table_tx[time_vector_tx.size/2]; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index ab7a29b096c0a292583b43d8e0a97f56b7e48021..3fcb01068548a1c2fab305b50385174ada689737 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -1491,24 +1491,9 @@ int main(int argc, char **argv) qsort (table_rx, time_vector_rx.size, sizeof(double), &compare); if (dump_table == 1 ) { - int n; set_component_filelog(SIM); // file located in /tmp/usim.txt - LOG_F(SIM,"The transmitter raw data: \n"); - - for (n=0; n< time_vector_tx.size; n++) { - // printf("%f ", table_tx[n]); - LOG_F(SIM,"%f ", table_tx[n]); - } - - LOG_F(SIM,"\n"); - LOG_F(SIM,"The receiver raw data: \n"); - - for (n=0; n< time_vector_rx.size; n++) { - // printf("%f ", table_rx[n]); - LOG_F(SIM,"%f ", table_rx[n]); - } - - LOG_F(SIM,"\n"); + LOG_UDUMPMSG(SIM,table_tx,time_vector_tx.size,LOG_DUMP_DOUBLE,"The transmitter raw data: \n"); + LOG_UDUMPMSG(SIM,table_rx,time_vector_rx.size,LOG_DUMP_DOUBLE,"The receiver raw data: \n"); } double tx_median = table_tx[time_vector_tx.size/2]; diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index 4690bba42e5b91f4721d727b38d41da928e0c55a..36842c13d0cef7a55aa36739a0d3dcddd2fad348 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -19,3 +19,24 @@ * contact@openairinterface.org */ +/* eNB application layer -> X2AP messages */ +/* ITTI LOG messages */ +/* ENCODER */ +MESSAGE_DEF(X2AP_RESET_REQUST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , x2ap_reset_request_log) +MESSAGE_DEF(X2AP_RESOURCE_STATUS_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , x2ap_resource_status_response_log) +MESSAGE_DEF(X2AP_RESOURCE_STATUS_FAILURE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , x2ap_resource_status_failure_log) + +/* Messages for X2AP logging */ +MESSAGE_DEF(X2AP_SETUP_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , x2ap_setup_request_log) + + +/* eNB application layer -> X2AP messages */ +MESSAGE_DEF(X2AP_REGISTER_ENB_REQ , MESSAGE_PRIORITY_MED, x2ap_register_enb_req_t , x2ap_register_enb_req) + +/* X2AP -> eNB application layer messages */ +MESSAGE_DEF(X2AP_REGISTER_ENB_CNF , MESSAGE_PRIORITY_MED, x2ap_register_enb_cnf_t , x2ap_register_enb_cnf) +MESSAGE_DEF(X2AP_DEREGISTERED_ENB_IND , MESSAGE_PRIORITY_MED, x2ap_deregistered_enb_ind_t , x2ap_deregistered_enb_ind) + +/* handover messages X2AP <-> RRC */ +MESSAGE_DEF(X2AP_HANDOVER_REQ , MESSAGE_PRIORITY_MED, x2ap_handover_req_t , x2ap_handover_req) +MESSAGE_DEF(X2AP_HANDOVER_REQ_ACK , MESSAGE_PRIORITY_MED, x2ap_handover_req_ack_t , x2ap_handover_req_ack) diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index 4690bba42e5b91f4721d727b38d41da928e0c55a..6c4031b981df42869d76abbe210bb88289a27115 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -19,3 +19,158 @@ * contact@openairinterface.org */ +#ifndef X2AP_MESSAGES_TYPES_H_ +#define X2AP_MESSAGES_TYPES_H_ + +#include "PhysCellId.h" + +//-------------------------------------------------------------------------------------------// +// Defines to access message fields. + +#define X2AP_REGISTER_ENB_REQ(mSGpTR) (mSGpTR)->ittiMsg.x2ap_register_enb_req +#define X2AP_HANDOVER_REQ(mSGpTR) (mSGpTR)->ittiMsg.x2ap_handover_req +#define X2AP_HANDOVER_REQ_ACK(mSGpTR) (mSGpTR)->ittiMsg.x2ap_handover_req_ack +#define X2AP_REGISTER_ENB_CNF(mSGpTR) (mSGpTR)->ittiMsg.x2ap_register_enb_cnf +#define X2AP_DEREGISTERED_ENB_IND(mSGpTR) (mSGpTR)->ittiMsg.x2ap_deregistered_enb_ind + + +#define X2AP_MAX_NB_ENB_IP_ADDRESS 2 + +// eNB application layer -> X2AP messages +typedef struct x2ap_register_enb_req_s { + /* Unique eNB_id to identify the eNB within EPC. + * For macro eNB ids this field should be 20 bits long. + * For home eNB ids this field should be 28 bits long. + */ + uint32_t eNB_id; + /* The type of the cell */ + enum cell_type_e cell_type; + + /* Optional name for the cell + * NOTE: the name can be NULL (i.e no name) and will be cropped to 150 + * characters. + */ + char *eNB_name; + + /* Tracking area code */ + uint16_t tac; + + /* Mobile Country Code + * Mobile Network Code + */ + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_digit_length; + + /* + * EARFCN + */ + uint16_t fdd_uL_EARFCN; + uint16_t fdd_dL_EARFCN; + uint16_t tdd_EARFCN; + + + uint16_t fdd_uL_Transmission_Bandwidth; + uint16_t fdd_dL_Transmission_Bandwidth; + uint16_t tdd_Transmission_Bandwidth; + + + /* The local eNB IP address to bind */ + net_ip_address_t enb_x2_ip_address; + + /* Nb of MME to connect to */ + uint8_t nb_x2; + + /* List of target eNB to connect to for X2*/ + net_ip_address_t target_enb_x2_ip_address[X2AP_MAX_NB_ENB_IP_ADDRESS]; + + /* Number of SCTP streams used for associations */ + uint16_t sctp_in_streams; + uint16_t sctp_out_streams; + + /* eNB port for X2C*/ + uint32_t enb_port_for_X2C; +} x2ap_register_enb_req_t; + +//-------------------------------------------------------------------------------------------// +// X2AP -> eNB application layer messages +typedef struct x2ap_register_enb_cnf_s { + /* Nb of connected eNBs*/ + uint8_t nb_x2; +} x2ap_register_enb_cnf_t; + +typedef struct x2ap_deregistered_enb_ind_s { + /* Nb of connected eNBs */ + uint8_t nb_x2; +} x2ap_deregistered_enb_ind_t; + +//-------------------------------------------------------------------------------------------// +// X2AP <-> RRC +typedef struct x2ap_gummei_s { + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_len; + uint8_t mme_code; + uint16_t mme_group_id; +} x2ap_gummei_t; + +typedef struct x2ap_lastvisitedcell_info_s { + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_len; + PhysCellId_t target_physCellId; + cell_type_t cell_type; + uint64_t time_UE_StayedInCell; +}x2ap_lastvisitedcell_info_t; + +//used for src +typedef struct x2ap_handover_req_s { + int source_rnti; /* TODO: to be fixed/remove */ + int source_x2id; /* TODO: to be fixed/remove */ + + unsigned old_eNB_ue_s1ap_id:24; + + PhysCellId_t target_physCellId; + + x2ap_gummei_t ue_gummei; + + /*UE-ContextInformation */ + + /* MME UE id */ + uint32_t mme_ue_s1ap_id; + + security_capabilities_t security_capabilities; + + uint8_t kenb[32]; // keNB or keNB* + + /*next_hop_chaining_coun */ + long int kenb_ncc; + + /* UE aggregate maximum bitrate */ + ambr_t ue_ambr; + + uint8_t nb_e_rabs_tobesetup; + + /* list of e_rab setup-ed by RRC layers */ + e_rab_setup_t e_rabs_tobesetup[S1AP_MAX_E_RAB]; + + /* ue_context_pP->ue_context.e_rab[i].param.sgw_addr; */ + + x2ap_lastvisitedcell_info_t lastvisitedcell_info; + + /* TODO: this parameter has to be removed */ + int target_mod_id; +} x2ap_handover_req_t; + +typedef struct x2ap_handover_req_ack_s { + int source_rnti; /* TODO: to be fixed/remove */ + int source_x2id; /* TODO: to be fixed/remove */ + /* TODO: this parameter has to be removed */ + int target_mod_id; + uint8_t rrc_buffer[1024 /* arbitrary, big enough */]; + int rrc_buffer_size; + + uint32_t mme_ue_s1ap_id; +} x2ap_handover_req_ack_t; + +#endif /* X2AP_MESSAGES_TYPES_H_ */ diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c index 0545eeb3be11e59522aebcafb3161b4aaa61e60a..549c7eaa2227e944a98747b6bcdd2f8a2ac73207 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c @@ -38,7 +38,7 @@ #include "liblfds700.h" -#include "log.h" +#include "common/utils/LOG/log.h" /*Flags showing if a mac agent has already been registered*/ unsigned int mac_agent_registered[NUM_MAX_ENB]; diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c index e5e242232ced64c83f8d021fd99c0a4c16aba3cb..b4bf0293731620731fc25ffb03268e3b17a1fcfc 100644 --- a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c +++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c @@ -31,7 +31,7 @@ #include "liblfds700.h" -#include "log.h" +#include "common/utils/LOG/log.h" /*Trigger boolean for RRC measurement*/ bool triggered_rrc = false; diff --git a/openair2/ENB_APP/NB_IoT_interface.c b/openair2/ENB_APP/NB_IoT_interface.c index c4884453c2e9cc03d62f5c4e454bd3a3dd3f57fb..7355233d71d766e033efac6efa2a1ab08e81aed3 100644 --- a/openair2/ENB_APP/NB_IoT_interface.c +++ b/openair2/ENB_APP/NB_IoT_interface.c @@ -43,7 +43,7 @@ int load_NB_IoT(void) { RCConfig_NbIoT_f_t RCConfig; loader_shlibfunc_t shlib_fdesc[]=NBIOT_INTERFACE_FLIST; - ret=load_module_shlib(NBIOT_MODULENAME,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t)); + ret=load_module_shlib(NBIOT_MODULENAME,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t),NULL); if (ret) { return ret; } diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 042d3fb395db6169913849d80cffbaa3f995629c..ad3f5fd6ed7d063f0ddb36a8cb7e5709d3ac216a 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -35,7 +35,7 @@ #include "assertions.h" #include "common/ran_context.h" -#include "log.h" +#include "common/utils/LOG/log.h" #if defined(ENABLE_ITTI) # include "intertask_interface.h" @@ -43,8 +43,14 @@ # include "s1ap_eNB.h" # include "sctp_eNB_task.h" # include "gtpv1u_eNB_task.h" +# else +# define EPC_MODE_ENABLED 0 # endif +//# include "x2ap_eNB.h" +# include "x2ap_messages_types.h" +# define X2AP_ENB_REGISTER_RETRY_DELAY 10 + #include "openair1/PHY/INIT/phy_init.h" extern unsigned char NB_eNB_INST; #endif @@ -134,6 +140,30 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end)//, # endif #endif +/*------------------------------------------------------------------------------*/ +static uint32_t eNB_app_register_x2(uint32_t enb_id_start, uint32_t enb_id_end) +{ + uint32_t enb_id; + MessageDef *msg_p; + uint32_t register_enb_x2_pending = 0; + + for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { + + { + + msg_p = itti_alloc_new_message (TASK_ENB_APP, X2AP_REGISTER_ENB_REQ); + + RCconfig_X2(msg_p, enb_id); + + //itti_send_msg_to_task (TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); + + register_enb_x2_pending++; + } + } + + return register_enb_x2_pending; +} + /*------------------------------------------------------------------------------*/ void *eNB_app_task(void *args_p) { @@ -142,10 +172,13 @@ void *eNB_app_task(void *args_p) uint32_t enb_id_start = 0; uint32_t enb_id_end = enb_id_start + enb_nb; # if defined(ENABLE_USE_MME) - uint32_t register_enb_pending; + uint32_t register_enb_pending=0; uint32_t registered_enb; long enb_register_retry_timer_id; # endif + uint32_t x2_register_enb_pending; + //uint32_t x2_registered_enb; + //long x2_enb_register_retry_timer_id; uint32_t enb_id; MessageDef *msg_p = NULL; instance_t instance; @@ -183,13 +216,17 @@ void *eNB_app_task(void *args_p) # if defined(ENABLE_USE_MME) /* Try to register each eNB */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); -# else + registered_enb = 0; + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); +#else /* Start L2L1 task */ - msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE); - itti_send_msg_to_task(TASK_L2L1, INSTANCE_DEFAULT, msg_p); -# endif + msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE); + itti_send_msg_to_task(TASK_L2L1, INSTANCE_DEFAULT, msg_p); +#endif + + /* Try to register each eNB with each other */ + // x2_registered_enb = 0; + x2_register_enb_pending = eNB_app_register_x2 (enb_id_start, enb_id_end); do { // Wait for a message @@ -207,66 +244,68 @@ void *eNB_app_task(void *args_p) LOG_I(ENB_APP, "Received %s\n", ITTI_MSG_NAME(msg_p)); break; -# if defined(ENABLE_USE_MME) - case S1AP_REGISTER_ENB_CNF: - LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), - S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); - - DevAssert(register_enb_pending > 0); - register_enb_pending--; - - /* Check if at least eNB is registered with one MME */ - if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { - registered_enb++; - } - - /* Check if all register eNB requests have been processed */ - if (register_enb_pending == 0) { - if (registered_enb == enb_nb) { - /* If all eNB are registered, start L2L1 task */ - MessageDef *msg_init_p; - - msg_init_p = itti_alloc_new_message (TASK_ENB_APP, INITIALIZE_MESSAGE); - itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p); - - } else { - LOG_W(ENB_APP, " %d eNB not associated with a MME, retrying registration in %d seconds ...\n", - enb_nb - registered_enb, ENB_REGISTER_RETRY_DELAY); - - /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ - if (timer_setup (ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &enb_register_retry_timer_id) < 0) { - LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); - - sleep(ENB_REGISTER_RETRY_DELAY); - /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); - } - } - } - +# if defined(ENABLE_USE_MME) + LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), + S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); + + DevAssert(register_enb_pending > 0); + register_enb_pending--; + + /* Check if at least eNB is registered with one MME */ + if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { + registered_enb++; + } + + /* Check if all register eNB requests have been processed */ + if (register_enb_pending == 0) { + if (registered_enb == enb_nb) { + /* If all eNB are registered, start L2L1 task */ + MessageDef *msg_init_p; + + msg_init_p = itti_alloc_new_message (TASK_ENB_APP, INITIALIZE_MESSAGE); + itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p); + + } else { + LOG_W(ENB_APP, " %d eNB not associated with a MME, retrying registration in %d seconds ...\n", + enb_nb - registered_enb, ENB_REGISTER_RETRY_DELAY); + + /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ + if (timer_setup (ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, + NULL, &enb_register_retry_timer_id) < 0) { + LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); + + sleep(ENB_REGISTER_RETRY_DELAY); + /* Restart the registration process */ + registered_enb = 0; + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); + } + } + } +#endif break; case S1AP_DEREGISTERED_ENB_IND: - LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), - S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme); + if (EPC_MODE_ENABLED) { + LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, ITTI_MSG_NAME (msg_p), + S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme); - /* TODO handle recovering of registration */ + /* TODO handle recovering of registration */ + } break; case TIMER_HAS_EXPIRED: - LOG_I(ENB_APP, " Received %s: timer_id %ld\n", ITTI_MSG_NAME (msg_p), TIMER_HAS_EXPIRED(msg_p).timer_id); - - if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { - /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); - } +# if defined(ENABLE_USE_MME) + LOG_I(ENB_APP, " Received %s: timer_id %ld\n", ITTI_MSG_NAME (msg_p), TIMER_HAS_EXPIRED(msg_p).timer_id); + if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { + /* Restart the registration process */ + registered_enb = 0; + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); + } +#endif break; -# endif + default: LOG_E(ENB_APP, "Received unexpected message %s\n", ITTI_MSG_NAME (msg_p)); diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 2b6931effa66453a2df29a73b0342053d4fccf4e..012375e66888995bfc4ded98d7a99e5307022455 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -37,10 +37,12 @@ #include "UTIL/OTG/otg_externs.h" #if defined(ENABLE_ITTI) # include "intertask_interface.h" -# if defined(ENABLE_USE_MME) +# if defined(ENABLE_USE_MME) # include "s1ap_eNB.h" # include "sctp_eNB_task.h" -# endif +# else +# define EPC_MODE_ENABLED 0 +# endif #endif #include "sctp_default_values.h" #include "SystemInformationBlockType2.h" @@ -198,11 +200,10 @@ void RCconfig_flexran() /* eNB ID from configuration, as read in by RCconfig_RRC() */ if (!ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr) { // Calculate a default eNB ID -# if defined(ENABLE_USE_MME) - enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8); -# else - enb_id = i; -# endif + if (EPC_MODE_ENABLED) + enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8); + else + enb_id = i; } else { enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr); } @@ -546,32 +547,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) { int32_t srb1_max_retx_threshold = 0; int32_t my_int; - - - -/* - int32_t otg_ue_id = 0; - char* otg_app_type = NULL; - char* otg_bg_traffic = NULL; - char* glog_level = NULL; - char* glog_verbosity = NULL; - char* hw_log_level = NULL; - char* hw_log_verbosity = NULL; - char* phy_log_level = NULL; - char* phy_log_verbosity = NULL; - char* mac_log_level = NULL; - char* mac_log_verbosity = NULL; - char* rlc_log_level = NULL; - char* rlc_log_verbosity = NULL; - char* pdcp_log_level = NULL; - char* pdcp_log_verbosity = NULL; - char* rrc_log_level = NULL; - char* rrc_log_verbosity = NULL; - char* udp_log_verbosity = NULL; - char* osa_log_level = NULL; - char* osa_log_verbosity = NULL; -*/ - // for no gcc warnings (void)my_int; @@ -591,32 +566,13 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) { CCsParams[I].chkPptr = &(config_check_CCparams[I]); } /* get global parameters, defined outside any section in the config file */ - + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); + num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; AssertFatal (i<num_enbs, "Failed to parse config file no %ith element in %s \n",i, ENB_CONFIG_STRING_ACTIVE_ENBS); -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) - - - if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) { - asn_debug = 0; - asn1_xer_print = 0; - } else if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO) == 0) { - asn_debug = 1; - asn1_xer_print = 1; - } else if (strcasecmp(*(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr) , ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING) == 0) { - asn_debug = 1; - asn1_xer_print = 2; - } else { - asn_debug = 0; - asn1_xer_print = 0; - } - - -#endif - if (num_enbs>0) { @@ -628,14 +584,14 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) { if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) { // Calculate a default eNB ID -# if defined(ENABLE_USE_MME) - uint32_t hash; - - hash = s1ap_generate_eNB_id (); - enb_id = i + (hash & 0xFFFF8); -# else - enb_id = i; -# endif + if (EPC_MODE_ENABLED) { + uint32_t hash; + + hash = s1ap_generate_eNB_id (); + enb_id = i + (hash & 0xFFFF8); + } else { + enb_id = i; + } } else { enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr); } @@ -2255,23 +2211,9 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { /* get global parameters, defined outside any section in the config file */ - config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) - if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) { - asn_debug = 0; - asn1_xer_print = 0; - } else if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO) == 0) { - asn_debug = 1; - asn1_xer_print = 1; - } else if (strcasecmp(*(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr) , ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING) == 0) { - asn_debug = 1; - asn1_xer_print = 2; - } else { - asn_debug = 0; - asn1_xer_print = 0; - } + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); + -#endif AssertFatal (i<ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt, "Failed to parse config file %s, %uth attribute %s \n", @@ -2291,17 +2233,17 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) { // Calculate a default eNB ID -# if defined(ENABLE_USE_MME) - uint32_t hash; - - hash = s1ap_generate_eNB_id (); - enb_id = k + (hash & 0xFFFF8); -# else - enb_id = k; -# endif - } else { - enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr); - } + if (EPC_MODE_ENABLED) { + uint32_t hash; + + hash = s1ap_generate_eNB_id (); + enb_id = k + (hash & 0xFFFF8); + } else { + enb_id = k; + } + } else { + enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr); + } // search if in active list @@ -2349,18 +2291,14 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr)); strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr)); - if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_ACTIVE_IDX].strptr), "yes") == 0) { -#if defined(ENABLE_USE_MME) - EPC_MODE_ENABLED = 1; -#endif - } + if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } } @@ -2368,12 +2306,12 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { // SCTP SETTING S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS; S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS; -# if defined(ENABLE_USE_MME) - sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG); - config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); - S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); - S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); -#endif + if (EPC_MODE_ENABLED) { + sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG); + config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); + S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); + S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); + } sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); // NETWORK_INTERFACES @@ -2388,31 +2326,161 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address); - /* - in_addr_t ipv4_address; + break; + } + } + } + } + } +return 0; +} - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); - } - strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, inet_ntoa(ipv4_address)); - // S1AP_REGISTER_ENB_REQ (msg_p).enb_port_for_S1U = enb_port_for_S1U; +int RCconfig_X2(MessageDef *msg_p, uint32_t i) +{ + int j, k, l; + int enb_id; - S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); - cidr = enb_ipv4_address_for_S1_MME; - address = strtok(cidr, "/"); - - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, S1AP_REGISTER_ENB_REQ(msg_p).enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); - } -*/ - + char *address = NULL; + char *cidr = NULL; + + paramdef_t ENBSParams[] = ENBSPARAMS_DESC; + paramdef_t ENBParams[] = ENBPARAMS_DESC; + paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0}; + /* get global parameters, defined outside any section in the config file */ + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); +/*#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) + if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) { + asn_debug = 0; + asn1_xer_print = 0; + } else if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO) == 0) { + asn_debug = 1; + asn1_xer_print = 1; + } else if (strcasecmp(*(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr) , ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING) == 0) { + asn_debug = 1; + asn1_xer_print = 2; + } else { + asn_debug = 0; + asn1_xer_print = 0; + } +#endif */ + AssertFatal(i < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt, + "Failed to parse config file %s, %uth attribute %s \n", + RC.config_file_name, i, ENB_CONFIG_STRING_ACTIVE_ENBS); - break; - } - } + if (ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt > 0) { + // Output a list of all eNBs. + config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); + if (ENBParamList.numelt > 0) { + for (k = 0; k < ENBParamList.numelt; k++) { + if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) { + // Calculate a default eNB ID +# if defined(ENABLE_USE_MME) + uint32_t hash; + + hash = s1ap_generate_eNB_id (); + enb_id = k + (hash & 0xFFFF8); +# else + enb_id = k; +# endif + } else { + enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr); + } + + // search if in active list + for (j = 0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) { + if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) { + + paramdef_t X2Params[] = X2PARAMS_DESC; + paramlist_def_t X2ParamList = {ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS,NULL,0}; + + paramdef_t SCTPParams[] = SCTPPARAMS_DESC; + paramdef_t NETParams[] = NETPARAMS_DESC; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + + /* Some default/random parameters */ + + X2AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id; + + if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) { + X2AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB; + } else if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) { + X2AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", + RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr)); + } + + X2AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)); + X2AP_REGISTER_ENB_REQ (msg_p).tac = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr)); + X2AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr)); + X2AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr)); + X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr)); + + AssertFatal((X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) || + (X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3), + "BAD MNC DIGIT LENGTH %d", + X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length); + + sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k); + config_getlist( &X2ParamList,X2Params,sizeof(X2Params)/sizeof(paramdef_t),aprefix); + + if(X2ParamList.numelt>X2AP_MAX_NB_ENB_IP_ADDRESS){ + LOG_E(RRC,"value of X2ParamList.numelt %d must be lower than X2AP_MAX_NB_ENB_IP_ADDRESS %d value: reconsider to increase X2AP_MAX_NB_ENB_IP_ADDRESS\n",X2ParamList.numelt,X2AP_MAX_NB_ENB_IP_ADDRESS); + exit(1); + } + + X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 = 0; + for (l = 0; l < X2ParamList.numelt; l++) { + X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 += 1; + + strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv4_address,*(X2ParamList.paramarray[l][ENB_X2_IPV4_ADDRESS_IDX].strptr)); + strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv6_address,*(X2ParamList.paramarray[l][ENB_X2_IPV6_ADDRESS_IDX].strptr)); + + if (strcmp(*(X2ParamList.paramarray[l][ENB_X2_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { + X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv4 = 1; + } else if (strcmp(*(X2ParamList.paramarray[l][ENB_X2_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { + X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv6 = 1; + } else if (strcmp(*(X2ParamList.paramarray[l][ENB_X2_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { + X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv4 = 1; + X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv6 = 1; + } + } + + // SCTP SETTING + X2AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS; + X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS; +# if defined(ENABLE_USE_MME) + sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG); + config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); + X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); + X2AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); +#endif + + sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); + + // NETWORK_INTERFACES + config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix); + + X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C = (uint32_t)*(NETParams[ENB_PORT_FOR_X2C_IDX].uptr); + + if ((NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr == NULL) || (X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C == 0)) { + LOG_E(RRC,"Add eNB IPv4 address and/or port for X2C in the CONF file!\n"); + exit(1); + } + + cidr = *(NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr); + address = strtok(cidr, "/"); + + X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv6 = 0; + X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4 = 1; + + strcpy(X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4_address, address); + } + } } } } @@ -2436,8 +2504,11 @@ void RCConfig(void) { printf("Getting ENBSParams\n"); config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); +# if defined(ENABLE_USE_MME) + EPC_MODE_ENABLED = ((*ENBSParams[ENB_NOS1_IDX].uptr) == 0); +#endif RC.nb_inst = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; - + if (RC.nb_inst > 0) { RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int)); for (int i=0;i<RC.nb_inst;i++) { diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h index 6e89ec8fcca534daffd47c5d9acf43bb459cc5dc..ed1b4aeaa2924dd08f49be84d5f20337b307a044 100644 --- a/openair2/ENB_APP/enb_config.h +++ b/openair2/ENB_APP/enb_config.h @@ -106,6 +106,7 @@ void ru_config_display(void); int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc); int RCconfig_S1(MessageDef *msg_p, uint32_t i); +int RCconfig_X2(MessageDef *msg_p, uint32_t i); #endif /* ENB_CONFIG_H_ */ /** @} */ diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index 23b4c2a8376e90349ce8a7f03fbc36dd85dcfb0a..04edea1493b955f5840e7da84ead7099168bfc2b 100755 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -55,11 +55,6 @@ -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) -extern int asn_debug; -extern int asn1_xer_print; -#endif - #ifdef LIBCONFIG_LONG #define libconfig_int long #else @@ -102,6 +97,8 @@ typedef enum { #define CONFIG_STRING_RU_MAX_RXGAIN "max_rxgain" #define CONFIG_STRING_RU_IF_COMPRESSION "if_compression" #define CONFIG_STRING_RU_NBIOTRRC_LIST "NbIoT_RRC_instances" +#define CONFIG_STRING_RU_SDR_ADDRS "sdr_addrs" +#define CONFIG_STRING_RU_SDR_CLK_SRC "clock_src" #define RU_LOCAL_IF_NAME_IDX 0 #define RU_LOCAL_ADDRESS_IDX 1 @@ -121,6 +118,8 @@ typedef enum { #define RU_ATT_TX_IDX 15 #define RU_ATT_RX_IDX 16 #define RU_NBIOTRRC_LIST_IDX 17 +#define RU_SDR_ADDRS 18 +#define RU_SDR_CLK_SRC 19 @@ -147,6 +146,8 @@ typedef enum { {CONFIG_STRING_RU_ATT_TX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ {CONFIG_STRING_RU_ATT_RX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ {CONFIG_STRING_RU_NBIOTRRC_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \ +{CONFIG_STRING_RU_SDR_ADDRS, NULL, 0, strptr:NULL, defstrval:"0.0.0.0", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_SDR_CLK_SRC, NULL, 0, strptr:NULL, defstrval:"internal", TYPE_STRING, 0}, \ } /*---------------------------------------------------------------------------------------------------------------------------------------*/ @@ -160,25 +161,19 @@ typedef enum { /* global parameters, not under a specific section */ #define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity" #define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" +#define ENB_CONFIG_STRING_NOS1 "noS1" /*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* global configuration parameters */ -/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ /*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define ENBSPARAMS_DESC { \ -{ENB_CONFIG_STRING_ASN1_VERBOSITY, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ -{ENB_CONFIG_STRING_ACTIVE_ENBS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRINGLIST, 0} \ +{ENB_CONFIG_STRING_ASN1_VERBOSITY, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ACTIVE_ENBS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRINGLIST, 0}, \ +{ENB_CONFIG_STRING_NOS1, NULL, PARAMFLAG_BOOL, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ } #define ENB_ASN1_VERBOSITY_IDX 0 #define ENB_ACTIVE_ENBS_IDX 1 - - -/* -{ENB_CONFIG_STRING_COMPONENT_CARRIERS,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ -{ENB_CONFIG_STRING_CC_NODE_FUNCTION,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ -{ENB_CONFIG_STRING_CC_NODE_TIMING,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ -{ENB_CONFIG_STRING_CC_NODE_SYNCH_REF,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ -*/ - +#define ENB_NOS1_IDX 2 /*------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -704,6 +699,31 @@ typedef enum { #define ENB_MME_IP_ADDRESS_ACTIVE_IDX 2 #define ENB_MME_IP_ADDRESS_PREFERENCE_IDX 3 /*---------------------------------------------------------------------------------------------------------------------------------------*/ + +/* X2 configuration parameters section name */ +#define ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS "target_enb_x2_ip_address" + +/* X2 configuration parameters names */ + + +#define ENB_CONFIG_STRING_TARGET_ENB_X2_IPV4_ADDRESS "ipv4" +#define ENB_CONFIG_STRING_TARGET_ENB_X2_IPV6_ADDRESS "ipv6" +#define ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS_PREFERENCE "preference" + + +/*-------------------------------------------------------------------------------------------------------------------------------------*/ +/* X2 configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-------------------------------------------------------------------------------------------------------------------------------------*/ +#define X2PARAMS_DESC { \ +{ENB_CONFIG_STRING_TARGET_ENB_X2_IPV4_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_TARGET_ENB_X2_IPV6_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS_PREFERENCE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +} + +#define ENB_X2_IPV4_ADDRESS_IDX 0 +#define ENB_X2_IPV6_ADDRESS_IDX 1 +#define ENB_X2_IP_ADDRESS_PREFERENCE_IDX 2 /*---------------------------------------------------------------------------------------------------------------------------------------*/ /* SCTP configuration parameters section name */ #define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP" @@ -735,6 +755,8 @@ typedef enum { #define ENB_INTERFACE_NAME_FOR_S1U_IDX 2 #define ENB_IPV4_ADDR_FOR_S1U_IDX 3 #define ENB_PORT_FOR_S1U_IDX 4 +#define ENB_IPV4_ADDR_FOR_X2C_IDX 5 +#define ENB_PORT_FOR_X2C_IDX 6 /* S1 interface configuration parameters names */ #define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" @@ -743,8 +765,12 @@ typedef enum { #define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" #define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" +/* X2 interface configuration parameters names */ +#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C "ENB_IPV4_ADDRESS_FOR_X2C" +#define ENB_CONFIG_STRING_ENB_PORT_FOR_X2C "ENB_PORT_FOR_X2C" + /*--------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* S1 interface configuration parameters */ +/* S1/X2 interface configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*--------------------------------------------------------------------------------------------------------------------------------------------------*/ #define NETPARAMS_DESC { \ @@ -752,7 +778,9 @@ typedef enum { {ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ {ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ {ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ -{ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, NULL, 0, uptr:NULL, defintval:2152L, TYPE_UINT, 0} \ +{ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, NULL, 0, uptr:NULL, defintval:2152L, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_PORT_FOR_X2C, NULL, 0, uptr:NULL, defintval:0L, TYPE_UINT, 0}, \ } diff --git a/openair2/ENB_APP/flexran_agent.h b/openair2/ENB_APP/flexran_agent.h index aed8f9eb60dc386700e74fbd1eeb7e7fddd5f96b..4ce727ff1c7c89e305ccb7ff2d1641010122e64a 100644 --- a/openair2/ENB_APP/flexran_agent.h +++ b/openair2/ENB_APP/flexran_agent.h @@ -39,7 +39,7 @@ #include "flexran_agent_mac.h" #include "flexran_agent_rrc.h" #include "flexran_agent_pdcp.h" -#include "log.h" +#include "common/utils/LOG/log.h" #include "assertions.h" /* Initiation of the eNodeB agent */ diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c index 3bbea167d37dfacf1e8e2ca6cc0c576a2918f18d..db1943c9451f15304902cefd1d5ee080897280bf 100644 --- a/openair2/ENB_APP/flexran_agent_common.c +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -36,7 +36,7 @@ #include "flexran_agent_net_comm.h" #include "flexran_agent_ran_api.h" //#include "PHY/extern.h" -#include "log.h" +#include "common/utils/LOG/log.h" //#include "SCHED/defs.h" #include "RRC/LTE/rrc_extern.h" diff --git a/openair2/ENB_APP/flexran_agent_handler.c b/openair2/ENB_APP/flexran_agent_handler.c index d4c82e4dff127b12828c1a72ed6779705cf73714..66123fd71c60197ec9c40297bce7dc59f1e66343 100644 --- a/openair2/ENB_APP/flexran_agent_handler.c +++ b/openair2/ENB_APP/flexran_agent_handler.c @@ -33,7 +33,7 @@ #include "flexran_agent_pdcp.h" #include "flexran_agent_timer.h" #include "flexran_agent_ran_api.h" -#include "log.h" +#include "common/utils/LOG/log.h" #include "assertions.h" diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h index 3354d8ace875da91ed0dc6fc9b53f5fca5225877..dacca55ab78a2bba6f642c25bc7e5d710429ba3a 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.h +++ b/openair2/ENB_APP/flexran_agent_ran_api.h @@ -43,7 +43,7 @@ #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "RRC/LTE/rrc_eNB_UE_context.h" #include "PHY/phy_extern.h" -#include "log.h" +#include "common/utils/LOG/log.h" /**************************** * get generic info from RAN diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index dc7cbd409c4db13361bf2e1b7f1137179f7fcb48..a2988f26d8c27b34265fe94635d625e2858935c0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -538,8 +538,8 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, 0 ? "in synch" : "out of sync", UE_list->UE_template[CC_id][i].phr_info, UE_list->UE_sched_ctrl[i].dl_cqi[CC_id], - (UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 128) / 2, - (UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 128) / 2); + (5*UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 640) / 10, + (5*UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 640) / 10); } RC.eNB[module_idP][CC_id]->pusch_stats_bsr[i][(frameP * 10) + diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 35590ec896716ca9777c774fbe215690a36ae04e..b637a92a9616f53e447cb422087a43dd3789eff4 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -988,9 +988,10 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP, payload[0], ra->msg4_TBsize)); if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, (uint8_t *) mac-> - UE_list.DLSCH_pdu[CC_idP][0][(unsigned char)UE_id].payload[0], rrc_sdu_length, UE_id, 3, + UE_list.DLSCH_pdu[CC_idP][0][(unsigned char)UE_id].payload[0], + rrc_sdu_length, UE_id, WS_C_RNTI, UE_RNTI(module_idP, UE_id), mac->frame, mac->subframe, 0, 0); LOG_D(OPT, @@ -1193,9 +1194,10 @@ generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP, payload[0], ra->msg4_TBsize)); if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, (uint8_t *) mac-> - UE_list.DLSCH_pdu[CC_idP][0][(unsigned char)UE_id].payload[0], rrc_sdu_length, UE_id, 3, + UE_list.DLSCH_pdu[CC_idP][0][(unsigned char)UE_id].payload[0], + rrc_sdu_length, UE_id, WS_C_RNTI, UE_RNTI(module_idP, UE_id), mac->frame, mac->subframe, 0, 0); LOG_D(OPT, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index d965bc811bf1c07ccf84c5e816a63ce5ffbe1a01..b2b59691f88db67daeafa8dbe2db05a8267bce01 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -281,10 +281,10 @@ schedule_SIB1_BR(module_id_t module_idP, eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, &cc->BCCH_BR_pdu[0].payload[0], bcch_sdu_length, - 0xffff, 4, 0xffff, eNB->frame, eNB->subframe, 0, 0); + 0xffff, WS_SI_RNTI, 0xffff, eNB->frame, eNB->subframe, 0, 0); LOG_D(OPT, "[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", module_idP, frameP, CC_id, 0xffff, bcch_sdu_length); @@ -472,11 +472,11 @@ schedule_SI_BR(module_id_t module_idP, frame_t frameP, eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, &cc->BCCH_BR_pdu[i + 1].payload[0], bcch_sdu_length, 0xffff, - 4, + WS_SI_RNTI, 0xffff, eNB->frame, eNB->subframe, 0, 0); LOG_D(OPT, @@ -759,11 +759,11 @@ schedule_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) } if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, &cc->BCCH_pdu.payload[0], bcch_sdu_length, 0xffff, - 4, 0xffff, eNB->frame, eNB->subframe, 0, 0); + WS_SI_RNTI, 0xffff, eNB->frame, eNB->subframe, 0, 0); LOG_D(OPT, "[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", module_idP, frameP, CC_id, 0xffff, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 05498e4377b0abb24a883da61da4a027cebed93c..da52a8fedcdf9013f47df5231c3f2042fb6353bd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -386,6 +386,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; break; } + break; case 2: // if ((subframeP==3)||(subframeP==8)) @@ -1358,9 +1359,9 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP, } if (opt_enabled == 1) { - trace_pdu(1, (uint8_t *) - UE_list->DLSCH_pdu[CC_id][0][UE_id]. - payload[0], TBS, module_idP, 3, + trace_pdu(DIRECTION_DOWNLINK, + (uint8_t *) UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], + TBS, module_idP, WS_C_RNTI, UE_RNTI(module_idP, UE_id), eNB->frame, eNB->subframe, 0, 0); LOG_D(OPT, @@ -2084,7 +2085,7 @@ void schedule_PCH(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP) } if (opt_enabled == 1) { - trace_pdu(1, + trace_pdu(DIRECTION_DOWNLINK, &eNB->common_channels[CC_id].PCCH_pdu.payload[0], pcch_sdu_length, 0xffff, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c index 1acf65722099af3c1cf4df99251ebbcbbe591355..76589eebdb7c0ade1ffe50acaf4813bec3138154 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c @@ -1655,8 +1655,8 @@ schedule_ue_spec_fairRR(module_id_t module_idP, } if (opt_enabled == 1) { - trace_pdu(1, (uint8_t *)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], - TBS, module_idP, 3, UE_RNTI(module_idP,UE_id), + trace_pdu(DIRECTION_DOWNLINK, (uint8_t *)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], + TBS, module_idP, WS_RA_RNTI, UE_RNTI(module_idP,UE_id), eNB->frame, eNB->subframe,0,0); LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), TBS); @@ -1696,9 +1696,9 @@ schedule_ue_spec_fairRR(module_id_t module_idP, // this is the normalized RX power eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; - /* TODO: fix how we deal with power, unit is not dBm, it's special from nfapi */ - normalized_rx_power = ue_sched_ctl->pucch1_snr[CC_id]; - target_rx_power = 208; + /* Unit is not dBm, it's special from nfapi */ + normalized_rx_power = (5*ue_sched_ctl->pucch1_snr[CC_id]-640)/10+30;//(+eNB->measurements.n0_power_dB[0]) + target_rx_power= eNB->puCch10xSnr/10 + 30;//(+eNB->measurements.n0_power_dB[0]) // this assumes accumulated tpc // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out @@ -2690,9 +2690,25 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, if (status < RRC_CONNECTED) cqi_req = 0; else if (UE_sched_ctrl->cqi_req_timer>30) { - cqi_req = 1; - UE_sched_ctrl->cqi_req_timer=0; - UE_sched_ctrl->cqi_req_flag |= 1 << sched_subframeP; + cqi_req = 1; + // To be safe , do not ask CQI in special SFs:36.213/7.2.3 CQI definition + if (cc->tdd_Config) { + switch (cc->tdd_Config->subframeAssignment) { + case 1: + if( subframeP == 1 || subframeP == 6 ) cqi_req=0; + break; + case 3: + if( subframeP == 1 ) cqi_req=0; + break; + default: + LOG_E(MAC," TDD config not supported\n"); + break; + } + } + if(cqi_req == 1){ + UE_sched_ctrl->cqi_req_timer=0; + UE_sched_ctrl->cqi_req_flag |= 1 << sched_subframeP; + } } else cqi_req = 0; @@ -2701,8 +2717,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, //compute the expected ULSCH RX power (for the stats) // this is the normalized RX power and this should be constant (regardless of mcs - normalized_rx_power = UE_sched_ctrl->pusch_snr[CC_id]; - target_rx_power = 178; + normalized_rx_power = (5*UE_sched_ctrl->pusch_snr[CC_id]-640)/10+30; //(+eNB->measurements.n0_power_dB[0]) + target_rx_power= eNB->puSch10xSnr/10 + 30; //(+eNB->measurements.n0_power_dB[0]) // this assumes accumulated tpc // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index 63a471177881ab5fafc6cfd71bdecf0825a79265..16953e958a8ffe39ee32593e2a4053f8fb5567f9 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -767,7 +767,7 @@ schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, /* Tracing of PDU is done on UE side */ if (opt_enabled == 1) { - trace_pdu(1, (uint8_t *) cc->MCH_pdu.payload, TBS, module_idP, 6, 0xffff, // M_RNTI = 6 in wirehsark + trace_pdu(DIRECTION_DOWNLINK, (uint8_t *) cc->MCH_pdu.payload, TBS, module_idP, WS_M_RNTI , 0xffff, // M_RNTI = 6 in wirehsark RC.mac[module_idP]->frame, RC.mac[module_idP]->subframe, 0, 0); LOG_D(OPT, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c index 4a2c8f7ec81b88e1dac91d6a6cc0bd46c913c3a3..03def311723c157b227742d2e5f4e74b0cadf66d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c @@ -67,13 +67,13 @@ schedule_ue_spec_phy_test( uint16_t TBS; uint16_t nb_rb; - unsigned char harq_pid = subframeP%5; + unsigned char harq_pid = (frameP*10+subframeP)%8; uint16_t rnti = 0x1235; - uint32_t rb_alloc = 0x1FFFFFFF; + uint32_t rb_alloc = 0x1FFFFF; int32_t tpc = 1; - int32_t mcs = 28; + int32_t mcs = 10; int32_t cqi = 15; - int32_t ndi = subframeP/5; + int32_t ndi = (frameP*10+subframeP)/8; int32_t dai = 0; eNB_MAC_INST *eNB = RC.mac[module_idP]; @@ -92,10 +92,9 @@ schedule_ue_spec_phy_test( continue; nb_rb = conv_nprb(0,rb_alloc,N_RB_DL); - //printf("////////////////////////////////////*************************nb_rb = %d\n",nb_rb); TBS = get_TBS_DL(mcs,nb_rb); - LOG_D(PHY,"schedule_ue_spec_phy_test: subframe %d/%d: nb_rb=%d, TBS=%d, mcs=%d (rb_alloc=%x, N_RB_DL=%d)\n",frameP,subframeP,nb_rb,TBS,mcs,rb_alloc,N_RB_DL); + LOG_D(MAC,"schedule_ue_spec_phy_test: subframe %d/%d: nb_rb=%d, TBS=%d, mcs=%d harq_pid=%d (rb_alloc=%x, N_RB_DL=%d) pdu_number = %d \n", frameP, subframeP, nb_rb, TBS, mcs, harq_pid, rb_alloc, N_RB_DL, dl_req->number_pdu); dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; memset((void*)dl_config_pdu,0,sizeof(nfapi_dl_config_request_pdu_t)); @@ -136,6 +135,8 @@ schedule_ue_spec_phy_test( //ue_sched_ctl->round[CC_id][harq_pid] = 0; dl_req->number_dci++; dl_req->number_pdu++; + eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP; + //eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; // Toggle NDI for next time /* @@ -150,7 +151,6 @@ schedule_ue_spec_phy_test( AssertFatal(UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated!=NULL,"physicalConfigDedicated->pdsch_ConfigDedicated is NULL\n"); */ - fill_nfapi_dlsch_config(eNB, dl_req, @@ -196,32 +196,47 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s int UE_id = 0; uint8_t aggregation = 2; rnti_t rnti = 0x1235; - uint8_t mcs = 0; + uint8_t mcs = 20; uint8_t harq_pid = 0; uint32_t cqi_req = 0,cshift,ndi,tpc = 1; int32_t normalized_rx_power; int32_t target_rx_power= 178; int CC_id = 0; - int nb_rb = 96; - eNB_MAC_INST *eNB = RC.mac[module_idP]; - COMMON_channels_t *cc = eNB->common_channels; - UE_list_t *UE_list=&eNB->UE_list; + int nb_rb = 24; + int N_RB_UL; + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = &mac->common_channels[0]; + UE_list_t *UE_list=&mac->UE_list; UE_TEMPLATE *UE_template; UE_sched_ctrl *UE_sched_ctrl; int sched_frame=frameP; int sched_subframe = (subframeP+4)%10; - + uint16_t ul_req_index; + if (sched_subframe<subframeP) sched_frame++; - nfapi_hi_dci0_request_body_t *hi_dci0_req = &eNB->HI_DCI0_req[CC_id][subframeP].hi_dci0_request_body; + nfapi_hi_dci0_request_t *hi_dci0_req = &mac->HI_DCI0_req[CC_id][subframeP]; + nfapi_hi_dci0_request_body_t *hi_dci0_req_body = &hi_dci0_req->hi_dci0_request_body; nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu; //nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req->ul_config_pdu_list[0];; - nfapi_ul_config_request_body_t *ul_req = &eNB->UL_req[CC_id].ul_config_request_body; - + nfapi_ul_config_request_body_t *ul_req = &mac->UL_req[CC_id].ul_config_request_body; + + N_RB_UL = to_prb(cc->mib->message.dl_Bandwidth); + switch(N_RB_UL){ + case 100: + nb_rb = 96; + break; + case 50: + nb_rb = 48; + break; + case 25: + nb_rb = 24; + break; + } - eNB->UL_req[CC_id].sfn_sf = (sched_frame<<4) + sched_subframe; - eNB->HI_DCI0_req[CC_id][subframeP].sfn_sf = (frameP<<4)+subframeP; + mac->UL_req[CC_id].sfn_sf = (sched_frame<<4) + sched_subframe; + hi_dci0_req->sfn_sf = (frameP << 4) + subframeP; for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { //rnti = UE_RNTI(module_idP,UE_id); @@ -235,7 +250,6 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s UE_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id]; harq_pid = subframe2harqpid(&cc[CC_id],sched_frame,sched_subframe); - LOG_D(MAC,"Scheduling for frame %d, subframe %d => harq_pid %d\n",sched_frame,sched_subframe,harq_pid); RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP] = UE_template->TBS_UL[harq_pid]; @@ -245,7 +259,7 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s //compute the expected ULSCH RX power (for the stats) // this is the normalized RX power and this should be constant (regardless of mcs - normalized_rx_power = UE_sched_ctrl->pusch_snr[CC_id]; + normalized_rx_power = (5*UE_sched_ctrl->pusch_snr[CC_id]-640)/10+30; // new transmission @@ -281,7 +295,7 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s // save it for a potential retransmission UE_template->cshift[harq_pid] = cshift; - hi_dci0_pdu = &hi_dci0_req->hi_dci0_pdu_list[eNB->HI_DCI0_req[CC_id][subframeP].hi_dci0_request_body.number_of_dci+eNB->HI_DCI0_req[CC_id][subframeP].hi_dci0_request_body.number_of_hi]; + hi_dci0_pdu = &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi]; memset((void*)hi_dci0_pdu,0,sizeof(nfapi_hi_dci0_request_pdu_t)); hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; hi_dci0_pdu->pdu_size = 2+sizeof(nfapi_hi_dci0_dci_pdu); @@ -298,18 +312,26 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tpc = tpc; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.cqi_csi_request = cqi_req; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index = UE_template->DAI_ul[sched_subframe]; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.harq_pid = harq_pid; + + hi_dci0_req_body->number_of_dci++; - eNB->HI_DCI0_req[CC_id][subframeP].hi_dci0_request_body.number_of_dci++; - - + ul_req_index = 0; + for(ul_req_index = 0;ul_req_index < ul_req->number_of_pdus;ul_req_index++){ + if(ul_req->ul_config_pdu_list[ul_req_index].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE){ + LOG_D(MAC,"Frame %d, Subframe %d:rnti %x ul_req_index %d Switched UCI HARQ to ULSCH HARQ(first)\n",frameP,subframeP,rnti,ul_req_index); + break; + } + } + // Add UL_config PDUs - fill_nfapi_ulsch_config_request_rel8(&ul_req->ul_config_pdu_list[ul_req->number_of_pdus], + fill_nfapi_ulsch_config_request_rel8(& ul_req->ul_config_pdu_list[ul_req_index], cqi_req, cc, 0,//UE_template->physicalConfigDedicated, get_tmode(module_idP,CC_id,UE_id), - eNB->ul_handle, + mac->ul_handle,//eNB->ul_handle, rnti, first_rb[CC_id], // resource_block_start nb_rb, // number_of_resource_blocks @@ -327,7 +349,7 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s ); #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0)) if (UE_template->rach_resource_type>0) { // This is a BL/CE UE allocation - fill_nfapi_ulsch_config_request_emtc(&ul_req->ul_config_pdu_list[ul_req->number_of_pdus], + fill_nfapi_ulsch_config_request_emtc(&ul_req->ul_config_pdu_list[ul_req_index], UE_template->rach_resource_type>2 ? 2 : 1, 1, //total_number_of_repetitions 1, //repetition_number @@ -335,7 +357,7 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s } #endif ul_req->number_of_pdus = 1; - eNB->ul_handle++; + mac->ul_handle++; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 04415a838626df5e9f91b59dd599b7d94245faad..f48cf50bcec74a37aa8b8836d8059f089e19f1dd 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -150,7 +150,7 @@ rx_sdu(const module_id_t enb_mod_idP, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME (VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU, 1); if (opt_enabled == 1) { - trace_pdu(0, sduP, sdu_lenP, 0, 3, current_rnti, frameP, subframeP, + trace_pdu(DIRECTION_UPLINK, sduP, sdu_lenP, 0, WS_C_RNTI, current_rnti, frameP, subframeP, 0, 0); LOG_D(OPT, "[eNB %d][ULSCH] Frame %d rnti %x with size %d\n", enb_mod_idP, frameP, current_rnti, sdu_lenP); @@ -1337,10 +1337,24 @@ schedule_ulsch_rnti(module_id_t module_idP, if (status >= RRC_CONNECTED && UE_sched_ctrl->cqi_req_timer > 30) { if (UE_sched_ctrl->cqi_received == 0) { if (nfapi_mode) { - cqi_req = 0; + cqi_req = 0; } else { - cqi_req = 1; - UE_sched_ctrl->cqi_req_flag |= 1 << sched_subframeP; + cqi_req = 1; + // To be safe , do not ask CQI in special Subframes:36.213/7.2.3 CQI definition + if (cc[CC_id].tdd_Config) { + switch (cc[CC_id].tdd_Config->subframeAssignment) { + case 1: + if( subframeP == 1 || subframeP == 6 ) cqi_req=0; + break; + case 3: + if( subframeP == 1 ) cqi_req=0; + break; + default: + LOG_E(MAC," TDD config not supported\n"); + break; + } + } + if(cqi_req == 1) UE_sched_ctrl->cqi_req_flag |= 1 << sched_subframeP; } } else if (UE_sched_ctrl->cqi_received == 1) { diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index d9e914f087009858a77e323fb2c3597609ca3d38..f8121310b1e413496d6663701662051d256f95ed 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -442,7 +442,7 @@ typedef struct { /*!\brief LCID of MCCH for DL */ #define MCCH_LCHANID 0 /*!\brief LCID of MCH scheduling info for DL */ -#define MCH_SCHDL_INFO 3 +#define MCH_SCHDL_INFO 30 /*!\brief LCID of Carrier component activation/deactivation */ #define CC_ACT_DEACT 27 //TTN (for D2D) @@ -1502,7 +1502,16 @@ typedef struct { /// MCCH status uint8_t mcch_status; /// MSI status - uint8_t msi_status; // could be an array if there are >1 MCH in one MBSFN area + uint8_t msi_status_v[28]; + uint8_t msi_current_alloc; + uint8_t msi_pmch; + + struct MBSFN_SubframeConfig *commonSF_Alloc_r9_mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA? + uint8_t commonSF_AllocPeriod_r9; + int common_num_sf_alloc; + + uint8_t pmch_lcids[28]; + uint16_t pmch_stop_mtch[28]; #endif //#ifdef CBA /// CBA RNTI for each group diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index f5df67ab64d5ce540b14a2fa1c6975bdf9200aa7..aeabbd092a32c02dee9ba16fdabf6deab593b0ec 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -248,7 +248,7 @@ Msg1_transmitted(module_id_t module_idP, uint8_t CC_id, UE_mac_inst[module_idP].RA_attempt_number++; if (opt_enabled) { - trace_pdu(0, NULL, 0, module_idP, 0, + trace_pdu(DIRECTION_UPLINK, NULL, 0, module_idP, WS_NO_RNTI, UE_mac_inst[module_idP].RA_prach_resources. ra_PreambleIndex, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, @@ -277,8 +277,8 @@ Msg3_transmitted(module_id_t module_idP, uint8_t CC_id, UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 1; if (opt_enabled) { // msg3 - trace_pdu(0, &UE_mac_inst[module_idP].CCCH_pdu.payload[0], - UE_mac_inst[module_idP].RA_Msg3_size, module_idP, 3, + trace_pdu(DIRECTION_UPLINK , &UE_mac_inst[module_idP].CCCH_pdu.payload[0], + UE_mac_inst[module_idP].RA_Msg3_size, module_idP, WS_C_RNTI, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0); diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index b70b3824946cf0271752ff735613fd473e781c99..2e6b47ff60464c320326a8d48455e47fc43792d2 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -96,7 +96,7 @@ fill_rar(const module_id_t module_idP, ((ra->msg3_ULdelay & 1) << 1) | (ra->msg3_cqireq & 1); if (opt_enabled) { - trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1, + trace_pdu(DIRECTION_DOWNLINK , dlsch_buffer, input_buffer_length, module_idP, WS_RA_RNTI , 1, RC.mac[module_idP]->frame, RC.mac[module_idP]->subframe, 0, 0); LOG_D(OPT, @@ -181,7 +181,7 @@ fill_rar_br(eNB_MAC_INST * eNB, ra->preamble_index, ra->timing_offset); if (opt_enabled) { - trace_pdu(1, dlsch_buffer, input_buffer_length, eNB->Mod_id, 2, 1, + trace_pdu(DIRECTION_DOWNLINK , dlsch_buffer, input_buffer_length, eNB->Mod_id, WS_RA_RNTI , 1, eNB->frame, eNB->subframe, 0, 0); LOG_D(OPT, "[RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", diff --git a/openair2/LAYER2/MAC/rar_tools_ue.c b/openair2/LAYER2/MAC/rar_tools_ue.c index 991eaae052b40fe68297927593101cb548f192a6..35d1f7925e55ddc07c0d37dbe4217f19a0910aa0 100644 --- a/openair2/LAYER2/MAC/rar_tools_ue.c +++ b/openair2/LAYER2/MAC/rar_tools_ue.c @@ -119,8 +119,8 @@ uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const fra LOG_D(OPT, "[UE %d][RAPROC] CC_id %d RAR Frame %d trace pdu for ra-RNTI %x\n", module_idP, CC_id, frameP, ra_rnti); - trace_pdu(1, (uint8_t *) dlsch_buffer, n_rarh + n_rarpy * 6, - module_idP, 2, ra_rnti, UE_mac_inst[module_idP].rxFrame, + trace_pdu(DIRECTION_DOWNLINK, (uint8_t *) dlsch_buffer, n_rarh + n_rarpy * 6, + module_idP, WS_RA_RNTI, ra_rnti, UE_mac_inst[module_idP].rxFrame, UE_mac_inst[module_idP].rxSubframe, 0, 0); } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index dd78da72751db65b3ae551d921b25353e9fcc33f..2c99b79ce8057860a4f3870c6dcd6a302854f7d7 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -420,7 +420,7 @@ ue_send_sdu(module_id_t module_idP, //LOG_D(MAC,"sdu: %x.%x.%x\n",sdu[0],sdu[1],sdu[2]); if (opt_enabled) { - trace_pdu(1, sdu, sdu_len, module_idP, 3, + trace_pdu(DIRECTION_DOWNLINK, sdu, sdu_len, module_idP, WS_C_RNTI, UE_mac_inst[module_idP].crnti, frameP, subframeP, 0, 0); LOG_D(OPT, "[UE %d][DLSCH] Frame %d trace pdu for rnti %x with size %d\n", @@ -637,11 +637,11 @@ ue_decode_si(module_id_t module_idP, int CC_id, frame_t frameP, stop_meas(&UE_mac_inst[module_idP].rx_si); #endif if (opt_enabled == 1) { - trace_pdu(0, + trace_pdu(DIRECTION_UPLINK, (uint8_t *) pdu, len, module_idP, - 4, + WS_SI_RNTI, 0xffff, UE_mac_inst[module_idP].rxFrame, UE_mac_inst[module_idP].rxSubframe, 0, 0); @@ -675,11 +675,11 @@ ue_decode_p(module_id_t module_idP, int CC_id, frame_t frameP, stop_meas(&UE_mac_inst[module_idP].rx_p); #endif if (opt_enabled == 1) { - trace_pdu(0, + trace_pdu(DIRECTION_UPLINK , (uint8_t *) pdu, len, module_idP, - 4, + WS_SI_RNTI, P_RNTI, UE_mac_inst[module_idP].rxFrame, UE_mac_inst[module_idP].rxSubframe, 0, 0); @@ -750,7 +750,7 @@ ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint8_t sync_area) { - unsigned char num_sdu, i, *payload_ptr; + unsigned char num_sdu, i, j, *payload_ptr; unsigned char rx_lcids[NB_RB_MAX]; unsigned short rx_lengths[NB_RB_MAX]; #if UE_TIMING_TRACE @@ -771,47 +771,76 @@ ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, num_sdu); for (i = 0; i < num_sdu; i++) { - if (rx_lcids[i] == MCH_SCHDL_INFO) { - if (UE_mac_inst[module_idP].mcch_status == 1) { - LOG_I(MAC, - "[UE %d] Frame %d : MCH->MSI for sync area %d (eNB %d, %d bytes)\n", - module_idP, frameP, sync_area, eNB_index, - rx_lengths[i]); - // ??store necessary scheduling info to ue_mac_inst in order to - // calculate exact position of interested service (for the complex case has >1 mtch) - // set msi_status to 1 - UE_mac_inst[module_idP].msi_status = 1; - } - } else if (rx_lcids[i] == MCCH_LCHANID) { - LOG_I(MAC, - "[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n", - module_idP, frameP, i, sync_area, eNB_index, - rx_lengths[i]); - mac_rrc_data_ind_ue(module_idP, CC_id, frameP, 0, // unknown subframe - M_RNTI, - MCCH, - payload_ptr, rx_lengths[i], eNB_index, - sync_area); - } else if (rx_lcids[i] == MTCH) { - if (UE_mac_inst[module_idP].msi_status == 1) { - LOG_I(MAC, - "[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes)\n", - module_idP, frameP, sync_area, eNB_index, - rx_lengths[i]); + if (rx_lcids[i] == MCH_SCHDL_INFO) { + if (rx_lengths[i] & 0x01) { + LOG_E(MAC,"MCH Scheduling Information MAC Control Element should have an even size\n"); + } - mac_rlc_data_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index, frameP, ENB_FLAG_NO, MBMS_FLAG_YES, MTCH, /*+ (maxDRB + 3), */ - (char *) payload_ptr, rx_lengths[i], 1, - NULL); + LOG_D(MAC,"MCH Scheduling Information, len(%d)\n",rx_lengths[i]); - } - } else { - LOG_W(MAC, - "[UE %d] Frame %d : unknown sdu %d rx_lcids[%d]=%d mcch status %d eNB %d \n", - module_idP, frameP, rx_lengths[i], i, rx_lcids[i], - UE_mac_inst[module_idP].mcch_status, eNB_index); - } + for (j=0; j<rx_lengths[i]/2; j++) { + uint16_t stop_mtch_val = ((uint16_t)(payload_ptr[2*j] & 0x07) << 8) | (uint16_t)payload_ptr[2*j+1]; + + UE_mac_inst[module_idP].pmch_lcids[j] = (payload_ptr[2*j] & 0xF8) >> 3; + UE_mac_inst[module_idP].pmch_stop_mtch[j] = stop_mtch_val; + LOG_D(MAC,"lcid(%d),stop_mtch_val %d frameP(%d)\n", UE_mac_inst[module_idP].pmch_lcids[j], stop_mtch_val, frameP); + + if ((stop_mtch_val >= 2043) && (stop_mtch_val <= 2046)) { + LOG_D(MAC,"(reserved)\n"); + } + + UE_mac_inst[module_idP].msi_status_v[j] = 0; - payload_ptr += rx_lengths[i]; + if (UE_mac_inst[module_idP].mcch_status==1) { + LOG_D(MAC,"[UE %d] Frame %d : MCH->MSI for sync area %d (eNB %d, %d bytes), i(%d)\n", module_idP, frameP, sync_area, eNB_index, rx_lengths[i], UE_mac_inst[module_idP].pmch_stop_mtch[j]); + if (UE_mac_inst[module_idP].pmch_stop_mtch[j] < 2043) { + UE_mac_inst[module_idP].pmch_stop_mtch[j] += UE_mac_inst[module_idP].msi_current_alloc; + UE_mac_inst[module_idP].msi_status_v[j] = 1; + } + } + } + } else if (rx_lcids[i] == MCCH_LCHANID) { + LOG_D(MAC,"[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frameP, i, sync_area, eNB_index, rx_lengths[i]); + mac_rrc_data_ind_ue(module_idP, + CC_id, + frameP,0, // unknown subframe + M_RNTI, + MCCH, + payload_ptr + 1, // Skip RLC layer 1st byte + rx_lengths[i] - 1, + eNB_index, + sync_area); + } else if (rx_lcids[i] <= 28) { + for (j=0; j<28; j++) { + if (rx_lcids[i] == UE_mac_inst[module_idP].pmch_lcids[j]) + break; + } + + if (j<28 && UE_mac_inst[module_idP].msi_status_v[j]==1) { + LOG_D(MAC,"[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes), j=%d\n", module_idP, frameP, sync_area, eNB_index, rx_lengths[i], j); + + mac_rlc_data_ind( + module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_YES, + rx_lcids[i], /*+ (maxDRB + 3),*/ + (char *)payload_ptr, + rx_lengths[i], + 1, + NULL); + + } + } else { + LOG_W(MAC, + "[UE %d] Frame %d : unknown sdu %d rx_lcids[%d]=%d mcch status %d eNB %d \n", + module_idP, frameP, rx_lengths[i], i, rx_lcids[i], + UE_mac_inst[module_idP].mcch_status, eNB_index); + } + + payload_ptr += rx_lengths[i]; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME @@ -916,406 +945,591 @@ int8_t ue_get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t mbsfn_sync_are } } -int -ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, - uint32_t subframe, uint8_t eNB_index, uint8_t * sync_area, - uint8_t * mcch_active) +int ue_query_p_mch_info(module_id_t module_idP, uint32_t frameP, uint32_t subframe, int commonSFAlloc_period, int commonSFAlloc_offset, int num_sf_alloc, int *mtch_active, int *msi_active, uint8_t *mch_lcid) { + int i, mtch_mcs = -1; + int mtch_flag = 0; + int msi_flag = 0; - int i = 0, j = 0, ii = 0, msi_pos = 0, mcch_mcs = -1; - int mcch_flag = 0, mtch_flag = 0, msi_flag = 0; - int mbsfn_period = 0; // 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - int mcch_period = 0; // 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - int mch_scheduling_period = -1; + for (i = 0; i < 4; i++) { + if (UE_mac_inst[module_idP].pmch_Config[i] == NULL) + continue; - int frame_FDD = 1; + int mch_scheduling_period = 8 << UE_mac_inst[module_idP].pmch_Config[i]->mch_SchedulingPeriod_r9; + uint8_t sf_AllocEnd_r9 = UE_mac_inst[module_idP].pmch_Config[i]->sf_AllocEnd_r9; + if (sf_AllocEnd_r9 == 2047) { + msi_flag = 1; + break; + } -#if UE_TIMING_TRACE - start_meas(&UE_mac_inst[module_idP].ue_query_mch); -#endif + if ((frameP % mch_scheduling_period) == (commonSFAlloc_offset + (frameP % 4))) { + if (i == 0) { + //msi and mtch are mutally excluded then the break is safe + if ((num_sf_alloc == 0) && (sf_AllocEnd_r9 >= 1)) { + msi_flag = 1; + LOG_D(MAC,"msi(%d) should be allocated:frame(%d),submframe(%d),num_sf_alloc(%d),sf_AllocEnd_r9(%d),common_num_sf_alloc(%d)\n",i,frameP,subframe,num_sf_alloc,sf_AllocEnd_r9,UE_mac_inst[module_idP].common_num_sf_alloc); + UE_mac_inst[module_idP].msi_current_alloc = num_sf_alloc; + UE_mac_inst[module_idP].msi_pmch = i; + } + } else { //more that one MCH ?? check better this condition + //msi and mtch are mutally excluded then the break is safe + if ((num_sf_alloc == UE_mac_inst[module_idP].pmch_Config[i-1]->sf_AllocEnd_r9 + 1) && (sf_AllocEnd_r9 >= (num_sf_alloc+1))) { + //msi should be just after + msi_flag = 1; + LOG_D(MAC,"msi(%d) should be allocated:frame(%d),submframe(%d),num_sf_alloc(%d),sf_AllocEnd_r9(%d),common_num_sf_alloc(%d)\n",i,frameP,subframe,num_sf_alloc,sf_AllocEnd_r9,UE_mac_inst[module_idP].common_num_sf_alloc); + UE_mac_inst[module_idP].msi_current_alloc = num_sf_alloc; + UE_mac_inst[module_idP].msi_pmch = i; + } + } + } + } - if (UE_mac_inst[module_idP].pmch_Config[0]) { - mch_scheduling_period = - 8 << (UE_mac_inst[module_idP]. - pmch_Config[0]->mch_SchedulingPeriod_r9); + for (i = 0; i < 28; i++) { + if (UE_mac_inst[module_idP].pmch_stop_mtch[i] >= num_sf_alloc) { + if (UE_mac_inst[module_idP].pmch_stop_mtch[i] != 2047) { + mtch_flag = 1; + if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL) + mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9; + else + mtch_mcs = -1; + *mch_lcid = (uint8_t)i; + LOG_D(MAC,"mtch should be allocated:frame(%d),submframe(%d),num_sf_alloc(%d),mtch_mcs(%d),pmch_stop_mtch(%d),lcid(%d),msi_pmch(%d)\n",frameP,subframe,num_sf_alloc,mtch_mcs,UE_mac_inst[module_idP].pmch_stop_mtch[i],UE_mac_inst[module_idP].pmch_lcids[i],UE_mac_inst[module_idP].msi_pmch); + break; + } } + } - for (i = 0; i < UE_mac_inst[module_idP].num_active_mbsfn_area; i++) { - // assume, that there is always a mapping - if ((j = - ue_get_mbsfn_sf_alloction(module_idP, i, eNB_index)) == -1) { - return -1; // continue; - } + *mtch_active = mtch_flag; + *msi_active = msi_flag; - ii = 0; - msi_pos = 0; - mbsfn_period = - 1 << (UE_mac_inst[module_idP]. - mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - mcch_period = - 32 << (UE_mac_inst[module_idP]. - mbsfn_AreaInfo[0]->mcch_Config_r9. - mcch_RepetitionPeriod_r9); + return mtch_mcs; +} - LOG_D(MAC, - "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%ld))\n", - module_idP, frameP, subframe, i, - UE_mac_inst[module_idP].num_active_mbsfn_area, j, - UE_mac_inst[module_idP].num_sf_allocation_pattern, - mbsfn_period, mcch_period, mch_scheduling_period, - UE_mac_inst[module_idP]. - mbsfn_SubframeConfig[j]->radioframeAllocationOffset); - - // get the real MCS value - switch (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]-> - mcch_Config_r9.signallingMCS_r9) { - case 0: - mcch_mcs = 2; - break; - - case 1: - mcch_mcs = 7; - break; - - case 2: - mcch_mcs = 13; - break; - - case 3: - mcch_mcs = 19; - break; - } +int ue_query_p_mch(module_id_t module_idP, uint32_t frameP, uint32_t subframe, int *mtch_active, int *msi_active, uint8_t *mch_lcid) +{ + int i, j, mtch_mcs = -1; + int mtch_flag = 0; + + // Acount for sf_allocable in CSA + int num_sf_alloc = 0; + for (i = 0; i < 8; i++) { + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] == NULL) + continue; + + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) // one-frameP format + continue; + + // four-frameP format + uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[2] | + (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[1]<<8) | + (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]<<16); + for (j = 0; j < 24; j++) + num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x800000 >> j)) == (0x800000 >> j)); + } - if (frameP % mbsfn_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset) { // MBSFN frameP - if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format + for (i = 0; i < 8; i++ ) { + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] == NULL) + continue; + + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) // one-frameP format + continue; + + // four-frameP format + int common_mbsfn_alloc_offset = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->radioframeAllocationOffset; + int common_mbsfn_period = 1 << UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->radioframeAllocationPeriod; + int commonSF_AllocPeriod = 4 << UE_mac_inst[module_idP].commonSF_AllocPeriod_r9; + + uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[2] | + (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[1]<<8) | + (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]<<16); + + int jj = frameP % 4; + if ((frameP % common_mbsfn_period) != (common_mbsfn_alloc_offset + jj)) + continue; + + if(UE_mac_inst[module_idP].tdd_Config == NULL){ + switch (subframe) { + case 1: + if ((common_mbsfn_SubframeConfig & (0x800000 >> (jj*6))) == (0x800000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);//48; + } + break; + case 2: + if ((common_mbsfn_SubframeConfig & (0x400000 >> (jj*6))) == (0x400000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);//48; + } + break; + case 3: + if ((common_mbsfn_SubframeConfig & (0x200000 >> (jj*6))) == (0x200000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);//48; + } + break; + case 6: + if ((common_mbsfn_SubframeConfig & (0x100000 >> (jj*6))) == (0x100000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);//48; + } + break; + case 7: + if ((common_mbsfn_SubframeConfig & (0x80000 >> (jj*6))) == (0x80000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);//48; + } + break; + case 8: + if ((common_mbsfn_SubframeConfig & (0x40000 >> (jj*6))) == (0x40000 >> (jj*6))) { + mtch_flag = 1; + mtch_mcs = ue_query_p_mch_info(module_idP,frameP,subframe,common_mbsfn_period,common_mbsfn_alloc_offset,UE_mac_inst[module_idP].common_num_sf_alloc,mtch_active,msi_active,mch_lcid); + UE_mac_inst[module_idP].common_num_sf_alloc++; + UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc% ( num_sf_alloc*commonSF_AllocPeriod/common_mbsfn_period);//48; + } + break; + } + } else { + // TODO TDD + } + if (mtch_flag == 1) + break; + } - if (UE_mac_inst[module_idP].pmch_Config[0]) { - // Find the first subframe in this MCH to transmit MSI - if (frameP % mch_scheduling_period == - UE_mac_inst[module_idP]. - mbsfn_SubframeConfig - [j]->radioframeAllocationOffset) { - while (ii == 0) { - ii = UE_mac_inst[module_idP]. - mbsfn_SubframeConfig[j]-> - subframeAllocation.choice. - oneFrame.buf[0] & (0x80 >> msi_pos); - msi_pos++; - } - } - } + return mtch_mcs; +} - if (UE_mac_inst[module_idP].tdd_Config == NULL) - frame_FDD = 1; - else - frame_FDD = 0; - // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 - switch (subframe) { - case 1: - if (frame_FDD == 1) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { - if (msi_pos == 1) { - msi_flag = 1; - } +int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_t subframe, uint8_t eNB_index,uint8_t *sync_area, uint8_t *mcch_active) +{ - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF1) == - MBSFN_FDD_SF1)) { - mcch_flag = 1; - } + int i = 0, j = 0, ii = 0, jj = 0, msi_pos = 0, mcch_mcs = -1, mtch_mcs = -1; + int mcch_flag = 0, mtch_flag = 0, msi_flag = 0; + long mch_scheduling_period = -1; + uint8_t mch_lcid = 0; - mtch_flag = 1; - } - } +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].ue_query_mch); +#endif - break; + if (UE_mac_inst[module_idP].pmch_Config[0]) { + mch_scheduling_period = 8 << UE_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9; + } - case 2: - if (frame_FDD == 1) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { - if (msi_pos == 2) { - msi_flag = 1; - } + for (i = 0; + i < UE_mac_inst[module_idP].num_active_mbsfn_area; + i++ ) + { + // assume, that there is always a mapping + if ((j = ue_get_mbsfn_sf_alloction(module_idP,i,eNB_index)) == -1) { + return -1; // continue; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF2) == - MBSFN_FDD_SF2)) { - mcch_flag = 1; - } + ii = 0; + msi_pos = 0; + + long mbsfn_period = 1 << UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationPeriod; + long mbsfn_alloc_offset = UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset; + long mcch_period = 32 << UE_mac_inst[module_idP].mbsfn_AreaInfo[j]->mcch_Config_r9.mcch_RepetitionPeriod_r9; + long mcch_offset = UE_mac_inst[module_idP].mbsfn_AreaInfo[j]->mcch_Config_r9.mcch_Offset_r9; - mtch_flag = 1; - } - } + LOG_D(MAC, + "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %ld, mcch period %ld,mac sched period (%ld,%ld))\n", + module_idP,frameP, subframe,i,UE_mac_inst[module_idP].num_active_mbsfn_area, + j,UE_mac_inst[module_idP].num_sf_allocation_pattern,mbsfn_period,mcch_period, + mcch_offset,mbsfn_alloc_offset); + + // get the real MCS value + switch (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { + case 0: + mcch_mcs = 2; + break; - break; + case 1: + mcch_mcs = 7; + break; - case 3: - if (frame_FDD == 0) { //TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { - if (msi_pos == 1) { - msi_flag = 1; - } + case 2: + mcch_mcs = 13; + break; - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_TDD_SF3) == - MBSFN_TDD_SF3)) { - mcch_flag = 1; - } + case 3: + mcch_mcs = 19; + break; + } - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { - if (msi_pos == 3) { - msi_flag = 1; - } + if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format + if (frameP % mbsfn_period == mbsfn_alloc_offset) { // MBSFN frameP - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF3) == - MBSFN_FDD_SF3)) { - mcch_flag = 1; - } + if (UE_mac_inst[module_idP].pmch_Config[0]) { + // Find the first subframe in this MCH to transmit MSI + if (frameP % mch_scheduling_period == mbsfn_alloc_offset) { + while (ii == 0) { + ii = UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80 >> msi_pos); + msi_pos++; + } + } + } + + // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 + switch (subframe) { + case 1: + if (UE_mac_inst[module_idP].tdd_Config == NULL) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { + if (msi_pos == 1) { + msi_flag = 1; + } + + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } + break; - break; + case 2: + if (UE_mac_inst[module_idP].tdd_Config == NULL) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { + if (msi_pos == 2) { + msi_flag = 1; + } - case 4: - if (frame_FDD == 0) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { - if (msi_pos == 2) { - msi_flag = 1; - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2)) { + mcch_flag = 1; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_TDD_SF4) == - MBSFN_TDD_SF4)) { - mcch_flag = 1; - } + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } + break; - break; + case 3: + if (UE_mac_inst[module_idP].tdd_Config != NULL) { // TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { + if (msi_pos == 1) { + msi_flag = 1; + } - case 6: - if (frame_FDD == 1) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { - if (msi_pos == 4) { - msi_flag = 1; - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3)) { + mcch_flag = 1; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF6) == - MBSFN_FDD_SF6)) { - mcch_flag = 1; - } + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { + if (msi_pos == 3) { + msi_flag = 1; + } + + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } + break; - break; + case 4: + if (UE_mac_inst[module_idP].tdd_Config != NULL) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { + if (msi_pos == 2) { + msi_flag = 1; + } - case 7: - if (frame_FDD == 0) { // TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { - if (msi_pos == 3) { - msi_flag = 1; - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4)) { + mcch_flag = 1; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_TDD_SF7) == - MBSFN_TDD_SF7)) { - mcch_flag = 1; - } + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { - if (msi_pos == 5) { - msi_flag = 1; - } + break; - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF7) == - MBSFN_FDD_SF7)) { - mcch_flag = 1; - } + case 6: + if (UE_mac_inst[module_idP].tdd_Config == NULL) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { + if (msi_pos == 4) { + msi_flag = 1; + } - mtch_flag = 1; - } - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6)) { + mcch_flag = 1; + } - break; + mtch_flag = 1; + } + } - case 8: - if (frame_FDD == 0) { //TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { - if (msi_pos == 4) { - msi_flag = 1; - } + break; - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_TDD_SF8) == - MBSFN_TDD_SF8)) { - mcch_flag = 1; - } + case 7: + if (UE_mac_inst[module_idP].tdd_Config != NULL) { // TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { + if (msi_pos == 3) { + msi_flag = 1; + } - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { - if (msi_pos == 6) { - msi_flag = 1; - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7)) { + mcch_flag = 1; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_FDD_SF8) == - MBSFN_FDD_SF8)) { - mcch_flag = 1; - } + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { + if (msi_pos == 5) { + msi_flag = 1; + } + + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } + break; - break; + case 8: + if (UE_mac_inst[module_idP].tdd_Config != NULL) { //TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { + if (msi_pos == 4) { + msi_flag = 1; + } - case 9: - if (frame_FDD == 0) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig - [j]->subframeAllocation.choice.oneFrame. - buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { - if (msi_pos == 5) { - msi_flag = 1; - } + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8)) { + mcch_flag = 1; + } - if ((frameP % mcch_period == - UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.mcch_Offset_r9) - && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo - [i]->mcch_Config_r9.sf_AllocInfo_r9. - buf[0] & MBSFN_TDD_SF9) == - MBSFN_TDD_SF9)) { - mcch_flag = 1; - } + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { + if (msi_pos == 6) { + msi_flag = 1; + } + + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } - mtch_flag = 1; - } - } + break; - break; - } // end switch + case 9: + if (UE_mac_inst[module_idP].tdd_Config != NULL) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { + if (msi_pos == 5) { + msi_flag = 1; + } - // sf allocation is non-overlapping - if ((msi_flag == 1) || (mcch_flag == 1) - || (mtch_flag == 1)) { - LOG_D(MAC, - "[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", - module_idP, frameP, subframe, i, j, msi_flag, - mcch_flag, mtch_flag); + if ((frameP % mcch_period == mcch_offset) && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + }// end switch + + // Acount for sf_allocable in CSA + int num_sf_alloc = 0; + for (i = 0; i < 8; i++) { + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] == NULL) + continue; + + if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.present != MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) + continue; + + uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]; + for (j = 0; j < 6; j++) + num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x80 >> j)) == (0x80 >> j)); + } + + for (i = 0; i < 28; i++) { + if (UE_mac_inst[module_idP].pmch_stop_mtch[i] >= num_sf_alloc) { + if (UE_mac_inst[module_idP].pmch_stop_mtch[i] != 2047) { + if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL) + mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9; + else + mtch_mcs = -1; + mch_lcid = (uint8_t)i; + break; + } + } + } + + // sf allocation is non-overlapping + if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)) { + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, frameP, subframe,i,j,msi_flag,mcch_flag,mtch_flag); + + *sync_area=i; + break; + } + } + } else { // four-frameP format + uint32_t mbsfn_SubframeConfig = UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[2] | + (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[1]<<8) | + (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0]<<16); + uint32_t MCCH_mbsfn_SubframeConfig = /* UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[2] | + (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[1]<<8) | */ + (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0]<<16); + + jj=frameP%4; + if ((frameP % mbsfn_period) == (mbsfn_alloc_offset+jj)) { + if (UE_mac_inst[module_idP].tdd_Config == NULL) { + switch (subframe) { + case 1: + if ((mbsfn_SubframeConfig & (0x800000>>(jj*6))) == (0x800000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x800000>>(jj*6))) == (0x800000>>(jj*6)))) { + mcch_flag=1; + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x800000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + } + } + break; + case 2: + if ((mbsfn_SubframeConfig & (0x400000>>(jj*6))) == (0x400000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x400000>>(jj*6))) == (0x400000>>(jj*6)))) { + mcch_flag=1; + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x400000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + } + } + break; + case 3: + if ((mbsfn_SubframeConfig & (0x200000>>(jj*6))) == (0x200000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x200000>>(jj*6))) == (0x200000>>(jj*6)))) { + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x200000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + mcch_flag=1; + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + } + } + break; + case 6: + if ((mbsfn_SubframeConfig & (0x100000>>(jj*6))) == (0x100000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x100000>>(jj*6))) == (0x100000>>(jj*6)))) { + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x100000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + mcch_flag=1; + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + } + } + break; + case 7: + if ((mbsfn_SubframeConfig & (0x80000>>(jj*6))) == (0x80000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x80000>>(jj*6))) == (0x80000>>(jj*6)))) { + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x80000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + mcch_flag=1; + } + } + break; + case 8: + if ((mbsfn_SubframeConfig & (0x40000>>(jj*6))) == (0x40000>>(jj*6))) { + if ((frameP % mcch_period == (mcch_offset+jj)) && ((MCCH_mbsfn_SubframeConfig & (0x40000>>(jj*6))) == (0x40000>>(jj*6)))) { + LOG_D(MAC,"frameP(%d),mcch_period(%ld),mbsfn_SubframeConfig(%x),MCCH_mbsfn_SubframeConfig(%x),mask(%x),jj(%d),num_sf_alloc(%d)\n", + frameP, mcch_period, mbsfn_SubframeConfig, MCCH_mbsfn_SubframeConfig, (0x40000>>(jj*6)), jj, UE_mac_inst[module_idP].common_num_sf_alloc); + if(UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]==NULL) + UE_mac_inst[module_idP].common_num_sf_alloc++; + mcch_flag=1; + } + } + break; + }// end switch + } else { + // TODO TDD + } + + mtch_mcs = ue_query_p_mch(module_idP, frameP, subframe, &mtch_flag, &msi_flag, &mch_lcid); + + // sf allocation is non-overlapping + if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)) { + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, frameP, subframe,i,j,msi_flag,mcch_flag,mtch_flag); + *sync_area=i; + break; + } + } + } + } // end of for - *sync_area = i; - break; - } - } else { // four-frameP format - } - } - } // end of for #if UE_TIMING_TRACE - stop_meas(&UE_mac_inst[module_idP].ue_query_mch); + stop_meas(&UE_mac_inst[module_idP].ue_query_mch); #endif - if ((mcch_flag == 1)) { // || (msi_flag==1)) - *mcch_active = 1; - } + if ((mcch_flag == 1)) { // || (msi_flag==1)) + *mcch_active = 1; + } - if ((mcch_flag == 1) - || ((msi_flag == 1) && (UE_mac_inst[module_idP].mcch_status == 1))) { - return mcch_mcs; - } else if ((mtch_flag == 1) - && (UE_mac_inst[module_idP].msi_status == 1)) { - return UE_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; + if ( (mcch_flag==1) || ((msi_flag==1) && (UE_mac_inst[module_idP].mcch_status==1)) ) { + if (msi_flag!=1) { + for (i=0; i<8; i++) + UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] = NULL; + for (i=0; i<15; i++) + UE_mac_inst[module_idP].pmch_Config[i] = NULL; + for (i=0; i<28 ;i++) { + UE_mac_inst[module_idP].pmch_lcids[i] = -1; + UE_mac_inst[module_idP].pmch_stop_mtch[i] = 2047; + UE_mac_inst[module_idP].msi_status_v[i] = 0; + } } else { - return -1; + for (i=0; i<28; i++) { + UE_mac_inst[module_idP].pmch_lcids[i] = -1; + UE_mac_inst[module_idP].pmch_stop_mtch[i] = 2047; + UE_mac_inst[module_idP].msi_status_v[i] = 0; + } } + return mcch_mcs; + } else if ((mtch_flag==1) && (UE_mac_inst[module_idP].msi_status_v[(mch_lcid > 27) ? 27 : mch_lcid] == 1)) { + return mtch_mcs; + } else { + return -1; + } } #endif @@ -2255,7 +2469,7 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, #endif if (opt_enabled) { - trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, + trace_pdu(DIRECTION_UPLINK, ulsch_buffer, buflen, module_idP, WS_C_RNTI, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index e12fb80e1bda913de5e770730d3fe9ca97aa9ba6..4731039c1a949d3c097dd643ad812ab9ac48efc5 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -30,6 +30,8 @@ #define PDCP_C //#define DEBUG_PDCP_FIFO_FLUSH_SDU +#define MBMS_MULTICAST_OUT + #include "assertions.h" #include "hashtable.h" #include "pdcp.h" @@ -66,6 +68,17 @@ extern int otg_enabled; #include "common/ran_context.h" extern RAN_CONTEXT_t RC; +#ifdef MBMS_MULTICAST_OUT +# include <sys/types.h> +# include <sys/socket.h> +# include <netinet/in.h> +# include <netinet/ip.h> +# include <netinet/udp.h> +# include <unistd.h> + +static int mbms_socket = -1; +#endif + //----------------------------------------------------------------------------- /* * If PDCP_UNIT_TEST is set here then data flow between PDCP and RLC is broken @@ -349,16 +362,10 @@ boolean_t pdcp_data_req( * Ask sublayer to transmit data and check return value * to see if RLC succeeded */ -#ifdef PDCP_MSG_PRINT - int i=0; - LOG_F(PDCP,"[MSG] PDCP DL %s PDU on rb_id %d\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP); - for (i = 0; i < pdcp_pdu_size; i++) { - LOG_F(PDCP,"%02x ", ((uint8_t*)pdcp_pdu_p->data)[i]); - } + LOG_DUMPMSG(PDCP,DEBUG_PDCP,(char *)pdcp_pdu_p->data,pdcp_pdu_size, + "[MSG] PDCP DL %s PDU on rb_id %d\n",(srb_flagP)? "CONTROL" : "DATA", rb_idP); - LOG_F(PDCP,"\n"); -#endif rlc_status = rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0)) ,sourceL2Id @@ -461,17 +468,8 @@ pdcp_data_ind( VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_IN); - -#ifdef PDCP_MSG_PRINT - int i=0; - LOG_F(PDCP,"[MSG] PDCP UL %s PDU on rb_id %d\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP); - - for (i = 0; i < sdu_buffer_sizeP; i++) { - LOG_F(PDCP,"%02x ", ((uint8_t*)sdu_buffer_pP->data)[i]); - } - - LOG_F(PDCP,"\n"); -#endif + LOG_DUMPMSG(PDCP,DEBUG_PDCP,(char *)sdu_buffer_pP->data,sdu_buffer_sizeP, + "[MSG] PDCP UL %s PDU on rb_id %d\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP); #if T_TRACER if (ctxt_pP->enb_flag != ENB_FLAG_NO) @@ -758,11 +756,26 @@ pdcp_data_ind( packet_forwarded = FALSE; #endif +#ifdef MBMS_MULTICAST_OUT + if ((MBMS_flagP != 0) && (mbms_socket != -1)) { + struct iphdr *ip_header = (struct iphdr*)&sdu_buffer_pP->data[payload_offset]; + struct udphdr *udp_header = (struct udphdr*)&sdu_buffer_pP->data[payload_offset + sizeof(struct iphdr)]; + struct sockaddr_in dest_addr; + + dest_addr.sin_family = AF_INET; + dest_addr.sin_port = udp_header->dest; + dest_addr.sin_addr.s_addr = ip_header->daddr; + + sendto(mbms_socket, &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset, MSG_DONTWAIT, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); + packet_forwarded = TRUE; + } +#endif + if (FALSE == packet_forwarded) { new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), __func__); if (new_sdu_p) { - if (pdcp_p->rlc_mode == RLC_MODE_AM ) { + if ((MBMS_flagP == 0) && (pdcp_p->rlc_mode == RLC_MODE_AM)) { pdcp_p->last_submitted_pdcp_rx_sn = sequence_number; } @@ -803,7 +816,6 @@ pdcp_data_ind( } - } /* Print octets of incoming data in hexadecimal form */ LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n", @@ -839,13 +851,14 @@ pdcp_data_ind( #if defined(STOP_ON_IP_TRAFFIC_OVERLOAD) - else { - AssertFatal(0, PROTOCOL_PDCP_CTXT_FMT" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n", - PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p)); - } - + else { + AssertFatal(0, PROTOCOL_PDCP_CTXT_FMT" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY \n", + PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p)); + } #endif + } + free_mem_block(sdu_buffer_pP, __func__); if (ctxt_pP->enb_flag) { @@ -1458,8 +1471,12 @@ rrc_pdcp_config_asn1_req ( for (j=0; j<mbms_SessionInfoList_r9_p->list.count; j++) { MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j]; - lc_id = MBMS_SessionInfo_p->sessionId_r9->buf[0]; + if (MBMS_SessionInfo_p->sessionId_r9) + lc_id = MBMS_SessionInfo_p->sessionId_r9->buf[0]; + else + lc_id = MBMS_SessionInfo_p->logicalChannelIdentity_r9; mch_id = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string +// mch_id = j; // can set the mch_id = i if (ctxt_pP->enb_flag) { @@ -1480,6 +1497,14 @@ rrc_pdcp_config_asn1_req ( } } + LOG_D(PDCP, "lc_id (%02ld) mch_id(%02x,%02x,%02x) drb_id(%ld) action(%d)\n", + lc_id, + MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[0], + MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[1], + MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2], + drb_id, + action); + pdcp_config_req_asn1 ( ctxt_pP, NULL, // unused for MBMS @@ -2018,6 +2043,12 @@ void pdcp_layer_init(void) #endif } +#ifdef MBMS_MULTICAST_OUT + mbms_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); + if (mbms_socket == -1) + LOG_W(PDCP, "Could not create RAW socket, MBMS packets will not be put to the network\n"); +#endif + LOG_I(PDCP, "PDCP layer has been initialized\n"); pdcp_output_sdu_bytes_to_write=0; @@ -2068,6 +2099,12 @@ void pdcp_layer_cleanup (void) { list_free (&pdcp_sdu_list); hashtable_destroy(pdcp_coll_p); +#ifdef MBMS_MULTICAST_OUT + if(mbms_socket != -1) { + close(mbms_socket); + mbms_socket = -1; + } +#endif } #ifdef PDCP_USE_RT_FIFO diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index b9e605ca24dbea29d60d414b835386c8cc9924c2..92409d96dcfc4f0eb877a33af061f87480a0440a 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -760,10 +760,10 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) 0, MSC_AS_TIME_FMT" DATA-REQ inst %u rb %u rab %u size %u", MSC_AS_TIME_ARGS(ctxt_pP), - pc5s_header.inst, - pc5s_header.rb_id, + pc5s_header->inst, + pc5s_header->rb_id, rab_id, - pc5s_header.data_size); + pc5s_header->data_size); pdcp_data_req( &ctxt, @@ -787,10 +787,10 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) 0, MSC_AS_TIME_FMT" DATA-REQ inst %u rb %u rab %u size %u", MSC_AS_TIME_ARGS(ctxt_pP), - pc5s_header.inst, - pc5s_header.rb_id, + pc5s_header->inst, + pc5s_header->rb_id, rab_id, - pc5s_header.data_size); + pc5s_header->data_size); LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u][UE %u][RB %u] NON INSTANCIATED INSTANCE key 0x%"PRIx64", DROPPED\n", ctxt.frame, diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index ff49b2d056f12f2e07a6a642322411e0841c5398..8c557188a2a2e115300b7ea9d15ef4032da49e1e 100644 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -208,7 +208,7 @@ rlc_mbms_id_t rlc_mbms_lcid2service_session_id_eNB[MAX_eNB][RLC_MAX_MBMS_ #define rlc_mbms_ue_get_lcid_by_rb_id(uE_mOD,rB_iD) rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] #define rlc_mbms_ue_set_lcid_by_rb_id(uE_mOD,rB_iD,lOG_cH_iD) do { \ - AssertFatal(rB_iD<NB_RB_MAX, "INVALID RB ID %u", rB_iD); \ + AssertFatal(rB_iD<NB_RB_MBMS_MAX, "INVALID RB ID %u", rB_iD); \ rlc_mbms_rbid2lcid_ue[uE_mOD][rB_iD] = lOG_cH_iD; \ } while (0); diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index aa00ffb773c876f4c8e99edac83394794e457822..8977e422b60591d100fd809aa36643c090469cb2 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -414,9 +414,13 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP for (j=0; j<mbms_SessionInfoList_r9_p->list.count; j++) { MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j]; - mbms_session_id = MBMS_SessionInfo_p->sessionId_r9->buf[0]; + if (MBMS_SessionInfo_p->sessionId_r9) + mbms_session_id = MBMS_SessionInfo_p->sessionId_r9->buf[0]; + else + mbms_session_id = MBMS_SessionInfo_p->logicalChannelIdentity_r9; lc_id = mbms_session_id; mbms_service_id = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string +// mbms_service_id = j; // can set the mch_id = i if (ctxt_pP->enb_flag) { diff --git a/openair2/NETWORK_DRIVER/LITE/common.c b/openair2/NETWORK_DRIVER/LITE/common.c index 0d616d5764fa16e47ec5971b8f81346c54d110c8..2ae6f5279d12ce5f2be1f2b1d36ee59d5ddfbef2 100644 --- a/openair2/NETWORK_DRIVER/LITE/common.c +++ b/openair2/NETWORK_DRIVER/LITE/common.c @@ -333,7 +333,7 @@ void oai_nw_drv_common_class_wireless2ip(uint16_t dlen, printk("\n"); #endif //OAI_DRV_DEBUG_RECEIVE - netif_rx(skb); + netif_rx_ni(skb); #ifdef OAI_DRV_DEBUG_RECEIVE printk("[OAI_IP_DRV][%s] end\n",__FUNCTION__); #endif diff --git a/openair2/NETWORK_DRIVER/MESH/common.c b/openair2/NETWORK_DRIVER/MESH/common.c index d380b8a4d829cf31bf1369996d05de279cab73a5..1c7b8e4d123d41c11b1dfb9f5b47ffc916d8d997 100644 --- a/openair2/NETWORK_DRIVER/MESH/common.c +++ b/openair2/NETWORK_DRIVER/MESH/common.c @@ -309,7 +309,7 @@ void nas_COMMON_receive(uint16_t dlen, printk("\n"); #endif //NAS_DEBUG_RECEIVE - netif_rx(skb); + netif_rx_ni(skb); #ifdef NAS_DEBUG_RECEIVE printk("NAS_COMMON_RECEIVE: end\n"); #endif diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index f8a420697a95d043d2f5870d2c55ca8279567ed5..f5d31742bc400c4cc055d8950ae633c65b9beec0 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -324,7 +324,11 @@ static const struct net_device_ops nasmesh_netdev_ops = { .ndo_set_mac_address = NULL, .ndo_set_config = nas_set_config, .ndo_do_ioctl = nas_CTL_ioctl, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = nas_change_mtu, +#else .ndo_change_mtu = nas_change_mtu, +#endif .ndo_tx_timeout = nas_tx_timeout, }; diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c index 84f425ef3c004646069f1e0496620a6cca4327a9..b21ca5f2dcc7bd9c8fab015f9f95d5b546fa4b77 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/common.c +++ b/openair2/NETWORK_DRIVER/UE_IP/common.c @@ -222,7 +222,7 @@ skb_p->mark = rb_idP; printk("\n"); #endif //OAI_DRV_DEBUG_RECEIVE - netif_rx(skb_p); + netif_rx_ni(skb_p); #ifdef OAI_DRV_DEBUG_RECEIVE printk("[UE_IP_DRV][%s] end\n",__FUNCTION__); #endif diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index d9a91496859a70cb62c4d699206ce5178f259dfe..47c820fe775330dd0aa9de35052667f31e4b0266 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -349,7 +349,11 @@ static const struct net_device_ops ue_ip_netdev_ops = { .ndo_set_mac_address = ue_ip_set_mac_address, .ndo_set_config = ue_ip_set_config, .ndo_do_ioctl = NULL, - .ndo_change_mtu = ue_ip_change_mtu, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = ue_ip_change_mtu, +#else + .ndo_change_mtu = ue_ip_change_mtu, +#endif .ndo_tx_timeout = ue_ip_tx_timeout, .ndo_change_rx_flags = ue_ip_change_rx_flags, }; diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c index a7c96a8a22f201d19fe1dc2e63eaa59009745a92..d201732177733f67cc61cfc0ff877d06b21f7c6f 100644 --- a/openair2/RRC/LTE/L2_interface.c +++ b/openair2/RRC/LTE/L2_interface.c @@ -43,9 +43,6 @@ #include "flexran_agent_extern.h" -//#define RRC_DATA_REQ_DEBUG -//#define DEBUG_RRC 1 - extern RAN_CONTEXT_t RC; @@ -68,10 +65,9 @@ mac_rrc_data_req( uint8_t sfn = (uint8_t)((frameP>>2)&0xff); -#ifdef DEBUG_RRC - int i; - LOG_I(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); -#endif + if (LOG_DEBUGFLAG(DEBUG_RRC)) { + LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); + } eNB_RRC_INST *rrc; rrc_eNB_carrier_data_t *carrier; @@ -96,15 +92,15 @@ mac_rrc_data_req( RC.rrc[Mod_idP]->carrier[CC_id].SIB1, RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1); -#ifdef DEBUG_RRC - LOG_T(RRC,"[eNB %d] Frame %d : BCCH request => SIB 1\n",Mod_idP,frameP); + if (LOG_DEBUGFLAG(DEBUG_RRC)) { + LOG_T(RRC,"[eNB %d] Frame %d : BCCH request => SIB 1\n",Mod_idP,frameP); - for (i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1; i++) { - LOG_T(RRC,"%x.",buffer_pP[i]); - } + for (int i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1; i++) { + LOG_T(RRC,"%x.",buffer_pP[i]); + } - LOG_T(RRC,"\n"); -#endif + LOG_T(RRC,"\n"); + } /* LOG_DEBUGFLAG(DEBUG_RRC) */ return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1); } // All RFN mod 8 transmit SIB2-3 in SF 5 @@ -113,15 +109,15 @@ mac_rrc_data_req( RC.rrc[Mod_idP]->carrier[CC_id].SIB23, RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23); -#ifdef DEBUG_RRC - LOG_T(RRC,"[eNB %d] Frame %d BCCH request => SIB 2-3\n",Mod_idP,frameP); + if (LOG_DEBUGFLAG(DEBUG_RRC)) { + LOG_T(RRC,"[eNB %d] Frame %d BCCH request => SIB 2-3\n",Mod_idP,frameP); - for (i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23; i++) { - LOG_T(RRC,"%x.",buffer_pP[i]); - } + for (int i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23; i++) { + LOG_T(RRC,"%x.",buffer_pP[i]); + } - LOG_T(RRC,"\n"); -#endif + LOG_T(RRC,"\n"); + } /* LOG_DEBUGFLAG(DEBUG_RRC) */ return(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23); } else { return(0); @@ -193,20 +189,17 @@ mac_rrc_data_req( RC.rrc[Mod_idP]->carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); -#ifdef DEBUG_RRC - LOG_D(RRC,"[eNB %d] Frame %d : MCCH request => MCCH_MESSAGE \n",Mod_idP,frameP); + if (LOG_DEBUGFLAG(DEBUG_RRC)) { + LOG_D(RRC,"[eNB %d] Frame %d : MCCH request => MCCH_MESSAGE \n",Mod_idP,frameP); - for (i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; i++) { - LOG_T(RRC,"%x.",buffer_pP[i]); - } + for (int i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; i++) { + LOG_T(RRC,"%x.",buffer_pP[i]); + } - LOG_T(RRC,"\n"); -#endif + LOG_T(RRC,"\n"); + } /* LOG_DEBUGFLAG(DEBUG_RRC) */ - return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); - // } - //else - //return(0); + return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); } #endif // #if (RRC_VERSION >= MAKE_VERSION(10, 0, 0)) @@ -329,7 +322,7 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, rntiP, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED); } -// rrc_mac_remove_ue(Mod_instP,rntiP); + rrc_mac_remove_ue(Mod_instP,rntiP); } void mac_eNB_rrc_uplane_failure(const module_id_t Mod_instP, diff --git a/openair2/RRC/LTE/L2_interface_ue.c b/openair2/RRC/LTE/L2_interface_ue.c index d3527b8a17e619119399ab1d557c1e4a89b2d653..3b7219af42913d844ca30f96a8029cc85aab60a6 100644 --- a/openair2/RRC/LTE/L2_interface_ue.c +++ b/openair2/RRC/LTE/L2_interface_ue.c @@ -42,7 +42,6 @@ #endif //#define RRC_DATA_REQ_DEBUG -//#define DEBUG_RRC 1 @@ -61,10 +60,7 @@ mac_rrc_data_req_ue( //-------------------------------------------------------------------------- { -#ifdef DEBUG_RRC - int i; - LOG_I(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); -#endif + LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0)) diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c index 66aae4237ab2d5103f2431fefc9ae44ba8bb607e..3a1e7eed87d9bb64b88bf85a8e2a02fd8b18b6b3 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c @@ -91,7 +91,6 @@ #define msg printf #endif -//#define XER_PRINT typedef struct xer_sprint_string_s { char *string; @@ -1353,9 +1352,9 @@ uint8_t do_SIB23(uint8_t Mod_id, } #endif -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message, (void*)bcch_message); + } enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_DL_SCH_Message, NULL, (void*)bcch_message, @@ -1607,9 +1606,9 @@ uint8_t do_SidelinkUEInformation(uint8_t Mod_id, uint8_t *buffer, SL_Destinatio break; } -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, @@ -2165,9 +2164,9 @@ do_RRCConnectionSetup( #endif -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message, NULL, (void*)&dl_ccch_msg, @@ -2240,9 +2239,9 @@ do_SecurityModeCommand( dl_dcch_msg.message.choice.c1.choice.securityModeCommand.criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm = (e_SecurityAlgorithmConfig__integrityProtAlgorithm)integrityProtAlgorithm; -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_DCCH_Message, (void*)&dl_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_DCCH_Message, (void*)&dl_dcch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_DCCH_Message, NULL, (void*)&dl_dcch_msg, @@ -2320,9 +2319,9 @@ do_UECapabilityEnquiry( ASN_SEQUENCE_ADD(&dl_dcch_msg.message.choice.c1.choice.ueCapabilityEnquiry.criticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list, &rat); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_DCCH_Message, (void*)&dl_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_DCCH_Message, (void*)&dl_dcch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_DCCH_Message, NULL, (void*)&dl_dcch_msg, @@ -2539,9 +2538,9 @@ do_RRCConnectionReconfiguration( enc_rval.failed_type->name, enc_rval.encoded); return -1; } -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void*)&dl_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void*)&dl_dcch_msg); + } #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) @@ -2742,9 +2741,9 @@ do_RRCConnectionReestablishment( rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.nonCriticalExtension = NULL; -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message, NULL, (void*)&dl_ccch_msg, @@ -2804,9 +2803,9 @@ do_RRCConnectionReestablishmentReject( // RRCConnectionReestablishmentReject rrcConnectionReestablishmentReject->criticalExtensions.present = RRCConnectionReestablishmentReject__criticalExtensions_PR_rrcConnectionReestablishmentReject_r8; -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message, NULL, (void*)&dl_ccch_msg, @@ -2867,9 +2866,9 @@ do_RRCConnectionReject( /* let's put a wait time of 1s for the moment */ rrcConnectionReject->criticalExtensions.choice.c1.choice.rrcConnectionReject_r8.waitTime = 1; -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message, NULL, (void*)&dl_ccch_msg, @@ -3061,9 +3060,9 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, */ ASN_SEQUENCE_ADD(&(*mbsfnAreaConfiguration)->pmch_InfoList_r9.list,pmch_Info_1); -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_MCCH_Message,(void*)mcch_message); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_MCCH_Message,(void*)mcch_message); + } enc_rval = uper_encode_to_buffer(&asn_DEF_MCCH_Message, NULL, (void*)mcch_message, @@ -3339,9 +3338,9 @@ uint8_t do_Paging(uint8_t Mod_id, uint8_t *buffer, ue_paging_identity_t ue_pagin enc_rval.failed_type->name, enc_rval.encoded); return -1; } -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_PCCH_Message, (void*)&pcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_PCCH_Message, (void*)&pcch_msg); + } return((enc_rval.encoded+7)/8); } @@ -3504,9 +3503,9 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) } UECapability.UE_EUTRA_Capability = UE_EUTRA_Capability; -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_UE_EUTRA_Capability,(void *)UE_EUTRA_Capability); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_UE_EUTRA_Capability,(void *)UE_EUTRA_Capability); + } enc_rval = uper_encode_to_buffer(&asn_DEF_UE_EUTRA_Capability, NULL, (void*)UE_EUTRA_Capability, diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c index cdfc1ac0f355ef068e18d677ddf2e4ccf371b00f..20962f3ca159741224898017637a3400df005c90 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c @@ -136,7 +136,7 @@ uint8_t do_MIB_NB_IoT( carrier->MIB_NB_IoT, 100); if(enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -382,9 +382,9 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id, ASN_SEQUENCE_ADD(&(*sib1_NB_IoT)->systemInfoValueTagList_r13->list,&systemInfoValueTagSI); -#ifdef XER_PRINT //generate xml files - xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message_NB, (void*)bcch_message); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message_NB, (void*)bcch_message); + } enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_DL_SCH_Message_NB, @@ -394,7 +394,7 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id, 100); if (enc_rval.encoded > 0){ - LOG_F(RRC,"ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC,"ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -667,9 +667,9 @@ uint8_t do_SIB23_NB_IoT(uint8_t Mod_id, ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation_r13.criticalExtensions.choice.systemInformation_r13.sib_TypeAndInfo_r13.list, sib3_NB_part); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message_NB, (void*)bcch_message); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_BCCH_DL_SCH_Message_NB, (void*)bcch_message); + } enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_DL_SCH_Message_NB, NULL, (void*)bcch_message, @@ -887,9 +887,9 @@ uint8_t do_RRCConnectionSetup_NB_IoT( rrcConnectionSetup_NB_IoT->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r13.radioResourceConfigDedicated_r13.physicalConfigDedicated_r13 = physicalConfigDedicated2_NB_IoT; rrcConnectionSetup_NB_IoT->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r13.radioResourceConfigDedicated_r13.mac_MainConfig_r13 = NULL; -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message_NB, (void*)&dl_ccch_msg_NB_IoT); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message_NB, NULL, (void*)&dl_ccch_msg_NB_IoT, @@ -897,7 +897,7 @@ uint8_t do_RRCConnectionSetup_NB_IoT( 100); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -939,16 +939,16 @@ uint8_t do_SecurityModeCommand_NB_IoT( = (e_SecurityAlgorithmConfig__integrityProtAlgorithm)integrityProtAlgorithm; //only changed "asn_DEF_DL_DCCH_Message_NB" -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_DCCH_Message_NB, (void*)&dl_dcch_msg_NB_IoT); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_DCCH_Message_NB, (void*)&dl_dcch_msg_NB_IoT); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_DCCH_Message_NB, NULL, (void*)&dl_dcch_msg_NB_IoT, buffer, 100); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -1001,16 +1001,16 @@ uint8_t do_UECapabilityEnquiry_NB_IoT( //no ue_CapabilityRequest (list of RAT_Type) //only changed "asn_DEF_DL_DCCH_Message_NB" -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_DCCH_Message_NB, (void*)&dl_dcch_msg_NB_IoT); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_DCCH_Message_NB, (void*)&dl_dcch_msg_NB_IoT); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_DCCH_Message_NB, NULL, (void*)&dl_dcch_msg_NB_IoT, buffer, 100); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -1105,14 +1105,14 @@ uint16_t do_RRCConnectionReconfiguration_NB_IoT( buffer, RRC_BUF_SIZE); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed %s, %li\n", + LOG_E(RRC, "ASN1 message encoding failed %s, %li\n", enc_rval.failed_type->name, enc_rval.encoded); } //changed only asn_DEF_DL_DCCH_Message_NB -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_DL_DCCH_Message_NB,(void*)&dl_dcch_msg_NB_IoT); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_DL_DCCH_Message_NB,(void*)&dl_dcch_msg_NB_IoT); + } //#if defined(ENABLE_ITTI) //# if !defined(DISABLE_XER_SPRINT)... @@ -1143,16 +1143,16 @@ uint8_t do_RRCConnectionReestablishmentReject_NB_IoT( rrcConnectionReestablishmentReject->criticalExtensions.present = RRCConnectionReestablishmentReject__criticalExtensions_PR_rrcConnectionReestablishmentReject_r8; //Only change in "asn_DEF_DL_CCCH_Message_NB" -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message_NB, (void*)&dl_ccch_msg_NB_IoT); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message_NB, (void*)&dl_ccch_msg_NB_IoT); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message_NB, NULL, (void*)&dl_ccch_msg_NB_IoT, buffer, 100); if (enc_rval.encoded <= 0) { - LOG_F(RRC,"ASN1 message encoding failed (%s, %lu)!\n", + LOG_E(RRC,"ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -1214,16 +1214,16 @@ uint8_t do_RRCConnectionReject_NB_IoT( RRCConnectionReject_NB_r13_IEs__rrc_SuspendIndication_r13_true; //Only Modified "asn_DEF_DL_CCCH_Message_NB" -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_DL_CCCH_Message_NB, (void*)&dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message_NB, (void*)&dl_ccch_msg_NB_IoT); + } enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message_NB, NULL, (void*)&dl_ccch_msg_NB_IoT, buffer, 100); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %ld)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %ld)!\n", enc_rval.failed_type->name, enc_rval.encoded); } @@ -1351,13 +1351,13 @@ uint8_t do_RRCConnectionReestablishment_NB_IoT( RRC_BUF_SIZE); if (enc_rval.encoded <= 0) { - LOG_F(RRC, "ASN1 message encoding failed (%s, %li)!\n", + LOG_E(RRC, "ASN1 message encoding failed (%s, %li)!\n", enc_rval.failed_type->name, enc_rval.encoded); } -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_DL_CCCH_Message_NB,(void*)&dl_ccch_msg_NB_IoT); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_DL_CCCH_Message_NB,(void*)&dl_ccch_msg_NB_IoT); + } #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index c23bf12d52a8b533bb54f6023025ee1566fba317..b111f77871c1292afa40a366b8b2506dcfd2e23b 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -99,10 +99,6 @@ int send_ue_information = 0; // for malloc_clear #include "PHY/defs_UE.h" -//#define XER_PRINT - - - extern void pdcp_config_set_security( const protocol_ctxt_t* const ctxt_pP, pdcp_t * const pdcp_pP, @@ -733,9 +729,9 @@ int rrc_ue_decode_ccch( const protocol_ctxt_t* const ctxt_pP, const SRB_INFO* co (uint8_t*)Srb_info->Rx_buffer.Payload, 100,0,0); -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_DL_CCCH_Message,(void*)dl_ccch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_DL_CCCH_Message,(void*)dl_ccch_msg); + } #if defined(ENABLE_ITTI) # if defined(DISABLE_ITTI_XER_PRINT) @@ -1931,9 +1927,9 @@ rrc_ue_process_securityModeCommand( AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", enc_rval.failed_type->name, enc_rval.encoded); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); + } #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) @@ -2042,9 +2038,9 @@ rrc_ue_process_ueCapabilityEnquiry( AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", enc_rval.failed_type->name, enc_rval.encoded); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); + } #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) @@ -2429,9 +2425,9 @@ rrc_ue_decode_dcch( (uint8_t*)Buffer, RRC_BUF_SIZE,0,0); -#ifdef XER_PRINT - xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void*)dl_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void*)dl_dcch_msg); + } #if defined(ENABLE_ITTI) # if defined(DISABLE_ITTI_XER_PRINT) @@ -4560,9 +4556,9 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB return -1; } -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_MCCH_Message, (void*)mcch); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_MCCH_Message, (void*)mcch); + } if (mcch->message.present == MCCH_MessageType_PR_c1) { LOG_D(RRC,"[UE %d] Found mcch message \n", @@ -4594,10 +4590,30 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB //----------------------------------------------------------------------------- void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_index, frame_t frameP, uint8_t mbsfn_sync_area ) { + uint8_t i; protocol_ctxt_t ctxt; LOG_I(RRC,"[UE %d] Frame %d : Number of MCH(s) in the MBSFN Sync Area %d is %d\n", ue_mod_idP, frameP, mbsfn_sync_area, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9.list.count); + + // Configure commonSF_Alloc + for(i=0; i< UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.count;i++){ + LOG_W(RRC,"[UE %d] Frame %d, commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x,%x,%x)\n", + ue_mod_idP, frameP, + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationPeriod<<1, + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationOffset, + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[0], + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[1], + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[2]); + UE_mac_inst[ue_mod_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] = UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]; + } + LOG_W(RRC,"[UE %d] Frame %d, commonSF_AllocPeriod_r9 %drf \n", + ue_mod_idP, frameP, + 4<<UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_AllocPeriod_r9); + + // Configure commonSF_AllocPeriod + UE_mac_inst[ue_mod_idP].commonSF_AllocPeriod_r9 = UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_AllocPeriod_r9; + // store to MAC/PHY necessary parameters for receiving MTCHs rrc_mac_config_req_ue(ue_mod_idP,0,eNB_index, @@ -5558,9 +5574,9 @@ void *rrc_control_socket_thread_fct(void *arg) //process the message switch (sl_ctrl_msg_recv->type) { case SESSION_INIT_REQ: -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"Received SessionInitializationRequest on socket from ProSe App (msg type: %d)\n", sl_ctrl_msg_recv->type); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"Received SessionInitializationRequest on socket from ProSe App (msg type: %d)\n", sl_ctrl_msg_recv->type); + } //TODO: get SL_UE_STATE from lower layer LOG_I(RRC,"Send UEStateInformation to ProSe App \n"); @@ -5579,12 +5595,12 @@ LOG_DEBUG_END exit(EXIT_FAILURE); } -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; - ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; - LOG_UI(RRC,"[UEStateInformation] msg type: %d\n",ptr_ctrl_msg->type); - LOG_UI(RRC,"[UEStateInformation] UE state: %d\n",ptr_ctrl_msg->sidelinkPrimitive.ue_state); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; + ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; + LOG_UI(RRC,"[UEStateInformation] msg type: %d\n",ptr_ctrl_msg->type); + LOG_UI(RRC,"[UEStateInformation] UE state: %d\n",ptr_ctrl_msg->sidelinkPrimitive.ue_state); + } /* if (enable_notification > 0) { //create thread to send status notification (for testing purpose, status notification will be sent e.g., every 20 seconds) pthread_t notification_thread; @@ -5599,12 +5615,12 @@ LOG_DEBUG_END sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id; groupL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id; -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"[GroupCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); - LOG_UI(RRC,"[GroupCommunicationEstablishReq] source Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id); - LOG_UI(RRC,"[GroupCommunicationEstablishReq] group Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id); - LOG_UI(RRC,"[GroupCommunicationEstablishReq] group IP Address: " IPV4_ADDR "\n",IPV4_ADDR_FORMAT(sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupIpAddress)); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"[GroupCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); + LOG_UI(RRC,"[GroupCommunicationEstablishReq] source Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id); + LOG_UI(RRC,"[GroupCommunicationEstablishReq] group Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id); + LOG_UI(RRC,"[GroupCommunicationEstablishReq] group IP Address: " IPV4_ADDR "\n",IPV4_ADDR_FORMAT(sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupIpAddress)); + } //store sourceL2Id/groupL2Id UE_rrc_inst[module_id].sourceL2Id = sourceL2Id; @@ -5764,20 +5780,20 @@ LOG_DEBUG_END exit(EXIT_FAILURE); } -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; - ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; - LOG_UI(RRC,"[GroupCommunicationEstablishResponse] msg type: %d\n",ptr_ctrl_msg->type); - LOG_UI(RRC,"[GroupCommunicationEstablishResponse] slrb_id: %d\n",ptr_ctrl_msg->sidelinkPrimitive.slrb_id); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; + ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; + LOG_UI(RRC,"[GroupCommunicationEstablishResponse] msg type: %d\n",ptr_ctrl_msg->type); + LOG_UI(RRC,"[GroupCommunicationEstablishResponse] slrb_id: %d\n",ptr_ctrl_msg->sidelinkPrimitive.slrb_id); + } break; case GROUP_COMMUNICATION_RELEASE_REQ: printf("-----------------------------------\n"); -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"[GroupCommunicationReleaseRequest] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); - LOG_UI(RRC,"[GroupCommunicationReleaseRequest] Slrb Id: %i\n",sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"[GroupCommunicationReleaseRequest] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); + LOG_UI(RRC,"[GroupCommunicationReleaseRequest] Slrb Id: %i\n",sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id); + } //reset groupL2ID from MAC LAYER UE_rrc_inst[module_id].groupL2Id = 0x00000000; sourceL2Id = UE_rrc_inst[module_id].sourceL2Id; @@ -5849,11 +5865,11 @@ LOG_DEBUG_END sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.direct_comm_establish_req.sourceL2Id; destinationL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.direct_comm_establish_req.destinationL2Id; -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"[DirectCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); - LOG_UI(RRC,"[DirectCommunicationEstablishReq] source Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id); - LOG_UI(RRC,"[DirectCommunicationEstablishReq] destination Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"[DirectCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); + LOG_UI(RRC,"[DirectCommunicationEstablishReq] source Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id); + LOG_UI(RRC,"[DirectCommunicationEstablishReq] destination Id: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id); + } //store sourceL2Id/destinationL2Id UE_rrc_inst[module_id].sourceL2Id = sourceL2Id; @@ -6013,27 +6029,27 @@ LOG_DEBUG_END } -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; - ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; - LOG_UI(RRC,"[DirectCommunicationEstablishResponse] msg type: %d\n",ptr_ctrl_msg->type); - LOG_UI(RRC,"[DirectCommunicationEstablishResponse] slrb_id: %d\n",ptr_ctrl_msg->sidelinkPrimitive.slrb_id); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + struct sidelink_ctrl_element *ptr_ctrl_msg = NULL; + ptr_ctrl_msg = (struct sidelink_ctrl_element *) send_buf; + LOG_UI(RRC,"[DirectCommunicationEstablishResponse] msg type: %d\n",ptr_ctrl_msg->type); + LOG_UI(RRC,"[DirectCommunicationEstablishResponse] slrb_id: %d\n",ptr_ctrl_msg->sidelinkPrimitive.slrb_id); + } break; case PC5S_ESTABLISH_REQ: - type = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type; - sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.sourceL2Id; -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"[PC5EstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); - LOG_UI(RRC,"[PC5EstablishReq] type: %d\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type); //RX/TX - LOG_UI(RRC,"[PC5EstablishReq] source Id: 0x%08x \n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.sourceL2Id); -LOG_DEBUG_END + type = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type; + sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.sourceL2Id; + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"[PC5EstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); + LOG_UI(RRC,"[PC5EstablishReq] type: %d\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type); //RX/TX + LOG_UI(RRC,"[PC5EstablishReq] source Id: 0x%08x \n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.sourceL2Id); + } if (type > 0) { destinationL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.destinationL2Id; -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) - LOG_UI(RRC,"[PC5EstablishReq] destination Id: 0x%08x \n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.destinationL2Id); -LOG_DEBUG_END + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ + LOG_UI(RRC,"[PC5EstablishReq] destination Id: 0x%08x \n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.destinationL2Id); + } } //store sourceL2Id/destinationL2Id @@ -6244,9 +6260,9 @@ LOG_DEBUG_END case PC5_DISCOVERY_MESSAGE: -LOG_DEBUG_BEGIN(DEBUG_CTRLSOCKET) + if (LOG_DEBUGFLAG(DEBUG_CTRLSOCKET)){ LOG_UI(RRC,"[PC5DiscoveryMessage] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); -LOG_DEBUG_END + } //prepare SL_Discovery buffer if (UE_rrc_inst) { memcpy((void*)&UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.Payload[0], (void*)&sl_ctrl_msg_recv->sidelinkPrimitive.pc5_discovery_message.payload[0], PC5_DISCOVERY_PAYLOAD_SIZE); diff --git a/openair2/RRC/LTE/rrc_common.c b/openair2/RRC/LTE/rrc_common.c index d18c43d6cf38261bec43af35689d61aad8df0c0f..cf0196441e21d118e4ff8e64830bd85de27aa052 100644 --- a/openair2/RRC/LTE/rrc_common.c +++ b/openair2/RRC/LTE/rrc_common.c @@ -43,7 +43,6 @@ #include "rrc_eNB_UE_context.h" #include "common/ran_context.h" -#define DEBUG_RRC 1 extern RAN_CONTEXT_t RC; extern UE_MAC_INST *UE_mac_inst; diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index b0b444084c19b7d106a81c6246c1b5883bb6c6de..10590bc0194988daa6cea1d8ce0b1af233b4523a 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -85,6 +85,8 @@ # else # include "../../S1AP/s1ap_eNB.h" # endif +#else +# define EPC_MODE_ENABLED 0 #endif #include "pdcp.h" @@ -100,7 +102,6 @@ #include "SIMULATION/TOOLS/sim.h" // for taus -//#define XER_PRINT extern RAN_CONTEXT_t RC; @@ -839,11 +840,6 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* protocol_ctxt_t ctxt; -#if !defined(ENABLE_USE_MME) - module_id_t ue_module_id; - /* avoid gcc warnings */ - (void)ue_module_id; -#endif rnti_t rnti = ue_context_pP->ue_context.rnti; if (enb_mod_idP >= NB_eNB_INST) { LOG_I(RRC, "eNB inst invalid (%d/%d) for UE %x!\n",enb_mod_idP, NB_eNB_INST,rnti); @@ -858,20 +854,21 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, rnti, 0, 0,enb_mod_idP); LOG_W(RRC, "[eNB %d] Removing UE RNTI %x\n", enb_mod_idP, rnti); -#if defined(ENABLE_USE_MME) - if((ue_context_pP->ue_context.ul_failure_timer >= 20000) && - (mac_eNB_get_rrc_status(enb_mod_idP,rnti) >= RRC_CONNECTED)) { - LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ RNTI %x\n", enb_mod_idP, rnti); - rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, 21); // send cause 21: connection with ue lost - /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) - * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before - * triggering the S1 UE Context Release Request procedure - * in order to allow the UE to perform the NAS recovery - * procedure, see TS 23.401 [17]. - */ - return; + if(EPC_MODE_ENABLED) { + + if((ue_context_pP->ue_context.ul_failure_timer >= 20000) && + (mac_eNB_get_rrc_status(enb_mod_idP,rnti) >= RRC_CONNECTED)) { + LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ RNTI %x\n", enb_mod_idP, rnti); + rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, 21); // send cause 21: connection with ue lost + /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) + * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before + * triggering the S1 UE Context Release Request procedure + * in order to allow the UE to perform the NAS recovery + * procedure, see TS 23.401 [17]. + */ + return; } -#endif + } // add UE info to freeList LOG_I(RRC, "put UE %x into freeList\n", rnti); put_UE_in_freelist(enb_mod_idP, rnti, 1); @@ -1018,17 +1015,13 @@ rrc_eNB_process_RRCConnectionSetupComplete( T(T_ENB_RRC_CONNECTION_SETUP_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); -#if defined(ENABLE_USE_MME) - if (EPC_MODE_ENABLED == 1) { // Forward message to S1AP layer rrc_eNB_send_S1AP_NAS_FIRST_REQ( ctxt_pP, ue_context_pP, rrcConnectionSetupComplete); - } else -#endif - { + } else { // RRC loop back (no S1AP), send SecurityModeCommand to UE rrc_eNB_generate_SecurityModeCommand( ctxt_pP, @@ -1058,16 +1051,8 @@ rrc_eNB_generate_SecurityModeCommand( ue_context_pP->ue_context.ciphering_algorithm, ue_context_pP->ue_context.integrity_algorithm); -#ifdef RRC_MSG_PRINT - uint16_t i=0; - LOG_F(RRC,"[MSG] RRC Security Mode Command\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Security Mode Command\n"); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate SecurityModeCommand (bytes %d)\n", @@ -1166,9 +1151,6 @@ rrc_eNB_generate_RRCConnectionReject( ) //----------------------------------------------------------------------------- { -#ifdef RRC_MSG_PRINT - int cnt; -#endif T(T_ENB_RRC_CONNECTION_REJECT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); @@ -1177,15 +1159,10 @@ rrc_eNB_generate_RRCConnectionReject( do_RRCConnectionReject(ctxt_pP->module_id, (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRCConnectionReject\n"); - - for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->Srb0.Tx_buffer.Payload)[cnt]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC, + (char *)(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, + "[MSG] RRCConnectionReject\n"); MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, @@ -1230,17 +1207,11 @@ rrc_eNB_generate_RRCConnectionReestablishment( rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), SRB_configList, &ue_context_pP->ue_context.physicalConfigDedicated); - -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRCConnectionReestablishment\n"); - - for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload)[cnt]); - } - - LOG_F(RRC,"\n"); -#endif - + LOG_DUMPMSG(RRC,DEBUG_RRC, + (char *)(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, + "[MSG] RRCConnectionReestablishment\n" + ); // configure SRB1 for UE if (*SRB_configList != NULL) { @@ -1356,10 +1327,6 @@ rrc_eNB_process_RRCConnectionReestablishmentComplete( struct SRB_ToAddMod *SRB2_config = NULL; struct DRB_ToAddMod *DRB_config = NULL; int i = 0; -# if defined(ENABLE_USE_MME) - int j = 0; - hashtable_rc_t h_rc; -#endif uint8_t buffer[RRC_BUF_SIZE]; uint16_t size; MeasObjectToAddModList_t *MeasObj_list = NULL; @@ -1450,59 +1417,61 @@ rrc_eNB_process_RRCConnectionReestablishmentComplete( ue_context_pP->ue_context.Srb1.Active = 1; //ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2; -# if defined(ENABLE_USE_MME) - rrc_ue_s1ap_ids_t* rrc_ue_s1ap_ids_p = NULL; - uint16_t ue_initial_id = ue_context_pP->ue_context.ue_initial_id; - uint32_t eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; - eNB_RRC_INST *rrc_instance_p = RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]; - if (eNB_ue_s1ap_id > 0) { - h_rc = hashtable_get(rrc_instance_p->s1ap_id2_s1ap_ids, (hash_key_t)eNB_ue_s1ap_id, (void**)&rrc_ue_s1ap_ids_p); - if (h_rc == HASH_TABLE_OK) { - rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; +#if defined(ENABLE_USE_MME) + hashtable_rc_t h_rc; + int j; + rrc_ue_s1ap_ids_t* rrc_ue_s1ap_ids_p = NULL; + uint16_t ue_initial_id = ue_context_pP->ue_context.ue_initial_id; + uint32_t eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + eNB_RRC_INST *rrc_instance_p = RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]; + if (eNB_ue_s1ap_id > 0) { + h_rc = hashtable_get(rrc_instance_p->s1ap_id2_s1ap_ids, (hash_key_t)eNB_ue_s1ap_id, (void**)&rrc_ue_s1ap_ids_p); + if (h_rc == HASH_TABLE_OK) { + rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; + } } - } - if (ue_initial_id != 0) { - h_rc = hashtable_get(rrc_instance_p->initial_id2_s1ap_ids, (hash_key_t)ue_initial_id, (void**)&rrc_ue_s1ap_ids_p); - if (h_rc == HASH_TABLE_OK) { - rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; + if (ue_initial_id != 0) { + h_rc = hashtable_get(rrc_instance_p->initial_id2_s1ap_ids, (hash_key_t)ue_initial_id, (void**)&rrc_ue_s1ap_ids_p); + if (h_rc == HASH_TABLE_OK) { + rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; + } } - } - gtpv1u_enb_create_tunnel_req_t create_tunnel_req; + gtpv1u_enb_create_tunnel_req_t create_tunnel_req; - /* Save e RAB information for later */ - memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); + /* Save e RAB information for later */ + memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); - for (j = 0, i = 0; i < NB_RB_MAX; i++) { - if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED || ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) { - create_tunnel_req.eps_bearer_id[j] = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; - create_tunnel_req.sgw_S1u_teid[j] = ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + for ( j = 0, i = 0; i < NB_RB_MAX; i++) { + if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED || ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_DONE) { + create_tunnel_req.eps_bearer_id[j] = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + create_tunnel_req.sgw_S1u_teid[j] = ue_context_pP->ue_context.e_rab[i].param.gtp_teid; - memcpy(&create_tunnel_req.sgw_addr[j], - &ue_context_pP->ue_context.e_rab[i].param.sgw_addr, - sizeof(transport_layer_addr_t)); - j++; + memcpy(&create_tunnel_req.sgw_addr[j], + &ue_context_pP->ue_context.e_rab[i].param.sgw_addr, + sizeof(transport_layer_addr_t)); + j++; + } } - } - create_tunnel_req.rnti = ctxt_pP->rnti; // warning put zero above - create_tunnel_req.num_tunnels = j; + create_tunnel_req.rnti = ctxt_pP->rnti; // warning put zero above + create_tunnel_req.num_tunnels = j; - gtpv1u_update_s1u_tunnel( - ctxt_pP->instance, - &create_tunnel_req, - reestablish_rnti); + gtpv1u_update_s1u_tunnel( + ctxt_pP->instance, + &create_tunnel_req, + reestablish_rnti); #endif /* Update RNTI in ue_context */ ue_context_pP->ue_id_rnti = ctxt_pP->rnti; // here ue_id_rnti is just a key, may be something else ue_context_pP->ue_context.rnti = ctxt_pP->rnti; -# if defined(ENABLE_USE_MME) - uint8_t send_security_mode_command = FALSE; - rrc_pdcp_config_security( - ctxt_pP, - ue_context_pP, - send_security_mode_command); - LOG_D(RRC, "set security successfully \n"); +#if defined(ENABLE_USE_MME) + uint8_t send_security_mode_command = FALSE; + rrc_pdcp_config_security( + ctxt_pP, + ue_context_pP, + send_security_mode_command); + LOG_D(RRC, "set security successfully \n"); #endif // Measurement ID list MeasId_list = CALLOC(1, sizeof(*MeasId_list)); @@ -1869,15 +1838,9 @@ rrc_eNB_process_RRCConnectionReestablishmentComplete( , (SCellToAddMod_r10_t*)NULL #endif ); + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, + "[MSG] RRC Connection Reconfiguration\n"); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif #if defined(ENABLE_ITTI) @@ -1977,9 +1940,6 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( ) //----------------------------------------------------------------------------- { -#ifdef RRC_MSG_PRINT - int cnt; -#endif int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); if(UE_id != -1){ RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; @@ -1997,15 +1957,11 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( do_RRCConnectionReestablishmentReject(ctxt_pP->module_id, (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRCConnectionReestablishmentReject\n"); + LOG_DUMPMSG(RRC,DEBUG_RRC, + (char *)(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, + "[MSG] RRCConnectionReestablishmentReject\n"); - for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload)[cnt]); - } - - LOG_F(RRC,"\n"); -#endif MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, @@ -2336,15 +2292,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* co #endif ); + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Connection Reconfiguration\n"); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif #if defined(ENABLE_ITTI) @@ -2606,15 +2555,8 @@ rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* cons #endif ); - -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, + "[MSG] RRC Connection Reconfiguration\n"); #if defined(ENABLE_ITTI) @@ -2731,15 +2673,8 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_release( const protocol_ #endif ); ue_context_pP->ue_context.e_rab_release_command_flag = 1; - -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, + "[MSG] RRC Connection Reconfiguration\n"); #if defined(ENABLE_ITTI) /* Free all NAS PDUs */ @@ -3460,15 +3395,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* cons , (SCellToAddMod_r10_t*)NULL #endif ); - -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, + "[MSG] RRC Connection Reconfiguration\n"); #if defined(ENABLE_ITTI) @@ -4052,15 +3980,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt , (SCellToAddMod_r10_t*)NULL #endif ); - -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - LOG_F(RRC,"\n"); - //////////////////////////////////////// -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size, + "[MSG] RRC Connection Reconfiguration\n"); #if defined(ENABLE_ITTI) @@ -5438,11 +5359,9 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( #ifdef PDCP_USE_NETLINK int oip_ifup = 0; int dest_ip_offset = 0; - module_id_t ue_module_id = -1; /* avoid gcc warnings */ (void)oip_ifup; (void)dest_ip_offset; - (void)ue_module_id; #endif uint8_t *kRRCenc = NULL; @@ -5585,6 +5504,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->module_id + 1); // fourth octet if (oip_ifup == 0) { // interface is up --> send a config the DRB + module_id_t ue_module_id; dest_ip_offset = 8; LOG_I(OIP, "[eNB %d] Config the oai%d to send/receive pkt on DRB %ld to/from the protocol stack\n", @@ -5754,16 +5674,10 @@ rrc_eNB_generate_RRCConnectionSetup( SRB_configList, &ue_context_pP->ue_context.physicalConfigDedicated); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Setup\n"); - - for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->Srb0.Tx_buffer.Payload)[cnt]); - } - - LOG_F(RRC,"\n"); - ////////////////////////////////// -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC, + (char *)(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, + "[MSG] RRC Connection Setup\n"); // configure SRB1/SRB2, PhysicalConfigDedicated, MAC_MainConfig for UE @@ -6111,15 +6025,10 @@ rrc_eNB_decode_ccch( T(T_ENB_RRC_CONNECTION_REESTABLISHMENT_REQUEST, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reestablishment Request\n"); + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)(Srb_info->Rx_buffer.Payload), + Srb_info->Rx_buffer.payload_size, + "[MSG] RRC Connection Reestablishment Request\n"); - for (i = 0; i < Srb_info->Rx_buffer.payload_size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Srb_info->Rx_buffer.Payload)[i]); - } - - LOG_F(RRC,"\n"); -#endif LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT"MAC_eNB--- MAC_DATA_IND (rrcConnectionReestablishmentRequest on SRB0) --> RRC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); @@ -6336,15 +6245,10 @@ rrc_eNB_decode_ccch( T(T_ENB_RRC_CONNECTION_REQUEST, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Request\n"); + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)(Srb_info->Rx_buffer.Payload), + Srb_info->Rx_buffer.payload_size, + "[MSG] RRC Connection Request\n"); - for (i = 0; i < Srb_info->Rx_buffer.payload_size; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Srb_info->Rx_buffer.Payload)[i]); - } - - LOG_F(RRC,"\n"); -#endif LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT"MAC_eNB --- MAC_DATA_IND (rrcConnectionRequest on SRB0) --> RRC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); @@ -6631,36 +6535,7 @@ rrc_eNB_decode_dcch( sdu_sizeP, 0, 0); - /* -#if defined(ENABLE_ITTI) -# if defined(DISABLE_ITTI_XER_PRINT) - { - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_RRC_ENB, RRC_UL_DCCH_MESSAGE); - memcpy(&message_p->ittiMsg, (void *)ul_dcch_msg, sizeof(RrcUlDcchMessage)); - itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, message_p); - } -# else - { - char message_string[10000]; - size_t message_string_size; - - if ((message_string_size = - xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg)) >= 0) { - MessageDef *msg_p; - - msg_p = itti_alloc_new_message_sized(TASK_RRC_ENB, RRC_UL_DCCH, message_string_size + sizeof(IttiMsgText)); - msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size; - memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); - } - } -# endif -#endif - */ { for (i = 0; i < sdu_sizeP; i++) { LOG_T(RRC, "%x.", Rx_sdu[i]); @@ -6714,15 +6589,9 @@ rrc_eNB_decode_dcch( LOG_I(RRC, "Processing RRCConnectionReconfigurationComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti); break; } -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reconfiguration Complete\n"); + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)(Rx_sdu),sdu_sizeP, + "[MSG] RRC Connection Reconfiguration Complete\n"); - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, MSC_RRC_UE, @@ -6745,42 +6614,42 @@ rrc_eNB_decode_dcch( RRCConnectionReconfigurationComplete__criticalExtensions_PR_rrcConnectionReconfigurationComplete_r8) { /*NN: revise the condition */ /*FK: left the condition as is for the case MME is used (S1 mode) but setting dedicated_DRB = 1 otherwise (noS1 mode) so that no second RRCReconfiguration message activationg more DRB is sent as this causes problems with the nasmesh driver.*/ -#if defined(ENABLE_USE_MME) - if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ - dedicated_DRB = 1; - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); - //clear - int16_t UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); - if(UE_id == -1){ - LOG_E(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReconfigurationComplete without rnti %x, fault\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ctxt_pP->rnti); - break; - } - if(RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag == 1){ - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld) C-RNTI Complete\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); - dedicated_DRB = 2; - RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 0; - } - } else { - dedicated_DRB = 0; - ue_context_p->ue_context.Status = RRC_RECONFIGURED; - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %ld)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); - } - ue_context_p->ue_context.reestablishment_xid = -1; -#else - dedicated_DRB = 1; - ue_context_p->ue_context.Status = RRC_RECONFIGURED; - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); -#endif + if (EPC_MODE_ENABLED) { + if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ + dedicated_DRB = 1; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + //clear + int16_t UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); + if(UE_id == -1){ + LOG_E(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReconfigurationComplete without rnti %x, fault\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ctxt_pP->rnti); + break; + } + if(RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag == 1){ + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld) C-RNTI Complete\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + dedicated_DRB = 2; + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].crnti_reconfigurationcomplete_flag = 0; + } + } else { + dedicated_DRB = 0; + ue_context_p->ue_context.Status = RRC_RECONFIGURED; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %ld)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + } + ue_context_p->ue_context.reestablishment_xid = -1; + } else { + dedicated_DRB = 1; + ue_context_p->ue_context.Status = RRC_RECONFIGURED; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + } rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP, @@ -6795,8 +6664,7 @@ rrc_eNB_decode_dcch( } } #if defined(ENABLE_ITTI) -# if defined(ENABLE_USE_MME) - if (EPC_MODE_ENABLED == 1) { +#if defined(ENABLE_USE_MME) if (dedicated_DRB == 1){ // rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(ctxt_pP, // ue_context_p, @@ -6861,14 +6729,12 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { } } } - } +#endif #else // establish a dedicated bearer if (dedicated_DRB == 0 ) { // ue_context_p->ue_context.e_rab[0].status = E_RAB_STATUS_ESTABLISHED; rrc_eNB_reconfigure_DRBs(ctxt_pP,ue_context_p); } - -#endif #endif break; @@ -6876,15 +6742,8 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { T(T_ENB_RRC_CONNECTION_REESTABLISHMENT_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reestablishment Complete\n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC Connection Reestablishment Complete\n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -6963,15 +6822,8 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { LOG_I(RRC, "Processing RRCConnectionSetupComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti); break; } -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection SetupComplete\n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC Connection SetupComplete\n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -7023,15 +6875,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { LOG_I(RRC, "Processing securityModeComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti); break; } -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Security Mode Complete\n"); - - for (i = 0; i < sdu_sizeP; i++) eNB->pusch_vars[UE_id]{ - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC Security Mode Complete\n"); - LOG_F(RRC,"\n"); -#endif MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -7053,9 +6899,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), DCCH, sdu_sizeP); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); + } // confirm with PDCP about the security mode for DCCH //rrc_pdcp_config_req (enb_mod_idP, frameP, 1,CONFIG_ACTION_SET_SECURITY_MODE, (ue_mod_idP * NB_RB_MAX) + DCCH, 0x77); // continue the procedure @@ -7068,15 +6914,8 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { T(T_ENB_RRC_SECURITY_MODE_FAILURE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Security Mode Failure\n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC Security Mode Failure\n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -7094,9 +6933,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), DCCH, sdu_sizeP); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); + } // cancel the security mode in PDCP // followup with the remaining procedure @@ -7112,15 +6951,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { LOG_I(RRC, "Processing ueCapabilityInformation UE %x, ue_context_p is NULL\n", ctxt_pP->rnti); break; } -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC UECapablility Information \n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC UECapablility Information\n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -7142,9 +6975,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), DCCH, sdu_sizeP); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); + } LOG_I(RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti); if (ue_context_p->ue_context.UE_Capability) { LOG_I(RRC, "freeing old UE capabilities for UE %x\n", ctxt_pP->rnti); @@ -7161,9 +6994,9 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions. choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list. array[0]->ueCapabilityRAT_Container.size, 0, 0); -#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, ue_context_p->ue_context.UE_Capability); -#endif + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, ue_context_p->ue_context.UE_Capability); + } if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode UE capabilities (%zu bytes)\n", @@ -7174,22 +7007,22 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { ue_context_p->ue_context.UE_Capability = 0; } -#if defined(ENABLE_USE_MME) + if (EPC_MODE_ENABLED) { - if (EPC_MODE_ENABLED == 1) { - rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP, - ue_context_p, - ul_dcch_msg); - } -#else - ue_context_p->ue_context.nb_of_e_rabs = 1; - for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++){ - ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; - ue_context_p->ue_context.e_rab[i].param.e_rab_id = 1+i; - ue_context_p->ue_context.e_rab[i].param.qos.qci=9; + if (EPC_MODE_ENABLED == 1) { + rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP, + ue_context_p, + ul_dcch_msg); + } + } else { + ue_context_p->ue_context.nb_of_e_rabs = 1; + for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++){ + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i].param.e_rab_id = 1+i; + ue_context_p->ue_context.e_rab[i].param.qos.qci=9; + } + ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; } - ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; -#endif rrc_eNB_generate_defaultRRCConnectionReconfiguration(ctxt_pP, ue_context_p, @@ -7212,16 +7045,8 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { } LOG_D(RRC,"[MSG] RRC UL Information Transfer \n"); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC UL Information Transfer \n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif - + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC UL Information Transfer \n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, @@ -7233,15 +7058,11 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { ue_context_p->ue_context.rnti, sdu_sizeP); -#if defined(ENABLE_USE_MME) - if (EPC_MODE_ENABLED == 1) { rrc_eNB_send_S1AP_UPLINK_NAS(ctxt_pP, ue_context_p, ul_dcch_msg); } - -#endif break; case UL_DCCH_MessageType__c1_PR_counterCheckResponse: @@ -7307,15 +7128,8 @@ if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { //case UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12: //SidelinkUEInformation LOG_I(RRC,"THINH [UL_DCCH_MessageType__messageClassExtension_PR_c2]\n"); -#ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] SidelinkUEInformation\n"); - - for (i = 0; i < sdu_sizeP; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); - } - - LOG_F(RRC,"\n"); -#endif + LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, + "[MSG] RRC SidelinkUEInformation \n"); MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index 36e0645795b07e3ee10ea668f2abd6b174b9505b..7d242286023985c1002562d25feb32040285603e 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -467,43 +467,20 @@ rrc_pdcp_config_security( &kRRCint); #if !defined(USRP_REC_PLAY) -#define DEBUG_SECURITY 1 + SET_LOG_DUMP(DEBUG_SECURITY) ; #endif -#if defined (DEBUG_SECURITY) -#undef msg -#define msg printf - if (print_keys ==1 ) { - print_keys =0; - int i; - msg("\nKeNB:"); - - for(i = 0; i < 32; i++) { - msg("%02x", ue_context_pP->ue_context.kenb[i]); - } - - msg("\n"); - - msg("\nKRRCenc:"); - - for(i = 0; i < 32; i++) { - msg("%02x", kRRCenc[i]); - } + if ( LOG_DUMPFLAG( DEBUG_SECURITY ) ) { + if (print_keys ==1 ) { + print_keys =0; - msg("\n"); - - msg("\nKRRCint:"); - - for(i = 0; i < 32; i++) { - msg("%02x", kRRCint[i]); + LOG_DUMPMSG(RRC, DEBUG_SECURITY, ue_context_pP->ue_context.kenb, 32,"\nKeNB:" ); + LOG_DUMPMSG(RRC, DEBUG_SECURITY, kRRCenc, 32,"\nKRRCenc:" ); + LOG_DUMPMSG(RRC, DEBUG_SECURITY, kRRCint, 32,"\nKRRCint:" ); } - - msg("\n"); - } -#endif //DEBUG_SECURITY key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES); h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); @@ -945,16 +922,8 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( S1AP_DOWNLINK_NAS (msg_p).nas_pdu.length, S1AP_DOWNLINK_NAS (msg_p).nas_pdu.buffer); -#ifdef RRC_MSG_PRINT - int i=0; - LOG_F(RRC,"[MSG] RRC DL Information Transfer\n"); + LOG_DUMPMSG(RRC,DEBUG_RRC,buffer,length,"[MSG] RRC DL Information Transfer\n"); - for (i = 0; i < length; i++) { - LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); - } - - LOG_F(RRC,"\n"); -#endif /* * switch UL or DL NAS message without RRC piggybacked to SRB2 if active. */ diff --git a/openair2/UTIL/OPT/README.txt b/openair2/UTIL/OPT/README.txt index 7193733d0098a16f4230701a4cf0fc758209ed45..c56aeda93d96902b490d583c034f6101abecd540 100644 --- a/openair2/UTIL/OPT/README.txt +++ b/openair2/UTIL/OPT/README.txt @@ -1,9 +1,13 @@ -2012 07 10 - Working version How to configure wireshark for dissecting LTE protocols: - start the wireshark as a sudoers +- goto analyze->enabled prototols + => enable mac_lte_udp and rlc_lte_udp - goto edit/preferences and expand Protocols - select UDP and check "try heuristic sub-dissectors first" - select MAC-LTE, and check all the options (checkboxes), and set the "which layer info to show in info column" to "MAC info" - select RLC-LTE, and check all the options except the "May see RLC headers only", and set the "call PDCP dissector for DRB PDUs" to "12-bit SN". Optionally you may select the sequence analysis for RLC AM/UM. + +How to use +- start eNB or UE with option -W (or -P if you want to make a pcap file) - capture on local interface "lo" - filter out the ICMP/DNS/TCP messages (e.g. "!icmp && !dns && !tcp") diff --git a/openair2/UTIL/OPT/mac_pcap.h b/openair2/UTIL/OPT/mac_pcap.h index f1d4b324923f844fc5ba5b45f2ab505c3837acfd..48b31bb3c07395b2b0d6382166356f717706d9d0 100644 --- a/openair2/UTIL/OPT/mac_pcap.h +++ b/openair2/UTIL/OPT/mac_pcap.h @@ -42,11 +42,4 @@ typedef struct MAC_Context_Info_t { unsigned int subframesSinceCaptureStart; } MAC_Context_Info_t; -pcap_hdr_t file_header = { - 0xa1b2c3d4, /* magic number */ - 2, 4, /* version number is 2.4 */ - 0, /* timezone */ - 0, /* sigfigs - apparently all tools do this */ - 65535, /* snaplen - this should be long enough */ - MAC_LTE_DLT /* Data Link Type (DLT). Set as unused value 147 for now */ -}; + diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index c9340f258e9700baee412b73940e9a946676a589..b4ff3b5006bbf4b5ad9b1d4bdc4ac7c731a9ae1a 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -55,6 +55,16 @@ This header file must be included */ #include "PHY/impl_defs_lte.h" #endif +#define PACKET_MAC_LTE_DEFAULT_UDP_PORT (9999) + +typedef uint8_t guint8; +typedef uint16_t guint16; +typedef uint32_t guint32; +typedef guint8 gboolean; + +#include "packet-mac-lte.h" +#include "mac_pcap.h" + #ifdef OCP_FRAMEWORK #include <enums.h> #else @@ -74,7 +84,7 @@ typedef enum radio_type_e { extern trace_mode_t opt_type; extern char in_ip[40]; -extern char in_path[100]; +extern char in_path[FILENAME_MAX]; /** * function def @@ -84,7 +94,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe, int oob_event, int oob_event_value); -int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p); +int init_opt(char *path, char *ip); void terminate_opt(void); diff --git a/openair2/UTIL/OPT/packet-mac-lte.h b/openair2/UTIL/OPT/packet-mac-lte.h index d0bb60f6b5cdb942ef7581ba868066434cf9b1fb..4dfbe7912ec484a174567cac076d70627550ebe4 100644 --- a/openair2/UTIL/OPT/packet-mac-lte.h +++ b/openair2/UTIL/OPT/packet-mac-lte.h @@ -1,41 +1,36 @@ /* packet-mac-lte.h * * Martin Mathieson - * $Id: packet-mac-lte.h 42240 2012-04-25 20:02:12Z pascal $ * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs * + * SPDX-License-Identifier: GPL-2.0-or-later + * * This header file may also be distributed under * the terms of the BSD Licence as follows: * * Copyright (C) 2009 Martin Mathieson. All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE + * SPDX-License-Identifier: BSD-2-Clause */ + + /* + this is wireshark, commit: commit eda834b6e29c36e05a63a6056afa98390ff79357 + Date: Wed Aug 22 14:36:20 2018 +0200 + modified to be used in OpenAir to create the LTE MAC/RLC encapsulated in UDP as per Wireshark feature + */ + + +#include "ws_symbol_export.h" + +/** data structure to hold time values with nanosecond resolution*/ +typedef struct { + time_t secs; + int nsecs; +} nstime_t; -#ifndef PACKET_MAC_LTE_H_ -#define PACKET_MAC_LTE_H_ /* radioType */ #define FDD_RADIO 1 @@ -45,105 +40,190 @@ #define DIRECTION_UPLINK 0 #define DIRECTION_DOWNLINK 1 -/* SR: no need to declare following part: */ +/* rntiType */ +#define WS_NO_RNTI 0 +#define WS_P_RNTI 1 +#define WS_RA_RNTI 2 +#define WS_C_RNTI 3 +#define WS_SI_RNTI 4 +#define WS_SPS_RNTI 5 +#define WS_M_RNTI 6 +#define WS_SL_BCH_RNTI 7 +#define WS_SL_RNTI 8 +#define WS_SC_RNTI 9 +#define WS_G_RNTI 10 + typedef enum mac_lte_oob_event { - ltemac_send_preamble, - ltemac_send_sr, - ltemac_sr_failure + ltemac_send_preamble, + ltemac_send_sr, + ltemac_sr_failure } mac_lte_oob_event; typedef enum mac_lte_dl_retx { - dl_retx_no, - dl_retx_yes, - dl_retx_unknown + dl_retx_no, + dl_retx_yes, + dl_retx_unknown } mac_lte_dl_retx; typedef enum mac_lte_crc_status { - crc_fail = 0, - crc_success = 1, - crc_high_code_rate = 2, - crc_pdsch_lost = 3, - crc_duplicate_nonzero_rv = 4 + crc_fail = 0, + crc_success = 1, + crc_high_code_rate = 2, + crc_pdsch_lost = 3, + crc_duplicate_nonzero_rv = 4, + crc_false_dci = 5 } mac_lte_crc_status; +/* N.B. for SCellIndex-r13 extends to 31 */ +typedef enum mac_lte_carrier_id { + carrier_id_primary, + carrier_id_secondary_1, + carrier_id_secondary_2, + carrier_id_secondary_3, + carrier_id_secondary_4, + carrier_id_secondary_5, + carrier_id_secondary_6, + carrier_id_secondary_7 +} mac_lte_carrier_id; + +typedef enum mac_lte_ce_mode { + no_ce_mode = 0, + ce_mode_a = 1, + ce_mode_b = 2 +} mac_lte_ce_mode; + +typedef enum mac_lte_nb_mode { + no_nb_mode = 0, + nb_mode = 1 +} mac_lte_nb_mode; + /* Context info attached to each LTE MAC frame */ -typedef struct mac_lte_info { - /* Needed for decode */ - guint8 radioType; - guint8 direction; - guint8 rntiType; - - /* Extra info to display */ - guint16 rnti; - guint16 ueid; - - /* Timing info */ - guint16 sysframeNumber; - guint16 subframeNumber; - - /* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */ - gboolean subframeNumberOfGrantPresent; - guint16 subframeNumberOfGrant; - - /* Flag set only if doing PHY-level data test - i.e. there may not be a - well-formed MAC PDU so just show as raw data */ - gboolean isPredefinedData; - - /* Length of DL PDU or UL grant size in bytes */ - guint16 length; - - /* UL only. 0=newTx, 1=first-retx, etc */ - guint8 reTxCount; - guint8 isPHICHNACK; /* FALSE=PDCCH retx grant, TRUE=PHICH NACK */ - - /* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set */ - gboolean isExtendedBSRSizes; - - /* DL only. Status of CRC check */ - mac_lte_crc_status crcStatusValid; - - /* DL only. Is this known to be a retransmission? */ - mac_lte_dl_retx dl_retx; - - /* More Physical layer info (see direction above for which side of union to use) */ - union { - struct mac_lte_ul_phy_info { - guint8 present; /* Remaining UL fields are present and should be displayed */ - guint8 modulation_type; - guint8 tbs_index; - guint8 resource_block_length; - guint8 resource_block_start; - guint8 harq_id; - gboolean ndi; - } ul_info; - struct mac_lte_dl_phy_info { - guint8 present; /* Remaining UL fields are present and should be displayed */ - guint8 dci_format; - guint8 resource_allocation_type; - guint8 aggregation_level; - guint8 mcs_index; - guint8 redundancy_version_index; - guint8 resource_block_length; - mac_lte_crc_status crc_status; - guint8 harq_id; - gboolean ndi; - guint8 transport_block; /* 1..2 */ - } dl_info; - } detailed_phy_info; - - /* Relating to out-of-band events */ - /* N.B. dissector will only look to these fields if length is 0... */ - mac_lte_oob_event oob_event; - guint8 rapid; - guint8 rach_attempt_number; -#define MAX_SRs 20 - guint16 number_of_srs; - guint16 oob_ueid[MAX_SRs]; - guint16 oob_rnti[MAX_SRs]; +typedef struct mac_lte_info +{ + /* Needed for decode */ + guint8 radioType; + guint8 direction; + guint8 rntiType; + + /* Extra info to display */ + guint16 rnti; + guint16 ueid; + + /* Timing info */ + guint16 sysframeNumber; + guint16 subframeNumber; + + /* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */ + gboolean subframeNumberOfGrantPresent; + guint16 subframeNumberOfGrant; + + /* Flag set only if doing PHY-level data test - i.e. there may not be a + well-formed MAC PDU so just show as raw data */ + gboolean isPredefinedData; + + /* Length of DL PDU or UL grant size in bytes */ + guint16 length; + + /* 0=newTx, 1=first-retx, etc */ + guint8 reTxCount; + guint8 isPHICHNACK; /* FALSE=PDCCH retx grant, TRUE=PHICH NACK */ + + /* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set */ + gboolean isExtendedBSRSizes; + + /* UL only. Indicates if the R10 simultaneousPUCCH-PUSCH parameter is set for PCell */ + gboolean isSimultPUCCHPUSCHPCell; + + /* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set for PSCell */ + gboolean isSimultPUCCHPUSCHPSCell; + + /* Status of CRC check. For UE it is DL only. For eNodeB it is UL + only. For an analyzer, it is present for both DL and UL. */ + gboolean crcStatusValid; + mac_lte_crc_status crcStatus; + + /* Carrier ID */ + mac_lte_carrier_id carrierId; + + /* DL only. Is this known to be a retransmission? */ + mac_lte_dl_retx dl_retx; + + /* DL only. CE mode to be used for RAR decoding */ + mac_lte_ce_mode ceMode; + + /* DL and UL. NB-IoT mode of the UE */ + mac_lte_nb_mode nbMode; + + /* UL only, for now used for CE mode A RAR decoding */ + guint8 nUlRb; + + /* More Physical layer info (see direction above for which side of union to use) */ + union { + struct mac_lte_ul_phy_info + { + guint8 present; /* Remaining UL fields are present and should be displayed */ + guint8 modulation_type; + guint8 tbs_index; + guint8 resource_block_length; + guint8 resource_block_start; + guint8 harq_id; + gboolean ndi; + } ul_info; + struct mac_lte_dl_phy_info + { + guint8 present; /* Remaining DL fields are present and should be displayed */ + guint8 dci_format; + guint8 resource_allocation_type; + guint8 aggregation_level; + guint8 mcs_index; + guint8 redundancy_version_index; + guint8 resource_block_length; + guint8 harq_id; + gboolean ndi; + guint8 transport_block; /* 0..1 */ + } dl_info; + } detailed_phy_info; + + /* Relating to out-of-band events */ + /* N.B. dissector will only look to these fields if length is 0... */ + mac_lte_oob_event oob_event; + guint8 rapid; + guint8 rach_attempt_number; + #define MAX_SRs 20 + guint16 number_of_srs; + guint16 oob_ueid[MAX_SRs]; + guint16 oob_rnti[MAX_SRs]; } mac_lte_info; -/* Accessor function to check if a frame was considered to be ReTx */ -//int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction); + +typedef struct mac_lte_tap_info { + /* Info from context */ + guint16 rnti; + guint16 ueid; + guint8 rntiType; + guint8 isPredefinedData; + gboolean crcStatusValid; + mac_lte_crc_status crcStatus; + guint8 direction; + + guint8 isPHYRetx; + guint16 ueInTTI; + + nstime_t mac_lte_time; + + /* Number of bytes (which part is used depends upon context settings) */ + guint32 single_number_of_bytes; + guint32 bytes_for_lcid[11]; + guint32 sdus_for_lcid[11]; + guint8 number_of_rars; + guint8 number_of_paging_ids; + + /* Number of padding bytes includes padding subheaders and trailing padding */ + guint16 padding_bytes; + guint16 raw_length; +} mac_lte_tap_info; + + /*****************************************************************/ /* UDP framing format */ @@ -153,12 +233,10 @@ typedef struct mac_lte_info { /* and implemented by this dissector, using the definitions */ /* below. A link to an example program showing you how to encode */ /* these headers and send LTE MAC PDUs on a UDP socket is */ -/* provided at http://wiki.wireshark.org/MAC-LTE */ +/* provided at https://wiki.wireshark.org/MAC-LTE */ /* */ -/* A heuristic dissecter (enabled by a preference) will */ -/* recognise a signature at the beginning of these frames . */ -/* Until someone is using this format, suggestions for changes */ -/* are welcome. */ +/* A heuristic dissector (enabled by a preference) will */ +/* recognise a signature at the beginning of these frames. */ /*****************************************************************/ @@ -177,7 +255,7 @@ typedef struct mac_lte_info { to show you display/filter/plot/add-custom-columns on these fields, so should be added if available. The format is to have the tag, followed by the value (there is no length field, - its implicit from the tag) */ + it's implicit from the tag) */ #define MAC_LTE_RNTI_TAG 0x02 /* 2 bytes, network order */ @@ -185,8 +263,8 @@ typedef struct mac_lte_info { #define MAC_LTE_UEID_TAG 0x03 /* 2 bytes, network order */ -#define MAC_LTE_SUBFRAME_TAG 0x04 -/* 2 bytes, network order */ +#define MAC_LTE_FRAME_SUBFRAME_TAG 0x04 +/* 2 bytes, network order, SFN is stored in 12 MSB and SF in 4 LSB */ #define MAC_LTE_PREDEFINED_DATA_TAG 0x05 /* 1 byte */ @@ -200,29 +278,101 @@ typedef struct mac_lte_info { #define MAC_LTE_EXT_BSR_SIZES_TAG 0x08 /* 0 byte */ -#define MAC_LTE_OOB_EVENT_TAG 0x09 -/* 3 byte */ +#define MAC_LTE_SEND_PREAMBLE_TAG 0x09 +/* 2 bytes, RAPID value (1 byte) followed by RACH attempt number (1 byte) */ + +#define MAC_LTE_CARRIER_ID_TAG 0x0A +/* 1 byte */ + +#define MAC_LTE_PHY_TAG 0x0B +/* variable length, length (1 byte) then depending on direction + in UL: modulation type (1 byte), TBS index (1 byte), RB length (1 byte), + RB start (1 byte), HARQ id (1 byte), NDI (1 byte) + in DL: DCI format (1 byte), resource allocation type (1 byte), aggregation level (1 byte), + MCS index (1 byte), redundancy version (1 byte), resource block length (1 byte), + HARQ id (1 byte), NDI (1 byte), TB (1 byte), DL reTx (1 byte) */ + +#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL_TAG 0x0C +/* 0 byte */ + +#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL_TAG 0x0D +/* 0 byte */ + +#define MAC_LTE_CE_MODE_TAG 0x0E +/* 1 byte containing mac_lte_ce_mode enum value */ + +#define MAC_LTE_NB_MODE_TAG 0x0F +/* 1 byte containing mac_lte_nb_mode enum value */ + +#define MAC_LTE_N_UL_RB_TAG 0x10 +/* 1 byte containing the number of UL resource blocks: 6, 15, 25, 50, 75 or 100 */ + +#define MAC_LTE_SR_TAG 0x11 +/* 2 bytes for the number of items, followed by that number of ueid, rnti (2 bytes each) */ + /* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU continues until the end of the frame) */ #define MAC_LTE_PAYLOAD_TAG 0x01 -/* Set details of an LCID -> drb channel mapping. To be called from - configuration protocol (e.g. RRC) */ -/*void set_mac_lte_channel_mapping(guint16 ueid, guint8 lcid, - guint8 srbid, guint8 drbid, - guint8 rlcMode, guint8 um_sn_length, - guint8 ul_priority); -*/ -/* Functions to be called from outside this module (e.g. in a plugin, where mac_lte_info - isn't available) to get/set per-packet data */ -//mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo); -//void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info); - -/* Function to attempt to populate p_mac_lte_info using framing definition above */ -/*gboolean dissect_mac_lte_context_fields(struct mac_lte_info *p_mac_lte_info, tvbuff_t *tvb, - gint *p_offset); -*/ - -#endif /* PACKET_MAC_LTE_H_ */ +/* Type to store parameters for configuring LCID->RLC channel settings for DRB */ +/* Some are optional, and may not be seen (e.g. on reestablishment) */ +typedef struct drb_mapping_t +{ + guint16 ueid; /* Mandatory */ + guint8 drbid; /* Mandatory */ + gboolean lcid_present; + guint8 lcid; /* Part of LogicalChannelConfig - optional */ + gboolean rlcMode_present; + guint8 rlcMode; /* Part of RLC config - optional */ + gboolean rlc_ul_ext_li_field; /* Part of RLC config - optional */ + gboolean rlc_dl_ext_li_field; /* Part of RLC config - optional */ + gboolean rlc_ul_ext_am_sn; /* Part of RLC config - optional */ + gboolean rlc_dl_ext_am_sn; /* Part of RLC config - optional */ + gboolean um_sn_length_present; + guint8 um_sn_length; /* Part of RLC config - optional */ + gboolean ul_priority_present; + guint8 ul_priority; /* Part of LogicalChannelConfig - optional */ + gboolean pdcp_sn_size_present; + guint8 pdcp_sn_size; /* Part of pdcp-Config - optional */ +} drb_mapping_t; + + + +/* Dedicated DRX config. Used to verify that a sensible config is given. + Also, beginning to configure MAC with this config and (optionally) show + DRX config and state (cycles/timers) attached to each UL/DL PDU! */ +typedef struct drx_config_t { + gboolean configured; + guint32 frameNum; + guint32 previousFrameNum; + + guint32 onDurationTimer; + guint32 inactivityTimer; + guint32 retransmissionTimer; + guint32 longCycle; + guint32 cycleOffset; + /* Optional Short cycle */ + gboolean shortCycleConfigured; + guint32 shortCycle; + guint32 shortCycleTimer; +} drx_config_t; + +/* RRC can indicate whether simultaneous PUCCH/PUSCH is used */ +typedef enum { + SIMULT_PUCCH_PUSCH_PCELL = 0, + SIMULT_PUCCH_PUSCH_PSCELL +} simult_pucch_pusch_cell_type; +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index 2f7dac3d1ed9a7a568af2ecae00d86b58529e7ad..a1e53671682a10f0f984cbcd831b98c0116378e2 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -95,26 +95,22 @@ what about the implementation int opt_enabled=0; -#define PACKET_MAC_LTE_DEFAULT_UDP_PORT (9999) - -typedef uint8_t guint8; -typedef uint16_t guint16; -typedef uint32_t guint32; -typedef guint8 gboolean; - -#include "packet-mac-lte.h" -#include "mac_pcap.h" - //static unsigned char g_PDUBuffer[1600]; //static unsigned int g_PDUOffset; - char in_ip[40]; -char in_path[100]; +char in_path[FILENAME_MAX]; FILE *file_fd = NULL; +pcap_hdr_t file_header = { + 0xa1b2c3d4, /* magic number */ + 2, 4, /* version number is 2.4 */ + 0, /* timezone */ + 0, /* sigfigs - apparently all tools do this */ + 65535, /* snaplen - this should be long enough */ + MAC_LTE_DLT /* Data Link Type (DLT). Set as unused value 147 for now */ +}; trace_mode_t opt_type = OPT_NONE; -static radio_type_t radio_type; static unsigned int subframesSinceCaptureStart; static int g_socksd = -1;/* UDP socket used for sending frames */ @@ -237,22 +233,13 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, guint8 oob_event, guint8 oob_event_value, uint8_t *pdu_buffer, unsigned int pdu_buffer_size) { - #ifdef JUMBO_FRAME - static unsigned char frameBuffer[9000]; - #else - static unsigned char frameBuffer[1600]; - #endif - static unsigned int frameOffset; + unsigned char frameBuffer[9000]; + unsigned int frameOffset; ssize_t bytesSent; frameOffset = 0; uint16_t tmp16; - /********************************************************************/ - /* Fixed start to each frame (allowing heuristic dissector to work) */ - /* Not NULL terminated */ - memset(frameBuffer+frameOffset, 0, sizeof(mac_lte_info)+pdu_buffer_size + 8); - memcpy(frameBuffer+frameOffset, MAC_LTE_START_STRING, strlen(MAC_LTE_START_STRING)); frameOffset += strlen(MAC_LTE_START_STRING); @@ -279,7 +266,7 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, frameOffset += 2; /* Subframe number */ - frameBuffer[frameOffset++] = MAC_LTE_SUBFRAME_TAG; + frameBuffer[frameOffset++] = MAC_LTE_FRAME_SUBFRAME_TAG; tmp16 = htons(sfnSf); // frame counter : this will give an expert info as wireshark expects SF and not F memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; @@ -313,26 +300,29 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, if (pdu_buffer_size==0) { switch (oob_event) { case ltemac_send_preamble : - LOG_D(OPT,"oob ltemac_send_preamble event %02x." + LOG_D(OPT,"ltemac_send_preamble event %02x." //"%02x." "%02x.%02x\n", - MAC_LTE_OOB_EVENT_TAG, + MAC_LTE_SEND_PREAMBLE_TAG, //ltemac_send_preamble, rnti, oob_event_value); //frameBuffer[frameOffset++]=0; //frameBuffer[frameOffset++]=0; //frameBuffer[frameOffset++]=0; - frameBuffer[frameOffset++] = MAC_LTE_OOB_EVENT_TAG; + frameBuffer[frameOffset++] = MAC_LTE_SEND_PREAMBLE_TAG; //frameBuffer[frameOffset++]=ltemac_send_preamble; frameBuffer[frameOffset++]=rnti; // is the preamble frameBuffer[frameOffset++]=oob_event_value; break; case ltemac_send_sr: - frameBuffer[frameOffset++]=ltemac_send_sr; + frameBuffer[frameOffset++]=MAC_LTE_SR_TAG ; frameOffset+=2; + frameBuffer[frameOffset++]=rnti; + frameOffset++; frameBuffer[frameOffset++]=oob_event_value; + frameOffset++; break; case ltemac_sr_failure: @@ -394,7 +384,7 @@ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, offset += 2; /* Subframe number */ - context_header[offset++] = MAC_LTE_SUBFRAME_TAG; + context_header[offset++] = MAC_LTE_FRAME_SUBFRAME_TAG; tmp16 = htons(context->subFrameNumber); memcpy(context_header+offset, &tmp16, 2); offset += 2; @@ -423,21 +413,27 @@ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, return 1; } - +#include <common/ran_context.h> +extern RAN_CONTEXT_t RC; +#include <openair1/PHY/phy_extern_ue.h> /* Remote serveraddress (where Wireshark is running) */ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event, int oob_event_value) { MAC_Context_Info_t pdu_context; - + int radioType=FDD_RADIO; + if (RC.eNB[0][0]!=NULL) + radioType=RC.eNB[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO; + if (PHY_vars_UE_g[0][0] != NULL) + radioType=PHY_vars_UE_g[0][0]->frame_parms.frame_type== FDD ? FDD_RADIO:TDD_RADIO; switch (opt_type) { case OPT_WIRESHARK : if (g_socksd == -1) { return; } - SendFrame(radio_type, + SendFrame( radioType, (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK, rntiType, rnti, ueid, (sysFrameNumber<<4) + subFrameNumber, 1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus @@ -450,7 +446,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, return; } - pdu_context.radioType = radio_type; + pdu_context.radioType = radioType; pdu_context.direction = (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK; pdu_context.rntiType = rntiType; @@ -470,7 +466,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, } } /*---------------------------------------------------*/ -int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p) +int init_opt(char *path, char *ip) { uint16_t in_port; subframesSinceCaptureStart = 0; @@ -489,13 +485,7 @@ int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p) strcpy( in_ip, "127.0.0.1" ); } - if (port != NULL) { - in_port = atoi(port); - } else { - in_port = PACKET_MAC_LTE_DEFAULT_UDP_PORT; - } - - radio_type = radio_type_p; + in_port = PACKET_MAC_LTE_DEFAULT_UDP_PORT; // trace_mode switch (opt_type) { diff --git a/openair2/UTIL/OPT/ws_compiler_tests.h b/openair2/UTIL/OPT/ws_compiler_tests.h new file mode 100644 index 0000000000000000000000000000000000000000..46a4ab6099d2d9a2826f42f2884eae962efedff1 --- /dev/null +++ b/openair2/UTIL/OPT/ws_compiler_tests.h @@ -0,0 +1,138 @@ +/* ws_compiler_tests.h + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef __WS_COMPILER_TESTS_H__ +#define __WS_COMPILER_TESTS_H__ + +/* + * This was introduced by Clang: + * + * http://clang.llvm.org/docs/LanguageExtensions.html#has-attribute + * + * in some version (which version?); it has been picked up by GCC 5.0. + */ +#ifndef __has_attribute + /* + * It's a macro, so you can check whether it's defined to check + * whether it's supported. + * + * If it's not, define it to always return 0, so that we move on to + * the fallback checks. + */ + #define __has_attribute(x) 0 +#endif + +/* + * Note that the C90 spec's "6.8.1 Conditional inclusion" and the + * C99 spec's and C11 spec's "6.10.1 Conditional inclusion" say: + * + * Prior to evaluation, macro invocations in the list of preprocessing + * tokens that will become the controlling constant expression are + * replaced (except for those macro names modified by the defined unary + * operator), just as in normal text. If the token "defined" is + * generated as a result of this replacement process or use of the + * "defined" unary operator does not match one of the two specified + * forms prior to macro replacement, the behavior is undefined. + * + * so you shouldn't use defined() in a #define that's used in #if or + * #elif. Some versions of Clang, for example, will warn about this. + * + * Instead, we check whether the pre-defined macros for particular + * compilers are defined and, if not, define the "is this version XXX + * or a later version of this compiler" macros as 0. + */ + +/* + * Check whether this is GCC major.minor or a later release, or some + * compiler that claims to be "just like GCC" of that version or a + * later release. + */ + +#if !defined(__GNUC__) + #define WS_IS_AT_LEAST_GNUC_VERSION(major, minor) 0 +#else + #define WS_IS_AT_LEAST_GNUC_VERSION(major, minor) \ + (__GNUC__ > (major) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) +#endif + +/* + * Check whether this is Clang major.minor or a later release. + */ + +#if !defined(__clang__) + #define WS_IS_AT_LEAST_CLANG_VERSION(major, minor) 0 +#else + #define WS_IS_AT_LEAST_CLANG_VERSION(major, minor) \ + (__clang_major__ > (major) || \ + (__clang_major__ == (major) && __clang_minor__ >= (minor))) +#endif + +/* + * Check whether this is Sun C/SunPro C/Oracle Studio major.minor + * or a later release. + * + * The version number in __SUNPRO_C is encoded in hex BCD, with the + * uppermost hex digit being the major version number, the next + * one or two hex digits being the minor version number, and + * the last digit being the patch version. + * + * It represents the *compiler* version, not the product version; + * see + * + * https://sourceforge.net/p/predef/wiki/Compilers/ + * + * for a partial mapping, which we assume continues for later + * 12.x product releases. + */ + +#if !defined(__SUNPRO_C) + #define WS_IS_AT_LEAST_SUNC_VERSION(major, minor) 0 +#else + #define WS_SUNPRO_VERSION_TO_BCD(major, minor) \ + (((minor) >= 10) ? \ + (((major) << 12) | (((minor)/10) << 8) | (((minor)%10) << 4)) : \ + (((major) << 8) | ((minor) << 4))) + #define WS_IS_AT_LEAST_SUNC_VERSION(major, minor) \ + (__SUNPRO_C >= WS_SUNPRO_VERSION_TO_BCD((major), (minor))) +#endif + +/* + * Check whether this is IBM XL C major.minor or a later release. + * + * The version number in __xlC__ has the major version in the + * upper 8 bits and the minor version in the lower 8 bits. + */ + +#if !defined(__xlC__) + #define WS_IS_AT_LEAST_XL_C_VERSION(major, minor) 0 +#else + #define WS_IS_AT_LEAST_XL_C_VERSION(major, minor) \ + (__xlC__ >= (((major) << 8) | (minor))) +#endif + +/* + * Check whether this is HP aC++/HP C major.minor or a later release. + * + * The version number in __HP_aCC is encoded in zero-padded decimal BCD, + * with the "A." stripped off, the uppermost two decimal digits being + * the major version number, the next two decimal digits being the minor + * version number, and the last two decimal digits being the patch version. + * (Strip off the A., remove the . between the major and minor version + * number, and add two digits of patch.) + */ + +#if !defined(__HP_aCC) + #define WS_IS_AT_LEAST_HP_C_VERSION(major, minor) 0 +#else + #define WS_IS_AT_LEAST_HP_C_VERSION(major, minor) \ + (__HP_aCC >= ((major)*10000 + (minor)*100)) +#endif + +#endif /* __WS_COMPILER_TESTS_H__ */ diff --git a/openair2/UTIL/OPT/ws_symbol_export.h b/openair2/UTIL/OPT/ws_symbol_export.h new file mode 100644 index 0000000000000000000000000000000000000000..4c7a2f710af741a948163a0efb7892af7be5a662 --- /dev/null +++ b/openair2/UTIL/OPT/ws_symbol_export.h @@ -0,0 +1,202 @@ +/* + * Cross platform defines for exporting symbols from shared libraries + * + * Wireshark - Network traffic analyzer + * By Balint Reczey <balint@balintreczey.hu> + * Copyright 2013 Balint Reczey + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "ws_compiler_tests.h" + +/** Reset symbol export behavior. + * If you {un}define WS_BUILD_DLL on the fly you'll have to define this + * as well. + */ +#ifdef RESET_SYMBOL_EXPORT + +#ifdef SYMBOL_EXPORT_H +#undef SYMBOL_EXPORT_H +#endif + +#ifdef WS_DLL_PUBLIC +#undef WS_DLL_PUBLIC +#endif + +#ifdef WS_DLL_PUBLIC_DEF +#undef WS_DLL_PUBLIC_DEF +#endif + +#ifdef WS_DLL_LOCAL +#undef WS_DLL_LOCAL +#endif + +#endif /* RESET_SYMBOL_EXPORT */ + +#ifndef SYMBOL_EXPORT_H +#define SYMBOL_EXPORT_H + +/* + * NOTE: G_HAVE_GNUC_VISIBILITY is defined only if all of + * + * __attribute__ ((visibility ("hidden"))) + * + * __attribute__ ((visibility ("internal"))) + * + * __attribute__ ((visibility ("protected"))) + * + * __attribute__ ((visibility ("default"))) + * + * are supported, and at least some versions of GCC from Apple support + * "default" and "hidden" but not "internal" or "protected", so it + * shouldn't be used to determine whether "hidden" or "default" is + * supported. + * + * This also means that we shouldn't use G_GNUC_INTERNAL instead of + * WS_DLL_LOCAL, as GLib uses G_HAVE_GNUC_VISIBILITY to determine + * whether to use __attribute__ ((visibility ("hidden"))) for + * G_GNUC_INTERNAL, and that will not use it even with compilers + * that support it. + */ + +/* Originally copied from GCC Wiki at http://gcc.gnu.org/wiki/Visibility */ +#if defined _WIN32 || defined __CYGWIN__ + /* Compiling for Windows, so we use the Windows DLL declarations. */ + #ifdef WS_BUILD_DLL + /* + * Building a DLL; for all definitions, we want dllexport, and + * (presumably so source from DLL and source from a program using the + * DLL can both include a header that declares APIs and exported data + * for the DLL), for declarations, either dllexport or dllimport will + * work (they mean the same thing for a declaration when building a DLL). + */ + #ifdef __GNUC__ + /* GCC */ + #define WS_DLL_PUBLIC_DEF __attribute__ ((dllexport)) + #else /* ! __GNUC__ */ + /* + * Presumably MSVC. + * Note: actually gcc seems to also support this syntax. + */ + #define WS_DLL_PUBLIC_DEF __declspec(dllexport) + #endif /* __GNUC__ */ + #else /* WS_BUILD_DLL */ + /* + * Building a program; we should only see declarations, not definitions, + * with WS_DLL_PUBLIC, and they all represent APIs or data imported + * from a DLL, so use dllimport. + * + * For functions, export shouldn't be necessary; for data, it might + * be necessary, e.g. if what's declared is an array whose size is + * not given in the declaration. + */ + #ifdef __GNUC__ + /* GCC */ + #define WS_DLL_PUBLIC_DEF __attribute__ ((dllimport)) + #elif ! (defined ENABLE_STATIC) /* ! __GNUC__ */ + /* + * Presumably MSVC, and we're not building all-static. + * Note: actually gcc seems to also support this syntax. + */ + #define WS_DLL_PUBLIC_DEF __declspec(dllimport) + #else /* ! __GNUC__ && ENABLE_STATIC */ + /* + * Presumably MSVC, and we're building all-static, so we're + * not building any DLLs. + */ + #define WS_DLL_PUBLIC_DEF + #endif /* __GNUC__ */ + #endif /* WS_BUILD_DLL */ + + /* + * Symbols in a DLL are *not* exported unless they're specifically + * flagged as exported, so, for a non-static but non-exported + * symbol, we don't have to do anything. + */ + #define WS_DLL_LOCAL +#else /* defined _WIN32 || defined __CYGWIN__ */ + /* + * Compiling for UN*X, where the dllimport and dllexport stuff + * is neither necessary nor supported; just specify the + * visibility if we have a compiler that supports doing so. + */ + #if WS_IS_AT_LEAST_GNUC_VERSION(3,4) \ + || WS_IS_AT_LEAST_XL_C_VERSION(12,0) + /* + * GCC 3.4 or later, or some compiler asserting compatibility with + * GCC 3.4 or later, or XL C 13.0 or later, so we have + * __attribute__((visibility()). + */ + + /* + * Symbols exported from libraries. + */ + #define WS_DLL_PUBLIC_DEF __attribute__ ((visibility ("default"))) + + /* + * Non-static symbols *not* exported from libraries. + */ + #define WS_DLL_LOCAL __attribute__ ((visibility ("hidden"))) + #elif WS_IS_AT_LEAST_SUNC_VERSION(5,5) + /* + * Sun C 5.5 or later, so we have __global and __hidden. + * (Sun C 5.9 and later also have __attribute__((visibility()), + * but there's no reason to prefer it with Sun C.) + */ + + /* + * Symbols exported from libraries. + */ + #define WS_DLL_PUBLIC_DEF __global + + /* + * Non-static symbols *not* exported from libraries. + */ + #define WS_DLL_LOCAL __hidden + #else + /* + * We have neither a way to make stuff not explicitly marked as + * visible invisible outside a library nor a way to make stuff + * explicitly marked as local invisible outside the library. + */ + + /* + * Symbols exported from libraries. + */ + #define WS_DLL_PUBLIC_DEF + + /* + * Non-static symbols *not* exported from libraries. + */ + #define WS_DLL_LOCAL + #endif +#endif + +/* + * You *must* use this for exported data *declarations*; if you use + * WS_DLL_PUBLIC_DEF, some compilers, such as MSVC++, will complain + * about array definitions with no size. + * + * You must *not* use this for exported data *definitions*, as that + * will, for some compilers, cause warnings about items being initialized + * and declared extern. + * + * Either can be used for exported *function* declarations and definitions. + */ +#define WS_DLL_PUBLIC WS_DLL_PUBLIC_DEF extern + +#endif /* SYMBOL_EXPORT_H */ + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local Variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c index 2ac875155d6294cf1bd815f960164ae4cdc59c58..cc2954f77bcfb212874add515e90f82d76fdb483 100644 --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -66,7 +66,7 @@ ssize_t x2ap_generate_initiating_message( pdu.present = X2AP_X2AP_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage.procedureCode = procedureCode; pdu.choice.initiatingMessage.criticality = criticality; - ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); + ANY_fromType_aper((ANY_t *)&pdu.choice.initiatingMessage.value, td, sptr); if (asn1_xer_print) { xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, (void *)&pdu); @@ -98,7 +98,7 @@ ssize_t x2ap_generate_successfull_outcome( pdu.present = X2AP_X2AP_PDU_PR_successfulOutcome; pdu.choice.successfulOutcome.procedureCode = procedureCode; pdu.choice.successfulOutcome.criticality = criticality; - ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); + ANY_fromType_aper((ANY_t *)&pdu.choice.successfulOutcome.value, td, sptr); if (asn1_xer_print) { xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, (void *)&pdu); @@ -130,7 +130,7 @@ ssize_t x2ap_generate_unsuccessfull_outcome( pdu.present = X2AP_X2AP_PDU_PR_unsuccessfulOutcome; pdu.choice.successfulOutcome.procedureCode = procedureCode; pdu.choice.successfulOutcome.criticality = criticality; - ANY_fromType_aper(&pdu.choice.successfulOutcome.value, td, sptr); + ANY_fromType_aper((ANY_t *)&pdu.choice.successfulOutcome.value, td, sptr); if (asn1_xer_print) { xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, (void *)&pdu); diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index 1a4889f0f01699cb307b8e1c30b08351a1a4df36..76cc92aed23ee05c1ed49a192d6c502ecba8bca4 100644 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -57,11 +57,10 @@ #define FALSE 0 #endif -extern int asn_debug; extern int asn1_xer_print; #if defined(ENB_MODE) -# include "log.h" +# include "common/utils/LOG/log.h" # define X2AP_ERROR(x, args...) LOG_E(X2AP, x, ##args) # define X2AP_WARN(x, args...) LOG_W(X2AP, x, ##args) # define X2AP_DEBUG(x, args...) LOG_D(X2AP, x, ##args) diff --git a/openair3/NAS/COMMON/UTIL/nas_log.c b/openair3/NAS/COMMON/UTIL/nas_log.c deleted file mode 100644 index 6af90c4be871ab88e0a698c0926efd43f9f87b09..0000000000000000000000000000000000000000 --- a/openair3/NAS/COMMON/UTIL/nas_log.c +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/***************************************************************************** -Source nas_log.c - -Version 0.1 - -Date 2012/02/28 - -Product NAS stack - -Subsystem Utilities - -Author Frederic Maurel - -Description Usefull logging functions - -*****************************************************************************/ - -#include "nas_log.h" -#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE) -int nas_log_func_indent; -#else -#include <stdio.h> // stderr, sprintf, fprintf, vfprintf -#include <stdarg.h> // va_list, va_start, va_end -#include <string.h> // strlen - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -/* ANSI escape codes for colored display */ -#define LOG_BLACK "\033[30m" -#define LOG_RED "\033[31m" -#define LOG_GREEN "\033[32m" -#define LOG_YELLOW "\033[33m" -#define LOG_BLUE "\033[34m" -#define LOG_MAGENTA "\033[35m" -#define LOG_CYAN "\033[36m" -#define LOG_WHITE "\033[37m" -#define LOG_END "\033[0m" -#define LOG_AUTO LOG_END - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -/* ------------------------ - * Internal logging context - * ------------------------ - * Internal logging context consists on: - * - The file name and the line number from where the data have been - * logged. These information are gathered into a string that will - * be displayed as a prefix of the logging trace with the format - * filename[line] - * - The severity level filter - * - The indentation level to convey FUNC logging traces - * - The data definition of each logging trace level: name and mask - * (the mask is used against the severity level filter to enable - * or disable specific logging traces) - */ -typedef struct { -#define LOG_PREFIX_SIZE 118 - char prefix[LOG_PREFIX_SIZE]; - unsigned char filter; - int indent; - const struct { - char* name; - unsigned char mask; - char* color; - } level[]; -} log_context_t; - -/* - * Definition of the logging context - */ -static log_context_t _log_context = { - "", /* prefix */ - 0x00, /* filter */ - 0, /* indent */ - { - { "DEBUG", NAS_LOG_DEBUG, LOG_GREEN }, /* DEBUG */ - { "INFO", NAS_LOG_INFO, LOG_AUTO }, /* INFO */ - { "WARNING", NAS_LOG_WARNING, LOG_BLUE }, /* WARNING */ - { "ERROR", NAS_LOG_ERROR, LOG_RED }, /* ERROR */ - { "", NAS_LOG_FUNC, LOG_AUTO }, /* FUNC_IN */ - { "", NAS_LOG_FUNC, LOG_AUTO }, /* FUNC_OUT */ - } /* level[] */ -}; - -/* Maximum number of bytes into a line of dump logging data */ -#define LOG_DUMP_LINE_SIZE 16 - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -/**************************************************************************** - ** ** - ** Name: log_init() ** - ** ** - ** Description: Initializes internal logging data ** - ** ** - ** Inputs: filter: Value of the severity level that will be ** - ** used as a filter to enable or disable ** - ** specific logging traces ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void nas_log_init(char filter) -{ - _log_context.filter = filter; -} - -/**************************************************************************** - ** ** - ** Name: log_data() ** - ** ** - ** Description: Defines internal logging data ** - ** ** - ** Inputs: filename: Name of the file from where the data have ** - ** been logged ** - ** line: Number of the line in the file ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void log_data(const char* filename, int line) -{ - int len = strlen(filename) + 2 + 1; //2:[], 1:/0 - if (line > 9999) len+=5; - else if (line > 999) len+=4; - else if (line > 99) len+=3; - else if (line > 9) len+=2; - else len+=1; - if (len > LOG_PREFIX_SIZE) { - snprintf(_log_context.prefix, LOG_PREFIX_SIZE, "%s:%d", &filename[len - LOG_PREFIX_SIZE], line); - } else { - snprintf(_log_context.prefix, LOG_PREFIX_SIZE, "%s:%d", filename, line); - } -} - -/**************************************************************************** - ** ** - ** Name: log_trace() ** - ** ** - ** Description: Displays logging data ** - ** ** - ** Inputs: severity: Severity level of the logging data ** - ** data: Formated logging data to display ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void log_trace(log_severity_t severity, const char* data, ...) -{ - int i; - - /* Sanity check */ - if (severity > LOG_SEVERITY_MAX) return; - - /* Display only authorized logging traces */ - if (_log_context.level[severity].mask & _log_context.filter) { - va_list argp; - - /* - * First, display internal logging data (logging trace prefix: file - * name and line number from where the data have been logged) and - * the severity level. - */ - fprintf(stderr, "%s%-120.118s%-10s", _log_context.level[severity].color, - _log_context.prefix, _log_context.level[severity].name); - { - /* Next, perform indentation for FUNC logging trace */ - if (severity == FUNC_OUT) { - _log_context.indent--; - } - - for (i=0; i<_log_context.indent; i++) { - fprintf(stderr, " "); - } - - if (severity == FUNC_IN) { - _log_context.indent++; - } - } - - /* Finally, display logging data */ - va_start(argp, data); - vfprintf(stderr, data, argp); - - /* Terminate with line feed character */ - fprintf(stderr, "%s\n", LOG_END); - - va_end(argp); - } -} - -/**************************************************************************** - ** ** - ** Name: log_dump() ** - ** ** - ** Description: Dump logging data ** - ** ** - ** Inputs: data: Logging data to dump ** - ** len: Number of bytes to be dumped ** - ** Others: None ** - ** ** - ** Outputs: Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -void log_dump(const char* data, int len) -{ - int i; - - /* Display only authorized logging traces */ - if ( (len > 0) && (NAS_LOG_HEX & _log_context.filter) ) { - int bytes = 0; - - fprintf(stderr, "\n\t"); - - for (i=0; i < len; i++) { - fprintf(stderr, "%.2hx ", (const unsigned char) data[i]); - - /* Add new line when the number of displayed bytes exceeds - * the line's size */ - if ( ++bytes > (LOG_DUMP_LINE_SIZE - 1) ) { - bytes = 0; - fprintf(stderr, "\n\t"); - } - } - - if (bytes % LOG_DUMP_LINE_SIZE) { - fprintf(stderr, "\n"); - } - - fprintf(stderr, "\n"); - fflush(stderr); - } -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ -#endif - diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index c36e0795c7a141b1115d359773b376c7f86c5ec7..b41e34c51be03fe99aeeccfc104a580337e3e4a8 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.h +++ b/openair3/NAS/COMMON/UTIL/nas_log.h @@ -95,7 +95,7 @@ typedef enum { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE) +#ifdef LOG_E # define LOG_TRACE(s, x, args...) \ do { \ switch (s) { \ @@ -106,54 +106,21 @@ do { \ } \ } while (0) -# define LOG_DUMP(dATA, lEN) \ -do { \ - char buffer[3*lEN + 1]; \ - int i; \ - for (i = 0; i < lEN; i++) \ - sprintf (&buffer[3*i], "%02x ", dATA[i]); \ - LOG_D(NAS, " Dump %d: %s\n", lEN, buffer); \ -} while (0) - -# define LOG_FUNC_IN \ -do { \ - LOG_D(NAS, " %s:%d %*sEntering %s()\n", __FILE__, __LINE__, nas_log_func_indent, "", __FUNCTION__); \ - nas_log_func_indent += 2; \ -} while (0) - -# define LOG_FUNC_OUT \ -do { \ - nas_log_func_indent -= 2; \ - LOG_D(NAS, " %s:%d %*sLeaving %s()\n", __FILE__, __LINE__, nas_log_func_indent, "", __FUNCTION__); \ -} while (0) - -# define LOG_FUNC_RETURN(rETURNcODE) \ -do { \ - nas_log_func_indent -= 2; \ - LOG_D(NAS, " %s:%d %*sLeaving %s(rc = %ld)\n", __FILE__, __LINE__, nas_log_func_indent, "", \ - __FUNCTION__, (long) (rETURNcODE)); \ - return (rETURNcODE); \ -} while (0) +# define LOG_DUMP(dATA, lEN) LOG_DUMPMSG(NAS, DEBUG_NAS,dATA, lEN, " Dump %d:\n", lEN) +# define LOG_FUNC_IN LOG_ENTER(NAS) +# define LOG_FUNC_OUT LOG_END(NAS) +# define LOG_FUNC_RETURN(rETURNcODE) LOG_RETURN(NAS,rETURNcODE) extern int nas_log_func_indent; #else -# define LOG_TRACE log_data(__FILE__, __LINE__); log_trace -# define LOG_DUMP(a, b) log_dump((a),(b)); - -# define LOG_FUNC_IN LOG_TRACE(FUNC_IN, "Entering %s()", __FUNCTION__) -# define LOG_FUNC_OUT LOG_TRACE(FUNC_OUT, "Leaving %s()", __FUNCTION__) -# define LOG_FUNC_RETURN(rETURNcODE) \ -do { \ - LOG_TRACE(FUNC_OUT, "Leaving %s(rc = %ld)", __FUNCTION__, \ - (long) (rETURNcODE)); \ - return (rETURNcODE); \ -} while(0) - -void nas_log_init(char filter); -void log_data(const char* filename, int line); -void log_trace(log_severity_t severity, const char* data, ...); -void log_dump(const char* data, int len); +# define LOG_TRACE(s, x, args...) +# define LOG_DUMP(dATA, lEN) LOG_DUMPMSG(NAS, LOG_DUMP_CHAR,dATA, lEN, " Dump %d:\n", lEN) + +# define LOG_FUNC_IN +# define LOG_FUNC_OUT +# define LOG_FUNC_RETURN(rETURNcODE) return rETURNcODE \ + #endif #endif /* __NAS_LOG_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.c b/openair3/NAS/UE/EMM/SAP/emm_fsm.c index d614b9ec7e42a5008c275251c1b6d229ab2b021c..5a715727ad17f3e091b7ca04a01eee113d2ccc59 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.c @@ -208,8 +208,7 @@ emm_fsm_state_t emm_fsm_initialize() { LOG_FUNC_IN; - LOG_FUNC_OUT; - return EMM_NULL; + LOG_FUNC_RETURN(EMM_NULL); } /**************************************************************************** diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 index db1f1b59150a5d17de2764d473ddd2627dc91d23..97d0a6de871ff1b8c4dd48a45df457f7d423223a 100755 --- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 +++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 @@ -6881,3 +6881,201 @@ id-EDT-Session ProtocolIE-ID ::= 281 id-CNTypeRestrictions ProtocolIE-ID ::= 282 END + +-- ************************************************************** +-- +-- Container definitions +-- +-- ************************************************************** + +S1AP-Containers { +itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) +eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + Criticality, + Presence, + PrivateIE-ID, + ProtocolExtensionID, + ProtocolIE-ID +FROM S1AP-CommonDataTypes + + maxPrivateIEs, + maxProtocolExtensions, + maxProtocolIEs +FROM S1AP-Constants; + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES-PAIR ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &firstCriticality Criticality, + &FirstValue, + &secondCriticality Criticality, + &SecondValue, + &presence Presence +} +WITH SYNTAX { + ID &id + FIRST CRITICALITY &firstCriticality + FIRST TYPE &FirstValue + SECOND CRITICALITY &secondCriticality + SECOND TYPE &SecondValue + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol Extensions +-- +-- ************************************************************** + +S1AP-PROTOCOL-EXTENSION ::= CLASS { + &id ProtocolExtensionID UNIQUE, + &criticality Criticality, + &Extension, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + EXTENSION &Extension + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Private IEs +-- +-- ************************************************************** + +S1AP-PRIVATE-IES ::= CLASS { + &id PrivateIE-ID, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Container for Protocol IEs +-- +-- ************************************************************** + +ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES.&id ({IEsSetParam}), + criticality S1AP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PROTOCOL-IES.&Value ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Protocol IE Pairs +-- +-- ************************************************************** + +ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldPair {{IEsSetParam}} + +ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES-PAIR.&id ({IEsSetParam}), + firstCriticality S1AP-PROTOCOL-IES-PAIR.&firstCriticality ({IEsSetParam}{@id}), + firstValue S1AP-PROTOCOL-IES-PAIR.&FirstValue ({IEsSetParam}{@id}), + secondCriticality S1AP-PROTOCOL-IES-PAIR.&secondCriticality ({IEsSetParam}{@id}), + secondValue S1AP-PROTOCOL-IES-PAIR.&SecondValue ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container Lists for Protocol IE Containers +-- +-- ************************************************************** + +ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-SingleContainer {{IEsSetParam}} + +ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-ContainerPair {{IEsSetParam}} + +-- ************************************************************** +-- +-- Container for Protocol Extensions +-- +-- ************************************************************** + +ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= + SEQUENCE (SIZE (1..maxProtocolExtensions)) OF + ProtocolExtensionField {{ExtensionSetParam}} + +ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-EXTENSION.&id ({ExtensionSetParam}), + criticality S1AP-PROTOCOL-EXTENSION.&criticality ({ExtensionSetParam}{@id}), + extensionValue S1AP-PROTOCOL-EXTENSION.&Extension ({ExtensionSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Private IEs +-- +-- ************************************************************** + +PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= + SEQUENCE (SIZE (1.. maxPrivateIEs)) OF + PrivateIE-Field {{IEsSetParam}} + +PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PRIVATE-IES.&id ({IEsSetParam}), + criticality S1AP-PRIVATE-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PRIVATE-IES.&Value ({IEsSetParam}{@id}) +} + +END diff --git a/openair3/S1AP/s1ap_common.c b/openair3/S1AP/s1ap_common.c index 7c4f970af2f18d61e626c4a7d8f70d607a8d663c..d31c6e58390917b82c12b836fddd40c0ecf286a6 100644 --- a/openair3/S1AP/s1ap_common.c +++ b/openair3/S1AP/s1ap_common.c @@ -32,26 +32,9 @@ #include "s1ap_common.h" #include "S1AP_S1AP-PDU.h" -int asn_debug = 0; -int asn1_xer_print = 0; - -#if defined(EMIT_ASN_DEBUG_EXTERN) -inline void ASN_DEBUG(const char *fmt, ...) -{ - if (asn_debug) { - int adi = asn_debug_indent; - va_list ap; - va_start(ap, fmt); - fprintf(stderr, "[ASN1]"); - while(adi--) fprintf(stderr, " "); +int asn1_xer_print = 0; - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); - va_end(ap); - } -} -#endif void s1ap_handle_criticality(S1AP_Criticality_t criticality) { diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h index 8a2faa311f6e1e015d8c56654363f7e948a32811..94b3e43bc65b8789e330f25179381e0d2de4ba47 100644 --- a/openair3/S1AP/s1ap_common.h +++ b/openair3/S1AP/s1ap_common.h @@ -31,13 +31,16 @@ #ifndef S1AP_COMMON_H_ #define S1AP_COMMON_H_ -/* Defined in asn_internal.h */ -// extern int asn_debug_indent; -extern int asn_debug; -#if defined(EMIT_ASN_DEBUG_EXTERN) -inline void ASN_DEBUG(const char *fmt, ...); +#include "common/utils/LOG/log.h" +/* replace ASN_DEBUG defined in asn_internal.h by oai tracing system + Would be cleaner to modify asn_internal.h but it seems to come + from non oai source, with BSD license, so prefer to do that here.. +*/ +#ifdef ASN_DEBUG +# undef ASN_DEBUG #endif +#define ASN_DEBUG( x... ) LOG_I(ASN, x) #include "S1AP_ProtocolIE-Field.h" #include "S1AP_S1AP-PDU.h" diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index 9b150fe75163f72223fcf627d7f7b0a073f3fb5e..5c6b208b87336111216ec516b78448b47971aa94 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -1043,7 +1043,7 @@ int s1ap_eNB_handle_paging(uint32_t assoc_id, /* Paging procedure -> stream != 0 */ if (stream == 0) { - S1AP_ERROR("[SCTP %d] Received Paging procedure on stream (%d)\n", + LOG_W(S1AP,"[SCTP %d] Received Paging procedure on stream (%d)\n", assoc_id, stream); return -1; } diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index f2f84de32d5140b7eaee9e5388017790d364d171..ebd5bab4fdd8e1b80ec8a61025fafac4501c19ed 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -473,17 +473,11 @@ int s1ap_eNB_handle_nas_downlink(uint32_t assoc_id, MSC_LOG_RX_DISCARDED_MESSAGE( MSC_S1AP_ENB, MSC_S1AP_MME, - (const char *)NULL, NULL, + 0, MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", - 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), enb_ue_s1ap_id, mme_ue_s1ap_id); - /* TODO: fix this log - the original version is suspicious (twice downlink_NAS_transport_p->eNB_UE_S1AP_ID?) */ - /*S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n", - assoc_id, - downlink_NAS_transport_p->eNB_UE_S1AP_ID, - downlink_NAS_transport_p->eNB_UE_S1AP_ID);*/ S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%lx\n", assoc_id, enb_ue_s1ap_id); @@ -518,11 +512,10 @@ int s1ap_eNB_handle_nas_downlink(uint32_t assoc_id, MSC_LOG_RX_MESSAGE( MSC_S1AP_ENB, MSC_S1AP_MME, - (const char *)NULL, NULL, + 0, MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", - 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), - enb_ue_s1ap_id, + assoc_id, mme_ue_s1ap_id); S1AP_FIND_PROTOCOLIE_BY_ID(S1AP_DownlinkNASTransport_IEs_t, ie, container, diff --git a/openair3/UTILS/log.c b/openair3/UTILS/log.c deleted file mode 100644 index 5ddebd415c7e83f79248c7cbae5023641b5b84fe..0000000000000000000000000000000000000000 --- a/openair3/UTILS/log.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include "log.h" - -/* mme log */ -int log_enabled = 0; - -int log_init(const mme_config_t *mme_config_p, - log_specific_init_t specific_init) -{ - if (mme_config_p->verbosity_level == 1) { - log_enabled = 1; - } else if (mme_config_p->verbosity_level == 2) { - log_enabled = 1; - } else { - log_enabled = 0; - } - - return specific_init(mme_config_p->verbosity_level); -} diff --git a/openair3/UTILS/log.h b/openair3/UTILS/log.h deleted file mode 100644 index 7b712df755437a9048c7204618ae5d4832c49f29..0000000000000000000000000000000000000000 --- a/openair3/UTILS/log.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 - * - * 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. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "mme_config.h" - -#ifndef LOG_H_ -#define LOG_H_ - -/* asn1c debug */ -extern int asn_debug; -extern int asn1_xer_print; -extern int fd_g_debug_lvl; - -typedef int (*log_specific_init_t)(int log_level); - -int log_init(const mme_config_t *mme_config, - log_specific_init_t specific_init); - -#endif /* LOG_H_ */ diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index 7ff3b820dca5e121f585bd3b9c5a5827ddea1e95..d25826e82e7c060ae75c90c8e51bb9f86941e1cf 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -100,7 +100,7 @@ int load_lib(openair0_device *device, openair0_config_t *openair0_cfg, eth_param libname=OAI_TP_LIBNAME; shlib_fdesc[0].fname="transport_init"; } - ret=load_module_shlib(libname,shlib_fdesc,1); + ret=load_module_shlib(libname,shlib_fdesc,1,NULL); if (ret < 0) { fprintf(stderr,"Library %s couldn't be loaded\n",libname); } else { diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 433e29e97db7b15322b51d8f3282daa91b922c09..0ef3cd233f57433e6ca3dad9ad399d630206d7d7 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -199,6 +199,8 @@ typedef struct { double tx_bw; //! clock source clock_source_t clock_source; + //! Manual SDR IP address + char *sdr_addrs; //! Auto calibration flag int autocal[4]; //! rf devices work with x bits iqs when oai have its own iq format diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 9d145728591227159d523494d234228380269b7b..47cd12d816d9dcd71c01e23507931d685bc8a9c7 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -43,6 +43,8 @@ #include "common/utils/LOG/log.h" #include "common_lib.h" #include "assertions.h" +#include <sys/sysinfo.h> +#include <sys/resource.h> #ifdef __SSE4_1__ # include <smmintrin.h> @@ -274,6 +276,8 @@ static int sync_to_gps(openair0_device *device) #include "usrp_lib.h" static FILE *pFile = NULL; int mmapfd = 0; +int iqfd = 0; +int use_mmap = 1; // default is to use mmap struct stat sb; iqrec_t *ms_sample = NULL; // memory for all subframes unsigned int nb_samples = 0; @@ -406,13 +410,24 @@ static void trx_usrp_end(openair0_device *device) { } } if (u_sf_mode == 2) { // replay - if (ms_sample != MAP_FAILED) { - munmap(ms_sample, sb.st_size); - ms_sample = NULL; - } - if (mmapfd != 0) { - close(mmapfd); - mmapfd = 0; + if (use_mmap) { + if (ms_sample != MAP_FAILED) { + munmap(ms_sample, sb.st_size); + ms_sample = NULL; + } + if (mmapfd != 0) { + close(mmapfd); + mmapfd = 0; + } + } else { + if (ms_sample != NULL) { + free(ms_sample); + ms_sample = NULL; + } + if (iqfd != 0) { + close(iqfd); + iqfd = 0; + } } } #endif @@ -619,15 +634,50 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp return 0; // should make calling process exit } wrap_ts = wrap_count * (nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)); + if (!use_mmap) { + if (lseek(iqfd, 0, SEEK_SET) == 0) { + std::cerr << "Seeking at the beginning of IQ file" << std::endl; + } else { + std::cerr << "Problem seeking at the beginning of IQ file" << std::endl; + } + } } - if (cur_samples < nb_samples) { - *ptimestamp = (ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts; - if (cur_samples == 0) { - std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts - << " ts=" << *ptimestamp << std::endl; + if (use_mmap) { + if (cur_samples < nb_samples) { + *ptimestamp = (ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts; + if (cur_samples == 0) { + std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts + << " ts=" << *ptimestamp << std::endl; + } + memcpy(buff[0], &ms_sample[cur_samples].samples[0], nsamps*4); + cur_samples++; + } + } else { + // read sample from file + if (read(iqfd, ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) { + std::cerr << "pb reading iqfile at index " << sizeof(iqrec_t)*cur_samples << std::endl; + close(iqfd); + free(ms_sample); + ms_sample = NULL; + iqfd = 0; + exit(-1); + } + + if (cur_samples < nb_samples) { + static int64_t ts0 = 0; + if ((cur_samples == 0) && (wrap_count == 0)) { + ts0 = ms_sample->ts; + } + *ptimestamp = ts0 + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)) + wrap_ts; + if (cur_samples == 0) { + std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts + << " ts=" << *ptimestamp << std::endl; + } + memcpy(buff[0], &ms_sample->samples[0], nsamps*4); + cur_samples++; + // Prepare for next read + off_t where = lseek(iqfd, cur_samples * sizeof(iqrec_t), SEEK_SET); } - memcpy(buff[0], &ms_sample[cur_samples].samples[0], nsamps*4); - cur_samples++; } struct timespec req; req.tv_sec = 0; @@ -900,13 +950,18 @@ int trx_usrp_recplay_config_init(paramdef_t *usrp_recplay_params) { #endif extern "C" { - /*! \brief Initialize Openair USRP target. It returns 0 if OK - * \param device the hardware to use - * \param openair0_cfg RF frontend parameters set by application - */ - int device_init(openair0_device* device, openair0_config_t *openair0_cfg) { + /*! \brief Initialize Openair USRP target. It returns 0 if OK + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + */ + int device_init(openair0_device* device, openair0_config_t *openair0_cfg) { + + LOG_D(PHY, "openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs); + LOG_D(PHY, "openair0_cfg[0].clock_source == '%d'\n", openair0_cfg[0].clock_source); + #if defined(USRP_REC_PLAY) paramdef_t usrp_recplay_params[7]; + struct sysinfo systeminfo; // to check static int done = 0; if (done == 1) { @@ -914,6 +969,11 @@ extern "C" { } // prevent from multiple init done = 1; // end to check + // Use mmap for IQ files for systems with less than 6GB total RAM + sysinfo(&systeminfo); + if (systeminfo.totalram < 6144000000) { + use_mmap = 0; + } memset(usrp_recplay_params, 0, 7*sizeof(paramdef_t)); memset(&u_sf_filename[0], 0, 1024); if (trx_usrp_recplay_config_init(usrp_recplay_params) != 0) { @@ -953,7 +1013,8 @@ extern "C" { device->trx_set_freq_func = trx_usrp_set_freq; device->trx_set_gains_func = trx_usrp_set_gains; device->openair0_cfg = openair0_cfg; - std::cerr << "USRP device initialized in subframes replay mode for " << u_sf_loops << " loops." << std::endl; + std::cerr << "USRP device initialized in subframes replay mode for " << u_sf_loops << " loops. Use mmap=" + << use_mmap << std::endl; } else { #endif uhd::set_thread_priority_safe(1.0); @@ -965,8 +1026,30 @@ extern "C" { // Initialize USRP device device->openair0_cfg = openair0_cfg; - std::string args = "type=b200"; - uhd::device_addrs_t device_adds = uhd::device::find(args); + std::string args = "type=b200"; + + char *addr_args = NULL; + // Check whether sdr_addrs is set in the config or not + if (openair0_cfg[0].sdr_addrs != NULL) { + if (strcmp(openair0_cfg[0].sdr_addrs, "0.0.0.0") != 0) { + // Check whether sdr_addrs contains multiple IP addresses + // and split and add them to addr_args + if (strstr(openair0_cfg[0].sdr_addrs, ",") != NULL) { + char *addr0 = openair0_cfg[0].sdr_addrs; + // Replace , with \0 + strsep(&openair0_cfg[0].sdr_addrs, ","); + char *addr1 = openair0_cfg[0].sdr_addrs; + // Allocate memory for ",addr0=,addr1=\0" and the addresses + size_t addr_args_len = sizeof(char)*(15 + strlen(addr0) + strlen(addr1)); + addr_args = (char *)malloc(addr_args_len); + snprintf(addr_args, addr_args_len, ",addr0=%s,addr1=%s", addr0, addr1); + args += addr_args; + LOG_D(PHY, "addr_args == '%s'\n", addr_args); + } + } + } + + uhd::device_addrs_t device_adds = uhd::device::find(args); int vers=0,subvers=0,subsubvers=0; int bw_gain_adjust=0; @@ -980,12 +1063,17 @@ extern "C" { LOG_I(PHY,"Checking for USRPs : UHD %s (%d.%d.%d)\n", uhd::get_version_string().c_str(),vers,subvers,subsubvers); - if(device_adds.size() == 0) { - double usrp_master_clock = 184.32e6; - std::string args = "type=x300"; + if(device_adds.size() == 0) { + + double usrp_master_clock = 184.32e6; + std::string args = "type=x300"; + + if (addr_args) { + args += addr_args; + } - // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate - args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); + // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate + args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); // args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; uhd::device_addrs_t device_adds = uhd::device::find(args); @@ -1175,12 +1263,14 @@ extern "C" { } } - for(int i=0; i<s->usrp->get_tx_num_channels(); i++) { - ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); - if (i<openair0_cfg[0].tx_num_channels) { - s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); - s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); + LOG_D(PHY, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); + LOG_D(PHY, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); + for(int i=0; i<s->usrp->get_tx_num_channels(); i++) { + ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); + if (i<openair0_cfg[0].tx_num_channels) { + s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); + s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); LOG_I(PHY,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); } @@ -1282,33 +1372,60 @@ extern "C" { memset(ms_sample, 0, u_sf_max * BELL_LABS_IQ_BYTES_PER_SF); } if (u_sf_mode == 2) { - // use mmap - mmapfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE); - if (mmapfd != 0) { - fstat(mmapfd, &sb); - std::cerr << "Loading subframes using mmap() from " << u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl; - ms_sample = (iqrec_t*) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, mmapfd, 0); - if (ms_sample != MAP_FAILED) { - nb_samples = (sb.st_size / sizeof(iqrec_t)); - int aligned = (((unsigned long)ms_sample & 31) == 0)? 1:0; - std::cerr<< "Loaded "<< nb_samples << " subframes." << std::endl; - if (aligned == 0) { - std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl; + if (use_mmap) { + // use mmap + mmapfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE); + if (mmapfd != 0) { + fstat(mmapfd, &sb); + std::cerr << "Loading subframes using mmap() from " << u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl; + ms_sample = (iqrec_t*) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, mmapfd, 0); + if (ms_sample != MAP_FAILED) { + nb_samples = (sb.st_size / sizeof(iqrec_t)); + int aligned = (((unsigned long)ms_sample & 31) == 0)? 1:0; + std::cerr<< "Loaded "<< nb_samples << " subframes." << std::endl; + if (aligned == 0) { + std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl; + close(mmapfd); + exit(-1); + } + } else { + std::cerr << "Cannot mmap file, exiting." << std::endl; close(mmapfd); exit(-1); } } else { - std::cerr << "Cannot mmap file, exiting." << std::endl; - close(mmapfd); + std::cerr << "Cannot open " << u_sf_filename << " , exiting." << std::endl; exit(-1); } } else { + iqfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE); + if (iqfd != 0) { + fstat(iqfd, &sb); + nb_samples = (sb.st_size / sizeof(iqrec_t)); + std::cerr << "Loading " << nb_samples << " subframes from " << u_sf_filename + << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl; + // allocate buffer for 1 sample at a time + ms_sample = (iqrec_t*) malloc(sizeof(iqrec_t)); + if (ms_sample == NULL) { + std::cerr<< "Memory allocation failed for individual subframe replay mode." << std::endl; + close(iqfd); + exit(-1); + } + memset(ms_sample, 0, sizeof(iqrec_t)); + // point at beginning of file + if (lseek(iqfd, 0, SEEK_SET) == 0) { + std::cerr << "Initial seek at beginning of the file" << std::endl; + } else { + std::cerr << "Problem initial seek at beginning of the file" << std::endl; + } + } else { std::cerr << "Cannot open " << u_sf_filename << " , exiting." << std::endl; exit(-1); + } } } #endif - return 0; + return 0; } } /*@}*/ diff --git a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c index ba6d96db93372c3407d0d1c41ff666e3a2a85606..4d7d49d9c7836c800430afc56d033a9fb8a921cd 100644 --- a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c +++ b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c @@ -253,7 +253,7 @@ int tcp_bridge_ue_first_read(openair0_device *device, openair0_timestamp *timest tcp_bridge_state_t *t = device->priv; uint32_t b[t->samples_per_subframe * 12]; - memset(b, 0, nsamps * 4); + memset(b, 0, t->samples_per_subframe * 12 * 4); int n = fullwrite(t->sock, b, t->samples_per_subframe * 12 * 4); if (n != t->samples_per_subframe * 12 * 4) { printf("tcp_bridge: write error ret %d error %s\n", n, strerror(errno)); diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 391e448deb590584e9a4b917edd4a6210b1fa1a5..df3ce8992fefbf09db20590c01bd77050d470df7 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -22,7 +22,7 @@ #if defined(ENABLE_ITTI) # include "intertask_interface.h" # include "create_tasks.h" -# include "log.h" +# include "common/utils/LOG/log.h" # ifdef OPENAIR2 # if defined(ENABLE_USE_MME) @@ -31,6 +31,8 @@ # include "nas_ue_task.h" # include "udp_eNB_task.h" # include "gtpv1u_eNB_task.h" +# else +# define EPC_MODE_ENABLED 0 # endif # if ENABLE_RAL # include "lteRALue.h" @@ -59,8 +61,8 @@ int create_tasks(uint32_t enb_nb) return -1; } } - -# if defined(ENABLE_USE_MME) +# if defined(ENABLE_USE_MME) + if (EPC_MODE_ENABLED) { if (enb_nb > 0) { if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) { LOG_E(SCTP, "Create task for SCTP failed\n"); @@ -84,8 +86,8 @@ int create_tasks(uint32_t enb_nb) } } -# endif - + } /* if (EPC_MODE_ENABLED) */ +#endif if (enb_nb > 0) { LOG_I(RRC,"Creating RRC eNB Task\n"); diff --git a/targets/COMMON/create_tasks_ue.c b/targets/COMMON/create_tasks_ue.c index db531b0e9ddd73294530a337909d04c8878039fd..20b5979f31ee1c5829aee774739c4095afe50a49 100644 --- a/targets/COMMON/create_tasks_ue.c +++ b/targets/COMMON/create_tasks_ue.c @@ -22,7 +22,7 @@ #if defined(ENABLE_ITTI) # include "intertask_interface.h" # include "create_tasks.h" -# include "log.h" +# include "common/utils/LOG/log.h" # ifdef OPENAIR2 # if defined(ENABLE_USE_MME) diff --git a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.calisson.conf b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.calisson.conf index 09406d98cf534b27fd1abe11b54562c086be25b7..7ec670d5686e889e589444f2ec7d9b62831c602c 100755 --- a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.calisson.conf +++ b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.calisson.conf @@ -47,6 +47,9 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.13.10/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } diff --git a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.memphis.conf b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.memphis.conf index 47c12a79266b8ff907c3d26e75fe9a12ce7d5005..e3a0ea3c56f8d9513c47116c84de41a5746a9c10 100755 --- a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.memphis.conf +++ b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.memphis.conf @@ -59,6 +59,9 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.13.10/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; # available options for level: error, warn, notice, info, debug, trace # available options for verbosity: none, low, medium, high, full diff --git a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.nord.conf b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.nord.conf index 4360884c1db1bcb6f1ca30a5b275e1e1938deedc..591257ff713003544f33bb4f6c7a388267509b51 100755 --- a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.nord.conf +++ b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/CONF/enb.centos.nord.conf @@ -46,6 +46,9 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1U = "eth1"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.13.10/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf index 73da2a8b3f37c65507ef1994f930021d7bacfd29..bec9c2c6ddc9c573a4a9a329d6f7a69c0a523588 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf @@ -151,6 +151,9 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf index bd0503a4669b698fc568a782272a99571c76b6e8..834b6cf044177eb27d4569c12b96ada46e68aa0c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf @@ -151,6 +151,9 @@ eNBs = ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; log_config : diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf index 3064a29c698ababb992a6fc3562efcd262a02276..6b3614f490bb35c4317c9a7d07c82fd3d965f429 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf @@ -33,7 +33,7 @@ eNBs = tdd_config_s = 0; prefix_type = "NORMAL"; eutra_band = 7; - downlink_frequency = 2685000000L; + downlink_frequency = 2680000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 100; @@ -149,12 +149,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth6"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf index 99df987b43797da367931ff5f08f2583bb1523e0..fb184549c54eb67ce7e63ca62a85c9cc09778b5c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.13.10/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf index 7d73e55c6c8e494e556bfb508eb6c9cd28ad81ef..c6ace3b68fa396c9b87c5a357c0b250d20e108c7 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf @@ -183,14 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 - - + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index 69166672d79298d91ff605d5fa2fbf21b5cc6515..c2f10e20aebd768bfdb47271763d0c4f226ae8ba 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf index 1197c4ad937638de4825c6ac99237438bb7f18e6..e46467598ee5f1a207562226e81864271fab827f 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf @@ -150,12 +150,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf index c4d23bac42b3a9bb8f0be3ad40f14b64a0834be5..a6efe742834a27904e4b39d4a998b96b6a0209cb 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf @@ -152,12 +152,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf index 71a163209ded9e16fd01ac56ad8b0d73491dc11f..fefb4b11def94013d1efc34ba79c617f0e03aead 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf @@ -153,12 +153,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "vboxnet0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.56.1/24"; ENB_INTERFACE_NAME_FOR_S1U = "vboxnet0"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.56.1/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.56.1/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf index a6da42c2f563cbed744420b8f4832c81da5079c0..cd21fb935e44f8529457a66448dcac1159976c44 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf @@ -183,12 +183,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf index 550de4e1a2c5a56b846a8d5bf296a08f2ddaabad..581012d7d315f1f8ba9c3e02b2edaa75006e7bc5 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf @@ -152,12 +152,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf index 2b5a0ca68469eae11ba2587f9aae402a8dba7fc5..5f9f8c4d7b6a1321ef12112f59c76612f26230a5 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf @@ -151,12 +151,14 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; ENB_INTERFACE_NAME_FOR_S1U = "lo"; ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 57f6f9f56909b0ae86d63abef469e97bb3ebb2a5..a2f255d4d890fd295552016c55469afac7b7b6d0 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -223,7 +223,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 ); - if(get_nprocs() >= 8){ + if(!eNB->single_thread_flag && get_nprocs() >= 8){ if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) { LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx); return(-1); @@ -245,7 +245,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam /* CONFLICT RESOLUTION: BEGIN */ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 ); if(oai_exit) return(-1); - if(get_nprocs() <= 4){ + if(eNB->single_thread_flag || get_nprocs() <= 4){ #ifndef PHY_TX_THREAD phy_procedures_eNB_TX(eNB, proc, 1); #endif @@ -558,7 +558,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) { eNB_proc_t *proc=&eNB->proc; RU_proc_t *ru_proc=&ru->proc; - eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0];//*proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1]; + eNB_rxtx_proc_t *proc_rxtx0=&proc->proc_rxtx[0]; //eNB_rxtx_proc_t *proc_rxtx1=&proc->proc_rxtx[1]; @@ -847,7 +847,6 @@ extern void init_td_thread(PHY_VARS_eNB *); extern void init_te_thread(PHY_VARS_eNB *); extern void kill_td_thread(PHY_VARS_eNB *); extern void kill_te_thread(PHY_VARS_eNB *); -//////////////////////////////////////need to modified////////////////***** static void* process_stats_thread(void* param) { @@ -856,20 +855,23 @@ static void* process_stats_thread(void* param) { wait_sync("process_stats_thread"); while (!oai_exit) { - sleep(1); - if (opp_enabled == 1) { - if (eNB->td) print_meas(&eNB->ulsch_decoding_stats,"ulsch_decoding",NULL,NULL); - if (eNB->te) - { - print_meas(&eNB->dlsch_turbo_encoding_preperation_stats,"dlsch_coding_crc",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_segmentation_stats,"dlsch_segmentation",NULL,NULL); - print_meas(&eNB->dlsch_encoding_stats,"dlsch_encoding",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_signal_stats,"coding_signal",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_main_stats,"coding_main",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_waiting_stats,"coding_wait",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats0,"coding_worker_0",NULL,NULL); - print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats1,"coding_worker_1",NULL,NULL); - } + sleep(1); + if (opp_enabled == 1) { + if (eNB->td) print_meas(&eNB->ulsch_decoding_stats,"ulsch_decoding",NULL,NULL); + if (eNB->te) + { + print_meas(&eNB->dlsch_turbo_encoding_preperation_stats,"dlsch_coding_crc",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_segmentation_stats,"dlsch_segmentation",NULL,NULL); + print_meas(&eNB->dlsch_encoding_stats,"dlsch_encoding",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_signal_stats,"coding_signal",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_main_stats,"coding_main",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_stats,"turbo_encoding",NULL,NULL); + print_meas(&eNB->dlsch_interleaving_stats,"turbo_interleaving",NULL,NULL); + print_meas(&eNB->dlsch_rate_matching_stats,"turbo_rate_matching",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_waiting_stats,"coding_wait",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats0,"coding_worker_0",NULL,NULL); + print_meas(&eNB->dlsch_turbo_encoding_wakeup_stats1,"coding_worker_1",NULL,NULL); + } print_meas(&eNB->dlsch_modulation_stats,"dlsch_modulation",NULL,NULL); } } @@ -950,30 +952,19 @@ void init_eNB_proc(int inst) { // attr_td = &proc->attr_td; // attr_te = &proc->attr_te; #endif - //////////////////////////////////////need to modified////////////////***** + if(get_nprocs() > 2 && codingw) { init_te_thread(eNB); init_td_thread(eNB); } - //////////////////////////////////////need to modified////////////////***** - //pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc ); - - //pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc_rxtx ); - - - //Should we also include here the case where single_thread_flag = 1 ? - if(nfapi_mode!=2){ - pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc ); - pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc); - } LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag); - if (eNB->single_thread_flag==0) { - pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] ); - pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] ); + if (eNB->single_thread_flag==0 && nfapi_mode!=2) { + pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc ); + pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc); } pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB ); #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0)) diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index da4f28c499be8e02b5577b037816873ba03d36c4..578b647d96b33a479147e1678a5cd0477066380f 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -120,7 +120,8 @@ extern volatile int oai_exit; extern int emulate_rf; extern int numerology; extern int fepw; - +extern int single_thread_flag; +extern clock_source_t clock_source; extern void phy_init_RU(RU_t*); extern void phy_free_RU(RU_t*); @@ -714,6 +715,11 @@ static void* emulatedRF_thread(void* param) { wait_sync("emulatedRF_thread"); while(!oai_exit){ nanosleep(&req, (struct timespec *)NULL); + if(proc->emulate_rf_busy ) + { + LOG_E(PHY,"rf being delayed in emulated RF\n"); + } + proc->emulate_rf_busy = 1; pthread_mutex_lock(&proc->mutex_emulateRF); ++proc->instance_cnt_emulateRF; pthread_mutex_unlock(&proc->mutex_emulateRF); @@ -1016,7 +1022,6 @@ void wakeup_slaves(RU_proc_t *proc) { wait.tv_nsec=5000000L; for (i=0;i<proc->num_slaves;i++) { - //printf("////////////////////calling for slave thrads\n");////////////////////////******** RU_proc_t *slave_proc = proc->slave_proc[i]; // wake up slave FH thread // lock the FH mutex and make sure the thread is ready @@ -1252,13 +1257,14 @@ void wakeup_eNBs(RU_t *ru) { LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top); - if (ru->num_eNB==1 && ru->eNB_top!=0 && get_nprocs() <= 4) { + if (ru->num_eNB==1 && ru->eNB_top!=0 && (get_nprocs() <= 4 || single_thread_flag)) { // call eNB function directly char string[20]; sprintf(string,"Incoming RU %d",ru->idx); LOG_D(PHY,"RU %d Call eNB_top\n",ru->idx); ru->eNB_top(eNB_list[0],ru->proc.frame_rx,ru->proc.subframe_rx,string,ru); + ru->proc.emulate_rf_busy = 0; } else { @@ -1270,8 +1276,9 @@ void wakeup_eNBs(RU_t *ru) { eNB_list[i]->proc.ru_proc = &ru->proc; if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0) { - LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx); + LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx); } + ru->proc.emulate_rf_busy = 0; } } } @@ -1404,7 +1411,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { cfg->num_rb_dl=fp->N_RB_DL; cfg->tx_num_channels=ru->nb_tx; cfg->rx_num_channels=ru->nb_rx; - + cfg->clock_source=clock_source; + for (i=0; i<ru->nb_tx; i++) { cfg->tx_freq[i] = (double)fp->dl_CarrierFreq; @@ -1490,12 +1498,11 @@ int setup_RU_buffers(RU_t *ru) { static void* ru_stats_thread(void* param) { RU_t *ru = (RU_t*)param; - wait_sync("ru_stats_thread"); while (!oai_exit) { sleep(1); - if (opp_enabled == 1 && fepw) { + if (opp_enabled) { if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL); if (ru->feptx_ofdm) print_meas(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL); if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL); @@ -1529,6 +1536,7 @@ static void* ru_thread_tx( void* param ) { //wait_sync("ru_thread_tx"); wait_on_condition(&proc->mutex_FH1,&proc->cond_FH1,&proc->instance_cnt_FH1,"ru_thread_tx"); + printf( "ru_thread_tx ready\n"); while (!oai_exit) { @@ -1722,7 +1730,6 @@ static void* ru_thread( void* param ) { ru->do_prach, is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx), proc->frame_rx,proc->subframe_rx); - if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) { wakeup_prach_ru(ru); } @@ -1775,7 +1782,7 @@ static void* ru_thread( void* param ) { if (ru->num_eNB>0) wakeup_eNBs(ru); #ifndef PHY_TX_THREAD - if(get_nprocs() <= 4 || ru->num_eNB==0){ + if(get_nprocs() <= 4 || ru->num_eNB==0 || single_thread_flag){ // do TX front-end processing if needed (precoding and/or IDFTs) if (ru->feptx_prec) ru->feptx_prec(ru); @@ -1787,6 +1794,7 @@ static void* ru_thread( void* param ) { if (ru->fh_north_out) ru->fh_north_out(ru); } + proc->emulate_rf_busy = 0; } #else struct timespec time_req, time_rem; @@ -1803,10 +1811,12 @@ static void* ru_thread( void* param ) { printf( "Exiting ru_thread \n"); - if (ru->stop_rf != NULL) { - if (ru->stop_rf(ru) != 0) - LOG_E(HW,"Could not stop the RF device\n"); - else LOG_I(PHY,"RU %d rf device stopped\n",ru->idx); + if (!emulate_rf){ + if (ru->stop_rf != NULL) { + if (ru->stop_rf(ru) != 0) + LOG_E(HW,"Could not stop the RF device\n"); + else LOG_I(PHY,"RU %d rf device stopped\n",ru->idx); + } } ru_thread_status = 0; @@ -1872,13 +1882,13 @@ void *ru_thread_synch(void *arg) { LOG_I(PHY,"Estimated sync_pos %d, peak_val %d => timing offset %d\n",sync_pos,peak_val,ru->rx_offset); -LOG_M_BEGIN(RU) - if ((peak_val > 300000) && (sync_pos > 0)) { - LOG_M("ru_sync.m","sync",(void*)&sync_corr[0],fp->samples_per_tti*5,1,2); - LOG_M("ru_rx.m","rxs",&(ru->eNB_list[0]->common_vars.rxdata[0][0]),fp->samples_per_tti*10,1,1); - exit(-1); - } -LOG_M_END + if (LOG_DEBUGFLAG(RU)) { + if ((peak_val > 300000) && (sync_pos > 0)) { + LOG_M("ru_sync.m","sync",(void*)&sync_corr[0],fp->samples_per_tti*5,1,2); + LOG_M("ru_rx.m","rxs",&(ru->eNB_list[0]->common_vars.rxdata[0][0]),fp->samples_per_tti*10,1,1); + exit(-1); + } + } ru->in_synch=1; } } @@ -2076,6 +2086,8 @@ extern void feptx_ofdm_2thread(RU_t *ru); extern void feptx_prec(RU_t *ru); extern void init_fep_thread(RU_t *ru,pthread_attr_t *attr); extern void init_feptx_thread(RU_t *ru,pthread_attr_t *attr); +extern void kill_fep_thread(RU_t *ru); +extern void kill_feptx_thread(RU_t *ru); void init_RU_proc(RU_t *ru) { @@ -2183,7 +2195,7 @@ void init_RU_proc(RU_t *ru) { if(emulate_rf) pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc ); - if (get_nprocs() > 4) + if (!single_thread_flag && get_nprocs() > 4) pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru ); if (ru->function == NGFI_RRU_IF4p5) { @@ -2211,8 +2223,8 @@ void init_RU_proc(RU_t *ru) { } if (get_nprocs()> 2 && fepw) { - if (ru->feprx) init_fep_thread(ru,NULL); - if (ru->feptx_ofdm) init_feptx_thread(ru,NULL); + init_fep_thread(ru,NULL); + init_feptx_thread(ru,NULL); } if (opp_enabled == 1) pthread_create(&ru->ru_stats_thread,NULL,ru_stats_thread,(void*)ru); @@ -2223,6 +2235,13 @@ void kill_RU_proc(int inst) RU_t *ru = RC.ru[inst]; RU_proc_t *proc = &ru->proc; + if (get_nprocs() > 2 && fepw) { + LOG_D(PHY, "killing FEP thread\n"); + kill_fep_thread(ru); + LOG_D(PHY, "killing FEP TX thread\n"); + kill_feptx_thread(ru); + } + pthread_mutex_lock(&proc->mutex_FH); proc->instance_cnt_FH = 0; pthread_cond_signal(&proc->cond_FH); @@ -2261,10 +2280,10 @@ void kill_RU_proc(int inst) pthread_cond_signal(&proc->cond_asynch_rxtx); pthread_mutex_unlock(&proc->mutex_asynch_rxtx); - LOG_D(PHY, "Joining pthread_FH\n"); + /*LOG_D(PHY, "Joining pthread_FH\n"); pthread_join(proc->pthread_FH, NULL); LOG_D(PHY, "Joining pthread_FHTX\n"); - pthread_join(proc->pthread_FH1, NULL); + pthread_join(proc->pthread_FH1, NULL);*/ if (ru->function == NGFI_RRU_IF4p5) { LOG_D(PHY, "Joining pthread_prach\n"); pthread_join(proc->pthread_prach, NULL); @@ -2284,28 +2303,6 @@ void kill_RU_proc(int inst) pthread_join(proc->pthread_asynch_rxtx, NULL); } } - if (get_nprocs() > 2 && fepw) { - if (ru->feprx) { - pthread_mutex_lock(&proc->mutex_fep); - proc->instance_cnt_fep = 0; - pthread_mutex_unlock(&proc->mutex_fep); - pthread_cond_signal(&proc->cond_fep); - LOG_D(PHY, "Joining pthread_fep\n"); - pthread_join(proc->pthread_fep, NULL); - pthread_mutex_destroy(&proc->mutex_fep); - pthread_cond_destroy(&proc->cond_fep); - } - if (ru->feptx_ofdm) { - pthread_mutex_lock(&proc->mutex_feptx); - proc->instance_cnt_feptx = 0; - pthread_mutex_unlock(&proc->mutex_feptx); - pthread_cond_signal(&proc->cond_feptx); - LOG_D(PHY, "Joining pthread_feptx\n"); - pthread_join(proc->pthread_feptx, NULL); - pthread_mutex_destroy(&proc->mutex_feptx); - pthread_cond_destroy(&proc->cond_feptx); - } - } if (opp_enabled) { LOG_D(PHY, "Joining ru_stats_thread\n"); pthread_join(ru->ru_stats_thread, NULL); @@ -2670,7 +2667,7 @@ void set_function_spec_param(RU_t *ru) } // switch on interface type } -extern void RCconfig_RU(void); +//extern void RCconfig_RU(void); void init_RU(char *rf_config_file) { @@ -2841,6 +2838,24 @@ void RCconfig_RU(void) { RC.ru[j]->num_eNB = 0; for (i=0;i<RC.ru[j]->num_eNB;i++) RC.ru[j]->eNB_list[i] = RC.eNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0]; + if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) { + RC.ru[j]->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr)); + } + + if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) { + if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) { + RC.ru[j]->openair0_cfg.clock_source = internal; + LOG_D(PHY, "RU clock source set as internal\n"); + } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "external") == 0) { + RC.ru[j]->openair0_cfg.clock_source = external; + LOG_D(PHY, "RU clock source set as external\n"); + } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "gpsdo") == 0) { + RC.ru[j]->openair0_cfg.clock_source = gpsdo; + LOG_D(PHY, "RU clock source set as gpsdo\n"); + } else { + LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr)); + } + } if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) { diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 3cb9f4f0b83370a73f9d7179c98b1b88e10f8d2d..2d5f04d38680846c0b252373dbe74e6174644d16 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -107,6 +107,10 @@ unsigned char scope_enb_num_ue = 2; static pthread_t forms_thread; //xforms #endif //XFORMS +#ifndef ENABLE_USE_MME +#define EPC_MODE_ENABLED 0 +#endif + pthread_cond_t nfapi_sync_cond; pthread_mutex_t nfapi_sync_mutex; int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex @@ -129,11 +133,11 @@ volatile int start_UE = 0; #endif volatile int oai_exit = 0; -static clock_source_t clock_source = internal; +clock_source_t clock_source = internal; static int wait_for_sync = 0; unsigned int mmapped_dma=0; -int single_thread_flag=1; +int single_thread_flag = 0; static int8_t threequarter_fs=0; @@ -513,7 +517,7 @@ void *l2l1_task(void *arg) { #endif -static void get_options(void) { +static void get_options(unsigned int *start_msc) { int tddflag, nonbiotflag; @@ -547,11 +551,9 @@ static void get_options(void) { set_glog(glog_level); } if (start_telnetsrv) { - load_module_shlib("telnetsrv",NULL,0); + load_module_shlib("telnetsrv",NULL,0,NULL); } - - if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) { memset((void*)&RC,0,sizeof(RC)); /* Read RC configuration file */ @@ -787,7 +789,7 @@ int stop_L1L2(module_id_t enb_id) oai_exit = 1; if (!RC.ru) { - LOG_F(ENB_APP, "no RU configured\n"); + LOG_UI(ENB_APP, "no RU configured\n"); return -1; } @@ -900,7 +902,16 @@ static void wait_nfapi_init(char *thread_name) { pthread_mutex_unlock(&nfapi_sync_mutex); + /* + * Raphael Defosseux: temporary workaround for CI + * -- Repeating the message thrice to make sure + * -- it is present during flush. + */ + printf( "NFAPI: got sync (%s)\n", thread_name); printf( "NFAPI: got sync (%s)\n", thread_name); + printf( "NFAPI: got sync (%s)\n", thread_name); + fflush(stdout); + fflush(stderr); } int main( int argc, char **argv ) @@ -915,6 +926,7 @@ int main( int argc, char **argv ) #if defined (XFORMS) int ret; #endif + unsigned int start_msc=0; if ( load_configmodule(argc,argv) == NULL) { exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); @@ -932,7 +944,7 @@ int main( int argc, char **argv ) printf("Reading in command-line options\n"); - get_options (); + get_options (&start_msc); if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) { fprintf(stderr,"Getting configuration failed\n"); exit(-1); @@ -957,22 +969,19 @@ int main( int argc, char **argv ) #if defined(ENABLE_ITTI) - printf("ITTI init\n"); + printf("ITTI init, useMME: %i\n" ,EPC_MODE_ENABLED); + itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info); // initialize mscgen log after ITTI + if (start_msc) { + load_module_shlib("msc",NULL,0,&msc_interface); + } MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); #endif if (opt_type != OPT_NONE) { - radio_type_t radio_type; - - if (frame_parms[0]->frame_type == FDD) - radio_type = RADIO_TYPE_FDD; - else - radio_type = RADIO_TYPE_TDD; - - if (init_opt(in_path, in_ip, NULL, radio_type) == -1) + if (init_opt(in_path, in_ip) == -1) LOG_E(OPT,"failed to run OPT \n"); } @@ -1121,13 +1130,6 @@ int main( int argc, char **argv ) rt_sleep_ns(10*100000000ULL); - if (nfapi_mode) { - - printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); - } - if (nfapi_mode) { printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h index d8689b9ffb79447de6e6a536879b5424e0758f34..4728dce18ac6a1eb1ad05d9bd0116b6a1b2964d7 100644 --- a/targets/RT/USER/lte-softmodem.h +++ b/targets/RT/USER/lte-softmodem.h @@ -65,7 +65,7 @@ #define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n" #define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n" #define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n" -#define CONFIG_HLP_EXCCLK "tells hardware to use an external clock reference\n" +#define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n" #define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" #define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" #define CONFIG_HLP_TADV "Set timing_advance\n" @@ -161,9 +161,9 @@ {"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&phy_test, defintval:0, TYPE_INT, 0}, \ {"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&usim_test, defintval:0, TYPE_UINT8, 0}, \ {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ -{"external-clock", CONFIG_HLP_EXCCLK, PARAMFLAG_BOOL, uptr:&clock_source, defintval:0, TYPE_INT, 0}, \ +{"clock", CONFIG_HLP_CLK, 0, uptr:&clock_source, defintval:0, TYPE_UINT, 0}, \ {"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&wait_for_sync, defintval:0, TYPE_INT, 0}, \ -{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ +{"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:0, TYPE_INT, 0}, \ {"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \ {"threadOneSubframe", NULL, 0, iptr:&(threads.one), defintval:1, TYPE_INT, 0}, \ {"threadTwoSubframe", NULL, 0, iptr:&(threads.two), defintval:1, TYPE_INT, 0}, \ @@ -192,8 +192,9 @@ } #define CONFIG_HLP_FLOG "Enable online log \n" -#define CONFIG_HLP_LOGL "Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n" +#define CONFIG_HLP_LOGL "Set the global log level, valide options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" #define CONFIG_HLP_TELN "Start embedded telnet server \n" +#define CONFIG_HLP_MSC "Enable the MSC tracing utility \n" /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters for LOG utility */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -202,6 +203,7 @@ {"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ {"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ {"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ +{"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:start_msc, defintval:0, TYPE_UINT, 0}, \ } #define CMDLINE_ONLINELOG_IDX 0 #define CMDLINE_GLOGLEVEL_IDX 1 diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index ab84249f9fe660bf0af91c6434396f4519da00dd..66107d79a42c5e88b613451c1c5f4458ea2c48d4 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -446,7 +446,6 @@ static void *UE_thread_synch(void *arg) int freq_offset=0; char threadname[128]; - UE->is_synchronized = 0; printf("UE_thread_sync in with PHY_vars_UE %p\n",arg); cpu_set_t cpuset; @@ -522,11 +521,6 @@ static void *UE_thread_synch(void *arg) printf("Started device, unlocked sync_mutex (UE_sync_thread)\n"); - if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { - LOG_E(HW,"Could not start the device\n"); - oai_exit=1; - } - while (oai_exit==0) { AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); while (UE->proc.instance_cnt_synch < 0) @@ -755,7 +749,6 @@ static void *UE_thread_rxn_txnp4(void *arg) { UE_rxtx_proc_t *proc = rtd->proc; PHY_VARS_UE *UE = rtd->UE; - proc->instance_cnt_rxtx=-1; proc->subframe_rx=proc->sub_frame_start; char threadname[256]; @@ -1457,20 +1450,25 @@ void *UE_thread(void *arg) { int sub_frame=-1; //int cumulated_shift=0; + if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + } while (!oai_exit) { +#if BASIC_SIMULATOR + while (!(UE->proc.instance_cnt_synch < 0)) { + printf("ue sync not ready\n"); + usleep(500*1000); + } +#endif + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); int instance_cnt_synch = UE->proc.instance_cnt_synch; int is_synchronized = UE->is_synchronized; AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); if (is_synchronized == 0) { -#if BASIC_SIMULATOR - while (!((instance_cnt_synch = UE->proc.instance_cnt_synch) < 0)) { - printf("ue sync not ready\n"); - usleep(500*1000); - } -#endif if (instance_cnt_synch < 0) { // we can invoke the synch // grab 10 ms of signal and wakeup synch thread for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) @@ -1661,12 +1659,7 @@ void *UE_thread(void *arg) { proc->instance_cnt_rxtx++; LOG_D( PHY, "[SCHED][UE %d] UE RX instance_cnt_rxtx %d subframe %d !!\n", UE->Mod_id, proc->instance_cnt_rxtx,proc->subframe_rx); - if (proc->instance_cnt_rxtx == 0) { - if (pthread_cond_signal(&proc->cond_rxtx) != 0) { - LOG_E( PHY, "[SCHED][UE %d] ERROR pthread_cond_signal for UE RX thread\n", UE->Mod_id); - exit_fun("nothing to add"); - } - } else { + if (proc->instance_cnt_rxtx != 0) { LOG_E( PHY, "[SCHED][UE %d] UE RX thread busy (IC %d)!!\n", UE->Mod_id, proc->instance_cnt_rxtx); if (proc->instance_cnt_rxtx > 2) exit_fun("instance_cnt_rxtx > 2"); @@ -1717,6 +1710,8 @@ void init_UE_threads(int inst) { pthread_mutex_init(&UE->proc.mutex_synch,NULL); pthread_cond_init(&UE->proc.cond_synch,NULL); + UE->proc.instance_cnt_synch = -1; + UE->is_synchronized = 0; // the threads are not yet active, therefore access is allowed without locking int nb_threads=RX_NB_TH; @@ -1728,6 +1723,7 @@ void init_UE_threads(int inst) { pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_rxtx,NULL); pthread_cond_init(&UE->proc.proc_rxtx[i].cond_rxtx,NULL); + UE->proc.proc_rxtx[i].instance_cnt_rxtx = -1; UE->proc.proc_rxtx[i].sub_frame_start=i; UE->proc.proc_rxtx[i].sub_frame_step=nb_threads; printf("Init_UE_threads rtd %d proc %d nb_threads %d i %d\n",rtd->proc->sub_frame_start, UE->proc.proc_rxtx[i].sub_frame_start,nb_threads, i); diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 90503409187ca5d934f60a356879d0a1143d9ff3..2efcb496ac1ba8d399971bea9ff8486715885284 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -135,7 +135,7 @@ volatile int start_UE = 0; #endif volatile int oai_exit = 0; -static clock_source_t clock_source = internal; +clock_source_t clock_source = internal; static int wait_for_sync = 0; unsigned int mmapped_dma=0; @@ -470,7 +470,7 @@ void *l2l1_task(void *arg) { extern int16_t dlsch_demod_shift; -static void get_options(void) { +static void get_options(unsigned int *start_msc) { int CC_id; int tddflag, nonbiotflag; char *loopfile=NULL; @@ -505,7 +505,7 @@ static void get_options(void) { set_glog(glog_level); } if (start_telnetsrv) { - load_module_shlib("telnetsrv",NULL,0); + load_module_shlib("telnetsrv",NULL,0,NULL); } paramdef_t cmdline_uemodeparams[] =CMDLINE_UEMODEPARAMS_DESC; @@ -770,6 +770,7 @@ int main( int argc, char **argv ) int CC_id; uint8_t abstraction_flag=0; + unsigned int start_msc=0; // Default value for the number of UEs. It will hold, // if not changed from the command line option --num-ues @@ -797,7 +798,7 @@ int main( int argc, char **argv ) printf("Reading in command-line options\n"); for (int i=0;i<MAX_NUM_CCs;i++) tx_max_power[i]=23; - get_options (); + get_options (&start_msc); printf("Running with %d UE instances\n",NB_UE_INST); @@ -830,21 +831,6 @@ int main( int argc, char **argv ) //randominit (0); set_taus_seed (0); - - set_log(HW, OAILOG_DEBUG, 1); - set_log(PHY, OAILOG_INFO, 1); - set_log(MAC, OAILOG_INFO, 1); - set_log(RLC, OAILOG_INFO, 1); - set_log(PDCP, OAILOG_INFO, 1); - set_log(OTG, OAILOG_INFO, 1); - set_log(RRC, OAILOG_INFO, 1); -#if defined(ENABLE_ITTI) - set_log(SIM, OAILOG_INFO, 1); -# if defined(ENABLE_USE_MME) - set_log(NAS, OAILOG_INFO, 1); -# endif -#endif - cpuf=get_cpu_freq_GHz(); pthread_cond_init(&sync_cond,NULL); @@ -858,18 +844,14 @@ int main( int argc, char **argv ) itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info); // initialize mscgen log after ITTI + if (start_msc) { + load_module_shlib("msc",NULL,0,&msc_interface); + } MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); #endif if (opt_type != OPT_NONE) { - radio_type_t radio_type; - - if (frame_parms[0]->frame_type == FDD) - radio_type = RADIO_TYPE_FDD; - else - radio_type = RADIO_TYPE_TDD; - - if (init_opt(in_path, in_ip, NULL, radio_type) == -1) + if (init_opt(in_path, in_ip) == -1) LOG_E(OPT,"failed to run OPT \n"); }