Audio EQ Kochbuch ohne Frequenzverzerrung


7

Das berühmte http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt bietet eine Reihe von [echten] Biquad-Filter-Berechnungsformeln, die im Allgemeinen gut funktionieren.

Wenn sich die Frequenz des Filters jedoch der Nyquist-Frequenz nähert, wird die Q-Spezifikation (Bandbreitenspezifikation) eines Filters stark verzerrt - normalerweise schrumpft sie stark (obwohl der Autor erwähnte, dass er eine notwendige Vorverzerrung durchgeführt hat).

Ich bin auf der Suche nach Filterformeln, die keine so starke Bandbreitenverzerrung aufweisen. Ich benötige Peaking / Bell-, Bandpass-, Tiefpass-, Hochpass-, High-Shelf- und Notch-Filter. Ich weiß, dass dies möglich ist, da ich zuvor eine Peaking- / Bell- / Bandpass-Filterformel mit weniger Verzerrung gekauft habe, aber sie sind immer noch nicht perfekt und ich benötige andere Filtertypen.

Ich bin also auch bereit, für die Lösung zu bezahlen, wenn der Preis stimmt.

Wenn man mich alternativ auf einen Optimierungsalgorithmus verweisen könnte, der mit Z-Domain-Filtern funktioniert, wäre das auch großartig. Leider funktionieren die meisten üblichen Optimierungsalgorithmen im Z-Bereich nicht gut - sie können einen Parametersatz nicht optimieren, um ihn an einen gewünschten Frequenzgang anzupassen (wahrscheinlich aufgrund periodischer Funktionen, die zur Berechnung des Frequenzgangs verwendet werden).


1
Um die Aliasing- und Warping-Artefakte für diskrete Filter effektiv zu kompensieren, müssen Sie sehr hohe Ordnungen verwenden. FIR würde das Design zwar viel einfacher machen, aber es gibt auch andere Methoden. Um Ihnen eine aussagekräftige Antwort zu geben, möchte ich wissen, wie genau Ihre Recheneinschränkungen (einschließlich der Plattform) sind und welche Verarbeitungsanforderungen Sie haben. Warum brauchen Sie dieses Verhalten und würde ein Oversampling nicht ausreichen?
Jazzmaniac

2
Nun, es gibt eine Grenze für das, was Sie mit einem IIR-Filter 2. Ordnung erhalten können. Es gibt ein anderes Papier von Orfanidis, das die Verstärkung bei Nyquist auf etwas anderes als 0 dB setzt (das Kochbuch setzt die Nyquist-Verstärkung auf 0 dB, weil die bilineare Transformation sie so abbildet). Ich glaube nicht, dass Sie bei einer Abtastrate von 44,1 kHz und einem Biquad 2. Ordnung viel besser abschneiden als das Orfanidis-Design.
Robert Bristow-Johnson

1
Die beste mir bekannte Methode ist nicht die direkte Zuordnung zur diskreten Domäne, sondern die Anwendung von ODE-Lösern auf den analogen Prototyp. Speziell implizite Löser leisten hervorragende Arbeit bei der Aufrechterhaltung des Frequenzgangs.
Jazzmaniac

1
@Jazzmaniac: Warum einen analogen Prototyp verwenden, anstatt direkt im zeitdiskreten Bereich zu entwerfen?
Matt L.

1
@aleksv: Sie könnten ein konkretes Designproblem mit allen Spezifikationen posten und sehen, was wir uns einfallen lassen.
Matt L.

Antworten:


5

Hier ist ein kurzer Blick darauf, wie die 5 Freiheitsgrade für den parametrischen EQ angezeigt werden können. Ich nehme an, was Knud Christensen von tc electronic vor etwa einem Jahrzehnt auf einer AES-Tagung und diesem Patent erfunden hat .

Vergessen Sie also das Kochbuch (und die darin enthaltenen Probleme mit Q und Bandbreite) und betrachten Sie (in der S-Ebene) den parametrischen EQ als die Summe eines Bandpassfilters (mit einem Wert) parallel zu einem Draht:Q.

H.(s)=(GBoost- -1)1Q.sω0(sω0)2+1Q.sω0+1+1

GBoost=10dB.20 ist die Verstärkung des Peaks (oder Tals, wenn ). Die Verstärkung bei DC und Nyquist beträgt 0 dB. Das ist ein IIR 2. Ordnung und es gibt 3 unabhängige Parameter. Noch 2. Als nächstes fügen wir einen Gesamtverstärkungsparameter hinzu:dB.<0

