搜索
bottom↓
回复: 0

【正点原子FPGA连载】第五十二章 基于FIR IP核的低通滤波器--摘自【正点原子】开拓者 FPGA 开发指南

[复制链接]

出0入234汤圆

发表于 2019-7-28 18:35:06 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2020-10-24 15:20 编辑

1)实验平台:正点原子开拓者FPGA开发板
2)平台购买地址:https://item.taobao.com/item.htm?id=579749209820
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-281143-1-1.html

4)对正点原子FPGA感兴趣的同学可以加群讨论:712557122  点击加入: O1CN01abYcZO23XsL4ETed4_!!230947266.png
5)关注正点原子公众号,获取最新资料更新

203429z6c3os33t8albi33.png
第五十二章 基于FIR IP核的低通滤波器实验


FIR 滤波器是有限冲激响应(Finite Impulse Response) 滤波器的简称, 它与 IIR(InfiniteImpulse Response, 无限冲击响应) 滤波器, 都是按照单位冲击响应 h(n) 的时间特性分类的两种基本的数字滤波器。 由于 FIR 滤波器没有反馈回路, 所以稳定性要好于 IIR 滤波器, 此外
FIR 滤波器还具有线性相位延迟的特点。 因此 FIR 滤波器在通信、 图像处理、 模式识别等领域都有着广泛的应用。 本章我们将使用 Quartus II 软件里的 FIR Compiler IP 核, 来对音频信号进行滤波, 作为一个简单的例程, 向大家介绍 Altera FIR Compiler IP 核的使用方法。
本章包括以下几个部分:
52.1 FIR Compiler IP 核简介
52.2 实验任务
52.3 硬件设计
52.4 程序设计
52.5 下载验证
52.1 FIR Compiler核简介
我们日常生活中经常用到的音乐播放器、 手机、 数码相机等电子设备中, 都可以看到数字信号处理(DSP) 的使用。 而 FIR 滤波器因为系统稳定、 易实现线性相位和允许多通道滤波等特点, 在数字信号处理领域受到广泛运用。
由于 FIR 滤波器处理的是数字信号, 所以模拟信号在进入 FIR 滤波器前, 需要先经过 AD器件进行模数转换, 将模拟信号转化为数字信号。 而为了让信号处理不发生失真, 信号的采样速度必须满足奈奎斯特定理, 一般取信号最高频率的 4 到 5 倍做为采样频率。
FIR 滤波器信号处理如下公式所示, 其中 x(n) 是输入的信号, h(n) 为 FIR 滤波系数,
y(n) 为滤波后的信号。 N 为 FIR 滤波器的抽头数, 滤波器阶数为 N-1。

image867.png

由上面的公式得到的一种 FIR 滤波器实现结构如下图所示, 主要由延迟单位ܼ-1、 乘法器、累加器组成。 这种滤波器被称为直接型 FIR 滤波器。

image869.png

图 52.1.1 直接型FIR滤波器


接下来我们举个简单的例子, 下图所示为一个低通滤波器的频率响应图, 通带(滤波器允许通过信号的频率范围) 边缘频率为 3Hz, 阻带(信号幅度衰减到极低水平的频率范围) 边缘频率为 5Hz, 3Hz 到 5Hz 之间为过渡带。 信号衰减 3dB 所对应的信号频率即为截止频率。

image870.png

图 52.1.2 一个低通滤波器频率响应曲线


我们在前面的内容里展示了 FIR 滤波器的信号处理公式、 基本实现结构、 频率响应曲线图。而 FIR 滤波器的具体实现涉及到数字信号处理相关的专业知识内容, 这里则主要讲解如何创建我们需要的 FIR 滤波器。 接下来我们了解一下设计一个简单的 FIR 滤波器需要设置的参数。
一个简单的 FIR 滤波器需要设置的参数:1) Filter Type(滤波器类型): 设置 FIR 滤波器的类型: 低通(Low pass)、 高通(high pass)、带通(band pass) 以及带阻(band stop) 等。 下图所示为 Filter Type 选项栏的下拉选项。

