基于FPGA的A律压缩解压缩verilog实现,包含testbench

news/2024/10/5 3:24:50/文章来源:https://www.cnblogs.com/51matlab/p/18288604

1.算法仿真效果

VIVADO2019.2仿真结果如下(完整代码运行后无水印):

 

 

 

RTL图如下所示:

 

 

 

2.算法涉及理论知识概要

       A律压缩是一种广泛应用于语音编码的非均匀量化技术,尤其在G.711标准中被欧洲和中国等国家采纳。该技术的核心目的是在有限的带宽下高效传输语音信号,同时保持较高的语音质量。在基于现场可编程门阵列(Field-Programmable Gate Array, FPGA)的实现中,A律压缩解压缩算法的高效硬件实现成为可能,这对于实时通信系统尤为重要。

 

       A律压缩基于对数性质,对原始的模拟语音信号进行非线性变换,将较大的信号变化幅度分配更多的量化级,而较小的变化分配较少的量化级,以此达到降低数据速率的同时保持信号的主要特征不变。A律压缩的数学表达式如下:

 

 

 

       其中,x是归一化后的输入信号(通常在−1−1到11之间),y是量化后的数字信号,A是压缩器的阈值,一般取A=1/1.5​。实际应用中,为了简化硬件实现,A律压缩通常采用13折线近似,即将输入信号范围分割为多个小段,每段采用不同的线性关系进行近似。

 

       解压缩过程是压缩的逆过程,其目标是将经过A律压缩的数字信号恢复成接近原始的模拟信号。解压缩数学表达式为:

 

 

 

        其中,x′是解压缩后的近似原始信号,y是接收到的量化数字信号,A同压缩时使用的阈值。在FPGA实现中,解压缩同样可以通过查找表、算术逻辑单元(ALU)或专用的浮点运算单元完成。

 

FPGA实现要点

 

信号预处理:首先,模拟信号需经过采样和量化变为数字信号,这一过程通常在FPGA的模数转换器(ADC)部分完成。

 

非线性变换:接下来,通过查找表(LUT)或多项式近似实现上述非线性变换。FPGA的LUT资源丰富,适合存储折线近似所需的查找表值。例如,对于13折线近似,可以预先计算每个区间的输出值,存储在LUT中,输入信号根据其所在区间直接查表得到量化输出。

 

量化与编码:量化后的信号需要进一步编码为二进制数据进行传输。编码过程往往涉及将连续的量化值映射到固定的比特序列,这可以通过简单的逻辑门电路或者状态机在FPGA上实现。

 

同步与控制:FPGA实现中,还需要考虑时钟管理和状态控制逻辑,确保整个压缩流程按时序正确执行,同时处理好数据的流动和存储问题。

 

3.Verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/06/21 17:39:11
// Design Name: 
// Module Name: TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module TEST();reg i_clk;
reg i_rst;
wire [7:0]  o_y_alaw;
wire [11:0] o_y_dealaw; wire [31 : 0] m_axis_data_tdata;
dds_compiler_0 dds_compiler_0U (.aclk(i_clk),                                // input wire aclk.m_axis_data_tvalid(),    // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata),      // output wire [15 : 0] m_axis_data_tdata.m_axis_phase_tvalid(),  // output wire m_axis_phase_tvalid.m_axis_phase_tdata()    // output wire [31 : 0] m_axis_phase_tdata
);wire signed[11:0]signal = {m_axis_data_tdata[31],m_axis_data_tdata[31:21]};tops uut(
.i_clk       (i_clk),
.i_rst       (i_rst),
.i_x         (signal),
.o_y_alaw    (o_y_alaw),
.o_y_dealaw  (o_y_dealaw)
);initial
begin
i_clk=1'b1;
i_rst=1'b1;
#100
i_rst=1'b0;
end
always #5 i_clk = ~i_clk;
endmodule

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LFU算法实现

