基于FPGA的语音信号降噪系统设计

描述

以下文章来源于OpenFPGA,作者碎碎思

本文介绍的项目如下:

RISC-V 架构 CPU FPGA 原型设计(一):借助板载调试工具完成 RISC-V 指令集 CPU 的 FPGA 实现,无公开源码,提供完整设计框图与文档。

RISC-V 架构 CPU FPGA 原型设计(二):独立的 RISC-V CPU 设计项目,详细讲解设计与仿真流程,无公开源码。

基于 LMS 与 IIR 算法的语音降噪系统:结合两种滤波器实现语音实时降噪,ARM 与 FPGA 协同工作,完成算法仿真与板上实测。

FPGA 加速矩阵乘法器:利用硬件并行加速矩阵运算,结合旋转矩阵实现三维点云变换,通过 VGA 可视化效果,对比 FPGA 与 HPS 运算性能。

FPGA 加速霍夫变换直线检测:将霍夫变换部署在 FPGA 实现硬件加速,完成图像直线检测,并测试不同复杂度图像的运算效率。

小引:

据我了解,目前国内很多大学是没有开设FPGA相关课程的,所以很多同学都是自学,但是自学需要一定的目标和项目,今天我们就去看看常春藤盟校Cornell University 康奈尔大学开设的FPGA项目课程,大部分课程是有源码的,而且和国内使用习惯类似都是Verilog开发,还是很有借鉴意义的。

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/

项目介绍

2024年春季 开发板:CycloneV DE1-SoC

使用板载调试工具对 RISC-V ISA CPU 进行FPGA原型设计

无源码就不过多介绍了,但是项目有详细的设计框图及说明,可以参考下面的链接研读。

cpu

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/zs343_hy592/zs343_hy592/Lab4Report.html

代码链接

视频链接

https://www.youtube.com/watch?v=UBOHYGEpx3c&list=PLDqMkB5cbBA7nUwrxsLgtrOsce9UgJXJb&index=2

基于FPGA的RISC-V CPU

同上也无源码,设计及仿真过程及其详细:

cpu

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/sl2973_jt842_tl839/sl2973_jt842_tl839/finalreport.html

代码链接

视频链接

https://www.youtube.com/watch?v=RmXCBSxlgLQ&list=PLDqMkB5cbBA7nUwrxsLgtrOsce9UgJXJb&index=2

LMS和IIR降噪

在本项目中,开发了一种专门针对语音信号的降噪系统,旨在提升包括通信系统、录音和智能家居设备在内的各种应用场景下的语音清晰度。考虑到实时环境下快速处理的重要性,利用FPGA技术显著加快了降噪过程。该方法融合了两种主流的降噪技术:最小均方(LMS)自适应滤波器和基于IIR滤波器的频谱降噪。对这些方法进行了实现和深入分析,以验证它们在去除语音录音噪声方面的有效性和实用性。该对比不仅突显了每种技术的优势和局限性,而且为在实际应用场景中选择最佳降噪策略提供了指导。

顶层设计

该项目专注于开发一种先进的语音信号降噪系统,旨在提升电信、录音和智能家居设备等各种实际应用中的语音清晰度。利用FPGA技术,充分发挥其快速处理能力,这对于实时应用至关重要。该系统设计为与ARM处理器协同工作,由ARM处理器负责初步数据处理,包括将.wav文件转换为数组格式,并通过简单的命令行界面管理用户录音指令。项目的数学基础是最小均方(LMS)算法和无限脉冲响应(IIR)滤波。LMS算法通过调整滤波器系数来最小化期望输出与实际输出之间的差异,使其非常适合动态环境。相比之下,使用IIR滤波器代替传统的基于FFT的方法,通过滤除不需要的频率成分来有效地降低噪声。这一改变旨在降低计算需求并简化实现,同时又不影响频谱降噪的效果。降噪过程始于ARM处理器通过连接到3.5mm插孔的麦克风采集音频。音频录制分别通过“开始”和“停止”命令启动和终止。录制停止后,音频数据被格式化为数组并发送到FPGA,使用LMS和IIR滤波器进行降噪。处理后的音频随后返回到ARM处理器,并重新打包成一个新的.wav文件。FPGA还会将波形输出到显示器上,以便直观地比较原始声音和处理后的声音,并通过扬声器播放干净的滤波音频。这种设置确保了滤波音频和未滤波音频之间能够进行可靠的比较,从而展示降噪系统的有效性。

