Changing Sinewave Frequency: Can it be Done?

  • Context: Undergrad 
  • Thread starter Thread starter btb4198
  • Start date Start date
Click For Summary
SUMMARY

The discussion focuses on generating a sine wave in C# and the confusion surrounding the presence of two frequencies in the output. The original sine wave formula used was 0.05 * (sin(1000 * t * 2 * pi) / 44100), which led to unexpected results. Participants clarified that sine waves inherently have a single frequency, and the perceived additional frequency arises from the implementation in code. Suggestions included simplifying the code and addressing amplitude modulation to avoid artifacts in sound output.

PREREQUISITES
  • Understanding of sine wave properties and frequency representation
  • Familiarity with C# programming and complex numbers
  • Knowledge of audio signal processing concepts
  • Basic grasp of Fourier transforms and their implications
NEXT STEPS
  • Learn about C# audio libraries, such as NAudio, for sound generation
  • Study the effects of amplitude modulation on sine waves
  • Explore the mathematical foundations of Fourier transforms
  • Investigate techniques for smoothing audio signals to reduce artifacts
USEFUL FOR

Audio engineers, software developers working with sound synthesis, and anyone interested in digital signal processing and sine wave generation.

btb4198
Messages
570
Reaction score
10
I know that sinewaves have two part to them a positive frequency and neg frequency.

I am out put a sinewave 0.05 * (sine(1000 *t 2*pi*)/44100)

and I am get two frequencies but i only want one..

so can I change
sin x = 1/2 i (e^(-ix) - e^(ix) )

to

sin x = e^(ix)

so it would be
f(t) = 0.05 * (e^(i(1000 *t*2*pi))/4410)

would that just give me 1000Hz?
and not add any other Frequencies to it?
 
Physics news on Phys.org
so can I change
sin x = 1/2 i (e^(-ix) - e^(ix) )

to

sin x = e^(ix)
No.

But I don't understand how you are getting two frequencies.
##y=A\sin \omega t: \omega = 2\pi f## ... only has the one frequency.

You could try: ##\sin\omega t = \Im [e^{i\omega t}]## ... that help?
 
Are you worrying about the fact that use of a mathematical identity is giving you something unexpected in the 'real world? This is a common problem. Even the roots of a simple quadratic can have values that are impossible in practice.
It's is fine (very useful, in fact) to use the exponential version of a simple sinusoidal waveform but you need to bear in mind that the answers you get from your calculations often have an implied "real part of" in front of them. You can do all the calculations with sines and coses and never get involved with the exponential form but it gets very 'lumpy'.

The 'negative frequency' that your calculations imply has a reality when you amplitude modulate a carrier, where the sidebands are above and below the carrier frequency (positive and negative relative to it).
 
If you're concerned with the negative frequency you may also chose to use a sine transform instead of a full Fourier transform.
 
"If you're concerned with the negative frequency you may also chose to use a sine transform instead of a full Fourier transform."

what do you mean ?
 
sophiecentaur said:
Are you worrying about the fact that use of a mathematical identity is giving you something unexpected in the 'real world? This is a common problem. Even the roots of a simple quadratic can have values that are impossible in practice.
It's is fine (very useful, in fact) to use the exponential version of a simple sinusoidal waveform but you need to bear in mind that the answers you get from your calculations often have an implied "real part of" in front of them. You can do all the calculations with sines and coses and never get involved with the exponential form but it gets very 'lumpy'.

The 'negative frequency' that your calculations imply has a reality when you amplitude modulate a carrier, where the sidebands are above and below the carrier frequency (positive and negative relative to it).

what do you mean by "The 'negative frequency' that your calculations imply has a reality when you amplitude modulate a carrier, where the sidebands are above and below the carrier frequency (positive and negative relative to it) "
 
Simon Bridge said:
No.

But I don't understand how you are getting two frequencies.
##y=A\sin \omega t: \omega = 2\pi f## ... only has the one frequency.

