Audio EQ Cookbook không bị cong vênh tần số


7

Http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt nổi tiếng cung cấp một bộ các công thức tính toán bộ lọc biquad [thực] thường hoạt động tốt.

Tuy nhiên, khi tần số của bộ lọc tiếp cận tần số Nyquist, thông số Q (băng thông) của bộ lọc bị biến dạng rất nhiều - thường thì nó co lại rất nhiều (mặc dù tác giả đã đề cập rằng anh ta đã thực hiện một độ cong vênh cần thiết).

Tôi đang tìm kiếm các công thức lọc không bị biến dạng băng thông mạnh như vậy. Tôi cần bộ lọc đỉnh / chuông, băng thông, thông thấp, thông cao, giá cao, bộ lọc notch. Tôi biết điều này có thể được thực hiện vì trước đây tôi đã mua một công thức lọc đỉnh / chuông / băng thông với ít biến dạng hơn, nhưng chúng vẫn không hoàn hảo và tôi cần các loại bộ lọc khác.

Vì vậy, tôi cũng sẵn sàng trả tiền cho giải pháp nếu giá cả phù hợp.

Ngoài ra, nếu ai đó có thể chỉ cho tôi một thuật toán tối ưu hóa hoạt động với các bộ lọc miền Z cũng sẽ rất tuyệt. Thật không may, hầu hết các thuật toán tối ưu hóa thông thường không hoạt động tốt trong miền Z - chúng không thể tối ưu hóa một tập hợp các tham số để phù hợp với đáp ứng tần số mong muốn (có thể do các hàm định kỳ được sử dụng để tính toán đáp ứng tần số).


1
Để bù một cách hiệu quả các răng cưa và cong vênh cho các bộ lọc rời rạc, bạn phải sử dụng các đơn đặt hàng rất cao. FIR sẽ làm cho thiết kế thực sự dễ dàng hơn nhiều, nhưng cũng có những phương pháp khác. Để cung cấp cho bạn một câu trả lời có ý nghĩa, tôi muốn biết chính xác các ràng buộc tính toán của bạn là gì (bao gồm cả nền tảng) và yêu cầu xử lý của bạn là gì. Tại sao bạn cần hành vi này, và sẽ quá khổ không đủ?
Jazzmaniac

2
tốt, có giới hạn cho những gì bạn có thể nhận được với bộ lọc IIR bậc 2. có một bài báo khác của Orfanidis đặt mức tăng tại Nyquist là 0 dB (Cookbook đặt mức tăng Nyquist ở mức 0 dB vì đó là cách thức song tuyến biến đổi nó). đối với tốc độ mẫu 44,1 kHz và biquad bậc 2, tôi không nghĩ bạn sẽ làm tốt hơn nhiều so với thiết kế của Orfanidis.
robert bristow-johnson

1
Phương pháp tốt nhất mà tôi biết là không ánh xạ trực tiếp vào miền rời rạc mà áp dụng các bộ giải ODE cho nguyên mẫu tương tự. Cụ thể người giải quyết ngầm làm một công việc tuyệt vời trong việc duy trì đáp ứng tần số.
Jazzmaniac

1
@Jazzmaniac: Tại sao sử dụng nguyên mẫu tương tự thay vì thiết kế trực tiếp trong miền thời gian rời rạc?
Matt L.

1
@aleksv: Bạn có thể đăng một vấn đề thiết kế cụ thể với tất cả các thông số kỹ thuật và xem những gì chúng tôi đưa ra.
Matt L.

Câu trả lời:


5

Dưới đây là một cái nhìn nhanh về cách 5 bậc tự do cho EQ tham số có thể được xem. đó là suy nghĩ của tôi về những gì Knud Christensen của tc điện tử đã đưa ra khoảng một thập kỷ trước tại một hội nghị AESbằng sáng chế này .

vì vậy, hãy quên Cookbook (và các vấn đề về Q và băng thông trong đó) và xem xét (trong mặt phẳng s) EQ tham số là tổng của bộ lọc thông dải (với một Q giá trị) song song với một dây:

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

Gboost=10dB20 là mức tăng của đỉnh (hoặc thung lũng, nếu dB<0). mức tăng tại DC và tại Nyquist là 0 dB. đó là IIR bậc 2 và có 3 tham số độc lập. Thêm 2 đi nữa. Vì vậy, chúng tôi tiếp theo thêm một tham số tăng tổng thể:

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

