Velocity Reviews > C++ > Simple Sine Wave Array

# Simple Sine Wave Array

Phil Newman
Guest
Posts: n/a

 11-02-2005
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;

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

mlimber
Guest
Posts: n/a

 11-02-2005
Phil Newman wrote:
> 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

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

=?ISO-8859-1?Q?Stefan_N=E4we?=
Guest
Posts: n/a

 11-02-2005
mlimber wrote:
> Phil Newman wrote:
>
>>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:
>>
>> [snip]
>>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

>
>
> 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 );

Division by Zero !!

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

Stefan
--
Stefan Naewe
naewe.s_AT_atlas_DOT_de

Phil Newman
Guest
Posts: n/a

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

In function 'void FillSin(std::vector<double, std::allocator<double>
>&)':

'output' undeclared

Can you help there?

Thanks,

Phil

=?ISO-8859-1?Q?Daniel_Sch=FCle?=
Guest
Posts: n/a

 11-02-2005
[...]

> #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 )

^^^

this wont compile
you mean v, not output

> {
> v[ n ] = sin( 2*PI / n );
> }

{} are optional
matter of personal preference

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

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

Marcus Kwok
Guest
Posts: n/a

 11-02-2005
> mlimber <(E-Mail Removed)> wrote:
>> #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;
>> }

Phil Newman <(E-Mail Removed)> wrote:
> Thanks. Unfortunately, the code won't compile. i get an error saying:
>
> In function 'void FillSin(std::vector<double, std::allocator<double>
>>&)':

>
> 'output' undeclared

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

Phil Newman
Guest
Posts: n/a

 11-02-2005
yay, thanks that worked nicely.

cheers for the help,

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

Phil

mlimber
Guest
Posts: n/a

 11-02-2005

Stefan Näwe wrote:
> mlimber wrote:
> > Phil Newman wrote:
> >
> >>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:
> >>
> >> [snip]
> >>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

> >
> >
> > 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 );

>
> Division by Zero !!

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

Mogens Heller Jensen
Guest
Posts: n/a

 11-02-2005

>
> 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 );

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 ]

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

Cheers mate!

-M

Phil Newman
Guest
Posts: n/a

 11-03-2005
Thanks, that works great.

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

Phil