使用希尔伯特变换无法达到最小相位

信息处理 数字滤波器 希尔伯特变换 最小相位
2022-02-07 15:01:49

我的问题很简单,我设计了幅度响应,我想找到相应的最小相位滤波器。我正在使用下面的代码,除非有我的眼睛不想看到的错误,否则我对方法非常有信心。

nbTaps = 100;
fs = 96000;
desiredMagn_dB = [0 0 -100 -100];
f = [0 24000 26000 fs/2];

FIRFreq = (0:nbTaps/2)*fs / nbTaps;

FIRMagn = interp1(f, 10.^(desiredMagn_dB./20), FIRFreq);
FIRMagn = [FIRMagn fliplr(FIRMagn(2:end-1))];

minPhase = -imag(hilbert(log(FIRMagn)));

freqResp = FIRMagn.*exp(1i.*minPhase);

FIRCoefs = ifft(freqResp, 'symmetric');

然而,我的过滤器没有最小相位,因为我在单位圆之外有零。我有点迷茫,在这里,我想明白为什么会这样?还是我错了?

从 r bj 编辑:

nbTaps = 16384;
fs = 96000;
desiredMagn_dB = [0 0 -100 -100];
f = [0 24000 26000 fs/2];

FIRFreq = (0:nbTaps/2)*fs / nbTaps;

FIRMagn = interp1(f, 10.^(desiredMagn_dB./20), FIRFreq);
FIRMagn = [FIRMagn fliplr(FIRMagn(2:end-1))];

minPhase = -imag(hilbert(log(FIRMagn)));

freqResp = FIRMagn.*exp(1i.*minPhase);

FIRCoefs = ifft(freqResp, 'symmetric');

figure(1)
plot(20*log10(FIRMagn))
figure(2)
plot(minPhase)
figure(3)
plot(FIRCoefs)

我没有看到任何意外。

1个回答
  1. 更多水龙头。对于如此陡峭的过滤器,您没有足够的水龙头。如果需要,从 8192 左右开始大尺寸切割到所需的精度
  2. 由于选项卡数量较少,您会看到“圆形”希尔伯特变换的效果。参见例如:http ://andrewduncan.net/air/
  3. 你怎么知道你在单位圆之外有零?计算高阶多项式的根是一个数值难题,使用像“roots()”这样的 Matlab 函数会经常得到不准确或明显错误的结果。