MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Taper.cpp
Go to the documentation of this file.
1#include "Taper.hpp"
2
4
5// ============================================================================
6// Coefficient generation
7// ============================================================================
8
9std::vector<double> hann(size_t n)
10{
11 if (n == 0)
12 return {};
13 if (n == 1)
14 return { 1.0 };
15 std::vector<double> w(n);
16 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
17 for (size_t i = 0; i < n; ++i)
18 w[i] = 0.5 * (1.0 - std::cos(scale * static_cast<double>(i)));
19 return w;
20}
21
22std::vector<double> hamming(size_t n)
23{
24 if (n == 0)
25 return {};
26 if (n == 1)
27 return { 1.0 };
28 std::vector<double> w(n);
29 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
30 for (size_t i = 0; i < n; ++i)
31 w[i] = 0.54 - 0.46 * std::cos(scale * static_cast<double>(i));
32 return w;
33}
34
35std::vector<double> blackman(size_t n)
36{
37 if (n == 0)
38 return {};
39 if (n == 1)
40 return { 1.0 };
41 std::vector<double> w(n);
42 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
43 for (size_t i = 0; i < n; ++i) {
44 const double x = scale * static_cast<double>(i);
45 w[i] = 0.42 - 0.5 * std::cos(x) + 0.08 * std::cos(2.0 * x);
46 }
47 return w;
48}
49
50std::vector<double> rectangular(size_t n)
51{
52 return std::vector<double>(n, 1.0);
53}
54
55std::vector<double> trapezoid(size_t n, size_t fade_len)
56{
57 if (n == 0)
58 return {};
59 if (n == 1)
60 return { 1.0 };
61 std::vector<double> w(n, 1.0);
62 const size_t ramp = std::min(fade_len, n / 2);
63 for (size_t i = 0; i < ramp; ++i) {
64 const double r = static_cast<double>(i) / static_cast<double>(ramp);
65 w[i] = r;
66 w[n - 1 - i] = r;
67 }
68 return w;
69}
70
71// ============================================================================
72// In-place application
73// ============================================================================
74
75void apply_taper(std::span<double> data, std::span<const double> taper) noexcept
76{
77 if (data.empty() || taper.empty())
78 return;
79 const size_t n = data.size();
80 const size_t tn = taper.size();
81 if (n == tn) {
82 for (size_t i = 0; i < n; ++i)
83 data[i] *= taper[i];
84 } else {
85 for (size_t i = 0; i < n; ++i)
86 data[i] *= taper[i % tn];
87 }
88}
89
90void apply_hann(std::span<double> data) noexcept
91{
92 const size_t n = data.size();
93 if (n <= 1)
94 return;
95 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
96 for (size_t i = 0; i < n; ++i)
97 data[i] *= 0.5 * (1.0 - std::cos(scale * static_cast<double>(i)));
98}
99
100void apply_hamming(std::span<double> data) noexcept
101{
102 const size_t n = data.size();
103 if (n <= 1)
104 return;
105 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
106 for (size_t i = 0; i < n; ++i)
107 data[i] *= 0.54 - 0.46 * std::cos(scale * static_cast<double>(i));
108}
109
110void apply_blackman(std::span<double> data) noexcept
111{
112 const size_t n = data.size();
113 if (n <= 1)
114 return;
115 const double scale = std::numbers::pi * 2.0 / static_cast<double>(n - 1);
116 for (size_t i = 0; i < n; ++i) {
117 const double x = scale * static_cast<double>(i);
118 data[i] *= 0.42 - 0.5 * std::cos(x) + 0.08 * std::cos(2.0 * x);
119 }
120}
121
122void apply_trapezoid(std::span<double> data, size_t fade_len) noexcept
123{
124 const size_t n = data.size();
125 if (n == 0)
126 return;
127 const size_t ramp = std::min(fade_len, n / 2);
128 for (size_t i = 0; i < ramp; ++i) {
129 const double r = static_cast<double>(i) / static_cast<double>(ramp);
130 data[i] *= r;
131 data[n - 1 - i] *= r;
132 }
133}
134
135} // namespace MayaFlux::Kinesis::Discrete
Discrete taper (window) coefficient generation and in-place application for MayaFlux::Kinesis.
std::vector< double > blackman(size_t n)
Blackman taper coefficients.
Definition Taper.cpp:35
void apply_blackman(std::span< double > data) noexcept
Apply a Blackman taper in-place without materialising coefficients.
Definition Taper.cpp:110
std::vector< double > rectangular(size_t n)
Rectangular (unity) taper coefficients.
Definition Taper.cpp:50
std::vector< double > hamming(size_t n)
Hamming taper coefficients.
Definition Taper.cpp:22
void apply_hann(std::span< double > data) noexcept
Apply a Hann taper in-place without materialising coefficients.
Definition Taper.cpp:90
void apply_hamming(std::span< double > data) noexcept
Apply a Hamming taper in-place without materialising coefficients.
Definition Taper.cpp:100
void apply_trapezoid(std::span< double > data, size_t fade_len) noexcept
Apply a trapezoid taper in-place without materialising coefficients.
Definition Taper.cpp:122
std::vector< double > hann(size_t n)
Hann (raised cosine) taper coefficients.
Definition Taper.cpp:9
void apply_taper(std::span< double > data, std::span< const double > taper) noexcept
Multiply data element-wise by a precomputed taper.
Definition Taper.cpp:75
std::vector< double > trapezoid(size_t n, size_t fade_len)
Trapezoid taper coefficients with configurable flat region.
Definition Taper.cpp:55
Tendency< D, float > scale(const Tendency< D, float > &t, float factor)
Uniform scaling of a scalar-output tendency.
Definition Tendency.hpp:97