H.(s)=G0((GBoost- -1)1Q.sω0(sω0)2+1Q.sω0+1+1)

Das sind 4 Knöpfe zum Drehen. Ein weiterer Knopf zum Hinzufügen (ohne die Filterreihenfolge zu erhöhen) und wir werden mit dem Hinzufügen weiterer unabhängiger Parameter fertig sein.

Was also Knud hat hier, dass „Draht“ ersetzen (das „nachlauf “ in der Übertragungsfunktion) mit einem Prototyp - Shelving - Filter, müssen die gleichen Pole haben, die gleiche und als BPF, so dass der Nenner die ist gleich. Die Übertragungsfunktion dieses Regals ist:1Q.ω0

H.Regal(s)=R.(sω0)2+R.Q.sω0+1(sω0)2+1Q.sω0+1

Dabei ist und die Verstärkungsdifferenz des Regals in dB. Dies ist es, was die Verstärkung bei Nyquist so ausgleicht, dass sie sich von der Verstärkung bei DC unterscheidet. Nach der bilinearen Transformation wird Nyquist durch dB verstärkt und die Verstärkung bei DC bleibt unverändert. Wie der Boost-Parameter kann der Parameter entweder positiv oder negativ sein. ist die lineare Verstärkung bei Nyquist.R.10tichlt20tichlttichltdB.tichltG0R.

Füge das alles zusammen und du bekommst:

H.(s)=G0((GBoost- -1)1Q.sω0(sω0)2+1Q.sω0+1+H.Regal(s))=G0((GBoost- -1)1Q.sω0(sω0)2+1Q.sω0+1+R.(sω0)2+R.Q.sω0+1(sω0)2+1Q.sω0+1)=G0R.(sω0)2+(GBoost+R.- -1)1Q.sω0+1(sω0)2+1Q.sω0+1

Egal wie Sie das betrachten, dies hat 5 Freiheitsgrade und diese 5 Biquad-Koeffizienten werden vollständig aus diesen 5 Parametern definiert. Es spielt keine Rolle, ob Sie mit der blinearen Transformation oder der Trapezregel (praktisch dasselbe) oder einer anderen Methode, die die Reihenfolge des Filters nicht ändert, von nach abbilden . Möglicherweise müssen Sie die Definition von oder Bandbreite verfälschen. Möglicherweise müssen Sie und / oder kompensierenszQ.ω0Q.für Frequenzverzerrungseffekte (wie Sie sie mit der blinearen Transformation erhalten), aber wenn Sie viel Geld für etwas bezahlt haben, das Ihnen einen IIR-Filter 2. Ordnung bringt, spielt es keine Rolle, ob Sie ihn mit einem direkten Formular oder einem transponierten direkten Formular oder implementieren Lattice oder Normalized Ladder oder Hal Chamberlins Zustandsvariable oder Andrew Simpsons Modellierung des linearen Analogons mit trapezförmiger Integration erhalten schließlich 5 Koeffizienten, die auf diese 5 unabhängigen Parameter abgebildet werden können. Es ist alles das Gleiche. ob Sie Geld für eine Lizenz bezahlt haben oder nicht. Die Mathematik ist stärker als alle Behauptungen von wem auch immer Sie lizenzieren.

Gerade FYI, ich gelöst , wo die wahre Spitze oder ein Tal Frequenz ist , wenn es ist eine , die nicht Null ist. Die Frequenz, bei der der Gipfel oder das Tal durch die Neigung angestoßen wurde, beträgt:tichlt

ωGipfel = ω0 Q.2(R.- -1R.)GBoost2- -R.+2Q.2(R.- -1)+GBoost2- -1R.+2Q.2(1R.- -1)GBoost2- -R.+2Q.2(R.- -1)+Q.4(R.- -1R.)2(GBoost2- -R.+2Q.2(R.- -1))2

Sie können sehen, dass wenn , dann und folglich . Die Spitzenverstärkung möglicherweise ebenfalls ein wenig angepasst werden, und das muss noch ausgearbeitet werden. Eine gute erste Vermutung wäre oder vielleicht .tichlt=0R.=1ωGipfel=ω0GBoostGBoostGBoostR.GBoostGBoost- -(R.- -1)