đó là 4 núm để xoắn. thêm một núm để thêm (mà không tăng thứ tự bộ lọc) và chúng tôi sẽ được thực hiện với việc thêm các tham số độc lập hơn.

Vì vậy, những gì Knud làm ở đây là thay thế "dây" đó1"trong chức năng chuyển) với bộ lọc giá đỡ nguyên mẫu phải có cùng cực, giống nhauQω0như BPF, do đó mẫu số là như nhau. chức năng chuyển của kệ đó là:

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

Ở đâu R10tilt20tiltlà chênh lệch khuếch đại của giá tính theo dB. đây là những gì bù đắp cho mức tăng tại Nyquist khác với mức tăng tại DC. Sau khi chuyển đổi song tuyến, Nyquist được tăng cường bởitiltdB và mức tăng tại DC không đổi. Giống nhưdB tăng tham số, tilt tham số có thể là dương hoặc âm. G0R là mức tăng tuyến tính tại Nyquist.

đặt tất cả lại với nhau và bạn nhận được:

H(s)=G0((Gboost1)1Qsω0(sω0)2+1Qsω0+1+Hshelf(s))=G0((Gboost1)1Qsω0(sω0)2+1Qsω0+1+R(sω0)2+RQsω0+1(sω0)2+1Qsω0+1)=G0R(sω0)2+(Gboost+R1)1Qsω0+1(sω0)2+1Qsω0+1

bất kể bạn nhìn vào điều đó như thế nào, điều này có 5 bậc tự do và 5 hệ số biquad đó được xác định đầy đủ từ 5 tham số này. không quan trọng nếu bạn ánh xạ từs đến zsử dụng biến đổi blinear hoặc quy tắc hình thang (có hiệu quả tương tự) hoặc bất kỳ phương pháp nào khác không thay đổi thứ tự của bộ lọc. bạn có thể phải làm mờ định nghĩa củaQ hoặc băng thông, bạn có thể phải bù ω0 và / hoặc Qcho các hiệu ứng cong vênh tần số (như bạn nhận được với biến đổi blinear), nhưng nếu bạn đã trả nhiều tiền cho một thứ gì đó mang lại cho bạn bộ lọc IIR bậc 2, thì bạn không thực hiện nó với bất kỳ Biểu mẫu trực tiếp hoặc Chuyển đổi trực tiếp nào Mô hình mạng tinh thể hoặc bậc thang bình thường hoặc mô hình biến đổi tuyến tính của Hal Chamberlin hoặc Andrew Simpson với tích hợp hình thang, cuối cùng bạn có được 5 hệ số và chúng có thể được ánh xạ tới 5 tham số độc lập này. tất cả đều giống nhau có hay không bạn đã trả tiền cho một giấy phép hay không. toán học mạnh hơn bất kỳ khiếu nại nào được đưa ra bởi bất kỳ ai bạn đang cấp phép.

Chỉ cần FYI, tôi giải quyết nơi đỉnh cao hoặc thung lũng đúng tần số được khi có mộttiltđó không phải là không tần số mà đỉnh hoặc thung lũng bị nghiêng qua độ nghiêng là:

ωpeak = ω0 Q2(R1R)Gboost2R+2Q2(R1)+Gboost21R+2Q2(1R1)Gboost2R+2Q2(R1)+Q4(R1R)2(Gboost2R+2Q2(R1))2

bạn có thể thấy điều đó khi tilt=0, sau đó R=1 và do đó ωpeak=ω0. mức tăng cao nhấtGboostcũng có thể phải điều chỉnh một chút và điều đó vẫn chưa được giải quyết. một dự đoán đầu tiên sẽ làGboostGboostR hoặc có thể GboostGboost(R1).


Tôi không thể hiểu những gì bạn đang cố gắng để chứng minh? Theo định nghĩa, bộ lọc IIR thứ 2 có 5 bậc tự do. Làm thế nào ánh xạ các tham số của bạn đến các hệ số biquad giúp trả lời câu hỏi ban đầu?
aleksv

vì vậy, một khi đã rõ ràng rằng "tất nhiên đó là bộ lọc IIR thứ 2 mà tôi đang nói đến" , do đó, việc tăng thứ tự bộ lọc "để bù một cách hiệu quả các răng cưa và cong vênh cho các bộ lọc rời rạc [sử dụng] các đơn đặt hàng rất cao" không phải là sau đó, trong thẻ, tốt nhất tôi có thể nói từ những gì bạn nói, là bạn đã trả tiền để cấp phép IP từ ai đó để xác định 5 hệ số đó. và tất cả những gì tôi đang cố gắng nói là đây là một vấn đề được giải quyết đầy đủ . cho dù bạn trả tiền cho nó hay không.
robert bristow-johnson

