REW Beta Release REW API beta releases

Hi, I would like to ask if there is an option to add an offset to measurement data in dBV, dBFS and dBr axis modes. Thanks in advance.
 
You can edit the voltage scaling on the Info window for the measurement:

1777106977701.png


dBFS levels can be changed by scaling the IR data using the option in the right click menu on the Impulse graph.

dBr is a relative axis setting and not affected by scalings or offsets.
 
Builds updated today (beta 124) with these changes:
  • Added: Equaliser entries for ESX Audio
  • Added: The in-app preferences help is now available in Simplified Chinese
  • Changed: In-app preferences help for German has been updated
  • Fixed: The cal file parser could fail to correctly detect comma as delimiter in some cases
  • Fixed: Typo in German language bundles
 
Hi
I notice this new ESX EQ allow 31 band and low shelf for bass boost. before i did not find such a EQ in REW. It is the only i find with so many bands and low shelfs. but when i create a impulse response from the filters, i notice there is no LF filter add and is see in filter display. the LF is add in filter+target .
but how can i create a impulse response of filter+target ? . i test also the bass limit speaker as targettype in REW. this have same problem

normaly i use a peak filter manualy for the bass boost. because REW do bass boost only with LF shelf. a low shelf boost can cause earlier clipping and more distortion when all low frequency are boost.
with 40 hz lowpass.jpg
 
Why would they? EQ doesn't use low pass or high pass filters, they are parametric filters ( optionally with shelf filters) to bring the measurement onto the target. If you want a high pass add it manually.
 
@John Mulcahy Hi John, I installed the latest BETA 124 on a brand new Dell laptop running Windows 11 Home. I selected 4GB as the RAM during installation. After installation and restarting my laptop followed by opening REW, I saw the following crash reported. When the REW started after a reboot, I got 2 dialog boxes. One to load the UMIK-1 calibration file and another message saying I should right click on the graph for additional options. I could not close this right click message because the application wanted me to load the calibration file first. As soon as I selected the calibration file and then clicked OK to close the message about additional graph options, I was presented with this crash message.


REW V5.40 Beta 124 running Eclipse Adoptium JRE 11.0.30 64-bit on Windows 11 Language en, country US, keyboard US, windows-1252 Screen 1707 x 1067 at 144 DPI Running in C:\Program Files\REW


Message:
java.lang.NullPointerException
Stack Trace:
java.desktop/javax.swing.ToolTipManager$insideTimerAction.actionPerformed(ToolTipManager.java:688)
java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
java.base/java.security.AccessController.doPrivileged(Native Method)
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
 
Last edited by a moderator:
Whatever happened there was inside the Java runtime rather than in REW. There might be more info in the diagnostic file you can generate from the help menu, if you attach that file or email it to the feedback address I'll take a look at it.
 
To set the target shape. The function of the EQ is to generate filters that bring the measurement to the target.
Yes this i think too.

see example. I use huge values to see good in EQ curve. I use 1000 and 3.5 db for the HF Fall and this is add in the EQ curve correct. but LF cutoff LF Slope and LF rise start /end /slope is not add to the EQ settings
room curve 1.jpg

room curve 2.jpg
 
I don't understand why you think the target shape should be in the filters. The filters that have been generated produce a result that matches the target, as you can see from the predicted response. A different target would give different filters. The filters are not the target, they are what makes the measurement follow the target when they are applied to the system.
 
Running into a null pointer exception with the latest one.
REW V5.40 Beta 124 running Eclipse Adoptium JRE 11.0.29 64-bit on OS X 26.3.1 Language en, country US, keyboard US, UTF-8 Screen 1470 x 956 at 128 DPI Running in /Applications/REW


Message:
java.lang.NullPointerException
Stack Trace:
roomeqwizard.MeasData.activeFilters(y:1605)
roomeqwizard.MeasData.filterMeasurement(y:285)
roomeqwizard.MeasData.applyFiltersImmediate(y:1022)
roomeqwizard.graphgroup.t.A(y:1098)
roomeqwizard.graphgroup.b.A(y:662)
roomeqwizard.graphgroup.b.B(y:3380)
roomeqwizard.graphgroup.b.valueChanged(y:2590)
ca.odell.glazedlists.swing.DefaultEventSelectionModel.fireSelectionChanged(Unknown Source)
ca.odell.glazedlists.swing.DefaultEventSelectionModel$SwingSelectionListener.selectionChanged(Unknown Source)
ca.odell.glazedlists.ListSelection.fireSelectionChanged(Unknown Source)
ca.odell.glazedlists.ListSelection.setSubRangeOfRange(Unknown Source)
ca.odell.glazedlists.ListSelection.select(Unknown Source)
ca.odell.glazedlists.swing.DefaultEventSelectionModel.addSelectionInterval(Unknown Source)
java.desktop/javax.swing.JTable.addRowSelectionInterval(JTable.java:2200)
roomeqwizard.components.E$_B.done(y:9416)
java.desktop/javax.swing.SwingWorker$5.run(SwingWorker.java:750)
java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:847)
java.desktop/sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:857)
java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
java.base/java.security.AccessController.doPrivileged(Native Method)
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
 