Ich kann nicht ganz verstehen, was Sie zu beweisen versuchen? IIR-Filter 2. Ordnung haben per Definition 5 Freiheitsgrade. Wie hilft Ihre Zuordnung von Parametern zu Biquad-Koeffizienten bei der Beantwortung der ursprünglichen Frage?
Aleksv

Sobald klar wurde, dass "es sich natürlich um einen IIR-Filter 2. Ordnung handelt" , so dass eine Erhöhung der Filterreihenfolge "um die Aliasing- und Warping-Artefakte für diskrete Filter [mit] sehr hohen Ordnungen effektiv zu kompensieren" nicht der Fall ist In den Karten heißt es also, so gut ich aus dem, was Sie gesagt haben, dass Sie Geld bezahlt haben, um IP von jemandem zu lizenzieren, um diese 5 Koeffizienten zu definieren. und alles was ich versuche zu sagen ist, dass dies ein vollständig gelöstes Problem ist. ob du dafür bezahlt hast oder nicht.
Robert Bristow-Johnson

Der Kalkulationsfilter-Berechnungscode, den ich habe, verwendet auch 5 Parameter: Verstärkung bei Gleichstrom, Frequenz und Verstärkung am linken Rand, Spitzenfrequenz und Verstärkung. Ich denke, es ist wichtig, die Kantenfrequenz anzugeben, um eine stabile Bandbreite aufrechtzuerhalten.
Aleksv

Es mag ein gelöstes Problem sein, aber wo kann ich eine Lösung finden? Sei es bezahlt oder nicht?
Aleksv

Okay, jetzt schauen Sie sich das Orfanidis-Papier an , aber verwenden Sie die obigen mathematischen Symbole. Dies ist so gut wie möglich, da Sie nur diese 5 Knöpfe zum Drehen haben. Sie müssen herausfinden, was und sind. ist die DC-Verstärkung (vielleicht möchten Sie, dass diese 0 dB beträgt, oder , ich weiß nicht). ist die Verstärkung bei , aber bei Verwendung der bilinearen Transformation ist dies die Verstärkung bei Nyquist. Sie müssen also herausfinden, wie hoch der Gewinn bei Nyquist sein soll. Sophokles hat einen Vorschlag. Keine Ahnung, ob ich damit einverstanden bin. G0EING0EING0EIN=1EIN G0ω=
Robert Bristow-Johnson

2

@Jazz, eines der Dinge, die wir in der Elektrotechnik gelernt haben, ist, dass jede Ordnung von Differentialgleichungen in eine Menge (oder ein "System") von Differentialgleichungen 1. Ordnung zerlegt werden kann. also , wenn Trapezintegration, mit dem gleichen „Zeitschritt“ verwendet wird konsequent Integrale für alle kontinuierliche Zeit für eine - ter Ordnung linearen ODE, können Sie , dass bis in der Büste erster Ordnung Differentialgleichungen. Betrachten Sie dann nur eine dieser Diff-Gleichungen 1. Ordnung:ΔtN.N.

Erwägen Sie erneut, einen Kondensator zu emulieren. Die Abtastperiode sei und die in der Trapezregel verwendete " ".T.=1fsΔt

ich(t)=C.dvdt

oder

v(t)=1C.- -tich(u) du

in der s-domain ist es

V.(s)=1s(1C.ich(s))

Trapazoidale Integration zu diskreten Zeiten ist also:

v(nT.)=1C.- -nT.ich(u) du=1C.k=- -nkT.- -T.kT.ich(u) du1C.k=- -nT.2(ich(kT.- -T.)+ich(kT.))=v((n- -1)T.)+1C.T.2(ich((n- -1)T.)+ich(nT.))

oder als zeitdiskrete Abtastwerte

v[n]]=v[n- -1]]+T.2C.(ich[n]]+ich[n- -1]])

Anwenden der Z-Transformation

V.(z)=z- -1V.(z) + T.2C.(ich(z)+z- -1ich(z))

Auflösen nachV.

V.(z)=T.21+z- -11- -z- -1(1C.ich(z))

sieht aus wie wir ersetzen

1sT.21+z- -11- -z- -1

oder

s2T.z- -1z+1

Genau das macht das Bilineare ohne Kompensation von Frequenzverzerrungen.


