龙空技术网

正点原子开拓者FPGA开发板资料连载第五十二章 低通滤波器实验

正点原子日常 295

前言:

目前大家对“音频信号滤波算法”大概比较关心,你们都需要剖析一些“音频信号滤波算法”的相关文章。那么小编同时在网上汇集了一些关于“音频信号滤波算法””的相关知识,希望朋友们能喜欢,你们一起来学习一下吧!

1)实验平台:正点原子开拓者FPGA 开发板

2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:

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

FIR滤波器是有限冲激响应(Finite Impulse Response)滤波器的简称,它与IIR(Infinite Impulse

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 下载验证

FIR Compiler核简介

我们日常生活中经常用到的音乐播放器、手机、数码相机等电子设备中,都可以看到数字

信号处理(DSP)的使用。而 FIR 滤波器因为系统稳定、易实现线性相位和允许多通道滤波等

特点,在数字信号处理领域受到广泛运用。

由于 FIR 滤波器处理的是数字信号,所以模拟信号在进入 FIR 滤波器前,需要先经过 AD

器件进行模数转换,将模拟信号转化为数字信号。而为了让信号处理不发生失真,信号的采样

速度必须满足奈奎斯特定理,一般取信号最高频率的 4 到 5 倍做为采样频率。

FIR 滤波器信号处理如下公式所示,其中 x(n)是输入的信号,h(n)为 FIR 滤波系数,

y(n)为滤波后的信号。N 为 FIR 滤波器的抽头数,滤波器阶数为 N-1。

(n) = ∑ ℎ() × ( − )

−1

=0

由上面的公式得到的一种 FIR 滤波器实现结构如下图所示,主要由延迟单位−1、乘法器、

累加器组成。这种滤波器被称为直接型 FIR 滤波器。

图 52.1.1 直接型FIR滤波器

接下来我们举个简单的例子,下图所示为一个低通滤波器的频率响应图,通带(滤波器允

许通过信号的频率范围)边缘频率为 3Hz,阻带(信号幅度衰减到极低水平的频率范围)边缘

频率为 5Hz,3Hz 到 5Hz 之间为过渡带。信号衰减 3dB 所对应的信号频率即为截止频率。

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

我们在前面的内容里展示了 FIR 滤波器的信号处理公式、基本实现结构、频率响应曲线图。

而 FIR 滤波器的具体实现涉及到数字信号处理相关的专业知识内容,这里则主要讲解如何创建

我们需要的 FIR 滤波器。接下来我们了解一下设计一个简单的 FIR 滤波器需要设置的参数。

一个简单的 FIR 滤波器需要设置的参数:

1) Filter Type(滤波器类型):设置 FIR 滤波器的类型:低通(Low pass)、高通(high

pass)、带通(band pass)以及带阻(band stop)等。下图所示为 Filter Type 选项栏

的下拉选项。

图 52.1.3 选择滤波器类型

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

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

2) Window Type(窗函数类型):FIR 滤波器的设计方法有很多种。常用的有窗函数设计

法(Window)、等波纹设计法(Equiripple)和最小二乘法 (Least-Squares)等。Quartus

II 软件里的 FIR Compiler IP 核提供的设计方法是窗函数设计法。我们可以选择的窗函数有矩形窗(Rectangular)、汉宁窗(Hanning)、哈明窗(Hamming)、布莱克曼窗

(Blackman)。这里只需要简单了解一下有这些窗函数即可。不同的窗函数有各自对

应阻带最小衰减、过渡带宽等特性,这些都是设计滤波器时比较重要的参数。阻带衰

减 dB 数越大,对阻带信号的抑制作用越好。过渡带宽与滤波器的阶数计算有关。旁

瓣峰值衰减绝对值越大,滤波器性能越好。在设置好窗函数类型后,点击 Apply,就能

在 Frequence Response 窗口看到窗函数的频率响应曲线。

图 52.1.5 窗函数特性表

图 52.1.6 选择窗函数

3) Coefficient(抽头系数):抽头系数是滤波器系数的个数。而滤波器的阶数比抽头数小

1。滤波器的阶数直接影响滤波器的性能,阶数越高,性能越好,相应在 FPGA 中实现

该滤波器耗用的资源越多。我们需要手动输入数值来确定系数。

图 52.1.7 输入抽头系数

4) Sample Rate(采样率):输入数据的采样率,与 AD 的采样速率保持一致,单位为 SPS(每

秒采样次数 Samples per Second)。其中 4.8E4 表示为4.8 × 104,也就是 48K。

图 52.1.8 设置采样率

5) Cutoff Freq(截止频率):用于设置通过信号的频率界限。如图为低通滤波器时,截止

频率则只有一个。当保持输入信号的幅度不变,改变频率使输出信号降至最大值的

0.707 倍,即用频响特性来表述即为-3dB 点处即为截止频率,它是用来说明频率特性

指标的一个特殊频率。

图 52.1.9 设置截止频率

6) Input Bit Width (输入数据位宽)& Coefficient Bit Width(位宽):输入位宽指的是滤

波器输入数据数据的位宽,系数位宽为滤波器的系数位宽,这两个位宽一起决定了滤

波器输出数据的位宽。

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

