Audio EQ Cookbook sem distorção de frequência


7

O famoso http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt oferece um conjunto de fórmulas [reais] de cálculo de filtro de biquad que geralmente funcionam bem.

No entanto, quando a frequência do filtro se aproxima da frequência de Nyquist, a especificação Q (largura de banda) de um filtro fica muito distorcida - geralmente diminui muito (embora o autor tenha mencionado que ele realizou um pré-empenamento necessário).

Estou em busca de fórmulas de filtro que não tenham uma distorção tão forte na largura de banda. Preciso de filtros de pico / sino, passa-banda, passa-baixo, passa-alto, prateleira alta e entalhe. Sei que isso pode ser feito como anteriormente, comprei uma fórmula de filtro de pico / sino / passa-banda com menos distorção, mas elas ainda não são perfeitas e preciso de outros tipos de filtro.

Então, também estou disposto a pagar pela solução, se o preço for justo.

Como alternativa, se alguém pudesse me indicar um algoritmo de otimização que funcione com filtros do domínio Z, também seria ótimo. Infelizmente, os algoritmos de otimização mais comuns não funcionam bem no domínio Z - eles não podem otimizar um conjunto de parâmetros para corresponder à resposta de frequência desejada (provavelmente devido às funções periódicas usadas para calcular a resposta de frequência).


11
Para compensar efetivamente os artefatos de alias e distorção de filtros discretos, é necessário usar pedidos muito altos. A FIR tornaria o design muito mais fácil, mas também existem outros métodos. Para fornecer uma resposta significativa, eu gostaria de saber quais são exatamente suas restrições computacionais (incluindo plataforma) e quais são seus requisitos de processamento. Por que você precisa desse comportamento e a amostragem excessiva não é suficiente?
19414 Jazzmaniac

2
bem, há um limite para o que você pode obter com um filtro IIR de segunda ordem. há outro artigo de Orfanidis que coloca o ganho em Nyquist em algo diferente de 0 dB (o Cookbook coloca o ganho em Nyquist em 0 dB porque é assim que a transformação bilinear mapeia). para uma taxa de amostragem de 44,1 kHz e biquad de segunda ordem, não acho que você se sairá muito melhor do que o design da Orfanidis.
Robert Bristow-johnson

11
O melhor método que eu conheço não é o mapeamento direto para o domínio discreto, mas a aplicação de solucionadores ODE no protótipo analógico. Os solucionadores especificamente implícitos fazem um ótimo trabalho na preservação da resposta de frequência.
quer

11
@Jazzmaniac: Por que usar um protótipo analógico em vez de projetar diretamente no domínio do tempo discreto?
Matt L.

11
@aleksv: Você pode postar um problema de projeto concreto com todas as especificações e ver o que criamos.
Matt L.

Respostas:


5

Aqui está uma rápida olhada em como os 5 graus de liberdade para o EQ paramétrico podem ser vistos. é minha opinião sobre o que Knud Christensen da tc electronic inventou cerca de uma década atrás em uma convenção da AES e nesta patente .

portanto, esqueça o Cookbook (e os problemas de Q e largura de banda) e considere (no plano s) o EQ paramétrico como a soma de um filtro passa-banda (com um valor ) em paralelo com um fio:Q

H(s)=(Gboost1)1Qsω0(sω0)2+1Qsω0+1+1

Gboost=10dB20 é o ganho do pico (ou vale, se ). o ganho em DC e em Nyquist é 0 dB. esse é um IIR de segunda ordem e existem 3 parâmetros independentes. Mais 2 para ir. então adicionamos um parâmetro de ganho geral:dB<0

H(s)=G0((Gboost1)1Qsω0(sω0)2+1Qsω0+1+1)

são 4 botões para girar. mais um botão para adicionar (sem aumentar a ordem dos filtros) e concluiremos a adição de mais parâmetros independentes.

então, o que Knud faz aqui é substituir esse "fio" (aquele que segue " " na função de transferência) por um protótipo de filtro de prateleira que deve ter os mesmos pólos, os mesmos e que o BPF, para que o denominador seja o mesmo. a função de transferência dessa prateleira é:1Qω0 0

Hestante(s)=R(sω0 0)2+RQsω0 0+1 1(sω0 0)2+1 1Qsω0 0+1 1

onde e é o diferencial de ganho da prateleira em dB. é isso que compensa o ganho em Nyquist para ser diferente do ganho em DC. Após a transformação bilinear, Nyquist é impulsionado pela dB e o ganho no DC permanece inalterado. Como o parâmetro boost, o parâmetro pode ser positivo ou negativo. é o ganho linear em Nyquist.R10tEueut20tEueuttEueutdBtEueutG0 0R

