/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <math.h>

using namespace std;

#define PI				3.14159265358979323846

static double Sinc(double x)
{
	if (x == 0.0) return 1.0;
	return sin(PI * x) / (PI * x);
}

static double SymmetricBlackmanHarris(double i, int n)
{
	i += (double)n / 2.0;
	double factor = i * 2.0 * PI / (double)n;
	const double a0 = 0.35875;
	const double a1 = 0.48829;
	const double a2 = 0.14128;
	const double a3 = 0.01168;
	return a0 - a1 * cos(1.0 * factor) + a2 * cos(2.0 * factor) - a3 * cos(3.0 * factor);
}

static double SymmetricBlackman(double i, int n)
{
	i += (double)n / 2.0;
	double factor = i * 2.0 * PI / (double)n;
	// Constants from https://e...content-available-to-author-only...a.org/wiki/Window_function#Blackman_window
	const double a0 = 0.42;
	const double a1 = 0.5;
	const double a2 = 0.08;
	return a0 - a1 * cos(1.0 * factor) + a2 * cos(2.0 * factor);
}

static double SymmetricHamming(double i, int n)
{
	i += (double)n / 2.0;
	double factor = i * 2.0 * PI / (double)n;
	const double a0 = 25.0 / 46.0;
	const double a1 = 1.0 - a0;
	return a0 - a1 * cos(1.0 * factor);
}

static double SymmetricHann(double i, int n)
{
	i += (double)n / 2.0;
	double factor = i * 2.0 * PI / (double)n;
	const double a0 = 0.5;
	const double a1 = 1.0 - a0;
	return a0 - a1 * cos(1.0 * factor);
}

int main()
{
	static constexpr int FIRN = 52;
	float tblF[FIRN];
    const double cutoff = 1.0;

    printf("Hello World\n");

	double sum = 0;
	for (size_t i = 0; i < FIRN; i++)
	{
		double t = double(i) - double(FIRN / 2.0) + 1.0 - 0.5;
		sum += tblF[i] = SymmetricBlackmanHarris(t, FIRN) * cutoff * Sinc(cutoff * t);
	}
	// Normalize
	for (size_t i = 0; i < FIRN; i++)
		tblF[i] *= 1.0 / sum;

	for (size_t i = 0; i < FIRN; i++)
	    printf("%.20g\n", tblF[i]);

    return 0;
}