image871.png

图 52.1.3 选择滤波器类型


四种基础滤波器允许通过的信号频率如下图所示:

image872.png

图 52.1.4 四种基础滤波器的频率响应曲线2)


Window Type(窗函数类型) : FIR 滤波器的设计方法有很多种。 常用的有窗函数设计法(Window)、 等波纹设计法(Equiripple)和最小二乘法 (Least-Squares)等。 QuartusII 软件里的 FIR Compiler IP 核提供的设计方法是窗函数设计法。 我们可以选择的窗函数有矩形窗(Rectangular) 、 汉宁窗(Hanning) 、 哈明窗(Hamming) 、 布莱克曼窗(Blackman) 。 这里只需要简单了解一下有这些窗函数即可。 不同的窗函数有各自对应阻带最小衰减、 过渡带宽等特性, 这些都是设计滤波器时比较重要的参数。 阻带衰
减 dB 数越大, 对阻带信号的抑制作用越好。 过渡带宽与滤波器的阶数计算有关。 旁瓣峰值衰减绝对值越大, 滤波器性能越好。 在设置好窗函数类型后, 点击 Apply, 就能在 Frequence Response 窗口看到窗函数的频率响应曲线。
图 52.1.5 窗函数特性表
QQ截图20190528173642.png

image885.png


图 52.1.6 选择窗函数




3) Coefficient(抽头系数) : 抽头系数是滤波器系数的个数。 而滤波器的阶数比抽头数小 1。 滤波器的阶数直接影响滤波器的性能, 阶数越高, 性能越好, 相应在 FPGA 中实现该滤波器耗用的资源越多。 我们需要手动输入数值来确定系数。

image886.png

图 52.1.7 输入抽头系数4)


Sample Rate(采样率): 输入数据的采样率, 与 AD 的采样速率保持一致, 单位为 SPS(每秒采样次数 Samples per Second)。 其中 4.8E4 表示为 4.8 × 104, 也就是 48K。


image888.png

图 52.1.8 设置采样率


5) Cutoff Freq(截止频率) : 用于设置通过信号的频率界限。 如图为低通滤波器时, 截止频率则只有一个。 当保持输入信号的幅度不变, 改变频率使输出信号降至最大值的0.707 倍, 即用频响特性来表述即为-3dB 点处即为截止频率, 它是用来说明频率特性指标的一个特殊频率。

image889.png

图 52.1.9 设置截止频率


6) Input Bit Width (输入数据位宽) & Coefficient Bit Width(位宽) : 输入位宽指的是滤波器输入数据数据的位宽, 系数位宽为滤波器的系数位宽, 这两个位宽一起决定了滤波器输出数据的位宽。

image890.png

图 52.1.10 设置输入数据位宽及滤波器系数位宽


52.2 实验任务
本节实验任务是在“基于 FFT IP 核的音频频谱仪实验” 的基础上, 添加一个 FIR 低通滤波器,并通过按键来选择是否使用低通滤波器对 WM8978 输出的信号进行滤波,然后使用 AlteraFFT IP 核分析 WM8978 输出的音频信号的频谱, 并将频谱的幅度特性显示到 4.3 寸 RGB TFT-LCD上。
52.3 硬件设计
本实验的硬件设计原理与“基于 FFT IP 核的音频频谱仪实验” 完全相同, 请参考“基于FFT IP 核的音频频谱仪实验” 中的硬件设计部分。
52.4 程序设计
图 51.4.1 是根据本章实验任务画出的系统框图。 对比于“基于 FFT IP 核的音频频谱仪实验” , 我们在“基于 FFT IP 核的音频频谱仪实验” 的系统框图中添加了一个配置为低通滤波器的 FIR 模块。 当我们没有触碰开发板上的 KEY0 按键的时候, WM8978 模块输出的音频数据
先经过 FIR 模块进行滤波, 然后通过 FFT 模块做频谱分析, 得到频谱幅度数据。 当我们按下按键的时候, WM8978 模块输出的音频数据则直接通过 FFT 模块做频谱分析, 得到我们需要的频谱幅度数据。 得到的数据经过 LCD 模块处理后, 转变成频谱幅度图像, 显示在 RGB TFT-LCD上。

