我正在尝试在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);
这会产生:
现在我进入“分析”菜单并选择“采样频率”,然后输入采样频率。对于每个过滤器。结果是:
不太好,因为第二个和第三个过滤器的响应正在重复。第一个滤波器的响应很好,从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
晚一步。
答案 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窗口规范的以下内容。
其中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>按预期显示。
这可能是一个冗长的解决方案。在fvtool
或freqz
中可能有一种方法可以让您更改每个过滤器的参数,以便将其“整形”到采样窗口。
编辑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轴点),但就是这样。