You could try: ##\sin\omega t = \Im [e^{i\omega t}]## ... that help?

I am programing this...
I am using C# and the it always has a low frequency in it
 
btb4198 said:
I am programing this...
I am using C# and the it always has a low frequency in it
Please show us the code that gives you two frequencies.

trig functions in C#
http://www.dotnetperls.com/cos-sin-tan
 
Simon Bridge said:
Please show us the code that gives you two frequencies.

trig functions in C#
http://www.dotnetperls.com/cos-sin-tan

This is what I just tried
it did not work

Code:
 wavefile = new WaveFileWriter(save1.FileName, tone.WaveFormat);
                        double counter2 = 0;
                        double Frequency3 = Convert.ToDouble(FREtx3.Text);
                        double Amplitude3 = Convert.ToDouble(PeakTXT3.Text);
                        Beat = Convert.ToDouble(isochronictxt.Text);
                        if (Beat != 0)
                        {
                            Beat = (1 / Beat);
                        }
                        else
                        {
                            Beat = 0;
                        }
                        for (int n = 0; n < time; n++)
                        {
                            if (counter2 >= Beat)
                            {
                                for (int t = 0; t < 10000; t++)
                                {
                                    wavefile.WriteSample(0F);
                                    wavefile.WriteSample(0F);
                                    
                                }

                                counter2 = 0;
                            }
                            else
                            {
                             
                                Complex R  = Amplitude3 * (Complex.Exp((-Complex.ImaginaryOne * Math.PI * n *2D* Frequency3/ 44100D)));
                                wavefile.WriteSample((float) Math.Abs( R.Magnitude));

                                Complex L = Amplitude3 * (Complex.Exp((-Complex.ImaginaryOne * Math.PI * n * 2D * Frequency3/44100D)));
                                wavefile.WriteSample((float)Math.Abs(L.Magnitude));   
                                counter2 = counter2 + (1D / 44100D);     
                            }
                        }
                        wavefile.Flush();
                        wavefile.Dispose();
                        file.Add(save1.FileName);

I tired with an -I and without an I
both did not work
 
  • #10
OK - what is the code supposed to do?
In what way does it fail to do that?
 
  • #11
Simon Bridge said:
OK - what is the code supposed to do?
In what way does it fail to do that?

the play the same point over and over 0.5 it does not change, beside when I add the 0s
 
  • #12
this is what I am using now

:
Code:
                        wavefile = new WaveFileWriter(save1.FileName, tone.WaveFormat);
                        double counter2 = 0;
                        double Frequency3 = Convert.ToDouble(FREtx3.Text);
                        double Amplitude3 = Convert.ToDouble(PeakTXT3.Text);
                        Beat = Convert.ToDouble(isochronictxt.Text);
                        if (Beat != 0)
                        {
                            Beat = (1 / Beat);
                        }
                        else
                        {
                            Beat = 0;
                        }
                        for (int n = 0; n < time; n++)
                        {
                            if (counter2 >= Beat)
                            {
                                for (int t = 0; t < 10000; t++)
                                {
                                    wavefile.WriteSample(0F);
                                    wavefile.WriteSample(0F);
                                    
                                }

                                counter2 = 0;
                            }
                            else
                            {
                             
                                Complex R  = Amplitude3 * (Complex.Sin((Math.PI * n *2D* Frequency3/ 44100D)));
                                wavefile.WriteSample((float) Math.Abs( R.Magnitude));

                                Complex L = Amplitude3 * (Complex.Sin((Math.PI * n * 2D * Frequency3/44100D)));
                                wavefile.WriteSample((float)Math.Abs(L.Magnitude));   
                                counter2 = counter2 + (1D / 44100D);     
                            }
                        }
                        wavefile.Flush();
                        wavefile.Dispose();
                        file.Add(save1.FileName);

and this is how it looks on a graph :
why.jpg
 
  • #14