junte tudo isso e você obtém:

H(s)=G0 0((Gimpulso-1 1)1 1Qsω0 0(sω0 0)2+1 1Qsω0 0+1 1+Hestante(s))=G0 0((Gimpulso-1 1)1 1Qsω0 0(sω0 0)2+1 1Qsω0 0+1 1+R(sω0 0)2+RQsω0 0+1 1(sω0 0)2+1 1Qsω0 0+1 1)=G0 0R(sω0 0)2+(Gimpulso+R-1 1)1 1Qsω0 0+1 1(sω0 0)2+1 1Qsω0 0+1 1

não importa como você veja isso, isso tem 5 graus de liberdade e esses 5 coeficientes de biquad são totalmente definidos a partir desses 5 parâmetros. não importa se você mapeia de para usando a transformação blinear ou a regra trapezoidal (efetivamente a mesma coisa) ou qualquer outro método que não altere a ordem do filtro. pode ser necessário alterar a definição de ou largura de banda, compensar e / ouszQω0 0Qpara efeitos de distorção de frequência (como você obtém com a transformação blinear), mas se você pagou muito dinheiro por algo que recebe um filtro IIR de segunda ordem, não importa se você o implementa com qualquer Formulário direto ou Formulário direto transposto ou No modelo Lattice ou Normalized Ladder ou na variável de estado de Hal Chamberlin ou Andrew Simpson, de analógico linear com integração trapezoidal, você obtém 5 coeficientes e eles podem ser mapeados para esses 5 parâmetros independentes. é tudo a mesma coisa. se você pagou ou não por uma licença ou não. a matemática é mais forte do que qualquer reivindicação feita por quem você está licenciando.

Apenas FYI, eu resolvido onde o verdadeiro pico ou vale frequência é quando não é uma que não é zero. a frequência em que o pico ou vale foi empurrado pela inclinação é:tEueut

ωpico = ω0 0 Q2(R-1 1R)Gimpulso2-R+2Q2(R-1 1)+Gimpulso2-1 1R+2Q2(1 1R-1 1)Gimpulso2-R+2Q2(R-1 1)+Q4(R-1 1R)2(Gimpulso2-R+2Q2(R-1 1))2

você pode ver que, quando , então e, consequentemente, . o ganho de pico também pode precisar ser ajustado um pouco e isso ainda precisa ser resolvido. um bom palpite seria ou talvez .tEueut=0 0R=1 1ωpico=ω0 0GimpulsoGimpulsoGimpulsoRGimpulsoGimpulso-(R-1 1)


Não consigo entender direito o que você está tentando provar? O filtro IIR de 2ª ordem possui 5 graus de liberdade por definição. Como o mapeamento de parâmetros para os coeficientes de biquad ajuda a responder à pergunta original?
aleksv

então, quando ficou claro que "é claro que estou falando do filtro IIR de segunda ordem" , de modo que aumentar a ordem do filtro "para compensar efetivamente os artefatos de alias e distorção de filtros discretos [usando] pedidos muito altos" não é necessário. nos cartões, então, o melhor que posso dizer pelo que você disse, é que você pagou dinheiro para licenciar IP de alguém para definir esses 5 coeficientes. e tudo o que estou tentando dizer é que esse é um problema totalmente resolvido. se você pagou por isso ou não.
Robert Bristow-johnson

O código de cálculo do filtro de pico I também usa 5 parâmetros: ganho em CC, freqüência e ganho da borda esquerda, freqüência e ganho de pico. Eu acho que é importante especificar o edge freq para manter uma largura de banda estável.
aleksv

Pode ser um problema resolvido, mas onde posso encontrar uma solução? Seja pago ou não?
aleksv

ok, agora dê uma olhada no artigo de Orfanidis , mas use os símbolos matemáticos acima. isso é o melhor que você pode fazer, porque você só tem esses 5 botões para girar. você precisa descobrir o que e são. é o ganho DC (talvez você queira que seja 0 dB ou , não sei). é o ganho em , mas, usando a transformação bilinear, esse é o ganho em Nyquist. então você precisa descobrir o que deseja que seja o ganho no Nyquist. Sófocles tem uma sugestão. não sei se eu concordo com isso. G0 0UMAG0 0UMAG0 0UMA=1 1UMA G0 0ω=
Robert Bristow-johnson

2

@Jazz, uma das coisas que aprendemos em engenharia elétrica é que qualquer ordem de equação diferencial pode ser dividida em um conjunto (ou "sistema") de equações diferenciais de primeira ordem. por isso, se a integração trapezoidal, com o mesmo "passo de tempo" está sendo usado de forma consistente para todos os integrais de tempo contínuo, para uma º de ordem linear ODE, você pode busto que até em equações diferenciais de primeira ordem. considere apenas um desses eqs diferenciais de primeira ordem:ΔtNN