Whatever happened there was inside the Java runtime rather than in REW. There might be more info in the diagnostic file you can generate from the help menu, if you attach that file or email it to the feedback address I'll take a look at it.
Please see the requested diagnostic file; as requested.
 

Attachments

A different target would give different filters.

This work only when the HF Fall start or HF Fall slope is change. when LF cutoff or LF slope parameters change, the filters stay the same
if still not clear, i do then a new thread and show a video when i change HF fall and it change filters. but when i change LF cutoff or LF slope LF rise start LF rise end, it do not change filters.

maybe to explain better, i should use a 100% linear loopback measure, so the filters that are create should be set as the target curve ?
 
when LF cutoff or LF slope parameters change, the filters stay the same
That depends on the measurement. The target can be any shape, for example you could load a house curve file with whatever target shape you like. The option to use a filter to define part of the target is a convenience to give a particular shape. For best results the target should be reflective of the measurement, so if a speaker has a 50 Hz rolloff it would not make sense to have a target that's flat to 10 Hz as the speaker couldn't achieve that and REW does not generate filters below the first frequency where the measurement crosses the target. I'll not comment further on this topic as you seem to be missing the point however many times I try to explain it.
 
here you can see in the test 3only HF fall start and HF fall slope is correct add to filters. I do the test with flatness target 3, so there are 7 eq stages free. with 1 also not work. but a test of a loopback measure which is linear work
 

Attachments

That depends on the measurement. The target can be any shape, for example you could load a house curve file with whatever target shape you like. The option to use a filter to define part of the target is a convenience to give a particular shape. For best results the target should be reflective of the measurement, so if a speaker has a 50 Hz rolloff it would not make sense to have a target that's flat to 10 Hz as the speaker couldn't achieve that and REW does not generate filters below the first frequency where the measurement crosses the target. I'll not comment further on this topic as you seem to be missing the point however many times I try to explain it.

please look on this 2 pictures. the right side is ok, it do the target curve boost at 60 hz. on the left side it is not, it do not boost, but at other frequencies it is more precise. or maybe need more as 32 filters ? . is that easy possible ?
On left side i use LF cutoff 50 hz, on right side i use LF cutoff 56 hz .

compare.jpg

EDIT: You write
so if a speaker has a 50 Hz rolloff it would not make sense to have a target that's flat to 10 Hz as the speaker couldn't achieve that and REW does not generate filters below the first frequency where the measurement crosses the target.
in this ARC X screenshot can see (happen with all speakers corrections) do lower the rolloff depend on room curve. here you can see arc X and JBL 104 screenshot. all speaker corrections i know allow 12 db boost. and this is the rolloff then get for JBL 104. So why it is not possible with automatic EQ that REW can do this too, without much work ?. Please Please answer

bassboost (2).jpg
 
Last edited:
So why it is not possible with automatic EQ that REW can do this too, without much work ?
REW will not apply parametric filters below the frequency the response first crosses above the target or above the frequency it last drops below the target. That is to avoid the risk of pushing drivers beyond their safe limits. The shelf filter options allow shelf filters to be applied at low and/or high frequencies within the gain limits you set. You may apply any additional filters you feel are appropriate mnually.
 
REW will not apply parametric filters below the frequency the response first crosses above the target or above the frequency it last drops below the target. That is to avoid the risk of pushing drivers beyond their safe limits. The shelf filter options allow shelf filters to be applied at low and/or high frequencies within the gain limits you set. You may apply any additional filters you feel are appropriate mnually.

ok, it is your program and you can add what you like but because REW allow upto 12 db gain enhancement, it can also use this gain to reach more low frequency or more mid, same as other speaker correction . boost low frequency also give better transients and timeshift. google can calc this