数学背景

最小均方 (LMS) 滤波器: LMS 滤波器是一种自适应滤波器,旨在最小化期望信号与有限脉冲响应 (FIR) 滤波器输出之间的均方误差。它常用于回声消除和噪声抑制等应用。该滤波器通过以下公式更新其系数: w[n+1] = w[n] + μ · e[n] · x[n],其中w代表滤波器系数,μ是步长参数,e[n]是期望输出与实际输出之间的误差,x[n]是输入信号。如图 1 所示。

cpu

图 1

无限脉冲响应 (IIR) 滤波器: IIR 滤波器是一种脉冲响应持续时间无限长的数字滤波器。其一般形式为:

cpu

其中x[n]为输入,y[n]为输出,b i为前馈系数,a j为反馈系数。IIR 滤波器能够高效地实现所需的频率响应,但需要精心设计以确保其稳定性和因果性。

程序/硬件设计

在这个项目中,尝试使用两种不同的算法实现两种不同的降噪滤波器。然而,在麦克风设置方面遇到了一个重大挑战。最初,设计是使用一个二合一连接器将两个麦克风连接到FPGA的线路输入端。但遗憾的是,这种设置只能让其中一个麦克风正常工作。为了解决这个问题,尝试修改连接方式,剪断导线并直接焊接到连接器上。尽管如此,仍然无法同时接收到两个麦克风的输入信号。

这个问题对我们实现最小均方 (LMS) 滤波器尤为棘手,因为该滤波器需要一个参考音频通道来进行有效的噪声比较和消除。由于无法同时使用两个麦克风,无法在物理环境中演示 LMS 滤波器。因此,转而使用 ModelSim 来模拟信号噪声、参考噪声以及最终滤波输出的处理过程。这种方法使我们能够验证 LMS 算法的概念功能,即使无法在实际测试环境中实现它。

另一方面,采用的无限脉冲响应 (IIR) 滤波器(作为最初计划的基于 FFT 的方法的替代方案)被证明更适合我们的硬件限制。在项目初期,在实现 FFT 时遇到了文件格式转换问题,最终导致放弃了这种方法。然而,IIR 滤波器不需要双麦克风设置,仅使用单个音频通道即可有效滤除环境噪声。这使得我们能够在实际环境中有效地测试和演示降噪功能。

附图(见图 2)详细展示了实现的 LMS 自适应滤波器的结构。图中展示了滤波器如何处理输入噪声信号,并动态调整其系数以最小化输出误差,同时阐明了 FPGA 设置中的权重更新和滤波计算模块。这种可视化有助于理解我们开发的自适应降噪过程的复杂性。

cpu

图 2

IIR滤波器展现了出色的降噪性能,显著提升了处理后音频的清晰度。这一成功凸显了该滤波器在实际应用中的实用性,尤其是在硬件配置较为简单的应用场景中。尽管双麦克风配置和FFT实现方面存在一些不足,但该项目仍然具有重要价值,它展示了不同降噪技术在FPGA环境下的实际应用及其局限性。

测试及结果

在测试阶段,正如提到的视频(链接在下面)中所展示的,通过对着麦克风说话来评估IIR滤波器的性能,并通过ModelSim仿真观察LMS算法的降噪能力。两种算法在降噪方面都表现出色。

LMS降噪的有效性可以从下图(图3)所示的信号对比中直观地体现出来。该对比清晰地展示了LMS滤波器如何动态调整以最大限度地降低处理后信号中的噪声,从而提供了音频质量提升的前后对比图。

cpu

图 3

结论