Dies wird gewöhnlich als "Beweis durch Beispiel" bezeichnet und ist kaum allgemein. Es wird auch nur der Fall behandelt, von dem ich bereits sagte, dass er in den obigen Kommentaren trivial war. Ich spreche wieder von impliziten Lösern höherer Ordnung, die keine einfache diskrete Rekursion ergeben. Es ist auch kaum der richtige Ort für diese Diskussion, da Ihre Antwort nichts mit der ursprünglichen Frage zu tun hat. Wenn Sie dies zu einer neuen Frage bezüglich der ODE-Integration verschieben, bin ich bereit, dazu beizutragen.
Jazzmaniac

1
Nein, es ist völlig allgemein für lineare Diff-Gleichungen. Sie ignorieren die Eröffnungserklärung, die wir vor langer Zeit im Elektrotechnikunterricht gelernt haben. (Sowohl in numerischen Methoden als auch in der Steuerungstheorie kann eine Differentialgleichung ter Ordnung in Differentialgleichungen erster Ordnung zerlegt werden . Dann benötige ich Konsistenz; dass durchgehend dieselbe Trapezregel für die Integration verwendet wird.)N.N.
Robert Bristow -Johnson

Ich bin mir der Umwandlung von ODEs höherer Ordnung in Systeme von ODEs erster Ordnung voll bewusst. Und wieder ist es nicht das, worüber ich spreche. Diese Aussage macht Ihren Beweis nicht allgemeiner, da Sie nur behaupten, dass die bilineare Abbildung auf die gesamte Klasse übergeht, während Sie nur ein einfaches Beispiel behandeln. Trotzdem sage ich nicht, dass Ihr Ergebnis falsch ist, ich spreche über verschiedene Löser. Löser höherer Ordnung sind keine Löser von DEs höherer Ordnung.
Jazzmaniac

Entschuldigung, Andrew. Das ist ein Fehlschlag . Sie verstehen es wirklich nicht , wenn Sie weiterhin behaupten, das zeitkontinuierliche Verhalten der linearen analogen Komponenten mithilfe der Trapezintegration zu modellieren , wobei die Schrittzeit der Abtastperiode , dann ist die sehr gleiche Sache , wie unter Verwendung von bilinearen für Frequenzverzerrung ohne Kompensation zu transformieren. das Gleiche und der Beweis ist oben. ΔtT.=1fs
Robert Bristow-Johnson

Entschuldigung Robert, ich bin nicht Andrew. Und Ihr Beweis oben ist wie folgt. Ich habe zwei Karten A und B und einige x. Sowohl A (x) = c als auch B (x) = c, also A = B. Das ist offensichtlich falsch. Auch wenn A und B linear sind, ist es immer noch falsch. Sie haben Recht, dass ein Trapezlöser erster Ordnung in einem linearen System ein rekursives diskretes System erzeugt, aber dort endet es. Sie ignorieren immer wieder meine wiederholten Aussagen über (adaptive / implizite) Integratoren höherer Ordnung. Ich sehe das Scheitern sehr auf Ihrer Seite.
Jazzmaniac

2

Mithilfe von Optimierungsmethoden können wir den Frequenzgang eines Digitalfilters näher an den analogen Zielfilter bringen.

Im folgenden Experiment wird ein Bandpassfilter 6 Ordnung mit Adam optimiert, einem Optimierungsalgorithmus, der häufig beim maschinellen Lernen verwendet wird. Frequenzen über dem Durchlassbereich sind von der Kostenfunktion ausgeschlossen (zugewiesenes Nullgewicht). Die Antwort des optimierten Filters wird für Frequenzen sehr nahe an Nyquist höher als das Ziel, aber diese Differenz kann durch das Anti-Aliasing-Filter der Signalquelle (ADC oder Abtastratenwandler) ausgeglichen werden. Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as clr
from scipy import signal

import tensorflow as tf

# Number of sections
M = 3

# Sample rate
f_s = 24000

# Passband center frequency
f0 = 9000

# Number of frequencies to compute
N = 2048

section_colors = np.zeros([M, 3])
for k in range(M):
    section_colors[k] = clr.hsv_to_rgb([(k / (M - 1.0)) / 3.0, 0.5, 0.75])

# Get one of BP poles that maps to LP prototype pole.
def lp_to_bp(s, rbw, w0):
    return w0 * (s * rbw / 2 + 1j * np.sqrt(1.0 - np.power(s * rbw / 2, 2)))