Mã calc bộ lọc đỉnh tôi cũng đã sử dụng 5 tham số: gain tại DC, freq cạnh trái và gain, freq đỉnh và gain. Tôi nghĩ điều quan trọng là chỉ định freq cạnh để duy trì băng thông ổn định.
aleksv

Nó có thể là một vấn đề được giải quyết, nhưng nơi tôi có thể tìm thấy một giải pháp? Được trả tiền hay không?
aleksv

được rồi, bây giờ hãy xem bài báo của Orfanidis , nhưng hãy sử dụng các ký hiệu toán học ở trên. điều này là tốt như bạn có thể làm, bởi vì bạn chỉ có 5 nút để xoắn. bạn cần tìm ra cái gìG0A Chúng tôi. G0A là mức tăng DC (có thể bạn muốn nó là 0 dB hoặc G0A=1, tôi không biết). A G0 là mức tăng tại ω=, nhưng, bằng cách sử dụng phép biến đổi song tuyến, đó là lợi ích tại Nyquist. vì vậy bạn phải tìm ra những gì bạn muốn đạt được tại Nyquist. Sophocles có một gợi ý. dunno nếu tôi đồng ý với nó.
robert bristow-johnson

2

@Jazz, một trong những điều chúng tôi học được trong kỹ thuật điện là mọi thứ tự của phương trình vi phân đều có thể được chia thành một tập hợp (hoặc "hệ thống") của các eqs bậc 1. Vì vậy, nếu tích hợp hình thang, với cùng một "bước thời gian"Δtđang được sử dụng nhất quán cho tất cả các tích phân thời gian liên tục, cho mộtNODE tuyến tính theo thứ tự, bạn có thể phá vỡ nó thành Nphương trình vi phân bậc nhất. sau đó chỉ xem xét một trong những eqs khác thứ 1:

một lần nữa, xem xét mô phỏng một tụ điện. để thời gian lấy mẫu làT=1fs giống như "Δt"Được sử dụng trong quy tắc hình thang.

i(t)=Cdvdt

hoặc là

v(t)=1Cti(u) du

trong miền s

V(s)=1s(1CI(s))

vì vậy tích hợp bẫy ở các thời điểm riêng biệt là:

v(nT)=1CnTi(u) du=1Ck=nkTTkTi(u) du1Ck=nT2(i(kTT)+i(kT))=v((n1)T)+1CT2(i((n1)T)+i(nT))

hoặc như các giá trị mẫu thời gian rời rạc

v[n]=v[n1]+T2C(i[n]+i[n1])

áp dụng biến đổi Z

V(z)=z1V(z) + T2C(I(z)+z1I(z))

giải quyết để V

V(z)=T21+z11z1(1CI(z))

có vẻ như chúng ta đang thay thế

1sT21+z11z1

hoặc là

S2Tz-1z+1

đó chính xác là những gì song tuyến mà không bù cho cong vênh tần số.


Đây là những gì thường được gọi là "bằng chứng bằng ví dụ" và hầu như không chung chung. Nó cũng chỉ xử lý trường hợp mà tôi đã nói là tầm thường trong các ý kiến ​​trên. Một lần nữa, tôi đang nói về những người giải quyết ngầm bậc cao hơn mà không đưa ra một đệ quy rời rạc đơn giản. Đây cũng không phải là nơi thích hợp cho cuộc thảo luận này vì câu trả lời của bạn không liên quan gì đến câu hỏi ban đầu. Nếu bạn chuyển câu hỏi này sang một câu hỏi mới liên quan đến tích hợp ODE, tôi sẵn sàng đóng góp cho nó.
Jazzmaniac

1
không, nó hoàn toàn chung cho các eqs khác tuyến tính. bạn đang bỏ qua tuyên bố mở đầu về chúng tôi đã học được từ lâu trong các lớp kỹ thuật điện. (cả về phương pháp số và lý thuyết điều khiển, mộtNphương trình vi phân thứ tự có thể được chia thành Nphương trình vi phân bậc nhất. và sau đó tôi yêu cầu sự nhất quán; rằng quy tắc hình thang tương tự cho tích hợp được sử dụng xuyên suốt.)
robert bristow-johnson

