John Mulcahy
REW Author
Thread Starter
- Joined
- Apr 3, 2017
- Posts
- 9,326
When you did the dB average you probably left the RMS average selected so it got included in the average.it seem the db average is not correct.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
When you did the dB average you probably left the RMS average selected so it got included in the average.it seem the db average is not correct.
When you did the dB average you probably left the RMS average selected so it got included in the average.
I have no idea what you are talking about.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 .
I have no idea what you are talking about.
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.
Yes this i think too.To set the target shape. The function of the EQ is to generate filters that bring the measurement to the target.
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)
Please see the requested diagnostic file; as requested.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.
A different target would give different filters.
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.when LF cutoff or LF slope parameters change, the filters stay the same
Can you attach the mdat file which produced that? What equaliser were you using? Any other info on what led up to the error?Running into a null pointer exception with the latest one.
Thanks. The error is happening in the Java runtime, so not clear why that might be but it is outside REW's control.Please see the requested diagnostic file; as requested.
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.
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 answerso 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.
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.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.
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)




