| 1 | pub use nihav_codec_support::dsp::fft::*; |
| 2 | pub use nihav_codec_support::dsp::mdct::*; |
| 3 | |
| 4 | pub struct SBRDSP { |
| 5 | imdct: IMDCT, |
| 6 | tmp0: [f32; 64], |
| 7 | tmp1: [f32; 64], |
| 8 | tmp2: [f32; 64], |
| 9 | tmp3: [f32; 64], |
| 10 | } |
| 11 | |
| 12 | impl SBRDSP { |
| 13 | pub fn new() -> Self { |
| 14 | Self { |
| 15 | imdct: IMDCT::new(128, false), |
| 16 | tmp0: [0.0; 64], |
| 17 | tmp1: [0.0; 64], |
| 18 | tmp2: [0.0; 64], |
| 19 | tmp3: [0.0; 64], |
| 20 | } |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | #[derive(Clone)] |
| 25 | pub struct SBRAnalysis { |
| 26 | hist: [f32; 320], |
| 27 | pos: usize, |
| 28 | } |
| 29 | |
| 30 | impl SBRAnalysis { |
| 31 | pub fn new() -> Self { |
| 32 | Self { |
| 33 | hist: [0.0; 320], |
| 34 | pos: 0, |
| 35 | } |
| 36 | } |
| 37 | pub fn analysis(&mut self, dsp: &mut SBRDSP, samples: &[f32], dst: &mut [FFTComplex; 64]) { |
| 38 | self.pos += self.hist.len() - 32; |
| 39 | if self.pos >= self.hist.len() { |
| 40 | self.pos -= self.hist.len(); |
| 41 | } |
| 42 | for (dst, &src) in self.hist[self.pos..][..32].iter_mut().zip(samples.iter().rev()) { |
| 43 | *dst = src; |
| 44 | } |
| 45 | |
| 46 | let sum = &mut dsp.tmp0; |
| 47 | *sum = [0.0; 64]; |
| 48 | for (n, dst) in sum.iter_mut().enumerate() { |
| 49 | *dst = 0.0; |
| 50 | for j in 0..5 { |
| 51 | *dst += self.hist[(self.pos + n + j * 64) % self.hist.len()] * SBR_WINDOW[(n + j * 64) * 2]; |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | let src = &mut dsp.tmp1; |
| 56 | |
| 57 | src[0] = sum[0]; |
| 58 | src[1] = sum[1]; |
| 59 | for k in (1..31).step_by(2) { |
| 60 | src[k * 2] = -sum[64 - k]; |
| 61 | src[k * 2 + 1] = sum[k + 1]; |
| 62 | src[k * 2 + 2] = -sum[63 - k]; |
| 63 | src[k * 2 + 3] = sum[k + 2]; |
| 64 | } |
| 65 | src[62] = -sum[33]; |
| 66 | src[63] = sum[32]; |
| 67 | |
| 68 | let out = &mut dsp.tmp2; |
| 69 | dsp.imdct.imdct_half(src, out); |
| 70 | |
| 71 | *dst = [FFTC_ZERO; 64]; |
| 72 | for (k, dst) in dst[..32].iter_mut().enumerate() { |
| 73 | dst.re = -out[63 - k]; |
| 74 | dst.im = out[k]; |
| 75 | } |
| 76 | } |
| 77 | } |
| 78 | |
| 79 | #[derive(Clone)] |
| 80 | pub struct SBRSynthesis { |
| 81 | hist: [f32; 1280], |
| 82 | pos: usize, |
| 83 | } |
| 84 | |
| 85 | impl SBRSynthesis { |
| 86 | pub fn new() -> Self { |
| 87 | Self { |
| 88 | hist: [0.0; 1280], |
| 89 | pos: 0, |
| 90 | } |
| 91 | } |
| 92 | pub fn synthesis(&mut self, dsp: &mut SBRDSP, src: &[FFTComplex; 64], dst: &mut [f32]) { |
| 93 | self.pos += self.hist.len() - 128; |
| 94 | if self.pos >= self.hist.len() { |
| 95 | self.pos -= self.hist.len(); |
| 96 | } |
| 97 | let re = &mut dsp.tmp0; |
| 98 | let im = &mut dsp.tmp1; |
| 99 | for ((re, im), src) in re.iter_mut().zip(im.iter_mut()).zip(src.iter()) { |
| 100 | *re = src.re / 32.0; |
| 101 | *im = src.im / 32.0; |
| 102 | } |
| 103 | for pair in im.chunks_mut(2) { |
| 104 | pair[1] = -pair[1]; |
| 105 | } |
| 106 | let out0 = &mut dsp.tmp2; |
| 107 | let out1 = &mut dsp.tmp3; |
| 108 | dsp.imdct.imdct_half(re, out0); |
| 109 | dsp.imdct.imdct_half(im, out1); |
| 110 | |
| 111 | for (k, (&a, &b)) in out1.iter().zip(out0.iter().rev()).enumerate() { |
| 112 | self.hist[self.pos..][k] = a - b; |
| 113 | self.hist[self.pos..][127 - k] = a + b; |
| 114 | } |
| 115 | |
| 116 | for (k, dst) in dst[..64].iter_mut().enumerate() { |
| 117 | *dst = 0.0; |
| 118 | for n in 0..5 { |
| 119 | *dst += self.hist[(self.pos + 256 * n + k) % self.hist.len()] * SBR_WINDOW[128 * n + k]; |
| 120 | *dst += self.hist[(self.pos + 256 * n + k + 192) % self.hist.len()] * SBR_WINDOW[128 * n + k + 64]; |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | /*#[derive(Clone)] |
| 127 | pub struct SBRSynthesisDownsampled { |
| 128 | hist: [f32; 640], |
| 129 | pos: usize, |
| 130 | } |
| 131 | |
| 132 | impl SBRSynthesisDownsampled { |
| 133 | pub fn new() -> Self { |
| 134 | Self { |
| 135 | hist: [0.0; 640], |
| 136 | pos: 0, |
| 137 | } |
| 138 | } |
| 139 | pub fn synthesis(&mut self, dsp: &mut SBRDSP, src: &[FFTComplex; 64], dst: &mut [f32]) { |
| 140 | self.pos += self.hist.len() - 64; |
| 141 | if self.pos >= self.hist.len() { |
| 142 | self.pos -= self.hist.len(); |
| 143 | } |
| 144 | |
| 145 | let (p0, p1) = dsp.tmp0.split_at_mut(32); |
| 146 | let out = &mut dsp.tmp1; |
| 147 | for (n, (dst0, dst1)) in p0.iter_mut().zip(p1.iter_mut()).enumerate() { |
| 148 | *dst0 = -src[n].re / 32.0; |
| 149 | *dst1 = src[31 - n].im / 32.0; |
| 150 | } |
| 151 | dsp.imdct.imdct_half(&dsp.tmp0, out); |
| 152 | for (k, pair) in out.chunks(2).rev().enumerate() { |
| 153 | self.hist[self.pos..][k] = pair[1]; |
| 154 | self.hist[self.pos..][63 - k] = -pair[0]; |
| 155 | } |
| 156 | |
| 157 | for (k, dst) in dst[..32].iter_mut().enumerate() { |
| 158 | *dst = 0.0; |
| 159 | for n in 0..5 { |
| 160 | *dst += self.hist[(self.pos + 128 * n + k) % self.hist.len()] * SBR_WINDOW[128 * n + k]; |
| 161 | *dst += self.hist[(self.pos + 128 * n + k + 96) % self.hist.len()] * SBR_WINDOW[128 * n + k + 64]; |
| 162 | } |
| 163 | } |
| 164 | } |
| 165 | }*/ |
| 166 | |
| 167 | const SBR_WINDOW: [f32; 640] = [ |
| 168 | 0.0, -0.00055252865047, -0.00056176925738, -0.00049475180896, |
| 169 | -0.00048752279712, -0.00048937912498, -0.00050407143497, -0.00052265642972, |
| 170 | -0.00054665656337, -0.00056778025613, -0.00058709304852, -0.00061327473938, |
| 171 | -0.00063124935319, -0.00065403333621, -0.00067776907764, -0.00069416146273, |
| 172 | -0.00071577364744, -0.00072550431222, -0.00074409418541, -0.00074905980532, |
| 173 | -0.0007681371927, -0.00077248485949, -0.00078343322877, -0.00077798694927, |
| 174 | -0.000780366471, -0.00078014496257, -0.0007757977331, -0.00076307935757, |
| 175 | -0.00075300014201, -0.00073193571525, -0.00072153919876, -0.00069179375372, |
| 176 | -0.00066504150893, -0.00063415949025, -0.0005946118933, -0.00055645763906, |
| 177 | -0.00051455722108, -0.00046063254803, -0.00040951214522, -0.00035011758756, |
| 178 | -0.00028969811748, -0.0002098337344, -0.00014463809349, -0.00006173344072, |
| 179 | 0.00001349497418, 0.00010943831274, 0.00020430170688, 0.00029495311041, |
| 180 | 0.0004026540216, 0.00051073884952, 0.00062393761391, 0.00074580258865, |
| 181 | 0.00086084433262, 0.00098859883015, 0.00112501551307, 0.00125778846475, |
| 182 | 0.00139024948272, 0.00154432198471, 0.00168680832531, 0.00183482654224, |
| 183 | 0.00198411407369, 0.00214615835557, 0.00230172547746, 0.00246256169126, |
| 184 | 0.00262017586902, 0.00278704643465, 0.00294694477165, 0.00311254206525, |
| 185 | 0.00327396134847, 0.00344188741828, 0.00360082681231, 0.00376039229104, |
| 186 | 0.00392074323703, 0.00408197531935, 0.0042264269227, 0.00437307196781, |
| 187 | 0.00452098527825, 0.00466064606118, 0.00479325608498, 0.00491376035745, |
| 188 | 0.00503930226013, 0.00514073539032, 0.00524611661324, 0.00534716811982, |
| 189 | 0.00541967759307, 0.00548760401507, 0.00554757145088, 0.00559380230045, |
| 190 | 0.00562206432097, 0.00564551969164, 0.00563891995151, 0.00562661141932, |
| 191 | 0.0055917128663, 0.005540436394, 0.0054753783077, 0.0053838975897, |
| 192 | 0.00527157587272, 0.00513822754514, 0.00498396877629, 0.004810946906, |
| 193 | 0.00460395301471, 0.00438018617447, 0.0041251642327, 0.00384564081246, |
| 194 | 0.00354012465507, 0.00320918858098, 0.00284467578623, 0.00245085400321, |
| 195 | 0.0020274176185, 0.00157846825768, 0.00109023290512, 0.0005832264248, |
| 196 | 0.00002760451905, -0.00054642808664, -0.00115681355227, -0.00180394725893, |
| 197 | -0.00248267236449, -0.003193377839, -0.00394011240522, -0.004722259624, |
| 198 | -0.00553372111088, -0.00637922932685, -0.00726158168517, -0.00817982333726, |
| 199 | -0.00913253296085, -0.01011502154986, -0.01113155480321, -0.01218499959508, |
| 200 | 0.01327182200351, 0.01439046660792, 0.01554055533423, 0.01673247129989, |
| 201 | 0.01794333813443, 0.01918724313698, 0.02045317933555, 0.02174675502535, |
| 202 | 0.02306801692862, 0.02441609920285, 0.02578758475467, 0.02718594296329, |
| 203 | 0.02860721736385, 0.03005026574279, 0.03150176087389, 0.03297540810337, |
| 204 | 0.03446209487686, 0.03596975605542, 0.03748128504252, 0.03900536794745, |
| 205 | 0.04053491705584, 0.04206490946367, 0.04360975421304, 0.04514884056413, |
| 206 | 0.04668430272642, 0.04821657200672, 0.04973857556014, 0.05125561555216, |
| 207 | 0.05276307465207, 0.05424527683589, 0.05571736482138, 0.05716164501299, |
| 208 | 0.0585915683626, 0.05998374801761, 0.06134551717207, 0.06268578081172, |
| 209 | 0.06397158980681, 0.0652247106438, 0.06643675122104, 0.06760759851228, |
| 210 | 0.06870438283512, 0.06976302447127, 0.07076287107266, 0.07170026731102, |
| 211 | 0.07256825833083, 0.07336202550803, 0.07410036424342, 0.07474525581194, |
| 212 | 0.07531373362019, 0.07580083586584, 0.07619924793396, 0.07649921704119, |
| 213 | 0.07670934904245, 0.07681739756964, 0.07682300113923, 0.07672049241746, |
| 214 | 0.07650507183194, 0.07617483218536, 0.07573057565061, 0.0751576255287, |
| 215 | 0.07446643947564, 0.0736406005762, 0.07267746427299, 0.07158263647903, |
| 216 | 0.07035330735093, 0.06896640131951, 0.06745250215166, 0.06576906686508, |
| 217 | 0.06394448059633, 0.06196027790387, 0.0598166570809, 0.05751526919867, |
| 218 | 0.05504600343009, 0.05240938217366, 0.04959786763445, 0.04663033051701, |
| 219 | 0.04347687821958, 0.04014582784127, 0.03664181168133, 0.03295839306691, |
| 220 | 0.02908240060125, 0.02503075618909, 0.02079970728622, 0.01637012582228, |
| 221 | 0.01176238327857, 0.00696368621617, 0.00197656014503, -0.00320868968304, |
| 222 | -0.00857117491366, -0.01412888273558, -0.01988341292573, -0.02582272888064, |
| 223 | -0.03195312745332, -0.03827765720822, -0.04478068215856, -0.05148041767934, |
| 224 | -0.05837053268336, -0.06544098531359, -0.07269433008129, -0.08013729344279, |
| 225 | -0.08775475365593, -0.09555333528914, -0.10353295311463, -0.1116826931773, |
| 226 | -0.120007798468, -0.12850028503878, -0.13715517611934, -0.1459766491187, |
| 227 | -0.15496070710605, -0.16409588556669, -0.17338081721706, -0.18281725485142, |
| 228 | -0.19239667457267, -0.20212501768103, -0.21197358538056, -0.22196526964149, |
| 229 | -0.23206908706791, -0.24230168845974, -0.25264803095722, -0.26310532994603, |
| 230 | -0.27366340405625, -0.28432141891085, -0.29507167170646, -0.30590985751916, |
| 231 | -0.31682789136456, -0.32781137272105, -0.33887226938665, -0.3499914122931, |
| 232 | 0.36115899031355, 0.37237955463061, 0.38363500139043, 0.39492117615675, |
| 233 | 0.40623176767625, 0.41756968968409, 0.42891199207373, 0.44025537543665, |
| 234 | 0.45159965356824, 0.46293080852757, 0.47424532146115, 0.48552530911099, |
| 235 | 0.49677082545707, 0.50798175000434, 0.51912349702391, 0.53022408956855, |
| 236 | 0.54125534487322, 0.55220512585061, 0.5630789140137, 0.57385241316923, |
| 237 | 0.58454032354679, 0.59511230862496, 0.6055783538918, 0.61591099320291, |
| 238 | 0.62612426956055, 0.63619801077286, 0.64612696959461, 0.65590163024671, |
| 239 | 0.66551398801627, 0.67496631901712, 0.68423532934598, 0.69332823767032, |
| 240 | 0.70223887193539, 0.71094104263095, 0.71944626349561, 0.72774489002994, |
| 241 | 0.73582117582769, 0.74368278636488, 0.75131374561237, 0.75870807608242, |
| 242 | 0.76586748650939, 0.77277808813327, 0.77942875190216, 0.7858353120392, |
| 243 | 0.79197358416424, 0.797846641377, 0.80344857518505, 0.80876950044491, |
| 244 | 0.81381912706217, 0.81857760046468, 0.82304198905409, 0.8272275347336, |
| 245 | 0.8311038457152, 0.83469373618402, 0.83797173378865, 0.84095413924722, |
| 246 | 0.84362382812005, 0.84598184698206, 0.84803157770763, 0.84978051984268, |
| 247 | 0.85119715249343, 0.85230470352147, 0.85310209497017, 0.85357205739107, |
| 248 | 0.85373856005937, 0.85357205739107, 0.85310209497017, 0.85230470352147, |
| 249 | 0.85119715249343, 0.84978051984268, 0.84803157770763, 0.84598184698206, |
| 250 | 0.84362382812005, 0.84095413924722, 0.83797173378865, 0.83469373618402, |
| 251 | 0.8311038457152, 0.8272275347336, 0.82304198905409, 0.81857760046468, |
| 252 | 0.81381912706217, 0.80876950044491, 0.80344857518505, 0.797846641377, |
| 253 | 0.79197358416424, 0.7858353120392, 0.77942875190216, 0.77277808813327, |
| 254 | 0.76586748650939, 0.75870807608242, 0.75131374561237, 0.74368278636488, |
| 255 | 0.73582117582769, 0.72774489002994, 0.71944626349561, 0.71094104263095, |
| 256 | 0.70223887193539, 0.69332823767032, 0.68423532934598, 0.67496631901712, |
| 257 | 0.66551398801627, 0.65590163024671, 0.64612696959461, 0.63619801077286, |
| 258 | 0.62612426956055, 0.61591099320291, 0.6055783538918, 0.59511230862496, |
| 259 | 0.58454032354679, 0.57385241316923, 0.5630789140137, 0.55220512585061, |
| 260 | 0.54125534487322, 0.53022408956855, 0.51912349702391, 0.50798175000434, |
| 261 | 0.49677082545707, 0.48552530911099, 0.47424532146115, 0.46293080852757, |
| 262 | 0.45159965356824, 0.44025537543665, 0.42891199207373, 0.41756968968409, |
| 263 | 0.40623176767625, 0.39492117615675, 0.38363500139043, 0.37237955463061, |
| 264 | -0.36115899031355, -0.3499914122931, -0.33887226938665, -0.32781137272105, |
| 265 | -0.31682789136456, -0.30590985751916, -0.29507167170646, -0.28432141891085, |
| 266 | -0.27366340405625, -0.26310532994603, -0.25264803095722, -0.24230168845974, |
| 267 | -0.23206908706791, -0.22196526964149, -0.21197358538056, -0.20212501768103, |
| 268 | -0.19239667457267, -0.18281725485142, -0.17338081721706, -0.16409588556669, |
| 269 | -0.15496070710605, -0.1459766491187, -0.13715517611934, -0.12850028503878, |
| 270 | -0.120007798468, -0.1116826931773, -0.10353295311463, -0.09555333528914, |
| 271 | -0.08775475365593, -0.08013729344279, -0.07269433008129, -0.06544098531359, |
| 272 | -0.05837053268336, -0.05148041767934, -0.04478068215856, -0.03827765720822, |
| 273 | -0.03195312745332, -0.02582272888064, -0.01988341292573, -0.01412888273558, |
| 274 | -0.00857117491366, -0.00320868968304, 0.00197656014503, 0.00696368621617, |
| 275 | 0.01176238327857, 0.01637012582228, 0.02079970728622, 0.02503075618909, |
| 276 | 0.02908240060125, 0.03295839306691, 0.03664181168133, 0.04014582784127, |
| 277 | 0.04347687821958, 0.04663033051701, 0.04959786763445, 0.05240938217366, |
| 278 | 0.05504600343009, 0.05751526919867, 0.0598166570809, 0.06196027790387, |
| 279 | 0.06394448059633, 0.06576906686508, 0.06745250215166, 0.06896640131951, |
| 280 | 0.07035330735093, 0.07158263647903, 0.07267746427299, 0.0736406005762, |
| 281 | 0.07446643947564, 0.0751576255287, 0.07573057565061, 0.07617483218536, |
| 282 | 0.07650507183194, 0.07672049241746, 0.07682300113923, 0.07681739756964, |
| 283 | 0.07670934904245, 0.07649921704119, 0.07619924793396, 0.07580083586584, |
| 284 | 0.07531373362019, 0.07474525581194, 0.07410036424342, 0.07336202550803, |
| 285 | 0.07256825833083, 0.07170026731102, 0.07076287107266, 0.06976302447127, |
| 286 | 0.06870438283512, 0.06760759851228, 0.06643675122104, 0.0652247106438, |
| 287 | 0.06397158980681, 0.06268578081172, 0.06134551717207, 0.05998374801761, |
| 288 | 0.0585915683626, 0.05716164501299, 0.05571736482138, 0.05424527683589, |
| 289 | 0.05276307465207, 0.05125561555216, 0.04973857556014, 0.04821657200672, |
| 290 | 0.04668430272642, 0.04514884056413, 0.04360975421304, 0.04206490946367, |
| 291 | 0.04053491705584, 0.03900536794745, 0.03748128504252, 0.03596975605542, |
| 292 | 0.03446209487686, 0.03297540810337, 0.03150176087389, 0.03005026574279, |
| 293 | 0.02860721736385, 0.02718594296329, 0.02578758475467, 0.02441609920285, |
| 294 | 0.02306801692862, 0.02174675502535, 0.02045317933555, 0.01918724313698, |
| 295 | 0.01794333813443, 0.01673247129989, 0.01554055533423, 0.01439046660792, |
| 296 | -0.01327182200351, -0.01218499959508, -0.01113155480321, -0.01011502154986, |
| 297 | -0.00913253296085, -0.00817982333726, -0.00726158168517, -0.00637922932685, |
| 298 | -0.00553372111088, -0.004722259624, -0.00394011240522, -0.003193377839, |
| 299 | -0.00248267236449, -0.00180394725893, -0.00115681355227, -0.00054642808664, |
| 300 | 0.00002760451905, 0.0005832264248, 0.00109023290512, 0.00157846825768, |
| 301 | 0.0020274176185, 0.00245085400321, 0.00284467578623, 0.00320918858098, |
| 302 | 0.00354012465507, 0.00384564081246, 0.0041251642327, 0.00438018617447, |
| 303 | 0.00460395301471, 0.004810946906, 0.00498396877629, 0.00513822754514, |
| 304 | 0.00527157587272, 0.0053838975897, 0.0054753783077, 0.005540436394, |
| 305 | 0.0055917128663, 0.00562661141932, 0.00563891995151, 0.00564551969164, |
| 306 | 0.00562206432097, 0.00559380230045, 0.00554757145088, 0.00548760401507, |
| 307 | 0.00541967759307, 0.00534716811982, 0.00524611661324, 0.00514073539032, |
| 308 | 0.00503930226013, 0.00491376035745, 0.00479325608498, 0.00466064606118, |
| 309 | 0.00452098527825, 0.00437307196781, 0.0042264269227, 0.00408197531935, |
| 310 | 0.00392074323703, 0.00376039229104, 0.00360082681231, 0.00344188741828, |
| 311 | 0.00327396134847, 0.00311254206525, 0.00294694477165, 0.00278704643465, |
| 312 | 0.00262017586902, 0.00246256169126, 0.00230172547746, 0.00214615835557, |
| 313 | 0.00198411407369, 0.00183482654224, 0.00168680832531, 0.00154432198471, |
| 314 | 0.00139024948272, 0.00125778846475, 0.00112501551307, 0.00098859883015, |
| 315 | 0.00086084433262, 0.00074580258865, 0.00062393761391, 0.00051073884952, |
| 316 | 0.0004026540216, 0.00029495311041, 0.00020430170688, 0.00010943831274, |
| 317 | 0.00001349497418, -0.00006173344072, -0.00014463809349, -0.0002098337344, |
| 318 | -0.00028969811748, -0.00035011758756, -0.00040951214522, -0.00046063254803, |
| 319 | -0.00051455722108, -0.00055645763906, -0.0005946118933, -0.00063415949025, |
| 320 | -0.00066504150893, -0.00069179375372, -0.00072153919876, -0.00073193571525, |
| 321 | -0.00075300014201, -0.00076307935757, -0.0007757977331, -0.00078014496257, |
| 322 | -0.000780366471, -0.00077798694927, -0.00078343322877, -0.00077248485949, |
| 323 | -0.0007681371927, -0.00074905980532, -0.00074409418541, -0.00072550431222, |
| 324 | -0.00071577364744, -0.00069416146273, -0.00067776907764, -0.00065403333621, |
| 325 | -0.00063124935319, -0.00061327473938, -0.00058709304852, -0.00056778025613, |
| 326 | -0.00054665656337, -0.00052265642972, -0.00050407143497, -0.00048937912498, |
| 327 | -0.00048752279712, -0.00049475180896, -0.00056176925738, -0.00055252865047 |
| 328 | ]; |