FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

基于国产FPGA的实时语音降噪系统设计与实现——毕设实施指南

二牛学FPGA二牛学FPGA
技术分享
12小时前
0
0
11

Quick Start

本指南帮助你在国产FPGA平台上快速搭建一个实时语音降噪系统。以下步骤从零开始,涵盖硬件准备、工具链安装、工程创建、模块编写、综合实现与验证。

  1. 获取国产FPGA开发板,例如紫光同创Logos-2系列PGL22G开发板。确保板载音频编解码芯片(如WM8731或TLV320AIC23B),并具备麦克风/耳机接口。
  2. 安装PDS(PanGo Design Suite)2024.1及以上版本,并导入板级支持包(BSP)。
  3. 新建PDS工程,选择目标器件(如PGL22G-6BG256),添加顶层RTL文件与约束文件。
  4. 编写或导入I2C配置模块,初始化音频编解码芯片(采样率16kHz,16bit,单声道)。
  5. 实现一个简单的FIR低通滤波器(阶数64,截止频率4kHz),对麦克风采集的含噪语音进行滤波。
  6. 综合、实现并生成比特流,下载至FPGA,连接耳机,验证降噪效果(背景白噪声明显减弱,语音清晰度提升)。

前置条件与环境

项目推荐值说明替代方案
器件/板卡紫光同创 Logos-2 PGL22G 开发板板载音频编解码芯片与接口安路 EG4S20、高云 GW2A-LV18
EDA 版本PDS 2024.1(含 Synplify Pro 综合器)支持国产FPGA全流程Gowin YunGou IDE 1.9.9
仿真器ModelSim SE-64 2020.4(或 PDS 内置仿真器)用于功能仿真与时序验证Vivado Simulator(仅限 Xilinx 器件)
时钟/复位板载 50MHz 晶振,全局异步复位(低有效)PLL 倍频至 100MHz 供核心逻辑外部有源晶振
接口依赖I2S 音频总线(BCLK=256fs, LRCLK=fs, DATA 串行)与音频编解码芯片通信PDM 麦克风 + 抽取滤波器
约束文件SDC 时序约束(时钟周期 20ns,输入输出延迟 2ns)确保时序收敛PDS 物理约束(引脚分配)

目标与验收标准

  1. 系统上电后自动初始化音频编解码芯片,无需手动干预。
  2. 麦克风采集含噪语音,经FPGA实时降噪后从耳机输出,延迟不超过10ms(满足实时通信要求)。
  3. 降噪效果:背景白噪声衰减≥15dB,语音清晰度(PESQ评分)提升≥0.5。
  4. 系统稳定运行24小时无异常,无音频中断或毛刺。

实施步骤

步骤1:硬件准备与连接

将麦克风插入开发板音频输入接口(Line-In或Mic-In),耳机插入音频输出接口(Headphone-Out)。确保板载跳线正确设置(如I2C地址选择、电源使能)。使用USB线连接开发板与PC,上电后检查电源指示灯。

步骤2:工具链安装与工程创建

安装PDS 2024.1,安装过程中选择包含Synplify Pro综合器与BSP。启动PDS,点击“New Project”,输入工程名(如“voice_denoise”),选择目标器件PGL22G-6BG256。添加顶层RTL文件(如top.v)与约束文件(如top.sdc)。

步骤3:编写I2C配置模块

音频编解码芯片(如WM8731)通过I2C总线配置寄存器。编写Verilog模块,实现I2C主控制器,按芯片数据手册写入初始化序列:采样率16kHz、16bit、单声道、使能麦克风输入与耳机输出。关键寄存器配置如下:

// I2C配置序列示例(WM8731)
// 寄存器地址0x00(左声道输入):0x0017(使能麦克风,增益0dB)
// 寄存器地址0x02(左声道耳机输出):0x0079(-6dB输出)
// 寄存器地址0x04(模拟路径控制):0x0010(使能DAC)
// 寄存器地址0x06(数字路径控制):0x0000(直通)
// 寄存器地址0x08(采样率控制):0x0002(16kHz,USB模式)
// 寄存器地址0x0A(激活接口):0x0001(激活)

