// Uebung3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <math.h>
#include <conio.h>
#include <iostream.h>

//3-1a
//compute ArraySize from Duration and sampling rate
int iGetArraySize(int iDurationMilliSec, int iSamplesPerSecond)
{
	return (iDurationMilliSec * iSamplesPerSecond)/1000; 
}

//3-1b
//compute increment from target frequency and sampling rate
//a frequency of 1 Hertz is defined by an increment of (1*2*Pi/iSamplesPerSecond)
double lfGetIncrement(int iTargetFrequency, int iSamplesPerSecond)
{
	double lfIncrement = 2.0*3.141592654*(double)iTargetFrequency / (double)iSamplesPerSecond;
	return lfIncrement;
}

//3-1c
//allocates buffer; must be deleted by caller!!!
//returns:	-1	on Error
//			0	if OK
int iGenerateSinus(int iDurationMilliSec, int iTargetFrequency, int iSamplesPerSecond, int& riNofSamples, double *& rplfBuffer)
{
	int iSize = iGetArraySize(iDurationMilliSec,iSamplesPerSecond);
	//allocate memory
	double *plfArray = new double[iSize];
	if (!plfArray)
	{
		riNofSamples = 0;
		rplfBuffer = NULL;
		return -1;
	}

	double lfArgument = 0.0;
	double lfIncrement = lfGetIncrement(iTargetFrequency,iSamplesPerSecond);

	for (int i = 0; i < iSize; i++)
	{
		plfArray[i] = sin(lfArgument);
		lfArgument += lfIncrement;
	}

	rplfBuffer = plfArray;
	riNofSamples = iSize;
	return 0;
}


int main(int argc, char* argv[])
{
	
	cout << "Sinus" << endl;

	//two periods of a 1kHz Signal have a duration of 2 ms
	int iNofSamples = -1; 
	double * plfSinus = NULL; 
	if (iGenerateSinus(2,1000,8000,iNofSamples,plfSinus))
	{
		cerr << "error in iGenerateSinus !!!" << endl;
	}


	for (int i = 0; i < iNofSamples; i++)
	{
		cout << "Sinus[" << i << "]: " << plfSinus[i] << endl;
	}

	delete [] plfSinus;

	while(!_kbhit());
	return 0;
}


