Martin McBride, 2021-10-01
Tags python open source github pysound sine
Categories pysound

Pysound changing frequency, amplitude, and offset of a sine wave

In this example, we will change the frequency, amplitude, and offset of a sine wave. This is based on the article Creating a sine wave.

Changing the frequency

Here is the code:

from pysound.buffer import BufferParams
from pysound.oscillators import sine_wave
from pysound import soundfile
from pysound.graphs import Plotter

params = BufferParams()
out = sine_wave(params, frequency=250)
soundfile.save(params, 'sine-250.wav', out)

This works in the same way as the previous sine wave example, but we have set the frequency to 250 Hz in the sine_wave function. If you listen to the sound you will hear that it has a lower pitch.

Here is a graph of the sound:

This shows the same 10 ms time range as the previous article, which showed a 500 Hz signal. For a 250 Hz signal, the wave period is one 250th of a second, ie 4 ms. This means that there will be 2.5 cycles in the 10 ms range of the graph.

The code to plot the graph is exactly the same as the previous article.

Changing the amplitude

Now we will see how to change the amplitude of the wave.

The default amplitude is 1.0, which means that the wave oscillates between the values +1.0 and -1.0, as you can see in the previous graph.

We will change the amplitude to 0.6, which means that the wave oscillates between the values +0.6 and -0.6. As you might imagine, this makes the sound a little quieter.

Here is the code:

out = sine_wave(params, frequency=500, amplitude=0.6)
soundfile.save(params, 'sine-500-6.wav', out)

In the sine_wave function, we have set the frequency back to 500 Hz and set the optional amplitude parameter to 0.6. Here is the graph:

Changing the plot scale

By default, when we plot a sound wave, Pysound sets the scale automatically to fit the wave. So when we plot a sound with an amplitude of 0.6, the graph will be adjusted so it has a range of +/- 0.6.

In this case, we want to compare this graph with the previous graph that had an amplitude of 1.0, so we want both graphs to be plotted with the same amplitude scale. We can do this by adding a call to with_yrange when we set up the plotting, like this:

## Plot a graph of the first part of the previous sine wave
Plotter(params, 'sine-500-6.png', out).with_timerange(0, 0.01)\
                                    .with_title("500 Hz sine wave, amplitude 0.6")\
                                    .with_yrange(-1, 1)\
                                    .in_milliseconds()\
                                    .plot()

Changing the offset

By default, the sine wave has an average value of zero. So if the amplitude is 0.6, it oscillates between +0.6 and -0.6.

It is sometimes useful to create a wave that oscillates about some other value. We can do that using the offset parameter. Here is an example:

out = sine_wave(params, frequency=500, amplitude=0.3, offset=0.4)
soundfile.save(params, 'sine-500-3-4.wav', out)

In this case, the amplitude is 0.3 and the offset is 0.4, so the wave has the following characteristics:

  • The maximum value is offset + amplitude, or 0.7.
  • The maximum value is offset - amplitude, or 0.1.

In other words, it is a sine wave of amplitude 0.3 that has been shifted up by 0.4

Here is the graph:

You can't hear this offset, in fact if you play the sound it is very likely that the audio amplifier will remove the offset altogether. However, the offset comes in very useful if you want to use the oscillator as a control signal, for example to create tremolo or vibrato effects.


Join me on substack to keep up to date with this blog