Hey all,
After getting my Keithley 2015 THD for some small amplifier projects I was shocked that nobody had put together some tools to automate the beast. The DMM is simple to get THD or THD+N numbers on the display, but that never tells the whole pictures. After some digging around I managed to extract the first FFT plot (make a WAG at the bin bandwidth, manual doesn't say) and plot some graphs. I haven't seen anyone share FFT spectrum plots from the device, so I'm hear to share!
The first screenshot (read title on plot) is with the internal source generator generating a 1kHz sine wave at 1Vrms. The internal generator isn't that amazing, and as others have pointed out: A sound card on a PC can probably do better if you can eliminate the noise of the PC. The 2015's gen spec is "-64dB THD+N with harmonics 2-5" which calculates out to 0.063%. It measures 0.02% THD+N, which should include all harmonics and be more pessimistic. Seems well within spec.
The second screenshot is my FIIO D03K optical to analog DAC generating the same 1kHz sine wave with the volume at -3.0 dB according to the software mixer in Linux. The D03K DAC is rated for "Total harmonic distortion: <0.008%" and the Keithley measures it at 0.003% on the THD+N setting (assuming they measure and calculate the same). Impressive for both the DAC and the 2015. The spec sheet for the 2015 lists the THD+N residual distortion at 0.056% from 20-20kHz, so this is well within that spec (at least at 1kHz and 0.5Vrms) as well. I'm not sure if I'm reading the spec sheet right in this department, what is actually described in the Keithley 2015 spec sheet for "Residual distortion"?
In short it works as expected and I'm assuming that the Keithley 2015 meter is reading well beyond what my ears can hear (audiophoolery aside).
That said I have a few comments:
- The Keithley 2015 SCPI command reference describes the :FFTransform:BINS command, but it doesn't discuss the bandwidth of each bin. From my own empirical measurements, bin[1] measures from 61-121Hz and bin[291] measures from 19915-19983Hz. That means the first bin is 60 Hz wide and the last bin is 68 Hz wide. Does anyone have ideas on how this actually works? Is it really not documented anywhere? My graphs are plotting bins 1-500 which is approximately 0-34.2kHz. The plots place the data at the center of each bin and that's why 1kHz doesn't line up with the grid lines. I don't think I can do much better without a finer grain FFT. I assume this is the limit of the Keithley 2015. Also, if bin[500] = 34.2kHz, it's unfortunate that I can't define a small bin width to zoom in on certain frequencies instead of measuring out to 1023 * 60 = 61.3kHz which seems only useful for catching higher harmonics at higher frequencies. The docs for the Keithley 2015-P (note the P for peak) seems to have definable bin width or ambiguous documentation, neither would surprise me.
- A Keithley 2015 quick reference guide (doc #2015-903-01 Rev. A, Dec 2001) mentions a :DISTortion:BNoIse SCPI command and the user manual (Doc #2015-900-01 Rev. F, Aug 2003) doesn't even mention the command. The ref guide describes it as "Background noise is the residual voltage after the input signal’s fundamental and harmonics are removed." for frequencies greater then 61 Hz. Are there any more forgotten commands?
Hopefully one to reisze bins - This is my first time playing with a SCPI over UART, but it seems after I send the "*RST" command the first letter of almost any command I send next is dropped. Not sure if this is my RS232-USB converter (seems unlikely) or a firmware bug.
- My device responds to *IDN? command with "KEITHLEY INSTRUMENTS INC.,MODEL 2015,1051478,B15 /A02" for those interested.
Next steps, clean-up the horrendous hacky code and try go make it easy to spit out graphs for a handful of common tasks:
- Automated FFT spectrum plot with harmonics. First attempt is done as attached
- Sweep frequencies using internal generator and measure the THD+N at a number of points and plot. I fear the internal source may not be good enough for devices I want to test.
- Sweep frequencies using the internal generator to build a frequency response plot. Would be handy to overlay multiple tests to do channel mapping
- Measure noise floor. I don't know how to do this on the Keithley 2015, any ideas?