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)=∑Mk=0bkz−k∑Nk=0akz−k
Bây giờ thay z=ejω để đánh giá hàm truyền trên vòng tròn đơn vị:
H(ejω)=∑Mk=0bke−jωk∑Nk=0ake−jω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ũ e−jω tại tất cả chúng và lưu trữ nó trong biến
ze
.
- Sử dụng
polyval
hà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 khúc gỗ10H - 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
:
Và đầu ra của tập lệnh của tôi:
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'})
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: