Matlab中自带工具箱FDATool也能很方便快速的实现滤波器系数h的整定,可以方便应用到嵌入式(大多数基于FIR滤波设计)、FPGA、DSP里的FIR系数当中,本文将描述基于MATLAB下FDATool生成FIR的实用方法。
FDATool打开,可以直接在命令窗口键入fdatool回车即可启动,也可以通过UI界面打开,操作如下:
![fc2b3042bf75aeba4b6623660ec235d9.png](https://i-blog.csdnimg.cn/blog_migrate/146586935d86e2ecc85923a6999b59ab.jpeg)
这里通过图解快速进行一个FIR设计一个低通滤波器,
- 滤波类型(Filter Type)= Lowpass
2. 采样率(Fs) = 1000HZ
3. 滤波阶数(order) = 16(阶数越大,滤波品质越好,但相对滞后越大)
4. 密度因子( Density Factor)= order+1 = 17
5. Fpass(通频带)= 95HZ
6. Fstop(截止带)= 105HZ
7. Wpass(通频带宽增益期望)= 1DB
8. Wstop(截止带宽增益期望)= -40DB
具体FDA设计图:
![7cbe73fe5b33013824d72aa45a85b2f0.png](https://i-blog.csdnimg.cn/blog_migrate/53c131ebe67f6d747cdb451c066955e6.jpeg)
生成FIR系数,笔者建议,直接生成ASCII复制出来放到需要运行的工程。File→Export然后保存ASCII格式,这时候MATLAB将会自动打开该文件(也可以通过记事本打开)。
![8750d8cc501d044ea584e9120e8c7eb5.png](https://i-blog.csdnimg.cn/blog_migrate/9e743ec67bdcfa7a1fb266e54e5cadeb.jpeg)
![85adfb9aa90304765c600f8314eb6d42.png](https://i-blog.csdnimg.cn/blog_migrate/fa9534d8d82f48f8a0810b0843c45c2f.jpeg)
最后,用该系数进行FIR滤波处理,详见代码(强烈建议将FIR的h系数拷贝到工程里面):
clear all
clc
%FIR h 1000HZ lopass Fpass = 95HZ Fstop = 105HZ
h = [0.013645230215860393307991671463241800666
0.020864467885159766052938223879209544975
0.033805656970854927600989014990773284808
0.048945673554616375700021535521955229342
0.064942719858356201534377305506495758891
0.080076064347642750274047784841968677938
0.092538395154703717571109677919594105333
0.100751060201654682457750311641575535759
0.103616541625144178984108123131591128185
0.100751060201654682457750311641575535759
0.092538395154703717571109677919594105333
0.080076064347642750274047784841968677938
0.064942719858356201534377305506495758891
0.048945673554616375700021535521955229342
0.033805656970854927600989014990773284808
0.020864467885159766052938223879209544975
0.013645230215860393307991671463241800666];
Fs = 1000; % Sampling frequency HZ
T = 1/Fs; % Sampling period S
N = 2000; % Number of signal
t = (0:N-1)*T; % Time vector
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
y1 = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
%利用h系数进行FIR滤波
y2 = filter(h',1,y1);
%波形快速傅里叶运算
Y1 = fft(y1);
Y2 = fft(y2);
%计算双侧频谱P2
P1_2 = abs(Y1/N);
%取出前面一半进行分析
P1_1 = P1_2(1:N/2+1);
%最终转化为单侧幅频
P1_1(2:end-1) = 2*P1_1(2:end-1);
%计算双侧频谱P2
P2_2 = abs(Y2/N);
%取出前面一半进行分析
P2_1 = P2_2(1:N/2+1);
%最终转化为单侧幅频
P2_1(2:end-1) = 2*P2_1(2:end-1);
%确定频域映射,转化为HZ
f = Fs*(0:(N/2))/N;
subplot(4,1,1);
plot(t,y1);
title('原始信号0.7幅值50HZ,1幅值120HZ')
subplot(4,1,2);
plot(f,P1_1);
title('原始信号FFT分析')
subplot(4,1,3);
plot(t,y2);
title('FIR滤波后波形')
subplot(4,1,4);
plot(f,P2_1);
title('FIR滤波后FFT')
![1cace4ad5731170caf6f5548c050037d.png](https://i-blog.csdnimg.cn/blog_migrate/33931d5ca7f6c7dec499e361c482639e.jpeg)