# Frequency response

def freq_response(z, b, a):
    p = b[0]
    q = a[0]
    for k in range(1, len(b)):
        p += b[k] * np.power(z, -k)
    for k in range(1, len(a)):
        q += a[k] * np.power(z, -k)
    return p / q

# Absolute value in decibel

def abs_db(h):
    return 20 * np.log10(np.abs(h))

# Poles of analog low-pass prototype

none, S, none = signal.buttap(M)

# Band limits
c = np.power(2, 1 / 12.0)
f_l = f0 / c
f_u = f0 * c

# Analog frequencies in radians
w0 = 2 * np.pi * f0
w_l = 2 * np.pi * f_l
w_u = 2 * np.pi * f_u

# Relative bandwidth
rbw = (w_u - w_l) / w0

jw0 = 2j * np.pi * f0
z0 = np.exp(jw0 / f_s)

# 1. Analog filter parameters

bc, ac = signal.butter(M, [w_l, w_u], btype='bandpass', analog=True)
ww, H_a = signal.freqs(bc, ac, worN=N)
magnH_a = np.abs(H_a)
f = ww / (2 * np.pi)

omega_d = ww / f_s
z = np.exp(1j * ww / f_s)

# 2. Initial filter design

a = np.zeros([M, 3], dtype=np.double)
b = np.zeros([M, 3], dtype=np.double)
hd = np.zeros([M, N], dtype=np.complex)

# Pre-warp the frequencies

w_l_pw = 2 * f_s * np.tan(np.pi * f_l / f_s)
w_u_pw = 2 * f_s * np.tan(np.pi * f_u / f_s)
w_0_pw = np.sqrt(w_l_pw * w_u_pw)

rbw_pw = (w_u_pw - w_l_pw) / w_0_pw

poles_pw = lp_to_bp(S, rbw_pw, w_0_pw)

# Bilinear transform

T = 1.0 / f_s
poles_d = (1.0 + poles_pw * T / 2) / (1.0 - poles_pw * T / 2)

for k in range(M):
    p = poles_d[k]
    b[k], a[k] = signal.zpk2tf([-1, 1], [p, np.conj(p)], 1)

    g0 = freq_response(z0, b[k], a[k])
    g0 = np.abs(g0)
    b[k] /= g0
    none, hd[k] = signal.freqz(b[k], a[k], worN=omega_d)

plt.figure(2)
plt.title("Initial digital filter (bilinear)")

plt.axis([0, f_s / 2, -90, 10])

plt.plot(f, abs_db(H_a), label='Target response', color='gray', linewidth=0.5)

for k in range(M):
    label = "Section %d" % k
    plt.plot(f, abs_db(hd[k]), color=section_colors[k], alpha=0.5, label=label)

# Combined frequency response of initial digital filter

Hd = np.prod(hd, axis=0)
plt.plot(f, abs_db(Hd), 'k', label='Cascaded filter')
plt.legend(loc='upper left')

plt.figure(3)
plt.title("Initial filter - poles and zeros")
plt.axis([-3, 3, -2.25, 2.25])
unitcircle = plt.Circle((0, 0), 1, color='lightgray', fill=False)
ax = plt.gca()
ax.add_artist(unitcircle)

for k in range(M):
    zeros, poles, gain = signal.tf2zpk(b[k], a[k])
    plt.plot(np.real(poles), np.imag(poles), 'x', color=section_colors[k])
    plt.plot(np.real(zeros), np.imag(zeros), 'o', color='none', markeredgecolor=section_colors[k], alpha=0.5)

# Optimizing filter

tH_a = tf.constant(magnH_a, dtype=tf.float32)

# Assign weights

weight = np.zeros(N)
for i in range(N):
    # In the passband or below?
    if (f[i] <= f_u):
        weight[i] = 1.0

tWeight = tf.constant(weight, dtype=tf.float32)
tZ = tf.placeholder(tf.complex64, [1, N])

# Variables to be changed by optimizer
ta = tf.Variable(a)
tb = tf.Variable(b)
ai = a
bi = b

# TF requires matching types for multiplication;
# cast real coefficients to complex
cta = tf.cast(ta, tf.complex64)
ctb = tf.cast(tb, tf.complex64)

xb0 = tf.reshape(ctb[:, 0], [M, 1])
xb1 = tf.reshape(ctb[:, 1], [M, 1])
xb2 = tf.reshape(ctb[:, 2], [M, 1])