QQ截图20190528173937.png

图 52.4.1 IP核之FFT实验系统框图


程序中各模块端口及信号连接如图 51.4.2 所示:

image892.png

图 52.4.2 模块连接图


FPGA顶层(FFT_audio_lcd) 例化了以下五个模块: pll时钟模块(pll) 、 wm8978模块(wm8978_ctrl) 、 FIR模块(fir_lowpass) 、 FFT模块(FFT_top) 、 LCD模块(LCD_top) 。pll时钟模块(pll) : 本实验中WM8978模块所需要的时钟为12MHz, FFT模块的驱动时钟为
50MHz, 另外LCD模块需要50Mhz的时钟来处理、 缓存FFT模块输出的数据, 并在10MHz的驱动时钟下驱动RGB TFT-LCD显示。 因此需要一个PLL模块用于产生系统各个模块所需的时钟频率。wm8978 模块(wm8978_ctrl) : WM8978 控制模块主要完成 WM8978 的配置和 WM8978
接收的录音音频数据的接收处理, 以及 FPGA 发送的音频数据的发送处理。 有关该模块的详细介绍请大家参考“基于 FFT IP 核的音频频谱仪实验” 章节。FIR 模块(fir_lowpass) : FIR 模块负责对输入的音频数据进行低通滤波。FFT 模块(FFT_top) : FFT 模块将 wm8978 模块传输过来的音频信号进行缓存, 然后将其送给 FFT IP 核进行频谱分析。 接着计算 FFT IP 核输出复数的平方根, 即频谱的幅度值, 然后将其输出给 LCD 模块显示。 有关该模块的详细介绍请大家参考“基于 FFT IP 核的音频频谱仪实验” 章节。
LCD 模块(LCD_top) : LCD 模块取 FFT 模块传输过来的一帧数据的一半(也就是 64 个数据) 进行缓存, 并驱动 RGB TFT-LCD 液晶屏显示频谱。 有关该模块的详细介绍请大家参考“基于 FFT IP 核的音频频谱仪实验” 章节。
顶层模块的代码如下:
1 module FIR_audio_lcd(
2 input sys_clk,
3 input rst_n,
4 5
// WM8978 接口
6 output aud_mclk, // WM8978 接口
7 input aud_bclk,
8 input aud_lrc,
9 input aud_adcdat,
10 output aud_dacdat,
11 output aud_scl,
12 inout aud_sda,
13 //LCD 接口
14 output lcd_hs , //LCD 行同步信号
15 output lcd_vs , //LCD 场同步信号
16 output lcd_de , //LCD 数据输入使能
17 output [15:0] lcd_rgb , //LCD RGB565 颜色数据
18 output lcd_bl , //LCD 背光控制信号
19 output lcd_rst , //LCD 复位信号
20 output lcd_pclk , //LCD 采样时钟
21
22 input key0 //KEY0: 按下时显示原始音频频谱, 释放后显示滤波后频谱
23 );
24
25 //wire define
26 wire fft_sop;
27 wire fft_eop;
28 wire fft_valid;
29 wire [15:0] fft_data;
30 wire audio_valid;
31 wire [15:0] audio_data;
32 wire clk10M;
33 wire [15:0] audio_data_out;
34 wire [33:0] fir_odata_w;
35 wire fir_dvalid_w;
36
37 //*****************************************************
38 //** main code
39 //*****************************************************
40
41 //锁相环输出 FFT、 WM8978、 LCD 等模块的驱动时钟
42 pll pll_inst (
43 .inclk0 ( sys_clk ),
44 .c0 ( aud_mclk ),
45 .c1 (clk50M),
46 .c2 (clk10M)
47 );
48
49 //例化 WM8978 控制模块
50 wm8978_ctrl u_wm8978_ctrl(
51 //system clock
52 .clk (clk50M ), // 时钟信号
53 .rst_n (rst_n ), // 复位信号
54 //wm8978 interface
55 //audio interface(master mode)
56 .aud_bclk (aud_bclk ), // WM8978 位时钟
57 .aud_lrc (aud_lrc ), // 对齐信号
58 .aud_adcdat (aud_adcdat ), // 音频输入
59 .aud_dacdat (aud_dacdat ), // 音频输出
60 //control interface
61 .aud_scl (aud_scl ), // WM8978 的 SCL 信号
62 .aud_sda (aud_sda ), // WM8978 的 SDA 信号
63 //user interface
64 .dac_data (audio_data_out ), // 输出的音频数据
65 .adc_data (audio_data ), // 输入的音频数据
66 .rx_done (audio_valid), // 一次接收完成
67 .tx_done () // 一次发送完成
68 );
69
70 assign audio_data_out = key0 ? fir_odata_w[33:18]:audio_data;
71
72 fir_lowpass u_fir_lowpass (
73 .clk (aud_bclk),
74 .reset_n (rst_n),
75
76 .ast_sink_data (audio_data),
77 .ast_sink_valid (audio_valid),
78 .ast_sink_error (),
79 .ast_sink_ready (),
80
81 .ast_source_ready (1'b1),
82 .ast_source_data (fir_odata_w),
83 .ast_source_valid (fir_dvalid_w),
84 .ast_source_error (),
85 );
86
87 //利用 ip 核实现的 FFT
88 FFT_top FFT_u(
89 .clk_50m (clk50M),
90 .rst_n (rst_n),
91
92 .audio_clk (aud_bclk),
93 .audio_valid (fir_dvalid_w),
94 .audio_data (audio_data_out),
95
96 .data_sop (fft_sop),
97 .data_eop (fft_eop),
98 .data_valid (fft_valid),
99 .sqrt_data (fft_data)
100 );
101
102 //MCU_LCD 显示模块
103 LCD_top LCD_u(
104 .clk50M (clk50M),
105 .rst_n (rst_n),
106 .clk10M (clk10M),
107
108 .lcd_hs (lcd_hs),
109 .lcd_vs (lcd_vs),
110 .lcd_de (lcd_de),
111 .lcd_rgb (lcd_rgb),
112 .lcd_bl (lcd_bl),
113 .lcd_rst (lcd_rst),
114 .lcd_pclk (lcd_pclk),
115
116 .fft_valid (fft_valid),
117 .fft_sop (fft_sop),
118 .fft_eop (fft_eop),
119 .fft_data (fft_data)
120 );
121
122 endmodule
相比于“基于 FFT IP 核的音频频谱仪实验” , 基于 FIR IP 核的低通滤波器实验只是在顶层模块加了一个 FIR 低通滤波器的 IP 核, 以及对 FFT 模块数据来源的选择。 如代码中第 72行至第 85 行, 及第 70 行所示。 接下来我们来讲解如何创建及使用 FIR 低通滤波器。
我们在 Quartus II 软件的菜单栏中找到【Tools】 →【MegaWizard Plug-In Manager】 按钮并点击打开, Tool 工具栏打开页面及打开后弹出的页面如下所示:
image893.png


图 52.4.3 工具栏打开IP核界面



image894.png

图 52.4.4 创建IP核向导页面


在该页面中, 可以看到有三个选项, 第一个是创建一个新的 IP 核, 第二个是编辑一个已经创建好的 IP 核, 第三个是复制一个已经创建好的 IP 核。 因为我们这里是首次创建 IP 核, 因此直接选择默认的第一个选项, 然后点击【Next>】 , 进入下图所示的界面:

image895.png

图 52.4.5 选择FIR Compiler IP核界面


在该页面中, 我们可以在 DSP/Filters 下找到 FIR Compiler v13.1 IP 核, 也可以直接在搜索框中输入 fir 找到它。 我们找到 FIR Compiler v13.1 IP 核以后, 单击选中它, 然后我们需要为 ALTPLLIP 核选择保存的路径及名称, 我们在工程路径 par/ipcore 文件夹下新建一个 FIR 文件夹, 用于
存放工程中用到的 IP 核, 然后在“What name do you want for the output file”一栏中输入 IP 存放的路径及名称, 这里我们命名为 fir_lowpass 并且选择创建的 IP 核代码为 Verilog HDL。 需要注意的是, 如果想要对 IP 核进行仿真, 需要将 IP 核存放目录设置为目录, 也就是将 IP 核存放在
par 文件夹下。 完成这些设置以后, 我们点击【Next>】 , 进入下图所示的界面。
image896.png


图 52.4.6 FIR IP核主界面


FIR Compiler v13.1 IP 核的主界面与 FFT IP 核的主界面是一样的。 我们点击 step1:Parameterize, 进入如下所示的界面, 对 IP 核进行参数配置。
image897.png


图 52.4.7 FIR IP核配置界面



由于 FIR Compiler v13.1 IP 核处理的是 wm8978 输出一路 16 位有符号数数据。所以,Numberof input channels 选项(输入通道数) 保持为 1 ; Input Number System 选项(输入数据系统)保持为 Signed Binary; Input Bit Width(输入位宽) 选项设置为 16; 输出基于实际的系数(Actual
Coefficients) , 也就是与 Input Bit Width(输入位宽) 和 Bit Width(系数) 其它选项保持默认即可。 接着点击 Edit Coefficient Set 选项进入如下所示界面, 对滤波器参数进行设置。

image898.png

图 52.4.8 IP核参数设置界面


本次实验中, 我们需要设置的是低通滤波器, 于是 Filter Type(滤波器类型) 保持 Low Pass不变; 由于 wm8978 的采样速率为 48K, 所以 Sample Rate 设置为 4.8E4; Coefficients(抽头系数) 越大, 滤波的效果越好, 但是耗用的资源越多, 这里设置数值为 32; 本次实验将使用到
低通滤波器, 于是暂设置截止频率为 5KHz, 在 Cutoff Freq.1 框中输入 5E3; 接下来就要选择要用到的窗函数了。 窗函数选项栏里默认的是矩形窗(Rectangular) 。 根据实际需要, 选择符合需求的窗函数即可, 没有固定的选项。 Window Type(窗函数类型) 选项栏中共有 4 个选项,
选择一种窗函数后, 点击 apply 按键, 就会在 Frequency Response(频率响应) 界面显示对应窗函数的滤波器频率响应曲线。 然后根据四种频率响应曲线选择最符合需求的窗函数。 这里因为 Hamming(哈明窗) 的频率响应曲线到达截止频率时, 衰减了 60dB 左右, 且频率响应曲线
下降得更快。 所以在 Window Type 选项栏中选择 Hamming 窗函数。 设置完成后的界面如下所

image899.png

图 52.4.9 设置完成后的界面


现在讲解一下频率响应图中横纵坐标代表的物理意义, 其中的横坐标 Frequency 表示的是归一化频率, 纵坐标 dB 代表的是衰减指标。 我们知道采样频率的一半为奈奎斯特频率, 而归一化频率= 真实频率奈奎斯特频率。 所以图中的 0.1 代表的是 48KHz÷2×0.1=2.4KHz; 衰减指标定义为 20log
(Vout/Vin) 。 图中-20dB 对应的是: 20log(Vout/Vin) = -20, 因此 Vout=0.1Vin, 所以信号幅值衰减到原来幅度的 0.1。然后依次点击 OK, 回到图 52.4.7 所示的界面, 然后点击 Finish 回到图 52.4.6 所在的界面。 如下所示, 点击 step3: Generate, 生成滤波器文件。 这里提醒一下, 界面有可能持续很长时间保持不变, 如图 52.4.11 所示。 这时点击 Cancel, 然后重新点击 step3: Generate。 重复多次最终就能生成成功。
image903.png


图 52.4.10 生成滤波器文件选项



image904.png

图 52.4.11 滤波器生成界面


滤波器生成成功后的界面如下图所示, 接着点击 Exit 按键就完成 FIR 滤波器 IP 核的配置与生成了。

image905.png

图 52.4.12 滤波器生成成功界面


接下来我们来了解一下怎么使用这个 IP 核。 我们在顶层代码的第 72 行至第 85 行例化了
FIR Compiler 核, 代码如下所示。
72 fir_lowpass u_fir_lowpass (
73 .clk (aud_bclk),
74 .reset_n (rst_n),
75
76 .ast_sink_data (audio_data),
77 .ast_sink_valid (audio_valid),
78 .ast_sink_error (),
79 .ast_sink_ready (),
80
81 .ast_source_ready (1'b1),
82 .ast_source_data (fir_odata_w),
83 .ast_source_valid (fir_dvalid_w),
84 .ast_source_error (),
85 );
信号定义如下表所示, 与 FFT IP 核一样, 都是 Avalon-ST 数据接口。
图 52.4.13 滤波器信号描述


QQ截图20190528174200.png

QQ截图20190528174211.png







时序图如下所示, 一直保持 ast_source_ready 信号为高电平。 在复位信号 reset_n 信号、ast_sink_ready 为高电平的时候, 拉高 ast_sink_valid 信号, 并给 FIR 滤波器输入数据, 滤波器就开始处理数据了。 当滤波器拉高 ast_source_valid 信号的时候, FIR 滤波器就开始输出滤波处理后的数据。

image906.png

图 52.4.14 滤波器工作时序图


可以看到在代码第 75 行至 85 行, 为了降低操作 IP 核的难度, 没有理会 ast_sink_ready 信号的状态, 如代码第 79 行所示 。
52.5 下载验证
首先我们打开基于 FIR IP 核的低通滤波器实验工程, 在工程所在的路径下打开FIR_audio_lcd\par 文件夹, 在里面找到“FIR_audio_lcd.qpf” 并双击打开。 注意工程所在的路径名只能由字母、 数字以及下划线组成, 不能出现中文、 空格以及特殊字符等。 工程打开后如图 1.5.1 示:

image907.png

图 52.5.1 IP核之FIR实验工程


将下载器一端连接电脑, 另一端与开发板上对应端口连接, 然后用音频线连接电脑和开发板, 最后连接电源线并打开电源开关。点击工具栏中的“Programmer” 图标打开下载界面, 通过点击“Add File” 按钮选择FIR_audio_lcd\par\output_files 目录下的“FIR_audio_lcd.qpf” 文件。 开发板电源打开后, 在程 序 下 载 界 面 点 击“Hardware Setup” , 在 弹 出 的 对 话 框 中 选 择 当 前 的 硬 件 连 接为“USB-Blaster[USB-0]” 。 然后点击“Start” 将工程编译完成后得到的 sof 文件下载到开发板中,如下图所示:

image909.png

图 52.5.2 下载界面


然后, 打开 FIR_audio_lcd\音频文件目录下的 noise_96k.wav 文件, 我们可以在 LCD 上看到如下图所示经过 FIR 滤波器滤波后的频谱图:

QQ截图20190528174302.png

图 52.5.3 频谱图



按下按键后, 频谱幅度图像如下所示, 未经过滤波的幅度图像的噪声要大很多。

QQ截图20190528174314.png

图 52.5.4 未经滤波的频谱幅度图



阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 01:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表