在Matlab中显示数字滤波器响应时输入采样率

时间:2013-06-26 22:55:19

标签: matlab filtering

我正在尝试在Matlab(2011a)中使用fvtool函数。

这是一个由许多功能组成的交互式“工具”。我的代码是这样的:

%fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726));
b2 = fir1(40,0.5,kaiser(41,7.85726));
b3 = fir1(204,0.5,kaiser(205,10.0613));
fvtool(b1,1,b2,1,b3,1);

这会产生: http://www.4shared.com/photo/sZunQTHJ/1_online.html

现在我进入“分析”菜单并选择“采样频率”,然后输入采样频率。对于每个过滤器。结果是:

http://www.4shared.com/photo/sZunQTHJ/2_online.html

不太好,因为第二个和第三个过滤器的响应正在重复。第一个滤波器的响应很好,从0到256/2 = 128 Hz。我想让第二个和第三个过滤器的响应达到64/2 = 32和32/2 = 16。分别

所以我尝试手动完成,

%Digital filter:
fs1=256; fs2=64; fs3=32; 
b1 = fir1(52,0.25,kaiser(53,7.85726));  b1(end+256)=0;
b2 = fir1(40,0.5,kaiser(41,7.85726));   b2(end+448)=0;
b3 = fir1(204,0.5,kaiser(205,10.0613)); b3(end+480)=0;

%Filters Response
n=1024;
w = logspace(-1,2,n);

digi_1 = freqz(b1,1,n,fs1); semilogx(w,20*log10(abs(digi_1)),'Color','k'); hold on
digi_2 = freqz(b2,1,n,fs2); semilogx(w,20*log10(abs(digi_2)),'Color','b'); hold on
digi_3 = freqz(b3,1,n,fs3); semilogx(w,20*log10(abs(digi_3)),'Color','r'); 
axis ([0.1 128 -140 10])

这里我使用freqz并给它过滤器分子和标记,加上点数n加上采样频率。 FS。问题是,无论有没有采样频率,Matlab似乎都没有做任何改变,即如果我没有改变它。

因此,如果有人想要帮助,他/她会帮我fvtools或使用我的手动代码,这比fvtools晚一步。

3 个答案:

答案 0 :(得分:1)

看起来fir1几乎不喜欢您为后两个过滤器选择的Wn。尝试减少Wn

修改 我希望这会更清楚,对于这种混乱感到抱歉,我原本认为Wn的缩放方式不同,抱歉。

你是对的n,指定过滤器的长度,以及它的顺序。滤波器阶数越高,数值不稳定的可能性就越大。在Mathworks文档中调出:

b = fir1(n,Wn,window)

然后

  

返回包含n阶n +系数的行向量b   低通FIR滤波器。这是基于汉明窗的线性相位   具有归一化截止频率Wn的滤波器。输出过滤器   系数b按z的递减幂排序。

     

Wn是介于0和1之间的数字,其中1对应于奈奎斯特频率。

所以,你是第一个过滤器:

% sampling frequency 256 Hz
b1 = fir1(52,0.25,kaiser(53,7.85726));

工作得很好!而接下来的两个

% sampling frequency 64 Hz
b2 = fir1(40,0.5,kaiser(41,7.85726));
% sampling frequency 32 Hz
b3 = fir1(204,0.5,kaiser(205,10.0613));

显示定期响应,这表示某种数字问题。创建这些过滤器/窗口时是否有任何警告? Mathworks文档显示了Kaiser窗口规范的以下内容。

Kaiser Specification

其中alpha是阻带中衰减的dB。这个值太高了吗?尝试放宽此值,看看过滤器的行为是否符合您的预期。

答案 1 :(得分:1)

试试这个

hd1 = dfilt.dffir(b1);
hd2 = dfilt.dffir(b2);
hd3 = dfilt.dffir(b3);

h = [hd1 hd2 hd3];
freqz(h);

编辑1 实际上,这可能会在原始陈述中给你同样的问题......给我一分钟...... 更新确认;它确实。

编辑2
所以试试这个:

使用 fs将过滤器构建到la:

fs1 = 256;
fpass = .4*fs;
fstop = .5*fs;
band_limits = [fpass fstop];
band_type = [1 0]; % 0 = stop, 1 = pass
ripple_dB = .1; % ripple mag
stop_db = -60; % stopband attenuation
dstop = 10^(stop_db/20);
dpass = abs(1-10^(ripple_db/20/2));
dev = [dpass dstop]; % ripple spec
c1 = kaiserord(band_limits,band_type,dev,fs1,'cell'); % kaiserwindow builder 
b1 = fir1(c{:}); % filter spec'd to window

etcetera ,然后......执行第一个代码块(h = [hd1 hd2 hd3]),当你调用freqz时,你可以规范化你的采样频率,而应该< / em>按预期显示。

这可能是一个冗长的解决方案。在fvtoolfreqz中可能有一种方法可以让您更改每个过滤器的参数,以便将其“整形”到采样窗口。

编辑3 实际上,默认的“标准化频率”视图就足够了。

如果fs1 = 256 Hz,那么每个样本,2π= 256个样本。 π是128个样本。输入过滤器1的Fs后,可以通过转到fvtool -> View -> Analysis Parameters ... -> [x] Normalized Frequency来看到这一点。您可以看到截止值是指定的1/42π。希望有所帮助。

答案 2 :(得分:1)

好吧,这实际上是朋友的解决方案,但为了知识共享,我会在这里发布。

基本上我的代码问题是我自己定义了x轴点(w = logspace(-1,2,n);),这与freqz返回的y轴点不相容。而不是那样,我应该简单地使用从freqz返回的x轴点,因为实际上freqz返回y和x aisx点。

所以下面唯一的变化就是从freqz中使用w而不是手动定义。

%Digital filter:
fs1=256; fs2=64; fs3=32;                                                   % Sampling frequencies.
b1 = fir1(52,0.25,kaiser(53,7.85726));%32                                  % Defining filter 1 parameters
b2 = fir1(40,0.5,kaiser(41,7.85726)); %16                                  % Defining filter 2 parameters
b3 = fir1(204,0.5,kaiser(205,10.0613));%8                                  % Defining filter 3 parameters

n=1024

[h1,w1] = freqz(b1,1,n,fs1); fig1=semilogx(w1,20*log10(abs(h1)),'Color','k'); hold on
[h2,w2] = freqz(b2,1,n,fs2); fig2=semilogx(w2,20*log10(abs(h2)),'Color','b'); hold on
[h3 w3] = freqz(b3,1,n,fs3); fig3=semilogx(w3,20*log10(abs(h3)),'Color','r'); 

我不记得为什么我试图手动定义w(x轴点),但就是这样。