如何使用Matlab制作简单的FIR滤波器?

5

我该如何使用Matlab制作一个简单的低通FIR滤波器(不使用内置函数)?

问题示例:

Implement a FIR LPF with cut-off frequency 250Hz

可能需要给出采样频率...

解决方案尝试或我已经知道的内容:

x = [...] -> input signal
A = 1; -> Since this is FIR
B = [?????]
y = filter(B, A, x) -> Output signal

据我所知,B应该包含FIR滤波器的系数。但是,如果我只有截止频率,如何计算这些系数呢?
3个回答

11
最简单的滤波器是“窗口化sinc”滤波器:
fs = 44100;
cutoff = 250;
t = -256:256;  % This will be a 513-tap filter
r = 2*cutoff/fs;
B = sinc(r*t).*r .* blackman(length(t))';
freqz(B);

滤波器的长度(参见t=...)控制过渡带的宽度。在这种情况下,cutoff是-6 dB点。 blackman是一种流行的窗口名称。您可以查看维基百科页面了解有关窗口函数的更多信息。它们基本上在过渡带宽度和阻带抑制之间具有不同的权衡。


我不能使用内置的 FIR 函数,因为我已经在问题中声明了... - Cihan Keser
抱歉,我改变了我的答案。 - sellibitze

0
如果你想要不同形状的幅度谱,就按照sellibitze建议的去做,只是用所需幅度响应的逆傅里叶变换的实部替换sinc函数(延迟以获得因果对称脉冲响应)。

0

由于LTI滤波器的系数是时域脉冲响应,因此您可以通过指定幅度向量和相位向量在Matlab中创建频率响应,然后将它们进行逆FFT以获取系数。例如,像这样:A = [1 .9 .8 .5 .2 .1 0]theta=[0 0 0 0 0 0 0],然后H=A.*exp(j*theta),最后coefs = ifft(H)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接