dsp: make IDCT (un)scaled
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 27 Oct 2018 16:56:48 +0000 (18:56 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 27 Oct 2018 16:56:48 +0000 (18:56 +0200)
src/codecs/atrac3.rs
src/codecs/real/cook.rs
src/dsp/mdct.rs

index 2a6b44c7c299777e804068ecef9a6d343c835305..c61a26230e876bee5012f1df19dad506304e638f 100644 (file)
@@ -288,7 +288,7 @@ impl DSP {
         }
 
         Self {
-                imdct:  IMDCT::new(FFTMode::SplitRadix, 512),
+                imdct:  IMDCT::new(FFTMode::SplitRadix, 512, false),
                 tmp:    [0.0; ATRAC3_FRAME_SIZE + 64],
                 gain_tab, gain_tab2, window,
             }
index a03a5bb670be28920a0749c8a5f55c0f3ac79d98..2e8b45c101db8c3afdd03e52ed4c19330fc78e10 100644 (file)
@@ -112,7 +112,7 @@ impl CookDSP {
             gain_tab[i] = pow_tab[i + 53].powf(8.0 / fsamples);
         }
         let size = samples;
-        CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
+        CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2, false), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
     }
 }
 
index b2927397f6624f185ffea3547e96fa6bb24dbfa4..540ae4527986b375f14420646fc6614753fc0c39 100644 (file)
@@ -19,11 +19,12 @@ fn imdct(src: &[f32], dst: &mut [f32], length: usize) {
 }*/
 
 impl IMDCT {
-    pub fn new(mode: FFTMode, size: usize) -> Self {
+    pub fn new(mode: FFTMode, size: usize, scaledown: bool) -> Self {
         let mut twiddle: Vec<FFTComplex> = Vec::with_capacity(size / 4);
         let factor = 2.0 * consts::PI / ((8 * size) as f32);
+        let scale = if scaledown { (1.0 / (size as f32)).sqrt() } else { 1.0 };
         for k in 0..size/4 {
-            twiddle.push(FFTComplex::exp(factor * ((8 * k + 1) as f32)));
+            twiddle.push(FFTComplex::exp(factor * ((8 * k + 1) as f32)).scale(scale));
         }
         let fft = FFTBuilder::new_fft(mode, size/4);
         let mut z: Vec<FFTComplex> = Vec::with_capacity(size / 2);