14#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
30 this->samples_minus_1 = -1.0f +
samples;
32 this->i_half_samples =
samples / 2;
38 assert(i_half_samples == i_samples / 2);
39 float result = idx <= i_half_samples ? factor_internal(idx)
40 : factor_internal(i_samples - idx - 1);
41 return result > 1.0f ? 1.0f : result;
45 inline int samples() {
return i_samples; }
47 virtual const char* name() = 0;
50 float samples_minus_1 = 0.0f;
52 int i_half_samples = 0;
53 const float twoPi = 6.28318531f;
54 const float fourPi = 12.56637061f;
55 const float sixPi = 18.84955593f;
58 virtual float factor_internal(
int idx) = 0;
61 inline float ratio(
int idx) {
62 return (
static_cast<float>(idx)) / samples_minus_1;
77 static char buffer[80] =
"Buffered ";
78 strncpy(buffer + 9, p_wf->name(), 69);
90 for (
int j = 0;
j <= i_half_samples;
j++) {
101 float factor_internal(
int idx)
override {
102 if (idx < 0 || idx > i_half_samples)
return 0.0;
115 float factor_internal(
int idx) {
119 const char* name() {
return "Rectange"; }
130 float factor_internal(
int idx) {
131 return 0.54f - (0.46f *
cos(twoPi * ratio(idx)));
133 const char* name() {
return "Hamming"; }
144 const char* name() {
return "Hann"; }
146 float factor_internal(
int idx) {
147 return 0.54f * (1.0f -
cos(twoPi * ratio(idx)));
159 const char* name() {
return "Triangle"; }
160 float factor_internal(
int idx) {
161 return 1.0f - ((2.0f * fabs((idx - 1) -
162 (
static_cast<float>(i_samples - 1) / 2.0f))) /
176 const char* name() {
return "Nuttall"; }
177 float factor_internal(
int idx)
override {
178 float r = ratio(idx);
179 return 0.355768f - (0.487396f * (
cos(twoPi *
r))) +
180 (0.144232f * (
cos(fourPi *
r))) - (0.012604f * (
cos(sixPi *
r)));
193 const char* name() {
return "Blackman"; }
194 float factor_internal(
int idx)
override {
195 float r = ratio(idx);
196 return 0.42323f - (0.49755f * (
cos(twoPi *
r))) +
197 (0.07922f * (
cos(fourPi *
r)));
209 const char* name() {
return "BlackmanNuttall"; }
210 float factor_internal(
int idx)
override {
211 float r = ratio(idx);
212 return 0.3635819f - (0.4891775f * (
cos(twoPi *
r))) +
213 (0.1365995f * (
cos(fourPi *
r))) - (0.0106411f * (
cos(sixPi *
r)));
225 const char* name() {
return "BlackmanHarris"; }
226 float factor_internal(
int idx)
override {
227 float r = ratio(idx);
228 return 0.35875f - (0.48829f * (
cos(twoPi *
r))) +
229 (0.14128f * (
cos(fourPi *
r))) - (0.01168f * (
cos(sixPi *
r)));
241 const char* name() {
return "FlatTop"; }
242 float factor_internal(
int idx)
override {
243 float r = ratio(idx);
244 return 0.2810639f - (0.5208972f *
cos(twoPi *
r)) +
245 (0.1980399f *
cos(fourPi *
r));
257 const char* name() {
return "Welch"; }
258 float factor_internal(
int idx)
override {
260 (((idx - 1) - samples_minus_1 / 2.0f) / (samples_minus_1 / 2.0f));
261 return 1.0f - (tmp * tmp);