🌍首页
📁归档
⏳时光机
🚩友链
📫留言
📧订阅
🌟推荐
📕考研课程
🏜️ 免费壁纸
❤ 捐助本站
💰资助名单
🎵音乐实验
Search
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
20,263 阅读
2
论文写作中如何把word/wps里面所有数字和字母替换为新罗马字体
10,790 阅读
3
【高数】形心计算公式讲解大全
9,138 阅读
4
Vivado-FPGA Verilog烧写固化教程
8,204 阅读
5
【概论】一阶矩、二阶矩原点矩,中心矩区别与概念
7,923 阅读
🪶微语&随笔
励志美文
我的随笔
工作办公
📡电子&通信
嵌入式&系统
通信&信息处理
编程&脚本笔记
⌨️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
/
注册
ed(共165篇)
找到
165
篇与
ed
相关的结果
- 第 9 页
【4】Verilog练习-秒计数器设计
摘要本文介绍了使用Verilog语言设计的秒计数器,包括秒脉冲分频计数器和秒脉冲尖的生成,以及秒数的计数和循环。同时,展示了测试平台和数码管显示的扩展应用。关键词:Verilog, 秒计数器, 设计, 仿真, 数码管秒计数器设计 图片 代码 //秒计数器,0-9循环 `timescale 1ns/10ps module s_counter( clk, res, s_num ); input clk; input res; output[3:0] s_num; parameter frequency_clk=24;//24MHZ; reg[24:0] con_t;//秒脉冲分频计数器; reg s_pulse;//秒脉冲尖; reg[3:0] s_num; always@(posedge clk or negedge res) if(~res)begin con_t<=0;s_pulse<=0;s_num<=0; end else begin //if(con_t==frequency_clk*1000000-1)begin if(con_t==frequency_clk*1000-1)begin//仿真便于观察 con_t<=0; end else begin con_t<=con_t+1; end if(con_t==0)begin s_pulse<=1; end else begin s_pulse<=0; end if(s_pulse) begin if(s_num==9)begin s_num<=0; end else begin s_num<=s_num+1; end end end endmodule //-----testbench of s_counter--- module s_counter_tb; reg clk,res; wire[3:0] s_num; s_counter s_counter( .clk(clk), .res(res), .s_num(s_num) ); initial begin clk<=0;res<=0; #17 res<=1; #1000000 $stop; end always #5 clk<=~clk; endmodule现象 图片 扩展:数码管 图片 图片
FPGA&ASIC
刘航宇
4年前
0
472
2
2022-05-23
【3】Verilog练习-时序逻辑与伪随机码发生器设计和仿真
摘要本文介绍了Verilog语言在时序逻辑和伪随机码发生器设计和仿真中的应用。通过示例代码展示了计数器和伪随机码发生器的实现,并进行了仿真验证。关键词:Verilog, 时序逻辑, 伪随机码发生器, 仿真, Verilog代码时序逻辑代码与仿真 图片 代码 //计数器 `timescale 1ns/10ps module counter( clk, res, y ); input clk; input res; output[7:0] y; reg[7:0] y; wire[7:0] sum;//+1运算的结果; assign sum=y+1;//组合逻辑部分; always@(posedge clk or negedge res) if(~res)begin y<=0; end else begin y<=sum; end endmodule //----testbench of counter---- module counter_tb; reg clk,res; wire[7:0] y; counter counter( .clk(clk), .res(res), .y(y) ); initial begin clk<=0;res<=0; #17 res<=1; #6000 $stop; end always #5 clk<=~clk; endmodule现象 图片 模拟显示 图片 伪随机码发生器 图片 代码 //四级伪随机码发生器; `timescale 1ns/10ps module m_gen( clk, res, y ); input clk; input res; output y; reg[3:0] d; assign y=d[0]; always@(posedge clk or negedge res) if(~res)begin d<=4'b1111; end else begin d[2:0]<=d[3:1];//右移一位; d[3]<=d[3]+d[0];//模二加; end endmodule //----testbench of m_gen---- module m_gen_tb; reg clk,res; wire y; m_gen m_gen( .clk(clk), .res(res), .y(y) ); initial begin clk<=0;res<=0; #17 res<=1; #600 $stop; end always #5 clk<=~clk; endmodule现象 图片
FPGA&ASIC
刘航宇
4年前
0
545
1
GUN Radio实战信号源设计&USRP发射接收波形信号
摘要本文介绍了使用GUN Radio和USRP设备进行信号源设计和波形信号发射接收的方法。通过GRC软件构建流程图,使用信号源模块和时域显示模块生成和查看波形,并通过USRP设备实现信号的发射和接收。关键词:GUN Radio, 信号源设计, USRP, 波形信号, UHD模块目录 信号源设计 用 USRP 发射接收波形信号 信号源设计 目标:创建一个正弦波,并使用时域 Scope Sink 查看生成的波形。了解基本的流程图构建和常用模块的使用。 1.在终端窗口中输入:gnuradio-companion 打开 GRC 软件。 2.将 Options 模块的 ID 属性设置为 LAB2,Generate Options 属性设置为 QT GUI。 3.使用快捷键 Ctrl+F 或点击菜单栏中的 搜索图标 查找模块 signal source 信号 发生模块,和 scope sink 图形显示模块。双击或拖动模块到画布上。 图片 由于 GNU 中 scope 模块只有 WX GUI 类型的,如下图所示 图片 所以我们需要将 Options 模块的 Generate Options 属性值相应的改为 WX GUI。否则程序将会报错并不能被执行。如下图所示,连接 Signal Source 模块 和 WX GUI Scope Sink 模块,而 WX GUI Scope Sink 模块为红色,点击工具栏中的运行按钮会显示出错误原因: 图片 5.此时,若我们想在程序运行时,在 GUI 界面能够随时改变频率的值,则需要添加 WX GUI Slider 模块。 图片 6.为了防止 CPU 过载,我们添加一个 Throttle 模块。Throttle 模块主要起到限速的作用,设置高的速率,程序执行的快,设置低的速率程序行的慢。当有硬件连接的时候,我们不需要 Throttle 模块,因为硬件本身就对速率有了限制。 这里我们讲一下,为什么所有的流程图都要用 Throttle 模块,先看下使用了与没有使用 Throttle 模块的正弦波流程图上的系统资源监控对比: 图片 下图为 Throttle 为不同值时,CPU 的使用速率。 图片 Throttle 模块的作用可以理解为限速:速度越高我们流程图运行的速度越高,速度越低流程图运行的速度越低。我们如果将 Throttle 模块的采样率调到1e6比调到 1e3(CPU 配置低就调的更低一些防止跑死)的 CPU 负载要高很多。 7.在桌面创建一个 LAB-LW 的文件夹,将刚刚连接好的程序保件夹中,并将其保存为 LAB1.grc。 整体流程框图: 图片 流程结果图: 图片 用 USRP 发射接收波形信号 目标:学会使用 USRP 设备利用现有的程序进行简单的修改实现简单的发送接收。 并熟悉 UHD 模块的基本使用。 通过上一个练习我们已经知道怎样建立一个不通过外部设备即可接收到波形信号的程序,在本节练习中,我们将对上节程序进行简单的修改然后利用外部 USRP 设备进行发射接收波形信号。 将 Options 模块的 ID 属性设置为 LAB2,Generate Options 属性设置为 QT GUI。 2.由于有外部硬件连接了,所以我们不需要 Throttle 模块了, Throttle WX GUI Scope Sink 模块删除。 3.删除两个 WX GUI Slider 模块。 4.修改 Signal Source 模块的属性参数: 图片 5.从模块库中将 QT GUI Sink,UHD:USRP Sink 模块添加到 布中,将 Signal Source 模块的输出端与 QT GUI Sink 模块和 UHD:USRP S nk 模块的输入端连接到一起。其中 UHD:USRP Sink 模块用来发射波形信号,QT GUI Sink 模块用来查看发射的波形信号。 其具体的模块属性参数如下图所示: 图片 6.从模块库中将 UHD:USRP Source,QT GUI Sink 模块 加到画布中,将 UHD:USRP Source 模块的输出端连接到 QT GUI Sink 模块的输入段。其中, UHD:USRP Source 模块用来接收波形信号,QT GUI Sink 模块用来显示接收 波形。 其具体的模块属性参数如下图所示: 图片 UHD:USRP Sourc属性参数。 USRP B210 更改 A 通道或 B 通道: 图片 7.添加两个 QT GUI Range 模块,并将其 ID 改为 gain_tx,和 gain_rx。用于调整发射端和接收端的增益值。 图片 图片 8.为了方便我们查看发射和接收的波形信号,我们添加一个 QT GUI Tab Widget模块。将 ID 更改为 ab,Num Tabs 改为2,Label0名称更改为 TX,用来查看发射端的波形情况;Label1名称更改为RX,用来查看接收端的波形情况。 图片 同时,更改发射端 QT GUI Sink 模块的 GUI Hint 属性为 lab@0;更改接收端 QT GUI Sink 模块的GUI Hint 属性为 lab@1。 将连接好的程序保存在 LAB-LW 的文件夹中,并将其保存为 LAB2.grc 整体流程框图: 图片 流程结果图: (此程序采用 USRP-LW B210运行,同时将通道 A 的 TX/RX2端外接馈线或连接天线) 发射端波形: 图片 接收端波形: 图片
通信&信息处理
# 软件无线电
刘航宇
4年前
0
4,357
5
2022-05-16
【4】Verilog-基础语法2
摘要本文介绍了Verilog的基础语法,包括表达式、操作数、操作符、算术操作符、关系操作符、等价操作符、逻辑操作符、按位操作符、移位操作符、拼接操作符、条件操作符以及Verilog编译指令。关键词:Verilog, 表达式, 操作符, 编译指令, 按位操作目录 表达式 Verilog 编译指令 表达式 表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。例如: a^b ; //a与b进行异或操作 address[9:0] + 10'b1 ; //地址累加 flag1 && flag2 ; //逻辑与操作操作数 操作数可以是任意的数据类型,只是某些特定的语法结构要求使用特定类型的操作数。 操作数可以为常数,整数,实数,线网,寄存器,时间,位选,域选,存储器及函数调用等。 module test; //实数 real a, b, c; c = a + b ; //寄存器 reg [3:0] cprmu_1, cprmu_2 ; always @(posedge clk) begin cprmu_2 = cprmu_1 ^ cprmu_2 ; end //函数 reg flag1 ; flag = calculate_result(A, B); //非法操作数 reg [3:0] res; wire [3:0] temp; always@ (*)begin res = cprmu_2 – cprmu_1 ; //temp = cprmu_2 – cprmu_1 ; //不合法,always块里赋值对象不能是wire型 end endmodule操作符 Verilog 中提供了大约 9 种操作符,分别是算术、关系、等价、逻辑、按位、归约、移位、拼接、条件操作符。 大部分操作符与 C 语言中类似。同类型操作符之间,除条件操作符从右往左关联,其余操作符都是自左向右关联。圆括号内表达式优先执行。例如下面每组的 2 种写法都是等价的。 图片 不同操作符之间,优先级是不同的。下表列出了操作符优先级从高至低的排列顺序。当没有圆括号时,Verilog 会根据操作符优先级对表达式进行计算。为了避免由操作符优先级导致的计算混乱,在不确定优先级时,建议用圆括号将表达式区分开来。 图片 算术操作符 算术操作符包括单目操作符和双目操作符。 双目操作符对 2 个操作数进行算术运算,包括乘()、除(/)、加(+)、减(-)、求幂(*)、取模(%)。 reg [3:0] a, b; reg [4:0] c ; a = 4'b0010 ; b = 4'b1001 ; c = a+b; //结果为c=b'b1011 c = a/b; //结果为c=4,取整如果操作数某一位为 X,则计算结果也会全部出现 X。例如: b = 4'b100x ; c = a+b ; //结果为c=4'bxxxx对变量进行声明时,要根据变量的操作符对变量的位宽进行合理声明,不要让结果溢出。上述例子中,相加的 2 个变量位宽为 4bit,那么结果寄存器变量位宽最少为 5bit。否则,高位将被截断,导致结果高位丢失。无符号数乘法时,结果变量位宽应该为 2 个操作数位宽之和。 reg [3:0] mula ; reg [1:0] mulb; reg [5:0] res ; mula = 4'he ; mulb = 2'h3 ; res = mula * mulb ; //结果为res=6'h2a, 数据结果没有丢失位数 和 - 也可以作为单目操作符来使用,表示操作数的正负性。此类操作符优先级最高。 -4 //表示负4 +3 //表示正3 负数表示时,可以直接在十进制数字前面增加一个减号 -,也可以指定位宽。因为负数使用二进制补码来表示,不指定位宽来表示负数,编译器在转换时,会自动分配位宽,从而导致意想不到的结果。例如: mula = -4'd4 ; mulb = 2 ; res = mula * mulb ; //计算结果为res=-6'd8, 即res=6'h38,正常 res = mula * (-'d4) ; //(4的32次幂-4) * 2, 结果异常关系操作符 关系操作符有大于(>),小于(<),大于等于(>=),小于等于(<=)。 关系操作符的正常结果有 2 种,真(1)或假(0)。 如果操作数中有一位为 x 或 z,则关系表达式的结果为 x 。 A = 4 ; B = 3 ; X = 3'b1xx ; A > B //为真 A <= B //为假 A >= Z //为X,不确定等价操作符 等价操作符包括逻辑相等(==),逻辑不等(!=),全等(===),非全等(!==)。 等价操作符的正常结果有 2 种:为真(1)或假(0)。 逻辑相等/不等操作符不能比较 x 或 z,当操作数包含一个 x 或 z,则结果为不确定值。 全等比较时,如果按位比较有相同的 x 或 z,返回结果也可以为 1,即全等比较可比较 x 或 z。所以,全等比较的结果一定不包含 x。举例如下: A = 4 ; B = 8'h04 ; C = 4'bxxxx ; D = 4'hx ; A == B //为真 A == (B + 1) //为假 A == C //为X,不确定 A === C //为假,返回值为0 C === D //为真,返回值为1逻辑操作符 逻辑操作符主要有 3 个:&&(逻辑与), ||(逻辑或),!(逻辑非)。 逻辑操作符的计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。 如果一个操作数不为 0,它等价于逻辑 1;如果一个操作数等于 0,它等价于逻辑 0。如果它任意一位为 x 或 z,它等价于 x。 如果任意一个操作数包含 x,逻辑操作符运算结果不一定为 x。 逻辑操作符的操作数可以为变量,也可以为表达式。例如: A = 3; B = 0; C = 2'b1x ; A && B // 为假 A || B // 为真 ! A // 为假 ! B // 为真 A && C // 为X,不确定 A || C // 为真,因为A为真 (A==2) && (! B) //为真,此时第一个操作数为表达式按位操作符 按位操作符包括:取反(~),与(&),或(|),异或(^),同或(~^)。 按位操作符对 2 个操作数的每 1bit 数据进行按位操作。 如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。 取反操作符只有一个操作数,它对操作数的每 1bit 数据进行取反操作。 下图给出了按位操作符的逻辑规则。 图片 A = 4'b0101 ; B = 4'b1001 ; C = 4'bx010 ; ~A //4'b1010 A & B //4'b0001 A | B //4'b1101 A^B //4'b1100 A ~^ B //4'b0011 B | C //4'b1011 B&C //4'bx000移位操作符 移位操作符包括左移(<<),右移(>>),算术左移(<<<),算术右移(>>>)。 移位操作符是双目操作符,两个操作数分别表示要进行移位的向量信号(操作符左侧)与移动的位数(操作符右侧)。 算术左移和逻辑左移时,右边低位会补 0。 逻辑右移时,左边高位会补 0;而算术右移时,左边高位会补充符号位,以保证数据缩小后值的正确性。 A = 4'b1100 ; B = 4'b0010 ; A = A >> 2 ; //结果为 4'b0011 A = A << 1; //结果为 4'b1000 A = A <<< 1 ; //结果为 4'b1000 C = B + (A>>>2); //结果为 2 + (-4/4) = 1, 4'b0001拼接操作符 拼接操作符用大括号 {,} 来表示,用于将多个操作数(向量)拼接成新的操作数(向量),信号间用逗号隔开。 拼接符操作数必须指定位宽,常数的话也需要指定位宽。例如: A = 4'b1010 ; B = 1'b1 ; Y1 = {B, A[3:2], A[0], 4'h3 }; //结果为Y1='b1100_0011 Y2 = {4{B}, 3'd4}; //结果为 Y2=7'b111_1100 Y3 = {32{1'b0}}; //结果为 Y3=32h0,常用作寄存器初始化时匹配位宽的赋初值条件操作符 条件表达式有 3 个操作符,结构描述如下: condition_expression ? true_expression : false_expression 计算时,如果 condition_expression 为真(逻辑值为 1),则运算结果为 true_expression;如果 condition_expression 为假(逻辑值为 0),则计算结果为 false_expression。 assign hsel = (addr[9:8] == 2'b0) ? hsel_p1 : hsel_p2 ; //当信号 addr 高 2bit 为 0 时,hsel 赋值为 hsel_p1; 否则,将 hsel_p2 赋值给 hsel。 其实,条件表达式类似于 2 路(或多路)选择器,其描述方式完全可以用 if-else 语句代替。 当然条件操作符也能进行嵌套,完成一个多次选择的逻辑。例如 assign hsel = (addr[9:8] == 2'b00) ? hsel_p1 : (addr[9:8] == 2'b01) ? hsel_p2 : (addr[9:8] == 2'b10) ? hsel_p3 : (addr[9:8] == 2'b11) ? hsel_p4 ;Verilog 编译指令 以反引号 ` 开始的某些标识符是 Verilog 系统编译指令。 编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。 下面介绍下完整的 8 种编译指令,其中前 4 种使用频率较高。 `define `undef 在编译阶段,`define 用于文本替换,类似于 C 语言中的 #define。 一旦 `define 指令被编译,其在整个编译过程中都会有效。例如,在一个文件中定义: `define DATA_DW 32 则在另一个文件中也可以直接使用 DATA_DW `define S $stop; //用`S来代替系统函数$stop; (包括分号) `define WORD_DEF reg [31:0] //可以用`WORD_DEF来声明32bit寄存器变量`undef 用来取消之前的宏定义,例如 `define DATA_DW 32 …… reg [DATA_DW-1:0] data_in ; …… `undef DATA_DW `ifdef, `ifndef, `elsif, `else, `endif`ifdef MCU51 parameter DATA_DW = 8 ; `elsif WINDOW parameter DATA_DW = 64 ; `else parameter DATA_DW = 32 ; `endif图片 当然,也可用 `ifndef 来设置条件编译,表示如果没有相关的宏定义,则执行相关语句。 下面例子中,如果定义了 WINDOW,则使用第二种参数说明。如果没有定义 WINDOW,则使用第一种参数说明。 `ifndef WINDOW parameter DATA_DW = 32 ; `else parameter DATA_DW = 64 ; `endif`include 使用 `include 可以在编译时将一个 Verilog 文件内嵌到另一个 Verilog 文件中,作用类似于 C 语言中的 #include 结构。该指令通常用于将全局或公用的头文件包含在设计文件里。 文件路径既可以使用相对路径,也可以使用绝对路径。 `include "../../param.v" `include "header.v"`timescale 在 Verilog 模型中,时延有具体的单位时间表述,并用 `timescale 编译指令将时间单位与实际时间相关联。 该指令用于定义时延、仿真的单位和精度,格式为: `timescale time_unit / time_precisiontime_unit 表示时间单位,time_precision 表示时间精度,它们均是由数字以及单位 s(秒),ms(毫秒),us(微妙),ns(纳秒),ps(皮秒)和 fs(飞秒)组成。时间精度可以和时间单位一样,但是时间精度大小不能超过时间单位大小,例如下面例子中,输出端 Z 会延迟 5.21ns 输出 A&B 的结果。 `timescale 1ns/100ps //时间单位为1ns,精度为100ps,合法 //`timescale 100ps/1ns //不合法 module AndFunc(Z, A, B); output Z; input A, B ; assign #5.207 Z = A & B endmodule图片 `timescale 10ns/1ns module test; reg A, B ; wire OUTZ ; initial begin A = 1; B = 0; # 1.28 B = 1; # 3.1 A = 0; end AndFunc u_and(OUTZ, A, B) ; endmodule在模块 AndFunc 中,5.207 对应 5.21ns。 在模块 test 中,1.28 对应 13ns,3.1 对应 31ns。 但是,当仿真 test 时,由于 AndFunc 中的最小精度为 100ps,因此 test 中的时延精度将进行重新调整。13ns 将对应 130100ps,31ns 将对应 310100ps。仿真时,时延精度也会使用 100ps。仿真时间单位大小没有影响。 如果有并行子模块,子模块间的 `timescale 并不会相互影响。 例如在模块 test 中再例化一个子模块 OrFunc。仿真 test 时,OrFunc 中的 #5.207 延时依然对应 52ns。 //子模块: `timescale 10ns/1ns //时间单位为1ns,精度为100ps,合法 module OrFunc(Z, A, B); output Z; input A, B ; assign #5.207 Z = A | B endmodule //顶层模块: `timescale 10ns/1ns module test; reg A, B ; wire OUTZ ; wire OUTX ; initial begin A = 1; B = 0; # 1.28 B = 1; # 3.1 A = 0; end AndFunc u_and(OUTZ, A, B) ; OrFunc u_and(OUTX, A, B) ; endmodule此例中,仿真 test 时,OrFunc 中的 #5.207 延时依然对应 52ns。 `timescale 的时间精度设置是会影响仿真时间的。时间精度越小,仿真时占用内存越多,实际使用的仿真时间就越长。所以如果没有必要,应尽量将时间精度设置的大一些。 `default_nettype 该指令用于为隐式的线网变量指定为线网类型,即将没有被声明的连线定义为线网类型。 `default_nettype wand该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中的连线没有说明,那么该线网被假定为线与类型。 `default_nettype none该实例定义后,将不再自动产生 wire 型变量。 例如下面第一种写法编译时不会报 Error,第二种写法编译将不会通过。 //Z1 无定义就使用,系统默认Z1为wire型变量,有 Warning 无 Error module test_and( input A, input B, output Z); assign Z1 = A & B ; endmodule//Z1无定义就使用,由于编译指令的存在,系统会报Error,从而检查出书写错误 `default_nettype none module test_and( input A, input B, output Z); assign Z1 = A & B ; endmodule图片 `celldefine module ( input clk, input rst, output clk_pll, output flag); …… endmodule `endcelldefine图片
FPGA&ASIC
刘航宇
4年前
0
1,224
1
【1】Verilog-初识、简介与环境搭建
摘要Verilog是一种强大的硬件描述语言,用于数字系统描述和建模,广泛应用于ASIC设计。本文介绍了Verilog的发展历史、主要特性、应用领域以及环境搭建过程,包括Quartus II和Modelsim的使用。关键词:Verilog, 硬件描述语言, FPGA, Quartus II, Modelsim目录 发展历史 主要特性 主要应用 Verilog 环境搭建Quartus II 安装 Modelsim 安装 建立 Quartus II 工程建立工程 新建 Verilog 源文件 Quartus II 调用 Modelsim 仿真 总结 Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。 发展历史 1983 年,Verilog 最初由 Gateway Design Automation 公司(GDA)的 Phil Moorby 创建,作为内部仿真器的语言,主要用于逻辑建模和仿真验证,被广泛使用。 1989 年,GDA 公司被 Cadence 公司收购,Verilog 语言成为 Cadence 公司的私有财产。 1990 年,Cadence 公司成立 OVI(Open Verilog International)组织,公开 Verilog 语言,促进 Verilog 向公众领域发展。 1992 年,OVI 决定致力于将 Verilog OVI 标准推广为 IEEE(The Institute of Electrical and Electronics Engineers)标准。 1995 年,OVI 的努力获得成功,IEEE 制定了 Verilog HDL 的第一个国际标准,即 IEEE Std 1364-1995,也称之为 Verilog 1.0。 2001 年,IEEE 发布 Verilog 第二个标准(Verilog 2.0),即 IEEE Std 1364-2001, 简称为 Verilog-2001 标准。由于 Cadence 在集成电路设计领域的影响力及 Verilog 语言的简洁易用性,Verilog 成为电路设计中最流行的硬件描述语言。 主要特性 下面是 Verilog 的主要特性: 可采用 3 种不同的方式进行设计建模:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构化方式——使用门和模块例化语句描述。 两类数据类型:线网(wire)数据类型与寄存器(reg)数据类型,线网表示物理元件之间的连线,寄存器表示抽象的数据存储元件。 能够描述层次设计,可使用模块实例化描述任何层次。 用户定义原语(UDP)创建十分灵活。原语既可以是组合逻辑,也可以是时序逻辑。 可提供显示语言结构指定设计中的指定端口到端口的时延,以及路径时延和时序检查。 Verilog 支持其他编程语言接口(PLI)进行进一步扩展。PLI 允许外部函数访问 Verilog 模块内部信息,为仿真提供了更加丰富的测试方法。 同一语言可用于生成模拟激励和指定测试的约束条件。 设计逻辑功能时,设计者可不用关心不影响逻辑功能的因素,例如工艺、温度等。 主要应用 专用集成电路(ASIC),就是具有专门用途和特殊功能的独立集成电路器件。 Verilog 作为硬件描述语言,主要用来生成专用集成电路。 主要通过 3 个途径来完成: 1、可编程逻辑器件 FPGA 和 CPLD 是实现这一途径的主流器件。他们直接面向用户,具有极大的灵活性和通用性,实现快捷,测试方便,开发效率高而成本较低。 2、半定制或全定制 ASIC 通俗来讲,就是利用 Verilog 来设计具有某种特殊功能的专用芯片。根据基本单元工艺的差异,又可分为门阵列 ASIC,标准单元 ASIC,全定制 ASIC。 3、混合 ASIC 主要指既具有面向用户的 FPGA 可编程逻辑功能和逻辑资源,同时也含有可方便调用和配置的硬件标准单元模块,如CPU,RAM,锁相环,乘法器等。 Verilog 环境搭建 学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus Verilog 和 GTKwave 的方法,更加的轻便。 虽然 ISE 或者 Quartus II 都会自带仿真器,但功能还是有欠缺。所以,这里介绍下 Quartus II + Modelsim 联合仿真的测试方法,运行环境为 64bit-win10 系统。 Quartus II 安装 本次介绍使用的 Quartus 版本为 10.1。 目前 Quartus II 官网已经没有 13.1 以下版本的安装包,大家可以安装 13.1 以上版本的软件。功能都是大同小异,下载地址:https://fpgasoftware.intel.com/13.1/?edition=subscription&platform=windows 下载 13.1 以上的 quartus II 时,官网也会推荐相应版本的 Modelsim,一起下载即可。 开始安装,修改安装路径,其他按照默认设置一步步操作即可。 下图是成功安装的截图。 图片 如果提示需要 License file,如下图所示,则需要指定购买该软件时的 license 文件。 图片 如果 license 文件需要替换 Host-ID,只需要 license 文件中的 HOSTID 替换为 NIC 选项中随便一个 ID 即可,如下图红色框所示: l35kw97h.png图片 Quartus II 10.1 安装完还需要安装 Device,即安装支持各种可编程逻辑器件型号的库文件,否则 Quartus II 不能正常建立工程。 安装路径需要选择 Quartus II 的安装路径,此时 Device 安装可自动识别 Quartus II。 最新 Quartus II(例如 2016 版本)已经支持一套化安装了。 Modelsim 安装 Modelsim 选择 modelsim-win64-10.1c-se 版本。 也需要修改下安装路径,然后按照默认设置进行操作即可。 安装完毕后可能提示需要重启电脑,重启即可。 l35kwto3.png图片 建立 Quartus II 工程 建立工程 File->New project Wizard 设置工作路径与工程名字、top module名字。 注意,路径与名字设置时,不能包含中文。 l35kymsh.png图片 选择器件型号 我们只进行简单的仿真,不进行下载、烧录等,所以我们不用关心具体信号,随便选一种即可。 然后一直点击 Next,直到 Finish。 l35kz8mf.png图片 新建 Verilog 源文件 下面就对 4 位宽 10 进制计数器进行简单的仿真。 点击:File->New->Verilog HDL File->OK 点击:File->Save As 输入 module 名字为:counter10.v 需要注意的是,top module 名字一定要和 project 名字一致,否则会报错(如图中所示)。 把 Verilog 代码复制到文件 counter10.v 中,进行一键编译(实际包含了编译、综合、布局布线等)。 代码: module counter10( //端口定义 input rstn, //复位端,低有效 input clk, //输入时钟 output [3:0] cnt, //计数输出 output cout); //溢出位 reg [3:0] cnt_temp ; //计数器寄存器 always@(posedge clk or negedge rstn) begin if(! rstn)begin //复位时,计时归0 cnt_temp <= 4'b0 ; end else if (cnt_temp==4'd9) begin //计时10个cycle时,计时归0 cnt_temp <=4'b000; end else begin //计时加1 cnt_temp <= cnt_temp + 1'b1 ; end end assign cout = (cnt_temp==4'd9) ; //输出周期位 assign cnt = cnt_temp ; //输出实时计时器 endmodule报错时,可通过点击 Error log 来定位错误,进行修改,直至没有 Error。 l35kzvy2.png图片 Quartus II 调用 Modelsim 仿真 仿真设置为 Modelsim-altera 点击:Tool->Options->EDA Tool Options 将 Modelsim 后面的地址改为 Modelsim 启动程序的路径。 l35l1p4j.png图片 选择仿真器 点击:Assignments -> Simulation Tool name 选择 ModelSim,并设置 Format、Time scale 等,如图 l35l22b6.png图片 写 testbench 文件 点击:Processing->start->Start TestBench Template Writer 如果设置正确,会在工程路径 simulation/modelsim 下产生 .vt 文件。 .vt 文件模板已经给出了端口部分的代码、接口变量的声明和例化语句映射等。我们要做的就是将测试代码填入到 testbench 合适的位置。 这里简单的写一下时钟、复位驱动代码,如下图所示。 l35l2is4.png图片 将 testbench 添加到工程中 点击:Assignments -> Settings -> Simulation 在 Compile test bench 选项中,选择 new,设置 Test bench name,并通过 File name 查找的方式,将上一步生成的 .vt 文件添加到工程中。 需要注意的是,testbench 文件名字需要和 testbench 里的 top module 名字保持一致,否则后续启动 Modelsim 时会报错,不能进行正常的仿真。 l35l2w7o.png图片 重新一键编译 此时,你会发现,Tasks 栏编译的状态变成了问号,需要重新进行一键编译。 l35l3k7f.png图片 调用 Modelsim 仿真 点击:Tools->Run simulation Tool->RTL Simulation 这时就会自动启动 Modelsim 软件。 Modelsim 操作这里不做具体介绍。 由仿真图可知,我们的设计完成了 10 进制计数的基本功能。 l35l42j9.png图片 总结 记忆中,Quartus II + Modelsim 的联合仿真功能既强大,又安装方便。几年后重新进行此过程,发现步骤也有些许繁琐,花费了我一晚上的时间来搞定。很多细节也在上面提出,多多注意就好。不过,大家以后有机会进行大型的数字模块仿真时,就会发现此方法的有效性。 在接下来的教程里,有些简单的仿真可能用其他软件进行,截图界面可能与 Modelsim 不一致。大家看到后不用怀疑仿真的准确性,这里特别说明。 设计模块与 testbench 源码也会全部给出,大家完全可以自己仿真、验证。
FPGA&ASIC
刘航宇
4年前
0
977
2
电子皮肤-身体耦合动力传输和能量收集
摘要新加坡国立大学研究团队开发了一种利用身体耦合特性的电力传输和能量收集系统,通过电磁波为人体周围设备供电,有效克服了传统无线电力传输的局限性,为可穿戴设备提供可持续电力。关键词:电子皮肤, 身体耦合, 动力传输, 能量收集, 可穿戴设备目录 研究背景 创新点 文章解析 读后感 研究背景 无线电力传输和能量收集技术可用于为人体内部、表面和周围的设备供电和运行。然而,近场功率传输方法受到距离的限制,远场射频方法的效率受到身体阴影效应的限制。 创新点 新加坡国立大学Jerald Yoo课题组报道电磁波的身体耦合特性(人工引入或存在于周围环境中)可用于实现电力传输和能量收集方法,为身体周围的各个位置提供电力。在存在身体阴影的情况下,身体耦合功率传输的路径损耗比远场射频传输低 30 到 70 分贝。该系统可以从放置在脚踝处 160 cm 处的 ~1.2mW 发射器在头部恢复 2 µW。在没有有源功率发射器的情况下,作者展示了对耦合到人体上的环境电磁波的与位置无关的收集,从而从身体上高达 -10-dBm 的电磁波中恢复约 2.2 μW 的功率。 文章解析 图片 图1:体耦合电力传输和环境能量收集方法。概念说明,包括潜在能源、潜在应用和电力传输/能量收集介质/通道。红色箭头显示了穿过人体的电力传输路径的示例。蓝色箭头显示耦合到人体上的环境电磁波。出于说明目的,功率发射器(有源源)和接收器/收集器的位置显示在几个可能的位置。 图片 图2:人体作为电力传输和环境电磁能量收集介质的特性。 图片 图3:以人体为媒介回收的力量的数量和特征。 图片 读后感 作者报道了一种身体耦合电力传输和环境电磁能量收集系统,该系统可用于为人体周围的可穿戴设备提供可持续的电力。通过利用主动引入的电场和环境电磁波的身体耦合特性,这种方法可以避免身体阴影效应。作者通过具有阻抗匹配和增强技术的发射器和接收器/收集器设备证明了该方法的覆盖范围和有效性。52 μW 的功率可以在 15 cm 处恢复,在 160 cm 处可以恢复 2 μW,发射器在 3 VPP 下输出 ~1.2 mW。在相距 15 cm 处,当发射器输出电压增加到 10 VPP 时,可以恢复 0.8 mW。2.2 μW 的功率可以从高达 -10 dBm 的环境身体耦合 EM 能量中获得,与电极放置和尺寸无关。该方法克服了有限的身体功率传输距离和依赖于位置的能量收集的挑战,可用于开发具有增强的功率回收和清除效率以及全身使用可靠性的小型化可穿戴设备。
我的随笔
刘航宇
4年前
0
1,160
5
2022-04-20
HAL库开发stm32 DHT11传感器
摘要本文介绍了如何使用HAL库开发stm32微控制器与DHT11传感器进行数据交互。文章详细说明了初始化、读取数据以及错误处理的过程,并提供了相应的代码示例。关键词:HAL库, STM32, DHT11传感器, 传感器数据读取, 温湿度采集目录 现象 dht11.h dht11.c main.c添加 PB1引脚设置output即可,不想用PB1,修改引脚办法,修改dht11.c文件中的所有端口和引脚 现象 图片 dht11.h #ifndef __HT11_H_ #define __HT11_H_ #include "main.h" #include "stm32f1xx_hal.h" //函数原型 //void delay_us(uint8_t); //微妙延时函数,启用了一个定时器。因为DHT11通讯过程涉及微妙延时 void GPIO_Input(void); //GPIO 状态转变的函数 CUBEMX默认的GPIO初始化我只开启了相关总线的使能 //把GPIO状态(输入 输出)封装成了两个函数 void GPIO_Output(void); void DHT11_Rst(void); //主机开始采集的信号 uint8_t DHT11_Check(void); //检查DHT是否回应 uint8_t DHT11_Init(void); //初始化函数 uint8_t DHT11_ReadBit(void); //读取一位 uint8_t DHT11_ReadByte(void); //读取一个字节 uint8_t DHT11_ReadData(uint8_t *); //读取数据(40个位) #endif dht11.c #include "dht11.h" #define CPU_FREQUENCY_MHZ 72 // CPU主频,根据实际进行修改 static void delay_us(uint32_t delay) { int last, curr, val; int temp; while (delay != 0) { temp = delay > 900 ? 900 : delay; last = SysTick->VAL; curr = last - CPU_FREQUENCY_MHZ * temp; if (curr >= 0) { do { val = SysTick->VAL; } while ((val < last) && (val >= curr)); } else { curr += CPU_FREQUENCY_MHZ * 1000; do { val = SysTick->VAL; } while ((val <= last) || (val > curr)); } delay -= temp; } } void GPIO_Input(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pin : PB1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void GPIO_Output(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pin : PB1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void DHT11_Rst(void) //主机开始信号 { GPIO_Output(); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); delay_us(30); } uint8_t DHT11_Check(void) { uint8_t retry = 0; GPIO_Input(); while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) && retry <100) //等待回应拉位低电平 { retry++; delay_us(1); } if(retry >= 100)return 1;else retry = 0; //当变量值大于100 返回1 说明无响应 返回 0 则为正确响应 while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) && retry <100) //等待变为高电平 { retry++; delay_us(1); } if(retry >= 100)return 1; return 0; } uint8_t DHT11_Init(void) { DHT11_Rst(); return DHT11_Check(); } uint8_t DHT11_ReadBit(void) //读取一个位 { uint8_t retry = 0; while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) && retry <100) //等待变为低电平 { retry++; delay_us(1); } retry = 0; while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) && retry <100) //等待变为高电平 { retry++; delay_us(1); } delay_us(40); //40us 后如果为低电平 数据为0 高电平数据为1 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))return 1;else return 0; } uint8_t DHT11_ReadByte(void) //读取一个字节 返回值位采集值 { uint8_t i,dat; dat = 0; for(i = 0;i < 8;i++) { dat <<= 1; //数据左移一位 dat |= DHT11_ReadBit(); //每读取到一个位 放到dat的最后一位 } return dat; } uint8_t DHT11_ReadData(uint8_t *h) { uint8_t buf[5]; uint8_t i; DHT11_Rst(); if(DHT11_Check() == 0){ for(i = 0;i < 5;i++) { buf[i] = DHT11_ReadByte(); } if(buf[0] + buf[1] + buf[2] + buf[3] == buf[4]) { *h = buf[0]; h++; *h = buf[2]; } }else return 1; return 0; } main.c添加 //你自己要完成OLED显示出温度湿度哈,这个我就不写代码了,不然真的是再喂饭了呜呜 #include "dht11.h" //引入头文件 #include "stdio.h" uint8_t data[2]; //定义一个数据数组 uint8_t buff1[]="dht11 ok\r\n"; uint8_t buff2[]="dht11 error"; uint8_t str_buff[64]; //int main 死循环外面 if(DHT11_Init() == 0) { //这里显示了“温度”“湿度等字符” HAL_UART_Transmit(&huart1,buff1,sizeof(buff1),10000); } else{ //OLED_ShowStr(0,0,"DHT11 error!",1); HAL_UART_Transmit(&huart1,buff2,sizeof(buff2),10000); } HAL_Delay(1000); while (1) { if(DHT11_ReadData(data) == 0) { //显示相关数据 sprintf((char *)str_buff,"温度%d%d;湿度%d%d\r\n",data[0] /10 ,data[0] %10,data[1] /10,data[1] /10); HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000); } HAL_Delay(1000); //DHT11每次采集一定要间隔1s //你自己要完成OLED显示出温度湿度哈,这个我就不写代码了,不然真的是再喂饭了呜呜! }
嵌入式&系统
# 嵌入式
刘航宇
4年前
0
1,258
18
2022-04-12
【视频课程】STM32系统开发与protues仿真快速入门课
摘要本课程为STM32系统开发与protues仿真快速入门,涵盖GPIO、中断、定时器、AD/DA、传感器、串口通信等,由浅入深,条理清晰,适合初学者。关键词:STM32, Protues仿真, 系统开发, GPIO, 传感器STM32系统开发与protues仿真快速入门课,上课层次分明,包含gpio与按键开发,中断,定时器,AD/DA转化,传感器,串口通信,远程通信技术,OLED液晶显示等等,由间到难,条理清晰。 如果视频失效,请关注我的哔哩哔哩账号可以免费观看 目录 GPIO&键盘扫描 定时器&OLED 串口&TIM+串口 传感器基础&OLED动态显示传感器原理&ADC基础 OLED动态显示 解决1us实现办法 远程通信&结语串口调试工具 综合视频 GPIO&键盘扫描 定时器&OLED 串口&TIM+串口 传感器基础&OLED动态显示 传感器原理&ADC基础 OLED动态显示 本节OLED配置允许不设置PB12-P15 output,直接基本三步后可以创建工程文件 解决1us实现办法 关于传感器代码移植,可以下载网上开源的驱动文件xx.h和xx.c文件,类似OLED驱动文件一样分别添加到工程文件夹中的Inc和Src中,最后用keill5打开用ADD进行文件添加!此处忘了可以回放第二节课OLED课 delay_ms实现 static inline void delay_ms(uint32_t delay) { HAL_Delay(delay); }delay_us实现 #define CPU_FREQUENCY_MHZ 72 // CPU主频,根据实际进行修改 static void delay_us(uint32_t delay) { int last, curr, val; int temp; while (delay != 0) { temp = delay > 900 ? 900 : delay; last = SysTick->VAL; curr = last - CPU_FREQUENCY_MHZ * temp; if (curr >= 0) { do { val = SysTick->VAL; } while ((val < last) && (val >= curr)); } else { curr += CPU_FREQUENCY_MHZ * 1000; do { val = SysTick->VAL; } while ((val <= last) || (val > curr)); } delay -= temp; } } 远程通信&结语 串口调试工具 串口调试助手 下载地址:https://wwu.lanzoub.com/i1y1g03gtifc 提取码: 综合视频
嵌入式&系统
刘航宇
4年前
0
1,675
15
2022-04-07
STM32CubeMX 软件安装明细教程
摘要本文详细介绍了STM32CubeMX软件的安装过程,包括安装JRE、STM32CubeMX软件和固件支持包,并提供了下载链接和安装步骤。关键词:STM32CubeMX, 软件安装, 固件支持包, 安装教程, STM32CubeMX V5.50 STM32CubeMX 软件的安装分为三个部分: 1-安装 JRE,JAVA 运行环境。 2-安装 STM32CubeMX 软件。 3-安装芯片的固件支持包,也就是 HAL 库。 清单:请依据清单进行复制在网上查对应版本下载(推荐用必应搜索) 1、JRE-8u201-windows-x64:64 位的 JRE 安装文件。 参考下载地址: https://www.java.com/zh_CN/download/windows-64bit.jsp(尽量安装最新版 64 位的Java) 2、en.stm32cubemx_v5-5-0:STM32CubeMX V5.50 安装文件。(可以最新版,STM32CubeMX 官网上可以免费下载) 3、STM32Cube_FW_F1_V1.8.0:STM32F1 系列芯片的固件支持包 V1.80。 4、STM32Cube_FW_L1_V1.9.0:STM32L1 系列芯片的固件支持包 V1.90。 目录 第 1 部分:安装 JRE。 第 2 部分:安装 STM32CubeMX 5.50 第 3 部分:安装固件支持包 第 1 部分:安装 JRE。 【01】点击“jre-8u201-windows-x64.exe”可执行文件,在欢迎界面中,点击“安装”按 钮开始安装 64 位的 JRE(注意:如果电脑操作系统为 32 位,请安装 32 位的 JRE)。 图片 【02】点击“确定”按钮,接受软件安装许可。 图片 【03】等待 JRE 安装完成。 图片 【04】 点击“关闭”按钮,结束安装程序,JRE 安装完成。 图片 第 2 部分:安装 STM32CubeMX 5.50 【01】 点击“en.stm32cubemx_v5-5-0”文件夹中的“SetupSTM32CubeMX-5.5.0.exe”, 即可开始安装 STM32CubeMX 5.50 版本,点击“Next”进入下一个界面。 图片 【02】 接受安装许可协议,点击“Next”进入下一个界面。 图片 【03】 把 2 个选项都勾选,才能点击“Next”进入下一个界面进行后续的安装。 图片 【04】指定安装路径,一般默认即可,点击“Next”,会弹出一个创建文件夹的消息框。 图片 【05】 在弹出的消息框中,点击“确定”进入下一个安装界面。 图片 【06】 在快捷图标的配置界面中,保持默认即可,点击“Next”进 图片 【07】 点击“Next”,开始安装软件,等待安装完成。 图片 【08】 点击“Next”,你将会看到安装完成的界面,点击“Done”结束安装程序。 图片 第 3 部分:安装固件支持包 【01】 点击桌面上“STM32CubeMX”快捷图标,打开该软件。 图片 【02】 点击“Help”菜单中的“Manage embedded software packages”菜单项。 图片 【03】 在弹出的“Embedded Software Packages Manager”对话框中,可以看到 ST 公司的各个 STM32 系列微处理器,展开某一系列的微处理器就可看到你可以获取的固件支持包的版本和大小。对于没有安装的固件支持包,其左侧的小方框是空白的,如果安装成功的 固件支持包,改小方框内部则填充为浅绿色。 在该对话框中,你可以通过左下角的“From Loacal…”按钮进行导入本地离线包,或者通过“From Url…”按钮进行在线下载解压安装。 选一个最新的库也可以的,安装只需要点击安装那个单词!安装完毕后就结束了可以听课了! 报错看这个: https://blog.csdn.net/it_angel_/article/details/104442217 图片 【04】 在本教程中采用的是最方便快捷的安装方式-解压离线包。 首先创建一个文件夹,用来存放你已经下载并解压好的芯片固件支持包,例如:在 C 盘下创建名为“STM32Cube_FW”的文件夹,并将解压后的固件支持包拷贝过来。 图片 【05】 在 STM32CubeMX 主界面中点击“Help” 菜单中的“Updater Settings”菜单项。 图片 【06】 在弹出的“Updater Settings”对话框中,你看到固件支持包保存的默认路径。 图片 【07】 点击默认路径右边的“Browse”按钮,指定到我们下载并压缩好的固件支持包保存的文件夹位置,即 C 盘下的“STM32Cube_FW”的文件夹。 图片 【08】 点击“OK”即可完成固件支持包的安装。 再次打开“Embedded Software Packages Manager”对话框,此时,你将看到已经安装好的芯片固件支持包左侧的小方框里面填充满了浅绿色,同时显示你安装的版本号。 至此,整个 STM32CubeMX 的软件安装完成。 图片
刘航宇
4年前
2
3,598
15
2022-04-07
西北大学模拟电子技术个人考研笔记
摘要西北大学模拟电子技术考研笔记分享,包含历年真题及个人学习笔记,供考研学子参考。关键词:西北大学, 模拟电子技术, 考研笔记, 历年真题, 843, 849西北大学843、849历年真题 下载地址:https://wwaqw.lanzoue.com/i2nMY2g3qh4j 提取码: 警告 若个人或辅导机构 擅自复制本文直接或间接盈利 、请向我举报,举报方式见下面,本人以 著作权法 追查到底!同时核查该机构/个人 是否有非法出书情况 、是否有 出版权与书号 , 一并交于公安机关追查 ! 本站域名由sciarm.com更变为ee.ac.cn 和下文页面中信息不冲突 举报方式-请携带证据举报 1.邮箱hyliu@ee.ac.cn 2.点击博客中留言或私聊都可
嵌入式&系统
我的随笔
# 电子线路
刘航宇
4年前
0
1,969
33
UltraSE: Single-Channel Speech Enhancement Using Ultrasound阅读感悟
摘要UltraSE利用超声波传感和深度学习技术,从噪声中分离说话者语音,显著提高语音清晰度和质量,优于现有语音增强方法。关键词:UltraSE, Single-Channel Speech Enhancement, Ultrasound Sensing, Deep Learning, Multimodal Fusion目录 一、论文基本信息 二、论文主要内容2.1 研究的背景 2.2 研究的目标 2.4 困难与拟解决对策, 2.5 技术优势 2.6 研究技术简述 2.6.1 ULTRASE DNN 模型概述2.6.2 基于 CGAN 的跨模态训练 2.6.3 ULTRASE 实现 2.7 研究验证2.7.1 微基准比较 2.7.2 消融研究 2.7.3 系统效率 2.8 文章结论 三、阅读理解与心得 参考文献 一、论文基本信息 作者 :孙科(加州大学圣地亚哥分校); 张新宇(加州大学圣地亚哥分校) 出版源 :第27届移动计算和网络国际会议论文集2021年10月第160-173页 摘要 :鲁棒语音增强被认为是音频处理的圣杯,也是人机交互的关键要求。用单通道、纯音频方法解决这个任务仍然是一项艰巨的挑战,尤其是在涉及相互竞争的扬声器和背景噪声混合的实际场景中。在本文中,我们提出了UltraSE,它使用超声波传感作为一种补充模式,将所需说话者的声音从干扰和噪声中分离出来。UltraSE使用商用移动设备(例如智能手机)发射超声波并捕捉说话者发音手势的反射。 它引入了一种多模态、多领域的深度学习框架来融合超声多普勒特征和可听语音频谱图。此外,它还利用一个基于跨模态相似性测量网络的经过对抗性训练的鉴别器来学习两种异质特征模式之间的相关性。我们实验验证了UltraSE同时提高了语音清晰度和质量,并且大大优于最先进的解决方案。 二、论文主要内容 2.1 研究的背景 人类听觉系统非常有能力在干扰扬声器和噪音的混合中挑选出语音源,这仍然是机器听觉的基本挑战。在当今人机交互和人机交互的数字通信系统的激增下,但这个问题仍然存在。示例:移动VoIP、语音命令、现场语音的后期制作等。语音分离与增强(SSE)的相关研究问题通常被认为是音频处理的圣杯。经典解决方案需要依赖先验知识(即每个扬声器的特征工程)或[1] 定向麦克风阵列来将所需的源与环境声音隔离开来。在过去的几年里,深度学习技术已经激增并显着推进了该领域,实现了单麦克风扬声器独立SSE。在分离2个净语音的混合物时,最先进的解决方案已证明平均音频质量提高了约 10 dB。然而,超过2个扬声器与背景噪声混合的具有挑战性的情况很少受到关注。最近的一个初步测试表明,现有的深度学习模型在这种情况下通常表现不佳,因为非结构化背景噪声损害了它们识别语音流中可分离结构的能力。此外,现有的纯音频方法无法解决标签排列问题,即将模型输出与所需的说话者相关联。视听算法利用说话者面部的视频记录来同时解决SSE和排列问题。然而,在特定视角和可调节照明条件下对相机的需求限制了它们的实际可用性[2]。 2.2 研究的目标 利用超声传感作为一种补充方式,将所需的说话者语音与噪声和干扰分开。 这种方法称为 UltraSE,适用于配备单个麦克风和扬声器的商品移动设备(例如智能手机)。 图1说明了该文的基本思想。在录音过程中,UltraSE 不断发出听不见的超声波,该超声波由靠近智能手机的说话者的发音(嘴唇运动)调制。 因此,麦克风记录的信号既包含可听见的声音,也包含听不见的反射。如图1 所示,虽然可听声音(“绿色”)混合了目标清晰的语音(“黑色”)和其他干扰以及背景噪声(“蓝色”),但听不见的反射(“橙色”)仅捕捉目标用户与清晰语音相关的发音手势动作。UltraSE采用DNN框架捕捉这种相关性,并对可听声音进行去噪 图片 图1:UltraSE 针对用户手持智能手机在嘈杂环境中录制语音的场景。UltraSE 使用超声波传感作为一种补充方式,将所需说话者的声音与干扰分开。 2.4 困难与拟解决对策, 问题一:尽管存在干扰,如何通过超声波描述发音姿势?捕捉精细的发音手势是一项挑战,因为它们速度快(80厘米/秒),位移小(小于5厘米)。此外,由于谐波和硬件伪影,语音和超声波之间存在相互干扰 解决对策:充分利用了超声波的优势,即高采样率和与时间域中清晰语音的完美对齐。作者设计了发射超声波形来捕获短期高分辨率多普勒频谱图,并采用一次性发射体积校准来减少跨模态干扰。 问题二:如何设计一个 DNN 模型来融合这两种模态并表示它们的相关性?没有现有方法能够解决作为 UltraSE 基础的跨模态降噪问题,即使用一种模态(超声波)来重建受噪声/干扰污染的另一种模态(语音)。 解决对策:由于两种模态的物理特征特征不同,我们设计了一个双流 DNN 架构来处理每个模态,并设计一个自注意力机制来融合它们。 此外,作者提出了一种基于条件 GAN (cGAN) 的训练模型,该模型具有新颖的跨模态相似性测量网络,以实现这种能力。 问题三:如何提高增强语音的清晰度和质量? 解决对策:时频 (T-F) 频谱图的幅度对于语音清晰度至关重要,而相位决定了语音质量。作者将 UltraSE 扩展为两阶段多域 DNN 架构,该架构优先优化 T-F 域中的清晰度,然后在T域中重构相位以提高语音质量。根据经验观察,我们将多模态融合网络置于 T-F 域内,即发音手势与语音清晰度更相关。 2.5 技术优势 纯音频语音增强:利用T-F 域方法、T域方法和多领域方法对非语音噪声表现出可接受的性能,但它们仍然无法处理涉及多个干扰。为了解决此类语音分离问题,Deep clustering 为每个源训练语音嵌入,然后使用聚类算法将它们分离。PIT在训练过程中迭代地改变源的排列,以训练一个排列不变的语音分离模型。这些方法仍然需要先验地知道说话人的数量,并且不适用于超过3个说话人加上噪声的情况。此外,标签排列问题仍然存在——它们可以分离多个语音源,但不能自动识别哪个来自目标说话者,这可能会阻碍某些机器操作的后端任务(例如,智能手机上的语音助手)。UltraSE克服了所有这些缺陷。 多模态语音增强为了解决排列问题:视听(AV)方法使用对象面部的视频记录作为音频的提示,有许多缺点。例如除了麦克风之外,他们还需要一个额外的摄像头,在良好的光照条件下指向拍摄对象的脸部,这在许多典型用例中是不方便的,甚至是不可行的。此外,相机在许多对隐私敏感的地方无法使用。前人探索了使用超声作为增强语音的补充方式的想法。然而,这些作品都需要特殊的超声波硬件。相比之下,UltraSE 只需要智能手机上的单个音频通道,并克服了模态之间的相互干扰等实际挑战。此外,他们使用传统的方法,即非负矩阵分解和非线性回归,只显示了对环境噪声的语音增强性能,而不是语音干扰。UltraSE 通过设计多模态多域 DNN 框架进一步突破了这一想法的极限,以实现与视听方法类似的语音分离和增强性能。 无需设备的超声波传感:无设备超声波传感技术可以利用商品移动设备上的扬声器和麦克风来跟踪附近物体的距离/方向变化。最先进的超声波手势跟踪方案可以达到毫米级的精度。 除了位置和手势跟踪,最近的研究还尝试使用超声波传感进行唇读[41]。 然而,由于空间分辨率不足,它们只适合粗略的传感应用,相比之下,UltraSE 率先展示了超声波传感可以作为一种补充方式来解决鸡尾酒会问题并将语音增强提升到一个新的水平。 2.6 研究技术简述 UltraSE 代表了首个使 SSE 性能接近多通道解决方案的纯音频方法,同时克服了标签排列问题。下面简述出三个重要技术贡献: • 作者设计了一个多模态多域 DNN 框架,用于单通道语音增强,融合了超声和语音特征,同时提高了语音清晰度和质量。 2.6.1 ULTRASE DNN 模型概述 第一步是从原始信号创建 DNN 输入特征。然后,我们设计一个两阶段、多模态、多域的 DNN 模型,该模型包括三个关键模块,简述如下。 T-F 域多模态振幅网络模块通过使用语音和超声波作为输入来生成幅度理想比率掩码 (aIRM),即净和噪声频谱图的幅度之间的比率。它由两个子网组成。 子网 (i) 双流特征嵌入:我们的模型首先使用嘈杂语音的 T-F 频谱图和并发超声多普勒频谱图作为输入。然后,我们设计了一个双流特征嵌入架构,将不同的模态转换到相同的特征空间,同时保持它们的时域对齐。 子网 (ii) 语音和超声融合网络:然后,我们在频率维度上连接每个流的特征。进一步应用自我注意机制来融合级联特征图,让多模态信息相互“串扰”。融合的特征随后被送入 BiLSTM 层,然后是三个 FC 层。结果输出是一个幅度掩模,它与原始噪声幅度谱图相乘以生成幅度增强的T-F 谱图。 图片 图2:UltraSE的多模态多域 DNN 设计概览。卷积层表示法:Channels@Kernel size 如图3说明了DNN 输入特征的预处理步骤工作流程。 l1ev5znd.png图片 图3:DNN 输入特征设计 l1ev76fq.png图片 图4:UltraSE基于cGAN的跨模态训练概览 基于cGAN 的跨模式训练,如图 4 所示,我们设计了一种基于 cGAN 的训练方法,以进一步去噪幅度增强的T-F频谱图。在我们的cGAN 模型中,生成器就是上面的 T-F 域多模态幅度网络;鉴别器被设计成鉴别增强的频谱图是否对应于超声传感特征。T 域相位网络。我们使用iSTFT(一个固定的 1D 卷积层)将幅度增强的 T-F 频谱图转换为T域波形。为了微调增强信号的相位,我们设计了一个编码器-解码器架构来重建相位以接近 T 域中的净语音。 • 作者设计了一个基于cGAN 的跨模态训练模型,该模型有效地捕捉了超声和语音之间的相关性以进行多模态去噪。 2.6.2 基于 CGAN 的跨模态训练 UltraSE 的基本问题是多模态降噪,即使用一种模态(超声波)来恢复被噪声/干扰污染的另一种模态(语音)。前者感知分辨率低,但无干扰,与后者相关。尽管我们有意保持两者之间的时间对齐,但很难强制多模态融合网络“理解”这种多模态相关性,因为传统的损失函数(例如MSE)只能训练网络来清理端到端的TF频谱。 因此,我们提出了一种基于 cGAN 的训练方法,该方法隐含地将跨模态相关性的最大化本身作为训练目标。 任何GAN设计中的一个关键要素是定义鉴别器使用的相似度度量。与在相同类型特征之间进行比较的传统 GAN 应用程序(例如图像生成)不同,我们的跨模态 cGAN 需要区分增强的 TF 语音频谱图是否与超声多普勒频谱图匹配(即,它们是“真实的”还是“假”对)。 我们提出了一个跨模式的 Siemese 神经网络来应对这一挑战。Siamese 神经网络使用共享权重和模型架构,同时在两个不同的输入向量上协同工作以计算可比较的输出向量。它传统上用于测量来自相同模态的两个输入之间的相似性,例如,两个图像。为了启用跨模态连体神经网络,我们创建了两个独立的子网络(图7),旨在分别表征语音和超声的时频域特征之间的对应关系。基本架构下,这两个输入是一个 CNN-LSTM 模型。 由于人类语音在 F 域中包含谐波和空间关系,因此语音 CNN 子网络使用扩张卷积进行频域上下聚合。超声传感的多普勒频移主要包含局部特征。因此,超声 CNN 子网络仅包含传统的卷积层。在卷积之后,使用 Bi-LSTM 层来学习两种模式的长期时域信息。 最后,引入三个全连接(FC)层来分别学习两个可比较的输出向量。 我们强调,这种跨模态设计不共享架构和参数,这与传统的 Siamese 网络不同。 l1ev87c1.png图片 图5:跨模态相似性测量网络的输出 PDF 图5显示了输出的概率密度函数 (PDF),其中较小的值表示较高的相似性。很明显他输出的真对和假对的PDF完美分离,这意味着我们的相似性测量网络可以有效地区分一对语音和超声输入是否由相同的发音姿势生成。 • 我们收集了一个新的语音数据集——UltraSpeech,并与最先进的解决方案相比验证了 UltraSE 的性能。 2.6.3 ULTRASE 实现 传统的语音数据集只包含原始语音,没有超声波传感信号。为了评估 UltraSE,我们创建了一个名为 UltraSpeech 的新数据集,其中包含两者。 数据收集:我们招募了20名流利的英语人士(4名女性,16 名男性,平均年龄 25 岁)来收集 UltraSpeech 数据集。每个参与者被要求在安静的环境中使用 2 种典型的电话持有方式(“电话”模式和“走向麦克风”模式,如图8(b)所示)在 TIMIT 语音语料库[3]中说出至少300个句子。同时,我们使用定制的 Android 应用程序 UltraRecord,通过智能手机底部的扬声器和麦克风以 96 kHz 的采样率发出超声波信号并捕获音频片段。 请注意,我们不限制用户将智能手机与嘴巴保持特定距离。总的来说,我们为每种握持方式收集了8k 5秒净的语音片段。我们遵循现有的 SSE 工作,合成混合生成嘈杂的语音数据集。干扰语音来自 TIMIT 数据集,其中包含 6300 个不同的英语句子,由 630 位说话者生成,总共持续 3.5 小时。环境噪声数据集来自 AudioSet,其中包含来自现实生活的526种噪声类型的超过170万个10秒片段,包括广泛的人类和动物声音、乐器和流派以及日常生活中常见的噪声。此外,我们生成了一个训练集,其中干扰语音和净语音来自同一个说话者。 这被广泛认为是 SSE [4] 最具挑战性的案例,因为干扰具有与所需语音无法区分的相同听觉模式。 我们将其添加到训练数据集中,以强制模型利用除了听觉特征之外的超声特征。我们的训练数据集包含由三星 Galaxy S8 智能手机收集的 15 名参与者的净语音。每个参与者的净语音都混合了 20 种不同的噪音设置。 对于每个噪声设置,干扰扬声器的数量 ? 均匀分布在 [0,4]中,SNR 均匀分布在 [−9, 6] dB(平均为 -1.5 dB)中。训练数据总共包含 120k 5 秒的嘈杂语音片段(300 小时)。 l1evaw7s.png图片 l1evbffv.png图片 我们在 Pytorch 中实现了 UltraSE DNN模型。特征图的维度和每一层的参数如图 2、6、7 和表 1、2、3所示。除了最后一层应用了sigmoid 之外,ReLU 激活跟随所有层。对于训练,我们使用 Adam 优化器,初始学习率为 1? − 04,每 5 个 epoch 下降25%,总共 20 个 epoch。UltraSE有15.5M和3.1M参数用于第一阶段和第二阶段 DNN。 2.7 研究验证 2.7.1 微基准比较 在本节中,我们的默认测试数据集包括另外 5 名参与者在“Towards mic”模式下的净语音,使用三星 S8 收集。我们的测试环境包括 6 种不同的干扰加噪声设置:1? +?、2? +?、3? +?、> 3? +?、2?(“s”和“a”表示干扰扬声器和环境噪声)和最难的情况 >= 2 个同说话者干扰加上噪声 (>= 2?? + ?)。 噪声语音信号的 SNR 水平均匀分布在 [−9, 6] dB 中。 UltraSE 的所有结果都来自从训练数据集生成的单个模型。我们将 UltraSE 与 4 种最先进的 SSE 方法进行比较,PHASEN [5](TF 域方法)、SEGAN(T 域方法)、AVSPEECH (视听方法)、Conv-TasNet(语音分离法)。为了公平比较,我们重新实现了 PHASEN、SEGAN 和 Conv-TasNet,并在 UltraSpeech 数据集上训练和测试它们。PHASEN 和 SEGAN 只使用 1? + ? 训练集,因为它们是为语音增强而不是分离而设计的。PHASEN 和 SEGAN 在 1? + ?(见表 4)下的结果与原始工作相似,这表明了我们实现的正确性。对于语音分离方法,即 Conv-TasNet,我们首先在“2?”环境中对其进行训练和评估,以检查我们实现的正确性。 然后,我们使用“2? + ?”数据集以 2 位说话者的净语音作为基本事实来训练模型,并在表 4 中比较其他环境中的结果。对于AVSPEECH,由于我们的数据集没有录像,我们直接使用[6]中的结果作为基线。 l1evc762.png图片 与最先进的语音增强方法相比,UltraSE 显着提高了嘈杂和多说话人环境中的语音质量和清晰度。表4显示了在 [−9, 6] dB 范围内均匀分布的所有输入 SNR 水平下的测试结果。UltraSE 在所有4个指标上均优于 PHASEN 和 SEGAN。在 1? + ? 环境中,UltraSE 实现了平均 17.25 SiSNR (18.75 ΔSiSNR) 和 3.50 PESQ。在具有多扬声器干扰的其他环境中,超声传感模式的作用更为突出,在2个基线上分别平均提高了 6.04 dB 和 9.77 dB 的 SiSNR。即使对于最困难的情况 >= 2?? + ?,UltraSE 仍可实现 8.97 dB SiSNR 和 2.52 PESQ。 此外,UltraSE 的性能略高于AVSPEECH,这可能是因为超声波特征的采样时间粒度比视频帧更精细,并且可以更好地与语音信号对齐。 大多数现有的语音分离方法只能在有限数量的干扰说话者(2∼3)和没有环境噪声的情况下工作[29,30,73,76]。 如表4所示,当使用“2? + ?”数据集训练 Conv-TasNet 时,Conv-TasNet 在“2? + ?”和“2?”设置中取得了良好的性能,但在其他复杂的设置中表现不佳 环境。 相比之下,在 > 3? + ? 设置下,UltraSE 优于 Conv-TasNet 约 6 dB 的 SDR 或 SiSNR,STOI 为 10%,PESQ 为 24%。 l1evcov7.png图片 图8中的散点图显示了测试数据集中每个句子的输入和输出 SiSNR,其中包括所有 6 个环境。UltraSE 在不同环境和句子中始终如一地实现高性能,平均 14.75 dB SiSNR 增益。 即使在 -9 dB 输入的最坏情况下,增强型语音平均达到 8.86 dB SiSNR。 2.7.2 消融研究 我们进行了消融研究,以更好地了解 UltraSE 中不同设计组件的性能。 这里的测试数据集包括除了“>= 2?? + ?”之外的所有环境,这在实践中并不常见。 表 5 总结了结果。 l1evdhei.png图片 “No T domain”表示没有“T do-main波形语音增强”的DNN模型。 结果表明,该模块几乎不影响 STOI,这是一种语音清晰度指标。 但它有助于分别获得 0.46 dB SDR、0.58 dB SiSNR、0.12 PESQ,这证明它可以进一步提高 T-F 域多模态网络,生成语音的感知质量。 “No cGAN”表示没有“基于 cGAN 的跨模态模型训练”的模型。 应用 cGAN 时,所有指标都显着提高,因为我们的 cGAN 设计迫使网络学习超声和语音之间的相关性,这是 UltraSE 设计背后的关键原则。 “No Fusion Network”是指超声和语音信号的特征图在时频域中直接拼接,没有融合块。 性能略有下降,因为融合块有助于多模态特征相互“串扰”。 “No Ultrasound”表示网络开头没有超声流的网络。 结果变得接近于没有超声传感的传统语音增强方法,例如,PHASEN。 2.7.3 系统效率 时间消耗:我们评估 UltraSE 在 3 个平台上的运行时处理延迟,包括 NVIDIA GTX 2020 (GPU)、Intel i9-9980 3.00GHz (CPU) 和配备 Qual comm Snapdragon 835 CPU 的三星 Galaxy S8 (手机)。前两个对应于 UltraSE 被卸载到受信任的云或边缘服务器的情况。 表6总结了结果。GPU 服务器仅经历 14.85 毫秒的延迟,这对于 VoIP 应用程序来说是可以接受的(最多 150 毫秒 [7])。 智能手机外壳是使用三星 Galaxy S8 上的 Pytorch Mobile [8] 测量的。请注意,最新版本的 Pytorch Mobile [8] 仅支持单 CPU 处理,没有任何 GPU/NPU 支持。 因此,延迟相对较高(处理 5 秒语音需要 25.08 秒),这仅适用于离线处理应用程序,例如音频消息和录音。有大量关于提高智能手机 DNN 效率的文献 [9],表明使用移动 GPU/NPU 可以减少 50 倍以上的延迟。 我们将为我们未来的工作探索这些解决方案。 另请注意,由于使用了 Bi-LSTM 块,UltraSE 需要以 5 秒为单位处理输入。 这意味着它的 SSE 在 5 秒的初始引导期后开始生效。 l1eve81q.png图片 能耗:我们的实验表明,典型的智能手机(Samsung S8)可以连续使用 UltraSE 录制语音,同时发射超声波信号 60.57 小时(不显示)。 我们使用 Android Profiler [80] 进行的测量显示 UltraSE 的 CPU 负载平均为 48.7%,功耗为在 0 到 3 之间的“1”级别。当卸载到服务器时,计算能量消耗变得可以忽略不计。 唯一的开销是 UltraSE 需要将原始的 48/96 kHz 采样率的音频流上传到服务器,然后从服务器下载增强的语音。我们的实验表明,三星 S8 可以在卸载模式下连续运行 UltraSE 并通过 WiFi 上传/下载音频流 10.82 小时。服务器卸载可能会引发其他问题,例如安全性,但这超出了我们当前工作的范围。 2.7.4 泛化采样频率 通过 96 kHz 采样率数据集训练的 UltraSE 模型可直接用于增强以 48 kHz 采样率记录的测试语音。只要超声传感特征的 FFT 窗口长度和跳跃长度分别保持 85 ms 和 10 ms,48 kHz 采样率的特征分辨率与 96 kHz 采样率的情况相同。表5 显示在 96 kHz 采样率训练模型上测试 48/ 96 kHz 采样率数据集时性能下降可忽略不计。 l1evf1bn.png图片 图8:发音手势的 SNR。 握持方式:在“电话通话”模式下(图 8(a)),用户的面部部分遮挡了超声波信号,因此我们训练了一个与“朝向麦克风”模式不同的模型(图 8(c))。 UltraSE 可以使用智能手机内置的基于 IMU 的握持方式检测算法自动选择模型 [81]。 我们的实验表明,在 -1.5 dB 平均输入 SNR 下,由于遮挡,“电话呼叫”(12.47 dB SiSNR)的性能略低于“Towards mic”(13.12 dB SiSNR)。 我们进一步评估了每个模型在不同嘴到麦克风距离下的灵敏度。 图8(b) 和图 8(d) 显示了超声的平均 SNR (SNR?) 与增强语音的 SiSNR。 对于两种握持方式,???? 远远超过 10 dB,语音 SiSNR 在 20 cm 距离内保持在 12 dB 左右。 实验表明,只要嘴到麦克风的距离保持在 20 厘米以内,UltraSE 模型的性能就会始终如一。 运动干扰:我们测量来自 3 种主要运动伪影的干扰影响,即呼吸、手势和行走。 在“朝向麦克风”和“打电话”模式下,分别在嘴巴距离麦克风 15 厘米和 2 厘米时进行了实验。(i) 呼吸频率 (~30 bpm) 远小于关节运动 (> 10 Hz),因此它对 UltraSE 的影响可以忽略不计。(ii) 手势引入与关节运动相似的多普勒效应 [36, 40, 51],这可能造成不可忽视的干扰。我们在推动手势干扰下测量关节手势的 SNR?。 SNR? 在 0° 到 90° 的 7 个不同角度每 2 cm 处进行采样,步长为 15°,靠近用户的嘴。 图 13 显示了“朝向麦克风”模式下 SNR? 的空间分布 [82]。 只要手势距离嘴巴 > 25 厘米(这在日常使用场景中很常见),SNR? 就会保持在 10 dB 以上,这对于 UltraSE 来说已经足够了(图 8)。 麦克风阵列可用于聚焦用户的嘴部区域以进一步减轻干扰 [40],但这超出了 UltraSE 的范围。我们省略了“电话通话”模式,因为麦克风离嘴更近,并且感应 SNR? 保持较高。(iii) 当其他人走近(0.8 m 远)时,我们发现 SNR? 几乎没有受到影响,因为超声音量相对较低,并且用户的嘴更近。 总体而言,发音手势的 SNR? 足够高(> 10 dB),并且 UltraSE 模型在日常使用场景中不受运动伪影的影响。 智能手机的概括:不同的智能手机可能有不同的扬声器麦克风布局。 例如,三星 S8、LG G8S ThinQ 和 VIVO X20 的底部麦克风和扬声器之间的距离分别为 5 毫米、25 毫米和 25 毫米。扬声器和麦克风的高频响应也可能因手机型号而异[83]。 将三星 S8 数据集训练的 DNN 模型直接应用到 LG G8S ThinQ 和 VIVO X20 时,增强语音的 SiSNR 分别变为 9.21 dB 和 9.53 dB。低于同款手机壳13.21 dB),但仍高于无超声传感的 SiSNR(7.68 dB)。 为了保持最佳性能,一种直接的方法是为每个电话模型执行一次训练数据收集。 或者,我们可以使用涵盖典型硬件配置的各种智能手机来丰富 UltraSpeech 数据集。 这留给我们以后的工作。 l1evfc20.png图片 真实环境使用实验:我们要求用户在 4 个不同的真实世界环境中使用 UltraSE,即 1) 带有排气扇和流水噪音的浴室环境(平均 75 dBA); 2)有电视噪音的客厅环境(平均55分贝); 3) 有谈话噪音的室内会议环境(平均 60 dBA); 4) 有车辆噪音的室外路边环境(平均 60 dBA)。 与合成嘈杂语音不同,我们无法在这些场景中捕获真实净的语音并评估 SDR、SiSNR、STOI 和 PESQ 等指标。 因此,为了评估 UltraSE 在实际使用中的性能,我们使用 ASR 单词错误率???=(?+?+?)/? 作为指标,其中?、?、?和?是替换、删除的数量 ,插入,目标用户的口语总数。 具体来说,我们要求用户在 TIMIT 语音语料库中跨不同环境说出至少 50 个句子。 图 9 显示了在不同环境中使用和不使用 UltraSE 的WER。 在非语音噪声环境下,即浴室和路边,UltraSE 略微提高了 ASR 语音识别率,因为 ASR 本身具有减轻背景环境噪声干扰的能力。 在语音嘈杂的环境中,即客厅和会议室,WER 高于 100%,因为非目标用户的语音引入了许多词插入和替换。UltraSE 在这种情况下取得了显着的改进,因为它能够通过使用超声波感应将所需的说话者语音与噪声分开。 2.8 文章结论 超声波传感可以作为解决鸡尾酒会问题的补充方式。UltraSE系统引入了通用DNN机制来实现这些功能,例如,多模态多域融合网络和基于新型跨模态连体网络的基于cGAN的训练模型。UltraSE指向了一个新的方向,它融合了无线传感能力,将机器感知提升到一个新的水平。 三、阅读理解与心得 作者提出了UltraSE,它使用超声波传感作为一种补充模式,将所需说话者的声音从干扰和噪声中分离出来。UltraSE使用商用移动设备发射超声波并捕捉说话者发音手势的反射。它引入了一种多模态、多领域的深度学习框架来融合超声多普勒特征和可听语音频谱图。并且利用一个基于跨模态相似性测量网络的经过对抗性训练的鉴别器来学习两种异质特征模式之间的相关性。最后实验验证了UltraSE同时提高了语音清晰度和质量,并且优于当下先进的解决方案。 作者在第一二节分别介绍了该技术的背景与优势,中间章节介绍技术路线,最后就微观基准比较、消融研究、系统效率与泛化采样频率四个方面对实验进行评估得出超声波传感可以作为解决鸡尾酒会问题的补充方式。UltraSE 系统引入了通用 DNN 机制来实现此类功能,融合了无线传感功能,将机器感知提升到一个新的水平。但是在实验分析中不乏存在一个小问题,在系统延时上UltraSE 需要以 5 s 的片段处理输入,这意味着其SSE在5秒的初始引导期后开始生效,如果设备不支持GPU / NPU话,延迟将会很高大于可接受的范围了,基于此这将是进一步研究的对象。 通过本次阅读,使我对电子与通信技术了解了不少,让我懂得专业基本素养及其重要,一方面是专业知识的积累,另一方是英语水平的训练。今后要养成不断阅读文献的习惯,将输入更好的转化为输出,同时在阅读文献方面要做到四知,一、“知事”,了解所读论文的研究内容和研究结果,即英文中的“What had been done? What was the result”。通过阅读摘要(Abstract)或概要(Summary),可以知道研究结果,即知道“What”;而参读全文则可以知道实验方法和策略,即知道“How”。二、“知人”,学会了解研究人员以及他或他们所在研究机构等背景资料。三、“知因”,阅读一篇文章时,有三个问题需要我们思考。一是,为什么研究者能够想到做这个研究。一是,研究者为什么这样设计实验。另一个就是,如果让我们来做,我们会怎样设计我们的研究。四、“知短”,不是所有的研究论文是完美的,许多实验设计可以改进。至于所引出的未解决的问题,更是无穷尽,“真理不是绝对的”。 参考文献 [1] Quan Wang, Hannah Muckenhirn, Kevin Wilson, Prashant Sridhar, Zelin Wu, John Hershey, Rif A Saurous, Ron J Weiss, Ye Jia, and Ignacio Lopez Moreno. Voice filter: Targeted voice separation by speaker-conditioned spectrogram masking. In Proceedings of Interspeech, 2019. [2] Triantafyllos Afouras, Joon Son Chung, and Andrew Zisserman. My lips are concealed: Audio-visual speech enhancement through obstructions. In Proceedings of Interspeech, 2019. [3] John S Garofolo et al. Darpa timit acoustic-phonetic speech database. National Institute of Standards and Technology (NIST), 1988. [4] Aviv Gabbay, Asaph Shamir, and Shmuel Peleg. Visual speech enhancement. In Proceedings of Interspeech, 2018. [5] Dacheng Yin, Chong Luo, Zhiwei Xiong, and Wenjun Zeng. Phasen: A phaseand-harmonics-aware speech enhancement network. In Proceedings of AAAI, 2020. [6] Ariel Ephrat, Inbar Mosseri, Oran Lang, Tali Dekel, Kevin Wilson, Avinatan Hassidim, William T Freeman, and Michael Rubinstein. Looking to listen at the cocktail party: A speaker-independent audio-visual model for speech separation. In Proceedings of ACM SIGGRAPH, 2018. [7] Chris Lewis and Steve Pickavance. Implementing quality of service over cisco mpls vpns. Selecting MPLS VPN Services, 2006 [8] Pytorch Mobile, 2020. https://pytorch.org/mobile/home/. [9] Siqi Wang, Anuj Pathania, and Tulika Mitra. Neural network inference on mobile socs. IEEE Design & Test, 2020.
刘航宇
4年前
1
1,214
1
【夜读】“别熬夜了,好吗”
摘要文章指出,许多年轻人存在熬夜现象,尽管熬夜有害健康,但克服熬夜习惯不易。文章建议通过减少睡前电子设备使用、养成良好作息、提高白天工作效率等方法来改善睡眠质量。关键词:熬夜, 睡眠习惯, 生物钟, 睡前手机, 睡眠质量这里是深夜治愈所,我和你的治愈星球 看过有句话说:“别说你一无所长,熬夜玩手机你是一把好手。”诙谐又戳心。 前段时间,有个面向年轻人的睡眠调查,结果显示,只有10.3%的人能在23点前入睡,超过80%的人会熬到凌晨才入睡。 不知道正在看文章的你,是不是也有熬夜的习惯呢? 当然会有人说,自己熬夜是因为工作加班。 也确实看到过有数据显示:近90%的职场人都难以逃脱加班的命运。 甚至其中有四分之一的人,加班的频率是每天。 我们都知道,熬夜有害健康,但很少有人能做到不熬夜。 越来越多的年轻人白天开始保温杯泡枸杞,各种养生,花很多钱买面膜和护肤品,却因为熬夜,把前面的所有努力一键归零。 今天就要来和你说说,怎样克服熬夜的习惯。 网络上有个问题是:“坚持每天早睡,你发生了什么变化?” 有个网友的回答获得了很多点赞,他说:“我发现早睡后必然早起,然后生活里没有游戏、没有夜宵。 黑眼圈少了,时间多了,不会迟到了,每天都有时间好好吃早餐。” 图片 一年前,我在准备一个资格考试的时候,就尝到过早睡甜头。 当时,因为每天白天都有满满当当的工作,所以晚上下班回家已经非常疲惫,一看书就会想打瞌睡,勉强能挤得出时间学习,但精力却跟不上。 一开始挺发愁的,很担心自己的状态通过不了考试。 有一天晚上,实在太累了,就像要不先睡,明天早两个小时起来学习好了。 结果第二天起来竟然精神异常充沛,而且一大早特别安静,学习效率异常的高。 就这样我每天早睡早起,学习的时候状态都很好,没请假,不耽误工作的情况下也通过了考试。 最近有个话题#睡前玩手机8分钟 兴奋超1小时#就冲上过热搜。 有医学专家研究发现,眼睛只要受到手机等屏幕发出的蓝光刺激8分钟,就会导致身体持续兴奋超过1小时,造成生物钟紊乱。 睡觉前过度使用手机,不但损伤视力,还会使人入睡困难。 特别是睡觉前还在追剧、刷短视频或者打游戏的,越玩越停不下来,然后越难入睡,最后变成了恶性循环。 图片 年初很火的电视剧《人世间》里周蓉的扮演者宋佳,就曾在一次节目中透露,自己保持良好的身体和工作状态,都得益于好的睡眠习惯。 她睡觉时从不把手机带进卧室,睡前不看手机、不玩游戏、不看资讯,正是因为这些好习惯保证了好的睡眠质量。 所以有人说: 不透支睡眠,科学制定属于自己的起床和睡觉时间,好好睡觉,是善待自己的开始,也是热爱生活的体现。 最后,给大家推荐几个戒掉熬夜的小妙招: 1.睡前少玩手机和电脑、平板等电子设备,避免蓝光刺激大脑兴奋而难以入眠。 2.睡前洗个热水澡或者泡个脚,能使人心态放松。喝杯热牛奶也是不错的选择,牛奶中含有的色氨酸可以让人产生疲倦欲睡感。但别通过酒精催眠,酒精伤肝,而且代谢很容易让人在后半夜醒来,影响睡眠质量。 3.养成良好作息,形成生物钟,到点了就有困意,该起床时就别赖床。 4.白天提高工作效率,别把太多工作留到晚上。晚上工作反而容易让大脑更兴奋,特别是熬夜工作,越熬越兴奋,后来想睡都睡不着。所以如果能提早规划,尽量白天就科学高效地把工作完成。 图片 5.晚餐前适量运动,或者晚餐后散散步,可以让身体保持微疲劳状态,让人容易产生困意。当然避免睡前大量运动。 6.除了该睡觉时,不要长时间待在床上,也尽量不要在床上做其它事情,比如躺床上看电视、听音乐、看书等。 这样可以建立身体和床之间的条件反射,即身体沾到床就出现困意,需要我们把床当成唯一睡觉的地方。 当然,很多听众跟我说,睡前收听我们的《深夜治愈所》节目,也可以催眠哦。睡不着的夜晚欢迎来找我。 从今晚开始,早点睡觉,别熬夜了,好吗。
励志美文
刘航宇
4年前
0
652
6
上一页
1
...
8
9
10
...
14
下一页