xa0 = tf.reshape(cta[:, 0], [M, 1])
xa1 = tf.reshape(cta[:, 1], [M, 1])
xa2 = tf.reshape(cta[:, 2], [M, 1])

# Numerator:   B = b₀z² + b₁z + b₂
tB = tf.matmul(xb0, tf.square(tZ)) + tf.matmul(xb1, tZ) + xb2

# Denominator: A = a₀z² + a₁z + a₂
tA = tf.matmul(xa0, tf.square(tZ)) + tf.matmul(xa1, tZ) + xa2

# Get combined frequency response
tH = tf.reduce_prod(tB / tA, axis=0)

iterations = 2000
learning_rate = 0.0005

# Cost function
cost = tf.reduce_mean(tWeight * tf.squared_difference(tf.abs(tH), tH_a))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

zz = np.reshape(z, [1, N])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for epoch in range(iterations):
        loss, j = sess.run([optimizer, cost], feed_dict={tZ: zz})
        if (epoch % 100 == 0):
            print("  Cost: ", j)

    b, a = sess.run([tb, ta])

for k in range(M):
    none, hd[k] = signal.freqz(b[k], a[k], worN=omega_d)

plt.figure(4)
plt.title("Optimized digital filter")

plt.axis([0, f_s / 2, -90, 10])

# Draw the band limits
plt.axvline(f_l, color='black', linewidth=0.5, linestyle='--')
plt.axvline(f_u, color='black', linewidth=0.5, linestyle='--')

plt.plot(f, abs_db(H_a), label='Target response', color='gray', linewidth=0.5)

Hd = np.prod(hd, axis=0)
for k in range(M):
    label = "Section %d" % k
    plt.plot(f, abs_db(hd[k]), color=section_colors[k], alpha=0.5, label=label)

magnH_d = np.abs(Hd)
plt.plot(f, abs_db(Hd), 'k', label='Cascaded filter')
plt.legend(loc='upper left')

plt.figure(5)
plt.title("Optimized digital filter - Poles and Zeros")
plt.axis([-3, 3, -2.25, 2.25])
unitcircle = plt.Circle((0, 0), 1, color='lightgray', fill=False)
ax = plt.gca()
ax.add_artist(unitcircle)

for k in range(M):
    zeros, poles, gain = signal.tf2zpk(b[k], a[k])
    plt.plot(np.real(poles), np.imag(poles), 'x', color=section_colors[k])
    plt.plot(np.real(zeros), np.imag(zeros), 'o', color='none', markeredgecolor=section_colors[k], alpha=0.5)

plt.show()

"Frequenzen über dem Durchlassbereich sind von der Kostenfunktion ausgeschlossen (zugewiesenes Nullgewicht)." Besteht nicht die Gefahr, dass der Filter zu einer Art Hochpassfilter wird? Frequenzen über dem Durchlassbereich könnten einen großen Gewinn haben, ohne dass eine solche Kostenfunktion eine Strafe ergibt.
Olli Niemitalo

OK, ich dachte, eine Symbolregressionsmethode würde eine endgültige Gleichung erzeugen ... wahrscheinlich in den meisten Fällen nicht in allen. während Echtzeit derivatfrei? Die Optimierung ist etwas langsam
aleksv

1
@OlliNiemitalo: Bei einigen Frequenzen fällt sie nach dem Durchlassbereich auf Null, wie beim Anfangsfilter.
Igorinov

1
@aleksv: Es gibt eine andere geschlossene Form Lösung, die hier nicht erwähnt wurde - khabdha.org/wp-content/uploads/2008/03/…
igorinov

1
Mit tensorflow-gpu1.12.0 konvergiert die Optimierung nicht, sondern divergiert. tensorflow1.12.0 funktioniert besser, aber die Optimierung konvergiert aufgrund der Wahl des Optimierers (Adam) und seiner Lernrate und möglicherweise aufgrund der Art und Weise, wie die Kostenfunktion formuliert wird, nicht vollständig. Ich werde diese Antwort mit einem Kopfgeld versehen, da sie einen modernen Ansatz zur Optimierung von Koeffizienten zeigt: die automatische Differenzierung. Ich würde immer noch gerne sehen: stabilere Optimierung und Anordnung der erhaltenen Koeffizienten für die Echtzeitnutzung (z. B. Parameter-Sweeps).
Olli Niemitalo

