mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 13:11:20 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			550 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			550 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////////
 | 
						|
// Copyright (C) 2018-2019 Edouard Griffiths, F4EXB <f4exb06@gmail.com>          //
 | 
						|
//                                                                               //
 | 
						|
// This program is free software; you can redistribute it and/or modify          //
 | 
						|
// it under the terms of the GNU General Public License as published by          //
 | 
						|
// the Free Software Foundation as version 3 of the License, or                  //
 | 
						|
// (at your option) any later version.                                           //
 | 
						|
//                                                                               //
 | 
						|
// This program is distributed in the hope that it will be useful,               //
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
						|
// GNU General Public License V3 for more details.                               //
 | 
						|
//                                                                               //
 | 
						|
// You should have received a copy of the GNU General Public License             //
 | 
						|
// along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
						|
///////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#include "fixedtraits.h"
 | 
						|
 | 
						|
// 1.0 = 2^28 internal representation
 | 
						|
 | 
						|
// ln(1/2^n), n = index+1 then list is reversed
 | 
						|
const int64_t FixedTraits<28>::log_two_power_n_reversed[35] = {
 | 
						|
    0x18429946ELL,
 | 
						|
    0x1791272EFLL,
 | 
						|
    0x16DFB516FLL,
 | 
						|
    0x162E42FF0LL,
 | 
						|
    0x157CD0E70LL,
 | 
						|
    0x14CB5ECF1LL,
 | 
						|
    0x1419ECB71LL,
 | 
						|
    0x13687A9F2LL,
 | 
						|
    0x12B708872LL,
 | 
						|
    0x1205966F3LL,
 | 
						|
    0x115424573LL,
 | 
						|
    0x10A2B23F4LL,
 | 
						|
    0xFF140274LL,
 | 
						|
    0xF3FCE0F5LL,
 | 
						|
    0xE8E5BF75LL,
 | 
						|
    0xDDCE9DF6LL,
 | 
						|
    0xD2B77C76LL,
 | 
						|
    0xC7A05AF7LL,
 | 
						|
    0xBC893977LL,
 | 
						|
    0xB17217F8LL,
 | 
						|
    0xA65AF679LL,
 | 
						|
    0x9B43D4F9LL,
 | 
						|
    0x902CB379LL,
 | 
						|
    0x851591FaLL,
 | 
						|
    0x79FE707bLL,
 | 
						|
    0x6EE74EFbLL,
 | 
						|
    0x63D02D7BLL,
 | 
						|
    0x58B90BFcLL,
 | 
						|
    0x4DA1EA7CLL,
 | 
						|
    0x428AC8FdLL,
 | 
						|
    0x3773A77DLL,
 | 
						|
    0x2C5C85FeLL,
 | 
						|
    0x2145647ELL,
 | 
						|
    0x162E42FfLL,
 | 
						|
    0xB17217FLL
 | 
						|
};
 | 
						|
 | 
						|
// ln(1+2^-n), n = index+1
 | 
						|
const int64_t FixedTraits<28>::log_one_plus_two_power_minus_n[28] = {
 | 
						|
    0x67CC8FBLL,
 | 
						|
    0x391FEF9LL,
 | 
						|
    0x1E27077LL,
 | 
						|
    0xF85186LL,
 | 
						|
    0x7E0A6CLL,
 | 
						|
    0x3F8151LL,
 | 
						|
    0x1FE02ALL,
 | 
						|
    0xFF805LL,
 | 
						|
    0x7FE01LL,
 | 
						|
    0x3FF80LL,
 | 
						|
    0x1FFE0LL,
 | 
						|
    0xFFF8LL,
 | 
						|
    0x7FFELL,
 | 
						|
    0x4000LL,
 | 
						|
    0x2000LL,
 | 
						|
    0x1000LL,
 | 
						|
    0x800LL,
 | 
						|
    0x400LL,
 | 
						|
    0x200LL,
 | 
						|
    0x100LL,
 | 
						|
    0x80LL,
 | 
						|
    0x40LL,
 | 
						|
    0x20LL,
 | 
						|
    0x10LL,
 | 
						|
    0x8LL,
 | 
						|
    0x4LL,
 | 
						|
    0x2LL,
 | 
						|
    0x1LL
 | 
						|
};
 | 
						|
 | 
						|