实验任务

本节实验任务是在“基于 FFT IP 核的音频频谱仪实验”的基础上,添加一个 FIR 低通滤

波器,并通过按键来选择是否使用低通滤波器对 WM8978 输出的信号进行滤波,然后使用 Altera

FFT IP 核分析 WM8978 输出的音频信号的频谱,并将频谱的幅度特性显示到 4.3 寸 RGB TFT

LCD 上。

硬件设计

本实验的硬件设计原理与“基于 FFT IP 核的音频频谱仪实验”完全相同,请参考“基于

FFT IP 核的音频频谱仪实验”中的硬件设计部分。

程序设计

图 51.4.1 是根据本章实验任务画出的系统框图。对比于“基于 FFT IP 核的音频频谱仪

实验”,我们在“基于 FFT IP 核的音频频谱仪实验”的系统框图中添加了一个配置为低通滤

波器的 FIR 模块。当我们没有触碰开发板上的 KEY0 按键的时候,WM8978 模块输出的音频数据

先经过 FIR 模块进行滤波,然后通过 FFT 模块做频谱分析,得到频谱幅度数据。当我们按下按

键的时候,WM8978 模块输出的音频数据则直接通过 FFT 模块做频谱分析,得到我们需要的频

谱幅度数据。得到的数据经过 LCD 模块处理后,转变成频谱幅度图像,显示在 RGB TFT-LCD 上。

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

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

图 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 工具栏打开页面及打开后弹出的页面如下所示:

图 52.4.3 工具栏打开IP核界面

图 52.4.4 创建IP核向导页面

在该页面中,可以看到有三个选项,第一个是创建一个新的 IP 核,第二个是编辑一个已

经创建好的 IP 核,第三个是复制一个已经创建好的 IP 核。因为我们这里是首次创建 IP 核,因

此直接选择默认的第一个选项,然后点击【Next>】,进入下图所示的界面:

图 52.4.5 选择FIR Compiler IP核界面

在该页面中,我们可以在 DSP/Filters 下找到 FIR Compiler v13.1 IP 核,也可以直接在搜索框

中输入 fir 找到它。我们找到 FIR Compiler v13.1 IP 核以后,单击选中它,然后我们需要为 ALTPLL

IP 核选择保存的路径及名称,我们在工程路径 par/ipcore 文件夹下新建一个 FIR 文件夹,用于

存放工程中用到的 IP 核,然后在“What name do you want for the output file”一栏中输入 IP 存放

的路径及名称,这里我们命名为 fir_lowpass 并且选择创建的 IP 核代码为 Verilog HDL。需要注

意的是,如果想要对 IP 核进行仿真,需要将 IP 核存放目录设置为目录,也就是将 IP 核存放在

par 文件夹下。完成这些设置以后,我们点击【Next>】,进入下图所示的界面。

图 52.4.6 FIR IP核主界面

FIR Compiler v13.1 IP 核的主界面与 FFT IP 核的主界面是一样的。我们点击 step1:

Parameterize,进入如下所示的界面,对 IP 核进行参数配置。

图 52.4.7 FIR IP核配置界面

由于 FIR Compiler v13.1 IP 核处理的是 wm8978 输出一路 16 位有符号数数据。所以,Number

of input channels 选项(输入通道数)保持为 1 ;Input Number System 选项(输入数据系统)

保持为 Signed Binary;Input Bit Width(输入位宽)选项设置为 16;输出基于实际的系数(Actual

Coefficients),也就是与 Input Bit Width(输入位宽)和 Bit Width(系数) 其它选项保持默认

即可。接着点击 Edit Coefficient Set 选项进入如下所示界面,对滤波器参数进行设置。

图 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 窗函数。设置完成后的界面如下所示。

图 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。重复

多次最终就能生成成功。

图 52.4.10 生成滤波器文件选项

图 52.4.11 滤波器生成界面

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

与生成了。

图 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 滤波器信号描述

时序图如下所示,一直保持 ast_source_ready 信号为高电平。在复位信号 reset_n 信号、

ast_sink_ready 为高电平的时候,拉高 ast_sink_valid 信号,并给 FIR 滤波器输入数据,滤波器

就开始处理数据了。当滤波器拉高 ast_source_valid 信号的时候,FIR 滤波器就开始输出滤波处

理后的数据。

图 52.4.14 滤波器工作时序图

可以看到在代码第 75 行至 85 行,为了降低操作 IP 核的难度,没有理会 ast_sink_ready 信

号的状态,如代码第 79 行所示 。

下载验证

首先我们打开基于 FIR IP 核的低通滤波器实验工程,在工程所在的路径下打开

FIR_audio_lcd\par 文件夹,在里面找到“FIR_audio_lcd.qpf”并双击打开。注意工程所在

的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。工程打开后如图 1.5.1 示:

图 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 文件下载到开发板中,如下

图所示:

图 52.5.2 下载界面

然后,打开 FIR_audio_lcd\音频文件目录下的 noise_96k.wav 文件,我们可以在 LCD 上

看到如下图所示经过 FIR 滤波器滤波后的频谱图:

图 52.5.3 频谱图

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

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

标签: #音频信号滤波算法