/* funlib.c */
#include <stdlib.h>
#include <math.h>
#include "funlib.h"

void fun_unit_step(
     const long int wave_ary_len, 
     double *waveform)
{
    auto unsigned long int wave_index;

    for (	wave_index = 1; 
          wave_index <= wave_ary_len; 
          wave_index++)
    {
        waveform[wave_index] 
            = 1.0 / (double)wave_ary_len;
    }
    return;
}

void fun_noise(const long int wave_ary_len, 
               const double noise_width,
               double *waveform)
{
    auto unsigned long int wave_index;

    for (wave_index = 0; 
         wave_index < wave_ary_len; 
         wave_index++)
    {
        waveform[wave_index] 
            += noise_width 
            * ((double)rand() / (double)RAND_MAX);
    }
    
    return;
}


void fun_step_real(const long int wave_ary_len, 
                   double *waveform)
{
    auto unsigned long int i,
                           temp_len 
                           = wave_ary_len / 2;
                            
    fun_gaussian_density(temp_len, waveform);
    for (i = 0; i < wave_ary_len; i++)
    {
        waveform[i] = 1.0 - waveform[i];
    }
    for (i = 1; i < temp_len; i++)
    {
        waveform[i] 
            = waveform[i + 1 + (temp_len / 2)];
    }
    for (i = temp_len / 2; i < wave_ary_len; i++)
    {
        waveform[i] = .999;
    }
    waveform[0] = 0.0;
    return;
}

void fun_gaussian_density(const long int wave_ary_len,       
                          double *waveform)
{
    auto unsigned long int i;
    auto double x,
                mean,
                std_dev;
    for (i = 0; i < wave_ary_len; i++)
    {
        mean = (double)wave_ary_len / 2.0;
        std_dev = (0.7 * wave_ary_len) / 6.0;
        x = (double)i;
        waveform[i] 
            = exp(- pow((x - mean), 2.0) 
            / (2.0 * pow(std_dev, 2.0)));
    }
    waveform[0] = 0.0;
    return;
}

void fun_unit_gauss_dens(const long int wave_ary_len,             					double *waveform)
{
    auto double area = 0.0;
    auto unsigned long int wave_index;

    fun_gaussian_density(wave_ary_len, waveform);
    for (wave_index = 0; 
         wave_index < wave_ary_len; wave_index++)
    {
        area += waveform[wave_index];
    }
    for (wave_index = 0; wave_index < wave_ary_len;     
         wave_index++)
    {
        waveform[wave_index] /= area;
    }
    return;
}
