Simple Sine Wave Array

Discussion in 'C++' started by Phil Newman, Nov 2, 2005.

1. Phil NewmanGuest

I'm trying to implement a basic sinewave signal using arrays, but I'm
having difficulty (I'm a complete beginner!)

This is what I have so far:

using namespace std;

double signal(double sinewave, double x);

int main()
{

double x, sinewave, output;

cout<<endl<<"Please enter a value, x"<<endl<<endl;
cin>>x;

output = signal(sinewave,x);
cout<<endl<<"Sin(x) = "<<output<<endl<<endl;

return 0;
}

double signal(double sinewave, double x)
{

sinewave = sin(x);
return sinewave;
}

I want to swap a single value x, for an array of 100 points.

Can anyone help me with this?

Later, I'll need to change the frequency of the signal, but this
doesn't matter now? Also, I'll want to plot the signal, but I think

If anyone can help, I would really appreciated it!

Phil Newman

Phil Newman, Nov 2, 2005

2. mlimberGuest

Try this:

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

void FillSin( vector<double>& v )
{
static const double PI = 4*atan(1.0);
for( int n=0; n < output.size(); ++n )
{
v[ n ] = sin( 2*PI / n );
}
}

int main()
{
vector<double> output( 100 );
FillSin( output );
for( int n=0; n < output.size(); ++n )
{
cout << output[n] << '\n';
}
return 0;
}

Cheers! --M

mlimber, Nov 2, 2005

3. =?ISO-8859-1?Q?Stefan_N=E4we?=Guest

Division by Zero !!
Stefan

=?ISO-8859-1?Q?Stefan_N=E4we?=, Nov 2, 2005
4. Phil NewmanGuest

Thanks. Unfortunately, the code won't compile. i get an error saying:

'output' undeclared

Can you help there?

Thanks,

Phil

Phil Newman, Nov 2, 2005
5. =?ISO-8859-1?Q?Daniel_Sch=FCle?=Guest

[...]
^^^

this wont compile
you mean v, not output
{} are optional
matter of personal preference
I have not used C++ for ages but I recall that one could use
std::transform on a vector
something like
#include <functional>
or
#include <algorithm>
std::transform(v.begin(), v.end(), std::sin)

and see the result
std::copy(v.begin(), s.end(), std:stream<int>(std::cout, " : "));

hth, Daniel

ps: well about ploting C++ has nothing built-in, nothing standard so to
say, you will have to use yours op libraries
nowdays I code in python there you could use Tk or ploting modules
matplotlib, scipy and Numeric

=?ISO-8859-1?Q?Daniel_Sch=FCle?=, Nov 2, 2005
6. Marcus KwokGuest

Please quote the message you are replying to (I have pasted it in
manually).

In FillSin, either change it to:

void FillSin( vector<double>& output )

or in the for loop, change it to:

for (int n = 0; n < v.size(), ++n)

Marcus Kwok, Nov 2, 2005
7. Phil NewmanGuest

yay, thanks that worked nicely.

cheers for the help,

I get the feeling i'll be posting a few more questions on here!

Phil

Phil Newman, Nov 2, 2005
8. mlimberGuest

Oops, sorry. I just wrote that off-the-cuff. It should be:

for( int n=0; n < v.size(); ++n )
{
v[ n ] = sin( 2*PI / (n+1) );
}

Cheers! --M

mlimber, Nov 2, 2005
9. Mogens Heller JensenGuest

The sine function has a period of 2*PI, so it should be:

v[n] = sin(2*PI*n / v.size());

for n = [ 0 ; v.size()-1 ]
Cheers mate!

-M

Mogens Heller Jensen, Nov 2, 2005
10. Phil NewmanGuest

Thanks, that works great.

How would I be able to add white noise to the sinewave signal over 1000
samples?

Phil

Phil Newman, Nov 3, 2005
11. osmiumGuest

Since no one has responded ....
Here's what I would do but I can't certify anything.
Decide how much noise you want and use rand() to generate a voltage in that
range for a
particular sample. For each sample add the two components to get signal
plus noise. Make a second drawing from rand() to choose the polarity of the
noise. You could speed that up, at the expense of clarity, by selecting a
bit from a single drawing to define the polarity

osmium, Nov 6, 2005
12. benGuest

I have not used C++ for ages but I recall that one could use
Then don't forget to fill the vector with increasing angles first.
Perhaps you mean:

std::copy(
v.begin(),
v.end(),
Not so. You can plot on the text console with letters or punctuations,
although not as good looking as most other means.

Ben

ben, Nov 6, 2005