• Welcome to ASR. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Phono Cartridge Response Measurement Script

Dunno. I haven't played much with either record. EDIT: while you're at it @Thomas_A see if you can find anything definitive on EQ for TRS-1005. The response looks much better without it.

View attachment 491546

View attachment 491547

Based off what I can find which is in recent posts above, I've changed /online standard interface to treat TRS-1005 as completely flat.
 
Odd - never had an error with numpy. Only library issues I had was when the script was using librosa. Glad to have been able to dump that.
I will dig into it later, but first tries I got this, and has to do with my transit from the i7 to M5.

"Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed."
 
Did you migrate or start fresh? If the former, likely easiest to wipe out your Python install and start over.
 

First stab at electrical loading "calculator".

cartridge_loading_response.png
 
Last edited:
Did you migrate or start fresh? If the former, likely easiest to wipe out your Python install and start over.
Did migrate so yes I need to wipe out Python.
 
That could be useful! I recently saw this, which takes the concept one step further: https://www.mvaudiolabs.com/vinyl/cartridge-loading-calculator
apparently this software can calculate frequency responses for different loading setups. The curve their calculator generates looks too dramatic, though..

Moving this here.

I had Claude compare the Python divider model to this ^ JS implementation. The punchline is that the LLM thinks the JS implementation is calculating impedance (admittance) so a current source model. I haven't verified this.

method_comparison.png
 
Moving this here.

I had Claude compare the Python divider model to this ^ JS implementation. The punchline is that the LLM thinks the JS implementation is calculating impedance (admittance) so a current source model. I haven't verified this.
Interesting. Maybe that’s the reason why their curve is different from what I was expecting to see...
 
Interesting. Maybe that’s the reason why their curve is different from what I was expecting to see...

Regardless, the entire exercise reminds me of why I've always discounted the approach, at least with the simple model that can be done with the available data. Real response for various Cl:


at-vm95ml-load-comparison_47k_jvc-trs-1007-4a1.png


Model:

Screenshot 2025-11-30 at 11.34.45 AM.png


It's difficult to align the influence of the electrical parameters of the load on to real measurements.
 
It's difficult to align the influence of the electrical parameters of the load on to real measurements.
It could be interesting if you could put in measured inductance at 1khz and 10khz (most cheap lcr meters can measure those frequencies nowadays).
The 2 coil AT cartridges like the at-vm95 series have a significantly lower inductance at 10khz (probably due to core saturation) and therefore at 10khz the efficiency is less (which means less output).
I expect that the laminated cores in the at-vm5xx and vm7xx series (and for instance in shure's v15 series) is to prevent that (they have much less drop in inductance at 10khz)
 

I was exploring the six component model and split inductance when my AI credits ran out. Interesting conversation with a fake, mostly smart, drunk uncle. Stray winding capacitance didn't pan out. I also need to look again at Hans work. I know I had issues with it but don't recall the specifics.

At the end of the day I don't know if it's worthwhile. The loading changes tend to have a linear enough impact on the response that you don't need much more than two point of C and/or R along with knowledge of where the corner of the LPF sits for a reasonable prediction of optimal load. On most carts Cl is about 0.75-1dB/100pF.
 
SJPlot current version now 18.6.4. Featured changes:
  • plot_data_out, if enabled, now outputs to CSV file - one per channel. The file(s) are named after plot_info in the same way that the plot image file is, and are placed in the directory the script is run from.
  • Normalize indicator will only be placed on the plot if it falls within the plot data range. This is for when start_f and end_f are used so the plot will scale properly to the data range. Along with this change, on the web UI there is no longer a need to ensure the normalize value is between start_f and end_f, so this logic has been removed.
  • Plot data download button added to web UI.

As a performance benchmark I ran version 18.3.8 standalone on my desktop for TRS1007, sweep extraction, and bass emphasis applied. Total processing time was 6.94 seconds. The same configuration for 18.6.5 was 1.96 seconds. Not bad.


ComponentOldNewSpeedupTime Saved
Sweep extraction3.33s0.43s7.7×-2.90s (58%)
createplotdata (left)1.33s0.27s4.9×-1.06s (21%)
createplotdata (right)1.25s0.26s4.8×-0.99s (20%)
Matplotlib0.69s0.66s1.04×-0.03s (1%)
TOTAL6.94s1.96s3.5×-4.98s (72%)
 
Last edited:
Total newb here. Is there a step-by-step perhaps video or guide for new users? I have the Feickert Adjust+ and am thinking that perhaps I am not getting completely accurate frequency response curves and want to verify with this method. Can I simply record the sweep into Audacity and input into the SJPlot without downloading any script?
 
SJPlot without downloading any script?


If you want automatic processing you'll need to use one of the listed test records, preferably (CA)-TRS-1007 or STR 100 being the most accurate. To use a sweep from the Feickert record you'll need to pre-process the audio and use the tool in Advanced mode. Instructions for the fields are on GitHub (link at bottom of the page). I don't have the record so I can't tell you what the specific steps would be.
 
Please get me a "GO" to start that.

Was searching the thread for something else and came across this post, which I'd forgotten. If you or anyone else wants to push this please feel free. At this point it is feature complete - the only thing it doesn't do that the standalone script does is save the extracted sweeps to files.
 

If you want automatic processing you'll need to use one of the listed test records, preferably (CA)-TRS-1007 or STR 100 being the most accurate. To use a sweep from the Feickert record you'll need to pre-process the audio and use the tool in Advanced mode. Instructions for the fields are on GitHub (link at bottom of the page). I don't have the record so I can't tell you what the specific steps would be.
Thank you! So, is automatic processing compatible with a Mac?
 
I update the app location, requirements, and resources in post #2, and created sjplot.com/online basic troubleshooting and help request steps in post #4.

If you want to get in to the dirt on how everything works, Claude and I tore it up last night.
 
I've completed the initial work in moving a lot of the SJPlot components in to a custom library so that they're more easily reusable and so that maintenance/enhancements are abstracted to a single place. The initial goal of this restructuring is to publish tooling that facilitates analysis without the strict one or two channel FR plot use case, such as multi-dimensional comparisons.

This also means the core functions can easily be used for other things; you can pass audio to the library function that analyzes the sweeps and get the data back, and then do whatever you want with it.

I'm sticking to the signal pipeline tenants of signal conditioning -> data creation -> data conditioning, however the order of operations within each category is subject to be changed, or is going to be changed, and in at least one known case these changes will alter the data being plotted. As this is bound to a data smoothing filter operation that has always been used in the script, the degree of impact is not new due to the nature of data smoothing - neighboring data will always influence each other. This also means the absolute change cannot be predicted as it is dependent on the input data. Also not a new thing.

The only reason I'm raising it is for awareness that data from this new architecture and the old isn't going to perfectly align, but the misalignment is benign in that the only thing that's really happening is you being able to compare a function doing what it has always done.

More to come.
 
Last edited:
Not been able to follow everything but will the online version be the same as the downloadable script?
 
Back
Top Bottom