我的问题很简单,我设计了幅度响应,我想找到相应的最小相位滤波器。我正在使用下面的代码,除非有我的眼睛不想看到的错误,否则我对方法非常有信心。
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)
我没有看到任何意外。