逐行说明

  • 第1行:注释,说明这是WM8731的I2C配置序列示例。
  • 第2行:配置左声道输入寄存器(地址0x00),值为0x0017,使能麦克风输入,增益设为0dB。
  • 第3行:配置左声道耳机输出寄存器(地址0x02),值为0x0079,输出衰减-6dB。
  • 第4行:配置模拟路径控制寄存器(地址0x04),值为0x0010,使能DAC路径。
  • 第5行:配置数字路径控制寄存器(地址0x06),值为0x0000,设置为直通模式(不进行数字处理)。
  • 第6行:配置采样率控制寄存器(地址0x08),值为0x0002,设置为16kHz采样率,USB模式。
  • 第7行:配置激活接口寄存器(地址0x0A),值为0x0001,激活音频接口。

步骤4:实现FIR低通滤波器

使用Verilog编写64阶FIR低通滤波器,截止频率4kHz,采样率16kHz。滤波器系数通过MATLAB的fdatool生成(汉明窗,归一化)。实现采用直接型结构,使用移位寄存器与乘累加器。关键代码片段:

module fir_lpf #(
    parameter ORDER = 64,
    parameter DATA_WIDTH = 16,
    parameter COEFF_WIDTH = 16
)(
    input  wire clk,
    input  wire rst_n,
    input  wire signed [DATA_WIDTH-1:0] data_in,
    input  wire valid_in,
    output reg  signed [DATA_WIDTH-1:0] data_out,
    output reg  valid_out
);

    reg signed [DATA_WIDTH-1:0] shift_reg [0:ORDER-1];
    reg signed [DATA_WIDTH+COEFF_WIDTH-1:0] mac;
    integer i;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            for (i = 0; i < ORDER; i = i + 1)
                shift_reg[i] <= 0;
            mac <= 0;
            data_out <= 0;
            valid_out <= 0;
        end else if (valid_in) begin
            // 移位寄存器更新
            for (i = ORDER-1; i > 0; i = i - 1)
                shift_reg[i] <= shift_reg[i-1];
            shift_reg[0] <= data_in;

            // 乘累加
            mac <= 0;
            for (i = 0; i < ORDER; i = i + 1)
                mac <= mac + shift_reg[i] * coeff[i];

            data_out <= mac >>> COEFF_WIDTH;
            valid_out <= 1;
        end
    end

endmodule

逐行说明

  • 第1行:模块声明,名称为fir_lpf,参数化阶数(ORDER=64)、数据位宽(DATA_WIDTH=16)、系数位宽(COEFF_WIDTH=16)。
  • 第2行:端口声明开始,时钟clk、复位rst_n(低有效)。
  • 第3行:输入数据data_in,有符号,位宽DATA_WIDTH。
  • 第4行:输入有效标志valid_in,表示数据有效。
  • 第5行:输出数据data_out,有符号,位宽DATA_WIDTH。
  • 第6行:输出有效标志valid_out。
  • 第8行:定义移位寄存器数组shift_reg,深度ORDER,每个元素位宽DATA_WIDTH。
  • 第9行:定义乘累加器mac,位宽为DATA_WIDTH+COEFF_WIDTH,防止溢出。
  • 第10行:循环变量i声明。
  • 第12行:always块,敏感列表为时钟上升沿或复位下降沿。
  • 第13行:复位条件,rst_n为低时执行。
  • 第14-16行:复位操作,将移位寄存器、mac、data_out、valid_out清零。
  • 第17行:非复位且valid_in有效时执行。
  • 第18-20行:移位寄存器更新,从后向前移位,将新数据data_in存入shift_reg[0]。
  • 第22-24行:乘累加操作,遍历所有阶数,将shift_reg[i]与对应系数coeff[i]相乘并累加。注意:coeff数组需在模块外部定义或作为参数传入。
  • 第26行:输出数据为mac右移COEFF_WIDTH位(算术右移),恢复原始位宽。
  • 第27行:valid_out置1,表示输出有效。
  • 第30行:模块结束。

步骤5:顶层模块集成

