Làm cách nào để tôi tự vẽ sơ đồ đáp ứng tần số của bộ lọc Butterpass băng thông trong MATLAB mà không có chức năng freqz?


15

Tôi có mã như dưới đây áp dụng bộ lọc thông dải vào tín hiệu. Tôi khá là một người mới ở DSP và tôi muốn hiểu những gì đang diễn ra sau hậu trường trước khi tôi tiến hành.

Để làm điều này, tôi muốn biết cách vẽ biểu đồ đáp ứng tần số của bộ lọc mà không cần sử dụng freqz.

[b, a] = butter(order, [flo fhi]);
filtered_signal = filter(b, a, unfiltered_signal)

Cho đầu ra [b, a]làm thế nào tôi sẽ làm điều này? Điều này có vẻ như là một nhiệm vụ đơn giản, nhưng tôi gặp khó khăn trong việc tìm kiếm những gì tôi cần trong tài liệu hoặc trực tuyến.

Tôi cũng muốn hiểu làm thế nào để làm điều này càng nhanh càng tốt, ví dụ như sử dụng một fftthuật toán nhanh hoặc khác.

Câu trả lời:


25

Chúng tôi biết rằng trong chức năng chuyển chung của bộ lọc được đưa ra bởi:

H(z)=k=0Mbkzkk=0Nakzk

Bây giờ thay z=ejω để đánh giá hàm truyền trên vòng tròn đơn vị:

H(ejω)=k=0Mbkejωkk=0Nakejωk

Như vậy điều này trở thành chỉ là một vấn đề của việc đánh giá đa thức tại một cho ω . Dưới đây là các bước:

  • Tạo một vector tần số góc ω=[0,,π] trong nửa đầu của quang phổ (không cần phải đi lên đến 2π ) và tiết kiệm nó trong w.
  • Tính toán trước số mũ ejω tại tất cả chúng và lưu trữ nó trong biến ze.
  • Sử dụng polyvalhàm để tính các giá trị của tử số và mẫu số bằng cách gọi : polyval(b, ze), chia chúng và lưu trữ trong H. Bởi vì chúng tôi quan tâm đến biên độ, sau đó lấy giá trị tuyệt đối của kết quả.
  • Chuyển đổi sang thang đo dB bằng cách sử dụng: HdB= =20đăng nhập10H - trong trường hợp này 1 là giá trị tham chiếu.

Đặt tất cả điều đó vào mã:

%% Filter definition
a = [1 -0.5 -0.25]; % Some filter with lot's of static gain
b = [1 3 2];

%% My freqz calculation
N = 1024; % Number of points to evaluate at
upp = pi; % Evaluate only up to fs/2
% Create the vector of angular frequencies at one more point.
% After that remove the last element (Nyquist frequency)
w = linspace(0, pi, N+1); 
w(end) = [];
ze = exp(-1j*w); % Pre-compute exponent
H = polyval(b, ze)./polyval(a, ze); % Evaluate transfer function and take the amplitude
Ha = abs(H);
Hdb  = 20*log10(Ha); % Convert to dB scale
wn   = w/pi;
% Plot and set axis limits
xlim = ([0 1]);
plot(wn, Hdb)
grid on

%% MATLAB freqz
figure
freqz(b,a)

Đầu ra ban đầu của freqz:

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

Và đầu ra của tập lệnh của tôi:

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

Và so sánh nhanh trong quy mô tuyến tính - trông tuyệt vời!

[h_f, w_f] = freqz(b,a);
figure
xlim = ([0 1]);
plot(w, Ha) % mine
grid on
hold on
plot(w_f, abs(h_f), '--r') % MATLAB
legend({'my freqz','MATLAB freqz'})

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

Bây giờ bạn có thể viết lại nó vào một số chức năng và thêm một vài điều kiện để làm cho nó hữu ích hơn.


Một cách khác (được đề xuất trước đây là đáng tin cậy hơn) là sử dụng thuộc tính cơ bản, đáp ứng tần số của bộ lọc là Biến đổi Fourier của đáp ứng xung của nó:

H(ω)=F{h(t)}

δ(t)

d = [zeros(1,length(w_f)) 1 zeros(1,length(w_f)-1)];
h = filter(b, a, d);
HH = abs(fft(h));
HH = HH(1:length(w_f));

Trong so sánh này sẽ tạo ra như sau:

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


