获得所需过零的一种方法是进行混合设计。
首先使用与通带和阻带同等权重的 Parks-McLellan/Remez 半带滤波器。由于它是一个半带滤波器,因此它在交替样本处将具有零。然后,您可以通过频域中的零填充通过 sin(x)/x 对时域进行插值。
示例:创建一个 fs/12 低通滤波器,每 6 个样本过零。
% prototype Remez filter
taps=18;
b = remez(taps,[0 .4 .6 1],[1 1 0 0])';
% force halfband condition of zeros at every other sample
b(2:2:end)=0; b(taps/2+1)=.5;
% zero pad the time domain to give the Gibbs ripple some deadspace
B=fft(b,4*(taps+1) );
% split the frequency domain into two halves, split the Nyquist bin
Blo = [ B(1:length(B)/2) 0.5*B(length(B)/2+1) ];
Bhi = [ 0.5*B(length(B)/2+1) B(length(B)/2+2:length(B)) ];
% insert padding at pi to increase size 3x
Bpad = [ Blo zeros(1,3*length(B)-length(Blo)-length(Bhi) ) Bhi];
bint = real( ifft(Bpad) ); % this has zeros every 6 samples
就阻带/通带纹波而言,生成的滤波器接近原型,但不如原型好。sin(x)/x 插值确实引入了一些低级振铃。您可能需要稍微过度设计原型滤波器,以在插值滤波器中获得所需的衰减水平。