• 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!

Complex impedance load amp FR influence - WiiM Amp review by Erin

Are you proficient with software math tools such as Python, Julia, MATLAB, Octave, Mathematica, etc.? I used the data points from WebPlotDigitizer and fed them to the interpolation functions of one of those math tools to resample the data to any frequencies of my choice (that are within the range of frequencies of the digitized data).
I am not. Last time I did math was in college algebra 14 years ago.

I did have ChatGPT write me a python script to try and extract all the data into text, but it would miss a bunch of the data points and end up with weird numbers.
 
I am not. Last time I did math was in college algebra 14 years ago.

I did have ChatGPT write me a python script to try and extract all the data into text, but it would miss a bunch of the data points and end up with weird numbers.
I wrote some Python code to do something very similar for this post (Python code in the spoiler). With just a little bit of modification it should be able to do what you want.
 
how do I match them up to the corresponding frequencies so that I end up with 1 dataset with all values? Do I add another dataset for the Frequency (Hz)? If yes - what do I do for the Y axis when calibrating?
No. While calibrating you define both axes (frequency and phase/impedance) and the resulting trace data will contain both values per data point.

There's actually no need to create multiple datasets in WebPlot like in your screenshot.

You do the Calibration (XY) for one graph, e.g. the impedance graph, defining the frequency and impedance axes, trace the impedance line, export the data, then reimport the graph image and redo the calibration, but this time with frequency and phase.
Then trace the phase line, export that data and you're done.
 
No. While calibrating you define both axes (frequency and phase/impedance) and the resulting trace data will contain both values per data point.

There's actually no need to create multiple datasets in WebPlot like in your screenshot.

You do the Calibration (XY) for one graph, e.g. the impedance graph, defining the frequency and impedance axes, trace the impedance line, export the data, then reimport the graph image and redo the calibration, but this time with frequency and phase.
Then trace the phase line, export that data and you're done.
I did, however that doesn't solve the problem of having different X (freq) values for both datasets. All good, I had ChatGPT write a Python script that interpolates the impedance and phase data from either a .csv or a .txt file into one merged file that VCAD can read. I'll attach the code below if anyone else wants to use it - paste it in your notepad and save the file as merge_data.py. Make sure the impedance file is called impedance.txt or impedance.csv and the phase file is called phase.txt or phase.csv when exporting the data from WebPlot - then run py merge_data.py in Powershell. Now you have a file you can drop into VCAD to simulate FR.

Attached WiiM Amp FR outputs of the Polk R500, Revel F35 and Elac DF63 for anyone interested with some very scientific handwriting to differentiate them.

Code for Python script:
Python:
import numpy as np

def load_data(filename):
    freqs = []
    values = []
   
    with open(filename, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line or "freq" in line.lower():  # Skip empty lines and headers
                continue

            if ";" in line:
                parts = line.split(";")
                if len(parts) == 2:
                    freq_str = parts[0].strip().replace(",", ".")
                    val_str = parts[1].strip().replace(",", ".")
                    try:
                        freqs.append(float(freq_str))
                        values.append(float(val_str))
                    except ValueError:
                        continue  # skip bad data

    return np.array(freqs), np.array(values)

# Load data from either .csv or .txt
imp_freq, imp_vals = load_data("impedance.csv")  # or "impedance.txt"
pha_freq, pha_vals = load_data("phase.csv")      # or "phase.txt"

# Interpolate phase to match impedance frequencies
interp_phase_vals = np.interp(imp_freq, pha_freq, pha_vals)

# Merge all into one array
merged_data = np.column_stack((imp_freq, imp_vals, interp_phase_vals))

# Write to neatly aligned text file with 5 decimals
col_width = 18
with open("merged_output.txt", "w", encoding="utf-8") as f:
    f.write(f"{'freq (Hz)':<{col_width}}{'imp (ohm)':<{col_width}}{'phase (deg)':<{col_width}}\n")
    for row in merged_data:
        f.write("{:<18.5f}{:<18.5f}{:<18.5f}\n".format(row[0], row[1], row[2]))

print("✅ Merged output saved as 'merged_output.txt' with 5 decimal places.")
 

Attachments

  • WiimAmp-load-dependent-FR-output SPL-ElacDF63.png
    WiimAmp-load-dependent-FR-output SPL-ElacDF63.png
    18.6 KB · Views: 23
  • WiimAmp-load-dependent-FR-output SPL-RevelF35.png
    WiimAmp-load-dependent-FR-output SPL-RevelF35.png
    18.2 KB · Views: 20
  • WiimAmp-load-dependent-FR-output-Polk_R500.png
    WiimAmp-load-dependent-FR-output-Polk_R500.png
    20.4 KB · Views: 19
Last edited:
This old thread juste popped up so I owe an update on this:
That why I used 25-years-old Boston CR8s. Not that afraid to damage them, honestly. I could also try to get a pair of Focal Chora 806s at a broken price. SoundStage uses this for "complex" impedances, but I believe with a simulated load of it. Anyway, at least we know their impedance curve...

Please note that I only plugged the speakers for FR captures at 1 and 5 Watts max (and it was already painful standing close to these, sweeping at 5 Watts).
These are the FR measurements I published for On-mag.fr about a year ago :
1000014772.png

Speaker Load is a pair of Focal Chora 806. An actual, real pair of speakers, not a simulated load.(Impedance measured here)
1000014773.png
 
Back
Top Bottom