该项目旨在利用FPGA技术开发一种稳健的降噪系统,重点在于提升各种实际应用中的语音清晰度。在开发过程中,实现了两种不同的降噪技术:最小均方(LMS)自适应滤波器和无限脉冲响应(IIR)滤波器。

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/ys2257_zx334_yz2927/index.html

代码链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/ys2257_zx334_yz2927/index.html

视频链接

https://www.youtube.com/watch?v=qpQ802-oQMA

加速矩阵乘法器

该项目的目标是利用FPGA硬件实现加速矩阵乘法。选择通过旋转点云来可视化矩阵乘法,旋转方向分别为x轴、y轴和z轴。利用FPGA上高效的矩阵乘法模块和并行硬件架构优化了矩阵乘法运算。项目伊始,使用1个SRAM存储了300个随机像素坐标点,并逐步扩展,最终使用15个SRAM存储了4500个随机像素。在VGA显示器上生成了两个点云,一个由HPS计算,另一个来自FPGA。最后,为FPGA显示器实现了开关控制,以便能够改变点云沿x轴、y轴或z轴的旋转方向。

HPS 在实验室中的作用是使用随机像素值初始化 SRAM,并将这些像素值打印到 VGA 屏幕上。HPS 的输出值通过 Qsys 设置的 PIO 端口发送到 FPGA。在 Qsys 中,PIO 端口被分配了唯一的内存地址,数据将存储在这些地址中。

FPGA 的主要职责是读取 SRAM 并执行与旋转矩阵的乘法运算。还通过平台设计器初始化了 SRAM,以便设置存储器来存储 HPS 用于打印的坐标。最后,FPGA 开关用于控制旋转轴。

设计和测试方法

定点运算

定点数允许用户使用小数进行计算,并且比实现浮点数据类型消耗更少的硬件资源。本项目中使用的定点值为 12.15,对应于 12 位整数和 15 位小数。定点值可以直接进行加减运算,无需任何修改,但乘法运算需要更仔细地控制小数点的位置。如果要将两个 12.15 的有符号数相乘,输出结果将是一个 54 位的数。由于希望保持 27 位数字格式,因此小数点位于第 29 位之后,小数位位于 [29:15] 位,整数位位于 [40:30] 位,符号位位于第 53 位。所有位于第 29 位和第 15 位以上的位分别被视为溢出和下溢。

准确性

使用 12.15 定点运算时,运算范围限制在 +4096/-4096 之间,增量为 2-15。此外,由于 FPGA 乘法器被设计为进行两次 18 位乘法或一次 27 位乘法,因此采用 12.15 定点格式进行运算,使得每次乘法运算只需一个 DSP 模块。鉴于 DSP 模块并非瓶颈,决定使用更高的精度,使结果尽可能接近 HPS 值。这使我们能够最大限度地利用 DSP,从而可以使用 4 个 DSP 模块进行矩阵乘法运算。

SRAM 设置

为了保存计算后不断更新的坐标数据,决定采用板载 SRAM。SRAM 是 FPGA 和 ARM 处理器之间的共享内存,其功能类似于 M10K 模块。通过平台设计器配置了 SRAM,确保其可写、双端口,并设置了 32 位数据宽度和 4096 字节的总内存。此外,还添加了一个 50 MHz 的时钟桥,用于驱动 SRAM 和 Verilog 编写的状态机。凭借 4096 字节的内存,能够为每个 SRAM 存储 300 个像素点的坐标,最多可支持 15 个 SRAM 和 4500 个像素点。

矩阵乘法计算

传统的矩阵乘法是一系列点积运算。矩阵乘法的前提是第一个矩阵的列维度必须与第二个矩阵的行维度相同。点积是矩阵中某一行和某一列的乘积之和,用于计算最终的乘积矩阵。对于两个 3x3 矩阵,这个过程总共需要 27 次点积运算,每次运算对应输出乘积矩阵中 3 个元素的乘积。

cpu

旋转矩阵