it is a 70 hz sine 40 hz HP 24 db and for the peak filters is +11 db Q 4 Q 0.7
Filter-Typ 1. half wave (level) 2. half wave (level) time shift (Peak 1)
No EQ 35,3 % 110,6 % -2,40 ms
40 hz Peak EQ (Q=4,0) 51,7 % 155,7 % -2,15 ms
40 hz Peak EQ (Q=0,7) 55,4 % 114,8 % -1,85 ms

I also ask google wy i think small speakers boost with Eq sound better as large speakers google answer, because of transient enhance of EQ and that the inductivity of a larger speaker is higher as a small speaker and so large speaker is slower in transients as small speakers. google think my 6,5 inch focal alpha 65 have 2 mhenry and the JBL 104 have 0.13 mhenry induction. so boost low freq is usefull.
google also output code in python to calc the transients.
Python:
python


import numpy as np

from scipy import signal


# --- CONFIGURATION ---

fs = 48000           # Sampling rate

f_sig = 70           # Test frequency (Hz)

f_hp = 40            # High-pass frequency (Speaker simulation)

f_eq = 40            # EQ center frequency

gain_db = 11         # EQ boost

q_factor_high = 4.0  # High Q (Narrow)

q_factor_low = 0.7   # Low Q (Wide)


# Generate Signal (Sine Burst)

t_end = 0.1

t = np.arange(0, t_end, 1/fs)

input_signal = np.sin(2 * np.pi * f_sig * t)


# Reference time for the first peak of a pure sine wave at f_sig

# 1/4 of a period = 90 degrees

t_ref_peak1 = 1000 / (4 * f_sig)


def get_peaking_params(f0, gain_db, Q, fs):

    """Calculates Peaking EQ coefficients (Biquad)"""

    A = 10**(gain_db / 40)

    w0 = 2 * np.pi * f0 / fs

    alpha = np.sin(w0) / (2 * Q)

    b = [1 + alpha * A, -2 * np.cos(w0), 1 - alpha * A]

    a = [1 + alpha / A, -2 * np.cos(w0), 1 - alpha / A]

    return b, a


def analyze_transients(b, a, input_sig, fs, f_sig, label):

    # Apply filter

    output_sig = signal.lfilter(b, a, input_sig)

   

    # Normalize to steady-state amplitude at f_sig

    _, h = signal.freqz(b, a, worN=[f_sig], fs=fs)

    output_norm = output_sig / np.abs(h)

   

    # Define search window for the first two half-waves

    period_samples = int(fs / f_sig)

    search_limit = int(period_samples * 1.5)

   

    # Find indices of the first positive and first negative peak

    idx_p1 = np.argmax(output_norm[:search_limit])

    idx_p2 = np.argmin(output_norm[:search_limit])

   

    # Calculate values

    val_p1 = output_norm[idx_p1] * 100

    val_p2 = abs(output_norm[idx_p2]) * 100

    time_shift_p1 = (idx_p1 / fs * 1000) - t_ref_peak1

   

    print(f"{label:20} | P1: {val_p1:5.1f}% | P2: {val_p2:5.1f}% | Shift P1: {time_shift_p1:+5.2f} ms")


# 1. No EQ (HP only - 24dB/Oct / 4th Order)

b_hp, a_hp = signal.butter(4, f_hp, btype='high', fs=fs)


# 2. EQ High Q (Q=4.0)

b_q4, a_q4 = get_peaking_params(f_eq, gain_db, q_factor_high, fs)

b_tot_q4 = np.convolve(b_hp, b_q4)

a_tot_q4 = np.convolve(a_hp, a_q4)


# 3. EQ Low Q (Q=0.7)

b_q07, a_q07 = get_peaking_params(f_eq, gain_db, q_factor_low, fs)

b_tot_q07 = np.convolve(b_hp, b_q07)

a_tot_q07 = np.convolve(a_hp, a_q07)


# --- EXECUTION & OUTPUT ---

print(f"Analysis for {f_sig}Hz Signal (HP {f_hp}Hz 24dB/Oct):")

print("-" * 75)

analyze_transients(b_hp, a_hp, input_signal, fs, f_sig, "No EQ")

analyze_transients(b_tot_q4, a_tot_q4, input_signal, fs, f_sig, "Peak EQ (Q=4.0)")

analyze_transients(b_tot_q07, a_tot_q07, input_signal, fs, f_sig, "Peak EQ (Q=0.7)")

print("-" * 75)
if the code work or not i not test it currently. i post it maybe you find it usefull. maybe google can convert in java
 
Back
Top