# FIR | 手把手教你写FIR低通滤波器代码

FIR滤波器

FIR滤波器，全称为Finite Impulse Response，即有限脉冲响应。滤波器的系统函数为：

FIR低通滤波器的verilog实现

1、输入波形数据

2、滤波器系数b。

```%下面函数重新新建一个脚本文件
%需要调用了如下函数，将有符号数转换成补码
function b = signed2unsigned(a,wl);  %a为输入数据，wl为位宽
%This function covert an signed integer number into an unsinged integer
%number. a is the input vector while wl means the width of input number;
%Example: a = [-2,-1,0,1];
%signed2unsigned(a,3); THEN return [2,3,0,1]
k = 2^(wl)*(a<0);
b = k + a;
b = fix(b+0.5)
for i = 1:length(a)
if (b(i) == 65536)
b(i) = 0;
else ;
end
end
end```

https://mp.weixin.qq.com/s/UpSJIFBk0RBvoQEmbIvjVg

```%产生两个正弦信号sin(x)和sin(8x)叠加后的信号，取64个点，将信号放大，
%转换成无符号数据，存入ROM中作为信号源
% clear all
clc
x = 0 : 2*pi/63 :2*pi;
y = sin(x)+sin(8*x);
plot(x,sin(x),'r') %红色为sin(x)函数
hold on
plot(x,sin(8*x),'g')   %绿色为sin(8x)函数
hold on
plot(x,y,'b') %蓝色为生成的混合信号
grid
hold on;
y = (y/2) * 32768;%将信号放大32768倍 2^15
b = signed2unsigned(y,16);  %有转换为补码输入
fid = fopen('sinx.txt','wt'); %将信号写入一个.txt文件中
fprintf(fid,'%16.0f\n',b);
fclose(fid);

in = sin(x)+sin(8*x);

coeff =[ 0.123642574470134
0.0764392722067448
0.0929760805141543
0.106348480961932
0.114819991146986
0.117786188756463
0.114819991146986
0.106348480961932
0.0929760805141543
0.0764392722067448
0.123642574470134];

out =conv(in,coeff);%卷积滤波

subplot(2,1,1);
plot(in);
xlabel('滤波前');
axis([0,100,-2,2]);
subplot(2,1,2);
plot(out);
xlabel('滤波后');
axis([0,100,-1,1]);

%下面函数重新新建一个脚本文件
%需要调用了如下函数，将有符号数转换成补码
function b = signed2unsigned(a,wl);  %a为输入数据，wl为位宽
%This function covert an signed integer number into an unsinged integer
%number. a is the input vector while wl means the width of input number;
%Example: a = [-2,-1,0,1];
%signed2unsigned(a,3); THEN return [2,3,0,1]
k = 2^(wl)*(a<0);
b = k + a;
b = fix(b+0.5)
for i = 1:length(a)
if (b(i) == 65536)
b(i) = 0;
else ;
end
end
end ```

```clear;
clc;
%采样速率200kHz，所以步进值为1/20000，共1s数据
fs=1/2e5;
x=0:2*pi*fs:0.1;  %0.1s
%将10kHz与45kHz正弦波叠加
f0=10e3;
f1=45e3;
y=sin(f0.*x)+sin(f1.*x);
y2= signed2unsigned(y1,16);  %有转换为补码输入 signed 15bit-->16bit unsigned
fid=fopen('./sin_mix.txt','w');
fprintf(fid,'memory_initialization_vector=\r\n');

for i=1:1024
fprintf(fid,'%16.0f\r\n',y2(i));
%    fprintf(fid,'%4d',yn(i));
end
fclose(fid);
plot(x,y1)

%下面函数重新新建一个脚本文件
%需要调用了如下函数，将有符号数转换成补码
function b = signed2unsigned(a,wl);  %a为输入数据，wl为位宽
%This function covert an signed integer number into an unsinged integer
%number. a is the input vector while wl means the width of input number;
%Example: a = [-2,-1,0,1];
%signed2unsigned(a,3); THEN return [2,3,0,1]
k = 2^(wl)*(a<0);
b = k + a;
b = fix(b+0.5)
for i = 1:length(a)
if (b(i) == 65536)
b(i) = 0;
else ;
end
end
end ```