在顶层模块top.v中例化I2C配置模块、FIR滤波器模块、以及I2S收发模块(用于与音频编解码芯片通信)。I2S收发模块负责将I2S串行数据转换为并行数据,并同步采样时钟。数据流:麦克风输入→I2S接收→FIR滤波器→I2S发送→耳机输出。顶层模块需包含PLL实例化,将50MHz时钟倍频至100MHz供核心逻辑使用。

步骤6:综合、实现与下载

在PDS中点击“Synthesize”进行综合,综合完成后查看资源利用率(LUT、FF、DSP48等)。然后点击“Implement”进行布局布线,检查时序报告,确保无时序违规。最后点击“Generate Bitstream”生成比特流文件。使用PDS的下载工具(或第三方工具如Flash Programmer)将比特流下载至FPGA。

验证结果

连接耳机后,播放含白噪声的语音文件(或使用真实麦克风采集环境噪声)。系统上电后,应能听到降噪后的语音,背景噪声明显减弱。使用示波器或逻辑分析仪抓取I2S数据总线,确认数据格式正确。使用音频分析软件(如Audacity)录制输出,对比输入信号,计算信噪比提升与PESQ评分。

排障

  1. 无声音输出:检查I2C配置是否正确,音频编解码芯片是否初始化成功;检查I2S时钟(BCLK、LRCLK)是否正常;检查耳机是否插入正确接口。
  2. 声音失真或噪声大:确认FIR滤波器系数是否计算正确;检查数据位宽是否匹配;检查时钟抖动是否过大,必要时添加时钟缓冲。
  3. 时序不收敛:在SDC约束文件中增加输入输出延迟约束;优化RTL代码,减少组合逻辑深度;考虑使用流水线结构。
  4. 下载失败:检查JTAG连接,确保驱动已安装;尝试降低下载速度;检查比特流文件是否完整。

扩展

  1. 自适应滤波器:将FIR滤波器替换为LMS自适应滤波器,实时更新系数,适应不同噪声环境。
  2. 多通道处理:扩展为双麦克风波束成形,提升定向降噪能力。
  3. 深度学习加速:在FPGA上部署轻量级神经网络(如DNN或RNN)进行语音增强,需使用DSP48与BRAM资源。
  4. 低功耗优化:使用门控时钟与动态电压调节,降低系统功耗,适用于便携设备。

参考

  • 紫光同创Logos-2系列数据手册与用户指南
  • WM8731音频编解码芯片数据手册
  • PDS 2024.1用户手册(含Synplify Pro综合指南)
  • MATLAB fdatool滤波器设计工具文档
  • I2S总线规范(Philips半导体)

附录

附录A:FIR滤波器系数(64阶,汉明窗,截止频率4kHz,采样率16kHz)——可通过MATLAB脚本生成,此处略。附录B:I2C配置模块完整Verilog代码——见项目源码。附录C:PDS工程约束文件(top.sdc)示例——包含时钟周期约束与输入输出延迟约束。

标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/42436.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
1.06K20.51W4.04W3.67W
分享:
成电国芯FPGA赛事课即将上线
FPGA时序分析与物理综合实践指南:从计数器设计到时序收敛
FPGA时序分析与物理综合实践指南:从计数器设计到时序收敛上一篇
FPGA竞赛备赛指南:基于量化感知训练的端侧AI推理实现(2026年Q2)下一篇
FPGA竞赛备赛指南:基于量化感知训练的端侧AI推理实现(2026年Q2)
相关文章
总数:1.10K
FPGA开发中Vivado与ModelSim联合仿真的高效配置方法

FPGA开发中Vivado与ModelSim联合仿真的高效配置方法

在FPGA开发流程中,功能仿真是验证设计逻辑正确性的关键环节。Vivad…
技术分享
20天前
0
0
90
0
FPGA工程师转型指南:2026年系统级验证与AI部署技能实践

FPGA工程师转型指南:2026年系统级验证与AI部署技能实践

QuickStart:快速上手转型路径本指南面向希望在2026年完成技…
技术分享
4天前
0
0
15
0
Verilog 状态机编码实战指南:低功耗与面积权衡(2026年版)

Verilog 状态机编码实战指南:低功耗与面积权衡(2026年版)

QuickStart在Vivado2025.2中创建新工程,器件…
技术分享
4天前
0
0
8
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容