我正在使用Kaiser窗口在Matlab中设计FIR滤波器。
我需要绘制滤波器的幅度和相位响应,其中x轴为赫兹频率,而不是用归一化的角频率绘制它们。这样做,返回的wn等于0.34(由kaiserord()
返回),当我将其转换为赫兹时,它根据需要给出了42.5 Hz。
我的问题是,当我绘制幅度响应时,-3dB点出现在100 Hz以上的频率,这意味着截止频率不等于42.5 Hz。 那我的代码有什么问题?这是代码(带有所需的过滤器规范):
fs=250;
fcuts=[40 45]; % passband and stopband frequencies
mags=[1 0]; % The required filter amplitude in these bands (Absolute value not in dB)
devs=[0.23 0.23];% Passband and stopband ripples (Absolute value not in dB)
[N,wn,beta,ftype]=kaiserord(fcuts,mags,devs,fs); % using kaiser window for designing the fir filter . This function will return the cuttoff freq. , order of the filter , filter type and betta according to the design specs.
x=fir1(N,wn,ftype,kaiser(N+1,beta)); % designing the corresponding fir filter ( note that fir1 takes an even filter order so we wrote N+1)
[h w]=freqz(x)
f=[w*fs]/2
subplot(2,1,1);
plot(f,20*log10(abs(h))); % we will use 20log10() for ploting the mag. response in dB . abs(h) is the magnitude response
title('magnitude response')
grid on % turning the grid on
set(gca,'YTick',-80:5:0)
xlabel('Frequency(Hz)')
ylabel('Magnitude(dB)')
subplot(2,1,2);
plot(f,rad2deg(angle(h)));
title('phase response')
grid on
%set(gca,'YTick',-100:5:0)
xlabel('Frequency(Hz)')
ylabel('phase(degree)')
编辑:wn = 0.34首先对应42.5 Hz? 我计算得对吗?
答案 0 :(得分:1)
freqz()有一个采样率并以Hz为单位返回频率采样点的形式,而不是以弧度为单位,因此不是......
[h w]=freqz(x)
f=[w*fs]/2
......你可以这样做:
[h,f] = freqz(x,1,[],fs)
如果我只对代码进行了更改,则幅度响应图会显示-3dB点。
但是原始代码中的问题是从弧度(w)到Hz(f)的转换;你用过:
f=[w*fs]/2
...正确的转换是:
f=[w*fs]/(2*pi)
快乐过滤!