LFU (Least Frequently Used) 是一种用于缓存管理的算法。它通过跟踪每个缓存项被访问的频率来决定哪些项应该被移除。LFU算法倾向于保留那些使用频率较高的项,而移除那些使用频率较低的项。以下是LFU算法的详细介绍: 工作原理计数器:每个缓存项都有一个计数器,用于记录该项…

灰色预测GM(1,1)模型的理论原理

灰色预测是对时间有关的灰色过程进行预测。通过建立相应的微分方程模型,从而预测事物未来发展趋势的状况。 由于笔者的水平不足,本章只是概括性地介绍GM(1,1)模型的理论原理,便于对初学者的初步理解 目录一、灰色系统二、GM(1,1)灰色预测模型1.生成累加数据与紧临均值生成…

JMonkeyEngine——材质文件备注

默认J3M编辑器不支持编辑纹理参数的Mag/Min滤波选项,只能配置Flip和Wrap模式,但是可以单独编辑J3M源码,如下: 添加你需要的Mag/Min滤波选项,参考源码的解析,就是Mag/Min+拼接对应的Filter值。 虽然打开J3M编辑器会报错: 但实际进游戏时并不会报错,而且一切正常,如下:…

04-JS中的面向对象ES5

JS面向对象基础01 JS对象中key的类型02 创建对象的方法03 对象的常见操作 3.1 访问对象的属性 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="I…

程序员的AI工作流

AI 工具在日常工作中的应用逐渐成为程序员必备利器。本文介绍了作者常用的一些 AI 工具及使用方式,涵盖需求文档分析、技术文档编写、编程、PR/CR 和技术调研等工作内容,为提升工作效率提供了有力支持。作为一名程序员, 我现在已经深刻的体会到了AI带来的巨大的工作提升 本文…

An Attentive Inductive Bias for Sequential Recommendation beyond the Self-Attention

目录概符号说明BSARec (Beyond Self-Attention for Sequential Recommendation)代码Shin Y., Choi J., Wi H. and Park N. An attentive inductive bias for sequential recommendation beyond the self-attention. AAAI, 2024.概 本文在 attention block 中引入高低频滤波. 符…

[Leetcode]经典算法

检测环 快慢指针法是一种用于检测链表中是否存在环的有效方法,同时也可以找到环的起点。该方法的原理基于两个指针在链表上同时移动,其中一个移动得更快,而另一个移动得更慢。检测环的存在:使用两个指针,一个称为快指针(fast),一个称为慢指针(slow)。 在每一步中,快…

关于import multiprocessing引用出错

关于import multiprocessing引用出错 0. 原因 当前文件名与python包体中关键词出现同名,导致循环引用 1. 排查过程 问题代码 import timefrom multiprocessing import Process, Queue # 这里提示错误def producer(queue):queue.put("a")time.sleep(2)def consumer(q…

进程信号

进程信号的产生,本质,进程信号的操作,进程信号的底层实现,以及阻塞信号,屏蔽信号1. 信号的产生 1.1 信号概念在生活中有很多的信号在我们身边围绕,例如红绿灯,发令枪,上课铃等等 在接受到信号,我们可以做出三种动作 1.立马去做对应信号的事情 2.等一会再做,有自己的…

24-暑假软件工程日报(7_7)

工作时间:7月7日 14:00-17:00 工作内容: 基本完成第二阶段大程序构建 代码:#include <cstring> #include <iostream> #include <list> #include <math.h> #include <queue> #include <stack> #include <stdio.h> #include <st…

[CISCN2019 华北赛区 Day2 Web1]Hack World

进入题目 输入数字1数字20对select 空格 union or 等等测试发现没有过滤select 空格也被过滤 注意不能单独测试用亦或运算 1^0为真 尝试0^if((ascii(substr((select(flag)from(flag)),1,1))=100),0,1) 回显正常根据回显判断正误 编写脚本爆破,由于该网站请求太快会报429,请求…

CubeMx的部分配置显示不出来

现象描述:CubeMx的部分配置显示不出来 处理方法:(1)继续进行其他配置,给工程起名字,并生成代码;(2)关闭CubeMx后再次打开