Digital sound synthesis has always been a subject of interest to me as a hobbyist. Recently, my interest was further piqued by a wiki page on the Karplus-Strong Guitar synthesis. I was intrigued by the simplicity of the synthesizer design. Here's the diagram from the Wiki page (Figure 1 ):
Also mentioned was the pitch of the note was decided by the delay L by a simple relationship,
where the filter coefficients determine the ‘stringiness’ of the note.
A noise burst? That’s it? That can’t be right! No way it’s that simple!
Like all hobbyists, I began by jumping right in to the implementation. The code took only a couple of hours to put together and I hooked up the DAC output to an oscilloscope. I could tell it looked vaguely sinusoidal with harmonics put together but had no clue what it would sound like (obviously).
A quick search later, I hooked up a pair of old head phones. I wasn’t expecting much, a lot of us know, the first time most projects either don’t do anything or if you’re really down on your luck, emit a tiny puff of white smoke(I prefer to think of it as the spirit of the chip passing on to the great beyond). I was really surprised when it actually did sound like a guitar pluck.
Something was up. Math ahead – you have been warned.
Let’s take a closer look at the diagram in Figure 2 below:
The output of the synthesizer is a simple summation of the low pass filter output and the noise burst. In all the equations below a subscript ‘n’ indicates the current sample.
The Filter is a simple low pass filter of the form,
We’ll get back to what the exact coefficients a and b are a little later.
So essentially we get,
But since the input of the filter is nothing but the output delayed by L samples,
Rewriting the output of the filter as a difference of the output and input and moving things around a bit we get,
Changing this to time domain is achieved simply by substituting
where Ts is the sampling time.
After a little more effort we end up with a quite a large expression,
Thankfully, it’s pretty easy to find the magnitude response by sweeping the frequency ω with Excel.
The sampling rate is set to 44.1ksps (being the least amount which can sweep the whole range of hearing).
From Equation 1 , to generate a 200Hz tone the delay ‘L’ will be 44100/200 = 220.5
Since our delays are digital, A close value of 220 is chosen. I arbitrarily chose the pole of the low pass filter value of 10KHz to start off with. This pole frequency decides the value of ‘a’ and ‘b’ we mentioned earlier.
From the response shown in Figure 3 ,, we can clearly see that if we pass a wide-band noise signal (or as I prefer to look at it: a signal whose energy is spread across all frequencies), the output you would see is a fundamental of 200Hz followed by the 2x, 3x, 4x…. harmonics. This is almost exactly how an actual guitar behaves when plucked; The fundamental is followed by the associated overtones as shown in Figure 4 .
Another interesting point to note is that as you push the filter pole tolower frequency, the higher order harmonics are snubbed and the notebecomes ‘cleaner’ but begins to sound quite unlike a guitar, almost likea drum with the note dying out much quicker.
Also interesting to note is the slight shift in note frequency when moving filter cutoffs (Figure 5 ).
Theshift isn’t very significant around the fundamental but higher orderharmonics begin to shift more due to the phase loss associated with theLow pass filter.
Below in Figure 6 you can see a quicksnapshot of the practical digital sampling oscilloscope (DSO) waveformobtained when playing the note E, around 156 Hz.
Thefrequency peaks are distributed as expected, the magnitude roll offisn’t quite as clean as the theoretical calculations but the overallpicture matches up quite well.
Implementing the digital guitar with a PSoC
Theimplementation was done entirely inside the PSoC5LP chip, CypressSemiconductors flagship model of very powerful mixed signal SoCs. Tomake things more interesting, I added some user interface into thesystem by introducing a few touch buttons which pluck different noteswhen touched. Figure 8 is a system level block diagram of the basic building blocks.
The Karplus-Strong synthesizer is probably one of the simplest synthesizer algorithm to code but theoutput sounds surprisingly good even with a 8-bit DAC (which is strictlyunderpowered for audio reproduction).
The only drawback is therather large amounts of buffer we need when playing low frequency notes.For example, playing a 100Hz signal will require a buffer of 441 whensampling at 44.1Ksps. This can be a problem if we want to add multiplesimultaneous strings and code size is a concern.
Adding theflexibility of PSoC also opens up a lot of new options such as using anI2S interface to output the signal to a standard audio DAC. Moving thesynthesis code to the Digital Filter Block(DFB) to free up the main coreto add any other calculation intensive process.
Sree Harsha Angara works as an Applications Engineer at Cypress Semiconductor Corporation where he is involved in a wide variety of Embedded system designs using the PSoC platform. He holds a Masters degree in Electrical Engineering from the Birla Institute of Technology and Science, Pilani and his research interests include Control Theory, Embedded applications in Power as well as digital filter theory.