Tôi hoàn toàn nhận thức được việc chuyển đổi ODE bậc cao thành hệ thống ODE bậc nhất. Và một lần nữa, đó không phải là điều tôi đang nói. Tuyên bố này không làm cho bằng chứng của bạn trở nên tổng quát hơn, vì bạn chỉ khẳng định rằng ánh xạ song tuyến vượt qua toàn bộ lớp trong khi chỉ xử lý một ví dụ đơn giản. Tuy nhiên, tôi không nói rằng kết quả của bạn là sai, tôi đang nói về những người giải quyết khác nhau. Người giải quyết bậc cao hơn không phải là người giải quyết DE bậc cao.
Jazzmaniac

xin lỗi, Andrew đó là một thất bại . bạn thực sự không hiểu nếu bạn tiếp tục duy trì mô hình hóa hành vi thời gian liên tục của các thành phần tương tự tuyến tính bằng cách sử dụng tích hợp hình thang, với thời gian bướcΔt giống như thời gian lấy mẫu T= =1fS, Sau đó đó là rất tương tự điều như sử dụng Bilinear chuyển đổi mà không bồi thường cho cong vênh tần số. điều tương tự và bằng chứng là ở trên.
robert bristow-johnson

Xin lỗi Robert, tôi không phải Andrew. Và bằng chứng của bạn ở trên giống như sau. Tôi có hai bản đồ A và B, và một số x. Cả A (x) = c và B (x) = c, do đó A = B. Điều đó rõ ràng là sai. Ngay cả khi A và B là tuyến tính, nó vẫn sai. Bạn đúng rằng một bộ giải hình thang thứ nhất trên một hệ thống tuyến tính sẽ tạo ra một hệ thống rời rạc đệ quy, nhưng đó là nơi nó kết thúc. Bạn tiếp tục bỏ qua các tuyên bố lặp đi lặp lại của tôi về các nhà tích hợp bậc cao (thích nghi / ngầm). Vì vậy, tôi thấy sự thất bại rất nhiều về phía bạn.
Jazzmaniac

2

Sử dụng các phương pháp tối ưu hóa, chúng ta có thể nhận được đáp ứng tần số của bộ lọc kỹ thuật số gần hơn với bộ lọc tương tự đích.

Trong thử nghiệm sau đây, bộ lọc thông dải 6 bậc được tối ưu hóa bằng Adam, thuật toán tối ưu hóa thường được sử dụng trong học máy. Các tần số trên băng thông được loại trừ khỏi hàm chi phí (trọng số không được gán). Phản hồi của bộ lọc được tối ưu hóa trở nên cao hơn mục tiêu cho các tần số rất gần với Nyquist, nhưng sự khác biệt đó có thể được bù lại bằng bộ lọc khử răng cưa của nguồn tín hiệu (ADC hoặc bộ chuyển đổi tốc độ mẫu). nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

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

"Các tần số trên băng thông được loại trừ khỏi hàm chi phí (trọng số không được gán)" Không có nguy hiểm khi bộ lọc trở thành một loại bộ lọc thông cao? Các tần số trên băng thông có thể có mức tăng lớn mà không bị phạt bởi hàm chi phí như vậy.
Olli Niemitalo

OK, II nghĩ rằng một phương pháp hồi quy ký hiệu sẽ tạo ra một phương trình hoàn chỉnh ... có thể cho hầu hết các trường hợp, không phải tất cả. trong khi phái sinh thời gian thực miễn phí? tối ưu hóa hơi chậm
aleksv

1
@OlliNiemitalo: Đối với một số tần số, nó giảm xuống 0 sau khi băng thông, giống như bộ lọc ban đầu.
igorinov

1
@aleksv: Có một giải pháp dạng đóng khác chưa được đề cập ở đây - khabdha.org/wp-content/uploads/2008/03/ Kẻ
igorinov

1
Với tensorflow-gpu1.12.0, tối ưu hóa không hội tụ, thay vào đó là phân kỳ. tensorflow1.12.0 hoạt động tốt hơn nhưng tối ưu hóa không hội tụ đầy đủ, vì sự lựa chọn của trình tối ưu hóa (Adam) và tốc độ học tập của nó, và có thể là do cách thức chức năng chi phí được hình thành. Tôi sẽ trao phần thưởng cho câu trả lời này, bởi vì nó cho thấy một cách tiếp cận hiện đại để tối ưu hóa các hệ số: phân biệt tự động. Tôi vẫn muốn xem: tối ưu hóa ổn định hơn và sắp xếp các hệ số thu được để sử dụng thời gian thực (chẳng hạn như quét tham số).
Olli Niemitalo

