Designfilt and bandstopfir adds +320dB for some reason

3 次查看(过去 30 天)
Good evening!
I am trying to create a set of FIR filters (using designfilt) to apply to some audio signals, and I'm having an issue.
When I try to use a 'bandstopfir', for some reason the whole signal is amplified around +320dB (while 'bandpassfir', 'lowpassfir' and 'highpassfir' are working correctly)
Here's a quick example of the code I'm using, and I added the resulting images of each of these cases showing the issue:
clear
filterObject1 = designfilt('bandstopfir','FilterOrder',301,...
'CutoffFrequency1',2000,'CutoffFrequency2',4000,'SampleRate',48000);
filterObject2 = designfilt('bandpassfir','FilterOrder',301,...
'CutoffFrequency1',2000,'CutoffFrequency2',4000,'SampleRate',48000);
Here are images using fvtool to show both filter responses:
Bandstop (incorrect behaviour):
Bandpass (expected behaviour):
Is this a bug, is the installation I'm using somehow broken, or am I doing something wrong?

采纳的回答

Paul
Paul 2024-6-10
Hi Andres,
I don't have a complete answer, just an observation. Here's the original design with order 301
filterObject1 = designfilt('bandstopfir','FilterOrder',301,...
'CutoffFrequency1',2000,'CutoffFrequency2',4000,'SampleRate',48000);
figure
freqz(filterObject1,0:5000,48000)
xlim([0 5])
We see the undesired result, and we see see that something peculiar is happening with the response at very low frequency.
Try again, but use an even filter order
filterObject1 = designfilt('bandstopfir','FilterOrder',300,...
'CutoffFrequency1',2000,'CutoffFrequency2',4000,'SampleRate',48000);
figure
freqz(filterObject1,0:5000,48000)
xlim([0 5])
If you experiment, you'll see that bandstopfir doesn't like an odd filter order (in combination with the other designfilt parameters and defaults). I'm not sure why that is the case, but maybe this observation can help you move forward.
  3 个评论
Paul
Paul 2024-6-11
编辑:Paul 2024-6-11
I'm not sure the low frequency response is wrong.
I suspect that a bandstop, FIR filter has particular symmetry requirements on its zeros, which can be met when there's an even number of zeros. When the filter order is odd, we have an extra, lonely, real zero, and that zero ends up z = 1 (at least for this set of design parameters) which governs the low frequency response. In fact, H(j*0) = 0 in theory, so that scaling you see from the ScalePassBand parameter to 320 dB is just numerical error because H(j*0) doesn't evaluate exactly to zero.
For a bandpass filter, that extra zero for the odd order case ends up at z = -1, so only has an effect on the high frequency response, which is very small anyway. It also wouldn't matter (much) if the extra zero is at z = 1 for for the same reason.
At present, I don't know why the extra zero is at z = 1 for bandstop and z = -1 for bandpass, or if that depends on the particular design method.
Andres
Andres 2024-6-11
I see.
That puts me somewhat at ease, since it would mean that it's just my lack of knowledge (which is easier to fix than an error in Matlab itself!)

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Filter Analysis 的更多信息

产品


版本

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by