旋转矩阵是变换矩阵,可以旋转xyz平面上的笛卡尔坐标点。对于每个轴,都有一组旋转矩阵,可以将点绕x轴、y轴或z轴旋转。θ是旋转矩阵将点绕该轴旋转的角度。通过矩阵乘法,可以将由1x3矩阵中的x、y和z值定义的点乘以下面所示的三个旋转矩阵中的任意一个,从而将点绕所需的轴移动。由于某些值保持不变,旋转矩阵乘法中每个输出矩阵实际上执行了9次不同的乘法运算。

cpu

矩阵乘法测试

为了测试矩阵乘法模块,首先在 Modelsim 上开发了一个基础模块,并搭建了一个测试平台。该模块执行了 9 次乘法运算,并使用 12.15 定点表示法来表示我们硬编码的初始坐标 sin(1) 和 cos(1)。硬件文档中将对此进行更详细的解释。

顶层设计

硬件设计

下面列出了 Verilog 程序中的模块及其功能。

cpu

硬件流程图

cpu

上图详细展示了矩阵乘法加速器中FPGA、HPS(ARM)和外部输出之间的数据流。HPS随机设置坐标像素点云的初始值。启动时,点云坐标点被保存到FPGA的SRAM中,并根据平台设计器中设置的基地址,将数据分别组织到15个SRAM中。每个SRAM的第一个地址用于FPGA和HPS之间的同步信号。接下来的三个地址分别用于存储x、y和z坐标值。

初始化 15 个 SRAM 后,15 个相关的矩阵乘法模块以及 SRAM 状态机将用于读取坐标值并分配相应的乘法信号。矩阵乘法由 4 个有符号乘法器和条件语句完成,条件语句使用开关值来确定针对特定轴执行的乘法运算。当开关设置为 00 时,将对坐标点进行 y 轴旋转矩阵的矩阵乘法运算;当设置为 01 时,进行 x 轴旋转;当设置为 10 时,进行 z 轴旋转。矩阵乘法模块完成计算后,同步信号用于计时,HPS 会计算乘法运算的完成速度。最后,将结果写回 SRAM 的相同地址。我们使用 generate 语句创建多个矩阵乘法器和状态机,以便每个乘法器模块都能读写自己的 SRAM。这使得我们的乘法运算可以并行化,并比 HPS 实现更快的计算速度。

然后,HPS 从 SRAM 读取数值,以便计算要绘制到 VGA 显示器上的坐标点。在 HPS 端,还对相同数量的像素进行矩阵旋转乘法运算,并将结果输出到 VGA 显示器,这样就可以并排显示 FPGA 和 HPS 的点云及其对应的计算时间。此外,HPS 还根据 z 坐标值格式化像素颜色,因此像素越远离屏幕,颜色越浅。FPGA 和 HPS 的坐标点都被发送到 SDRAM,VGA 子系统利用 SDRAM 最终同时输出两个点云。

Qsys 布局

cpu

cpu

cpu

QSYS 使用图形界面轻松连接和配置预先设计的IP 模块,例如处理器、内存控制器和外设。如上图所示,在布局图中们添加了 15 个片上 SRAM 存储器,用于 HPS 和 FPGA 之间的通信。这 15 个 SRAM 全部连接到轻量级 AXI 总线,并且地址互不重叠。

软件描述

下面这张表格详细列出了 HPS 程序中使用的函数和变量。

cpu

cpu

深度可视化

在 VGA 显示器上显示点云时,希望向用户指示屏幕上的 z 轴深度。一种方法是按顺序绘制像素。可以按照像素在屏幕上的深度顺序绘制它们,从最远到最近。这种方法效果不错,但更好的深度显示方式是根据像素的深度对其进行着色。VGA 驱动程序为每个像素使用 16 位颜色。这意味着对于每个像素,5 位用于红色,6 位用于绿色(因为人眼对绿色的变化感知最好),5 位用于蓝色。如果我们把 R、G 和 B 分量的值都设为相等,就可以得到同一种颜色的不同色调。我们可以使用以下公式来计算颜色:

cpu

其中 60 是每个向量分量的最小值,120 是范围 (-60 到 60),31 是最小颜色位宽(即 2^5-1)的最大值。例如,如果向量的 z 分量非常大,为 -60,代入此公式后,结果为零。颜色零是黑色,像素不可见。