1

Tôi đã đưa ra một thiết kế cho EQ đạt đỉnh 10dB. Tôi đã chọn 20 bộ lọc có tần số trung tâm trong khoảng 500 Hz đến 16 kHz (Fs = 48 kHz). Âm mưu hàng đầu dưới đây là thiết kế theo Audio-EQ-Cookbook của RBJ , điều này tốt nhưng dẫn đến méo băng thông khi tần số trung tâm tiến gần hơn đến Nyquist. Cốt truyện dưới cùng là thiết kế mới trong đó các bộ lọc rất khớp với các bộ lọc nguyên mẫu tương tự: nhập mô tả hình ảnh ở đây

Và đây là cách các bộ lọc notch mới trông giống như so với Cookbook (băng thông = 4 quãng tám, cao nhất f0= =23 kHz): nhập mô tả hình ảnh ở đây

Hình dưới đây cho thấy một thiết kế bộ lọc thông thấp (Q= =2, f0= =16 kHz, FS= =48kHz). Lưu ý rằng thiết kế mới xấp xỉ nguyên mẫu tương tự và vì lý do này, nó không hoạt động như một bộ lọc thông thấp (nó không có số 0 tại Nyquist):

nhập mô tả hình ảnh ở đây


Matt, tôi có thể đề nghị vẽ "đỉnh", ví dụ, tăng 10 dB với mức cố định BW, giả sử 1 quãng tám và với nhiều tần số cực đại khác nhau, sẽ tiến gần đến Nyquist. mặc dù Cookbook thực hiện bồi thường theo đơn đặt hàng đầu tiênBW bằng cách nhân với ω0Ttội(ω0T), nó vẫn không thể thay đổi thực tế là đáp ứng tần số phải liên tục và có đạo hàm liên tục nó phải đối xứng với Nyquist. ngay cả khi bạn tăng lợi nhuận tại Nyquist cũng như Orfanidis. rằng, trong và của chính nó, là nguồn gốc của đáp ứng tần số bị vênh này.
robert bristow-johnson

1
Tôi nghĩ rằng anh ấy hy vọng sẽ thấy một bộ lọc kỹ thuật số, với tốc độ mẫu thấp tới 44,1 kHz, phù hợp với bộ lọc tương tự, ngay cả khi tần số cộng hưởng nằm dưới Nyquist. đây là điều tôi đã lo lắng khoảng 2 thập kỷ trước và tất cả những gì tôi có thể nghĩ làm một cách dễ dàng chỉ đơn giản là để bù đắp cho việc cắt giảm băng thông mà biến đổi song tuyến thực hiện. sau đó Orfanidis đã thay đổi một giả định (rằng mức tăng tại Nyquist là 0 dB), và điều đó đã giúp thêm một chút. nhưng điều thực sự có ích, chỉ đơn giản là tăng tỷ lệ mẫu.
robert bristow-johnson

Cảm ơn cho một nỗ lực. Cốt truyện Cookbook đầu tiên là những gì tôi muốn, nhưng như Robert cũng lưu ý, với mức tăng tại Nyquist là khác không. Cũng sẽ có ích khi vẽ các phản hồi trên thang logarit trong phạm vi, ví dụ 20 Hz đến Nyquist. EQ âm thanh hiếm khi sử dụng thang tần số tuyến tính. Và băng thông thường được chỉ định trong quãng tám. Bất kỳ phép màu nào cũng không có vấn đề với tần số trung tâm / góc lên tới khoảng 300 Hz, nhưng việc phát hiện cao hơn sẽ cho thấy vấn đề.
aleksv

Không, ý tôi là 0 đến 300 Hz, tần số thấp hơn. Trên 300 Hz cho đến Nyquist các công thức lọc Cookbook này tạo ra sự biến dạng hình dạng bộ lọc tăng dần. Tất nhiên, tỷ lệ mẫu là 44100 hoặc 48000 như bình thường.
aleksv

Bạn phải vẽ đồ thị trên thang đo log. Đó là sự biến dạng băng thông trên thang điểm LOG làm phiền tôi. Không có biến dạng hiện diện ở các tần số thấp hơn khi nhìn thấy trên thang đo log. Các bộ lọc đỉnh, thông thấp, giá cao, notch luôn có mức tăng 0 dB (thống nhất) tại DC.
aleksv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.