Many times I needed to extract threshold voltages from experimental results. I remember in my PhD days, this was quite a debate, and we could generally agree there is no optimum way of doing it. The problem mostly lied in that you are not exactly sure in which part of the plot the current starts to flow, or the channel is depleted. In room temperature transistors, this was mainly due to the intermediate region of thermal population of the bands. In quantum transistors, we are playing in the low temperature field and most of the time dopants are thought to be frozen.

What is really certain is that all voltages that you compare against will need to be extracted using the same method.

Since what we are interested in is changes in the curvature of the plot, we expect to play around with derivatives a lot. But for this, there is the extra problem that experimental results can be very noisy. Once you take the derivative, you introduce further noise, that goes even worse in the second derivative (see figure below).

If you are using Originlab, it’s quite easy to play around as it also has some smoothing capabilities. I used to do that a lot in my PhD, but nowadays I am going through a more open source phase. One software I am aware of is SciDAVis. I haven’t tried it yet, but it mentions in the manual that noisy data will need to be smoothed out before findind their derivatives and it has its own routines for that.

If you are following the programming road like me, it becomes really fast way to do all this after loading all data in Python. Then we can do a lot of batch work and plot publication-ready graphs. Further to this, I was surprised to find out how easy it is to smooth out a curve.The idea is to use a running window. You take the weighted average of a ‘window’ in the plot, whose length you decide yourself. This can be done using convolution.

`numpy.convolve(data, np.ones(ww)/ww, mode='valid')`

This routine takes the values in ‘data’ and overlaps it with running window of width ‘ww’. That is done by multiplying each element by a corresponding coefficient and then add up the results. Then, finally, you decide what to do with the edges using the ‘mode’ parameter. There will probably be some edge effects there, so if the pinch-off voltage is close to the edge, you might have problems detecting it, but you might still be able to correct for this by fixing the window of convolution. I usually pad the edges with the same values as the first/last element. This allows me to keep all arrays the same length.

Finally, you can take the first (or even second derivative after re-smoothing) using the routine of your choice. In my case, a simple `numpy.gradient()`

did it. You can see the final result in the figure below.

You can see that the routine produces much clearer results for the derivatives, and you just need to decide where you want to take the pinch off. Generally, this is a very robust method that for my data it succedded detecting the pinch-off voltages in more than 90% of the cases, but it is affected a lot by the width of the running window, the padding and all things related to the smoothing process. For more accurate results, the trend is to use methods from what has been astablished as the ‘Machine Learning’ toolbox, but this I leave for a different post.

Feel free to share your own method in the comments if you like.

Pingback: Automating device data analysis | The nanoelectronics buff