1
Giải thích chi tiết
partida

Tôi đang suy nghĩ dòng này a = [1 -0.5 -0.25]; % Some filter with lot's of static gain. Bạn có thể giải thích cho tôi lựa chọn các tham số này ở đây, xin vui lòng. Tôi đang đọc hướng dẫn sử dụng Matlab của tôi và nó nói [h,w] = freqz(hfilt,n)trong một phần của khớp thần kinh. Bạn đang cho hai bộ lọc (a, b) vào freqz. Cả hai bộ lọc trong hfilt? Hay một trong n?
Léo Léopold Hertz

Chỉ cần làm rõ cho người khác: "Không cần phải tăng lên 2 pi" là khi các hệ số là có thật. Có những ứng dụng cho các bộ lọc có hệ số phức tạp và trong trường hợp đó, phổ sẽ không còn đối xứng nữa và trong trường hợp đó muốn mở rộng tần số lên 2 pi.
Dan Boschen

14

đây chỉ là phần phụ lục cho câu trả lời của jojek, khái quát hơn và hoàn toàn tốt khi sử dụng toán chính xác kép. khi có độ chính xác thấp hơn, sẽ có "vấn đề cosin" tăng lên khi tần số trong đáp ứng tần số rất thấp (thấp hơn nhiều so với Nyquist) và cả khi tần số cộng hưởng của bộ lọc rất thấp.

|H(ejω)|2|H(ejω)|=|H(ejω)|

xem xét danh tính trig này:

cos(ω) = 12sin2(ω2)

tội2(ω2)ω0

tội2(ω2)

H(z)= =b0+b1z-1+b2z-2một0+một1z-1+một2z-2

có đáp ứng tần số phức tạp

H(ejω)= =b0+b1e-jω+b2e-j2ωmột0+một1e-jω+một2e-j2ω

có độ lớn bình phương:

|H(ejω)|2=|b0+b1ejω+b2ej2ω|2|a0+a1ejω+a2ej2ω|2=(b0+b1cos(ω)+b2cos(2ω))2+(b1sin(ω)+b2sin(2ω))2(a0+a1cos(ω)+a2cos(2ω))2+(a1sin(ω)+a2sin(2ω))2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)

|H(ejω)|cos(ω)cos(2ω)ω11

sử dụng danh tính trig ở trên, bạn có được bình phương độ lớn:

|H(ejω)|2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(12sin2(ω))a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(12sin2(ω))=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2cos2(ω)1)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2cos2(ω)1)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2(12sin2(ω2))21)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2(12sin2(ω2))21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(2(12ϕ)21)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(2(12ϕ)21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(18ϕ+8ϕ2)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(18ϕ+8ϕ2)=b02+b12+b22+2b1b0+2b1b24(b1b0+b1b2)ϕ+2b0b216b0b2ϕ+16b0b2ϕ2a02+a12+a22+2a1a0+2a1a24(a1a0+a1a2)ϕ+2a0a216a0a2ϕ+16a0a2ϕ2=(b02+b12+b22+2b1b0+2b1b2+2b0b2)4(b1b0+b1b24b0b2)ϕ+16b0b2ϕ2(a02+a12+a22+2a1a0+2a1a2+2a0a2)4(a1a0+a1a24a0a2)ϕ+16a0a2ϕ2=14(b02+b12+b22+2b1b0+2b1b2+2b0b2)(b1b0+b1b24b0b2)ϕ+4b0b2ϕ214(a02+a12+a22+2a1a0+2a1a2+2a0a2)(a1a0+a1a24a0a2)ϕ+4a0a2ϕ2=(b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2))(a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2))

where ϕsin2(ω2)

if your gear is intending to plot this as dB, it comes out as

20log10|H(ejω)| = 10log10((b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2)))10log10((a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2)))

so your division turns into subtraction, but you have to be able to compute logarithms to some base or another. numerically, you will have much less trouble with this for low frequencies than doing it the apparent way.


2
That's really cool, thank you Robert! +1
jojek

@Robert I "believe" similar to my comment for Jojek above that this only applies as well when the coefficients are real (and therefore the spectrum is symmetric and thus the magnitude converts to cosines as you show)... Am I correct?
Dan Boschen

yes. that commitment is made when you go from the first line of |H(ejω)|2=... to the second line. no going back after that.
robert bristow-johnson
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.