Reference https://github.com/spurious/snd-mirror/blob/master/clm.c
| 94 | |
| 95 | // Reference https://github.com/spurious/snd-mirror/blob/master/clm.c |
| 96 | inline void ApplyWindowFunctionInplace(const WindowFunction type, float * buffer, const int window_size) |
| 97 | { |
| 98 | const float max_index = static_cast<float>(window_size) - 1.f; |
| 99 | |
| 100 | switch (type) |
| 101 | { |
| 102 | case WindowFunction::rectangle: |
| 103 | { |
| 104 | for (int i = 0; i < window_size; ++i) |
| 105 | { |
| 106 | buffer[i] = 1.f; // or * 0.5f? |
| 107 | } |
| 108 | } |
| 109 | break; |
| 110 | |
| 111 | case WindowFunction::cosine: |
| 112 | { |
| 113 | for (int i = 0; i < window_size; ++i) |
| 114 | { |
| 115 | buffer[i] *= std::sin((static_cast<float>(LAB_PI) * i) / max_index); |
| 116 | } |
| 117 | } |
| 118 | break; |
| 119 | |
| 120 | case WindowFunction::hann: |
| 121 | { |
| 122 | for (int i = 0; i < window_size; ++i) |
| 123 | { |
| 124 | buffer[i] *= detail::gen_cosine_1(max_index, i, 0.5f, 0.5f); |
| 125 | } |
| 126 | } |
| 127 | break; |
| 128 | |
| 129 | case WindowFunction::hamming: |
| 130 | { |
| 131 | for (int i = 0; i < window_size; ++i) |
| 132 | { |
| 133 | buffer[i] *= detail::gen_cosine_1(max_index, i, 0.54f, 0.46f); |
| 134 | } |
| 135 | } |
| 136 | break; |
| 137 | |
| 138 | case WindowFunction::blackman: |
| 139 | { |
| 140 | for (int i = 0; i < window_size; ++i) |
| 141 | { |
| 142 | buffer[i] *= detail::gen_cosine_2(max_index, i, 0.42f, 0.50f, 0.08f); |
| 143 | } |
| 144 | } |
| 145 | break; |
| 146 | |
| 147 | case WindowFunction::nutall: |
| 148 | { |
| 149 | for (int i = 0; i < window_size; ++i) |
| 150 | { |
| 151 | buffer[i] *= detail::gen_cosine_3(max_index, i, 0.355768f, 0.487396f, 0.144232f, 0.012604f); |
| 152 | } |
| 153 | } |