Also is did try
Math.Sin()
it did the same thing
 
  • #15
I can't help but wonder why the OP is tackling this with a computer (numerical) approach. It just adds another layer if possible errors and misunderstanding. What is wrong with doing it analytically? Hopping about amongst digital models will always bring in the possibility of problems.
 
  • #16
Just use Y = sin(theta). You don’t need to complicate anything by using Euler’s formula.

btb4198 said:
I know that sinewaves have two part to them a positive frequency and neg frequency.

No. Sine waves only have one frequency, but the output value (amplitude) of a sin function like your C# function has a peak to peak range from -1 to +1.

That’s because the trig functions are based on a unit circle (radius 1) centered at the origin of a given coordinate system (i.e. circle centered at 0,0). Both the x and y components of all the points on the circumference of that circle range from negative one to positive one.

You can scale that range to anything you like, such as 0.05 as you did in your original post. Then you have

Y = 0.05 * sin( t * some_number);

Where some_number = 1000 * 2 * pi / 44100;

This will give you a range from -0.05 to positive 0.05. If you don’t want negative values for some reason, you can translate the waveform by adding 0.05, so your formula is

Y = (0.05 * sin( t * some_number) ) + 0.05;

That will give you a positively biased sin wave with values ranging from 0 to 0.1. However, since this is being used for an audio type application, you should not be concerned with negative values. They will work just fine, and that is probably what you want anyway.

------------------------------------------------------------------------------------------

Here is a hint for making you code work.

1: To start out, forget about the input frequency, amplitude, and beat, and also leave out the counter, beat code. Just hard-code some frequency and amplitude sine wave and get that to work.

2: When that works, switch over to using the input frequency and amplitude and get that to work.

3: When that works add the beat code and make that part work.
 
  • #17
sophiecentaur said:
I can't help but wonder why the OP is tackling this with a computer (numerical) approach. It just adds another layer if possible errors and misunderstanding. What is wrong with doing it analytically? Hopping about amongst digital models will always bring in the possibility of problems.

I think he is trying to program something, not trying to analyse something. It's as if he is given some user specified input for frequency and amplitude, and it is his job to play it back via computer.
 
  • #18
So it's a programming problem and nothing fundamental?
 
  • #19
Why not work out the answer 'properly' and then use a program to produce the figures for the output? In a straightforward case like this, the code is very easy to write and you don't need to be doing any 'DSP' tricks. (It is also a good way of understanding the basics.)
 
  • #20
Ok, I listened to the .wav file and it sounds fine. How is it different from what you were expecting?

If you are concerned about that kind of a ‘click’ to the sound, it’s probably because you are enveloping a sine wave inside of (basically) a square wave. In other words (aside from some slight sawtooth effect) each pulse or burst goes straight from 0 to full volume, and then cuts off from full volume to zero.

The square wave itself is composed of many frequencies (odd harmonics). You can probably alleviate all that by modifying the code to include a volume ramp-up at the beginning of each pulse, and also a ramp-down at the end.

[Edit] (deleted)

Sine2.jpg


Picture of sine wave vs absolute value of sine wave. Not completely sure if there will be much difference in the sound of the audio, but if I were you I would take out the absolute value just to give it a try.
 
Last edited:
  • #21
btb4198 said:
the play the same point over and over 0.5 it does not change, beside when I add the 0s
What is the program supposed to do though?!
btb4198 said:
this is what I am using now
...
and this is how it looks on a graph :
... what were you expecting it to look like?
note: for a graph to make sense, you have to say what the axes represent.

btb4198 said:
Also is did try
Math.Sin()
it did the same thing
... if you are expecting a sine wave output with an audio frequency, then you are certainly doing it wrong. It has nothing to do with two frequencies or anything.
Did you use the Math.Sin() the way the link I gave you does?

The graph you get looks like it wants to be a sine wave but there are bits missing from it.
Your program has a condition where you are setting the value to zero.
Re-examine those conditions.