cpu

结果

cpu

cpu

结论

该项目展现了并行硬件架构在加速计算密集型任务方面的强大能力。利用条件语句改进了矩阵乘法方法,使其仅需4个乘法器,相比之前的HPS实现有所改进。为了可视化矩阵乘法,使用一组旋转矩阵来旋转点云,并将FPGA和HPS的计算结果输出到VGA屏幕上。最终的FPGA硬件设计在45us内渲染了4500个点,而HPS使用15个SRAM则耗时23500微秒。使用开关来绕三个轴旋转点云,但仅使用10个SRAM即可完成渲染。达到了预期的加速效果,并相信下次可以进一步优化DSP的使用数量,采用更小的定点表示。

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/sd954_nm664_as3745/sd954_nm664_as2745/index.html

代码链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/sd954_nm664_as3745/sd954_nm664_as2745/code/matrixMultiplier.zip

视频链接

https://www.youtube.com/watch?v=xsieYRLA_YM&list=PLDqMkB5cbBA7nUwrxsLgtrOsce9UgJXJb&index=1

基于 Terasic DE1-SoC 的加速霍夫变换直线检测

项目介绍

霍夫变换的工作原理,就是能够找到边缘检测输入图像中的直线。

从宏观层面来说,霍夫变换(直线检测)会追踪给定像素可能所属的所有直线。对于整幅图像,贡献次数最多的直线被判定为图像中的一条真实直线。

为了追踪“所有可能的线条”,需要将输入的“图像空间”变换到“霍夫空间”。我们在 Altera FPGA 上加速了这一变换阶段,并将排序和线条绘制留给了我们电路板上的 HPS 执行。

高层设计

理由和背景

根据有限的计算机视觉算法经验,认为许多算法既足够简单又足够并行化,可以从专用硬件加速中获益。例如,像边缘检测这样依赖卷积核的算法,可以通过专用硬件矩阵乘法器进行加速。

考虑到许多计算机视觉算法可以从硬件加速中受益,在最终项目确定实现通用霍夫变换之前,探索了许多有趣的算法。

线几何

要理解霍夫变换,首先必须回顾一些关于直线的知识。图 2 显示了一条直线,其方程为:

y=−3x+4 0≤x≤3

这条直线的方程告诉我们:每当我们在 x 方向移动 1 个单位,就在 y 方向移动 -3 个单位。 这条直线完全由 x 的系数(在这个例子中是 -3)以及 偏移量 4 来描述。 事实上,所有直线都可以用这种斜截式(slope-intercept form)来表示。它通常写作:

y=mx+b

其中,m 表示直线的斜率(slope),而 b 表示直线与 y 轴的截距(y-intercept)。

cpu

图 2:方程 y = -3x + 4 的直线在 0 <= x <= 3 的范围内。

我们也可以用极坐标形式(polar form)来表示直线。 与其使用斜率 m 和截距 b 来描述一条直线,不如将直线表示为两个量的函数:从原点到该直线法线(normal)的长度,以及这条法线相对于 x 轴的夹角(类似于单位圆中的角度定义)。 为了继续研究前面那条直线,图 2 给出了一个示例。

cpu

图 3:方程 y = -3x + 4 的法线和角度。

在这种情况下,我们的直线可以用距离

cpu

和角度 θ=1.25 来描述。我们将使用这些极坐标形式来进行霍夫变换。

霍夫空间

想象一个二维空间,它可以用来表示极坐标图中的线条,这会很有帮助。

ρ在 x 轴上和θ在这个“霍夫空间”中,y 轴上的任何一条线都可以表示为一个点。

霍夫变换原理

霍夫变换的工作原理是遍历源图像中的每个像素,并统计该像素对给定直线的“贡献”或“投票”。考虑给定点的情况。

(5 ,5 )经过该点的直线可以无穷多条。图 4 展示了其中几条直线的离散化结果。

cpu

图 4:经过点 (5,5) 的一些直线