novamente, considere emular um capacitor. permita que o período de amostragem seja seja o mesmo que " " usado na regra do trapézio.T=1 1fsΔt

Eu(t)=Cdvdt

ou

v(t)=1 1C-tEu(você) dvocê

no domínio s é

V(s)=1 1s(1 1CEu(s))

então a integração trapazoidal em momentos discretos é:

v(nT)=1 1C-nTEu(você) dvocê=1 1Ck=-nkT-TkTEu(você) dvocê1 1Ck=-nT2(Eu(kT-T)+Eu(kT))=v((n-1 1)T)+1 1CT2(Eu((n-1 1)T)+Eu(nT))

ou como valores de amostra em tempo discreto

v[n]=v[n-1 1]+T2C(Eu[n]+Eu[n-1 1])

aplicando a transformação Z

V(z)=z-1 1V(z) + T2C(Eu(z)+z-1 1Eu(z))

resolvendo paraV

V(z)=T21 1+z-1 11 1-z-1 1(1 1CEu(z))

parece que estamos substituindo

1 1sT21 1+z-1 11 1-z-1 1

ou

s2Tz-1 1z+1 1

que é precisamente o que o bilinear sem compensação pelo desvio de frequência faz.


Isso é o que geralmente é chamado de "prova pelo exemplo" e dificilmente geral. Também trata apenas o caso que eu já disse que era trivial nos comentários acima. Mais uma vez, estou falando de solucionadores implícitos de ordem superior que não dão uma simples recursão discreta. Também não é o lugar certo para esta discussão, pois sua resposta não tem nada a ver com a pergunta original. Se você passar isso para uma nova pergunta sobre a integração da ODE, estou disposto a contribuir.
quer

11
não, é completamente geral para diff eqs lineares. você está ignorando a declaração de abertura sobre o que aprendemos há muito tempo nas aulas de engenharia elétrica. (ambos em métodos numéricos e em teoria de controlo, uma equação th-fim diferencial pode ser discriminado de equações diferenciais de primeira ordem e, em seguida i requerem consistência; que o. mesmo regra trapezoidal para integração é usado por toda parte.)NN
Robert Bristow # johsonson

Estou plenamente ciente da transformação de EDOs de ordem superior em sistemas de EDOs de primeira ordem. E mais uma vez, é não o que eu estou falando. Essa declaração não torna sua prova mais geral, pois você apenas afirma que o mapeamento bilinear transcende a toda a classe enquanto trata apenas um exemplo simples. Ainda assim, não estou dizendo que seu resultado está errado, estou falando de diferentes solucionadores. Os solucionadores de ordem superior não são resolvedores de DEs de ordem superior.
quer

desculpe Andrew. isso é um fracasso . você realmente não entende se continua mantendo essa modelagem do comportamento em tempo contínuo dos componentes analógicos lineares usando integração trapezoidal, com o tempo do passo igual ao período de amostragem , então esse é o muito mesma coisa como usando bilinear transformar sem compensação para a deformação de frequência. mesma coisa e a prova está acima. ΔtT=1 1fs
Robert Bristow-johnson

Desculpe Robert, eu não sou Andrew. E sua prova acima é a seguinte. Eu tenho dois mapas A e B, e alguns x. Tanto A (x) = ce B (x) = c, portanto A = B. Isso está obviamente errado. Mesmo que A e B sejam lineares, ainda está errado. Você está certo de que um solucionador trapezoidal de primeira ordem em um sistema linear irá gerar um sistema discreto recursivo, mas é aí que termina. Você continua ignorando minhas declarações repetidas sobre integradores de ordem superior (adaptáveis ​​/ implícitos). Então eu vejo o fracasso muito do seu lado.
precisa

2

Usando métodos de otimização, podemos obter a resposta de frequência de um filtro digital mais próxima do filtro analógico de destino.

No experimento a seguir, um filtro passa-banda de 6 ordens é otimizado usando Adam, um algoritmo de otimização frequentemente usado em aprendizado de máquina. As frequências acima da banda passante são excluídas da função de custo (peso zero atribuído). A resposta do filtro otimizado se torna mais alta que o alvo para frequências muito próximas de Nyquist, mas essa diferença pode ser compensada pelo filtro anti-aliasing da fonte de sinal (ADC ou conversor de taxa de amostragem). insira a descrição da imagem aqui insira a descrição da imagem aqui

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()

"As frequências acima da banda passante são excluídas da função de custo (peso zero atribuído)" Não existe o perigo de o filtro se tornar uma espécie de filtro passa-alto? As frequências acima da banda passante podem ter um grande ganho, sem penalidade dada por essa função de custo.
Olli Niemitalo 21/01/19