But you have to tell us what the program has to do before we can help you properly.
I can see that Enlish is not your first language - don't worry, we are used to that. Just give it your best try to tell us what you are supposed to be doing.

MikeGomez said:
It's as if he is given some user specified input for frequency and amplitude, and it is his job to play it back via computer.
I have a feeling this is the case too.

I suspect the program is setting large blocks of zeros which is giving a chopped sine wave.
The remaining bits could act like two or three superimposed signals (2 bars and a triangle).

[edit] did not listen the the audio file - but I suspect you are on the right path.
I'll leave you to it.
 
  • #22
Now that I’ve thought about this a bit more, I have decided that although the absolute value sine wave might sound ok if we could hear it exactly like that, there is no way to reproduce that in the real world. In the real world there is hysteresis in the speaker coil, and momentum in the speaker head, etc, and you will not be able have the signal switch from a straight downward slope to a straight upward slope instantaneously.

Do take out the absolute value function, and smooth the signal edges at ramp up and ramp down, then see if you still have any more problems.

Ok, I’ll shut up now (unless the OP ever responds again, heh heh).

@Simon
He puts the zeros in there as padding. That turns the audio on/off as a beat mechanism. I am no audio engineer, so if others have input that would be good, but as I indicated at this point it’s not clear whether the OP is still interested or not so I guess we’ll just wait and see.
 
  • #23
sophiecentaur said:
Why not work out the answer 'properly' and then use a program to produce the figures for the output? In a straightforward case like this, the code is very easy to write and you don't need to be doing any 'DSP' tricks. (It is also a good way of understanding the basics.)

I am not sure what you mean by "work out the answer 'properly"
 
  • #24
MikeGomez said:
Ok, I listened to the .wav file and it sounds fine. How is it different from what you were expecting?

If you are concerned about that kind of a ‘click’ to the sound, it’s probably because you are enveloping a sine wave inside of (basically) a square wave. In other words (aside from some slight sawtooth effect) each pulse or burst goes straight from 0 to full volume, and then cuts off from full volume to zero.

The square wave itself is composed of many frequencies (odd harmonics). You can probably alleviate all that by modifying the code to include a volume ramp-up at the beginning of each pulse, and also a ramp-down at the end.

[Edit] (deleted)

View attachment 69894


Picture of sine wave vs absolute value of sine wave. Not completely sure if there will be much difference in the sound of the audio, but if I were you I would take out the absolute value just to give it a try.

The low frequency, that should not be there. if you listen to the file, it comes and go... and it get louder and lower, like a sinwave
 
  • #25
@ simon
"What is the program supposed to do though?!"
is supposed to play a tone at on a beat.. but it should not have the low frequency in it
 
  • #26
btb4198 said:
@ simon
"What is the program supposed to do though?!"
is supposed to play a tone at on a beat.. but it should not have the low frequency in it
Are you supposed to end up with a waveform audio format file that, when played, produces a pure tone?

The wave form you had on your graph looks like most of a half-wave with chunks missing - and repeated.

Now what do you need the graph of the wave to look like?

Note: this step-by-step approach is how you troubleshoot projects.

Have you tried Mike's advise about the absolute value?
 
  • #27
I did not have the absolute value before, but when i added it, it remove some of the low frequency.
 
  • #28
Are you supposed to end up with a waveform audio format file that, when played, produces a pure tone?
Now what do you need the graph of the wave to look like?

If you do not tell us what the program is supposed to do we cannot help you.
If you do not answer questions we cannot help you.
 
  • #30
I am trying to make an Isochronic Tone generator
 

Similar threads

  • · Replies 10 ·
Replies
10
Views
3K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 5 ·
Replies
5
Views
694
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 12 ·
Replies
12
Views
501
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 5 ·
Replies
5
Views
10K
  • · Replies 23 ·
Replies
23
Views
18K
  • · Replies 2 ·
Replies
2
Views
3K