霍夫变换器会跟踪输入图像中所有像素的贡献。它通过增加穿过给定像素的线条的值来实现这一点,当遇到感兴趣的像素(通常只是一个白色像素,因为输入图像是经过边缘检测后的)时,这些线条的值就会增加。

图 5 显示了单个像素对我们线霍夫空间的贡献。

cpu

图 5:霍夫空间中单个点的贡献。

当取构成整条线的所有像素的贡献值时,霍夫空间会生成一个点,该点的值高于空间中的任何其他点。这个点代表了ρ和θ源图像中整条线。图 6 显示了我们的输入图像,其中有一条线位于 y=50图 7 显示了相应的霍夫空间。

cpu

图 6:输入到霍夫变换器的图像,其中有一条直线 y=50。注意,y 轴正方向向下。

cpu

图 7:对应于直线 y=50 的霍夫空间。中心附近的点对应于 180 度角和 610(归一化)距离(在实现部分详细说明)。

这样,霍夫变换器就可以遍历边缘检测输入图像中的每个像素,并在霍夫空间中创建与输入图像中的线条相对应的局部极大值。

高阶霍夫变换

从宏观层面来说,霍夫变换可以分解为以下步骤:

遍历输入图像并在霍夫空间中累积投票。

利用邻域比较算法寻找局部最大值。

按投票数对检测到的行进行排序。

提取代表所述直线的两个点。

根据上述两点画线。

更详细的设计(包括以上步骤),请移步:

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/nrn25_bpw42_tic3/nrn25_bpw42_tic3/hough/index.html

结果

成功地展示了霍夫变换在视觉上和量化上的显著加速。测试了加速器在多张不同复杂度图像上的速度。总体而言,图像中的边缘越多,累加器需要遍历的点就越多,耗时也越长。

通过将标志引出到 PIO 端口并使用示波器测量周期,获得了极其精确的计时数据,如下所示,针对三种不同复杂程度的测试用例。

cpu

cpu

cpu

cpu

cpu

cpu

按顺序显示,第一张图包含一个移位矩形的场景,用作我们的“中等复杂度”案例;第二张图显示了一团乱麻般的电缆,用作我们的“高复杂度”案例;第三张图是一张白纸,用作我们的“低复杂度”案例。

对于中等复杂程度的情况,加速器大约需要 5 毫秒;对于复杂程度的情况,大约需要 25 毫秒;对于简单程度的情况,大约需要 1.5 毫秒。

下图 20 显示了软件实现和硬件实现的性能,以每个测试用例的计算时间(每张图像)来衡量。

cpu

图 20:线霍夫变换各阶段的硬件实现与软件实现的比较。

项目链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/nrn25_bpw42_tic3/nrn25_bpw42_tic3/index.html

代码链接

https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/s2024/nrn25_bpw42_tic3/nrn25_bpw42_tic3/code/index.html

https://vanhunteradams.com/DE1/VGA_Driver/Driver.html

视频链接

https://youtu.be/mXqz-rAfwIw?si=V028G59JaUP_3xv5

总结

本文整理了康奈尔大学 2024 年春季 ECE5760 课程基于 CycloneV DE1-SoC 开发板的 5 个 FPGA 实战项目,全部采用 Verilog 开发,具体项目如下:

RISC-V 架构 CPU FPGA 原型设计(一):借助板载调试工具完成 RISC-V 指令集 CPU 的 FPGA 实现,无公开源码,提供完整设计框图与文档。

RISC-V 架构 CPU FPGA 原型设计(二):独立的 RISC-V CPU 设计项目,详细讲解设计与仿真流程,无公开源码。

基于 LMS 与 IIR 算法的语音降噪系统:结合两种滤波器实现语音实时降噪,ARM 与 FPGA 协同工作,完成算法仿真与板上实测。

FPGA 加速矩阵乘法器:利用硬件并行加速矩阵运算,结合旋转矩阵实现三维点云变换,通过 VGA 可视化效果,对比 FPGA 与 HPS 运算性能。

FPGA 加速霍夫变换直线检测:将霍夫变换部署在 FPGA 实现硬件加速,完成图像直线检测,并测试不同复杂度图像的运算效率。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分