우리는 일반적으로 필터의 전달 기능이 다음과 같이 주어진다는 것을 알고 있습니다.
H(z)=∑Mk=0bkz−k∑Nk=0akz−k
이제 단위 원에서 전달 함수를 평가하려면 z=ejω 를 대입 하십시오.
H(ejω)=∑Mk=0bke−jωk∑Nk=0ake−jωk
따라서 이것은 주어진 ω 에서 다항식 평가의 문제가된다 . 단계는 다음과 같습니다.
- 모난 주파수 생성 벡터 ω=[0,…,π] 스펙트럼의 전반부 (까지 갈 필요위한 2π )에 저장하고이
w
.
- 그들 모두에서 사전 계산 지수 e−jω 를 변수에 저장하십시오
ze
.
- 이
polyval
함수를 사용하여 다음을 호출하여 분자 및 분모 값을 계산하십시오. polyval(b, ze)
, 나누고에 저장하십시오 H
. 우리는 진폭에 관심이 있으므로 결과의 절대 값을 취하십시오.
- 다음을 사용하여 dB 스케일로 변환하십시오. HdB=20log10H 이 경우 1 은 참조값입니다.
그 모든 것을 코드에 넣으십시오.
%% 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)
원본 출력 freqz
:
그리고 내 스크립트의 출력 :
선형 스케일의 빠른 비교-멋지게 보입니다!
[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'})
이제 함수를 일부 함수로 다시 작성하고 조건을 추가하여 더 유용하게 사용할 수 있습니다.
필터의 주파수 응답이 임펄스 응답의 푸리에 변환이라는 기본 속성을 사용하는 또 다른 방법 (이전에 제안 된 것이 더 신뢰할 수 있음)입니다.
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));
이에 비해 다음이 생성됩니다.