```//////////////////////////////////////////////////////////////////////////////////
// Engineer: XS
// Create Date: 2021/06/23 10:46:17
// Design Name: 根究FPGA
// Module Name: FIR_top
//////////////////////////////////////////////////////////////////////////////////
module FIR_top2(
input clk,
input rst_n,
output signed [15:0] douta,
output signed [15:0] dout
);

always@(posedge clk or negedge rst_n)
if(~rst_n)
else

blk_mem_gen_0 u0 (
.clka(clk),    // input wire clka
.douta(douta)  // output wire [15 : 0] douta
);

reg signed[15:0]z_pipeline[0:10];
parameter signed coef_0=-45,
coef_1=19,
coef_2=50,
coef_3=90,
coef_4=122,
coef_5=135,
coef_6=122,
coef_7=90,
coef_8=50,
coef_9=19,
coef_10=-45;
/*
11个coe系数与10级缓存，共11个输入数据相乘
*/
wire [24:0] buf0=z_pipeline[0]*coef_0;
wire [24:0] buf1=z_pipeline[1]*coef_1;
wire [24:0] buf2=z_pipeline[2]*coef_2;
wire [24:0] buf3=z_pipeline[3]*coef_3;
wire [24:0] buf4=z_pipeline[4]*coef_4;
wire [24:0] buf5=z_pipeline[5]*coef_5;
wire [24:0] buf6=z_pipeline[6]*coef_6;
wire [24:0] buf7=z_pipeline[7]*coef_7;
wire [24:0] buf8=z_pipeline[8]*coef_8;
wire [24:0] buf9=z_pipeline[9]*coef_9;
wire [24:0] buf10=z_pipeline[10]*coef_10;

always@(posedge clk or negedge rst_n)
if(~rst_n) begin
z_pipeline[0]<=0;
z_pipeline[1]<=0;
z_pipeline[2]<=0;
z_pipeline[3]<=0;
z_pipeline[4]<=0;
z_pipeline[5]<=0;
z_pipeline[6]<=0;
z_pipeline[7]<=0;
z_pipeline[8]<=0;
z_pipeline[9]<=0;
z_pipeline[10]<=0;
end
else begin
z_pipeline[0]<=douta;
z_pipeline[1]<=z_pipeline[0];
z_pipeline[2]<=z_pipeline[1];
z_pipeline[3]<=z_pipeline[2];
z_pipeline[4]<=z_pipeline[3];
z_pipeline[5]<=z_pipeline[4];
z_pipeline[6]<=z_pipeline[5];
z_pipeline[7]<=z_pipeline[6];
z_pipeline[8]<=z_pipeline[7];
z_pipeline[9]<=z_pipeline[8];
z_pipeline[10]<=z_pipeline[9];
end
wire signed [31:0] sum=buf0+buf1+buf2+buf3+buf4+buf5+buf6+buf7+buf8+buf9+buf10;
assign  dout = sum >>> 9;
endmodule```

0 条评论

• ### 【安富莱二代示波器教程】第10章 示波器设计—数字信号处理

本章节为大家讲解二代示波器中用到的FFT和FIR。单纯从应用上来说，比较省事，调用API函数即可，从学习的角度来说，需要大家花点精力。

• ### 【DSP教程】第35章 FIR有限冲击响应滤波器设计

FIR滤波器设计到的内容比较多，本章节主要经行了总结性的介绍，以帮助没有数字信号处理基础的读者能够有个整体的认识，有了这个整体的认识之后再去查阅相关资料可以到达...

• ### 手把手教系列之FIR滤波器设计

【导读】：前面的文章介绍了移动平均滤波器、IIR滤波器、梳状滤波器，今天来谈谈FIR滤波器的设计实现。

• ### FPGA仿真必备——Matlab生成.mif/.txt/.coe【Testbench】【Modelsim】【Matlab】

.mif 和 .coe 是 FPGA 设计中常用的存储文件，用于 ROM、RAM 等存储器数据的加载，常见的还用在 DDS 信号发生器和 FIR 滤波器的设计中...

两个月在做数字信号处理方面的工作，也是从一个小白刚刚起步，这两天才把fir滤波器给跑通，写文记录下。希望大家欢迎，多多支持。这篇文章写得辛苦，仅仅Word文件就...

• ### matlab与FPGA数字滤波器设计（5）—— Verilog 串行 FIR 滤波器

在 FPGA 实现 FIR 滤波器时，最常用的是直接型结构，简单方便，在实现直接型结构时，可以选择串行结构/并行结构/分布式结构。

• ### matlab与FPGA数字滤波器设计（6）—— Vivado 中使用 Verilog 实现并行 FIR 滤波器/截位操作

在 FPGA 实现 FIR 滤波器时，最常用的是直接型结构，简单方便，在实现直接型结构时，可以选择串行结构/并行结构/分布式结构。

• ### P2P接口串行FIR设计

配置接口使用寄存器组实现，掉电丢失，因此每次使用之前需要进行配置FIR参数，配置接口时序如下所示：

• ### FIR数字滤波器设计（下）

今天给大侠带来FIR数字滤波器设计，由于篇幅较长，分三篇。今天带来第三篇，FIR数字滤波器设计，包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于...

• ### FIR数字滤波器设计（下）

今天给大侠带来FIR数字滤波器设计，由于篇幅较长，分三篇。今天带来第三篇，FIR数字滤波器设计，包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于...

• ### 基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成

大侠好，欢迎来到FPGA技术江湖，江湖偌大，相见即是缘分。大侠可以关注FPGA技术江湖，在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源，或者一起煮酒言欢。...

• ### FIR数字滤波器设计（上）

今天给大侠带来FIR数字滤波器设计，由于篇幅较长，分三篇。今天带来第一篇，数字滤波器介绍，包括数字滤波器概述、分类以及设计指标。话不多说，上货。

• ### matlab与FPGA数字滤波器设计（4）—— Vivado DDS 与 FIR IP核设计 FIR 数字滤波器系统

本讲使用两个 DDS 产生待滤波的信号和matlab产生带滤波信号，结合 FIR 滤波器搭建一个信号产生及滤波的系统，并编写 testbench 进行仿真分析，...

• ### FIR数字滤波器设计（上）

今天给大侠带来FIR数字滤波器设计，由于篇幅较长，分三篇。今天带来第一篇，数字滤波器介绍，包括数字滤波器概述、分类以及设计指标。话不多说，上货。

• ### FPGA项目开发：基于FIR滤波器的带限白噪声的设计

大侠好，最近本媛比较忙，没有时间更新。时间太长，怕大家忘了我，今天我来了，今天由“82年的程序媛”本媛给大侠带来基于FIR滤波器的带限白噪声的设计，后续本媛还会...