Building an electronic guitar digital sound synthesizer using a programmable SoC
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.