0

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

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

%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.

4

3 回答 3

1

好吧,这其实是朋友的解决方案,不过为了知识分享,我还是贴在这里吧。

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

因此,下面唯一的变化是 w 是从 freqz 使用的,而不是手动定义的。

%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 轴点),但就是这样。

于 2013-07-02T03:55:30.133 回答
1

Try this

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

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

EDIT 1 Actually, this might give you the same problem in the original statement... give me a minute... update confirmed; it does.

EDIT 2
So try this instead:

build your filters with the fs into them a 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, then... do the first block of code (h = [hd1 hd2 hd3]) and when you call freqz, you can just normalize your sampling freq, and everything should be displaying as you expect.

This is probably a lengthy solution. There's probably a way in fvtool or freqz that allows you to change the parameters of each filter to "shape" it to the sampling window.

EDIT 3 In all actuality, the default "normalized frequency" view is sufficient.

If fs1 = 256 Hz, then per sample, 2π = 256 samples. π is 128 samples. You can see this by going to fvtool -> View -> Analysis Parameters ... -> [x] Normalized Frequency after you have entered an Fs for filter 1. You can see how cutoff is at 1/4 2π, which you specified. Hope that helps.

于 2013-06-27T18:55:56.987 回答
1

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

编辑 我希望这会更清楚,抱歉造成混淆,我最初认为Wn缩放不同,抱歉。

你是对n的,指定过滤器的长度,它的顺序。滤波器阶数越高会增加数值不稳定的机会。在 Mathworks 文档中指出:

b = fir1(n,Wn,window)

那么哪个

返回包含 n 阶低通 FIR 滤波器的 n+1 个系数的行向量 b。这是一个基于汉明窗的线性相位滤波器,具有归一化截止频率 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 窗口规范的以下内容。

凯撒规格

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

于 2013-06-26T23:14:45.800 回答