1

Ich habe mir ein Design für den 10-dB-Peaking-EQ ausgedacht. Ich habe 20 Filter mit Mittenfrequenzen zwischen 500 Hz und 16 kHz (Fs = 48 kHz) ausgewählt. Das obere Diagramm unten zeigt das Design gemäß dem Audio-EQ-Kochbuch von RBJ , das gut ist, aber zu Bandbreitenverzerrungen führt, wenn sich die Mittenfrequenzen Nyquist nähern. Das untere Diagramm ist das neue Design, bei dem die Filter sehr genau mit den analogen Prototypfiltern übereinstimmen: Geben Sie hier die Bildbeschreibung ein

Und so sehen die neuen Notch-Filter im Vergleich zum Kochbuch aus (Bandbreite = 4 Oktaven, höchste kHz): f0=23Geben Sie hier die Bildbeschreibung ein

Die folgende Abbildung zeigt ein Tiefpassfilterdesign ( , kHz, kHz). Beachten Sie, dass das neue Design dem analogen Prototyp nahe kommt und aus diesem Grund nicht als herkömmliches Tiefpassfilter funktioniert (bei Nyquist hat es keine Null):Q.=2f0=16F.s=48

Geben Sie hier die Bildbeschreibung ein


Matt, ich könnte vorschlagen, den "PeakingEQ" für beispielsweise einen 10-dB-Boost mit einem festen zu zeichnen B.W.sagen wir 1 Oktave und für eine Vielzahl von Spitzenfrequenzen bis nahe an Nyquist. obwohl das Kochbuch eine Entschädigung erster Ordnung auf machtB.W. durch Multiplikation mit ω0T.Sünde(ω0T.)Ändern, es kann immer noch nicht die Tatsache , dass der Frequenzgang muss kontinuierlich sein und stetige Ableitungen haben und es muss über Nyquist symmetrisch sein. selbst wenn Sie den Gewinn bei Nyquist erhöhen, ebenso wie Orfanidis. das an und für sich ist die Quelle dieses verzerrten Frequenzgangs.
Robert Bristow-Johnson

1
Ich glaube , er erwarten ein digitales Filter mit einer Samplerate so niedrig wie 44,1 kHz zu sehen, entspricht die analogen Filter, auch wenn die Resonanzfrequenz gerade unterhalb Nyquist ist. Dies ist etwas, worüber ich mir vor zwei Jahrzehnten Sorgen gemacht hatte, und alles, was ich mir vorstellen konnte, war einfach, die durch die bilineare Transformation verursachte Bandbreitensperre zu kompensieren. dann änderte Orfanidis eine Annahme (dass die Verstärkung bei Nyquist 0 dB beträgt), und das half ein wenig mehr. Aber das, was wirklich hilft, ist einfach, die Abtastrate zu erhöhen.
Robert Bristow-Johnson

Danke für einen Versuch. Die erste Kochbuch-Handlung ist das, was ich will, aber wie Robert auch bemerkte, ist der Gewinn bei Nyquist ungleich Null. Es ist auch vorteilhaft, die Antworten auf der logarithmischen Skala im Bereich von beispielsweise 20 Hz bis Nyquist zu zeichnen. Audio-EQs verwenden selten eine lineare Frequenzskala. Die Bandbreite wird normalerweise in Oktaven angegeben. Alle Biquads haben keine Probleme mit der Mitten- / Eckfrequenz bis zu etwa 300 Hz, aber eine höhere Frequenz zeigt das Problem.
Aleksv

Nein, ich meine 0 bis 300 Hz, niedrigere Frequenzen. Oberhalb von 300 Hz bis Nyquist erzeugen diese Kochbuchfilterformeln eine zunehmend zunehmende Verzerrung der Filterform. Natürlich beträgt die Abtastrate wie gewohnt 44100 oder 48000.
Aleksv

Sie müssen das Diagramm auf der Protokollskala zeichnen. Es ist die Bandbreitenverzerrung auf der LOG- Skala, die mich stört. In den unteren Frequenzen ist auf der logarithmischen Skala keine Verzerrung vorhanden. Peaking-, Tiefpass- und High-Shelf-Notch-Filter haben bei Gleichstrom immer eine Verstärkung von 0 dB (Einheit).
Aleksv
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.