OK, pensei que um método de regressão de símbolos produziria uma equação finalizada ... provavelmente para a maioria dos casos, não para todos. enquanto em tempo real livre de derivativos? a otimização é um pouco lenta
aleksv 22/01/19

11
@OlliNiemitalo: para algumas frequências, cai para zero após a banda passante, como o filtro inicial.
igorinov

11
@aleksv: Existe outra solução de formulário fechado que não foi mencionada aqui - khabdha.org/wp-content/uploads/2008/03/…
igorinov

11
Com a tensorflow-gpuversão 1.12.0, a otimização não é convergente, mas divergente. tensorflow1.12.0 funciona melhor, mas a otimização não converge completamente, devido à escolha do otimizador (Adam) e sua taxa de aprendizado, e possivelmente devido à maneira como a função de custo é formulada. Atribuirei a recompensa a esta resposta, porque mostra uma abordagem moderna para otimização de coeficientes: diferenciação automática. Eu ainda gostaria de ver: otimização mais estável e organização dos coeficientes obtidos para uso em tempo real (como varreduras de parâmetros).
Olli Niemitalo 22/01/19

1

Eu criei um design para o EQ de 10dB. Eu escolhi 20 filtros com frequências centrais entre 500 Hz e 16 kHz (Fs = 48 kHz). O gráfico superior abaixo é o design de acordo com o Audio-EQ-Cookbook da RBJ , que é bom, mas leva à distorção da largura de banda quando as frequências centrais se aproximam de Nyquist. O gráfico inferior é o novo design em que os filtros correspondem muito aos filtros de protótipo analógico: insira a descrição da imagem aqui

E é assim que os novos filtros de entalhe se parecem com o Cookbook (largura de banda = 4 oitavas, maior f0 0=23 kHz): insira a descrição da imagem aqui

A figura a seguir mostra um design de filtro passa-baixo (Q=2, f0 0=16 kHz, Fs=48.kHz). Observe que o novo design se aproxima do protótipo analógico e, por esse motivo, ele não funciona como um filtro passa-baixo convencional (não tem zero em Nyquist):

insira a descrição da imagem aqui


Matt, eu sugiro plotar o "peakingEQ" para, digamos, um aumento de 10 dB com um BW, digamos 1 oitava, e para uma variedade de frequências de pico, chegando perto de Nyquist. mesmo que o Cookbook faça uma compensação de primeira ordem emBW multiplicando por ω0 0Tpecado(ω0 0T), ainda não pode mudar o fato de que a resposta de frequência deve ser contínua e ter derivadas contínuas e deve ser simétrica em relação a Nyquist. mesmo se você aumentar o ganho em Nyquist, assim como Orfanidis. que, por si só, é a fonte dessa resposta de frequência distorcida.
Robert Bristow-johnson

11
acho que ele espera ver um filtro digital, com uma taxa de amostragem tão baixa quanto 44,1 kHz, igual ao filtro analógico, mesmo que a frequência ressonante esteja logo abaixo de Nyquist. isso é algo com o qual eu me preocupava há duas décadas e tudo o que eu conseguia pensar com facilidade é simplesmente compensar o desgaste da largura de banda que a transformação bilinear faz. Orfanidis mudou uma suposição (que o ganho em Nyquist é 0 dB), e isso ajudou um pouco mais. mas o que realmente ajuda é simplesmente aumentar a taxa de amostragem.
Robert Bristow-johnson

Obrigado por uma tentativa. O primeiro enredo do Cookbook é o que eu quero, mas como Robert também observou, com o ganho em Nyquist sendo diferente de zero. Também será benéfico desenhar as respostas na escala logarítmica na faixa, por exemplo, 20 Hz a Nyquist. Os equalizadores de áudio raramente usam uma escala de frequência linear. E a largura de banda é geralmente especificada em oitavas. Quaisquer biquads não têm problemas com a frequência central / de canto até cerca de 300 Hz, mas aumentar ainda mais revela o problema.
aleksv

Não, quero dizer 0 a 300 Hz, frequências mais baixas. Acima de 300 Hz até Nyquist, essas fórmulas de filtro do Cookbook produzem um aumento progressivo na distorção da forma do filtro. Obviamente, a taxa de amostragem é 44100 ou 48000, como de costume.
aleksv

Você precisa plotar o gráfico na escala de log. É a distorção da largura de banda na escala LOG que me incomoda. Não há distorção nas frequências mais baixas quando vistas na escala de registro. Os filtros de pico, passa baixo e prateleira alta sempre têm 0 dB (unidade) de ganho em CC.
aleksv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.