Skip to main content

oxifft/reodft/
redft.rs

1//! Real Even DFT (Discrete Cosine Transform variants).
2//!
3//! REDFT00 = DCT-I
4//! REDFT01 = DCT-III
5//! REDFT10 = DCT-II (the standard "DCT")
6//! REDFT11 = DCT-IV
7//!
8//! These are re-exports of the implementations in `rdft::solvers::r2r`.
9
10use crate::kernel::Float;
11use crate::rdft::solvers::{
12    dct1 as r2r_dct1, dct2 as r2r_dct2, dct3 as r2r_dct3, dct4 as r2r_dct4,
13};
14
15/// DCT type.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17#[non_exhaustive]
18pub enum DctType {
19    /// DCT-I (REDFT00)
20    I,
21    /// DCT-II (REDFT10) - the standard DCT
22    II,
23    /// DCT-III (REDFT01) - inverse of DCT-II
24    III,
25    /// DCT-IV (REDFT11)
26    IV,
27}
28
29/// Execute DCT-II (the standard DCT).
30pub fn dct_ii<T: Float>(input: &[T], output: &mut [T]) {
31    r2r_dct2(input, output);
32}
33
34/// Execute DCT-III (inverse of DCT-II).
35pub fn dct_iii<T: Float>(input: &[T], output: &mut [T]) {
36    r2r_dct3(input, output);
37}
38
39/// Execute DCT-I.
40pub fn dct_i<T: Float>(input: &[T], output: &mut [T]) {
41    r2r_dct1(input, output);
42}
43
44/// Execute DCT-IV.
45pub fn dct_iv<T: Float>(input: &[T], output: &mut [T]) {
46    r2r_dct4(input, output);
47}