Chebyshev IIR FIlter:得到系数,下一步是什么?

时间:2014-03-14 14:24:27

标签: matlab signals signal-processing octave

这是我的Matlab / Octave程序

clc;
close all;
%BPF of pass 400-600Hz
fs1=300;
fp1=400;
fp2=600;
fs2=700;
samp=1500;
ap=1;   %passband ripple
as=60;  %stopband attenuation
%Normalizing the frequency

wp=[fp1 fp2]/(samp);
ws=[fs1 fs2]/(samp);

[N,wn]=cheb1ord_test(wp,ws,ap,as); %Generates order  and cutoff parameters
[b,a]=cheby1(N,ap,wn); %Generates poles and zeros for the given order and cutoff

printf("b coeffs = %f\n",b);
printf("a coeffs = %f\n",a);

[H,W]=freqz(b,a,256); 
plot(W/(2*pi),20*log10(abs(H))) %Transfer function works correctly, so coefficients are correct

 %100 samples of 500hz
n = 1:100;  
 x=10*cos(2*pi*n*500*(1/samp)); 

printf("Order %d\n",N);    %Depends on required ripple attenuation
figure;

subplot (2,1,1); plot(x);

y=filter(b,a,x); %**Apparently i suspect this does not work**

subplot (2,1,2); plot(y);

当我看到幅度/频率响应时,图表是完美的,表示400和600是我的滤波器截止值。

但是当我应用500Hz的输入信号时,我必须期望看到信号通过滤波器而不受伤害(当我使用Butterworth功能时观察到),但输出失真并且几乎不包含信号

所以我推断我的错误是使用滤波器函数将chebyshev系数与输入信号结合起来。

如果这是问题,那么我如何将chebyshev系数应用于输入数字信号?

2 个答案:

答案 0 :(得分:2)

对于cheb1ord和cheby1,频率在0和1之间归一化,1对应于采样频率的一半。你应该使用

获得你的wp和ws
wp=[fp1 fp2]/(samp/2);
ws=[fs1 fs2]/(samp/2);

其中samp是您的采样频率。

答案 1 :(得分:1)

我认为问题在于你的x信号:我不太清楚它是什么,但我可以告诉你它不是什么,而且是500Hz的输入信号。

我先定义时间向量,然后应用cos函数(我假设您以1500Hz采样):

f_input = 500; %Hz
t = 0:1/samp:1; % Time vector [0,1] sampled at 1500Hz
x = 10*cos(2*pi*t/f_input); % 500Hz input signal