这是我的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系数应用于输入数字信号?
答案 0 :(得分:2)
对于cheb1ord和cheby1,频率在0和1之间归一化,1对应于采样频率的一半。你应该使用
获得你的wp和wswp=[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