// ln(1/1-2^-n), n = index+1
 | 
						|
const int64_t FixedTraits<28>::log_one_over_one_minus_two_power_minus_n[28] = {
 | 
						|
    0xB172180LL,
 | 
						|
    0x49A5884LL,
 | 
						|
    0x222F1D0LL,
 | 
						|
    0x108598BLL,
 | 
						|
    0x820AECLL,
 | 
						|
    0x408159LL,
 | 
						|
    0x20202BLL,
 | 
						|
    0x100805LL,
 | 
						|
    0x80201LL,
 | 
						|
    0x40080LL,
 | 
						|
    0x20020LL,
 | 
						|
    0x10008LL,
 | 
						|
    0x8002LL,
 | 
						|
    0x4001LL,
 | 
						|
    0x2000LL,
 | 
						|
    0x1000LL,
 | 
						|
    0x800LL,
 | 
						|
    0x400LL,
 | 
						|
    0x200LL,
 | 
						|
    0x100LL,
 | 
						|
    0x80LL,
 | 
						|
    0x40LL,
 | 
						|
    0x20LL,
 | 
						|
    0x10LL,
 | 
						|
    0x8LL,
 | 
						|
    0x4LL,
 | 
						|
    0x2LL,
 | 
						|
    0x1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t FixedTraits<28>::arctantab[32] = {
 | 
						|
    297197971,
 | 
						|
    210828714,
 | 
						|
    124459457,
 | 
						|
    65760959,
 | 
						|
    33381290,
 | 
						|
    16755422,
 | 
						|
    8385879,
 | 
						|
    4193963,
 | 
						|
    2097109,
 | 
						|
    1048571,
 | 
						|
    524287,
 | 
						|
    262144,
 | 
						|
    131072,
 | 
						|
    65536,
 | 
						|
    32768,
 | 
						|
    16384,
 | 
						|
    8192,
 | 
						|
    4096,
 | 
						|
    2048,
 | 
						|
    1024,
 | 
						|
    512,
 | 
						|
    256,
 | 
						|
    128,
 | 
						|
    64,
 | 
						|
    32,
 | 
						|
    16,
 | 
						|
    8,
 | 
						|
    4,
 | 
						|
    2,
 | 
						|
    1,
 | 
						|
    0,
 | 
						|
    0
 | 
						|
};
 | 
						|
 | 
						|
// 1.0 = 2^16 internal representation
 | 
						|
 | 
						|
const int64_t  FixedTraits<16>::log_two_power_n_reversed[47] = {
 | 
						|
    2135026LL,
 | 
						|
    2089600LL,
 | 
						|
    2044174LL,
 | 
						|
    1998748LL,
 | 
						|
    1953322LL,
 | 
						|
    1907896LL,
 | 
						|
    1862470LL,
 | 
						|
    1817044LL,
 | 
						|
    1771618LL,
 | 
						|
    1726192LL,
 | 
						|
    1680765LL,
 | 
						|
    1635339LL,
 | 
						|
    1589913LL,
 | 
						|
    1544487LL,
 | 
						|
    1499061LL,
 | 
						|
    1453635LL,
 | 
						|
    1408209LL,
 | 
						|
    1362783LL,
 | 
						|
    1317357LL,
 | 
						|
    1271931LL,
 | 
						|
    1226505LL,
 | 
						|
    1181078LL,
 | 
						|
    1135652LL,
 | 
						|
    1090226LL,
 | 
						|
    1044800LL,
 | 
						|
    999374LL,
 | 
						|
    953948LL,
 | 
						|
    908522LL,
 | 
						|
    863096LL,
 | 
						|
    817670LL,
 | 
						|
    772244LL,
 | 
						|
    726817LL,
 | 
						|
    681391LL,
 | 
						|
    635965LL,
 | 
						|
    590539LL,
 | 
						|
    545113LL,
 | 
						|
    499687LL,
 | 
						|
    454261LL,
 | 
						|
    408835LL,
 | 
						|
    363409LL,
 | 
						|
    317983LL,
 | 
						|
    272557LL,
 | 
						|
    227130LL,
 | 
						|
    181704LL,
 | 
						|
    136278LL,
 | 
						|
    90852LL,
 | 
						|
    45426LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<16>::log_one_plus_two_power_minus_n[16] = {
 | 
						|
    26573LL,
 | 
						|
    14624LL,
 | 
						|
    7719LL,
 | 
						|
    3973LL,
 | 
						|
    2017LL,
 | 
						|
    1016LL,
 | 
						|
    510LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<16>::log_one_over_one_minus_two_power_minus_n[16] = {
 | 
						|
    45426LL,
 | 
						|
    18854LL,
 | 
						|
    8751LL,
 | 
						|
    4230LL,
 | 
						|
    2081LL,
 | 
						|
    1032LL,
 | 
						|
    514LL,
 | 
						|
    257LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<16>::arctantab[32] = {
 | 
						|
    72558LL,
 | 
						|
    51471LL,
 | 
						|
    30385LL,
 | 
						|
    16054LL,
 | 
						|
    8149LL,
 | 
						|
    4090LL,
 | 
						|
    2047LL,
 | 
						|
    1023LL,
 | 
						|
    511LL,
 | 
						|
    255LL,
 | 
						|
    127LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL
 | 
						|
};
 | 
						|
 | 
						|
// 1.0 = 2^23 internal representation
 | 
						|
 | 
						|
const int64_t  FixedTraits<23>::log_two_power_n_reversed[40] = {
 | 
						|
    232581599LL,
 | 
						|
    226767059LL,
 | 
						|
    220952519LL,
 | 
						|
    215137979LL,
 | 
						|
    209323439LL,
 | 
						|
    203508899LL,
 | 
						|
    197694359LL,
 | 
						|
    191879819LL,
 | 
						|
    186065279LL,
 | 
						|
    180250740LL,
 | 
						|
    174436200LL,
 | 
						|
    168621660LL,
 | 
						|
    162807120LL,
 | 
						|
    156992580LL,
 | 
						|
    151178040LL,
 | 
						|
    145363500LL,
 | 
						|
    139548960LL,
 | 
						|
    133734420LL,
 | 
						|
    127919880LL,
 | 
						|
    122105340LL,
 | 
						|
    116290800LL,
 | 
						|
    110476260LL,
 | 
						|
    104661720LL,
 | 
						|
    98847180LL,
 | 
						|
    93032640LL,
 | 
						|
    87218100LL,
 | 
						|
    81403560LL,
 | 
						|
    75589020LL,
 | 
						|
    69774480LL,
 | 
						|
    63959940LL,
 | 
						|
    58145400LL,
 | 
						|
    52330860LL,
 | 
						|
    46516320LL,
 | 
						|
    40701780LL,
 | 
						|
    34887240LL,
 | 
						|
    29072700LL,
 | 
						|
    23258160LL,
 | 
						|
    17443620LL,
 | 
						|
    11629080LL,
 | 
						|
    5814540LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<23>::log_one_plus_two_power_minus_n[23] = {
 | 
						|
    3401288LL,
 | 
						|
    1871864LL,
 | 
						|
    988036LL,
 | 
						|
    508556LL,
 | 
						|
    258131LL,
 | 
						|
    130059LL,
 | 
						|
    65281LL,
 | 
						|
    32704LL,
 | 
						|
    16368LL,
 | 
						|
    8188LL,
 | 
						|
    4095LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<23>::log_one_over_one_minus_two_power_minus_n[23] = {
 | 
						|
    5814540LL,
 | 
						|
    2413252LL,
 | 
						|
    1120143LL,
 | 
						|
    541388LL,
 | 
						|
    266327LL,
 | 
						|
    132107LL,
 | 
						|
    65793LL,
 | 
						|
    32832LL,
 | 
						|
    16400LL,
 | 
						|
    8196LL,
 | 
						|
    4097LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<23>::arctantab[32] = {
 | 
						|
    9287436LL,
 | 
						|
    6588397LL,
 | 
						|
    3889358LL,
 | 
						|
    2055029LL,
 | 
						|
    1043165LL,
 | 
						|
    523606LL,
 | 
						|
    262058LL,
 | 
						|
    131061LL,
 | 
						|
    65534LL,
 | 
						|
    32767LL,
 | 
						|
    16383LL,
 | 
						|
    8192LL,
 | 
						|
    4096LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL
 | 
						|
};
 | 
						|
 | 
						|
// 1.0 = 2^24 internal representation
 | 
						|
 | 
						|
const int64_t  FixedTraits<24>::log_two_power_n_reversed[39] = {
 | 
						|
    453534119LL,
 | 
						|
    441905039LL,
 | 
						|
    430275959LL,
 | 
						|
    418646879LL,
 | 
						|
    407017799LL,
 | 
						|
    395388719LL,
 | 
						|
    383759639LL,
 | 
						|
    372130559LL,
 | 
						|
    360501479LL,
 | 
						|
    348872399LL,
 | 
						|
    337243319LL,
 | 
						|
    325614239LL,
 | 
						|
    313985159LL,
 | 
						|
    302356079LL,
 | 
						|
    290726999LL,
 | 
						|
    279097919LL,
 | 
						|
    267468839LL,
 | 
						|
    255839759LL,
 | 
						|
    244210679LL,
 | 
						|
    232581599LL,
 | 
						|
    220952519LL,
 | 
						|
    209323439LL,
 | 
						|
    197694359LL,
 | 
						|
    186065279LL,
 | 
						|
    174436200LL,
 | 
						|
    162807120LL,
 | 
						|
    151178040LL,
 | 
						|
    139548960LL,
 | 
						|
    127919880LL,
 | 
						|
    116290800LL,
 | 
						|
    104661720LL,
 | 
						|
    93032640LL,
 | 
						|
    81403560LL,
 | 
						|
    69774480LL,
 | 
						|
    58145400LL,
 | 
						|
    46516320LL,
 | 
						|
    34887240LL,
 | 
						|
    23258160LL,
 | 
						|
    11629080LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<24>::log_one_plus_two_power_minus_n[24] = {
 | 
						|
    6802576LL,
 | 
						|
    3743728LL,
 | 
						|
    1976071LL,
 | 
						|
    1017112LL,
 | 
						|
    516263LL,
 | 
						|
    260117LL,
 | 
						|
    130563LL,
 | 
						|
    65408LL,
 | 
						|
    32736LL,
 | 
						|
    16376LL,
 | 
						|
    8190LL,
 | 
						|
    4096LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<24>::log_one_over_one_minus_two_power_minus_n[24] = {
 | 
						|
    11629080LL,
 | 
						|
    4826504LL,
 | 
						|
    2240285LL,
 | 
						|
    1082777LL,
 | 
						|
    532655LL,
 | 
						|
    264214LL,
 | 
						|
    131587LL,
 | 
						|
    65664LL,
 | 
						|
    32800LL,
 | 
						|
    16392LL,
 | 
						|
    8194LL,
 | 
						|
    4097LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL
 | 
						|
};
 | 
						|
 | 
						|
const int64_t  FixedTraits<24>::arctantab[32] = {
 | 
						|
    18574873LL,
 | 
						|
    13176794LL,
 | 
						|
    7778716LL,
 | 
						|
    4110059LL,
 | 
						|
    2086330LL,
 | 
						|
    1047213LL,
 | 
						|
    524117LL,
 | 
						|
    262122LL,
 | 
						|
    131069LL,
 | 
						|
    65535LL,
 | 
						|
    32767LL,
 | 
						|
    16384LL,
 | 
						|
    8192LL,
 | 
						|
    4096LL,
 | 
						|
    2048LL,
 | 
						|
    1024LL,
 | 
						|
    512LL,
 | 
						|
    256LL,
 | 
						|
    128LL,
 | 
						|
    64LL,
 | 
						|
    32LL,
 | 
						|
    16LL,
 | 
						|
    8LL,
 | 
						|
    4LL,
 | 
						|
    2LL,
 | 
						|
    1LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL,
 | 
						|
    0LL
 | 
						|
};
 | 
						|
 |