数字信号处理:自动增益控制(AGC)

自动增益控制:

:自动增益控制(Automatic Gain Control, AGC)是一种信号处理技术,用于在接收端调整输入信号的增益(或放大系数),以保持信号在一个合适的强度范围内,从而防止信号过弱或过强。

工作原理:

AGC电路通过测量接收到的信号强度,将该强度与一个预设的理想水平进行比较,并根据两者的差异自动调整放大器的增益。例如,如果输入信号变得太弱,AGC会自动增加增益;而当输入信号太强时,则会降低增益。这样可以确保接收端获得一个较为稳定的信号强度。

第一个仿真图有点小错误:程序并没有错误。将值设置为有符号数和模拟。

修改完如上图所示。

复制代码
`timescale 1ns / 1ps

module tops_AGC(
input i_clk,
input i_rst,
input i_flag,
input signed[11:0]i_x,
output signed[11:0]o_egy,
output signed[11:0]o_y,
output o_flag
);
    
//energy
wire signed[11:0]w_absx = (i_x[11] == 1'b0)?i_x:~i_x+1'b1; 
 
integer i;
reg signed[11:0]dly_absx[2048:1]; 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	       for(i=1;i<=2048;i=i+1)
	       dly_absx[i]<=12'd0;
	  end
else  begin
           dly_absx[1]<=w_absx;
	       for(i=2;i<=2048;i=i+1)
	       dly_absx[i]<=dly_absx[i-1];
      end
end 

reg [23:0]power_E;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	  power_E  <= 24'd0;
	  end
else  begin
      power_E  <= power_E + dly_absx[1]-dly_absx[2048];
      end
end 
assign o_egy=power_E[22:11];

//signal 延迟
reg signed[11:0]dly_x[2149:1]; 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	       for(i=1;i<=2149;i=i+1)
	       dly_x[i]<=12'd0;
	  end
else  begin
           dly_x[1]<=i_x;
	       for(i=2;i<=2149;i=i+1)
	       dly_x[i]<=dly_x[i-1];
      end
end 


//flag 延迟
reg signed[2148:0]dly_flag; 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	      dly_flag<=2149'd0;
	  end
else  begin
          dly_flag<={dly_flag[2147:0],i_flag};
      end
end 
wire signed[11:0]w_y   = dly_x[2149];
assign o_flag= dly_flag[2048];


//自动增益
wire [19 : 0] gains;
blk_agc blk_agc_u (
  .clka(i_clk),            // input wire clka
  .rsta(i_rst),            // input wire rsta
  .addra(o_egy),          // input wire [8 : 0] addra
  .douta(gains),          // output wire [19 : 0] douta
  .rsta_busy()  // output wire rsta_busy
);


reg signed[19:0]wgains;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
      wgains <= 20'b0;
	  end
else begin
          if(o_flag == 1'b1)
          wgains <= gains;
          else
          wgains <= wgains;
     end
end

reg signed[31:0]r_pw;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
      r_pw <= 32'b0;
	  end
else begin
      r_pw <= $signed(wgains)*$signed(w_y);	
     end
end 

assign o_y=r_pw[31-12:20-12];


endmodule
相关推荐
代码游侠1 小时前
应用——Linux进程通信与信号处理
linux·运维·服务器·笔记·学习·信号处理
这张生成的图像能检测吗1 天前
(论文速读)基于导波的飞机机身弦复杂连接结构损伤诊断
信号处理·故障诊断·传感器·结构健康监测·导波·飞机结构件损伤诊断
添砖java‘’2 天前
Linux信号机制详解:从产生到处理
linux·c++·操作系统·信号处理
Cuby!2 天前
【AFDM与信号处理:论文阅读】仿射频分复用:扩展OFDM以实现场景灵活性和弹性
论文阅读·笔记·学习·信息与通信·信号处理
刘孬孬沉迷学习2 天前
WebRTC 协议
学习·5g·webrtc·信息与通信·信号处理
【建模先锋】3 天前
特征提取+概率神经网络 PNN 的轴承信号故障诊断模型
人工智能·深度学习·神经网络·信号处理·故障诊断·概率神经网络·特征提取
..过云雨3 天前
15-2.【Linux系统编程】进程信号 - 信号保存(信号处理流程的三种状态:未决、阻塞、递达,信号保存由未决表完成、sigset_t信号集类型及相关函数)
linux·c++·后端·信号处理
logic_54 天前
DHCP+DNS
网络安全·udp·信号处理
s09071364 天前
多波束声呐 FPGA 信号处理链路介绍
算法·fpga开发·信号处理·声呐
FPGA_ADDA4 天前
基于28DR+VU13P的宽带高速信号处理板
信号处理·国产·全国产·复旦微fpga-vu13p·复旦微rfsoc-28dr·宽带高速信号